You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by jn...@apache.org on 2015/05/12 16:20:01 UTC

drill git commit: DRILL-2953: Ensure sort operator be inserted to enforce desired order, when a cast function is involved.

Repository: drill
Updated Branches:
  refs/heads/master 8d5778362 -> 71fe8f02f


DRILL-2953: Ensure sort operator be inserted to enforce desired order, when a cast function is involved.


Project: http://git-wip-us.apache.org/repos/asf/drill/repo
Commit: http://git-wip-us.apache.org/repos/asf/drill/commit/71fe8f02
Tree: http://git-wip-us.apache.org/repos/asf/drill/tree/71fe8f02
Diff: http://git-wip-us.apache.org/repos/asf/drill/diff/71fe8f02

Branch: refs/heads/master
Commit: 71fe8f02f3102eeb0c5f5d1504420f441f8f98d7
Parents: 8d57783
Author: Jinfeng Ni <jn...@apache.org>
Authored: Mon May 11 15:39:24 2015 -0700
Committer: Jinfeng Ni <jn...@apache.org>
Committed: Tue May 12 04:23:35 2015 -0700

----------------------------------------------------------------------
 .../exec/planner/physical/ProjectPrule.java     | 39 +++++++++++++++-----
 .../org/apache/drill/TestExampleQueries.java    | 34 +++++++++++++++++
 2 files changed, 63 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/71fe8f02/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java
index bf27a6f..4aca314 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/physical/ProjectPrule.java
@@ -58,8 +58,12 @@ public class ProjectPrule extends Prule {
     RelTraitSet traits = input.getTraitSet().plus(Prel.DRILL_PHYSICAL);
     RelNode convertedInput = convert(input, traits);
 
-    Map<Integer, Integer> inToOut = getProjectMap(project);
-    boolean traitPull = new ProjectTraitPull(call, inToOut).go(project, convertedInput);
+    // Maintain two different map for distribution trait and collation trait.
+    // For now, the only difference comes from the way how cast function impacts propagating trait.
+    final Map<Integer, Integer> distributionMap = getDistributionMap(project);
+    final Map<Integer, Integer> collationMap = getCollationMap(project);
+
+    boolean traitPull = new ProjectTraitPull(call, distributionMap, collationMap).go(project, convertedInput);
 
     if(!traitPull){
       call.transformTo(new ProjectPrel(project.getCluster(), convertedInput.getTraitSet(), convertedInput, project.getProjects(), project.getRowType()));
@@ -67,11 +71,13 @@ public class ProjectPrule extends Prule {
   }
 
   private class ProjectTraitPull extends SubsetTransformer<DrillProjectRel, RuntimeException> {
-    final Map<Integer, Integer> inToOut;
+    final Map<Integer, Integer> distributionMap;
+    final Map<Integer, Integer> collationMap;
 
-    public ProjectTraitPull(RelOptRuleCall call, Map<Integer, Integer> inToOut) {
+    public ProjectTraitPull(RelOptRuleCall call, Map<Integer, Integer> distributionMap, Map<Integer, Integer> collationMap) {
       super(call);
-      this.inToOut = inToOut;
+      this.distributionMap = distributionMap;
+      this.collationMap = collationMap;
     }
 
     @Override
@@ -80,8 +86,8 @@ public class ProjectPrule extends Prule {
       RelCollation childCollation = rel.getTraitSet().getTrait(RelCollationTraitDef.INSTANCE);
 
 
-      DrillDistributionTrait newDist = convertDist(childDist, inToOut);
-      RelCollation newCollation = convertRelCollation(childCollation, inToOut);
+      DrillDistributionTrait newDist = convertDist(childDist, distributionMap);
+      RelCollation newCollation = convertRelCollation(childCollation, collationMap);
       RelTraitSet newProjectTraits = newTraitSet(Prel.DRILL_PHYSICAL, newDist, newCollation);
       return new ProjectPrel(project.getCluster(), newProjectTraits, rel, project.getProjects(), project.getRowType());
     }
@@ -126,17 +132,17 @@ public class ProjectPrule extends Prule {
     }
   }
 
-  private Map<Integer, Integer> getProjectMap(DrillProjectRel project) {
+  private Map<Integer, Integer> getDistributionMap(DrillProjectRel project) {
     Map<Integer, Integer> m = new HashMap<Integer, Integer>();
 
     for (Ord<RexNode> node : Ord.zip(project.getProjects())) {
+      // For distribution, either $0 or cast($0 as ...) would keep the distribution after projection.
       if (node.e instanceof RexInputRef) {
         m.put( ((RexInputRef) node.e).getIndex(), node.i);
       } else if (node.e.isA(SqlKind.CAST)) {
         RexNode operand = ((RexCall) node.e).getOperands().get(0);
         if (operand instanceof RexInputRef) {
-          m.put(
-              ((RexInputRef) operand).getIndex(), node.i);
+          m.put(((RexInputRef) operand).getIndex(), node.i);
         }
       }
     }
@@ -144,4 +150,17 @@ public class ProjectPrule extends Prule {
 
   }
 
+  private Map<Integer, Integer> getCollationMap(DrillProjectRel project) {
+    Map<Integer, Integer> m = new HashMap<Integer, Integer>();
+
+    for (Ord<RexNode> node : Ord.zip(project.getProjects())) {
+      // For collation, only $0 will keep the sort-ness after projection.
+      if (node.e instanceof RexInputRef) {
+        m.put( ((RexInputRef) node.e).getIndex(), node.i);
+      }
+    }
+    return m;
+
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/71fe8f02/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java b/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
index dad43a3..75bbc13 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestExampleQueries.java
@@ -961,4 +961,38 @@ public class TestExampleQueries extends BaseTestQuery{
         .run();
   }
 
+  @Test //DRILL-2953
+  public void testGbAndObDifferentExp() throws Exception {
+    String root = FileUtils.getResourceAsFile("/store/text/data/nations.csv").toURI().toString();
+    String query = String.format(
+        "select cast(columns[0] as int) as nation_key " +
+        " from dfs_test.`%s` " +
+        " group by columns[0] " +
+        " order by cast(columns[0] as int)", root);
+
+    testBuilder()
+        .sqlQuery(query)
+        .ordered()
+        .csvBaselineFile("testframework/testExampleQueries/testGroupByStarSchemaless.tsv")
+        .baselineTypes(TypeProtos.MinorType.INT)
+        .baselineColumns("nation_key")
+        .build()
+        .run();
+
+    String query2 = String.format(
+        "select cast(columns[0] as int) as nation_key " +
+            " from dfs_test.`%s` " +
+            " group by cast(columns[0] as int) " +
+            " order by cast(columns[0] as int)", root);
+
+    testBuilder()
+        .sqlQuery(query2)
+        .ordered()
+        .csvBaselineFile("testframework/testExampleQueries/testGroupByStarSchemaless.tsv")
+        .baselineTypes(TypeProtos.MinorType.INT)
+        .baselineColumns("nation_key")
+        .build()
+        .run();
+
+  }
 }