Repository: phoenix Updated Branches: refs/heads/master d6e7846f4 -> 8c340f5a6
http://git-wip-us.apache.org/repos/asf/phoenix/blob/8c340f5a/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 91e4f36..964ac39 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); + PNameFactory.newName(SALTING_COLUMN_NAME), null, PBinary.INSTANCE, 1, 0, false, 0, SortOrder.getDefault(), 0, null, 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/8c340f5a/phoenix-core/src/main/java/org/apache/phoenix/schema/tuple/ValueGetterTuple.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/tuple/ValueGetterTuple.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/tuple/ValueGetterTuple.java new file mode 100644 index 0000000..6fc480e --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/tuple/ValueGetterTuple.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.phoenix.schema.tuple; + +import static org.apache.phoenix.hbase.index.util.ImmutableBytesPtr.copyBytesIfNecessary; + +import java.io.IOException; + +import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.KeyValue.Type; +import org.apache.hadoop.hbase.io.ImmutableBytesWritable; +import org.apache.phoenix.expression.Expression; +import org.apache.phoenix.hbase.index.ValueGetter; +import org.apache.phoenix.hbase.index.covered.update.ColumnReference; +import org.apache.phoenix.hbase.index.util.ImmutableBytesPtr; + +/** + * + * Class used to construct a {@link Tuple} in order to evaluate an {@link Expression} + */ +public class ValueGetterTuple extends BaseTuple { + private ValueGetter valueGetter; + + public ValueGetterTuple(ValueGetter valueGetter) { + this.valueGetter = valueGetter; + } + + public ValueGetterTuple() { + } + + @Override + public void getKey(ImmutableBytesWritable ptr) { + ptr.set(valueGetter.getRowKey()); + } + + @Override + public boolean isImmutable() { + return true; + } + + @Override + public KeyValue getValue(byte[] family, byte[] qualifier) { + ImmutableBytesPtr value = null; + try { + value = valueGetter.getLatestValue(new ColumnReference(family, qualifier)); + } catch (IOException e) { + throw new RuntimeException(e); + } + return new KeyValue(valueGetter.getRowKey(), family, qualifier, HConstants.LATEST_TIMESTAMP, Type.Put, value!=null? copyBytesIfNecessary(value) : null); + } + + @Override + public String toString() { + throw new UnsupportedOperationException(); + } + + @Override + public int size() { + throw new UnsupportedOperationException(); + } + + @Override + public KeyValue getValue(int index) { + throw new UnsupportedOperationException(); + } + + @Override + public boolean getValue(byte[] family, byte[] qualifier, + ImmutableBytesWritable ptr) { + KeyValue kv = getValue(family, qualifier); + if (kv == null) + return false; + ptr.set(kv.getBuffer(), kv.getValueOffset(), kv.getValueLength()); + return true; + } + +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/8c340f5a/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java index 39e13bf..8dd4f4d 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/IndexUtil.java @@ -209,10 +209,10 @@ public class IndexUtil { } public static List<Mutation> generateIndexData(final PTable table, PTable index, - List<Mutation> dataMutations, ImmutableBytesWritable ptr, final KeyValueBuilder kvBuilder) + List<Mutation> dataMutations, ImmutableBytesWritable ptr, final KeyValueBuilder kvBuilder, PhoenixConnection connection) throws SQLException { try { - IndexMaintainer maintainer = index.getIndexMaintainer(table); + IndexMaintainer maintainer = index.getIndexMaintainer(table, connection); List<Mutation> indexMutations = Lists.newArrayListWithExpectedSize(dataMutations.size()); for (final Mutation dataMutation : dataMutations) { long ts = MetaDataUtil.getClientTimeStamp(dataMutation); @@ -227,6 +227,11 @@ public class IndexUtil { // TODO: is this more efficient than looking in our mutation map // using the key plus finding the PColumn? ValueGetter valueGetter = new ValueGetter() { + + @Override + public byte[] getRowKey() { + return dataMutation.getRow(); + } @Override public ImmutableBytesPtr getLatestValue(ColumnReference ref) { @@ -267,6 +272,10 @@ public class IndexUtil { return column.getName().getString().startsWith(INDEX_COLUMN_NAME_SEP); } + public static boolean isIndexColumn(PColumn column) { + return column.getName().getString().contains(INDEX_COLUMN_NAME_SEP); + } + public static boolean getViewConstantValue(PColumn column, ImmutableBytesWritable ptr) { byte[] value = column.getViewConstant(); if (value != null) { @@ -441,7 +450,7 @@ public class IndexUtil { PhoenixStatement statement = new PhoenixStatement(conn); TableRef indexTableRef = new TableRef(index) { @Override - public String getColumnDisplayName(ColumnRef ref, boolean cfCaseSensitive, boolean cqCaseSensitive) { + public String getColumnDisplayName(ColumnRef ref, boolean schemaNameCaseSensitive, boolean colNameCaseSensitive) { return '"' + ref.getColumn().getName().getString() + '"'; } }; http://git-wip-us.apache.org/repos/asf/phoenix/blob/8c340f5a/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 b91d8ca..06d21c2 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); + true, 20, SortOrder.getDefault(), 0, null, 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); + true, 20, SortOrder.getDefault(), 0, null, 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); + true, 20, SortOrder.getDefault(), 0, null, 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); + 20, SortOrder.getDefault(), 0, null, 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/8c340f5a/phoenix-core/src/test/java/org/apache/phoenix/index/IndexMaintainerTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/index/IndexMaintainerTest.java b/phoenix-core/src/test/java/org/apache/phoenix/index/IndexMaintainerTest.java index 183f699..592ac7c 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/index/IndexMaintainerTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/index/IndexMaintainerTest.java @@ -69,13 +69,18 @@ public class IndexMaintainerTest extends BaseConnectionlessQueryTest { testIndexRowKeyBuilding(DEFAULT_SCHEMA_NAME, DEFAULT_TABLE_NAME, dataColumns, pk, indexColumns, values, "", dataProps, indexProps); } - private static ValueGetter newValueGetter(final Map<ColumnReference, byte[]> valueMap) { + private static ValueGetter newValueGetter(final byte[] row, final Map<ColumnReference, byte[]> valueMap) { return new ValueGetter() { @Override public ImmutableBytesPtr getLatestValue(ColumnReference ref) { return new ImmutableBytesPtr(valueMap.get(ref)); } + + @Override + public byte[] getRowKey() { + return row; + } }; } @@ -98,7 +103,7 @@ public class IndexMaintainerTest extends BaseConnectionlessQueryTest { PTable table = pconn.getMetaDataCache().getTable(new PTableKey(pconn.getTenantId(), fullTableName)); PTable index = pconn.getMetaDataCache().getTable(new PTableKey(pconn.getTenantId(),fullIndexName)); ImmutableBytesWritable ptr = new ImmutableBytesWritable(); - table.getIndexMaintainers(ptr); + table.getIndexMaintainers(ptr, pconn); List<IndexMaintainer> c1 = IndexMaintainer.deserialize(ptr, builder); assertEquals(1,c1.size()); IndexMaintainer im1 = c1.get(0); @@ -116,13 +121,14 @@ public class IndexMaintainerTest extends BaseConnectionlessQueryTest { Iterator<Pair<byte[],List<KeyValue>>> iterator = PhoenixRuntime.getUncommittedDataIterator(conn); List<KeyValue> dataKeyValues = iterator.next().getSecond(); Map<ColumnReference,byte[]> valueMap = Maps.newHashMapWithExpectedSize(dataKeyValues.size()); - ImmutableBytesWritable rowKeyPtr = new ImmutableBytesWritable(dataKeyValues.get(0).getRow()); + byte[] row = dataKeyValues.get(0).getRow(); + ImmutableBytesWritable rowKeyPtr = new ImmutableBytesWritable(row); Put dataMutation = new Put(rowKeyPtr.copyBytes()); for (KeyValue kv : dataKeyValues) { valueMap.put(new ColumnReference(kv.getFamily(),kv.getQualifier()), kv.getValue()); dataMutation.add(kv); } - ValueGetter valueGetter = newValueGetter(valueMap); + ValueGetter valueGetter = newValueGetter(row, valueMap); List<Mutation> indexMutations = IndexTestUtil.generateIndexData(index, table, dataMutation, ptr, builder); http://git-wip-us.apache.org/repos/asf/phoenix/blob/8c340f5a/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 f02738d..5624b51 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 @@ -124,6 +124,11 @@ public class AggregateResultScannerTest extends BaseConnectionlessQueryTest { public boolean isViewReferenced() { return false; } + + @Override + public String getExpressionStr() { + 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/8c340f5a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java index 6a2ce26..f81c3a9 100644 --- a/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java +++ b/phoenix-core/src/test/java/org/apache/phoenix/query/BaseTest.java @@ -376,39 +376,45 @@ public abstract class BaseTest { " kv bigint)\n"); builder.put(INDEX_DATA_TABLE, "create table " + INDEX_DATA_SCHEMA + QueryConstants.NAME_SEPARATOR + INDEX_DATA_TABLE + "(" + " varchar_pk VARCHAR NOT NULL, " + - " char_pk CHAR(5) NOT NULL, " + + " char_pk CHAR(6) NOT NULL, " + " int_pk INTEGER NOT NULL, "+ " long_pk BIGINT NOT NULL, " + " decimal_pk DECIMAL(31, 10) NOT NULL, " + + " date_pk DATE NOT NULL, " + " a.varchar_col1 VARCHAR, " + - " a.char_col1 CHAR(5), " + + " a.char_col1 CHAR(10), " + " a.int_col1 INTEGER, " + " a.long_col1 BIGINT, " + " a.decimal_col1 DECIMAL(31, 10), " + + " a.date1 DATE, " + " b.varchar_col2 VARCHAR, " + - " b.char_col2 CHAR(5), " + + " b.char_col2 CHAR(10), " + " b.int_col2 INTEGER, " + " b.long_col2 BIGINT, " + - " b.decimal_col2 DECIMAL(31, 10) " + - " CONSTRAINT pk PRIMARY KEY (varchar_pk, char_pk, int_pk, long_pk DESC, decimal_pk)) " + + " b.decimal_col2 DECIMAL(31, 10), " + + " b.date2 DATE " + + " CONSTRAINT pk PRIMARY KEY (varchar_pk, char_pk, int_pk, long_pk DESC, decimal_pk, date_pk)) " + "IMMUTABLE_ROWS=true"); builder.put(MUTABLE_INDEX_DATA_TABLE, "create table " + INDEX_DATA_SCHEMA + QueryConstants.NAME_SEPARATOR + MUTABLE_INDEX_DATA_TABLE + "(" + " varchar_pk VARCHAR NOT NULL, " + - " char_pk CHAR(5) NOT NULL, " + + " char_pk CHAR(6) NOT NULL, " + " int_pk INTEGER NOT NULL, "+ " long_pk BIGINT NOT NULL, " + " decimal_pk DECIMAL(31, 10) NOT NULL, " + + " date_pk DATE NOT NULL, " + " a.varchar_col1 VARCHAR, " + - " a.char_col1 CHAR(5), " + + " a.char_col1 CHAR(10), " + " a.int_col1 INTEGER, " + " a.long_col1 BIGINT, " + " a.decimal_col1 DECIMAL(31, 10), " + + " a.date1 DATE, " + " b.varchar_col2 VARCHAR, " + - " b.char_col2 CHAR(5), " + + " b.char_col2 CHAR(10), " + " b.int_col2 INTEGER, " + " b.long_col2 BIGINT, " + - " b.decimal_col2 DECIMAL(31, 10) " + - " CONSTRAINT pk PRIMARY KEY (varchar_pk, char_pk, int_pk, long_pk DESC, decimal_pk)) " + " b.decimal_col2 DECIMAL(31, 10), " + + " b.date2 DATE " + + " CONSTRAINT pk PRIMARY KEY (varchar_pk, char_pk, int_pk, long_pk DESC, decimal_pk, date_pk)) " ); builder.put("SumDoubleTest","create table SumDoubleTest" + " (id varchar not null primary key, d DOUBLE, f FLOAT, ud UNSIGNED_DOUBLE, uf UNSIGNED_FLOAT, i integer, de decimal)"); http://git-wip-us.apache.org/repos/asf/phoenix/blob/8c340f5a/phoenix-protocol/src/main/PTable.proto ---------------------------------------------------------------------- diff --git a/phoenix-protocol/src/main/PTable.proto b/phoenix-protocol/src/main/PTable.proto index 89ceea3..348631f 100644 --- a/phoenix-protocol/src/main/PTable.proto +++ b/phoenix-protocol/src/main/PTable.proto @@ -46,6 +46,7 @@ message PColumn { optional int32 arraySize = 9; optional bytes viewConstant = 10; optional bool viewReferenced = 11; + optional string expression = 12; } message PTableStats {