Repository: phoenix
Updated Branches:
  refs/heads/calcite 6f39c1055 -> 3b70c6b98


PHOENIX-3477 Support sequence arithmetic in Calcite-Phoenix


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

Branch: refs/heads/calcite
Commit: 3b70c6b98ffed7d7787b585a68e3465e7ac0acd5
Parents: 6f39c10
Author: Eric Lomore <eric.lom...@gmail.com>
Authored: Mon Dec 12 12:54:18 2016 -0800
Committer: maryannxue <maryann....@gmail.com>
Committed: Mon Dec 12 12:54:18 2016 -0800

----------------------------------------------------------------------
 .../org/apache/phoenix/calcite/CalciteIT.java   | 22 ++++++++++++++++++++
 .../org/apache/phoenix/end2end/SequenceIT.java  |  2 +-
 .../apache/phoenix/calcite/CalciteUtils.java    | 21 +++++--------------
 .../calcite/rel/PhoenixClientProject.java       | 14 ++++---------
 .../calcite/rel/PhoenixRelImplementor.java      |  2 --
 .../calcite/rel/PhoenixRelImplementorImpl.java  |  9 +-------
 6 files changed, 33 insertions(+), 37 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
index 6154a34..a2c15fa 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/calcite/CalciteIT.java
@@ -1389,6 +1389,28 @@ public class CalciteIT extends BaseCalciteIT {
                         {7L, "0000000005", "T5", "0000000005", "S5"},
                         {8L, "0000000006", "T6", "0000000006", "S6"}})
                 .close();
+
+        start(false, 1000f).sql("select NEXT VALUE FOR my.seq1 + 1, entity_id 
from aTable where a_string = 'a'")
+                .explainIs("PhoenixToEnumerableConverter\n" +
+                        "  
PhoenixClientProject(EXPR$0=[+(NEXT_VALUE('\"MY\".\"SEQ1\"'), 1)], 
ENTITY_ID=[$1])\n" +
+                        "    PhoenixTableScan(table=[[phoenix, ATABLE]], 
filter=[=($2, 'a')])\n")
+                .resultIs(1, new Object[][]{
+                        {11L, "00A123122312312"},
+                        {13L, "00A223122312312"},
+                        {15L, "00A323122312312"},
+                        {17L, "00A423122312312"}})
+                .close();
+
+        start(false, 1000f).sql("select (NEXT VALUE FOR my.seq1 * 2) + 1, 
entity_id from aTable where a_string = 'a'")
+                .explainIs("PhoenixToEnumerableConverter\n" +
+                        "  
PhoenixClientProject(EXPR$0=[+(*(NEXT_VALUE('\"MY\".\"SEQ1\"'), 2), 1)], 
ENTITY_ID=[$1])\n" +
+                        "    PhoenixTableScan(table=[[phoenix, ATABLE]], 
filter=[=($2, 'a')])\n")
+                .resultIs(1, new Object[][]{
+                        {37L, "00A123122312312"},
+                        {41L, "00A223122312312"},
+                        {45L, "00A323122312312"},
+                        {49L, "00A423122312312"}})
+                .close();
     }
 
     @Ignore // CALCITE-1045

http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
index 3ed4fd7..8e9e2fd 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/SequenceIT.java
@@ -735,7 +735,7 @@ public class SequenceIT extends BaseClientManagedTimeIT {
         nextConnection();
         conn.createStatement().execute("CREATE SEQUENCE foo.bar START WITH 3 
INCREMENT BY 2");
         nextConnection();
-        String query = "SELECT NEXT VALUE FOR foo.bar+1 FROM 
SYSTEM.\"SEQUENCE\"";
+        String query = "SELECT NEXT VALUE FOR foo.bar+1 FROM 
\"SYSTEM\".\"SEQUENCE\"";
         ResultSet rs = conn.prepareStatement(query).executeQuery();
         assertTrue(rs.next());
         assertEquals(4, rs.getInt(1));

http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
index 1ed650b..46d6bed 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/calcite/CalciteUtils.java
@@ -1085,22 +1085,6 @@ public class CalciteUtils {
                
                return false;
        }
-       
-       public static PhoenixSequence findSequence(Project project) {
-        SequenceValueFinder seqFinder = new SequenceValueFinder();
-        for (RexNode node : project.getProjects()) {
-            node.accept(seqFinder);
-            if (seqFinder.sequenceValueCall != null) {
-                RexLiteral operand =
-                               (RexLiteral) 
seqFinder.sequenceValueCall.getOperands().get(0);
-                List<String> name = Util.stringToList((String) 
operand.getValue2());
-                RelOptTable table = 
Prepare.CatalogReader.THREAD_LOCAL.get().getTable(name);
-                return table.unwrap(PhoenixSequence.class);
-            }
-        }
-        
-        return null;
-       }
     
     private static class SequenceValueFinder extends RexVisitorImpl<Void> {
         private RexCall sequenceValueCall;
@@ -1115,6 +1099,11 @@ public class CalciteUtils {
                         || call.getKind() == SqlKind.NEXT_VALUE)) {
                 sequenceValueCall = call;
             }
+            if (sequenceValueCall == null){
+                for(RexNode node : call.getOperands()){
+                    if(node instanceof RexCall) visitCall((RexCall) node);
+                }
+            }
             return null;
         }
     }

http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
index 1c7a6c0..58d3861 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixClientProject.java
@@ -15,8 +15,6 @@ import org.apache.calcite.rel.metadata.RelMetadataQuery;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rex.RexNode;
 import org.apache.hadoop.hbase.client.Scan;
-import org.apache.phoenix.calcite.CalciteUtils;
-import org.apache.phoenix.calcite.PhoenixSequence;
 import org.apache.phoenix.compile.QueryPlan;
 import org.apache.phoenix.compile.RowProjector;
 import org.apache.phoenix.compile.SequenceManager;
@@ -25,7 +23,6 @@ import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.execute.ClientScanPlan;
 import org.apache.phoenix.execute.TupleProjectionPlan;
 import org.apache.phoenix.execute.TupleProjector;
-import org.apache.phoenix.jdbc.PhoenixStatement;
 import org.apache.phoenix.schema.Sequence;
 
 import com.google.common.base.Supplier;
@@ -73,13 +70,10 @@ public class PhoenixClientProject extends 
PhoenixAbstractProject {
         QueryPlan plan = implementor.visitInput(0, (PhoenixQueryRel) 
getInput());
         implementor.popContext();
         
-        
-        PhoenixSequence sequence = CalciteUtils.findSequence(this);
-        final SequenceManager seqManager = sequence == null ?
-                null : new SequenceManager(new PhoenixStatement(sequence.pc));
-        implementor.setSequenceManager(seqManager);
-        TupleProjector tupleProjector = project(implementor);
-        if (seqManager != null) {
+
+        TupleProjector tupleProjector = super.project(implementor);
+        SequenceManager seqManager = 
implementor.getStatementContext().getSequenceManager();
+        if (seqManager.getSequenceCount() != 0) {
             try {
                 
seqManager.validateSequences(Sequence.ValueOp.VALIDATE_SEQUENCE);
                 StatementContext context = new StatementContext(

http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementor.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementor.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementor.java
index 4b698c7..db77254 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementor.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementor.java
@@ -6,7 +6,6 @@ import org.apache.calcite.util.ImmutableIntList;
 import org.apache.phoenix.calcite.PhoenixSequence;
 import org.apache.phoenix.calcite.TableMapping;
 import org.apache.phoenix.compile.QueryPlan;
-import org.apache.phoenix.compile.SequenceManager;
 import org.apache.phoenix.compile.SequenceValueExpression;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.execute.RuntimeContext;
@@ -29,7 +28,6 @@ public interface PhoenixRelImplementor {
     RuntimeContext getRuntimeContext();
     void setTableMapping(TableMapping tableMapping);
     TableMapping getTableMapping();
-    void setSequenceManager(SequenceManager sequenceManager);
     void pushContext(ImplementorContext context);
     ImplementorContext popContext();
     ImplementorContext getCurrentContext();

http://git-wip-us.apache.org/repos/asf/phoenix/blob/3b70c6b9/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
----------------------------------------------------------------------
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
index 901ea07..6f0c806 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/calcite/rel/PhoenixRelImplementorImpl.java
@@ -8,7 +8,6 @@ import java.util.Stack;
 import org.apache.phoenix.calcite.PhoenixSequence;
 import org.apache.phoenix.calcite.TableMapping;
 import org.apache.phoenix.compile.QueryPlan;
-import org.apache.phoenix.compile.SequenceManager;
 import org.apache.phoenix.compile.SequenceValueExpression;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.coprocessor.MetaDataProtocol;
@@ -35,7 +34,6 @@ public class PhoenixRelImplementorImpl implements 
PhoenixRelImplementor {
     private final StatementContext statementContext;
     private final RuntimeContext runtimeContext;
        private Stack<ImplementorContext> contextStack;
-       private SequenceManager sequenceManager;
        private TableMapping tableMapping;
        
        public PhoenixRelImplementorImpl(
@@ -73,7 +71,7 @@ public class PhoenixRelImplementorImpl implements 
PhoenixRelImplementor {
         PName tenantName = seq.pc.getTenantId();
         TableName tableName = TableName.create(seq.schemaName, 
seq.sequenceName);
         try {
-            return sequenceManager.newSequenceReference(tenantName, tableName, 
null, op);
+            return 
statementContext.getSequenceManager().newSequenceReference(tenantName, 
tableName, null, op);
         } catch (SQLException e) {
             throw new RuntimeException(e);
         }
@@ -98,11 +96,6 @@ public class PhoenixRelImplementorImpl implements 
PhoenixRelImplementor {
     public TableMapping getTableMapping() {
         return this.tableMapping;
     }
-    
-    @Override
-    public void setSequenceManager(SequenceManager sequenceManager) {
-        this.sequenceManager = sequenceManager;
-    }
 
     @Override
     public void pushContext(ImplementorContext context) {

Reply via email to