You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ma...@apache.org on 2015/03/19 20:46:40 UTC

phoenix git commit: Move Phoenix filter and projection push-down to a later stage

Repository: phoenix
Updated Branches:
  refs/heads/calcite 3d415c484 -> 9adb3e00f


Move Phoenix filter and projection push-down to a later stage


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/9adb3e00
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/9adb3e00
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/9adb3e00

Branch: refs/heads/calcite
Commit: 9adb3e00f9d0ec73c520e685fb2902a03f8b958d
Parents: 3d415c4
Author: maryannxue <we...@intel.com>
Authored: Thu Mar 19 15:46:29 2015 -0400
Committer: maryannxue <we...@intel.com>
Committed: Thu Mar 19 15:46:29 2015 -0400

----------------------------------------------------------------------
 .../org/apache/phoenix/calcite/CalciteTest.java | 33 ++++++++++++++++----
 .../phoenix/calcite/PhoenixAggregate.java       |  2 +-
 .../apache/phoenix/calcite/PhoenixFilter.java   |  2 +-
 .../org/apache/phoenix/calcite/PhoenixJoin.java |  4 +--
 .../apache/phoenix/calcite/PhoenixProject.java  |  4 +--
 .../phoenix/calcite/PhoenixTableScan.java       |  2 --
 .../calcite/PhoenixToEnumerableConverter.java   |  7 +++++
 .../apache/phoenix/calcite/PhoenixUnion.java    |  7 ++---
 8 files changed, 43 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteTest.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteTest.java b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteTest.java
index a236290..a719271 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteTest.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteTest.java
@@ -188,7 +188,8 @@ public class CalciteTest extends BaseClientManagedTimeIT {
     @Test public void testTableScan() throws Exception {
         start().sql("select * from aTable where a_string = 'a'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
-                           "  PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n")
+                           "  PhoenixFilter(condition=[=($2, 'a')])\n" +
+                           "    PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
                 .resultIs(new Object[][] {
                           {"00D300000000XHP", "00A123122312312", "a"}, 
                           {"00D300000000XHP", "00A223122312312", "a"}, 
@@ -200,7 +201,9 @@ public class CalciteTest extends BaseClientManagedTimeIT {
     @Test public void testProject() throws Exception {
         start().sql("select entity_id, a_string, organization_id from aTable where a_string = 'a'")
                 .explainIs("PhoenixToEnumerableConverter\n" +
-                           "  PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')], project=[[$1, $2, $0]])\n")
+                           "  PhoenixProject(ENTITY_ID=[$1], A_STRING=[$2], ORGANIZATION_ID=[$0])\n" +
+                           "    PhoenixFilter(condition=[=($2, 'a')])\n" +
+                           "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
                 .resultIs(new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"}, 
                           {"00A223122312312", "a", "00D300000000XHP"}, 
@@ -214,8 +217,11 @@ public class CalciteTest extends BaseClientManagedTimeIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixProject(ENTITY_ID=[$4], A_STRING=[$2], ORGANIZATION_ID=[$3])\n" +
                            "    PhoenixJoin(condition=[AND(=($4, $1), =($3, $0))], joinType=[inner])\n" +
-                           "      PhoenixTableScan(table=[[phoenix, ATABLE]], project=[[$0, $1, $2]])\n" +
-                           "      PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')], project=[[$0, $1, $2]])\n")
+                           "      PhoenixProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
+                           "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n" +
+                           "      PhoenixProject(ORGANIZATION_ID=[$0], ENTITY_ID=[$1], A_STRING=[$2])\n" +
+                           "        PhoenixFilter(condition=[=($2, 'a')])\n" +
+                           "          PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
                 .resultIs(new Object[][] {
                           {"00A123122312312", "a", "00D300000000XHP"}, 
                           {"00A223122312312", "a", "00D300000000XHP"}, 
@@ -227,8 +233,10 @@ public class CalciteTest extends BaseClientManagedTimeIT {
                 .explainIs("PhoenixToEnumerableConverter\n" +
                            "  PhoenixProject(item_id=[$0], NAME=[$1], supplier_id=[$3], NAME0=[$4])\n" +
                            "    PhoenixJoin(condition=[=($2, $3)], joinType=[inner])\n" +
-                           "      PhoenixTableScan(table=[[phoenix, ITEMTABLE]], project=[[$0, $1, $5]])\n" +
-                           "      PhoenixTableScan(table=[[phoenix, SUPPLIERTABLE]], project=[[$0, $1]])\n")
+                           "      PhoenixProject(item_id=[$0], NAME=[$1], supplier_id=[$5])\n" +
+                           "        PhoenixTableScan(table=[[phoenix, ITEMTABLE]])\n" +
+                           "      PhoenixProject(supplier_id=[$0], NAME=[$1])\n" +
+                           "        PhoenixTableScan(table=[[phoenix, SUPPLIERTABLE]])\n")
                 .resultIs(new Object[][] {
                           {"0000000001", "T1", "0000000001", "S1"}, 
                           {"0000000002", "T2", "0000000001", "S1"}, 
@@ -238,6 +246,19 @@ public class CalciteTest extends BaseClientManagedTimeIT {
                           {"0000000006", "T6", "0000000006", "S6"}})
                 .close();
     }
+    
+    @Test public void testMultiJoin() throws Exception {
+        start().sql("select t1.entity_id, t2.a_string, t3.organization_id from aTable t1 join aTable t2 on t1.entity_id = t2.entity_id and t1.organization_id = t2.organization_id join atable t3 on t1.entity_id = t3.entity_id and t1.organization_id = t3.organization_id where t1.a_string = 'a'") 
+                .explainIs("PhoenixToEnumerableConverter\n" +
+                           "  PhoenixProject(ENTITY_ID=[$1], A_STRING=[$20], ORGANIZATION_ID=[$36])\n" +
+                           "    PhoenixJoin(condition=[AND(=($1, $37), =($0, $36))], joinType=[inner])\n" +
+                           "      PhoenixJoin(condition=[AND(=($1, $19), =($0, $18))], joinType=[inner])\n" +
+                           "        PhoenixFilter(condition=[=($2, 'a')])\n" +
+                           "          PhoenixTableScan(table=[[phoenix, ATABLE]])\n" +
+                           "        PhoenixTableScan(table=[[phoenix, ATABLE]])\n" +
+                           "      PhoenixTableScan(table=[[phoenix, ATABLE]])\n")
+                .close();
+    }
 
     @Test public void testConnectUsingModel() throws Exception {
         final Start start = new Start() {

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixAggregate.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixAggregate.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixAggregate.java
index 4b1b2c2..fb113cc 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixAggregate.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixAggregate.java
@@ -19,7 +19,6 @@ public class PhoenixAggregate extends Aggregate implements PhoenixRel {
     public PhoenixAggregate(RelOptCluster cluster, RelTraitSet traits, RelNode child, boolean indicator, ImmutableBitSet groupSet, List<ImmutableBitSet> groupSets, List<AggregateCall> aggCalls) throws InvalidRelException {
         super(cluster, traits, child, indicator, groupSet, groupSets, aggCalls);
         assert getConvention() == PhoenixRel.CONVENTION;
-        assert getConvention() == child.getConvention();
 
         for (AggregateCall aggCall : aggCalls) {
             if (aggCall.isDistinct()) {
@@ -47,6 +46,7 @@ public class PhoenixAggregate extends Aggregate implements PhoenixRel {
 
     @Override
     public QueryPlan implement(Implementor implementor) {
+        assert getConvention() == getInput().getConvention();
         implementor.visitInput(0, (PhoenixRel) getInput());
         throw new UnsupportedOperationException();
     }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixFilter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixFilter.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixFilter.java
index 3e04f23..8163682 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixFilter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixFilter.java
@@ -20,7 +20,6 @@ public class PhoenixFilter extends Filter implements PhoenixRel {
     protected PhoenixFilter(RelOptCluster cluster, RelTraitSet traits, RelNode input, RexNode condition) {
         super(cluster, traits, input, condition);
         assert getConvention() == PhoenixRel.CONVENTION;
-        assert getConvention() == input.getConvention();
     }
 
     public PhoenixFilter copy(RelTraitSet traitSet, RelNode input, RexNode condition) {
@@ -33,6 +32,7 @@ public class PhoenixFilter extends Filter implements PhoenixRel {
     }
 
     public QueryPlan implement(Implementor implementor) {
+        assert getConvention() == getInput().getConvention();
         QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
         // TODO: what to do with the Expression?
         // Already determined this filter cannot be pushed down, so

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixJoin.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixJoin.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixJoin.java
index d0b0777..b666984 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixJoin.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixJoin.java
@@ -35,8 +35,6 @@ public class PhoenixJoin extends Join implements PhoenixRel {
     public PhoenixJoin(RelOptCluster cluster, RelTraitSet traits, RelNode left, RelNode right, RexNode condition, JoinRelType joinType, Set<String> variablesStopped) {
         super( cluster, traits, left, right, condition, joinType, variablesStopped);
         assert getConvention() == PhoenixRel.CONVENTION;
-        assert left.getConvention() == PhoenixRel.CONVENTION;
-        assert right.getConvention() == PhoenixRel.CONVENTION;
     }
 
     @Override
@@ -46,6 +44,8 @@ public class PhoenixJoin extends Join implements PhoenixRel {
 
     @Override
     public QueryPlan implement(Implementor implementor) {
+        assert getLeft().getConvention() == PhoenixRel.CONVENTION;
+        assert getRight().getConvention() == PhoenixRel.CONVENTION;
         PhoenixRel left = (PhoenixRel) getLeft();
         PhoenixRel right = (PhoenixRel) getRight();
         boolean hashRHS = (left instanceof PhoenixTableScan) && getJoinType() != JoinRelType.RIGHT;

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixProject.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixProject.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixProject.java
index 2dd1c28..b1ca8fa 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixProject.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixProject.java
@@ -36,9 +36,8 @@ import com.google.common.collect.Lists;
  */
 public class PhoenixProject extends Project implements PhoenixRel {
     public PhoenixProject(RelOptCluster cluster, RelTraitSet traits, RelNode input, List<? extends RexNode> projects, RelDataType rowType) {
-        super(cluster, traits, input, projects, rowType, Flags.BOXED);
+        super(cluster, traits, input, projects, rowType);
         assert getConvention() == PhoenixRel.CONVENTION;
-        assert getConvention() == input.getConvention();
     }
 
     @Override
@@ -52,6 +51,7 @@ public class PhoenixProject extends Project implements PhoenixRel {
 
     @Override
     public QueryPlan implement(Implementor implementor) {
+        assert getConvention() == getInput().getConvention();
         QueryPlan plan = implementor.visitInput(0, (PhoenixRel) getInput());
         
         TupleProjector tupleProjector = project(implementor, getProjects());

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTableScan.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTableScan.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTableScan.java
index 9646541..8c6153c 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTableScan.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixTableScan.java
@@ -69,8 +69,6 @@ public class PhoenixTableScan extends TableScan implements PhoenixRel {
         for (RelOptRule rule : rules) {
             planner.addRule(rule);
         }
-        planner.addRule(PhoenixFilterScanMergeRule.INSTANCE);
-        planner.addRule(PhoenixProjectScanMergeRule.INSTANCE);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixToEnumerableConverter.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixToEnumerableConverter.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixToEnumerableConverter.java
index 0811211..cad1d66 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixToEnumerableConverter.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixToEnumerableConverter.java
@@ -20,6 +20,11 @@ import org.apache.calcite.plan.RelTraitSet;
 import org.apache.calcite.rel.RelNode;
 import org.apache.calcite.rel.convert.ConverterImpl;
 import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.tools.FrameworkConfig;
+import org.apache.calcite.tools.Frameworks;
+import org.apache.calcite.tools.Planner;
+import org.apache.calcite.tools.Program;
+import org.apache.calcite.tools.Programs;
 import org.apache.phoenix.compile.QueryPlan;
 
 /**
@@ -67,6 +72,8 @@ public class PhoenixToEnumerableConverter extends ConverterImpl implements Enume
     }
     
     static QueryPlan makePlan(PhoenixRel rel) {
+        Program p = Programs.ofRules(PhoenixFilterScanMergeRule.INSTANCE, PhoenixProjectScanMergeRule.INSTANCE);
+        rel = (PhoenixRel) (p.run(rel.getCluster().getPlanner(), rel, RelTraitSet.createEmpty()));
         final PhoenixRel.Implementor phoenixImplementor = new PhoenixRelImplementorImpl();
         return phoenixImplementor.visitInput(0, rel);
     }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/9adb3e00/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixUnion.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixUnion.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixUnion.java
index d44bb0c..cc76334 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixUnion.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/PhoenixUnion.java
@@ -17,10 +17,6 @@ public class PhoenixUnion extends Union implements PhoenixRel {
     protected PhoenixUnion(RelOptCluster cluster, RelTraitSet traits, List<RelNode> inputs, boolean all) {
         super(cluster, traits, inputs, all);
         assert getConvention() == PhoenixRel.CONVENTION;
-
-        for (RelNode input : inputs) {
-            assert getConvention() == input.getConvention();
-        }
     }
 
     @Override
@@ -30,6 +26,9 @@ public class PhoenixUnion extends Union implements PhoenixRel {
 
     @Override
     public QueryPlan implement(Implementor implementor) {
+        for (RelNode input : getInputs()) {
+            assert getConvention() == input.getConvention();
+        }
         for (Ord<RelNode> input : Ord.zip(inputs)) {
             implementor.visitInput(input.i, (PhoenixRel) input.e);
         }