Repository: phoenix Updated Branches: refs/heads/encodecolumns [created] f7c1d45a1
Metadata changes to support encoding of column names Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/f7c1d45a Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/f7c1d45a Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/f7c1d45a Branch: refs/heads/encodecolumns Commit: f7c1d45a17771c1010d1bec37a167ee127b54607 Parents: cd8059e Author: Samarth <samarth.j...@salesforce.com> Authored: Tue Mar 8 13:48:24 2016 -0800 Committer: Samarth <samarth.j...@salesforce.com> Committed: Tue Mar 8 13:48:24 2016 -0800 ---------------------------------------------------------------------- .../apache/phoenix/end2end/AlterTableIT.java | 39 ++++- .../apache/phoenix/compile/FromCompiler.java | 8 +- .../phoenix/compile/ListJarsQueryPlan.java | 2 +- .../apache/phoenix/compile/TraceQueryPlan.java | 2 +- .../apache/phoenix/compile/UnionCompiler.java | 3 +- .../coprocessor/MetaDataEndpointImpl.java | 11 +- .../coprocessor/generated/PTableProtos.java | 146 +++++++++++++++---- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 2 + .../query/ConnectionQueryServicesImpl.java | 1 + .../apache/phoenix/query/QueryConstants.java | 2 + .../apache/phoenix/schema/DelegateColumn.java | 5 + .../apache/phoenix/schema/MetaDataClient.java | 42 ++++-- .../java/org/apache/phoenix/schema/PColumn.java | 7 +- .../org/apache/phoenix/schema/PColumnImpl.java | 24 ++- .../apache/phoenix/schema/PMetaDataImpl.java | 2 +- .../org/apache/phoenix/schema/SaltingUtil.java | 2 +- .../org/apache/phoenix/util/SchemaUtil.java | 14 ++ .../phoenix/execute/CorrelatePlanTest.java | 2 +- .../phoenix/execute/UnnestArrayPlanTest.java | 4 +- .../expression/ColumnExpressionTest.java | 8 +- .../iterate/AggregateResultScannerTest.java | 4 + phoenix-protocol/src/main/PTable.proto | 1 + 22 files changed, 262 insertions(+), 69 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java index 122ec16..04f240b 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/AlterTableIT.java @@ -36,7 +36,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Collections; -import java.util.List; import java.util.Map; import java.util.Properties; @@ -45,7 +44,9 @@ import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.KeepDeletedCells; import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTableInterface; -import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.Result; +import org.apache.hadoop.hbase.client.ResultScanner; +import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.coprocessor.MetaDataProtocol; import org.apache.phoenix.exception.SQLExceptionCode; @@ -55,8 +56,6 @@ import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.TableNotFoundException; -import org.apache.phoenix.schema.types.PInteger; -import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.IndexUtil; import org.apache.phoenix.util.PhoenixRuntime; import org.apache.phoenix.util.PropertiesUtil; @@ -65,8 +64,6 @@ import org.apache.phoenix.util.SchemaUtil; import org.junit.BeforeClass; import org.junit.Test; -import com.google.common.collect.Lists; - /** * * A lot of tests in this class test HBase level properties. As a result, @@ -2204,6 +2201,36 @@ public class AlterTableIT extends BaseOwnClusterHBaseManagedTimeIT { } } } + + @Test + public void testColumnQualifierForUpsertedValues() throws Exception { + String schemaName = "A"; + String tableName = "TEST"; + String fullTableName = SchemaUtil.getTableName(schemaName, tableName); + String ddl = "create table " + fullTableName + + " (" + + " K varchar primary key," + + " CF1.V1 varchar)"; + try (Connection conn = DriverManager.getConnection(getUrl())) { + conn.createStatement().execute(ddl); + } + String dml = "UPSERT INTO " + fullTableName + " VALUES (?, ?)"; + try (Connection conn = DriverManager.getConnection(getUrl())) { + PreparedStatement stmt = conn.prepareStatement(dml); + stmt.setString(1, "KEY1"); + stmt.setString(2, "VALUE1"); + stmt.executeUpdate(); + conn.commit(); + } + // Issue a raw hbase scan using the column qualifier 0 for column CF1.V1. + try (Connection conn = DriverManager.getConnection(getUrl())) { + HTableInterface table = conn.unwrap(PhoenixConnection.class).getQueryServices().getTable(Bytes.toBytes(fullTableName)); + ResultScanner scanner = table.getScanner(new Scan()); + Result next = scanner.next(); + assertTrue(next.containsColumn(Bytes.toBytes("CF1"), Bytes.toBytes("V1"))); + } + } + } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 ffe9621..b207dea 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 @@ -221,7 +221,7 @@ public class FromCompiler { Expression sourceExpression = projector.getColumnProjector(column.getPosition()).getExpression(); PColumnImpl projectedColumn = new PColumnImpl(column.getName(), column.getFamilyName(), sourceExpression.getDataType(), sourceExpression.getMaxLength(), sourceExpression.getScale(), sourceExpression.isNullable(), - column.getPosition(), sourceExpression.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic()); + column.getPosition(), sourceExpression.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic(), column.getColumnQualifier()); projectedColumns.add(projectedColumn); } PTable t = PTableImpl.makePTable(table, projectedColumns); @@ -546,8 +546,9 @@ public class FromCompiler { theTable.getColumnFamily(family); // Verifies that column family exists familyName = PNameFactory.newName(family); } + // Dynamic columns don't have a corresponding column qualifier allcolumns.add(new PColumnImpl(name, familyName, dynColumn.getDataType(), dynColumn.getMaxLength(), - dynColumn.getScale(), dynColumn.isNull(), position, dynColumn.getSortOrder(), dynColumn.getArraySize(), null, false, dynColumn.getExpression(), false, true)); + dynColumn.getScale(), dynColumn.isNull(), position, dynColumn.getSortOrder(), dynColumn.getArraySize(), null, false, dynColumn.getExpression(), false, true, null)); position++; } theTable = PTableImpl.makePTable(theTable, allcolumns); @@ -643,9 +644,10 @@ public class FromCompiler { // referenced by an outer wild-card select. alias = String.valueOf(position); } + //TODO: samarth confirm this is the right change i.e. using null for column qualifier PColumnImpl column = new PColumnImpl(PNameFactory.newName(alias), PNameFactory.newName(QueryConstants.DEFAULT_COLUMN_FAMILY), - null, 0, 0, true, position++, SortOrder.ASC, null, null, false, null, false, false); + null, 0, 0, true, position++, SortOrder.ASC, null, null, false, null, false, false, null); columns.add(column); } PTable t = PTableImpl.makePTable(null, PName.EMPTY_NAME, PName.EMPTY_NAME, http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 7f3277a..2a7c507 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 @@ -80,7 +80,7 @@ public class ListJarsQueryPlan implements QueryPlan { PColumn column = new PColumnImpl(PNameFactory.newName("jar_location"), null, PVarchar.INSTANCE, null, null, false, 0, SortOrder.getDefault(), 0, null, - false, null, false, false); + false, null, false, false, null); List<PColumn> columns = new ArrayList<PColumn>(); columns.add(column); Expression expression = http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 58cdb64..de63249 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 @@ -78,7 +78,7 @@ public class TraceQueryPlan implements QueryPlan { PColumn column = new PColumnImpl(PNameFactory.newName(MetricInfo.TRACE.columnName), null, PLong.INSTANCE, null, null, false, 0, SortOrder.getDefault(), 0, null, - false, null, false, false); + false, null, false, false, null); List<PColumn> columns = new ArrayList<PColumn>(); columns.add(column); Expression expression = http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 b25baf7..59de3f9 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 @@ -73,9 +73,10 @@ public class UnionCompiler { ColumnProjector colProj = plan.getProjector().getColumnProjector(i); Expression sourceExpression = colProj.getExpression(); String name = selectNodes == null ? colProj.getName() : selectNodes.get(i).getAlias(); + //TODO: samarth confirm this is the right change PColumnImpl projectedColumn = new PColumnImpl(PNameFactory.newName(name), UNION_FAMILY_NAME, sourceExpression.getDataType(), sourceExpression.getMaxLength(), sourceExpression.getScale(), sourceExpression.isNullable(), - i, sourceExpression.getSortOrder(), 500, null, false, sourceExpression.toString(), false, false); + i, sourceExpression.getSortOrder(), 500, null, false, sourceExpression.toString(), false, false, null); projectedColumns.add(projectedColumn); } Long scn = statement.getConnection().getSCN(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 bcfdf20..e962cb2 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 @@ -25,6 +25,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CLASS_NAME_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_COUNT_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_DEF_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_NAME_INDEX; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_QUALIFIER_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_SIZE_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TABLE_NAME_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TYPE_BYTES; @@ -309,6 +310,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso private static final KeyValue IS_VIEW_REFERENCED_KV = KeyValue.createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY, TABLE_FAMILY_BYTES, IS_VIEW_REFERENCED_BYTES); private static final KeyValue COLUMN_DEF_KV = KeyValue.createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY, TABLE_FAMILY_BYTES, COLUMN_DEF_BYTES); private static final KeyValue IS_ROW_TIMESTAMP_KV = KeyValue.createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY, TABLE_FAMILY_BYTES, IS_ROW_TIMESTAMP_BYTES); + private static final KeyValue COLUMN_QUALIFIER_KV = KeyValue.createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY, TABLE_FAMILY_BYTES, COLUMN_QUALIFIER_BYTES); private static final List<KeyValue> COLUMN_KV_COLUMNS = Arrays.<KeyValue>asList( DECIMAL_DIGITS_KV, COLUMN_SIZE_KV, @@ -321,7 +323,8 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso VIEW_CONSTANT_KV, IS_VIEW_REFERENCED_KV, COLUMN_DEF_KV, - IS_ROW_TIMESTAMP_KV + IS_ROW_TIMESTAMP_KV, + COLUMN_QUALIFIER_KV ); static { Collections.sort(COLUMN_KV_COLUMNS, KeyValue.COMPARATOR); @@ -337,6 +340,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso private static final int IS_VIEW_REFERENCED_INDEX = COLUMN_KV_COLUMNS.indexOf(IS_VIEW_REFERENCED_KV); private static final int COLUMN_DEF_INDEX = COLUMN_KV_COLUMNS.indexOf(COLUMN_DEF_KV); private static final int IS_ROW_TIMESTAMP_INDEX = COLUMN_KV_COLUMNS.indexOf(IS_ROW_TIMESTAMP_KV); + private static final int COLUMN_QUALIFIER_INDEX = COLUMN_KV_COLUMNS.indexOf(COLUMN_QUALIFIER_KV); private static final int LINK_TYPE_INDEX = 0; @@ -642,8 +646,11 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso isRowTimestampKV == null ? false : Boolean.TRUE.equals(PBoolean.INSTANCE.toObject( isRowTimestampKV.getValueArray(), isRowTimestampKV.getValueOffset(), isRowTimestampKV.getValueLength())); + Cell columnQualifierKV = colKeyValues[COLUMN_QUALIFIER_INDEX]; + Integer columnQualifier = columnQualifierKV == null ? null : + PInteger.INSTANCE.getCodec().decodeInt(columnQualifierKV.getValueArray(), columnQualifierKV.getValueOffset(), SortOrder.getDefault()); - PColumn column = new PColumnImpl(colName, famName, dataType, maxLength, scale, isNullable, position-1, sortOrder, arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, false); + PColumn column = new PColumnImpl(colName, famName, dataType, maxLength, scale, isNullable, position-1, sortOrder, arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, false, columnQualifier); columns.add(column); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PTableProtos.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PTableProtos.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PTableProtos.java index 9fdfe51..090fd59 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PTableProtos.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/generated/PTableProtos.java @@ -269,6 +269,16 @@ public final class PTableProtos { * <code>optional bool isDynamic = 14;</code> */ boolean getIsDynamic(); + + // optional int32 columnQualifier = 15; + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + boolean hasColumnQualifier(); + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + int getColumnQualifier(); } /** * Protobuf type {@code PColumn} @@ -391,6 +401,11 @@ public final class PTableProtos { isDynamic_ = input.readBool(); break; } + case 120: { + bitField0_ |= 0x00004000; + columnQualifier_ = input.readInt32(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -709,6 +724,22 @@ public final class PTableProtos { return isDynamic_; } + // optional int32 columnQualifier = 15; + public static final int COLUMNQUALIFIER_FIELD_NUMBER = 15; + private int columnQualifier_; + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public boolean hasColumnQualifier() { + return ((bitField0_ & 0x00004000) == 0x00004000); + } + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public int getColumnQualifier() { + return columnQualifier_; + } + private void initFields() { columnNameBytes_ = com.google.protobuf.ByteString.EMPTY; familyNameBytes_ = com.google.protobuf.ByteString.EMPTY; @@ -724,6 +755,7 @@ public final class PTableProtos { expression_ = ""; isRowTimestamp_ = false; isDynamic_ = false; + columnQualifier_ = 0; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -799,6 +831,9 @@ public final class PTableProtos { if (((bitField0_ & 0x00002000) == 0x00002000)) { output.writeBool(14, isDynamic_); } + if (((bitField0_ & 0x00004000) == 0x00004000)) { + output.writeInt32(15, columnQualifier_); + } getUnknownFields().writeTo(output); } @@ -864,6 +899,10 @@ public final class PTableProtos { size += com.google.protobuf.CodedOutputStream .computeBoolSize(14, isDynamic_); } + if (((bitField0_ & 0x00004000) == 0x00004000)) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(15, columnQualifier_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -957,6 +996,11 @@ public final class PTableProtos { result = result && (getIsDynamic() == other.getIsDynamic()); } + result = result && (hasColumnQualifier() == other.hasColumnQualifier()); + if (hasColumnQualifier()) { + result = result && (getColumnQualifier() + == other.getColumnQualifier()); + } result = result && getUnknownFields().equals(other.getUnknownFields()); return result; @@ -1026,6 +1070,10 @@ public final class PTableProtos { hash = (37 * hash) + ISDYNAMIC_FIELD_NUMBER; hash = (53 * hash) + hashBoolean(getIsDynamic()); } + if (hasColumnQualifier()) { + hash = (37 * hash) + COLUMNQUALIFIER_FIELD_NUMBER; + hash = (53 * hash) + getColumnQualifier(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -1163,6 +1211,8 @@ public final class PTableProtos { bitField0_ = (bitField0_ & ~0x00001000); isDynamic_ = false; bitField0_ = (bitField0_ & ~0x00002000); + columnQualifier_ = 0; + bitField0_ = (bitField0_ & ~0x00004000); return this; } @@ -1247,6 +1297,10 @@ public final class PTableProtos { to_bitField0_ |= 0x00002000; } result.isDynamic_ = isDynamic_; + if (((from_bitField0_ & 0x00004000) == 0x00004000)) { + to_bitField0_ |= 0x00004000; + } + result.columnQualifier_ = columnQualifier_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -1309,6 +1363,9 @@ public final class PTableProtos { if (other.hasIsDynamic()) { setIsDynamic(other.getIsDynamic()); } + if (other.hasColumnQualifier()) { + setColumnQualifier(other.getColumnQualifier()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -1909,6 +1966,39 @@ public final class PTableProtos { return this; } + // optional int32 columnQualifier = 15; + private int columnQualifier_ ; + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public boolean hasColumnQualifier() { + return ((bitField0_ & 0x00004000) == 0x00004000); + } + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public int getColumnQualifier() { + return columnQualifier_; + } + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public Builder setColumnQualifier(int value) { + bitField0_ |= 0x00004000; + columnQualifier_ = value; + onChanged(); + return this; + } + /** + * <code>optional int32 columnQualifier = 15;</code> + */ + public Builder clearColumnQualifier() { + bitField0_ = (bitField0_ & ~0x00004000); + columnQualifier_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:PColumn) } @@ -7089,7 +7179,7 @@ public final class PTableProtos { descriptor; static { java.lang.String[] descriptorData = { - "\n\014PTable.proto\032\021PGuidePosts.proto\"\246\002\n\007PC" + + "\n\014PTable.proto\032\021PGuidePosts.proto\"\277\002\n\007PC" + "olumn\022\027\n\017columnNameBytes\030\001 \002(\014\022\027\n\017family" + "NameBytes\030\002 \001(\014\022\020\n\010dataType\030\003 \002(\t\022\021\n\tmax" + "Length\030\004 \001(\005\022\r\n\005scale\030\005 \001(\005\022\020\n\010nullable\030" + @@ -7097,32 +7187,32 @@ public final class PTableProtos { "(\005\022\021\n\tarraySize\030\t \001(\005\022\024\n\014viewConstant\030\n " + "\001(\014\022\026\n\016viewReferenced\030\013 \001(\010\022\022\n\nexpressio" + "n\030\014 \001(\t\022\026\n\016isRowTimestamp\030\r \001(\010\022\021\n\tisDyn" + - "amic\030\016 \001(\010\"\232\001\n\013PTableStats\022\013\n\003key\030\001 \002(\014\022" + - "\016\n\006values\030\002 \003(\014\022\033\n\023guidePostsByteCount\030\003", - " \001(\003\022\025\n\rkeyBytesCount\030\004 \001(\003\022\027\n\017guidePost" + - "sCount\030\005 \001(\005\022!\n\013pGuidePosts\030\006 \001(\0132\014.PGui" + - "dePosts\"\303\005\n\006PTable\022\027\n\017schemaNameBytes\030\001 " + - "\002(\014\022\026\n\016tableNameBytes\030\002 \002(\014\022\036\n\ttableType" + - "\030\003 \002(\0162\013.PTableType\022\022\n\nindexState\030\004 \001(\t\022" + - "\026\n\016sequenceNumber\030\005 \002(\003\022\021\n\ttimeStamp\030\006 \002" + - "(\003\022\023\n\013pkNameBytes\030\007 \001(\014\022\021\n\tbucketNum\030\010 \002" + - "(\005\022\031\n\007columns\030\t \003(\0132\010.PColumn\022\030\n\007indexes" + - "\030\n \003(\0132\007.PTable\022\027\n\017isImmutableRows\030\013 \002(\010" + - "\022 \n\nguidePosts\030\014 \003(\0132\014.PTableStats\022\032\n\022da", - "taTableNameBytes\030\r \001(\014\022\031\n\021defaultFamilyN" + - "ame\030\016 \001(\014\022\022\n\ndisableWAL\030\017 \002(\010\022\023\n\013multiTe" + - "nant\030\020 \002(\010\022\020\n\010viewType\030\021 \001(\014\022\025\n\rviewStat" + - "ement\030\022 \001(\014\022\025\n\rphysicalNames\030\023 \003(\014\022\020\n\010te" + - "nantId\030\024 \001(\014\022\023\n\013viewIndexId\030\025 \001(\005\022\021\n\tind" + - "exType\030\026 \001(\014\022\026\n\016statsTimeStamp\030\027 \001(\003\022\022\n\n" + - "storeNulls\030\030 \001(\010\022\027\n\017baseColumnCount\030\031 \001(" + - "\005\022\036\n\026rowKeyOrderOptimizable\030\032 \001(\010\022\025\n\rtra" + - "nsactional\030\033 \001(\010\022\034\n\024updateCacheFrequency" + - "\030\034 \001(\003\022\035\n\025indexDisableTimestamp\030\035 \001(\003*A\n", - "\nPTableType\022\n\n\006SYSTEM\020\000\022\010\n\004USER\020\001\022\010\n\004VIE" + - "W\020\002\022\t\n\005INDEX\020\003\022\010\n\004JOIN\020\004B@\n(org.apache.p" + - "hoenix.coprocessor.generatedB\014PTableProt" + - "osH\001\210\001\001\240\001\001" + "amic\030\016 \001(\010\022\027\n\017columnQualifier\030\017 \001(\005\"\232\001\n\013" + + "PTableStats\022\013\n\003key\030\001 \002(\014\022\016\n\006values\030\002 \003(\014", + "\022\033\n\023guidePostsByteCount\030\003 \001(\003\022\025\n\rkeyByte" + + "sCount\030\004 \001(\003\022\027\n\017guidePostsCount\030\005 \001(\005\022!\n" + + "\013pGuidePosts\030\006 \001(\0132\014.PGuidePosts\"\303\005\n\006PTa" + + "ble\022\027\n\017schemaNameBytes\030\001 \002(\014\022\026\n\016tableNam" + + "eBytes\030\002 \002(\014\022\036\n\ttableType\030\003 \002(\0162\013.PTable" + + "Type\022\022\n\nindexState\030\004 \001(\t\022\026\n\016sequenceNumb" + + "er\030\005 \002(\003\022\021\n\ttimeStamp\030\006 \002(\003\022\023\n\013pkNameByt" + + "es\030\007 \001(\014\022\021\n\tbucketNum\030\010 \002(\005\022\031\n\007columns\030\t" + + " \003(\0132\010.PColumn\022\030\n\007indexes\030\n \003(\0132\007.PTable" + + "\022\027\n\017isImmutableRows\030\013 \002(\010\022 \n\nguidePosts\030", + "\014 \003(\0132\014.PTableStats\022\032\n\022dataTableNameByte" + + "s\030\r \001(\014\022\031\n\021defaultFamilyName\030\016 \001(\014\022\022\n\ndi" + + "sableWAL\030\017 \002(\010\022\023\n\013multiTenant\030\020 \002(\010\022\020\n\010v" + + "iewType\030\021 \001(\014\022\025\n\rviewStatement\030\022 \001(\014\022\025\n\r" + + "physicalNames\030\023 \003(\014\022\020\n\010tenantId\030\024 \001(\014\022\023\n" + + "\013viewIndexId\030\025 \001(\005\022\021\n\tindexType\030\026 \001(\014\022\026\n" + + "\016statsTimeStamp\030\027 \001(\003\022\022\n\nstoreNulls\030\030 \001(" + + "\010\022\027\n\017baseColumnCount\030\031 \001(\005\022\036\n\026rowKeyOrde" + + "rOptimizable\030\032 \001(\010\022\025\n\rtransactional\030\033 \001(" + + "\010\022\034\n\024updateCacheFrequency\030\034 \001(\003\022\035\n\025index", + "DisableTimestamp\030\035 \001(\003*A\n\nPTableType\022\n\n\006" + + "SYSTEM\020\000\022\010\n\004USER\020\001\022\010\n\004VIEW\020\002\022\t\n\005INDEX\020\003\022" + + "\010\n\004JOIN\020\004B@\n(org.apache.phoenix.coproces" + + "sor.generatedB\014PTableProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -7134,7 +7224,7 @@ public final class PTableProtos { internal_static_PColumn_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_PColumn_descriptor, - new java.lang.String[] { "ColumnNameBytes", "FamilyNameBytes", "DataType", "MaxLength", "Scale", "Nullable", "Position", "SortOrder", "ArraySize", "ViewConstant", "ViewReferenced", "Expression", "IsRowTimestamp", "IsDynamic", }); + new java.lang.String[] { "ColumnNameBytes", "FamilyNameBytes", "DataType", "MaxLength", "Scale", "Nullable", "Position", "SortOrder", "ArraySize", "ViewConstant", "ViewReferenced", "Expression", "IsRowTimestamp", "IsDynamic", "ColumnQualifier", }); internal_static_PTableStats_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_PTableStats_fieldAccessorTable = new http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java index f875a77..440ae22 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java @@ -202,6 +202,8 @@ public class PhoenixDatabaseMetaData implements DatabaseMetaData { public static final byte[] BASE_COLUMN_COUNT_BYTES = Bytes.toBytes(BASE_COLUMN_COUNT); public static final String IS_ROW_TIMESTAMP = "IS_ROW_TIMESTAMP"; public static final byte[] IS_ROW_TIMESTAMP_BYTES = Bytes.toBytes(IS_ROW_TIMESTAMP); + public static final String COLUMN_QUALIFIER = "COLUMN_QUALIFIER"; + public static final byte[] COLUMN_QUALIFIER_BYTES = Bytes.toBytes(COLUMN_QUALIFIER); public static final String TABLE_FAMILY = QueryConstants.DEFAULT_COLUMN_FAMILY; public static final byte[] TABLE_FAMILY_BYTES = QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES; http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java index a8595e9..a9f1e87 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java @@ -569,6 +569,7 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement } } + @Override public PMetaData updateResolvedTimestamp(PTable table, long resolvedTime) throws SQLException { synchronized (latestMetaDataLock) { throwConnectionClosedIfNullMetaData(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java index 471ac73..6afe1d7 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java @@ -29,6 +29,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_COUNT; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_DEF; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_FAMILY; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_NAME; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_QUALIFIER; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_SIZE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CURRENT_VALUE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.CYCLE_FLAG; @@ -259,6 +260,7 @@ public interface QueryConstants { IS_ROW_TIMESTAMP + " BOOLEAN, " + TRANSACTIONAL + " BOOLEAN," + UPDATE_CACHE_FREQUENCY + " BIGINT," + + COLUMN_QUALIFIER + " INTEGER," + "CONSTRAINT " + SYSTEM_TABLE_PK_NAME + " PRIMARY KEY (" + TENANT_ID + "," + TABLE_SCHEM + "," + TABLE_NAME + "," + COLUMN_NAME + "," + COLUMN_FAMILY + "))\n" + HConstants.VERSIONS + "=" + MetaDataProtocol.DEFAULT_MAX_META_DATA_VERSIONS + ",\n" + http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateColumn.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateColumn.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateColumn.java index a60229e..65e362c 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateColumn.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateColumn.java @@ -90,4 +90,9 @@ public class DelegateColumn extends DelegateDatum implements PColumn { public boolean isDynamic() { return getDelegate().isDynamic(); } + + @Override + public Integer getColumnQualifier() { + return getDelegate().getColumnQualifier(); + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 7f3f850..b57bdb2 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 @@ -33,6 +33,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_COUNT; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_DEF; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_FAMILY; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_NAME; +import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_QUALIFIER; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_SIZE; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TABLE_NAME; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TYPE; @@ -321,8 +322,9 @@ public class MetaDataClient { PK_NAME + "," + // write this both in the column and table rows for access by metadata APIs KEY_SEQ + "," + COLUMN_DEF + "," + - IS_ROW_TIMESTAMP + - ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + COLUMN_QUALIFIER + "," + + IS_ROW_TIMESTAMP + + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; private static final String INSERT_COLUMN_ALTER_TABLE = "UPSERT INTO " + SYSTEM_CATALOG_SCHEMA + ".\"" + SYSTEM_CATALOG_TABLE + "\"( " + TENANT_ID + "," + @@ -747,8 +749,13 @@ public class MetaDataClient { } else { colUpsert.setString(18, column.getExpressionStr()); } - if (colUpsert.getParameterMetaData().getParameterCount() > 18) { - colUpsert.setBoolean(19, column.isRowTimestamp()); + if (column.getColumnQualifier() == null) { + colUpsert.setNull(19, Types.INTEGER); + } else { + colUpsert.setInt(19, column.getColumnQualifier()); + } + if (colUpsert.getParameterMetaData().getParameterCount() > 19) { + colUpsert.setBoolean(20, column.isRowTimestamp()); } colUpsert.execute(); } @@ -767,7 +774,7 @@ public class MetaDataClient { argUpsert.execute(); } - private PColumn newColumn(int position, ColumnDef def, PrimaryKeyConstraint pkConstraint, String defaultColumnFamily, boolean addingToPK) throws SQLException { + private PColumn newColumn(int position, ColumnDef def, PrimaryKeyConstraint pkConstraint, String defaultColumnFamily, boolean addingToPK, Map<String, Integer> columnQualifierTracker) throws SQLException { try { ColumnName columnDefName = def.getColumnDefName(); SortOrder sortOrder = def.getSortOrder(); @@ -815,15 +822,24 @@ public class MetaDataClient { } isNull = false; } - + Integer columnQualifier = null; + if (!isPK) { + columnQualifier = columnQualifierTracker.get(familyName); + if (columnQualifier == null) { + columnQualifier = 0; + } else { + columnQualifier++; + } + columnQualifierTracker.put(familyName.toString(), columnQualifier); + } PColumn column = new PColumnImpl(PNameFactory.newName(columnName), familyName, def.getDataType(), - def.getMaxLength(), def.getScale(), isNull, position, sortOrder, def.getArraySize(), null, false, def.getExpression(), isRowTimestamp, false); + def.getMaxLength(), def.getScale(), isNull, position, sortOrder, def.getArraySize(), null, false, def.getExpression(), isRowTimestamp, false, columnQualifier); return column; } catch (IllegalArgumentException e) { // Based on precondition check in constructor throw new SQLException(e); } } - + public MutationState createTable(CreateTableStatement statement, byte[][] splits, PTable parent, String viewStatement, ViewType viewType, byte[][] viewColumnConstants, BitSet isViewColumnReferenced) throws SQLException { PTable table = createTableInternal(statement, splits, parent, viewStatement, viewType, viewColumnConstants, isViewColumnReferenced, null, null, null); if (table == null || table.getType() == PTableType.VIEW || table.isTransactional()) { @@ -1842,7 +1858,7 @@ public class MetaDataClient { } int pkPositionOffset = pkColumns.size(); int position = positionOffset; - + Map<String, Integer> columnQualifierTracker = Maps.newHashMapWithExpectedSize(colDefs.size()); for (ColumnDef colDef : colDefs) { rowTimeStampColumnAlreadyFound = checkAndValidateRowTimestampCol(colDef, pkConstraint, rowTimeStampColumnAlreadyFound, tableType); if (colDef.isPK()) { // i.e. the column is declared as CREATE TABLE COLNAME DATATYPE PRIMARY KEY... @@ -1861,7 +1877,7 @@ public class MetaDataClient { .setColumnName(colDef.getColumnDefName().getColumnName()).build().buildException(); } } - PColumn column = newColumn(position++, colDef, pkConstraint, defaultFamilyName, false); + PColumn column = newColumn(position++, colDef, pkConstraint, defaultFamilyName, false, columnQualifierTracker); if (SchemaUtil.isPKColumn(column)) { // TODO: remove this constraint? if (pkColumnsIterator.hasNext() && !column.getName().getString().equals(pkColumnsIterator.next().getFirst().getColumnName())) { @@ -2084,6 +2100,7 @@ public class MetaDataClient { } tableUpsert.setBoolean(21, transactional); tableUpsert.setLong(22, updateCacheFrequency); + tableUpsert.execute(); if (asyncCreatedDate != null) { @@ -2701,6 +2718,7 @@ public class MetaDataClient { List<PColumn> columns = Lists.newArrayListWithExpectedSize(columnDefs.size()); Set<String> colFamiliesForPColumnsToBeAdded = new LinkedHashSet<>(); Set<String> families = new LinkedHashSet<>(); + Map<String, Integer> columnQualifiers = SchemaUtil.getNextColumnQualifiers(table); if (columnDefs.size() > 0 ) { try (PreparedStatement colUpsert = connection.prepareStatement(INSERT_COLUMN_ALTER_TABLE)) { short nextKeySeq = SchemaUtil.getMaxKeySeq(table); @@ -2721,7 +2739,7 @@ public class MetaDataClient { throw new SQLExceptionInfo.Builder(SQLExceptionCode.ROWTIMESTAMP_CREATE_ONLY) .setColumnName(colDef.getColumnDefName().getColumnName()).build().buildException(); } - PColumn column = newColumn(position++, colDef, PrimaryKeyConstraint.EMPTY, table.getDefaultFamilyName() == null ? null : table.getDefaultFamilyName().getString(), true); + PColumn column = newColumn(position++, colDef, PrimaryKeyConstraint.EMPTY, table.getDefaultFamilyName() == null ? null : table.getDefaultFamilyName().getString(), true, columnQualifiers); columns.add(column); String pkName = null; Short keySeq = null; @@ -2759,7 +2777,7 @@ public class MetaDataClient { ColumnName indexColName = ColumnName.caseSensitiveColumnName(IndexUtil.getIndexColumnName(null, colDef.getColumnDefName().getColumnName())); Expression expression = new RowKeyColumnExpression(columns.get(i), new RowKeyValueAccessor(pkColumns, ++pkSlotPosition)); ColumnDef indexColDef = FACTORY.columnDef(indexColName, indexColDataType.getSqlTypeName(), colDef.isNull(), colDef.getMaxLength(), colDef.getScale(), true, colDef.getSortOrder(), expression.toString(), colDef.isRowTimestamp()); - PColumn indexColumn = newColumn(indexPosition++, indexColDef, PrimaryKeyConstraint.EMPTY, null, true); + PColumn indexColumn = newColumn(indexPosition++, indexColDef, PrimaryKeyConstraint.EMPTY, null, true, columnQualifiers); addColumnMutation(schemaName, index.getTableName().getString(), indexColumn, colUpsert, index.getParentTableName().getString(), index.getPKName() == null ? null : index.getPKName().getString(), ++nextIndexKeySeq, index.getBucketNum() != null); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumn.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumn.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumn.java index 0f5fa44..b63c97b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumn.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumn.java @@ -27,7 +27,7 @@ package org.apache.phoenix.schema; public interface PColumn extends PDatum { /** - * @return the name of the column qualifier + * @return the name of the column */ PName getName(); @@ -60,4 +60,9 @@ public interface PColumn extends PDatum { boolean isRowTimestamp(); boolean isDynamic(); + + /** + * @return name of the HBase column qualifier + */ + Integer getColumnQualifier(); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java index a556f76..5cf1465 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PColumnImpl.java @@ -40,6 +40,7 @@ public class PColumnImpl implements PColumn { private String expressionStr; private boolean isRowTimestamp; private boolean isDynamic; + private Integer columnQualifier; public PColumnImpl() { } @@ -51,13 +52,13 @@ public class PColumnImpl implements PColumn { Integer scale, boolean nullable, int position, - SortOrder sortOrder, Integer arrSize, byte[] viewConstant, boolean isViewReferenced, String expressionStr, boolean isRowTimestamp, boolean isDynamic) { - init(name, familyName, dataType, maxLength, scale, nullable, position, sortOrder, arrSize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, isDynamic); + SortOrder sortOrder, Integer arrSize, byte[] viewConstant, boolean isViewReferenced, String expressionStr, boolean isRowTimestamp, boolean isDynamic, Integer columnQualifier) { + init(name, familyName, dataType, maxLength, scale, nullable, position, sortOrder, arrSize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, isDynamic, columnQualifier); } public PColumnImpl(PColumn column, int position) { this(column.getName(), column.getFamilyName(), column.getDataType(), column.getMaxLength(), - column.getScale(), column.isNullable(), position, column.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic()); + column.getScale(), column.isNullable(), position, column.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic(), column.getColumnQualifier()); } private void init(PName name, @@ -69,7 +70,7 @@ public class PColumnImpl implements PColumn { int position, SortOrder sortOrder, Integer arrSize, - byte[] viewConstant, boolean isViewReferenced, String expressionStr, boolean isRowTimestamp, boolean isDynamic) { + byte[] viewConstant, boolean isViewReferenced, String expressionStr, boolean isRowTimestamp, boolean isDynamic, Integer columnQualifier) { Preconditions.checkNotNull(sortOrder); this.dataType = dataType; if (familyName == null) { @@ -94,6 +95,7 @@ public class PColumnImpl implements PColumn { this.expressionStr = expressionStr; this.isRowTimestamp = isRowTimestamp; this.isDynamic = isDynamic; + this.columnQualifier = columnQualifier; } @Override @@ -205,6 +207,11 @@ public class PColumnImpl implements PColumn { public boolean isDynamic() { return isDynamic; } + + @Override + public Integer getColumnQualifier() { + return columnQualifier; + } /** * Create a PColumn instance from PBed PColumn instance @@ -251,8 +258,12 @@ public class PColumnImpl implements PColumn { if (column.hasIsDynamic()) { isDynamic = column.getIsDynamic(); } + Integer columnQualifier = null; + if (column.hasColumnQualifier()) { + columnQualifier = column.getColumnQualifier(); + } return new PColumnImpl(columnName, familyName, dataType, maxLength, scale, nullable, position, sortOrder, - arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, isDynamic); + arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, isDynamic, columnQualifier); } public static PTableProtos.PColumn toProto(PColumn column) { @@ -283,6 +294,9 @@ public class PColumnImpl implements PColumn { builder.setExpression(column.getExpressionStr()); } builder.setIsRowTimestamp(column.isRowTimestamp()); + if (column.getColumnQualifier() != null) { + builder.setColumnQualifier(column.getColumnQualifier()); + } return builder.build(); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/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 413d116..91969dc 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 @@ -414,7 +414,7 @@ public class PMetaDataImpl implements PMetaData { // Update position of columns that follow removed column for (int i = position+1; i < oldColumns.size(); i++) { PColumn oldColumn = oldColumns.get(i); - PColumn newColumn = new PColumnImpl(oldColumn.getName(), oldColumn.getFamilyName(), oldColumn.getDataType(), oldColumn.getMaxLength(), oldColumn.getScale(), oldColumn.isNullable(), i-1+positionOffset, oldColumn.getSortOrder(), oldColumn.getArraySize(), oldColumn.getViewConstant(), oldColumn.isViewReferenced(), null, oldColumn.isRowTimestamp(), oldColumn.isDynamic()); + PColumn newColumn = new PColumnImpl(oldColumn.getName(), oldColumn.getFamilyName(), oldColumn.getDataType(), oldColumn.getMaxLength(), oldColumn.getScale(), oldColumn.isNullable(), i-1+positionOffset, oldColumn.getSortOrder(), oldColumn.getArraySize(), oldColumn.getViewConstant(), oldColumn.isViewReferenced(), null, oldColumn.isRowTimestamp(), oldColumn.isDynamic(), oldColumn.getColumnQualifier()); columns.add(newColumn); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java index 734a9ed..23cfd1b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/SaltingUtil.java @@ -38,7 +38,7 @@ public class SaltingUtil { public static final String SALTING_COLUMN_NAME = "_SALT"; public static final String SALTED_ROW_KEY_NAME = "_SALTED_KEY"; public static final PColumnImpl SALTING_COLUMN = new PColumnImpl( - PNameFactory.newName(SALTING_COLUMN_NAME), null, PBinary.INSTANCE, 1, 0, false, 0, SortOrder.getDefault(), 0, null, false, null, false, false); + PNameFactory.newName(SALTING_COLUMN_NAME), null, PBinary.INSTANCE, 1, 0, false, 0, SortOrder.getDefault(), 0, null, false, null, false, false, null); public static final RowKeySchema VAR_BINARY_SALTED_SCHEMA = new RowKeySchemaBuilder(2) .addField(SALTING_COLUMN, false, SortOrder.getDefault()) .addField(SchemaUtil.VAR_BINARY_DATUM, false, SortOrder.getDefault()).build(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java index 523f684..b65119a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java @@ -897,4 +897,18 @@ public class SchemaUtil { PName schemaName = dataTable.getSchemaName(); return getTableKey(tenantId == null ? ByteUtil.EMPTY_BYTE_ARRAY : tenantId.getBytes(), schemaName == null ? ByteUtil.EMPTY_BYTE_ARRAY : schemaName.getBytes(), dataTable.getTableName().getBytes()); } + + + /** + * Return a map of column family -> next column qualifier number to use. + */ + public static Map<String, Integer> getNextColumnQualifiers(PTable table) { + Map<String, Integer> map = Maps.newHashMapWithExpectedSize(table.getColumns().size()); + for (PColumnFamily f : table.getColumnFamilies()) { + final int size = f.getColumns().size(); + int nextColumnQualifier = size == 0 ? 0 : size; + map.put(f.getName().getString(), nextColumnQualifier); + } + return map; + } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/test/java/org/apache/phoenix/execute/CorrelatePlanTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/execute/CorrelatePlanTest.java b/phoenix-core/src/test/java/org/apache/phoenix/execute/CorrelatePlanTest.java index a8757ab..de706ff 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/execute/CorrelatePlanTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/execute/CorrelatePlanTest.java @@ -226,7 +226,7 @@ public class CorrelatePlanTest { Expression expr = LiteralExpression.newConstant(row[i]); columns.add(new PColumnImpl(PNameFactory.newName(name), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), expr.getDataType(), expr.getMaxLength(), expr.getScale(), expr.isNullable(), - i, expr.getSortOrder(), null, null, false, name, false, false)); + i, expr.getSortOrder(), null, null, false, name, false, false, null)); } try { PTable pTable = PTableImpl.makePTable(null, PName.EMPTY_NAME, PName.EMPTY_NAME, http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/test/java/org/apache/phoenix/execute/UnnestArrayPlanTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/execute/UnnestArrayPlanTest.java b/phoenix-core/src/test/java/org/apache/phoenix/execute/UnnestArrayPlanTest.java index 8b2b096..93203a5 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/execute/UnnestArrayPlanTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/execute/UnnestArrayPlanTest.java @@ -116,8 +116,8 @@ public class UnnestArrayPlanTest { LiteralExpression dummy = LiteralExpression.newConstant(null, arrayType); RowKeyValueAccessor accessor = new RowKeyValueAccessor(Arrays.asList(dummy), 0); UnnestArrayPlan plan = new UnnestArrayPlan(subPlan, new RowKeyColumnExpression(dummy, accessor), withOrdinality); - PColumn elemColumn = new PColumnImpl(PNameFactory.newName("ELEM"), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), baseType, null, null, true, 0, SortOrder.getDefault(), null, null, false, "", false, false); - PColumn indexColumn = withOrdinality ? new PColumnImpl(PNameFactory.newName("IDX"), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), PInteger.INSTANCE, null, null, true, 0, SortOrder.getDefault(), null, null, false, "", false, false) : null; + PColumn elemColumn = new PColumnImpl(PNameFactory.newName("ELEM"), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), baseType, null, null, true, 0, SortOrder.getDefault(), null, null, false, "", false, false, null); + PColumn indexColumn = withOrdinality ? new PColumnImpl(PNameFactory.newName("IDX"), PNameFactory.newName(TupleProjector.VALUE_COLUMN_FAMILY), PInteger.INSTANCE, null, null, true, 0, SortOrder.getDefault(), null, null, false, "", false, false, null) : null; List<PColumn> columns = withOrdinality ? Arrays.asList(elemColumn, indexColumn) : Arrays.asList(elemColumn); ProjectedColumnExpression elemExpr = new ProjectedColumnExpression(elemColumn, columns, 0, elemColumn.getName().getString()); ProjectedColumnExpression indexExpr = withOrdinality ? new ProjectedColumnExpression(indexColumn, columns, 1, indexColumn.getName().getString()) : null; http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/test/java/org/apache/phoenix/expression/ColumnExpressionTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/expression/ColumnExpressionTest.java b/phoenix-core/src/test/java/org/apache/phoenix/expression/ColumnExpressionTest.java index 7ee579c..e55068d 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/expression/ColumnExpressionTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/expression/ColumnExpressionTest.java @@ -41,7 +41,7 @@ public class ColumnExpressionTest { int maxLen = 30; int scale = 5; PColumn column = new PColumnImpl(PNameFactory.newName("c1"), PNameFactory.newName("f1"), PDecimal.INSTANCE, maxLen, scale, - true, 20, SortOrder.getDefault(), 0, null, false, null, false, false); + true, 20, SortOrder.getDefault(), 0, null, false, null, false, false, null); ColumnExpression colExp = new KeyValueColumnExpression(column); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dOut = new DataOutputStream(baos); @@ -61,7 +61,7 @@ public class ColumnExpressionTest { public void testSerializationWithNullScale() throws Exception { int maxLen = 30; PColumn column = new PColumnImpl(PNameFactory.newName("c1"), PNameFactory.newName("f1"), PBinary.INSTANCE, maxLen, null, - true, 20, SortOrder.getDefault(), 0, null, false, null, false, false); + true, 20, SortOrder.getDefault(), 0, null, false, null, false, false, null); ColumnExpression colExp = new KeyValueColumnExpression(column); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dOut = new DataOutputStream(baos); @@ -81,7 +81,7 @@ public class ColumnExpressionTest { public void testSerializationWithNullMaxLength() throws Exception { int scale = 5; PColumn column = new PColumnImpl(PNameFactory.newName("c1"), PNameFactory.newName("f1"), PVarchar.INSTANCE, null, scale, - true, 20, SortOrder.getDefault(), 0, null, false, null, false, false); + true, 20, SortOrder.getDefault(), 0, null, false, null, false, false, null); ColumnExpression colExp = new KeyValueColumnExpression(column); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dOut = new DataOutputStream(baos); @@ -100,7 +100,7 @@ public class ColumnExpressionTest { @Test public void testSerializationWithNullScaleAndMaxLength() throws Exception { PColumn column = new PColumnImpl(PNameFactory.newName("c1"), PNameFactory.newName("f1"), PDecimal.INSTANCE, null, null, true, - 20, SortOrder.getDefault(), 0, null, false, null, false, false); + 20, SortOrder.getDefault(), 0, null, false, null, false, false, null); ColumnExpression colExp = new KeyValueColumnExpression(column); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dOut = new DataOutputStream(baos); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java index f53e871..1ab606a 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/iterate/AggregateResultScannerTest.java @@ -137,6 +137,10 @@ public class AggregateResultScannerTest extends BaseConnectionlessQueryTest { public boolean isDynamic() { return false; } + @Override + public Integer getColumnQualifier() { + return null; + } })), null); aggregationManager.setAggregators(new ClientAggregators(Collections.<SingleAggregateFunction>singletonList(func), 1)); ResultIterators iterators = new ResultIterators() { http://git-wip-us.apache.org/repos/asf/phoenix/blob/f7c1d45a/phoenix-protocol/src/main/PTable.proto ---------------------------------------------------------------------- diff --git a/phoenix-protocol/src/main/PTable.proto b/phoenix-protocol/src/main/PTable.proto index 09bdeb6..f1ed0d4 100644 --- a/phoenix-protocol/src/main/PTable.proto +++ b/phoenix-protocol/src/main/PTable.proto @@ -49,6 +49,7 @@ message PColumn { optional string expression = 12; optional bool isRowTimestamp = 13; optional bool isDynamic = 14; + optional int32 columnQualifier = 15; } message PTableStats {