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);

Reply via email to