Refactor code to store and use column qualifiers in SYSTEM.CATALOG
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/f955c025 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/f955c025 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/f955c025 Branch: refs/heads/encodecolumns2 Commit: f955c025cf358f3d7be47f8c935a403e7d387b6e Parents: 7041c56 Author: Samarth <samarth.j...@salesforce.com> Authored: Wed Dec 21 13:15:02 2016 -0800 Committer: Samarth <samarth.j...@salesforce.com> Committed: Wed Dec 21 13:15:02 2016 -0800 ---------------------------------------------------------------------- .../apache/phoenix/end2end/AlterTableIT.java | 7 +- .../apache/phoenix/end2end/StoreNullsIT.java | 10 +- .../phoenix/end2end/index/DropMetadataIT.java | 4 +- .../apache/phoenix/compile/FromCompiler.java | 19 ++- .../apache/phoenix/compile/JoinCompiler.java | 9 +- .../phoenix/compile/ListJarsQueryPlan.java | 6 +- .../apache/phoenix/compile/PostDDLCompiler.java | 2 +- .../phoenix/compile/ProjectionCompiler.java | 14 +- .../apache/phoenix/compile/TraceQueryPlan.java | 4 +- .../compile/TupleProjectionCompiler.java | 8 +- .../apache/phoenix/compile/UnionCompiler.java | 3 +- .../apache/phoenix/compile/WhereCompiler.java | 3 +- .../coprocessor/BaseScannerRegionObserver.java | 1 + .../GroupedAggregateRegionObserver.java | 6 +- .../coprocessor/MetaDataEndpointImpl.java | 26 +-- .../phoenix/coprocessor/ScanRegionObserver.java | 11 +- .../UngroupedAggregateRegionObserver.java | 3 +- .../coprocessor/generated/PTableProtos.java | 157 ++++++++++--------- .../apache/phoenix/execute/BaseQueryPlan.java | 2 +- .../expression/ArrayColumnExpression.java | 30 +++- .../expression/KeyValueColumnExpression.java | 30 ++-- .../apache/phoenix/index/IndexMaintainer.java | 29 ++-- .../phoenix/iterate/BaseResultIterators.java | 23 +-- .../iterate/RegionScannerResultIterator.java | 7 +- .../phoenix/jdbc/PhoenixDatabaseMetaData.java | 4 +- .../mapreduce/FormatToBytesWritableMapper.java | 2 +- .../mapreduce/FormatToKeyValueReducer.java | 2 +- .../apache/phoenix/query/QueryConstants.java | 18 ++- .../org/apache/phoenix/schema/ColumnRef.java | 6 +- .../apache/phoenix/schema/DelegateColumn.java | 4 +- .../apache/phoenix/schema/MetaDataClient.java | 34 ++-- .../java/org/apache/phoenix/schema/PColumn.java | 2 +- .../phoenix/schema/PColumnFamilyImpl.java | 41 +++-- .../org/apache/phoenix/schema/PColumnImpl.java | 28 ++-- .../apache/phoenix/schema/PMetaDataImpl.java | 2 +- .../java/org/apache/phoenix/schema/PTable.java | 135 +++++++--------- .../org/apache/phoenix/schema/PTableImpl.java | 118 ++++++++++---- .../apache/phoenix/schema/ProjectedColumn.java | 11 +- .../tuple/EncodedColumnQualiferCellsList.java | 19 ++- .../tuple/PositionBasedMultiKeyValueTuple.java | 3 +- .../schema/tuple/PositionBasedResultTuple.java | 3 +- .../apache/phoenix/util/EncodedColumnsUtil.java | 77 +++++---- .../java/org/apache/phoenix/util/IndexUtil.java | 9 +- .../phoenix/compile/WhereCompilerTest.java | 4 +- .../phoenix/execute/CorrelatePlanTest.java | 3 +- .../execute/LiteralResultIteratorPlanTest.java | 3 +- .../phoenix/execute/UnnestArrayPlanTest.java | 7 +- .../expression/ColumnExpressionTest.java | 35 +++-- .../EncodedColumnQualifierCellsListTest.java | 98 ++++++------ .../java/org/apache/phoenix/util/TestUtil.java | 10 +- phoenix-protocol/src/main/PTable.proto | 2 +- 51 files changed, 601 insertions(+), 493 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 3084a92..91e9964 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 @@ -20,8 +20,8 @@ package org.apache.phoenix.end2end; import static org.apache.hadoop.hbase.HColumnDescriptor.DEFAULT_REPLICATION_SCOPE; 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_QUALIFIER_COUNTER; -import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ENCODED_COLUMN_QUALIFIER; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_NAME; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_SCHEM; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_SEQ_NUM; @@ -65,6 +65,7 @@ import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTable.EncodedCQCounter; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.TableNotFoundException; import org.apache.phoenix.util.IndexUtil; @@ -2454,7 +2455,7 @@ public class AlterTableIT extends ParallelStatsDisabledIT { } private void assertEncodedCQValue(String columnFamily, String columnName, String schemaName, String tableName, int expectedValue) throws Exception { - String query = "SELECT " + ENCODED_COLUMN_QUALIFIER + " FROM SYSTEM.CATALOG WHERE " + TABLE_SCHEM + " = ? AND " + TABLE_NAME + String query = "SELECT " + COLUMN_QUALIFIER + " FROM SYSTEM.CATALOG WHERE " + TABLE_SCHEM + " = ? AND " + TABLE_NAME + " = ? " + " AND " + COLUMN_FAMILY + " = ?" + " AND " + COLUMN_NAME + " = ?"; try (Connection conn = DriverManager.getConnection(getUrl())) { PreparedStatement stmt = conn.prepareStatement(query); @@ -2464,7 +2465,7 @@ public class AlterTableIT extends ParallelStatsDisabledIT { stmt.setString(4, columnName); ResultSet rs = stmt.executeQuery(); assertTrue(rs.next()); - assertEquals(expectedValue, rs.getInt(1)); + assertTrue(Bytes.equals(QualifierEncodingScheme.FOUR_BYTE_QUALIFIERS.getEncodedBytes(expectedValue), rs.getBytes(1))); assertFalse(rs.next()); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java index 07fc4e9..8e1db17 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/StoreNullsIT.java @@ -17,14 +17,11 @@ */ package org.apache.phoenix.end2end; -import static org.apache.phoenix.query.QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES; -import static org.apache.phoenix.query.QueryConstants.ENCODED_EMPTY_COLUMN_BYTES; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; @@ -34,24 +31,21 @@ import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.HTable; 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.expression.ArrayColumnExpression; import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; import org.apache.phoenix.jdbc.PhoenixConnection; -import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PColumn; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.PTableKey; import org.apache.phoenix.schema.tuple.ResultTuple; import org.apache.phoenix.schema.types.PVarchar; import org.apache.phoenix.util.ByteUtil; import org.apache.phoenix.util.PhoenixRuntime; -import org.apache.phoenix.util.SchemaUtil; import org.apache.phoenix.util.TestUtil; import org.junit.After; import org.junit.Before; @@ -127,7 +121,7 @@ public class StoreNullsIT extends ParallelStatsDisabledIT { Result rs = scanner.next(); assertTrue(rs.size() == 2); // 2 because it also includes the empty key value column PColumn nameColumn = conn.unwrap(PhoenixConnection.class).getTable(new PTableKey(null, tableName)).getPColumnForColumnName("NAME"); - ArrayColumnExpression colExpression = new ArrayColumnExpression(nameColumn, "NAME", true); + ArrayColumnExpression colExpression = new ArrayColumnExpression(nameColumn, "NAME", QualifierEncodingScheme.FOUR_BYTE_QUALIFIERS); ImmutableBytesPtr ptr = new ImmutableBytesPtr(); colExpression.evaluate(new ResultTuple(rs), ptr); assertEquals(new ImmutableBytesPtr(PVarchar.INSTANCE.toBytes("v1")), ptr); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java index b892c4d..c769fdd 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/DropMetadataIT.java @@ -187,7 +187,7 @@ public class DropMetadataIT extends ParallelStatsDisabledIT { Result result = results.next(); assertNotNull(result); assertNotNull("localIndexTableName2 row is missing", result.getValue(QueryConstants.DEFAULT_LOCAL_INDEX_COLUMN_FAMILY_BYTES, - EncodedColumnsUtil.getColumnQualifier(localIndex2.getPColumnForColumnName(IndexUtil.getIndexColumnName(QueryConstants.DEFAULT_COLUMN_FAMILY, "V1")), localIndex2))); + localIndex2.getPColumnForColumnName(IndexUtil.getIndexColumnName(QueryConstants.DEFAULT_COLUMN_FAMILY, "V1")).getColumnQualifierBytes())); assertNull(results.next()); } } @@ -300,7 +300,7 @@ public class DropMetadataIT extends ParallelStatsDisabledIT { assertNotNull(result); PTable viewIndexPTable = pconn.getTable(new PTableKey(pconn.getTenantId(), viewIndex2)); PColumn column = viewIndexPTable.getPColumnForColumnName(IndexUtil.getIndexColumnName(QueryConstants.DEFAULT_COLUMN_FAMILY, "V4")); - byte[] cq = EncodedColumnsUtil.getColumnQualifier(column, viewIndexPTable); + byte[] cq = column.getColumnQualifierBytes(); // there should be a single row belonging to VIEWINDEX2 assertNotNull(viewIndex2 + " row is missing", result.getValue(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, cq)); assertNull(results.next()); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 8d00996..1a14c7f 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 @@ -17,6 +17,8 @@ */ package org.apache.phoenix.compile; +import static org.apache.phoenix.schema.PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS; + import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.util.ArrayList; @@ -28,6 +30,7 @@ import java.util.Map; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.coprocessor.MetaDataProtocol; import org.apache.phoenix.coprocessor.MetaDataProtocol.MetaDataMutationResult; import org.apache.phoenix.expression.Expression; @@ -189,7 +192,7 @@ public class FromCompiler { if (htable != null) Closeables.closeQuietly(htable); } tableNode = NamedTableNode.create(null, baseTable, statement.getColumnDefs()); - return new SingleTableColumnResolver(connection, tableNode, e.getTimeStamp(), new HashMap<String, UDFParseNode>(1), false, false); + return new SingleTableColumnResolver(connection, tableNode, e.getTimeStamp(), new HashMap<String, UDFParseNode>(1), false); } throw e; } @@ -261,7 +264,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.getEncodedColumnQualifier()); + column.getPosition(), sourceExpression.getSortOrder(), column.getArraySize(), column.getViewConstant(), column.isViewReferenced(), column.getExpressionStr(), column.isRowTimestamp(), column.isDynamic(), column.getColumnQualifierBytes()); projectedColumns.add(projectedColumn); } PTable t = PTableImpl.makePTable(table, projectedColumns); @@ -336,12 +339,12 @@ public class FromCompiler { private final String alias; private final List<PSchema> schemas; - public SingleTableColumnResolver(PhoenixConnection connection, NamedTableNode table, long timeStamp, Map<String, UDFParseNode> udfParseNodes, boolean isNamespaceMapped, boolean useEncodedColumnNames) throws SQLException { + public SingleTableColumnResolver(PhoenixConnection connection, NamedTableNode table, long timeStamp, Map<String, UDFParseNode> udfParseNodes, boolean isNamespaceMapped) throws SQLException { super(connection, 0, false, udfParseNodes); List<PColumnFamily> families = Lists.newArrayListWithExpectedSize(table.getDynamicColumns().size()); for (ColumnDef def : table.getDynamicColumns()) { if (def.getColumnDefName().getFamilyName() != null) { - families.add(new PColumnFamilyImpl(PNameFactory.newName(def.getColumnDefName().getFamilyName()),Collections.<PColumn>emptyList(), useEncodedColumnNames)); + families.add(new PColumnFamilyImpl(PNameFactory.newName(def.getColumnDefName().getFamilyName()),Collections.<PColumn>emptyList()));//, NON_ENCODED_QUALIFIERS)); } } Long scn = connection.getSCN(); @@ -349,6 +352,8 @@ 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); theTable = this.addDynamicColumns(table.getDynamicColumns(), theTable); @@ -675,9 +680,8 @@ public class FromCompiler { theTable.getColumnFamily(family); // Verifies that column family exists familyName = PNameFactory.newName(family); } - // Dynamic columns don't have an encoded column name 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, null)); + dynColumn.getScale(), dynColumn.isNull(), position, dynColumn.getSortOrder(), dynColumn.getArraySize(), null, false, dynColumn.getExpression(), false, true, Bytes.toBytes(dynColumn.getColumnDefName().getColumnName()))); position++; } theTable = PTableImpl.makePTable(theTable, allcolumns); @@ -779,9 +783,10 @@ public class FromCompiler { // referenced by an outer wild-card select. alias = String.valueOf(position); } + PName name = PNameFactory.newName(alias); 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); + null, 0, 0, true, position++, SortOrder.ASC, null, null, false, null, false, false, name.getBytes()); columns.add(column); } PTable t = PTableImpl.makePTable(null, PName.EMPTY_NAME, PName.EMPTY_NAME, PTableType.SUBQUERY, null, http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 b72c550..1db28f5 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,9 @@ */ package org.apache.phoenix.compile; +import static org.apache.phoenix.schema.PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS; +import static org.apache.phoenix.schema.PTable.StorageScheme.ONE_CELL_PER_KEYVALUE_COLUMN; + import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; @@ -1287,7 +1290,7 @@ public class JoinCompiler { if (type == JoinType.Full) { for (PColumn c : left.getColumns()) { merged.add(new ProjectedColumn(c.getName(), c.getFamilyName(), - c.getPosition(), true, ((ProjectedColumn) c).getSourceColumnRef())); + c.getPosition(), true, ((ProjectedColumn) c).getSourceColumnRef(), SchemaUtil.isPKColumn(c) ? null : c.getName().getBytes())); } } else { merged.addAll(left.getColumns()); @@ -1297,7 +1300,7 @@ public class JoinCompiler { if (!SchemaUtil.isPKColumn(c)) { PColumn column = new ProjectedColumn(c.getName(), c.getFamilyName(), position++, type == JoinType.Inner ? c.isNullable() : true, - ((ProjectedColumn) c).getSourceColumnRef()); + ((ProjectedColumn) c).getSourceColumnRef(), c.getName().getBytes()); merged.add(column); } } @@ -1313,7 +1316,7 @@ public class JoinCompiler { left.isMultiTenant(), left.getStoreNulls(), left.getViewType(), left.getViewIndexId(), left.getIndexType(), left.rowKeyOrderOptimizable(), left.isTransactional(), left.getUpdateCacheFrequency(), left.getIndexDisableTimestamp(), left.isNamespaceMapped(), - left.getAutoPartitionSeqName(), left.isAppendOnlySchema(), StorageScheme.ONE_CELL_PER_KEYVALUE_COLUMN, QualifierEncodingScheme.NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER); + left.getAutoPartitionSeqName(), left.isAppendOnlySchema(), ONE_CELL_PER_KEYVALUE_COLUMN, NON_ENCODED_QUALIFIERS, PTable.EncodedCQCounter.NULL_COUNTER); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 436e69b..8265de8 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 @@ -57,6 +57,7 @@ import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.query.QueryServices; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PColumnImpl; +import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.schema.RowKeyValueAccessor; import org.apache.phoenix.schema.SortOrder; @@ -77,10 +78,11 @@ public class ListJarsQueryPlan implements QueryPlan { static { List<ExpressionProjector> projectedColumns = new ArrayList<ExpressionProjector>(); + PName colName = PNameFactory.newName("jar_location"); PColumn column = - new PColumnImpl(PNameFactory.newName("jar_location"), null, + new PColumnImpl(colName, null, PVarchar.INSTANCE, null, null, false, 0, SortOrder.getDefault(), 0, null, - false, null, false, false, null); + false, null, false, false, colName.getBytes()); List<PColumn> columns = new ArrayList<PColumn>(); columns.add(column); Expression expression = http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java index 3820ee5..e4ef25f 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/PostDDLCompiler.java @@ -238,7 +238,7 @@ public class PostDDLCompiler { // data empty column family to stay the same, while the index empty column family // changes. PColumn column = deleteList.get(0); - byte[] cq = EncodedColumnsUtil.getColumnQualifier(column, tableRef.getTable()); + byte[] cq = column.getColumnQualifierBytes(); if (emptyCF == null) { scan.addColumn(column.getFamilyName().getBytes(), cq); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java index 25aee35..e2e7573 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/ProjectionCompiler.java @@ -485,11 +485,13 @@ public class ProjectionCompiler { } } else { for (byte[] cq : entry.getValue()) { - PColumn column = family.getPColumnForColumnQualifier(cq); - Integer maxLength = column.getMaxLength(); - int byteSize = column.getDataType().isFixedWidth() ? maxLength == null ? column.getDataType().getByteSize() : maxLength : RowKeySchema.ESTIMATED_VARIABLE_LENGTH_SIZE; - estimatedByteSize += SizedUtil.KEY_VALUE_SIZE + estimatedKeySize + byteSize; - } + //if (!Bytes.equals(cq, ByteUtil.EMPTY_BYTE_ARRAY) || cq.length > 0) { + PColumn column = family.getPColumnForColumnQualifier(cq); + Integer maxLength = column.getMaxLength(); + int byteSize = column.getDataType().isFixedWidth() ? maxLength == null ? column.getDataType().getByteSize() : maxLength : RowKeySchema.ESTIMATED_VARIABLE_LENGTH_SIZE; + estimatedByteSize += SizedUtil.KEY_VALUE_SIZE + estimatedKeySize + byteSize; + } + //} } } boolean isProjectEmptyKeyValue = false; @@ -665,7 +667,7 @@ public class ProjectionCompiler { if (expression.getDataType().isArrayType()) { indexProjectedColumns.add(expression); PColumn col = expression.getColumn(); - KeyValueColumnExpression keyValueColumnExpression = new KeyValueColumnExpression(col, EncodedColumnsUtil.hasEncodedColumnName(col)); + KeyValueColumnExpression keyValueColumnExpression = new KeyValueColumnExpression(col); indexKVs.add(keyValueColumnExpression); copyOfChildren.set(0, keyValueColumnExpression); Integer count = arrayExpressionCounts.get(expression); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 10260cb..8fb435d 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 @@ -51,6 +51,7 @@ import org.apache.phoenix.parse.TraceStatement; import org.apache.phoenix.query.KeyRange; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PColumnImpl; +import org.apache.phoenix.schema.PName; import org.apache.phoenix.schema.PNameFactory; import org.apache.phoenix.schema.RowKeyValueAccessor; import org.apache.phoenix.schema.SortOrder; @@ -75,10 +76,11 @@ public class TraceQueryPlan implements QueryPlan { private static final RowProjector TRACE_PROJECTOR; static { List<ExpressionProjector> projectedColumns = new ArrayList<ExpressionProjector>(); + PName colName = PNameFactory.newName(MetricInfo.TRACE.columnName); PColumn column = new PColumnImpl(PNameFactory.newName(MetricInfo.TRACE.columnName), null, PLong.INSTANCE, null, null, false, 0, SortOrder.getDefault(), 0, null, - false, null, false, false, null); + false, null, false, false, colName.getBytes()); List<PColumn> columns = new ArrayList<PColumn>(); columns.add(column); Expression expression = http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 6663c93..b0e715c 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 @@ -123,7 +123,7 @@ public class TupleProjectionCompiler { PColumn sourceColumn = table.getPKColumns().get(i); ColumnRef sourceColumnRef = new ColumnRef(tableRef, sourceColumn.getPosition()); PColumn column = new ProjectedColumn(sourceColumn.getName(), sourceColumn.getFamilyName(), - position++, sourceColumn.isNullable(), sourceColumnRef); + position++, sourceColumn.isNullable(), sourceColumnRef, null); projectedColumns.add(column); } for (PColumn sourceColumn : table.getColumns()) { @@ -135,7 +135,7 @@ public class TupleProjectionCompiler { && !families.contains(sourceColumn.getFamilyName().getString())) continue; PColumn column = new ProjectedColumn(sourceColumn.getName(), sourceColumn.getFamilyName(), - position++, sourceColumn.isNullable(), sourceColumnRef); + position++, sourceColumn.isNullable(), sourceColumnRef, sourceColumn.getColumnQualifierBytes()); projectedColumns.add(column); // Wildcard or FamilyWildcard will be handled by ProjectionCompiler. if (!isWildcard && !families.contains(sourceColumn.getFamilyName())) { @@ -146,7 +146,7 @@ public class TupleProjectionCompiler { for (LocalIndexDataColumnRef sourceColumnRef : visitor.localIndexColumnRefSet) { PColumn column = new ProjectedColumn(sourceColumnRef.getColumn().getName(), sourceColumnRef.getColumn().getFamilyName(), position++, - sourceColumnRef.getColumn().isNullable(), sourceColumnRef); + sourceColumnRef.getColumn().isNullable(), sourceColumnRef, sourceColumnRef.getColumn().getColumnQualifierBytes()); projectedColumns.add(column); } @@ -176,7 +176,7 @@ public class TupleProjectionCompiler { PColumn column = new ProjectedColumn(PNameFactory.newName(aliasedName), retainPKColumns && SchemaUtil.isPKColumn(sourceColumn) ? null : PNameFactory.newName(VALUE_COLUMN_FAMILY), - position++, sourceColumn.isNullable(), sourceColumnRef); + position++, sourceColumn.isNullable(), sourceColumnRef, sourceColumn.getColumnQualifierBytes()); projectedColumns.add(column); } EncodedCQCounter cqCounter = EncodedCQCounter.NULL_COUNTER; http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 013169d..13b58d1 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 @@ -86,11 +86,12 @@ public class UnionCompiler { for (int i = 0; i < plan.getProjector().getColumnCount(); i++) { ColumnProjector colProj = plan.getProjector().getColumnProjector(i); String name = selectNodes == null ? colProj.getName() : selectNodes.get(i).getAlias(); + PName colName = PNameFactory.newName(name); PColumnImpl projectedColumn = new PColumnImpl(PNameFactory.newName(name), UNION_FAMILY_NAME, targetTypes.get(i).getType(), targetTypes.get(i).getMaxLength(), targetTypes.get(i).getScale(), colProj.getExpression().isNullable(), i, targetTypes.get(i).getSortOrder(), 500, null, false, - colProj.getExpression().toString(), false, false, null); + colProj.getExpression().toString(), false, false, colName.getBytes()); projectedColumns.add(projectedColumn); } Long scn = statement.getConnection().getSCN(); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereCompiler.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereCompiler.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereCompiler.java index 52eba47..4c811af 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereCompiler.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereCompiler.java @@ -58,7 +58,6 @@ import org.apache.phoenix.schema.TableRef; import org.apache.phoenix.schema.TypeMismatchException; import org.apache.phoenix.schema.types.PBoolean; import org.apache.phoenix.util.ByteUtil; -import org.apache.phoenix.util.EncodedColumnsUtil; import org.apache.phoenix.util.ScanUtil; import org.apache.phoenix.util.SchemaUtil; @@ -174,7 +173,7 @@ public class WhereCompiler { Expression newColumnExpression = ref.newColumnExpression(node.isTableNameCaseSensitive(), node.isCaseSensitive()); if (tableRef.equals(context.getCurrentTable()) && !SchemaUtil.isPKColumn(ref.getColumn())) { byte[] cq = tableRef.getTable().getStorageScheme() == StorageScheme.ONE_CELL_PER_COLUMN_FAMILY - ? QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES : EncodedColumnsUtil.getColumnQualifier(ref.getColumn(), tableRef.getTable()); + ? QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES : ref.getColumn().getColumnQualifierBytes(); // track the where condition columns. Later we need to ensure the Scan in HRS scans these column CFs context.addWhereCoditionColumn(ref.getColumn().getFamilyName().getBytes(), cq); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java index 9589c37..a64ed64 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java @@ -107,6 +107,7 @@ abstract public class BaseScannerRegionObserver extends BaseRegionObserver { public static final String SCAN_STOP_ROW_SUFFIX = "_ScanStopRowSuffix"; public final static String MIN_QUALIFIER = "_MinQualifier"; public final static String MAX_QUALIFIER = "_MaxQualifier"; + public final static String QUALIFIER_ENCODING_SCHEME = "_QualifierEncodingScheme"; /** * Attribute name used to pass custom annotations in Scans and Mutations (later). Custom annotations http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/GroupedAggregateRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/GroupedAggregateRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/GroupedAggregateRegionObserver.java index 793386d..ee79586 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/GroupedAggregateRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/GroupedAggregateRegionObserver.java @@ -24,6 +24,7 @@ import static org.apache.phoenix.query.QueryServices.GROUPBY_ESTIMATED_DISTINCT_ import static org.apache.phoenix.query.QueryServices.GROUPBY_SPILLABLE_ATTRIB; import static org.apache.phoenix.query.QueryServicesOptions.DEFAULT_GROUPBY_ESTIMATED_DISTINCT_VALUES; import static org.apache.phoenix.query.QueryServicesOptions.DEFAULT_GROUPBY_SPILLABLE; +import static org.apache.phoenix.util.EncodedColumnsUtil.getEncodingScheme; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -383,6 +384,7 @@ public class GroupedAggregateRegionObserver extends BaseScannerRegionObserver { estDistVals = Math.max(MIN_DISTINCT_VALUES, (int) (Bytes.toInt(estDistValsBytes) * 1.5f)); } + Pair<Integer, Integer> minMaxQualifiers = EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan); boolean useQualifierAsIndex = EncodedColumnsUtil.useQualifierAsIndex(EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan)); final boolean spillableEnabled = @@ -406,7 +408,7 @@ public class GroupedAggregateRegionObserver extends BaseScannerRegionObserver { acquiredLock = true; synchronized (scanner) { do { - List<Cell> results = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond()) : new ArrayList<Cell>(); + List<Cell> results = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond(), getEncodingScheme(scan)) : new ArrayList<Cell>(); // Results are potentially returned even when the return // value of s.next is false // since this is an indication of whether or not there are @@ -480,7 +482,7 @@ public class GroupedAggregateRegionObserver extends BaseScannerRegionObserver { acquiredLock = true; synchronized (scanner) { do { - List<Cell> kvs = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond()) : new ArrayList<Cell>(); + List<Cell> kvs = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond(), getEncodingScheme(scan)) : new ArrayList<Cell>(); // Results are potentially returned even when the return // value of s.next is false // since this is an indication of whether or not there http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 b43d215..c936d4f 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 @@ -27,6 +27,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_QUALIFIER_COUNTER_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.COLUMN_SIZE_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DATA_TABLE_NAME_BYTES; @@ -35,7 +36,6 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DECIMAL_DIGITS_BYT import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DEFAULT_COLUMN_FAMILY_NAME_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DEFAULT_VALUE_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.DISABLE_WAL_BYTES; -import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ENCODED_COLUMN_QUALIFIER_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ENCODING_SCHEME_BYTES; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.FAMILY_NAME_INDEX; import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.IMMUTABLE_ROWS_BYTES; @@ -78,7 +78,6 @@ import static org.apache.phoenix.query.QueryConstants.DIVERGED_VIEW_BASE_COLUMN_ import static org.apache.phoenix.query.QueryConstants.SEPARATOR_BYTE_ARRAY; import static org.apache.phoenix.schema.PTableType.INDEX; import static org.apache.phoenix.util.ByteUtil.EMPTY_BYTE_ARRAY; -import static org.apache.phoenix.util.EncodedColumnsUtil.getEncodedColumnQualifier; import static org.apache.phoenix.util.SchemaUtil.getVarCharLength; import static org.apache.phoenix.util.SchemaUtil.getVarChars; @@ -364,7 +363,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 ENCODED_COLUMN_QUALIFIER_KV = KeyValue.createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY, TABLE_FAMILY_BYTES, ENCODED_COLUMN_QUALIFIER_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, @@ -378,7 +377,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso IS_VIEW_REFERENCED_KV, COLUMN_DEF_KV, IS_ROW_TIMESTAMP_KV, - ENCODED_COLUMN_QUALIFIER_KV + COLUMN_QUALIFIER_KV ); static { Collections.sort(COLUMN_KV_COLUMNS, KeyValue.COMPARATOR); @@ -395,7 +394,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 ENCODED_COLUMN_QUALIFIER_INDEX = COLUMN_KV_COLUMNS.indexOf(ENCODED_COLUMN_QUALIFIER_KV); + private static final int COLUMN_QUALIFIER_INDEX = COLUMN_KV_COLUMNS.indexOf(COLUMN_QUALIFIER_KV); private static final int LINK_TYPE_INDEX = 0; @@ -734,12 +733,17 @@ 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[ENCODED_COLUMN_QUALIFIER_INDEX]; - Integer columnQualifier = - columnQualifierKV == null ? null : getEncodedColumnQualifier( - columnQualifierKV.getValueArray(), columnQualifierKV.getValueOffset(), - columnQualifierKV.getValueLength()); - PColumn column = new PColumnImpl(colName, famName, dataType, maxLength, scale, isNullable, position-1, sortOrder, arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, false, columnQualifier); + + //TODO: samarth verify which case is the right one to use. + boolean isPkColumn = famName == null || famName.getString() == null; + Cell columnQualifierKV = colKeyValues[COLUMN_QUALIFIER_INDEX]; + // Older tables won't have column qualifier metadata present. To make things simpler, just set the + // column qualifier bytes by using the column name. + byte[] columnQualifierBytes = columnQualifierKV != null ? + Arrays.copyOfRange(columnQualifierKV.getValueArray(), + columnQualifierKV.getValueOffset(), columnQualifierKV.getValueOffset() + + columnQualifierKV.getValueLength()) : (isPkColumn ? null : colName.getBytes()); + PColumn column = new PColumnImpl(colName, famName, dataType, maxLength, scale, isNullable, position-1, sortOrder, arraySize, viewConstant, isViewReferenced, expressionStr, isRowTimestamp, false, columnQualifierBytes); columns.add(column); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanRegionObserver.java index 3a61493..a35d53a 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/ScanRegionObserver.java @@ -17,6 +17,9 @@ */ package org.apache.phoenix.coprocessor; +import static org.apache.phoenix.util.EncodedColumnsUtil.getEncodingScheme; +import static org.apache.phoenix.util.EncodedColumnsUtil.getMinMaxQualifiersFromScan; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; @@ -57,6 +60,7 @@ import org.apache.phoenix.memory.MemoryManager.MemoryChunk; import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.schema.KeyValueSchema; import org.apache.phoenix.schema.KeyValueSchema.KeyValueSchemaBuilder; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.ValueBitSet; import org.apache.phoenix.schema.tuple.ResultTuple; import org.apache.phoenix.schema.tuple.Tuple; @@ -126,7 +130,8 @@ public class ScanRegionObserver extends BaseScannerRegionObserver { orderByExpression.readFields(input); orderByExpressions.add(orderByExpression); } - ResultIterator inner = new RegionScannerResultIterator(s, EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan)); + QualifierEncodingScheme encodingScheme = getEncodingScheme(scan); + ResultIterator inner = new RegionScannerResultIterator(s, EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan), encodingScheme); return new OrderedResultIterator(inner, orderByExpressions, thresholdBytes, limit >= 0 ? limit : null, null, estimatedRowSize); } catch (IOException e) { @@ -221,7 +226,7 @@ public class ScanRegionObserver extends BaseScannerRegionObserver { final HashJoinInfo j = HashJoinInfo.deserializeHashJoinFromScan(scan); //TODO: samarth make this a client side check by looking at order by and group by expressions. Then use that to set min max qualifiers. We can then make useQualifierListAsIndex // a member variable of BaseScannerRegionObserver. - boolean useQualifierAsIndex = EncodedColumnsUtil.useQualifierAsIndex(EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan)) && scan.getAttribute(BaseScannerRegionObserver.TOPN) != null; + boolean useQualifierAsIndex = EncodedColumnsUtil.useQualifierAsIndex(getMinMaxQualifiersFromScan(scan)) && scan.getAttribute(BaseScannerRegionObserver.TOPN) != null; innerScanner = getWrappedScanner(c, innerScanner, arrayKVRefs, arrayFuncRefs, offset, scan, dataColumns, tupleProjector, dataRegion, indexMaintainer, tx, @@ -233,7 +238,7 @@ public class ScanRegionObserver extends BaseScannerRegionObserver { } if (scanOffset != null) { innerScanner = getOffsetScanner(c, innerScanner, - new OffsetResultIterator(new RegionScannerResultIterator(innerScanner, EncodedColumnsUtil.getMinMaxQualifiersFromScan(scan)), scanOffset), + new OffsetResultIterator(new RegionScannerResultIterator(innerScanner, getMinMaxQualifiersFromScan(scan), getEncodingScheme(scan)), scanOffset), scan.getAttribute(QueryConstants.LAST_SCAN) != null); } final OrderedResultIterator iterator = deserializeFromScan(scan, innerScanner); http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 671b5f8..dadfaeb 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 @@ -24,6 +24,7 @@ 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.schema.stats.StatisticsCollectionRunTracker.COMPACTION_UPDATE_STATS_ROW_COUNT; import static org.apache.phoenix.schema.stats.StatisticsCollectionRunTracker.CONCURRENT_UPDATE_STATS_ROW_COUNT; +import static org.apache.phoenix.util.EncodedColumnsUtil.getEncodingScheme; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -400,7 +401,7 @@ public class UngroupedAggregateRegionObserver extends BaseScannerRegionObserver acquiredLock = true; synchronized (innerScanner) { do { - List<Cell> results = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond()) : new ArrayList<Cell>(); + List<Cell> results = useQualifierAsIndex ? new EncodedColumnQualiferCellsList(minMaxQualifiers.getFirst(), minMaxQualifiers.getSecond(), getEncodingScheme(scan)) : new ArrayList<Cell>(); // Results are potentially returned even when the return value of s.next is false // since this is an indication of whether or not there are more values after the // ones returned http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/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 ead928f..b7ca46f 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 @@ -270,15 +270,15 @@ public final class PTableProtos { */ boolean getIsDynamic(); - // optional int32 encodedColumnQualifier = 15; + // optional bytes columnQualifierBytes = 15; /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - boolean hasEncodedColumnQualifier(); + boolean hasColumnQualifierBytes(); /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - int getEncodedColumnQualifier(); + com.google.protobuf.ByteString getColumnQualifierBytes(); } /** * Protobuf type {@code PColumn} @@ -401,9 +401,9 @@ public final class PTableProtos { isDynamic_ = input.readBool(); break; } - case 120: { + case 122: { bitField0_ |= 0x00004000; - encodedColumnQualifier_ = input.readInt32(); + columnQualifierBytes_ = input.readBytes(); break; } } @@ -724,20 +724,20 @@ public final class PTableProtos { return isDynamic_; } - // optional int32 encodedColumnQualifier = 15; - public static final int ENCODEDCOLUMNQUALIFIER_FIELD_NUMBER = 15; - private int encodedColumnQualifier_; + // optional bytes columnQualifierBytes = 15; + public static final int COLUMNQUALIFIERBYTES_FIELD_NUMBER = 15; + private com.google.protobuf.ByteString columnQualifierBytes_; /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public boolean hasEncodedColumnQualifier() { + public boolean hasColumnQualifierBytes() { return ((bitField0_ & 0x00004000) == 0x00004000); } /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public int getEncodedColumnQualifier() { - return encodedColumnQualifier_; + public com.google.protobuf.ByteString getColumnQualifierBytes() { + return columnQualifierBytes_; } private void initFields() { @@ -755,7 +755,7 @@ public final class PTableProtos { expression_ = ""; isRowTimestamp_ = false; isDynamic_ = false; - encodedColumnQualifier_ = 0; + columnQualifierBytes_ = com.google.protobuf.ByteString.EMPTY; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -832,7 +832,7 @@ public final class PTableProtos { output.writeBool(14, isDynamic_); } if (((bitField0_ & 0x00004000) == 0x00004000)) { - output.writeInt32(15, encodedColumnQualifier_); + output.writeBytes(15, columnQualifierBytes_); } getUnknownFields().writeTo(output); } @@ -901,7 +901,7 @@ public final class PTableProtos { } if (((bitField0_ & 0x00004000) == 0x00004000)) { size += com.google.protobuf.CodedOutputStream - .computeInt32Size(15, encodedColumnQualifier_); + .computeBytesSize(15, columnQualifierBytes_); } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; @@ -996,10 +996,10 @@ public final class PTableProtos { result = result && (getIsDynamic() == other.getIsDynamic()); } - result = result && (hasEncodedColumnQualifier() == other.hasEncodedColumnQualifier()); - if (hasEncodedColumnQualifier()) { - result = result && (getEncodedColumnQualifier() - == other.getEncodedColumnQualifier()); + result = result && (hasColumnQualifierBytes() == other.hasColumnQualifierBytes()); + if (hasColumnQualifierBytes()) { + result = result && getColumnQualifierBytes() + .equals(other.getColumnQualifierBytes()); } result = result && getUnknownFields().equals(other.getUnknownFields()); @@ -1070,9 +1070,9 @@ public final class PTableProtos { hash = (37 * hash) + ISDYNAMIC_FIELD_NUMBER; hash = (53 * hash) + hashBoolean(getIsDynamic()); } - if (hasEncodedColumnQualifier()) { - hash = (37 * hash) + ENCODEDCOLUMNQUALIFIER_FIELD_NUMBER; - hash = (53 * hash) + getEncodedColumnQualifier(); + if (hasColumnQualifierBytes()) { + hash = (37 * hash) + COLUMNQUALIFIERBYTES_FIELD_NUMBER; + hash = (53 * hash) + getColumnQualifierBytes().hashCode(); } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; @@ -1211,7 +1211,7 @@ public final class PTableProtos { bitField0_ = (bitField0_ & ~0x00001000); isDynamic_ = false; bitField0_ = (bitField0_ & ~0x00002000); - encodedColumnQualifier_ = 0; + columnQualifierBytes_ = com.google.protobuf.ByteString.EMPTY; bitField0_ = (bitField0_ & ~0x00004000); return this; } @@ -1300,7 +1300,7 @@ public final class PTableProtos { if (((from_bitField0_ & 0x00004000) == 0x00004000)) { to_bitField0_ |= 0x00004000; } - result.encodedColumnQualifier_ = encodedColumnQualifier_; + result.columnQualifierBytes_ = columnQualifierBytes_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -1363,8 +1363,8 @@ public final class PTableProtos { if (other.hasIsDynamic()) { setIsDynamic(other.getIsDynamic()); } - if (other.hasEncodedColumnQualifier()) { - setEncodedColumnQualifier(other.getEncodedColumnQualifier()); + if (other.hasColumnQualifierBytes()) { + setColumnQualifierBytes(other.getColumnQualifierBytes()); } this.mergeUnknownFields(other.getUnknownFields()); return this; @@ -1966,35 +1966,38 @@ public final class PTableProtos { return this; } - // optional int32 encodedColumnQualifier = 15; - private int encodedColumnQualifier_ ; + // optional bytes columnQualifierBytes = 15; + private com.google.protobuf.ByteString columnQualifierBytes_ = com.google.protobuf.ByteString.EMPTY; /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public boolean hasEncodedColumnQualifier() { + public boolean hasColumnQualifierBytes() { return ((bitField0_ & 0x00004000) == 0x00004000); } /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public int getEncodedColumnQualifier() { - return encodedColumnQualifier_; + public com.google.protobuf.ByteString getColumnQualifierBytes() { + return columnQualifierBytes_; } /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public Builder setEncodedColumnQualifier(int value) { - bitField0_ |= 0x00004000; - encodedColumnQualifier_ = value; + public Builder setColumnQualifierBytes(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + bitField0_ |= 0x00004000; + columnQualifierBytes_ = value; onChanged(); return this; } /** - * <code>optional int32 encodedColumnQualifier = 15;</code> + * <code>optional bytes columnQualifierBytes = 15;</code> */ - public Builder clearEncodedColumnQualifier() { + public Builder clearColumnQualifierBytes() { bitField0_ = (bitField0_ & ~0x00004000); - encodedColumnQualifier_ = 0; + columnQualifierBytes_ = getDefaultInstance().getColumnQualifierBytes(); onChanged(); return this; } @@ -8482,7 +8485,7 @@ public final class PTableProtos { descriptor; static { java.lang.String[] descriptorData = { - "\n\014PTable.proto\032\021PGuidePosts.proto\"\306\002\n\007PC" + + "\n\014PTable.proto\032\021PGuidePosts.proto\"\304\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" + @@ -8490,38 +8493,38 @@ 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\022\036\n\026encodedColumnQualifier\030\017 \001" + - "(\005\"\232\001\n\013PTableStats\022\013\n\003key\030\001 \002(\014\022\016\n\006value", - "s\030\002 \003(\014\022\033\n\023guidePostsByteCount\030\003 \001(\003\022\025\n\r" + - "keyBytesCount\030\004 \001(\003\022\027\n\017guidePostsCount\030\005" + - " \001(\005\022!\n\013pGuidePosts\030\006 \001(\0132\014.PGuidePosts\"" + - "\354\006\n\006PTable\022\027\n\017schemaNameBytes\030\001 \002(\014\022\026\n\016t" + - "ableNameBytes\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\016seque" + - "nceNumber\030\005 \002(\003\022\021\n\ttimeStamp\030\006 \002(\003\022\023\n\013pk" + - "NameBytes\030\007 \001(\014\022\021\n\tbucketNum\030\010 \002(\005\022\031\n\007co" + - "lumns\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\032\n\022data", - "TableNameBytes\030\r \001(\014\022\031\n\021defaultFamilyNam" + - "e\030\016 \001(\014\022\022\n\ndisableWAL\030\017 \002(\010\022\023\n\013multiTena" + - "nt\030\020 \002(\010\022\020\n\010viewType\030\021 \001(\014\022\025\n\rviewStatem" + - "ent\030\022 \001(\014\022\025\n\rphysicalNames\030\023 \003(\014\022\020\n\010tena" + - "ntId\030\024 \001(\014\022\023\n\013viewIndexId\030\025 \001(\005\022\021\n\tindex" + - "Type\030\026 \001(\014\022\026\n\016statsTimeStamp\030\027 \001(\003\022\022\n\nst" + - "oreNulls\030\030 \001(\010\022\027\n\017baseColumnCount\030\031 \001(\005\022" + - "\036\n\026rowKeyOrderOptimizable\030\032 \001(\010\022\025\n\rtrans" + - "actional\030\033 \001(\010\022\034\n\024updateCacheFrequency\030\034" + - " \001(\003\022\035\n\025indexDisableTimestamp\030\035 \001(\003\022\031\n\021i", - "sNamespaceMapped\030\036 \001(\010\022\034\n\024autoParititonS" + - "eqName\030\037 \001(\t\022\032\n\022isAppendOnlySchema\030 \001(\010" + - "\022\027\n\017parentNameBytes\030! \001(\014\022\025\n\rstorageSche" + - "me\030\" \001(\014\022\026\n\016encodingScheme\030# \001(\014\022,\n\021enco" + - "dedCQCounters\030$ \003(\0132\021.EncodedCQCounter\"6" + - "\n\020EncodedCQCounter\022\021\n\tcolFamily\030\001 \002(\t\022\017\n" + - "\007counter\030\002 \002(\005*A\n\nPTableType\022\n\n\006SYSTEM\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.coprocessor.gene" + - "ratedB\014PTableProtosH\001\210\001\001\240\001\001" + "amic\030\016 \001(\010\022\034\n\024columnQualifierBytes\030\017 \001(\014" + + "\"\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\rke" + + "yBytesCount\030\004 \001(\003\022\027\n\017guidePostsCount\030\005 \001" + + "(\005\022!\n\013pGuidePosts\030\006 \001(\0132\014.PGuidePosts\"\354\006" + + "\n\006PTable\022\027\n\017schemaNameBytes\030\001 \002(\014\022\026\n\016tab" + + "leNameBytes\030\002 \002(\014\022\036\n\ttableType\030\003 \002(\0162\013.P" + + "TableType\022\022\n\nindexState\030\004 \001(\t\022\026\n\016sequenc" + + "eNumber\030\005 \002(\003\022\021\n\ttimeStamp\030\006 \002(\003\022\023\n\013pkNa" + + "meBytes\030\007 \001(\014\022\021\n\tbucketNum\030\010 \002(\005\022\031\n\007colu" + + "mns\030\t \003(\0132\010.PColumn\022\030\n\007indexes\030\n \003(\0132\007.P" + + "Table\022\027\n\017isImmutableRows\030\013 \002(\010\022\032\n\022dataTa", + "bleNameBytes\030\r \001(\014\022\031\n\021defaultFamilyName\030" + + "\016 \001(\014\022\022\n\ndisableWAL\030\017 \002(\010\022\023\n\013multiTenant" + + "\030\020 \002(\010\022\020\n\010viewType\030\021 \001(\014\022\025\n\rviewStatemen" + + "t\030\022 \001(\014\022\025\n\rphysicalNames\030\023 \003(\014\022\020\n\010tenant" + + "Id\030\024 \001(\014\022\023\n\013viewIndexId\030\025 \001(\005\022\021\n\tindexTy" + + "pe\030\026 \001(\014\022\026\n\016statsTimeStamp\030\027 \001(\003\022\022\n\nstor" + + "eNulls\030\030 \001(\010\022\027\n\017baseColumnCount\030\031 \001(\005\022\036\n" + + "\026rowKeyOrderOptimizable\030\032 \001(\010\022\025\n\rtransac" + + "tional\030\033 \001(\010\022\034\n\024updateCacheFrequency\030\034 \001" + + "(\003\022\035\n\025indexDisableTimestamp\030\035 \001(\003\022\031\n\021isN", + "amespaceMapped\030\036 \001(\010\022\034\n\024autoParititonSeq" + + "Name\030\037 \001(\t\022\032\n\022isAppendOnlySchema\030 \001(\010\022\027" + + "\n\017parentNameBytes\030! \001(\014\022\025\n\rstorageScheme" + + "\030\" \001(\014\022\026\n\016encodingScheme\030# \001(\014\022,\n\021encode" + + "dCQCounters\030$ \003(\0132\021.EncodedCQCounter\"6\n\020" + + "EncodedCQCounter\022\021\n\tcolFamily\030\001 \002(\t\022\017\n\007c" + + "ounter\030\002 \002(\005*A\n\nPTableType\022\n\n\006SYSTEM\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.coprocessor.genera" + + "tedB\014PTableProtosH\001\210\001\001\240\001\001" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -8533,7 +8536,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", "EncodedColumnQualifier", }); + new java.lang.String[] { "ColumnNameBytes", "FamilyNameBytes", "DataType", "MaxLength", "Scale", "Nullable", "Position", "SortOrder", "ArraySize", "ViewConstant", "ViewReferenced", "Expression", "IsRowTimestamp", "IsDynamic", "ColumnQualifierBytes", }); internal_static_PTableStats_descriptor = getDescriptor().getMessageTypes().get(1); internal_static_PTableStats_fieldAccessorTable = new http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java index cbd9bd3..6c7d05b 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/execute/BaseQueryPlan.java @@ -439,7 +439,7 @@ public abstract class BaseQueryPlan implements QueryPlan { WritableUtils.writeVInt(output, dataColumns.size()); for (PColumn column : dataColumns) { byte[] cf = column.getFamilyName().getBytes(); - byte[] cq = EncodedColumnsUtil.getColumnQualifier(column, dataTable); + byte[] cq = column.getColumnQualifierBytes(); Bytes.writeByteArray(output, cf); Bytes.writeByteArray(output, cq); } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayColumnExpression.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayColumnExpression.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayColumnExpression.java index 747d7e6..b693ded 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayColumnExpression.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/ArrayColumnExpression.java @@ -17,6 +17,9 @@ */ package org.apache.phoenix.expression; +import static org.apache.phoenix.query.QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES; +import static org.apache.phoenix.schema.PTable.QualifierEncodingScheme.NON_ENCODED_QUALIFIERS; + import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; @@ -25,9 +28,9 @@ import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.io.WritableUtils; import org.apache.phoenix.compile.CreateTableCompiler.ViewWhereExpressionVisitor; import org.apache.phoenix.expression.visitor.ExpressionVisitor; -import org.apache.phoenix.query.QueryConstants; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PDatum; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.SortOrder; import org.apache.phoenix.schema.tuple.Tuple; import org.apache.phoenix.schema.types.PArrayDataType; @@ -36,6 +39,8 @@ import org.apache.phoenix.schema.types.PVarbinary; import org.apache.phoenix.util.EncodedColumnsUtil; import org.apache.phoenix.util.SchemaUtil; +import com.google.common.base.Preconditions; + /** * * Class to access a column that is stored in a KeyValue that contains all @@ -47,20 +52,27 @@ public class ArrayColumnExpression extends KeyValueColumnExpression { private int positionInArray; private String arrayColDisplayName; private KeyValueColumnExpression keyValueColumnExpression; + private QualifierEncodingScheme encodingScheme; public ArrayColumnExpression() { } - public ArrayColumnExpression(PDatum column, byte[] cf, int encodedCQ) { - super(column, cf, QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES); - this.positionInArray = encodedCQ; + public ArrayColumnExpression(PDatum column, byte[] cf, byte[] cq, QualifierEncodingScheme encodingScheme) { + super(column, cf, SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES); + Preconditions.checkNotNull(encodingScheme); + Preconditions.checkArgument(encodingScheme != NON_ENCODED_QUALIFIERS); + this.positionInArray = encodingScheme.getDecodedValue(cq); + this.encodingScheme = encodingScheme; setKeyValueExpression(); } - public ArrayColumnExpression(PColumn column, String displayName, boolean encodedColumnName) { - super(column, column.getFamilyName().getBytes(), QueryConstants.SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES); + public ArrayColumnExpression(PColumn column, String displayName, QualifierEncodingScheme encodingScheme) { + super(column, column.getFamilyName().getBytes(), SINGLE_KEYVALUE_COLUMN_QUALIFIER_BYTES); + Preconditions.checkNotNull(encodingScheme); + Preconditions.checkArgument(encodingScheme != NON_ENCODED_QUALIFIERS); this.arrayColDisplayName = displayName; - this.positionInArray = column.getEncodedColumnQualifier(); + this.positionInArray = encodingScheme.getDecodedValue(column.getColumnQualifierBytes()); + this.encodingScheme = encodingScheme; setKeyValueExpression(); } @@ -81,6 +93,7 @@ public class ArrayColumnExpression extends KeyValueColumnExpression { public void readFields(DataInput input) throws IOException { super.readFields(input); this.positionInArray = WritableUtils.readVInt(input); + this.encodingScheme = WritableUtils.readEnum(input, QualifierEncodingScheme.class); setKeyValueExpression(); } @@ -88,6 +101,7 @@ public class ArrayColumnExpression extends KeyValueColumnExpression { public void write(DataOutput output) throws IOException { super.write(output); WritableUtils.writeVInt(output, positionInArray); + WritableUtils.writeEnum(output, encodingScheme); } public KeyValueColumnExpression getKeyValueExpression() { @@ -137,7 +151,7 @@ public class ArrayColumnExpression extends KeyValueColumnExpression { } public byte[] getPositionInArray() { - return EncodedColumnsUtil.getEncodedColumnQualifier(positionInArray); + return encodingScheme.getEncodedBytes(positionInArray); } @Override http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/expression/KeyValueColumnExpression.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/expression/KeyValueColumnExpression.java b/phoenix-core/src/main/java/org/apache/phoenix/expression/KeyValueColumnExpression.java index 5cd7433..5c0be57 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/expression/KeyValueColumnExpression.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/expression/KeyValueColumnExpression.java @@ -28,7 +28,6 @@ import org.apache.phoenix.expression.visitor.ExpressionVisitor; import org.apache.phoenix.schema.PColumn; import org.apache.phoenix.schema.PDatum; import org.apache.phoenix.schema.tuple.Tuple; -import org.apache.phoenix.util.EncodedColumnsUtil; import org.apache.phoenix.util.SchemaUtil; @@ -46,9 +45,21 @@ public class KeyValueColumnExpression extends ColumnExpression { public KeyValueColumnExpression() { } - - public KeyValueColumnExpression(PColumn column, boolean encodedColumnName) { - this(column, null, encodedColumnName); + + public KeyValueColumnExpression(PColumn column) { + super(column); + this.cf = column.getFamilyName().getBytes(); + // for backward compatibility since older tables won't have columnQualifierBytes in their metadata + this.cq = column.getColumnQualifierBytes() != null ? column.getColumnQualifierBytes() : column.getName().getBytes(); + this.displayName = column.getName().getString(); + } + + public KeyValueColumnExpression(PColumn column, String displayName) { + super(column); + this.cf = column.getFamilyName().getBytes(); + // for backward compatibility since older tables won't have columnQualifierBytes in their metadata + this.cq = column.getColumnQualifierBytes() != null ? column.getColumnQualifierBytes() : column.getName().getBytes(); + this.displayName = displayName; } public KeyValueColumnExpression(PDatum column, byte[] cf, byte[] cq) { @@ -57,13 +68,6 @@ public class KeyValueColumnExpression extends ColumnExpression { this.cq = cq; } - public KeyValueColumnExpression(PColumn column, String displayName, boolean encodedColumnName) { - super(column); - this.cf = column.getFamilyName().getBytes(); - this.cq = EncodedColumnsUtil.getColumnQualifier(column, encodedColumnName); - this.displayName = displayName; - } - public byte[] getColumnFamily() { return cf; } @@ -124,4 +128,8 @@ public class KeyValueColumnExpression extends ColumnExpression { public <T> T accept(ExpressionVisitor<T> visitor) { return visitor.visit(this); } + +// public void setDisplayName(String displayName) { +// this.displayName = displayName; +// } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/f955c025/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java b/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java index 2ab3730..f19af6c 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/index/IndexMaintainer.java @@ -17,8 +17,6 @@ */ package org.apache.phoenix.index; -import static org.apache.phoenix.util.EncodedColumnsUtil.getEncodedColumnQualifier; - import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataInputStream; @@ -83,6 +81,7 @@ import org.apache.phoenix.schema.PDatum; import org.apache.phoenix.schema.PIndexState; import org.apache.phoenix.schema.PTable; import org.apache.phoenix.schema.PTable.IndexType; +import org.apache.phoenix.schema.PTable.QualifierEncodingScheme; import org.apache.phoenix.schema.PTable.StorageScheme; import org.apache.phoenix.schema.PTableType; import org.apache.phoenix.schema.RowKeySchema; @@ -322,8 +321,8 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { private int maxTrailingNulls; private ColumnReference dataEmptyKeyValueRef; private boolean rowKeyOrderOptimizable; - private boolean usesEncodedColumnNames; private ImmutableBytesPtr emptyKeyValueQualifierPtr; + private QualifierEncodingScheme encodingScheme; private IndexMaintainer(RowKeySchema dataRowKeySchema, boolean isDataTableSalted) { this.dataRowKeySchema = dataRowKeySchema; @@ -337,7 +336,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { this.isMultiTenant = dataTable.isMultiTenant(); this.viewIndexId = index.getViewIndexId() == null ? null : MetaDataUtil.getViewIndexIdDataType().toBytes(index.getViewIndexId()); this.isLocalIndex = index.getIndexType() == IndexType.LOCAL; - this.usesEncodedColumnNames = EncodedColumnsUtil.usesEncodedColumnNames(index); + this.encodingScheme = index.getEncodingScheme(); byte[] indexTableName = index.getPhysicalName().getBytes(); // Use this for the nDataSaltBuckets as we need this for local indexes // TODO: persist nDataSaltBuckets separately, but maintain b/w compat. @@ -508,8 +507,8 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { PColumnFamily family = index.getColumnFamilies().get(i); for (PColumn indexColumn : family.getColumns()) { PColumn dataColumn = IndexUtil.getDataColumn(dataTable, indexColumn.getName().getString()); - byte[] dataColumnCq = EncodedColumnsUtil.getColumnQualifier(dataColumn, dataTable); - byte[] indexColumnCq = EncodedColumnsUtil.getColumnQualifier(indexColumn, index); + byte[] dataColumnCq = dataColumn.getColumnQualifierBytes(); + byte[] indexColumnCq = indexColumn.getColumnQualifierBytes(); this.coveredColumns.add(new ColumnReference(dataColumn.getFamilyName().getBytes(), dataColumnCq)); this.coveredColumnsMap.put(new ColumnReference(dataColumn.getFamilyName().getBytes(), dataColumnCq), new ColumnReference(indexColumn.getFamilyName().getBytes(), indexColumnCq)); @@ -953,7 +952,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { int maxIndex = Integer.MIN_VALUE; // find the max col qualifier for (Pair<ColumnReference, ColumnReference> colRefPair : colRefPairs) { - int qualifier = getEncodedColumnQualifier(colRefPair.getFirst().getQualifier()); + int qualifier = encodingScheme.getDecodedValue(colRefPair.getFirst().getQualifier()); maxIndex = Math.max(maxIndex, qualifier); } byte[][] colValues = new byte[maxIndex+1][]; @@ -961,7 +960,6 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { for (Pair<ColumnReference, ColumnReference> colRefPair : colRefPairs) { ColumnReference indexColRef = colRefPair.getFirst(); ColumnReference dataColRef = colRefPair.getSecond(); - int dataArrayPos = getEncodedColumnQualifier(dataColRef.getQualifier()); Expression expression = new ArrayColumnExpression(new PDatum() { @Override public boolean isNullable() { @@ -987,12 +985,12 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { public PDataType getDataType() { return null; } - }, dataColRef.getFamily(), dataArrayPos); + }, dataColRef.getFamily(), dataColRef.getQualifier(), encodingScheme); ImmutableBytesPtr ptr = new ImmutableBytesPtr(); expression.evaluate(new ValueGetterTuple(valueGetter), ptr); byte[] value = ptr.copyBytesIfNecessary(); if (value != null) { - int indexArrayPos = getEncodedColumnQualifier(indexColRef.getQualifier()); + int indexArrayPos = encodingScheme.getDecodedValue(indexColRef.getQualifier()); colValues[indexArrayPos] = value; } } @@ -1241,8 +1239,6 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { if (isNewClient) { int numIndexedExpressions = WritableUtils.readVInt(input); - usesEncodedColumnNames = numIndexedExpressions > 0; - numIndexedExpressions = Math.abs(numIndexedExpressions) - 1; indexedExpressions = Lists.newArrayListWithExpectedSize(numIndexedExpressions); for (int i = 0; i < numIndexedExpressions; i++) { Expression expression = ExpressionType.values()[WritableUtils.readVInt(input)].newInstance(); @@ -1311,6 +1307,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { byte[] dataTableCq = Bytes.readByteArray(input); coveredColumnsInfo.add(new Pair<>(Bytes.toString(dataTableCf), Bytes.toString(dataTableCq))); } + encodingScheme = WritableUtils.readEnum(input, QualifierEncodingScheme.class); storeColsInSingleCell = WritableUtils.readVInt(input) > 0; initCachedState(); } @@ -1351,10 +1348,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { // when indexedColumnTypes is removed, remove this WritableUtils.writeVInt(output,-emptyKeyValueCFPtr.getLength()); output.write(emptyKeyValueCFPtr.get(),emptyKeyValueCFPtr.getOffset(), emptyKeyValueCFPtr.getLength()); - - // Hack to encode usesEncodedColumnNames in indexedExpressions size. - int indexedExpressionsSize = (indexedExpressions.size() + 1) * (usesEncodedColumnNames ? 1 : -1); - WritableUtils.writeVInt(output, indexedExpressionsSize); + WritableUtils.writeVInt(output, indexedExpressions.size()); for (Expression expression : indexedExpressions) { WritableUtils.writeVInt(output, ExpressionType.valueOf(expression).ordinal()); expression.write(output); @@ -1375,6 +1369,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { Bytes.writeByteArray(output, colInfo.getFirst() == null ? null : colInfo.getFirst().getBytes()); Bytes.writeByteArray(output, colInfo.getSecond().getBytes()); } + WritableUtils.writeEnum(output, encodingScheme); WritableUtils.writeVInt(output, storeColsInSingleCell ? 1 : -1); } @@ -1422,7 +1417,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> { * Init calculated state reading/creating */ private void initCachedState() { - byte[] emptyKvQualifier = EncodedColumnsUtil.getEmptyKeyValueInfo(usesEncodedColumnNames).getFirst(); + byte[] emptyKvQualifier = EncodedColumnsUtil.getEmptyKeyValueInfo(encodingScheme).getFirst(); dataEmptyKeyValueRef = new ColumnReference(emptyKeyValueCFPtr.copyBytesIfNecessary(), emptyKvQualifier); emptyKeyValueQualifierPtr = new ImmutableBytesPtr(emptyKvQualifier); this.allColumns = Sets.newLinkedHashSetWithExpectedSize(indexedExpressions.size() + coveredColumns.size());