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) {