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

Reply via email to