PHOENIX-2413 Implement BaseMutationPlan for common method implementation
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/461aaa23 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/461aaa23 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/461aaa23 Branch: refs/heads/txn Commit: 461aaa239479abb8bb35df79324d2d2c3627e0d5 Parents: a95d701 Author: James Taylor <[email protected]> Authored: Thu Nov 12 21:49:32 2015 -0800 Committer: James Taylor <[email protected]> Committed: Thu Nov 12 21:49:32 2015 -0800 ---------------------------------------------------------------------- .../phoenix/compile/BaseMutationPlan.java | 67 ++++++ .../phoenix/compile/CreateFunctionCompiler.java | 17 +- .../phoenix/compile/CreateIndexCompiler.java | 28 +-- .../phoenix/compile/CreateSequenceCompiler.java | 32 +-- .../phoenix/compile/CreateTableCompiler.java | 25 +-- .../apache/phoenix/compile/DeleteCompiler.java | 130 ++++++++---- .../phoenix/compile/DropSequenceCompiler.java | 24 +-- .../phoenix/compile/ListJarsQueryPlan.java | 14 +- .../apache/phoenix/compile/MutationPlan.java | 6 +- .../apache/phoenix/compile/PostDDLCompiler.java | 75 ++++--- .../apache/phoenix/compile/StatementPlan.java | 8 +- .../apache/phoenix/compile/TraceQueryPlan.java | 27 ++- .../apache/phoenix/compile/UpsertCompiler.java | 95 +++++---- .../apache/phoenix/execute/BaseQueryPlan.java | 51 +++-- .../phoenix/execute/DelegateQueryPlan.java | 14 +- .../phoenix/execute/SortMergeJoinPlan.java | 18 +- .../org/apache/phoenix/execute/UnionPlan.java | 20 +- .../apache/phoenix/jdbc/PhoenixStatement.java | 209 +++++-------------- .../query/ConnectionlessQueryServicesImpl.java | 2 +- .../apache/phoenix/schema/MetaDataClient.java | 27 +-- .../query/ParallelIteratorsSplitTest.java | 22 +- 21 files changed, 492 insertions(+), 419 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java new file mode 100644 index 0000000..d82aa1f --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/BaseMutationPlan.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.compile; + +import java.sql.ParameterMetaData; +import java.sql.SQLException; +import java.util.Collections; +import java.util.Set; + +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; +import org.apache.phoenix.schema.TableRef; + +public abstract class BaseMutationPlan implements MutationPlan { + private final StatementContext context; + private final Operation operation; + + public BaseMutationPlan(StatementContext context, Operation operation) { + this.context = context; + this.operation = operation; + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override + public StatementContext getContext() { + return context; + } + + @Override + public ParameterMetaData getParameterMetaData() { + return context.getBindManager().getParameterMetaData(); + } + + @Override + public ExplainPlan getExplainPlan() throws SQLException { + return ExplainPlan.EMPTY_PLAN; + } + + @Override + public TableRef getTargetRef() { + return context.getCurrentTable(); + } + + @Override + public Set<TableRef> getSourceRefs() { + return Collections.emptySet(); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java index 138c75d..0e8036a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateFunctionCompiler.java @@ -17,12 +17,9 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; -import java.sql.SQLFeatureNotSupportedException; import java.util.Collections; -import org.apache.hadoop.hbase.client.Scan; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixStatement; @@ -43,12 +40,7 @@ public class CreateFunctionCompiler { final StatementContext context = new StatementContext(statement); final MetaDataClient client = new MetaDataClient(connectionToBe); - return new MutationPlan() { - - @Override - public ParameterMetaData getParameterMetaData() { - return context.getBindManager().getParameterMetaData(); - } + return new BaseMutationPlan(context, create.getOperation()) { @Override public MutationState execute() throws SQLException { @@ -69,14 +61,9 @@ public class CreateFunctionCompiler { } @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override public StatementContext getContext() { return context; } }; } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java index f1937a5..1837b52 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateIndexCompiler.java @@ -17,7 +17,6 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.Collections; import java.util.List; @@ -31,17 +30,19 @@ import org.apache.phoenix.expression.LiteralExpression; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixDatabaseMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.CreateIndexStatement; import org.apache.phoenix.parse.ParseNode; -import org.apache.phoenix.parse.PropertyName; import org.apache.phoenix.schema.MetaDataClient; import org.apache.phoenix.schema.PTable.IndexType; public class CreateIndexCompiler { private final PhoenixStatement statement; + private final Operation operation; - public CreateIndexCompiler(PhoenixStatement statement) { + public CreateIndexCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } public MutationPlan compile(final CreateIndexStatement create) throws SQLException { @@ -78,18 +79,7 @@ public class CreateIndexCompiler { } final MetaDataClient client = new MetaDataClient(connection); - return new MutationPlan() { - - @Override - public ParameterMetaData getParameterMetaData() { - return context.getBindManager().getParameterMetaData(); - } - - @Override - public PhoenixConnection getConnection() { - return connection; - } - + return new BaseMutationPlan(context, operation) { @Override public MutationState execute() throws SQLException { return client.createIndex(create, splits); @@ -99,11 +89,7 @@ public class CreateIndexCompiler { public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE INDEX")); } - - @Override - public StatementContext getContext() { - return context; - } + }; } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateSequenceCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateSequenceCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateSequenceCompiler.java index 65d2c04..3ff149a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateSequenceCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateSequenceCompiler.java @@ -17,7 +17,6 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.Collections; @@ -27,26 +26,28 @@ import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.expression.Expression; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.BindParseNode; import org.apache.phoenix.parse.CreateSequenceStatement; import org.apache.phoenix.parse.ParseNode; -import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.parse.TableName; +import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.query.QueryServicesOptions; -import org.apache.phoenix.schema.types.PInteger; import org.apache.phoenix.schema.MetaDataClient; -import org.apache.phoenix.schema.types.PDataType; import org.apache.phoenix.schema.PDatum; -import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.schema.SortOrder; - +import org.apache.phoenix.schema.types.PDataType; +import org.apache.phoenix.schema.types.PInteger; +import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.util.SequenceUtil; public class CreateSequenceCompiler { private final PhoenixStatement statement; + private final Operation operation; - public CreateSequenceCompiler(PhoenixStatement statement) { + public CreateSequenceCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } private static class LongDatum implements PDatum { @@ -231,7 +232,7 @@ public class CreateSequenceCompiler { final long cacheSize = Math.max(1L, cacheSizeValue); final MetaDataClient client = new MetaDataClient(connection); - return new MutationPlan() { + return new BaseMutationPlan(context, operation) { @Override public MutationState execute() throws SQLException { @@ -242,21 +243,6 @@ public class CreateSequenceCompiler { public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE SEQUENCE")); } - - @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override - public ParameterMetaData getParameterMetaData() { - return context.getBindManager().getParameterMetaData(); - } - - @Override - public StatementContext getContext() { - return context; - } }; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java index a5adc49..f09b508 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java @@ -17,7 +17,6 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.BitSet; import java.util.Collections; @@ -41,6 +40,7 @@ import org.apache.phoenix.expression.RowKeyColumnExpression; import org.apache.phoenix.expression.visitor.StatelessTraverseNoExpressionVisitor; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.BindParseNode; import org.apache.phoenix.parse.ColumnParseNode; import org.apache.phoenix.parse.CreateTableStatement; @@ -69,9 +69,11 @@ import com.google.common.collect.Iterators; public class CreateTableCompiler { private static final PDatum VARBINARY_DATUM = new VarbinaryDatum(); private final PhoenixStatement statement; + private final Operation operation; - public CreateTableCompiler(PhoenixStatement statement) { + public CreateTableCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } public MutationPlan compile(final CreateTableStatement create) throws SQLException { @@ -173,12 +175,7 @@ public class CreateTableCompiler { final MetaDataClient client = new MetaDataClient(connectionToBe); final PTable parent = parentToBe; - return new MutationPlan() { - - @Override - public ParameterMetaData getParameterMetaData() { - return context.getBindManager().getParameterMetaData(); - } + return new BaseMutationPlan(context, operation) { @Override public MutationState execute() throws SQLException { @@ -195,16 +192,6 @@ public class CreateTableCompiler { public ExplainPlan getExplainPlan() throws SQLException { return new ExplainPlan(Collections.singletonList("CREATE TABLE")); } - - @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override - public StatementContext getContext() { - return context; - } }; } @@ -339,4 +326,4 @@ public class CreateTableCompiler { } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java index 2c90bdf..f0f693e 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/DeleteCompiler.java @@ -1,5 +1,4 @@ /* - * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file @@ -50,6 +49,7 @@ import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixResultSet; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.optimize.QueryOptimizer; import org.apache.phoenix.parse.AliasedNode; import org.apache.phoenix.parse.DeleteStatement; @@ -91,9 +91,11 @@ public class DeleteCompiler { private static ParseNodeFactory FACTORY = new ParseNodeFactory(); private final PhoenixStatement statement; + private final Operation operation; - public DeleteCompiler(PhoenixStatement statement) { + public DeleteCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } private static MutationState deleteRows(StatementContext childContext, TableRef targetTableRef, TableRef indexTableRef, ResultIterator iterator, RowProjector projector, TableRef sourceTableRef) throws SQLException { @@ -270,11 +272,6 @@ public class DeleteCompiler { } @Override - public PhoenixConnection getConnection() { - return firstPlan.getConnection(); - } - - @Override public MutationState execute() throws SQLException { MutationState state = firstPlan.execute(); for (MutationPlan plan : plans.subList(1, plans.size())) { @@ -282,6 +279,21 @@ public class DeleteCompiler { } return state; } + + @Override + public TableRef getTargetRef() { + return firstPlan.getTargetRef(); + } + + @Override + public Set<TableRef> getSourceRefs() { + return firstPlan.getSourceRefs(); + } + + @Override + public Operation getOperation() { + return operation; + } } public MutationPlan compile(DeleteStatement delete) throws SQLException { @@ -298,20 +310,28 @@ public class DeleteCompiler { boolean noQueryReqd = false; boolean runOnServer = false; SelectStatement select = null; + ColumnResolver resolverToBe = null; Set<PTable> immutableIndex = Collections.emptySet(); DeletingParallelIteratorFactory parallelIteratorFactory = null; + QueryPlan dataPlanToBe = null; while (true) { try { - ColumnResolver resolver = FromCompiler.getResolverForMutation(delete, connection); - tableRefToBe = resolver.getTables().get(0); + resolverToBe = FromCompiler.getResolverForMutation(delete, connection); + tableRefToBe = resolverToBe.getTables().get(0); PTable table = tableRefToBe.getTable(); - if (table.getType() == PTableType.VIEW && table.getViewType().isReadOnly()) { - throw new ReadOnlyTableException(table.getSchemaName().getString(),table.getTableName().getString()); + // Cannot update: + // - read-only VIEW + // - transactional table with a connection having an SCN + // TODO: SchemaUtil.isReadOnly(PTable, connection)? + if ( table.getType() == PTableType.VIEW && table.getViewType().isReadOnly() ) { + throw new ReadOnlyTableException(schemaName,tableName); } immutableIndex = getNonDisabledImmutableIndexes(tableRefToBe); boolean mayHaveImmutableIndexes = !immutableIndex.isEmpty(); noQueryReqd = !hasLimit; + // Can't run on same server for transactional data, as we need the row keys for the data + // that is being upserted for conflict detection purposes. runOnServer = isAutoCommit && noQueryReqd; HintNode hint = delete.getHint(); if (runOnServer && !delete.getHint().hasHint(Hint.USE_INDEX_OVER_DATA_TABLE)) { @@ -332,17 +352,19 @@ public class DeleteCompiler { Collections.<ParseNode>emptyList(), null, delete.getOrderBy(), delete.getLimit(), delete.getBindCount(), false, false, Collections.<SelectStatement>emptyList(), delete.getUdfParseNodes()); - select = StatementNormalizer.normalize(select, resolver); - SelectStatement transformedSelect = SubqueryRewriter.transform(select, resolver, connection); + select = StatementNormalizer.normalize(select, resolverToBe); + SelectStatement transformedSelect = SubqueryRewriter.transform(select, resolverToBe, connection); if (transformedSelect != select) { - resolver = FromCompiler.getResolverForQuery(transformedSelect, connection); - select = StatementNormalizer.normalize(transformedSelect, resolver); + resolverToBe = FromCompiler.getResolverForQuery(transformedSelect, connection); + select = StatementNormalizer.normalize(transformedSelect, resolverToBe); } parallelIteratorFactory = hasLimit ? null : new DeletingParallelIteratorFactory(connection); QueryOptimizer optimizer = new QueryOptimizer(services); + QueryCompiler compiler = new QueryCompiler(statement, select, resolverToBe, Collections.<PColumn>emptyList(), parallelIteratorFactory, new SequenceManager(statement)); + dataPlanToBe = compiler.compile(); queryPlans = Lists.newArrayList(mayHaveImmutableIndexes - ? optimizer.getApplicablePlans(statement, select, resolver, Collections.<PColumn>emptyList(), parallelIteratorFactory) - : optimizer.getBestPlan(statement, select, resolver, Collections.<PColumn>emptyList(), parallelIteratorFactory)); + ? optimizer.getApplicablePlans(statement, select, resolverToBe, Collections.<PColumn>emptyList(), parallelIteratorFactory) + : optimizer.getBestPlan(statement, select, resolverToBe, Collections.<PColumn>emptyList(), parallelIteratorFactory)); if (mayHaveImmutableIndexes) { // FIXME: this is ugly // Lookup the table being deleted from in the cache, as it's possible that the // optimizer updated the cache if it found indexes that were out of date. @@ -367,6 +389,8 @@ public class DeleteCompiler { } break; } + final QueryPlan dataPlan = dataPlanToBe; + final ColumnResolver resolver = resolverToBe; final boolean hasImmutableIndexes = !immutableIndex.isEmpty(); // tableRefs is parallel with queryPlans TableRef[] tableRefs = new TableRef[hasImmutableIndexes ? immutableIndex.size() : 1]; @@ -401,7 +425,7 @@ public class DeleteCompiler { // Make sure the first plan is targeting deletion from the data table // In the case of an immutable index, we'll also delete from the index. - tableRefs[0] = tableRefToBe; + final TableRef dataTableRef = tableRefs[0] = tableRefToBe; /* * Create a mutationPlan for each queryPlan. One plan will be for the deletion of the rows * from the data table, while the others will be for deleting rows from immutable indexes. @@ -433,7 +457,7 @@ public class DeleteCompiler { } @Override - public MutationState execute() { + public MutationState execute() throws SQLException { // We have a point lookup, so we know we have a simple set of fully qualified // keys for our ranges ScanRanges ranges = context.getScanRanges(); @@ -451,14 +475,25 @@ public class DeleteCompiler { } @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override public StatementContext getContext() { return context; } + + @Override + public TableRef getTargetRef() { + return dataTableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + // Don't include the target + return Collections.emptySet(); + } + + @Override + public Operation getOperation() { + return operation; + } }); } else if (runOnServer) { // TODO: better abstraction @@ -472,12 +507,6 @@ public class DeleteCompiler { final RowProjector projector = ProjectionCompiler.compile(context, aggSelect, GroupBy.EMPTY_GROUP_BY); final QueryPlan aggPlan = new AggregatePlan(context, select, tableRef, projector, null, OrderBy.EMPTY_ORDER_BY, null, GroupBy.EMPTY_GROUP_BY, null); mutationPlans.add(new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - @Override public ParameterMetaData getParameterMetaData() { return context.getBindManager().getParameterMetaData(); @@ -489,10 +518,26 @@ public class DeleteCompiler { } @Override + public TableRef getTargetRef() { + return dataTableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + return dataPlan.getSourceRefs(); + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override public MutationState execute() throws SQLException { // TODO: share this block of code with UPSERT SELECT ImmutableBytesWritable ptr = context.getTempPtr(); - tableRef.getTable().getIndexMaintainers(ptr, context.getConnection()); + PTable table = tableRef.getTable(); + table.getIndexMaintainers(ptr, context.getConnection()); ServerCache cache = null; try { if (ptr.getLength() > 0) { @@ -539,12 +584,6 @@ public class DeleteCompiler { parallelIteratorFactory.setIndexTargetTableRef(deleteFromImmutableIndexToo ? plan.getTableRef() : null); } mutationPlans.add( new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - @Override public ParameterMetaData getParameterMetaData() { return context.getBindManager().getParameterMetaData(); @@ -556,6 +595,21 @@ public class DeleteCompiler { } @Override + public TableRef getTargetRef() { + return dataTableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + return dataPlan.getSourceRefs(); + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override public MutationState execute() throws SQLException { ResultIterator iterator = plan.iterator(); if (!hasLimit) { @@ -591,4 +645,4 @@ public class DeleteCompiler { } return mutationPlans.size() == 1 ? mutationPlans.get(0) : new MultiDeleteMutationPlan(mutationPlans); } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/DropSequenceCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/DropSequenceCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/DropSequenceCompiler.java index 698d5ea..2785dc8 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/DropSequenceCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/DropSequenceCompiler.java @@ -17,23 +17,24 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.Collections; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.jdbc.PhoenixConnection; -import org.apache.phoenix.jdbc.PhoenixParameterMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.DropSequenceStatement; import org.apache.phoenix.schema.MetaDataClient; public class DropSequenceCompiler { private final PhoenixStatement statement; + private final Operation operation; - public DropSequenceCompiler(PhoenixStatement statement) { + public DropSequenceCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } @@ -41,7 +42,7 @@ public class DropSequenceCompiler { final PhoenixConnection connection = statement.getConnection(); final MetaDataClient client = new MetaDataClient(connection); final StatementContext context = new StatementContext(statement); - return new MutationPlan() { + return new BaseMutationPlan(context, operation) { @Override public MutationState execute() throws SQLException { @@ -53,21 +54,6 @@ public class DropSequenceCompiler { return new ExplainPlan(Collections.singletonList("DROP SEQUENCE")); } - @Override - public StatementContext getContext() { - return context; - } - - @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override - public ParameterMetaData getParameterMetaData() { - return PhoenixParameterMetaData.EMPTY_PARAMETER_META_DATA; - } - }; } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java index f93ab03..dac691f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ListJarsQueryPlan.java @@ -23,6 +23,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; @@ -47,6 +48,7 @@ import org.apache.phoenix.iterate.ParallelScanGrouper; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixParameterMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.parse.LiteralParseNode; import org.apache.phoenix.parse.ParseNodeFactory; @@ -230,4 +232,14 @@ public class ListJarsQueryPlan implements QueryPlan { public boolean useRoundRobinIterator() { return false; } -} + + @Override + public Set<TableRef> getSourceRefs() { + return Collections.<TableRef>emptySet(); + } + + @Override + public Operation getOperation() { + return stmt.getUpdateOperation(); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java index 277b5a2..ddc2004 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/MutationPlan.java @@ -20,10 +20,10 @@ package org.apache.phoenix.compile; import java.sql.SQLException; import org.apache.phoenix.execute.MutationState; -import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.schema.TableRef; public interface MutationPlan extends StatementPlan { - public PhoenixConnection getConnection(); public MutationState execute() throws SQLException; -} + public TableRef getTargetRef(); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java index d75fe38..c6f6bf2 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java @@ -17,7 +17,6 @@ */ package org.apache.phoenix.compile; -import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.Collections; import java.util.List; @@ -32,8 +31,8 @@ import org.apache.phoenix.execute.AggregatePlan; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixConnection; -import org.apache.phoenix.jdbc.PhoenixParameterMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.PFunction; import org.apache.phoenix.parse.SelectStatement; import org.apache.phoenix.query.QueryConstants; @@ -41,12 +40,13 @@ import org.apache.phoenix.schema.AmbiguousColumnException; import org.apache.phoenix.schema.ColumnFamilyNotFoundException; import org.apache.phoenix.schema.ColumnNotFoundException; import org.apache.phoenix.schema.ColumnRef; +import org.apache.phoenix.schema.FunctionNotFoundException; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PColumnFamily; -import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.schema.TableRef; import org.apache.phoenix.schema.tuple.Tuple; +import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.util.ScanUtil; import com.google.common.collect.Lists; @@ -66,7 +66,7 @@ import com.google.common.collect.Lists; */ public class PostDDLCompiler { private final PhoenixConnection connection; - private final StatementContext context; // bogus context + private final Scan scan; public PostDDLCompiler(PhoenixConnection connection) { this(connection, new Scan()); @@ -74,29 +74,53 @@ public class PostDDLCompiler { public PostDDLCompiler(PhoenixConnection connection, Scan scan) { this.connection = connection; - this.context = new StatementContext(new PhoenixStatement(connection), scan); + this.scan = scan; scan.setAttribute(BaseScannerRegionObserver.UNGROUPED_AGG, QueryConstants.TRUE); } public MutationPlan compile(final List<TableRef> tableRefs, final byte[] emptyCF, final byte[] projectCF, final List<PColumn> deleteList, final long timestamp) throws SQLException { - - return new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - - @Override - public ParameterMetaData getParameterMetaData() { - return PhoenixParameterMetaData.EMPTY_PARAMETER_META_DATA; - } - - @Override - public ExplainPlan getExplainPlan() throws SQLException { - return ExplainPlan.EMPTY_PLAN; - } + PhoenixStatement statement = new PhoenixStatement(connection); + final StatementContext context = new StatementContext( + statement, + new ColumnResolver() { + + @Override + public List<TableRef> getTables() { + return tableRefs; + } + + @Override + public TableRef resolveTable(String schemaName, String tableName) throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public ColumnRef resolveColumn(String schemaName, String tableName, String colName) + throws SQLException { + throw new UnsupportedOperationException(); + } + + @Override + public List<PFunction> getFunctions() { + return Collections.<PFunction>emptyList(); + } + + @Override + public PFunction resolveFunction(String functionName) + throws SQLException { + throw new FunctionNotFoundException(functionName); + } + + @Override + public boolean hasUDFs() { + return false; + } + + }, + scan, + new SequenceManager(statement)); + return new BaseMutationPlan(context, Operation.UPSERT /* FIXME */) { @Override public MutationState execute() throws SQLException { @@ -267,11 +291,6 @@ public class PostDDLCompiler { if (!wasAutoCommit) connection.setAutoCommit(wasAutoCommit); } } - - @Override - public StatementContext getContext() { - return context; - } }; } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java index ab6f68a..cfdb8e9 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/StatementPlan.java @@ -19,6 +19,10 @@ package org.apache.phoenix.compile; import java.sql.ParameterMetaData; import java.sql.SQLException; +import java.util.Set; + +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; +import org.apache.phoenix.schema.TableRef; public interface StatementPlan { @@ -29,4 +33,6 @@ public interface StatementPlan { ParameterMetaData getParameterMetaData(); ExplainPlan getExplainPlan() throws SQLException; -} + public Set<TableRef> getSourceRefs(); + Operation getOperation(); +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java index 50ec919..a9754b3 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/TraceQueryPlan.java @@ -22,6 +22,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; @@ -42,8 +43,8 @@ import org.apache.phoenix.iterate.DefaultParallelScanGrouper; import org.apache.phoenix.iterate.ParallelScanGrouper; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixConnection; -import org.apache.phoenix.jdbc.PhoenixParameterMetaData; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.metrics.MetricInfo; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.parse.LiteralParseNode; @@ -87,12 +88,17 @@ public class TraceQueryPlan implements QueryPlan { TRACE_PROJECTOR = new RowProjector(projectedColumns, estimatedByteSize, false); } - public TraceQueryPlan(TraceStatement traceStatement, PhoenixStatement stmt) { + public TraceQueryPlan(TraceStatement traceStatement, PhoenixStatement stmt ) { this.traceStatement = traceStatement; this.stmt = stmt; this.context = new StatementContext(stmt); } + @Override + public Operation getOperation() { + return traceStatement.getOperation(); + } + @Override public StatementContext getContext() { return this.context; @@ -100,12 +106,7 @@ public class TraceQueryPlan implements QueryPlan { @Override public ParameterMetaData getParameterMetaData() { - return PhoenixParameterMetaData.EMPTY_PARAMETER_META_DATA; - } - - @Override - public ExplainPlan getExplainPlan() throws SQLException { - return ExplainPlan.EMPTY_PLAN; + return context.getBindManager().getParameterMetaData(); } @Override @@ -185,6 +186,11 @@ public class TraceQueryPlan implements QueryPlan { } @Override + public Set<TableRef> getSourceRefs() { + return Collections.emptySet(); + } + + @Override public TableRef getTableRef() { return null; } @@ -233,6 +239,11 @@ public class TraceQueryPlan implements QueryPlan { public boolean isRowKeyOrdered() { return false; } + + @Override + public ExplainPlan getExplainPlan() throws SQLException { + return ExplainPlan.EMPTY_PLAN; + } @Override public boolean useRoundRobinIterator() { http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java index 56087c0..953eb2f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/UpsertCompiler.java @@ -20,11 +20,9 @@ package org.apache.phoenix.compile; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.Lists.newArrayListWithCapacity; -import java.sql.Date; import java.sql.ParameterMetaData; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Time; import java.sql.Timestamp; import java.util.Arrays; import java.util.BitSet; @@ -58,6 +56,7 @@ import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.jdbc.PhoenixResultSet; import org.apache.phoenix.jdbc.PhoenixStatement; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.optimize.QueryOptimizer; import org.apache.phoenix.parse.AliasedNode; import org.apache.phoenix.parse.BindParseNode; @@ -90,17 +89,10 @@ import org.apache.phoenix.schema.SortOrder; import org.apache.phoenix.schema.TableRef; import org.apache.phoenix.schema.TypeMismatchException; import org.apache.phoenix.schema.tuple.Tuple; -import org.apache.phoenix.schema.types.PBoolean; import org.apache.phoenix.schema.types.PDataType; -import org.apache.phoenix.schema.types.PDate; -import org.apache.phoenix.schema.types.PInteger; import org.apache.phoenix.schema.types.PLong; -import org.apache.phoenix.schema.types.PTime; import org.apache.phoenix.schema.types.PTimestamp; -import org.apache.phoenix.schema.types.PUnsignedDate; import org.apache.phoenix.schema.types.PUnsignedLong; -import org.apache.phoenix.schema.types.PUnsignedTime; -import org.apache.phoenix.schema.types.PUnsignedTimestamp; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.IndexUtil; import org.apache.phoenix.util.MetaDataUtil; @@ -242,9 +234,11 @@ public class UpsertCompiler { } private final PhoenixStatement statement; + private final Operation operation; - public UpsertCompiler(PhoenixStatement statement) { + public UpsertCompiler(PhoenixStatement statement, Operation operation) { this.statement = statement; + this.operation = operation; } private static LiteralParseNode getNodeForRowTimestampColumn(PColumn col) { @@ -295,10 +289,11 @@ public class UpsertCompiler { resolver = FromCompiler.getResolverForMutation(upsert, connection); tableRefToBe = resolver.getTables().get(0); table = tableRefToBe.getTable(); - if (table.getType() == PTableType.VIEW) { - if (table.getViewType().isReadOnly()) { - throw new ReadOnlyTableException(schemaName,tableName); - } + // Cannot update: + // - read-only VIEW + // - transactional table with a connection having an SCN + if ( table.getType() == PTableType.VIEW && table.getViewType().isReadOnly() ) { + throw new ReadOnlyTableException(schemaName,tableName); } boolean isSalted = table.getBucketNum() != null; isTenantSpecific = table.isMultiTenant() && connection.getTenantId() != null; @@ -456,7 +451,7 @@ public class UpsertCompiler { * puts for index tables. * 5) no limit clause, as the limit clause requires client-side post processing * 6) no sequences, as sequences imply that the order of upsert must match the order of - * selection. + * selection. TODO: change this and only force client side if there's a ORDER BY on the sequence value * Otherwise, run the query to pull the data from the server * and populate the MutationState (upto a limit). */ @@ -536,6 +531,7 @@ public class UpsertCompiler { break; } + final QueryPlan originalQueryPlan = queryPlanToBe; RowProjector projectorToBe = null; // Optimize only after all checks have been performed if (valueNodes == null) { @@ -652,12 +648,6 @@ public class UpsertCompiler { // Ignore order by - it has no impact final QueryPlan aggPlan = new AggregatePlan(context, select, tableRef, aggProjector, null, OrderBy.EMPTY_ORDER_BY, null, GroupBy.EMPTY_GROUP_BY, null); return new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - @Override public ParameterMetaData getParameterMetaData() { return queryPlan.getContext().getBindManager().getParameterMetaData(); @@ -669,9 +659,26 @@ public class UpsertCompiler { } @Override + public TableRef getTargetRef() { + return tableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + return originalQueryPlan.getSourceRefs(); + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override public MutationState execute() throws SQLException { ImmutableBytesWritable ptr = context.getTempPtr(); - tableRef.getTable().getIndexMaintainers(ptr, context.getConnection()); + PTable table = tableRef.getTable(); + table.getIndexMaintainers(ptr, context.getConnection()); + ServerCache cache = null; try { if (ptr.getLength() > 0) { @@ -715,12 +722,6 @@ public class UpsertCompiler { // UPSERT SELECT run client-side ///////////////////////////////////////////////////////////////////// return new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - @Override public ParameterMetaData getParameterMetaData() { return queryPlan.getContext().getBindManager().getParameterMetaData(); @@ -732,6 +733,21 @@ public class UpsertCompiler { } @Override + public TableRef getTargetRef() { + return tableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + return originalQueryPlan.getSourceRefs(); + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override public MutationState execute() throws SQLException { ResultIterator iterator = queryPlan.iterator(); if (parallelIteratorFactory == null) { @@ -813,12 +829,6 @@ public class UpsertCompiler { nodeIndex++; } return new MutationPlan() { - - @Override - public PhoenixConnection getConnection() { - return connection; - } - @Override public ParameterMetaData getParameterMetaData() { return context.getBindManager().getParameterMetaData(); @@ -830,6 +840,21 @@ public class UpsertCompiler { } @Override + public TableRef getTargetRef() { + return tableRef; + } + + @Override + public Set<TableRef> getSourceRefs() { + return Collections.emptySet(); + } + + @Override + public Operation getOperation() { + return operation; + } + + @Override public MutationState execute() throws SQLException { ImmutableBytesWritable ptr = context.getTempPtr(); final SequenceManager sequenceManager = context.getSequenceManager(); @@ -1017,4 +1042,4 @@ public class UpsertCompiler { } } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java index 1768621..e292dd8 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java @@ -53,6 +53,7 @@ import org.apache.phoenix.iterate.ParallelIteratorFactory; import org.apache.phoenix.iterate.ParallelScanGrouper; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixConnection; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.parse.HintNode.Hint; import org.apache.phoenix.parse.ParseNodeFactory; @@ -73,6 +74,7 @@ import org.apache.phoenix.util.SQLCloseable; import org.apache.phoenix.util.SQLCloseables; import org.apache.phoenix.util.ScanUtil; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; @@ -89,6 +91,7 @@ public abstract class BaseQueryPlan implements QueryPlan { protected static final long DEFAULT_ESTIMATED_SIZE = 10 * 1024; // 10 K protected final TableRef tableRef; + protected final Set<TableRef> tableRefs; protected final StatementContext context; protected final FilterableStatement statement; protected final RowProjector projection; @@ -112,6 +115,7 @@ public abstract class BaseQueryPlan implements QueryPlan { this.context = context; this.statement = statement; this.tableRef = table; + this.tableRefs = ImmutableSet.of(table); this.projection = projection; this.paramMetaData = paramMetaData; this.limit = limit; @@ -121,6 +125,12 @@ public abstract class BaseQueryPlan implements QueryPlan { this.dynamicFilter = dynamicFilter; } + + @Override + public Operation getOperation() { + return Operation.QUERY; + } + @Override public boolean isDegenerate() { return context.getScanRanges() == ScanRanges.NOTHING; @@ -144,6 +154,11 @@ public abstract class BaseQueryPlan implements QueryPlan { } @Override + public Set<TableRef> getSourceRefs() { + return tableRefs; + } + + @Override public Integer getLimit() { return limit; } @@ -208,7 +223,7 @@ public abstract class BaseQueryPlan implements QueryPlan { if (table.getType() != PTableType.SYSTEM) { scan.setConsistency(connection.getConsistency()); } - // Get the time range of row_timestamp column + // Get the time range of row_timestamp column TimeRange rowTimestampRange = context.getScanRanges().getRowTimestampRange(); // Get the already existing time range on the scan. TimeRange scanTimeRange = scan.getTimeRange(); @@ -225,13 +240,17 @@ public abstract class BaseQueryPlan implements QueryPlan { } catch (IOException e) { throw new RuntimeException(e); } - byte[] tenantIdBytes = connection.getTenantId() == null ? - null - : ScanUtil.getTenantIdBytes( - table.getRowKeySchema(), - table.getBucketNum()!=null, - connection.getTenantId(), - table.isMultiTenant()); + byte[] tenantIdBytes; + if( table.isMultiTenant() == true ) { + tenantIdBytes = connection.getTenantId() == null ? null : + ScanUtil.getTenantIdBytes( + table.getRowKeySchema(), + table.getBucketNum()!=null, + connection.getTenantId()); + } else { + tenantIdBytes = connection.getTenantId() == null ? null : connection.getTenantId().getBytes(); + } + ScanUtil.setTenantId(scan, tenantIdBytes); String customAnnotations = LogUtil.customAnnotationsToString(connection); ScanUtil.setCustomAnnotations(scan, customAnnotations == null ? null : customAnnotations.getBytes()); @@ -250,13 +269,15 @@ public abstract class BaseQueryPlan implements QueryPlan { KeyValueSchema schema = ProjectedColumnExpression.buildSchema(dataColumns); // Set key value schema of the data columns. serializeSchemaIntoScan(scan, schema); - String parentSchema = table.getParentSchemaName().getString(); - String parentTable = table.getParentTableName().getString(); + PTable parentTable = context.getCurrentTable().getTable(); + String parentSchemaName = parentTable.getParentSchemaName().getString(); + String parentTableName = parentTable.getParentTableName().getString(); final ParseNodeFactory FACTORY = new ParseNodeFactory(); + // TODO: is it necessary to re-resolve the table? TableRef dataTableRef = FromCompiler.getResolver( - FACTORY.namedTable(null, TableName.create(parentSchema, parentTable)), - context.getConnection()).resolveTable(parentSchema, parentTable); + FACTORY.namedTable(null, TableName.create(parentSchemaName, parentTableName)), + context.getConnection()).resolveTable(parentSchemaName, parentTableName); PTable dataTable = dataTableRef.getTable(); // Set index maintainer of the local index. serializeIndexMaintainerIntoScan(scan, dataTable); @@ -293,7 +314,7 @@ public abstract class BaseQueryPlan implements QueryPlan { return (scope.getSpan() != null) ? new TracingIterator(scope, iterator) : iterator; } - private void serializeIndexMaintainerIntoScan(Scan scan, PTable dataTable) { + private void serializeIndexMaintainerIntoScan(Scan scan, PTable dataTable) throws SQLException { PName name = context.getCurrentTable().getTable().getName(); List<PTable> indexes = Lists.newArrayListWithExpectedSize(1); for (PTable index : dataTable.getIndexes()) { @@ -420,7 +441,7 @@ public abstract class BaseQueryPlan implements QueryPlan { @Override public ExplainPlan getExplainPlan() throws SQLException { if (context.getScanRanges() == ScanRanges.NOTHING) { - return new ExplainPlan(Collections.singletonList("DEGENERATE SCAN OVER " + tableRef.getTable().getName().getString())); + return new ExplainPlan(Collections.singletonList("DEGENERATE SCAN OVER " + getTableRef().getTable().getName().getString())); } // Optimize here when getting explain plan, as queries don't get optimized until after compilation @@ -439,4 +460,4 @@ public abstract class BaseQueryPlan implements QueryPlan { return groupBy.isEmpty() ? orderBy.getOrderByExpressions().isEmpty() : groupBy.isOrderPreserving(); } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java index 7026433..56e0ccd 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/DelegateQueryPlan.java @@ -20,6 +20,7 @@ package org.apache.phoenix.execute; import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.List; +import java.util.Set; import org.apache.hadoop.hbase.client.Scan; import org.apache.phoenix.compile.GroupByCompiler.GroupBy; @@ -27,6 +28,7 @@ import org.apache.phoenix.compile.OrderByCompiler.OrderBy; import org.apache.phoenix.compile.QueryPlan; import org.apache.phoenix.compile.RowProjector; import org.apache.phoenix.compile.StatementContext; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.schema.TableRef; @@ -59,6 +61,11 @@ public abstract class DelegateQueryPlan implements QueryPlan { } @Override + public Set<TableRef> getSourceRefs() { + return delegate.getSourceRefs(); + } + + @Override public RowProjector getProjector() { return delegate.getProjector(); } @@ -108,4 +115,9 @@ public abstract class DelegateQueryPlan implements QueryPlan { return delegate.useRoundRobinIterator(); } -} + @Override + public Operation getOperation() { + return delegate.getOperation(); + } + +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/phoenix-core/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java index 297b6cc..41cae79 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/SortMergeJoinPlan.java @@ -27,6 +27,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Queue; +import java.util.Set; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValueUtil; @@ -49,6 +50,7 @@ import org.apache.phoenix.iterate.MappedByteBufferQueue; import org.apache.phoenix.iterate.ParallelScanGrouper; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.jdbc.PhoenixParameterMetaData; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.parse.JoinTableNode.JoinType; import org.apache.phoenix.query.KeyRange; @@ -66,6 +68,7 @@ import org.apache.phoenix.util.ResultUtil; import org.apache.phoenix.util.SchemaUtil; import com.google.common.collect.Lists; +import com.google.common.collect.Sets; public class SortMergeJoinPlan implements QueryPlan { private static final byte[] EMPTY_PTR = new byte[0]; @@ -83,6 +86,7 @@ public class SortMergeJoinPlan implements QueryPlan { private final KeyValueSchema rhsSchema; private final int rhsFieldPosition; private final boolean isSingleValueOnly; + private final Set<TableRef> tableRefs; private final int thresholdBytes; public SortMergeJoinPlan(StatementContext context, FilterableStatement statement, TableRef table, @@ -102,10 +106,18 @@ public class SortMergeJoinPlan implements QueryPlan { this.rhsSchema = buildSchema(rhsTable); this.rhsFieldPosition = rhsFieldPosition; this.isSingleValueOnly = isSingleValueOnly; + this.tableRefs = Sets.newHashSetWithExpectedSize(lhsPlan.getSourceRefs().size() + rhsPlan.getSourceRefs().size()); + this.tableRefs.addAll(lhsPlan.getSourceRefs()); + this.tableRefs.addAll(rhsPlan.getSourceRefs()); this.thresholdBytes = context.getConnection().getQueryServices().getProps().getInt( QueryServices.SPOOL_THRESHOLD_BYTES_ATTRIB, QueryServicesOptions.DEFAULT_SPOOL_THRESHOLD_BYTES); } + @Override + public Operation getOperation() { + return statement.getOperation(); + } + private static KeyValueSchema buildSchema(PTable table) { KeyValueSchemaBuilder builder = new KeyValueSchemaBuilder(0); if (table != null) { @@ -645,5 +657,9 @@ public class SortMergeJoinPlan implements QueryPlan { return false; } -} + @Override + public Set<TableRef> getSourceRefs() { + return tableRefs; + } +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/461aaa23/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 53745fe..3208913 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 @@ -22,6 +22,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Set; import org.apache.hadoop.hbase.client.Scan; import org.apache.phoenix.compile.ExplainPlan; @@ -37,11 +38,14 @@ import org.apache.phoenix.iterate.MergeSortTopNResultIterator; import org.apache.phoenix.iterate.ParallelScanGrouper; import org.apache.phoenix.iterate.ResultIterator; import org.apache.phoenix.iterate.UnionResultIterators; +import org.apache.phoenix.jdbc.PhoenixStatement.Operation; import org.apache.phoenix.parse.FilterableStatement; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.schema.TableRef; import org.apache.phoenix.util.SQLCloseable; +import com.google.common.collect.Sets; + public class UnionPlan implements QueryPlan { private static final long DEFAULT_ESTIMATED_SIZE = 10 * 1024; // 10 K @@ -197,5 +201,19 @@ public class UnionPlan implements QueryPlan { public boolean useRoundRobinIterator() throws SQLException { return false; } -} + @Override + public Operation getOperation() { + return statement.getOperation(); + } + + @Override + public Set<TableRef> getSourceRefs() { + // TODO is this correct? + Set<TableRef> sources = Sets.newHashSetWithExpectedSize(plans.size()); + for (QueryPlan plan : plans) { + sources.addAll(plan.getSourceRefs()); + } + return sources; + } +}
