PHOENIX-4996: Refactor PTableImpl to use Builder Pattern
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d6083ae5 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d6083ae5 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d6083ae5 Branch: refs/heads/4.x-HBase-1.3 Commit: d6083ae5c598f5293adbfb24370b8e40962bc3d7 Parents: 9bfaf18 Author: Chinmay Kulkarni <chinmayskulka...@gmail.com> Authored: Fri Nov 2 14:00:09 2018 -0700 Committer: Thomas D'Silva <tdsi...@apache.org> Committed: Tue Nov 6 15:19:09 2018 -0800 ---------------------------------------------------------------------- .../apache/phoenix/compile/DeleteCompiler.java | 5 +- .../apache/phoenix/compile/FromCompiler.java | 66 +- .../apache/phoenix/compile/JoinCompiler.java | 53 +- .../compile/TupleProjectionCompiler.java | 60 +- .../apache/phoenix/compile/UnionCompiler.java | 41 +- .../apache/phoenix/compile/UpsertCompiler.java | 12 +- .../coprocessor/MetaDataEndpointImpl.java | 96 +- .../UngroupedAggregateRegionObserver.java | 6 +- .../coprocessor/WhereConstantParser.java | 3 +- .../query/ConnectionlessQueryServicesImpl.java | 9 +- .../apache/phoenix/schema/MetaDataClient.java | 215 ++- .../apache/phoenix/schema/PMetaDataImpl.java | 28 +- .../org/apache/phoenix/schema/PTableImpl.java | 1259 +++++++++++------- .../org/apache/phoenix/schema/TableRef.java | 17 +- .../phoenix/execute/CorrelatePlanTest.java | 32 +- .../execute/LiteralResultIteratorPlanTest.java | 33 +- 16 files changed, 1303 insertions(+), 632 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/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 583085e..8c9a930 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 @@ -89,7 +89,6 @@ import org.apache.phoenix.schema.types.PLong; import org.apache.phoenix.transaction.PhoenixTransactionProvider.Feature; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.IndexUtil; -import org.apache.phoenix.util.MetaDataUtil; import org.apache.phoenix.util.ScanUtil; import com.google.common.base.Preconditions; @@ -615,7 +614,9 @@ public class DeleteCompiler { } }); } - PTable projectedTable = PTableImpl.makePTable(table, PTableType.PROJECTED, adjustedProjectedColumns); + PTable projectedTable = PTableImpl.builderWithColumns(table, adjustedProjectedColumns) + .setType(PTableType.PROJECTED) + .build(); final TableRef projectedTableRef = new TableRef(projectedTable, targetTableRef.getLowerBoundTimeStamp(), targetTableRef.getTimeStamp()); QueryPlan bestPlanToBe = dataPlan; http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java index efc66a9..2701af0 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/FromCompiler.java @@ -32,8 +32,6 @@ import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.coprocessor.MetaDataProtocol; import org.apache.phoenix.coprocessor.MetaDataProtocol.MetaDataMutationResult; import org.apache.phoenix.coprocessor.MetaDataProtocol.MutationCode; -import org.apache.phoenix.exception.SQLExceptionCode; -import org.apache.phoenix.exception.SQLExceptionInfo; import org.apache.phoenix.expression.Expression; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.parse.AliasedNode; @@ -82,6 +80,7 @@ import org.apache.phoenix.schema.PTableImpl; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.ProjectedColumn; +import org.apache.phoenix.schema.RowKeySchema; import org.apache.phoenix.schema.SchemaNotFoundException; import org.apache.phoenix.schema.SortOrder; import org.apache.phoenix.schema.TableNotFoundException; @@ -284,7 +283,8 @@ public class FromCompiler { column.getTimestamp()); projectedColumns.add(projectedColumn); } - PTable t = PTableImpl.makePTable(table, projectedColumns); + PTable t = PTableImpl.builderWithColumns(table, projectedColumns) + .build(); return new SingleTableColumnResolver(connection, new TableRef(tableRef.getTableAlias(), t, tableRef.getLowerBoundTimeStamp(), tableRef.hasDynamicCols())); } @@ -369,10 +369,30 @@ public class FromCompiler { if (connection.getSchema() != null) { schema = schema != null ? schema : connection.getSchema(); } + // Storage scheme and encoding scheme don't matter here since the PTable is being used only for the purposes of create table. // The actual values of these two will be determined by the metadata client. - PTable theTable = new PTableImpl(connection.getTenantId(), schema, table.getName().getTableName(), - scn == null ? HConstants.LATEST_TIMESTAMP : scn, families, isNamespaceMapped); + PName tenantId = connection.getTenantId(); + PTableImpl.checkTenantId(tenantId); + String tableName = table.getName().getTableName(); + PName name = PNameFactory.newName(SchemaUtil.getTableName(schema, tableName)); + PTable theTable = new PTableImpl.Builder() + .setTenantId(tenantId) + .setName(name) + .setKey(new PTableKey(tenantId, name.getString())) + .setSchemaName(PNameFactory.newName(schema)) + .setTableName(PNameFactory.newName(tableName)) + .setType(PTableType.VIEW) + .setViewType(PTable.ViewType.MAPPED) + .setTimeStamp(scn == null ? HConstants.LATEST_TIMESTAMP : scn) + .setPkColumns(Collections.<PColumn>emptyList()) + .setAllColumns(Collections.<PColumn>emptyList()) + .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA) + .setIndexes(Collections.<PTable>emptyList()) + .setFamilyAttributes(families) + .setPhysicalNames(Collections.<PName>emptyList()) + .setNamespaceMapped(isNamespaceMapped) + .build(); theTable = this.addDynamicColumns(table.getDynamicColumns(), theTable); alias = null; tableRefs = ImmutableList.of(new TableRef(alias, theTable, timeStamp, !table.getDynamicColumns().isEmpty())); @@ -706,7 +726,7 @@ public class FromCompiler { if (!dynColumns.isEmpty()) { List<PColumn> allcolumns = new ArrayList<PColumn>(); List<PColumn> existingColumns = theTable.getColumns(); - // Need to skip the salting column, as it's added in the makePTable call below + // Need to skip the salting column, as it's handled in the PTable builder call below allcolumns.addAll(theTable.getBucketNum() == null ? existingColumns : existingColumns.subList(1, existingColumns.size())); // Position still based on with the salting columns int position = existingColumns.size(); @@ -724,7 +744,8 @@ public class FromCompiler { HConstants.LATEST_TIMESTAMP)); position++; } - theTable = PTableImpl.makePTable(theTable, allcolumns); + theTable = PTableImpl.builderWithColumns(theTable, allcolumns) + .build(); } return theTable; } @@ -830,11 +851,32 @@ public class FromCompiler { HConstants.LATEST_TIMESTAMP); columns.add(column); } - PTable t = PTableImpl.makePTable(null, PName.EMPTY_NAME, PName.EMPTY_NAME, PTableType.SUBQUERY, null, - MetaDataProtocol.MIN_TABLE_TIMESTAMP, PTable.INITIAL_SEQ_NUM, null, null, columns, null, null, - Collections.<PTable> emptyList(), false, Collections.<PName> emptyList(), null, null, false, false, - false, null, null, null, null, false, null, 0, 0L, SchemaUtil - .isNamespaceMappingEnabled(PTableType.SUBQUERY, connection.getQueryServices().getProps()), null, false, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, QualifierEncodingScheme.NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER, true); + PTable t = new PTableImpl.Builder() + .setType(PTableType.SUBQUERY) + .setTimeStamp(MetaDataProtocol.MIN_TABLE_TIMESTAMP) + .setIndexDisableTimestamp(0L) + .setSequenceNumber(PTable.INITIAL_SEQ_NUM) + .setImmutableRows(false) + .setDisableWAL(false) + .setMultiTenant(false) + .setStoreNulls(false) + .setUpdateCacheFrequency(0) + .setNamespaceMapped(SchemaUtil.isNamespaceMappingEnabled(PTableType.SUBQUERY, + connection.getQueryServices().getProps())) + .setAppendOnlySchema(false) + .setImmutableStorageScheme(ImmutableStorageScheme.ONE_CELL_PER_COLUMN) + .setQualifierEncodingScheme(QualifierEncodingScheme.NON_ENCODED_QUALIFIERS) + .setBaseColumnCount(QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(PTable.EncodedCQCounter.NULL_COUNTER) + .setUseStatsForParallelization(true) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setSchemaName(PName.EMPTY_NAME) + .setTableName(PName.EMPTY_NAME) + .setRowKeyOrderOptimizable(false) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(columns) + .build(); String alias = subselectNode.getAlias(); TableRef tableRef = new TableRef(alias, t, MetaDataProtocol.MIN_TABLE_TIMESTAMP, false); http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java index 880fa72..807e54b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/JoinCompiler.java @@ -17,6 +17,7 @@ */ package org.apache.phoenix.compile; +import static org.apache.phoenix.query.QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT; import static org.apache.phoenix.schema.PTable.ImmutableStorageScheme.ONE_CELL_PER_COLUMN; import static org.apache.phoenix.schema.PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS; @@ -32,6 +33,7 @@ import java.util.ListIterator; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableList; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Pair; import org.apache.phoenix.exception.SQLExceptionCode; @@ -71,8 +73,8 @@ import org.apache.phoenix.schema.ColumnRef; import org.apache.phoenix.schema.LocalIndexDataColumnRef; import org.apache.phoenix.schema.MetaDataEntityNotFoundException; import org.apache.phoenix.schema.PColumn; -import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PNameFactory; +import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTable.IndexType; import org.apache.phoenix.schema.PTableImpl; @@ -1270,17 +1272,44 @@ public class JoinCompiler { if (left.getBucketNum() != null) { merged.remove(0); } - return PTableImpl.makePTable(left.getTenantId(), left.getSchemaName(), - PNameFactory.newName(SchemaUtil.getTableName(left.getName().getString(), right.getName().getString())), - left.getType(), left.getIndexState(), left.getTimeStamp(), left.getSequenceNumber(), left.getPKName(), - left.getBucketNum(), merged, left.getParentSchemaName(), left.getParentTableName(), left.getIndexes(), - left.isImmutableRows(), Collections.<PName> emptyList(), null, null, PTable.DEFAULT_DISABLE_WAL, - left.isMultiTenant(), left.getStoreNulls(), left.getViewType(), left.getViewIndexType(), left.getViewIndexId(), - left.getIndexType(), left.rowKeyOrderOptimizable(), left.getTransactionProvider(), - left.getUpdateCacheFrequency(), left.getIndexDisableTimestamp(), left.isNamespaceMapped(), - left.getAutoPartitionSeqName(), left.isAppendOnlySchema(), ONE_CELL_PER_COLUMN, NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER, left.useStatsForParallelization()); + return new PTableImpl.Builder() + .setType(left.getType()) + .setState(left.getIndexState()) + .setTimeStamp(left.getTimeStamp()) + .setIndexDisableTimestamp(left.getIndexDisableTimestamp()) + .setSequenceNumber(left.getSequenceNumber()) + .setImmutableRows(left.isImmutableRows()) + .setDisableWAL(PTable.DEFAULT_DISABLE_WAL) + .setMultiTenant(left.isMultiTenant()) + .setStoreNulls(left.getStoreNulls()) + .setViewType(left.getViewType()) + .setViewIndexType(left.getViewIndexType()) + .setViewIndexId(left.getViewIndexId()) + .setIndexType(left.getIndexType()) + .setTransactionProvider(left.getTransactionProvider()) + .setUpdateCacheFrequency(left.getUpdateCacheFrequency()) + .setNamespaceMapped(left.isNamespaceMapped()) + .setAutoPartitionSeqName(left.getAutoPartitionSeqName()) + .setAppendOnlySchema(left.isAppendOnlySchema()) + .setImmutableStorageScheme(ONE_CELL_PER_COLUMN) + .setQualifierEncodingScheme(NON_ENCODED_QUALIFIERS) + .setBaseColumnCount(BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(PTable.EncodedCQCounter.NULL_COUNTER) + .setUseStatsForParallelization(left.useStatsForParallelization()) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(left.getTenantId()) + .setSchemaName(left.getSchemaName()) + .setTableName(PNameFactory.newName(SchemaUtil.getTableName(left.getName().getString(), + right.getName().getString()))) + .setPkName(left.getPKName()) + .setRowKeyOrderOptimizable(left.rowKeyOrderOptimizable()) + .setBucketNum(left.getBucketNum()) + .setIndexes(left.getIndexes() == null ? Collections.<PTable>emptyList() : left.getIndexes()) + .setParentSchemaName(left.getParentSchemaName()) + .setParentTableName(left.getParentTableName()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(merged) + .build(); } } - - http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/compile/TupleProjectionCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/TupleProjectionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/TupleProjectionCompiler.java index dc85bd3..5b92a5d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/TupleProjectionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/TupleProjectionCompiler.java @@ -17,6 +17,8 @@ */ package org.apache.phoenix.compile; import static org.apache.phoenix.query.QueryConstants.VALUE_COLUMN_FAMILY; +import static org.apache.phoenix.query.QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT; +import static org.apache.phoenix.schema.PTable.ImmutableStorageScheme; import java.sql.SQLException; import java.util.ArrayList; @@ -26,6 +28,7 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Set; +import com.google.common.collect.ImmutableList; import org.apache.phoenix.parse.AliasedNode; import org.apache.phoenix.parse.ColumnParseNode; import org.apache.phoenix.parse.FamilyWildcardParseNode; @@ -160,15 +163,13 @@ public class TupleProjectionCompiler { sourceColumnRef.getColumn().isNullable(), sourceColumnRef, sourceColumnRef.getColumn().getColumnQualifierBytes()); projectedColumns.add(column); } - - return PTableImpl.makePTable(table.getTenantId(), table.getSchemaName(), table.getTableName(), - PTableType.PROJECTED, table.getIndexState(), table.getTimeStamp(), table.getSequenceNumber(), - table.getPKName(), table.getBucketNum(), projectedColumns, table.getParentSchemaName(), - table.getParentTableName(), table.getIndexes(), table.isImmutableRows(), Collections.<PName> emptyList(), - table.getDefaultFamilyName(), table.getViewStatement(), table.isWALDisabled(), table.isMultiTenant(), table.getStoreNulls(), table.getViewType(), - table.getViewIndexType(), table.getViewIndexId(), - table.getIndexType(), table.rowKeyOrderOptimizable(), table.getTransactionProvider(), table.getUpdateCacheFrequency(), - table.getIndexDisableTimestamp(), table.isNamespaceMapped(), table.getAutoPartitionSeqName(), table.isAppendOnlySchema(), table.getImmutableStorageScheme(), table.getEncodingScheme(), table.getEncodedCQCounter(), table.useStatsForParallelization()); + return PTableImpl.builderWithColumns(table, projectedColumns) + .setType(PTableType.PROJECTED) + .setBaseColumnCount(BASE_TABLE_BASE_COLUMN_COUNT) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(projectedColumns) + .build(); } public static PTable createProjectedTable(TableRef tableRef, List<ColumnRef> sourceColumnRefs, boolean retainPKColumns) throws SQLException { @@ -192,14 +193,39 @@ public class TupleProjectionCompiler { if (EncodedColumnsUtil.usesEncodedColumnNames(table)) { cqCounter = EncodedCQCounter.copy(table.getEncodedCQCounter()); } - - return PTableImpl.makePTable(table.getTenantId(), PROJECTED_TABLE_SCHEMA, table.getName(), PTableType.PROJECTED, - null, table.getTimeStamp(), table.getSequenceNumber(), table.getPKName(), - table.getBucketNum(), projectedColumns, null, null, - Collections.<PTable> emptyList(), table.isImmutableRows(), Collections.<PName> emptyList(), null, null, - table.isWALDisabled(), table.isMultiTenant(), table.getStoreNulls(), table.getViewType(), - table.getViewIndexType(), table.getViewIndexId(), null, table.rowKeyOrderOptimizable(), table.getTransactionProvider(), - table.getUpdateCacheFrequency(), table.getIndexDisableTimestamp(), table.isNamespaceMapped(), table.getAutoPartitionSeqName(), table.isAppendOnlySchema(), table.getImmutableStorageScheme(), table.getEncodingScheme(), cqCounter, table.useStatsForParallelization()); + return new PTableImpl.Builder() + .setType(PTableType.PROJECTED) + .setTimeStamp(table.getTimeStamp()) + .setIndexDisableTimestamp(table.getIndexDisableTimestamp()) + .setSequenceNumber(table.getSequenceNumber()) + .setImmutableRows(table.isImmutableRows()) + .setDisableWAL(table.isWALDisabled()) + .setMultiTenant(table.isMultiTenant()) + .setStoreNulls(table.getStoreNulls()) + .setViewType(table.getViewType()) + .setViewIndexType(table.getViewIndexType()) + .setViewIndexId(table.getViewIndexId()) + .setTransactionProvider(table.getTransactionProvider()) + .setUpdateCacheFrequency(table.getUpdateCacheFrequency()) + .setNamespaceMapped(table.isNamespaceMapped()) + .setAutoPartitionSeqName(table.getAutoPartitionSeqName()) + .setAppendOnlySchema(table.isAppendOnlySchema()) + .setImmutableStorageScheme(table.getImmutableStorageScheme()) + .setQualifierEncodingScheme(table.getEncodingScheme()) + .setBaseColumnCount(BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(cqCounter) + .setUseStatsForParallelization(table.useStatsForParallelization()) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(table.getTenantId()) + .setSchemaName(PROJECTED_TABLE_SCHEMA) + .setTableName(table.getTableName()) + .setPkName(table.getPKName()) + .setRowKeyOrderOptimizable(table.rowKeyOrderOptimizable()) + .setBucketNum(table.getBucketNum()) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(projectedColumns) + .build(); } // For extracting column references from single select statement http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java index c0c63eb..a54fbdd 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/UnionCompiler.java @@ -17,10 +17,14 @@ */ package org.apache.phoenix.compile; +import static org.apache.phoenix.query.QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT; + import java.sql.SQLException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import com.google.common.collect.ImmutableList; import org.apache.hadoop.hbase.HConstants; import org.apache.phoenix.exception.SQLExceptionCode; import org.apache.phoenix.exception.SQLExceptionInfo; @@ -96,15 +100,34 @@ public class UnionCompiler { projectedColumns.add(projectedColumn); } Long scn = statement.getConnection().getSCN(); - PTable tempTable = PTableImpl.makePTable(statement.getConnection().getTenantId(), - UNION_SCHEMA_NAME, UNION_TABLE_NAME, PTableType.SUBQUERY, null, - HConstants.LATEST_TIMESTAMP, scn == null ? HConstants.LATEST_TIMESTAMP : scn, - null, null, projectedColumns, null, null, null, true, null, null, null, true, - true, true, null, null, null, null, false, null, 0, 0L, - SchemaUtil.isNamespaceMappingEnabled(PTableType.SUBQUERY, - statement.getConnection().getQueryServices().getProps()), null, false, ImmutableStorageScheme.ONE_CELL_PER_COLUMN, QualifierEncodingScheme.NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER, true); - TableRef tableRef = new TableRef(null, tempTable, 0, false); - return tableRef; + PTable tempTable = new PTableImpl.Builder() + .setType(PTableType.SUBQUERY) + .setTimeStamp(HConstants.LATEST_TIMESTAMP) + .setIndexDisableTimestamp(0L) + .setSequenceNumber(scn == null ? HConstants.LATEST_TIMESTAMP : scn) + .setImmutableRows(true) + .setDisableWAL(true) + .setMultiTenant(true) + .setStoreNulls(true) + .setUpdateCacheFrequency(0) + .setNamespaceMapped(SchemaUtil.isNamespaceMappingEnabled(PTableType.SUBQUERY, + statement.getConnection().getQueryServices().getProps())) + .setAppendOnlySchema(false) + .setImmutableStorageScheme(ImmutableStorageScheme.ONE_CELL_PER_COLUMN) + .setQualifierEncodingScheme(QualifierEncodingScheme.NON_ENCODED_QUALIFIERS) + .setBaseColumnCount(BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(PTable.EncodedCQCounter.NULL_COUNTER) + .setUseStatsForParallelization(true) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(statement.getConnection().getTenantId()) + .setSchemaName(UNION_SCHEMA_NAME) + .setTableName(UNION_TABLE_NAME) + .setRowKeyOrderOptimizable(false) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(projectedColumns) + .build(); + return new TableRef(null, tempTable, 0, false); } private static void compareExperssions(int i, Expression expression, http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/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 61be561..4ed0c9a 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 @@ -32,6 +32,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import com.google.common.collect.ImmutableList; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.HRegionLocation; import org.apache.hadoop.hbase.client.Scan; @@ -701,9 +702,11 @@ public class UpsertCompiler { } // Build table from projectedColumns // Hack to add default column family to be used on server in case no value column is projected. - PTable projectedTable = PTableImpl.makePTable(table, projectedColumns, - PNameFactory.newName(SchemaUtil.getEmptyColumnFamily(table))); - + PTable projectedTable = PTableImpl.builderWithColumns(table, projectedColumns) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setDefaultFamilyName(PNameFactory.newName(SchemaUtil.getEmptyColumnFamily(table))) + .setColumns(projectedColumns) + .build(); SelectStatement select = SelectStatement.create(SelectStatement.COUNT_ONE, upsert.getHint()); StatementContext statementContext = queryPlan.getContext(); @@ -856,7 +859,8 @@ public class UpsertCompiler { } updateExpressions.add(updateExpression); } - PTable onDupKeyTable = PTableImpl.makePTable(table, updateColumns); + PTable onDupKeyTable = PTableImpl.builderWithColumns(table, updateColumns) + .build(); onDupKeyBytesToBe = PhoenixIndexBuilder.serializeOnDupKeyUpdate(onDupKeyTable, updateExpressions); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java index 424b6d6..d899e32 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java @@ -78,6 +78,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.VIEW_INDEX_ID_DATA import static org.apache.phoenix.query.QueryConstants.DIVERGED_VIEW_BASE_COLUMN_COUNT; import static org.apache.phoenix.schema.PTableType.INDEX; import static org.apache.phoenix.schema.PTableType.TABLE; +import static org.apache.phoenix.schema.PTableImpl.getColumnsToClone; import static org.apache.phoenix.util.SchemaUtil.getVarCharLength; import static org.apache.phoenix.util.SchemaUtil.getVarChars; @@ -101,6 +102,7 @@ import java.util.NavigableMap; import java.util.Properties; import java.util.Set; +import com.google.common.collect.ImmutableList; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellUtil; @@ -215,6 +217,7 @@ import org.apache.phoenix.schema.PTableImpl; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.ParentTableNotFoundException; +import org.apache.phoenix.schema.RowKeySchema; import org.apache.phoenix.schema.SaltingUtil; import org.apache.phoenix.schema.SequenceAllocation; import org.apache.phoenix.schema.SequenceAlreadyExistsException; @@ -689,7 +692,9 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } indexes.add(latestIndex); } - table = PTableImpl.makePTable(table, table.getTimeStamp(), indexes); + table = PTableImpl.builderWithColumns(table, getColumnsToClone(table)) + .setIndexes(indexes == null ? Collections.<PTable>emptyList() : indexes) + .build(); } } @@ -939,11 +944,31 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso int baseTableColumnCount = isDiverged ? QueryConstants.DIVERGED_VIEW_BASE_COLUMN_COUNT : columnsToAdd.size() - myColumns.size() + (isSalted ? 1 : 0); + + // When creating a PTable for views or view indexes, use the baseTable PTable for attributes + // inherited from the physical base table. + // if a TableProperty is not valid on a view we set it to the base table value + // if a TableProperty is valid on a view and is not mutable on a view we set it to the base table value + // if a TableProperty is valid on a view and is mutable on a view we use the value set on the view // TODO Implement PHOENIX-4763 to set the view properties correctly instead of just // setting them same as the base table - PTableImpl pTable = - PTableImpl.makePTable(table, baseTable, columnsToAdd, maxTableTimestamp, - baseTableColumnCount, excludedColumns); + PTableImpl pTable = PTableImpl.builderWithColumns(table, columnsToAdd) + .setImmutableRows(baseTable.isImmutableRows()) + .setDisableWAL(baseTable.isWALDisabled()) + .setMultiTenant(baseTable.isMultiTenant()) + .setStoreNulls(baseTable.getStoreNulls()) + .setTransactionProvider(baseTable.getTransactionProvider()) + .setAutoPartitionSeqName(baseTable.getAutoPartitionSeqName()) + .setAppendOnlySchema(baseTable.isAppendOnlySchema()) + .setImmutableStorageScheme(baseTable.getImmutableStorageScheme() == null ? + ImmutableStorageScheme.ONE_CELL_PER_COLUMN : baseTable.getImmutableStorageScheme()) + .setQualifierEncodingScheme(baseTable.getEncodingScheme() == null ? + QualifierEncodingScheme.NON_ENCODED_QUALIFIERS : baseTable.getEncodingScheme()) + .setBaseColumnCount(baseTableColumnCount) + .setTimeStamp(maxTableTimestamp) + .setExcludedColumns(excludedColumns == null ? + ImmutableList.<PColumn>of() : ImmutableList.copyOf(excludedColumns)) + .build(); return WhereConstantParser.addViewInfoToPColumnsIfNeeded(pTable); } @@ -1486,11 +1511,48 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } // Avoid querying the stats table because we're holding the rowLock here. Issuing an RPC to a remote // server while holding this lock is a bad idea and likely to cause contention. - return PTableImpl.makePTable(tenantId, schemaName, tableName, tableType, indexState, timeStamp, tableSeqNum, - pkName, saltBucketNum, columns, parentSchemaName, parentTableName, indexes, isImmutableRows, physicalTables, defaultFamilyName, - viewStatement, disableWAL, multiTenant, storeNulls, viewType, viewIndexType, viewIndexId, indexType, - rowKeyOrderOptimizable, transactionProvider, updateCacheFrequency, baseColumnCount, - indexDisableTimestamp, isNamespaceMapped, autoPartitionSeq, isAppendOnlySchema, storageScheme, encodingScheme, cqCounter, useStatsForParallelization); + return new PTableImpl.Builder() + .setType(tableType) + .setState(indexState) + .setTimeStamp(timeStamp) + .setIndexDisableTimestamp(indexDisableTimestamp) + .setSequenceNumber(tableSeqNum) + .setImmutableRows(isImmutableRows) + .setViewStatement(viewStatement) + .setDisableWAL(disableWAL) + .setMultiTenant(multiTenant) + .setStoreNulls(storeNulls) + .setViewType(viewType) + .setViewIndexType(viewIndexType) + .setViewIndexId(viewIndexId) + .setIndexType(indexType) + .setTransactionProvider(transactionProvider) + .setUpdateCacheFrequency(updateCacheFrequency) + .setNamespaceMapped(isNamespaceMapped) + .setAutoPartitionSeqName(autoPartitionSeq) + .setAppendOnlySchema(isAppendOnlySchema) + .setImmutableStorageScheme(storageScheme == null ? + ImmutableStorageScheme.ONE_CELL_PER_COLUMN : storageScheme) + .setQualifierEncodingScheme(encodingScheme == null ? + QualifierEncodingScheme.NON_ENCODED_QUALIFIERS : encodingScheme) + .setBaseColumnCount(baseColumnCount) + .setEncodedCQCounter(cqCounter) + .setUseStatsForParallelization(useStatsForParallelization) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(tenantId) + .setSchemaName(schemaName) + .setTableName(tableName) + .setPkName(pkName) + .setDefaultFamilyName(defaultFamilyName) + .setRowKeyOrderOptimizable(rowKeyOrderOptimizable) + .setBucketNum(saltBucketNum) + .setIndexes(indexes == null ? Collections.<PTable>emptyList() : indexes) + .setParentSchemaName(parentSchemaName) + .setParentTableName(parentTableName) + .setPhysicalNames(physicalTables == null ? + ImmutableList.<PName>of() : ImmutableList.copyOf(physicalTables)) + .setColumns(columns) + .build(); } private Long getViewIndexId(Cell[] tableKeyValues, PDataType viewIndexType) { Cell viewIndexIdKv = tableKeyValues[VIEW_INDEX_ID_INDEX]; @@ -1740,7 +1802,21 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } private static PTable newDeletedTableMarker(long timestamp) { - return new PTableImpl(timestamp); + try { + return new PTableImpl.Builder() + .setType(PTableType.TABLE) + .setTimeStamp(timestamp) + .setPkColumns(Collections.<PColumn>emptyList()) + .setAllColumns(Collections.<PColumn>emptyList()) + .setFamilyAttributes(Collections.<PColumnFamily>emptyList()) + .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(Collections.<PName>emptyList()) + .build(); + } catch (SQLException e) { + // Should never happen + return null; + } } private static PFunction newDeletedFunctionMarker(long timestamp) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java index a667316..73386a2 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/UngroupedAggregateRegionObserver.java @@ -23,6 +23,7 @@ import static org.apache.phoenix.query.QueryConstants.SINGLE_COLUMN_FAMILY; import static org.apache.phoenix.query.QueryConstants.UNGROUPED_AGG_ROW_KEY; import static org.apache.phoenix.query.QueryServices.MUTATE_BATCH_SIZE_ATTRIB; import static org.apache.phoenix.query.QueryServices.MUTATE_BATCH_SIZE_BYTES_ATTRIB; +import static org.apache.phoenix.schema.PTableImpl.getColumnsToClone; import static org.apache.phoenix.schema.stats.StatisticsCollectionRunTracker.COMPACTION_UPDATE_STATS_ROW_COUNT; import static org.apache.phoenix.schema.stats.StatisticsCollectionRunTracker.CONCURRENT_UPDATE_STATS_ROW_COUNT; @@ -411,7 +412,10 @@ public class UngroupedAggregateRegionObserver extends BaseScannerRegionObserver logger.debug("Upgrading row key for " + region.getRegionInfo().getTable().getNameAsString()); projectedTable = deserializeTable(descRowKeyTableBytes); try { - writeToTable = PTableImpl.makePTable(projectedTable, true); + writeToTable = PTableImpl.builderWithColumns(projectedTable, + getColumnsToClone(projectedTable)) + .setRowKeyOrderOptimizable(true) + .build(); } catch (SQLException e) { ServerUtil.throwIOException("Upgrade failed", e); // Impossible } http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java index 4528f55..9fc030c 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/WhereConstantParser.java @@ -94,7 +94,8 @@ public class WhereConstantParser { result.add(column); } } - return PTableImpl.makePTable(view, result); + return PTableImpl.builderWithColumns(view, result) + .build(); } private static PhoenixConnection getConnectionlessConnection() throws SQLException { http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java index 655de0d..d7e7d6d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java @@ -18,6 +18,7 @@ package org.apache.phoenix.query; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.INDEX_STATE_BYTES; +import static org.apache.phoenix.schema.PTableImpl.getColumnsToClone; import java.sql.SQLException; import java.util.ArrayList; @@ -316,7 +317,8 @@ public class ConnectionlessQueryServicesImpl extends DelegateQueryServices imple public MetaDataMutationResult addColumn(List<Mutation> tableMetaData, PTable table, Map<String, List<Pair<String,Object>>> properties, Set<String> colFamiliesForPColumnsToBeAdded, List<PColumn> columnsToBeAdded) throws SQLException { List<PColumn> columns = Lists.newArrayList(table.getColumns()); columns.addAll(columnsToBeAdded); - return new MetaDataMutationResult(MutationCode.TABLE_ALREADY_EXISTS, 0, PTableImpl.makePTable(table, columns)); + return new MetaDataMutationResult(MutationCode.TABLE_ALREADY_EXISTS, 0, + PTableImpl.builderWithColumns(table, columns).build()); } @Override @@ -453,7 +455,10 @@ public class ConnectionlessQueryServicesImpl extends DelegateQueryServices imple String indexTableName = SchemaUtil.getTableName(schemaName, indexName); PName tenantId = tenantIdBytes.length == 0 ? null : PNameFactory.newName(tenantIdBytes); PTable index = metaData.getTableRef(new PTableKey(tenantId, indexTableName)).getTable(); - index = PTableImpl.makePTable(index,newState == PIndexState.USABLE ? PIndexState.ACTIVE : newState == PIndexState.UNUSABLE ? PIndexState.INACTIVE : newState); + index = PTableImpl.builderWithColumns(index, getColumnsToClone(index)) + .setState(newState == PIndexState.USABLE ? PIndexState.ACTIVE : + newState == PIndexState.UNUSABLE ? PIndexState.INACTIVE : newState) + .build(); return new MetaDataMutationResult(MutationCode.TABLE_ALREADY_EXISTS, 0, index); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java index df0e5d4..aae9fc4 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java @@ -104,6 +104,7 @@ import static org.apache.phoenix.schema.PTable.ImmutableStorageScheme.ONE_CELL_P import static org.apache.phoenix.schema.PTable.ImmutableStorageScheme.SINGLE_CELL_ARRAY_WITH_OFFSETS; import static org.apache.phoenix.schema.PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS; import static org.apache.phoenix.schema.PTable.ViewType.MAPPED; +import static org.apache.phoenix.schema.PTableImpl.getColumnsToClone; import static org.apache.phoenix.schema.PTableType.TABLE; import static org.apache.phoenix.schema.PTableType.VIEW; import static org.apache.phoenix.schema.types.PDataType.FALSE_BYTES; @@ -132,6 +133,7 @@ import java.util.Properties; import java.util.Set; import org.apache.hadoop.hbase.HColumnDescriptor; +import com.google.common.base.Objects; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.client.ClusterConnection; @@ -247,6 +249,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.base.Strings; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; @@ -931,10 +934,21 @@ public class MetaDataClient { + QueryConstants.CHILD_VIEW_INDEX_NAME_SEPARATOR + index.getName().getString()); // add the index table with a new name so that it does not conflict with the existing index table // and set update cache frequency to that of the view - indexesToAdd.add(PTableImpl.makePTable(index, modifiedIndexName, viewStatement, view.getUpdateCacheFrequency(), view.getTenantId())); + if (Objects.equal(viewStatement, index.getViewStatement())) { + indexesToAdd.add(index); + } else { + indexesToAdd.add(PTableImpl.builderWithColumns(index, getColumnsToClone(index)) + .setTableName(modifiedIndexName) + .setViewStatement(viewStatement) + .setUpdateCacheFrequency(view.getUpdateCacheFrequency()) + .setTenantId(view.getTenantId()) + .build()); + } } } - PTable allIndexesTable = PTableImpl.makePTable(view, view.getTimeStamp(), indexesToAdd); + PTable allIndexesTable = PTableImpl.builderWithColumns(view, getColumnsToClone(view)) + .setIndexes(indexesToAdd == null ? Collections.<PTable>emptyList() : indexesToAdd) + .build(); result.setTable(allIndexesTable); return true; } @@ -2650,13 +2664,38 @@ public class MetaDataClient { // TODO: what about stats for system catalog? PName newSchemaName = PNameFactory.newName(schemaName); // Column names and qualifiers and hardcoded for system tables. - PTable table = PTableImpl.makePTable(tenantId,newSchemaName, PNameFactory.newName(tableName), tableType, - null, MetaDataProtocol.MIN_TABLE_TIMESTAMP, PTable.INITIAL_SEQ_NUM, - PNameFactory.newName(QueryConstants.SYSTEM_TABLE_PK_NAME), null, columns.values(), null, null, - Collections.<PTable>emptyList(), isImmutableRows, - Collections.<PName>emptyList(), defaultFamilyName == null ? null : - PNameFactory.newName(defaultFamilyName), null, - Boolean.TRUE.equals(disableWAL), false, false, null, viewIndexType, null, indexType, true, null, 0, 0L, isNamespaceMapped, autoPartitionSeq, isAppendOnlySchema, ONE_CELL_PER_COLUMN, NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER, true); + PTable table = new PTableImpl.Builder() + .setType(tableType) + .setTimeStamp(MetaDataProtocol.MIN_TABLE_TIMESTAMP) + .setIndexDisableTimestamp(0L) + .setSequenceNumber(PTable.INITIAL_SEQ_NUM) + .setImmutableRows(isImmutableRows) + .setDisableWAL(Boolean.TRUE.equals(disableWAL)) + .setMultiTenant(false) + .setStoreNulls(false) + .setViewIndexType(viewIndexType) + .setIndexType(indexType) + .setUpdateCacheFrequency(0) + .setNamespaceMapped(isNamespaceMapped) + .setAutoPartitionSeqName(autoPartitionSeq) + .setAppendOnlySchema(isAppendOnlySchema) + .setImmutableStorageScheme(ONE_CELL_PER_COLUMN) + .setQualifierEncodingScheme(NON_ENCODED_QUALIFIERS) + .setBaseColumnCount(QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(PTable.EncodedCQCounter.NULL_COUNTER) + .setUseStatsForParallelization(true) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(tenantId) + .setSchemaName(newSchemaName) + .setTableName(PNameFactory.newName(tableName)) + .setPkName(PNameFactory.newName(QueryConstants.SYSTEM_TABLE_PK_NAME)) + .setDefaultFamilyName(defaultFamilyName == null ? null : + PNameFactory.newName(defaultFamilyName)) + .setRowKeyOrderOptimizable(true) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(ImmutableList.<PName>of()) + .setColumns(columns.values()) + .build(); connection.addTable(table, MetaDataProtocol.MIN_TABLE_TIMESTAMP); } @@ -2930,12 +2969,49 @@ public class MetaDataClient { * for extra safety. */ EncodedCQCounter cqCounterToBe = tableType == PTableType.VIEW ? NULL_COUNTER : cqCounter; - PTable table = PTableImpl.makePTable( - tenantId, newSchemaName, PNameFactory.newName(tableName), tableType, indexState, timestamp!=null ? timestamp : result.getMutationTime(), - PTable.INITIAL_SEQ_NUM, pkName == null ? null : PNameFactory.newName(pkName), saltBucketNum, columns.values(), - parent == null ? null : parent.getSchemaName(), parent == null ? null : parent.getTableName(), Collections.<PTable>emptyList(), isImmutableRows, - physicalNames, defaultFamilyName == null ? null : PNameFactory.newName(defaultFamilyName), viewStatement, Boolean.TRUE.equals(disableWAL), multiTenant, storeNulls, viewType, - viewIndexType, result.getViewIndexId(), indexType, rowKeyOrderOptimizable, transactionProvider, updateCacheFrequency, 0L, isNamespaceMapped, autoPartitionSeq, isAppendOnlySchema, immutableStorageScheme, encodingScheme, cqCounterToBe, useStatsForParallelizationProp); + PTable table = new PTableImpl.Builder() + .setType(tableType) + .setState(indexState) + .setTimeStamp(timestamp != null ? timestamp : result.getMutationTime()) + .setIndexDisableTimestamp(0L) + .setSequenceNumber(PTable.INITIAL_SEQ_NUM) + .setImmutableRows(isImmutableRows) + .setViewStatement(viewStatement) + .setDisableWAL(Boolean.TRUE.equals(disableWAL)) + .setMultiTenant(multiTenant) + .setStoreNulls(storeNulls) + .setViewType(viewType) + .setViewIndexType(viewIndexType) + .setViewIndexId(result.getViewIndexId()) + .setIndexType(indexType) + .setTransactionProvider(transactionProvider) + .setUpdateCacheFrequency(updateCacheFrequency) + .setNamespaceMapped(isNamespaceMapped) + .setAutoPartitionSeqName(autoPartitionSeq) + .setAppendOnlySchema(isAppendOnlySchema) + .setImmutableStorageScheme(immutableStorageScheme == null ? + ImmutableStorageScheme.ONE_CELL_PER_COLUMN : immutableStorageScheme) + .setQualifierEncodingScheme(encodingScheme == null ? + QualifierEncodingScheme.NON_ENCODED_QUALIFIERS : encodingScheme) + .setBaseColumnCount(QueryConstants.BASE_TABLE_BASE_COLUMN_COUNT) + .setEncodedCQCounter(cqCounterToBe) + .setUseStatsForParallelization(useStatsForParallelizationProp) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(tenantId) + .setSchemaName(newSchemaName) + .setTableName(PNameFactory.newName(tableName)) + .setPkName(pkName == null ? null : PNameFactory.newName(pkName)) + .setDefaultFamilyName(defaultFamilyName == null ? + null : PNameFactory.newName(defaultFamilyName)) + .setRowKeyOrderOptimizable(rowKeyOrderOptimizable) + .setBucketNum(saltBucketNum) + .setIndexes(Collections.<PTable>emptyList()) + .setParentSchemaName((parent == null) ? null : parent.getSchemaName()) + .setParentTableName((parent == null) ? null : parent.getTableName()) + .setPhysicalNames(physicalNames == null ? + ImmutableList.<PName>of() : ImmutableList.copyOf(physicalNames)) + .setColumns(columns.values()) + .build(); result = new MetaDataMutationResult(code, result.getMutationTime(), table, true); addTableToCache(result); return table; @@ -3131,10 +3207,29 @@ public class MetaDataClient { && (table.isMultiTenant() || hasViewIndexTable)) { if (hasViewIndexTable) { byte[] viewIndexPhysicalName = MetaDataUtil.getViewIndexPhysicalName(table.getPhysicalName().getBytes()); - PTable viewIndexTable = new PTableImpl(null, - SchemaUtil.getSchemaNameFromFullName(viewIndexPhysicalName), - SchemaUtil.getTableNameFromFullName(viewIndexPhysicalName), ts, - table.getColumnFamilies(),table.isNamespaceMapped(), table.getImmutableStorageScheme(), table.getEncodingScheme(), table.useStatsForParallelization()); + String viewIndexSchemaName = SchemaUtil.getSchemaNameFromFullName(viewIndexPhysicalName); + String viewIndexTableName = SchemaUtil.getTableNameFromFullName(viewIndexPhysicalName); + PName viewIndexName = PNameFactory.newName(SchemaUtil.getTableName(viewIndexSchemaName, viewIndexTableName)); + + PTable viewIndexTable = new PTableImpl.Builder() + .setName(viewIndexName) + .setKey(new PTableKey(tenantId, viewIndexName.getString())) + .setSchemaName(PNameFactory.newName(viewIndexSchemaName)) + .setTableName(PNameFactory.newName(viewIndexTableName)) + .setType(PTableType.VIEW) + .setViewType(ViewType.MAPPED) + .setTimeStamp(ts) + .setPkColumns(Collections.<PColumn>emptyList()) + .setAllColumns(Collections.<PColumn>emptyList()) + .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA) + .setIndexes(Collections.<PTable>emptyList()) + .setFamilyAttributes(table.getColumnFamilies()) + .setPhysicalNames(Collections.<PName>emptyList()) + .setNamespaceMapped(table.isNamespaceMapped()) + .setImmutableStorageScheme(table.getImmutableStorageScheme()) + .setQualifierEncodingScheme(table.getEncodingScheme()) + .setUseStatsForParallelization(table.useStatsForParallelization()) + .build(); tableRefs.add(new TableRef(null, viewIndexTable, ts, false)); } } @@ -3754,13 +3849,32 @@ public class MetaDataClient { long ts = (scn == null ? result.getMutationTime() : scn); byte[] viewIndexPhysicalName = MetaDataUtil .getViewIndexPhysicalName(table.getPhysicalName().getBytes()); - PTable viewIndexTable = new PTableImpl(null, - SchemaUtil.getSchemaNameFromFullName(viewIndexPhysicalName), - SchemaUtil.getTableNameFromFullName(viewIndexPhysicalName), ts, - table.getColumnFamilies(), table.isNamespaceMapped(), table.getImmutableStorageScheme(), table.getEncodingScheme(), table.useStatsForParallelization()); + String viewIndexSchemaName = SchemaUtil.getSchemaNameFromFullName(viewIndexPhysicalName); + String viewIndexTableName = SchemaUtil.getTableNameFromFullName(viewIndexPhysicalName); + PName viewIndexName = PNameFactory.newName(SchemaUtil.getTableName(viewIndexSchemaName, viewIndexTableName)); + + PTable viewIndexTable = new PTableImpl.Builder() + .setName(viewIndexName) + .setKey(new PTableKey(tenantId, viewIndexName.getString())) + .setSchemaName(PNameFactory.newName(viewIndexSchemaName)) + .setTableName(PNameFactory.newName(viewIndexTableName)) + .setType(PTableType.VIEW) + .setViewType(ViewType.MAPPED) + .setTimeStamp(ts) + .setPkColumns(Collections.<PColumn>emptyList()) + .setAllColumns(Collections.<PColumn>emptyList()) + .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA) + .setIndexes(Collections.<PTable>emptyList()) + .setFamilyAttributes(table.getColumnFamilies()) + .setPhysicalNames(Collections.<PName>emptyList()) + .setNamespaceMapped(table.isNamespaceMapped()) + .setImmutableStorageScheme(table.getImmutableStorageScheme()) + .setQualifierEncodingScheme(table.getEncodingScheme()) + .setUseStatsForParallelization(table.useStatsForParallelization()) + .build(); List<TableRef> tableRefs = Collections.singletonList(new TableRef(null, viewIndexTable, ts, false)); MutationPlan plan = new PostDDLCompiler(connection).compile(tableRefs, null, null, - Collections.<PColumn> emptyList(), ts); + Collections.<PColumn>emptyList(), ts); connection.getQueryServices().updateData(plan); } } @@ -4029,21 +4143,44 @@ public class MetaDataClient { Map<String, List<TableRef>> tenantIdTableRefMap = Maps.newHashMap(); if (result.getSharedTablesToDelete() != null) { for (SharedTableState sharedTableState : result.getSharedTablesToDelete()) { - PTableImpl viewIndexTable = - new PTableImpl(sharedTableState.getTenantId(), - sharedTableState.getSchemaName(), - sharedTableState.getTableName(), ts, - table.getColumnFamilies(), - sharedTableState.getColumns(), - sharedTableState.getPhysicalNames(), - sharedTableState.getViewIndexType(), - sharedTableState.getViewIndexId(), - table.isMultiTenant(), table.isNamespaceMapped(), - table.getImmutableStorageScheme(), - table.getEncodingScheme(), - table.getEncodedCQCounter(), - table.useStatsForParallelization(), - table.getBucketNum()); + ImmutableStorageScheme storageScheme = table.getImmutableStorageScheme(); + QualifierEncodingScheme qualifierEncodingScheme = table.getEncodingScheme(); + List<PColumn> columns = sharedTableState.getColumns(); + if (table.getBucketNum() != null) { + columns = columns.subList(1, columns.size()); + } + + PTableImpl viewIndexTable = new PTableImpl.Builder() + .setPkColumns(Collections.<PColumn>emptyList()) + .setAllColumns(Collections.<PColumn>emptyList()) + .setRowKeySchema(RowKeySchema.EMPTY_SCHEMA) + .setIndexes(Collections.<PTable>emptyList()) + .setFamilyAttributes(table.getColumnFamilies()) + .setType(PTableType.INDEX) + .setTimeStamp(ts) + .setMultiTenant(table.isMultiTenant()) + .setViewIndexType(sharedTableState.getViewIndexType()) + .setViewIndexId(sharedTableState.getViewIndexId()) + .setNamespaceMapped(table.isNamespaceMapped()) + .setAppendOnlySchema(false) + .setImmutableStorageScheme(storageScheme == null ? + ImmutableStorageScheme.ONE_CELL_PER_COLUMN : storageScheme) + .setQualifierEncodingScheme(qualifierEncodingScheme == null ? + QualifierEncodingScheme.NON_ENCODED_QUALIFIERS : qualifierEncodingScheme) + .setEncodedCQCounter(table.getEncodedCQCounter()) + .setUseStatsForParallelization(table.useStatsForParallelization()) + .setExcludedColumns(ImmutableList.<PColumn>of()) + .setTenantId(sharedTableState.getTenantId()) + .setSchemaName(sharedTableState.getSchemaName()) + .setTableName(sharedTableState.getTableName()) + .setRowKeyOrderOptimizable(false) + .setBucketNum(table.getBucketNum()) + .setIndexes(Collections.<PTable>emptyList()) + .setPhysicalNames(sharedTableState.getPhysicalNames() == null ? + ImmutableList.<PName>of() : + ImmutableList.copyOf(sharedTableState.getPhysicalNames())) + .setColumns(columns) + .build(); TableRef indexTableRef = new TableRef(viewIndexTable); PName indexTableTenantId = sharedTableState.getTenantId(); if (indexTableTenantId==null) { http://git-wip-us.apache.org/repos/asf/phoenix/blob/d6083ae5/phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java index 598cc79..3ce70ea 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PMetaDataImpl.java @@ -17,7 +17,10 @@ */ package org.apache.phoenix.schema; +import static org.apache.phoenix.schema.PTableImpl.getColumnsToClone; + import java.sql.SQLException; +import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -27,7 +30,6 @@ import org.apache.phoenix.parse.PSchema; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.query.QueryServicesOptions; import org.apache.phoenix.util.ReadOnlyProps; -import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TimeKeeper; import com.google.common.collect.Lists; @@ -121,7 +123,11 @@ public class PMetaDataImpl implements PMetaData { } newIndexes.add(table); netGain -= oldParentRef.getEstimatedSize(); - newParentTable = PTableImpl.makePTable(oldParentRef.getTable(), table.getTimeStamp(), newIndexes); + newParentTable = PTableImpl.builderWithColumns(oldParentRef.getTable(), + getColumnsToClone(oldParentRef.getTable())) + .setIndexes(newIndexes) + .setTimeStamp(table.getTimeStamp()) + .build(); newParentTableRef = tableRefFactory.makePTableRef(newParentTable, this.timeKeeper.getCurrentTime(), parentResolvedTimestamp); netGain += newParentTableRef.getEstimatedSize(); } @@ -173,10 +179,14 @@ public class PMetaDataImpl implements PMetaData { PTable index = newIndexes.get(i); if (index.getName().getString().equals(tableName)) { newIndexes.remove(i); - PTable parentTable = PTableImpl.makePTable( - parentTableRef.getTable(), - tableTimeStamp == HConstants.LATEST_TIMESTAMP ? parentTableRef.getTable().getTimeStamp() : tableTimeStamp, - newIndexes); + PTableImpl.Builder parentTableBuilder = + PTableImpl.builderWithColumns(parentTableRef.getTable(), + getColumnsToClone(parentTableRef.getTable())) + .setIndexes(newIndexes == null ? Collections.<PTable>emptyList() : newIndexes); + if (tableTimeStamp != HConstants.LATEST_TIMESTAMP) { + parentTableBuilder.setTimeStamp(tableTimeStamp); + } + PTable parentTable = parentTableBuilder.build(); metaData.put(parentTable.getKey(), tableRefFactory.makePTableRef(parentTable, this.timeKeeper.getCurrentTime(), parentTableRef.getResolvedTimeStamp())); break; } @@ -218,8 +228,10 @@ public class PMetaDataImpl implements PMetaData { oldColumn.getTimestamp()); columns.add(newColumn); } - - table = PTableImpl.makePTable(table, tableTimeStamp, tableSeqNum, columns); + table = PTableImpl.builderWithColumns(table, columns) + .setTimeStamp(tableTimeStamp) + .setSequenceNumber(tableSeqNum) + .build(); } tables.put(table.getKey(), tableRefFactory.makePTableRef(table, this.timeKeeper.getCurrentTime(), resolvedTime)); }