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