DRILL-3993: Changes for CALCITE-2018
Project: http://git-wip-us.apache.org/repos/asf/drill/repo Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/22d0f7e5 Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/22d0f7e5 Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/22d0f7e5 Branch: refs/heads/master Commit: 22d0f7e57b84fcb034624579f68b638ffdad6b7e Parents: 6580674 Author: Volodymyr Vysotskyi <vvo...@gmail.com> Authored: Tue Dec 26 15:03:59 2017 +0200 Committer: Volodymyr Vysotskyi <vvo...@gmail.com> Committed: Tue Jan 16 12:10:13 2018 +0200 ---------------------------------------------------------------------- .../cost/DrillRelMdDistinctRowCount.java | 31 ++++++++++++++------ .../exec/planner/cost/DrillRelMdRowCount.java | 2 +- .../drill/exec/planner/sql/SqlConverter.java | 12 ++++++-- 3 files changed, 33 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/drill/blob/22d0f7e5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdDistinctRowCount.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdDistinctRowCount.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdDistinctRowCount.java index 5d4e4f6..ab7fb87 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdDistinctRowCount.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdDistinctRowCount.java @@ -17,7 +17,9 @@ */ package org.apache.drill.exec.planner.cost; +import org.apache.calcite.plan.volcano.RelSubset; import org.apache.calcite.rel.RelNode; +import org.apache.calcite.rel.core.Join; import org.apache.calcite.rel.metadata.ReflectiveRelMetadataProvider; import org.apache.calcite.rel.metadata.RelMdDistinctRowCount; import org.apache.calcite.rel.metadata.RelMetadataProvider; @@ -27,7 +29,7 @@ import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.ImmutableBitSet; import org.apache.drill.exec.planner.logical.DrillScanRel; -public class DrillRelMdDistinctRowCount extends RelMdDistinctRowCount{ +public class DrillRelMdDistinctRowCount extends RelMdDistinctRowCount { private static final DrillRelMdDistinctRowCount INSTANCE = new DrillRelMdDistinctRowCount(); @@ -35,18 +37,29 @@ public class DrillRelMdDistinctRowCount extends RelMdDistinctRowCount{ ReflectiveRelMetadataProvider.reflectiveSource( BuiltInMethod.DISTINCT_ROW_COUNT.method, INSTANCE); + /** + * We need to override this method since Calcite and Drill calculate + * joined row count in different ways. It helps avoid a case when + * at the first time was used Drill join row count but at the second time + * Calcite row count was used. It may happen when + * {@link RelMdDistinctRowCount#getDistinctRowCount(Join, RelMetadataQuery, + * ImmutableBitSet, RexNode)} method is used and after that used + * another getDistinctRowCount method for parent rel, which just uses + * row count of input rel node (our join rel). + * It causes cost increase of best rel node when + * {@link RelSubset#propagateCostImprovements} is called. + * + * This is a part of the fix for CALCITE-2018. + */ @Override - public Double getDistinctRowCount(RelNode rel, RelMetadataQuery mq, ImmutableBitSet groupKey, RexNode predicate) { - if (rel instanceof DrillScanRel) { - return getDistinctRowCount((DrillScanRel) rel, groupKey, predicate); - } else { - return super.getDistinctRowCount(rel, mq, groupKey, predicate); - } + public Double getDistinctRowCount(Join rel, RelMetadataQuery mq, + ImmutableBitSet groupKey, RexNode predicate) { + return getDistinctRowCount((RelNode) rel, mq, groupKey, predicate); } - private Double getDistinctRowCount(DrillScanRel scan, ImmutableBitSet groupKey, RexNode predicate) { + public Double getDistinctRowCount(DrillScanRel scan, RelMetadataQuery mq, + ImmutableBitSet groupKey, RexNode predicate) { // Consistent with the estimation of Aggregate row count in RelMdRowCount : distinctRowCount = rowCount * 10%. return scan.getRows() * 0.1; } - } http://git-wip-us.apache.org/repos/asf/drill/blob/22d0f7e5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java index 5cc2c6a..7f15fb3 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/cost/DrillRelMdRowCount.java @@ -32,7 +32,7 @@ import org.apache.calcite.util.BuiltInMethod; import org.apache.calcite.util.ImmutableBitSet; import org.apache.drill.exec.planner.common.DrillLimitRelBase; -public class DrillRelMdRowCount extends RelMdRowCount{ +public class DrillRelMdRowCount extends RelMdRowCount { private static final DrillRelMdRowCount INSTANCE = new DrillRelMdRowCount(); public static final RelMetadataProvider SOURCE = ReflectiveRelMetadataProvider.reflectiveSource(BuiltInMethod.ROW_COUNT.method, INSTANCE); http://git-wip-us.apache.org/repos/asf/drill/blob/22d0f7e5/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java ---------------------------------------------------------------------- diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java index 8ad4df7..466d2fe 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java @@ -109,6 +109,7 @@ public class SqlConverter { private final String temporarySchema; private final UserSession session; private final DrillConfig drillConfig; + private RelOptCluster cluster; private String sql; private VolcanoPlanner planner; @@ -139,6 +140,7 @@ public class SqlConverter { this.costFactory = (settings.useDefaultCosting()) ? null : new DrillCostBase.DrillCostFactory(); this.validator = new DrillValidator(opTab, catalog, typeFactory, SqlConformance.DEFAULT); validator.setIdentifierExpansion(true); + cluster = null; } private SqlConverter(SqlConverter parent, SchemaPlus defaultSchema, SchemaPlus rootSchema, @@ -161,6 +163,7 @@ public class SqlConverter { this.session = parent.session; this.drillConfig = parent.drillConfig; validator.setIdentifierExpansion(true); + this.cluster = parent.cluster; } @@ -320,7 +323,6 @@ public class SqlConverter { } public RelRoot toRel(final SqlNode validatedNode) { - final RexBuilder rexBuilder = new DrillRexBuilder(typeFactory); if (planner == null) { planner = new VolcanoPlanner(costFactory, settings); planner.setExecutor(new DrillConstExecutor(functions, util, settings)); @@ -330,7 +332,9 @@ public class SqlConverter { planner.addRelTraitDef(RelCollationTraitDef.INSTANCE); } - final RelOptCluster cluster = RelOptCluster.create(planner, rexBuilder); + if (cluster == null) { + initCluster(); + } final SqlToRelConverter sqlToRelConverter = new SqlToRelConverter(new Expander(), validator, catalog, cluster, DrillConvertletTable.INSTANCE, sqlToRelConverterConfig); @@ -488,6 +492,10 @@ public class SqlConverter { } } + private void initCluster() { + cluster = RelOptCluster.create(planner, new DrillRexBuilder(typeFactory)); + } + private static class DrillRexBuilder extends RexBuilder { private DrillRexBuilder(RelDataTypeFactory typeFactory) { super(typeFactory);