You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@drill.apache.org by sm...@apache.org on 2015/06/30 02:13:10 UTC

drill git commit: DRILL-3414: Make sure to walk entire expression tree when rewriting filter expression for pruning

Repository: drill
Updated Branches:
  refs/heads/master 2b5c52e57 -> 19c0225dc


DRILL-3414: Make sure to walk entire expression tree when rewriting filter expression for pruning


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

Branch: refs/heads/master
Commit: 19c0225dcf25cbf19eca05be79b801309f91f4b6
Parents: 2b5c52e
Author: Steven Phillips <sm...@apache.org>
Authored: Mon Jun 29 13:37:55 2015 -0700
Committer: Steven Phillips <sm...@apache.org>
Committed: Mon Jun 29 17:08:33 2015 -0700

----------------------------------------------------------------------
 .../partition/RewriteAsBinaryOperators.java     | 31 +++++++++++++++-----
 .../RewriteCombineBinaryOperators.java          | 19 +++++++++++-
 .../apache/drill/TestCTASPartitionFilter.java   | 20 +++++++++++++
 3 files changed, 62 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/drill/blob/19c0225d/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteAsBinaryOperators.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteAsBinaryOperators.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteAsBinaryOperators.java
index 44b9a3a..95432c9 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteAsBinaryOperators.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteAsBinaryOperators.java
@@ -17,6 +17,9 @@
   */
 package org.apache.drill.exec.planner.logical.partition;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexCorrelVariable;
@@ -24,6 +27,7 @@ import org.apache.calcite.rex.RexDynamicParam;
 import org.apache.calcite.rex.RexFieldAccess;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.rex.RexLocalRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexOver;
 import org.apache.calcite.rex.RexRangeRef;
@@ -74,16 +78,24 @@ import java.util.List;
   public RexNode visitCall(RexCall call) {
     SqlOperator op = call.getOperator();
     SqlKind kind = op.getKind();
+    RelDataType type = call.getType();
     if (kind == SqlKind.OR || kind == SqlKind.AND) {
-      if (call.getOperands().size() <= 2) {
-        return call;
+      if (call.getOperands().size() > 2) {
+        List<RexNode> children = new ArrayList(call.getOperands());
+        RexNode left = children.remove(0).accept(this);
+        RexNode right = builder.makeCall(type, op, children).accept(this);
+        return builder.makeCall(type, op, ImmutableList.of(left, right));
       }
-      List<RexNode> children = new ArrayList(call.getOperands());
-      RexNode left = children.remove(0);
-      RexNode right = builder.makeCall(op, children).accept(this);
-      return builder.makeCall(op, left, right);
     }
-    return call;
+    return builder.makeCall(type, op, visitChildren(call));
+  }
+
+  private List<RexNode> visitChildren(RexCall call) {
+    List<RexNode> children = Lists.newArrayList();
+    for (RexNode child : call.getOperands()) {
+      children.add(child.accept(this));
+    }
+    return ImmutableList.copyOf(children);
   }
 
   @Override
@@ -100,4 +112,9 @@ import java.util.List;
   public RexNode visitFieldAccess(RexFieldAccess fieldAccess) {
     return fieldAccess;
   }
+
+  @Override
+  public RexNode visitLocalRef(RexLocalRef localRef) {
+    return localRef;
+  }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/19c0225d/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteCombineBinaryOperators.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteCombineBinaryOperators.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteCombineBinaryOperators.java
index 247ad8f..be818d3 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteCombineBinaryOperators.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/logical/partition/RewriteCombineBinaryOperators.java
@@ -17,8 +17,10 @@
   */
 package org.apache.drill.exec.planner.logical.partition;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import org.apache.calcite.plan.RelOptUtil;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexBuilder;
 import org.apache.calcite.rex.RexCall;
 import org.apache.calcite.rex.RexCorrelVariable;
@@ -26,6 +28,7 @@ import org.apache.calcite.rex.RexDynamicParam;
 import org.apache.calcite.rex.RexFieldAccess;
 import org.apache.calcite.rex.RexInputRef;
 import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.rex.RexLocalRef;
 import org.apache.calcite.rex.RexNode;
 import org.apache.calcite.rex.RexOver;
 import org.apache.calcite.rex.RexRangeRef;
@@ -76,6 +79,7 @@ import java.util.List;
   public RexNode visitCall(RexCall call) {
     SqlOperator op = call.getOperator();
     SqlKind kind = op.getKind();
+    RelDataType type = call.getType();
     if (kind == SqlKind.AND) {
       List<RexNode> conjuncts = Lists.newArrayList();
       for (RexNode child : call.getOperands()) {
@@ -90,7 +94,15 @@ import java.util.List;
       }
       return RexUtil.composeDisjunction(builder, disjuncts, true);
     }
-    return call;
+    return builder.makeCall(type, op, visitChildren(call));
+  }
+
+  private List<RexNode> visitChildren(RexCall call) {
+    List<RexNode> children = Lists.newArrayList();
+    for (RexNode child : call.getOperands()) {
+      children.add(child.accept(this));
+    }
+    return ImmutableList.copyOf(children);
   }
 
   @Override
@@ -107,4 +119,9 @@ import java.util.List;
   public RexNode visitFieldAccess(RexFieldAccess fieldAccess) {
     return fieldAccess;
   }
+
+  @Override
+  public RexNode visitLocalRef(RexLocalRef localRef) {
+    return localRef;
+  }
 }

http://git-wip-us.apache.org/repos/asf/drill/blob/19c0225d/exec/java-exec/src/test/java/org/apache/drill/TestCTASPartitionFilter.java
----------------------------------------------------------------------
diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestCTASPartitionFilter.java b/exec/java-exec/src/test/java/org/apache/drill/TestCTASPartitionFilter.java
index 48d7ceb..9886024 100644
--- a/exec/java-exec/src/test/java/org/apache/drill/TestCTASPartitionFilter.java
+++ b/exec/java-exec/src/test/java/org/apache/drill/TestCTASPartitionFilter.java
@@ -76,4 +76,24 @@ public class TestCTASPartitionFilter extends PlanTestBase {
     String query = "select * from drill_3410 where (o_orderpriority = '1-URGENT' and o_orderkey = 10) or (o_orderpriority = '2-HIGH' or o_orderkey = 11)";
     testIncludeFilter(query, 1, "Filter", 34);
   }
+
+  @Test
+  public void testDRILL3414() throws Exception {
+    test("alter session set `planner.slice_target` = 1");
+    test("alter session set `store.partition.hash_distribute` = true");
+    test("use dfs_test.tmp");
+    test(String.format("create table drill_3414 partition by (dir0, dir1) as select * from dfs_test.`%s/multilevel/csv`", TEST_RES_PATH));
+    String query = ("select * from drill_3414 where (dir0=1994 or dir1='Q1') and (dir0=1995 or dir1='Q2' or columns[0] > 5000)");
+    testIncludeFilter(query, 6, "Filter", 20);
+  }
+
+  @Test
+  public void testDRILL3414_2() throws Exception {
+    test("alter session set `planner.slice_target` = 1");
+    test("alter session set `store.partition.hash_distribute` = true");
+    test("use dfs_test.tmp");
+    test(String.format("create table drill_3414_2 partition by (dir0, dir1) as select * from dfs_test.`%s/multilevel/csv`", TEST_RES_PATH));
+    String query = ("select * from drill_3414_2 where (dir0=1994 or dir1='Q1') and (dir0=1995 or dir1='Q2' or columns[0] > 5000) or columns[0] < 3000");
+    testIncludeFilter(query, 1, "Filter", 120);
+  }
 }
\ No newline at end of file