You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by am...@apache.org on 2018/01/18 23:17:40 UTC
[16/18] drill git commit: DRILL-3993: Changes for CALCITE-2018
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 <vv...@gmail.com>
Authored: Tue Dec 26 15:03:59 2017 +0200
Committer: Volodymyr Vysotskyi <vv...@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);