Repository: phoenix Updated Branches: refs/heads/calcite 1f189de2d -> d5c868209
PHOENIX-2192 Implement PhoenixUnion Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d5c86820 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d5c86820 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d5c86820 Branch: refs/heads/calcite Commit: d5c868209480e5e8ab69bade0ff060dc99f67196 Parents: 1f189de Author: maryannxue <[email protected]> Authored: Thu Aug 20 00:05:37 2015 -0400 Committer: maryannxue <[email protected]> Committed: Thu Aug 20 00:05:37 2015 -0400 ---------------------------------------------------------------------- .../org/apache/phoenix/calcite/CalciteTest.java | 39 ++++++++++++++++++++ .../phoenix/calcite/rel/PhoenixUnion.java | 28 ++++++++++++-- .../calcite/rules/PhoenixConverterRules.java | 5 +-- .../org/apache/phoenix/execute/UnionPlan.java | 12 +----- 4 files changed, 66 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/d5c86820/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 311926e..b96c2a2 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 @@ -926,6 +926,45 @@ public class CalciteTest extends BaseClientManagedTimeIT { .close(); } + @Test public void testUnion() { + start().sql("select entity_id from atable where a_string = 'a' union all select entity_id from atable where a_string = 'b'") + .explainIs("PhoenixToEnumerableConverter\n" + + " PhoenixUnion(all=[true])\n" + + " PhoenixToClientConverter\n" + + " PhoenixServerProject(ENTITY_ID=[$1])\n" + + " PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n" + + " PhoenixToClientConverter\n" + + " PhoenixServerProject(ENTITY_ID=[$1])\n" + + " PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'b')])\n") + .resultIs(new Object[][] { + {"00A123122312312"}, + {"00A223122312312"}, + {"00A323122312312"}, + {"00A423122312312"}, + {"00B523122312312"}, + {"00B623122312312"}, + {"00B723122312312"}, + {"00B823122312312"}}) + .close(); + + start().sql("select entity_id, a_string from atable where a_string = 'a' union all select entity_id, a_string from atable where a_string = 'c' order by entity_id desc limit 3") + .explainIs("PhoenixToEnumerableConverter\n" + + " PhoenixLimit(fetch=[3])\n" + + " PhoenixClientSort(sort0=[$0], dir0=[DESC])\n" + + " PhoenixUnion(all=[true])\n" + + " PhoenixToClientConverter\n" + + " PhoenixServerProject(ENTITY_ID=[$1], A_STRING=[$2])\n" + + " PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'a')])\n" + + " PhoenixToClientConverter\n" + + " PhoenixServerProject(ENTITY_ID=[$1], A_STRING=[$2])\n" + + " PhoenixTableScan(table=[[phoenix, ATABLE]], filter=[=($2, 'c')])\n") + .resultIs(new Object[][] { + {"00C923122312312", "c"}, + {"00A423122312312", "a"}, + {"00A323122312312", "a"}}) + .close(); + } + @Test public void testConnectJoinHsqldb() { final Start start = new Start(new Properties(), false) { @Override http://git-wip-us.apache.org/repos/asf/phoenix/blob/d5c86820/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixUnion.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixUnion.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixUnion.java index 9a19a95..8b0b616 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixUnion.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixUnion.java @@ -4,10 +4,18 @@ import java.util.List; import org.apache.calcite.linq4j.Ord; import org.apache.calcite.plan.RelOptCluster; +import org.apache.calcite.plan.RelOptCost; +import org.apache.calcite.plan.RelOptPlanner; import org.apache.calcite.plan.RelTraitSet; import org.apache.calcite.rel.RelNode; import org.apache.calcite.rel.core.Union; import org.apache.phoenix.compile.QueryPlan; +import org.apache.phoenix.compile.RowProjector; +import org.apache.phoenix.compile.GroupByCompiler.GroupBy; +import org.apache.phoenix.compile.OrderByCompiler.OrderBy; +import org.apache.phoenix.execute.UnionPlan; +import org.apache.phoenix.parse.SelectStatement; +import com.google.common.collect.Lists; /** * Implementation of {@link org.apache.calcite.rel.core.Union} @@ -31,13 +39,25 @@ public class PhoenixUnion extends Union implements PhoenixRel { } @Override - public QueryPlan implement(Implementor implementor) { + public RelOptCost computeSelfCost(RelOptPlanner planner) { for (RelNode input : getInputs()) { - assert getConvention() == input.getConvention(); + if (input.getConvention() != PhoenixRel.CLIENT_CONVENTION) { + return planner.getCostFactory().makeInfiniteCost(); + } } + + return super.computeSelfCost(planner) + .multiplyBy(PHOENIX_FACTOR); + } + + @Override + public QueryPlan implement(Implementor implementor) { + List<QueryPlan> subPlans = Lists.newArrayListWithExpectedSize(inputs.size()); for (Ord<RelNode> input : Ord.zip(inputs)) { - implementor.visitInput(input.i, (PhoenixRel) input.e); + subPlans.add(implementor.visitInput(input.i, (PhoenixRel) input.e)); } - throw new UnsupportedOperationException(); + + return new UnionPlan(subPlans.get(0).getContext(), SelectStatement.SELECT_ONE, subPlans.get(0).getTableRef(), RowProjector.EMPTY_PROJECTOR, + null, OrderBy.EMPTY_ORDER_BY, GroupBy.EMPTY_GROUP_BY, subPlans, null); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/d5c86820/phoenix-core/src/main/java/org/apache/phoenix/calcite/rules/PhoenixConverterRules.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rules/PhoenixConverterRules.java b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rules/PhoenixConverterRules.java index 072e76c..7901e50 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rules/PhoenixConverterRules.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rules/PhoenixConverterRules.java @@ -812,9 +812,8 @@ public class PhoenixConverterRules { return true; } - public static boolean isConvertible(Union input) { - // TODO disable for now since PhoenixUnion is not implemented yet. - return false; + public static boolean isConvertible(Union union) { + return union.all; } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/d5c86820/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java index d80017a..134bafe 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/UnionPlan.java @@ -29,7 +29,6 @@ import org.apache.phoenix.compile.GroupByCompiler.GroupBy; import org.apache.phoenix.compile.OrderByCompiler.OrderBy; import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.compile.RowProjector; -import org.apache.phoenix.compile.ScanRanges; import org.apache.phoenix.compile.StatementContext; import org.apache.phoenix.iterate.ConcatResultIterator; import org.apache.phoenix.iterate.LimitingResultIterator; @@ -54,7 +53,6 @@ public class UnionPlan implements QueryPlan { private final Integer limit; private final GroupBy groupBy; private final RowProjector projector; - private final boolean isDegenerate; private final List<QueryPlan> plans; private UnionResultIterators iterators; @@ -69,19 +67,11 @@ public class UnionPlan implements QueryPlan { this.groupBy = groupBy; this.plans = plans; this.paramMetaData = paramMetaData; - boolean isDegen = true; - for (QueryPlan plan : plans) { - if (plan.getContext().getScanRanges() != ScanRanges.NOTHING) { - isDegen = false; - break; - } - } - this.isDegenerate = isDegen; } @Override public boolean isDegenerate() { - return isDegenerate; + return false; } @Override
