diff options
author | Cliff Buchanan <cbuchanan@maprtech.com> | 2018-10-16 15:17:43 -0700 |
---|---|---|
committer | Gautam Parai <gparai@maprtech.com> | 2019-02-28 12:01:11 -0800 |
commit | 3233d8aaff57ac71bd3b726efcd5fdaa92aef861 (patch) | |
tree | 1902365b3632531738acb6229400e2220cba8f72 /exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical | |
parent | 4627973bde9847a4eb2672c44941136c167326a1 (diff) |
DRILL-1328: Support table statistics
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical')
3 files changed, 235 insertions, 0 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/AnalyzePrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/AnalyzePrule.java new file mode 100644 index 000000000..4cac5d946 --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/AnalyzePrule.java @@ -0,0 +1,64 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.planner.physical; + +import org.apache.drill.shaded.guava.com.google.common.collect.Lists; +import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptRule; +import org.apache.calcite.plan.RelOptRuleCall; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.SingleRel; +import org.apache.drill.exec.planner.common.DrillStatsTable; +import org.apache.drill.exec.planner.logical.DrillAnalyzeRel; +import org.apache.drill.exec.planner.logical.DrillRel; +import org.apache.drill.exec.planner.logical.RelOptHelper; + +import java.util.List; + +public class AnalyzePrule extends Prule { + public static final RelOptRule INSTANCE = new AnalyzePrule(); + + private static final List<String> FUNCTIONS = ImmutableList.of( + "statcount", // total number of entries in the table + "nonnullstatcount", // total number of non-null entries in the table + "ndv", // total distinctive values in table + "hll" // HyperLogLog + ); + + public AnalyzePrule() { + super(RelOptHelper.some(DrillAnalyzeRel.class, DrillRel.DRILL_LOGICAL, RelOptHelper.any(RelNode.class)), "Prel.AnalyzePrule"); + } + + @Override + public void onMatch(RelOptRuleCall call) { + final DrillAnalyzeRel analyze = (DrillAnalyzeRel) call.rel(0); + final RelNode input = call.rel(1); + + final RelTraitSet traits = input.getTraitSet().plus(Prel.DRILL_PHYSICAL).plus(DrillDistributionTrait.SINGLETON); + final RelNode convertedInput = convert(input, traits); + + final StatsAggPrel statsAggPrel = new StatsAggPrel(convertedInput, analyze.getCluster(), FUNCTIONS); + + final List<String> mapFileds = Lists.newArrayList(FUNCTIONS); + mapFileds.add(DrillStatsTable.COL_COLUMN); + final SingleRel newAnalyze = new UnpivotMapsPrel(statsAggPrel, analyze.getCluster(), mapFileds); + + call.transformTo(newAnalyze); + } +} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StatsAggPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StatsAggPrel.java new file mode 100644 index 000000000..124246baf --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/StatsAggPrel.java @@ -0,0 +1,86 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.planner.physical; + +import org.apache.drill.shaded.guava.com.google.common.collect.ImmutableList; +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.SingleRel; +import org.apache.drill.exec.physical.base.PhysicalOperator; +import org.apache.drill.exec.physical.config.StatisticsAggregate; +import org.apache.drill.exec.planner.common.DrillRelNode; +import org.apache.drill.exec.planner.physical.visitor.PrelVisitor; +import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +public class StatsAggPrel extends SingleRel implements DrillRelNode, Prel { + + private List<String> functions; + + public StatsAggPrel(RelNode child, RelOptCluster cluster, List<String> functions) { + super(cluster, child.getTraitSet(), child); + this.functions = ImmutableList.copyOf(functions); + } + + @Override + public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { + return new StatsAggPrel(sole(inputs), getCluster(), ImmutableList.copyOf(functions)); + } + + @Override + public PhysicalOperator getPhysicalOperator(PhysicalPlanCreator creator) + throws IOException { + Prel child = (Prel) this.getInput(); + + PhysicalOperator childPOP = child.getPhysicalOperator(creator); + + StatisticsAggregate g = new StatisticsAggregate(childPOP, functions); + + return creator.addMetadata(this, g); + } + + @Override + public Iterator<Prel> iterator() { + return PrelUtil.iter(getInput()); + } + + @Override + public <T, X, E extends Throwable> T accept(PrelVisitor<T, X, E> logicalVisitor, X value) + throws E { + return logicalVisitor.visitPrel(this, value); + } + + @Override + public SelectionVectorMode[] getSupportedEncodings() { + return SelectionVectorMode.ALL; + } + + @Override + public SelectionVectorMode getEncoding() { + return SelectionVectorMode.NONE; + } + + @Override + public boolean needsFinalColumnReordering() { + return true; + } +} diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnpivotMapsPrel.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnpivotMapsPrel.java new file mode 100644 index 000000000..4fc7aaec0 --- /dev/null +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/UnpivotMapsPrel.java @@ -0,0 +1,85 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * <p/> + * http://www.apache.org/licenses/LICENSE-2.0 + * <p/> + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.drill.exec.planner.physical; + +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelTraitSet; +import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.SingleRel; +import org.apache.drill.exec.physical.base.PhysicalOperator; +import org.apache.drill.exec.physical.config.UnpivotMaps; +import org.apache.drill.exec.planner.common.DrillRelNode; +import org.apache.drill.exec.planner.physical.visitor.PrelVisitor; +import org.apache.drill.exec.record.BatchSchema.SelectionVectorMode; + +public class UnpivotMapsPrel extends SingleRel implements Prel, DrillRelNode { + + private List<String> mapFieldsNames; + + public UnpivotMapsPrel(RelNode child, RelOptCluster cluster, List<String> mapFieldsNames) { + super(cluster, child.getTraitSet(), child); + this.mapFieldsNames = mapFieldsNames; + } + + @Override + public RelNode copy(RelTraitSet traitSet, List<RelNode> inputs) { + return new UnpivotMapsPrel(sole(inputs), getCluster(), mapFieldsNames); + } + + @Override + public PhysicalOperator getPhysicalOperator(PhysicalPlanCreator creator) + throws IOException { + Prel child = (Prel) this.getInput(); + + PhysicalOperator childPOP = child.getPhysicalOperator(creator); + + UnpivotMaps um = new UnpivotMaps(childPOP, mapFieldsNames); + return creator.addMetadata(this, um); + } + + @Override + public Iterator<Prel> iterator() { + return PrelUtil.iter(getInput()); + } + + @Override + public <T, X, E extends Throwable> T accept(PrelVisitor<T, X, E> logicalVisitor, X value) + throws E { + return logicalVisitor.visitPrel(this, value); + } + + @Override + public SelectionVectorMode[] getSupportedEncodings() { + return SelectionVectorMode.DEFAULT; + } + + @Override + public SelectionVectorMode getEncoding() { + return SelectionVectorMode.NONE; + } + + @Override + public boolean needsFinalColumnReordering() { + return false; + } + +} |