You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ja...@apache.org on 2014/10/16 00:52:27 UTC
[2/3] git commit: Backport fixes for PHOENIX-1149 (view index ignored
if no where clause) and PHOENIX-933 (IndexMaintainer fixes for view index)
Backport fixes for PHOENIX-1149 (view index ignored if no where clause) and PHOENIX-933 (IndexMaintainer fixes for view index)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/abffd3fc
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/abffd3fc
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/abffd3fc
Branch: refs/heads/3.0
Commit: abffd3fc7614ca70e040cdc4c752ee90e4b3b270
Parents: 58426a3
Author: James Taylor <jt...@salesforce.com>
Authored: Wed Oct 15 15:57:23 2014 -0700
Committer: James Taylor <jt...@salesforce.com>
Committed: Wed Oct 15 15:57:23 2014 -0700
----------------------------------------------------------------------
.../org/apache/phoenix/end2end/BaseViewIT.java | 7 ++--
.../apache/phoenix/compile/WhereOptimizer.java | 5 +--
.../apache/phoenix/index/IndexMaintainer.java | 38 ++++++++++++++++----
3 files changed, 38 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/abffd3fc/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
index 5a587aa..6466932 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseViewIT.java
@@ -132,14 +132,13 @@ public class BaseViewIT extends BaseOwnClusterHBaseManagedTimeIT {
conn.createStatement().execute("CREATE INDEX i2 on v(s)");
// new index hasn't been analyzed yet
-// splits = getAllSplits(conn, "i2");
-// assertEquals(saltBuckets == null ? 1 : 3, splits.size());
+ splits = getAllSplits(conn, "i2");
+ assertEquals(saltBuckets == null ? 1 : 3, splits.size());
// analyze table should analyze all view data
analyzeTable(conn, "t");
splits = getAllSplits(conn, "i2");
-// assertEquals(saltBuckets == null ? 6 : 8, splits.size());
- assertEquals(saltBuckets == null ? 11 : 13, splits.size());
+ assertEquals(saltBuckets == null ? 6 : 8, splits.size());
query = "SELECT k1, k2, s FROM v WHERE s = 'foo'";
rs = conn.createStatement().executeQuery(query);
http://git-wip-us.apache.org/repos/asf/phoenix/blob/abffd3fc/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
index 29ad6ee..94293a4 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/compile/WhereOptimizer.java
@@ -105,7 +105,8 @@ public class WhereOptimizer {
Expression whereClause, Set<Expression> extractNodes) {
PName tenantId = context.getConnection().getTenantId();
PTable table = context.getCurrentTable().getTable();
- if (whereClause == null && (tenantId == null || !table.isMultiTenant())) {
+ boolean isEverything = (tenantId == null || !table.isMultiTenant()) && table.getViewIndexId() == null;
+ if (whereClause == null && isEverything) {
context.setScanRanges(ScanRanges.EVERYTHING);
return whereClause;
}
@@ -121,7 +122,7 @@ public class WhereOptimizer {
// becomes consistent.
keySlots = whereClause.accept(visitor);
- if (keySlots == null && (tenantId == null || !table.isMultiTenant())) {
+ if (keySlots == null && isEverything) {
context.setScanRanges(ScanRanges.EVERYTHING);
return whereClause;
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/abffd3fc/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 5a3f7c8..eb9d15d 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
@@ -235,10 +235,20 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
byte[] indexTableName = index.getPhysicalName().getBytes();
Integer nIndexSaltBuckets = index.getBucketNum();
boolean indexWALDisabled = index.isWALDisabled();
- int indexPosOffset = (index.getBucketNum() == null ? 0 : 1) + (this.isMultiTenant ? 1 : 0) + (this.viewIndexId == null ? 0 : 1);
+ int indexPosOffset = (index.getBucketNum() == null ? 0 : 1) + (this.isMultiTenant ? 1 : 0) + (index.getViewIndexId() == null ? 0 : 1);
int nIndexColumns = index.getColumns().size() - indexPosOffset;
int nIndexPKColumns = index.getPKColumns().size() - indexPosOffset;
- this.rowKeyMetaData = newRowKeyMetaData(nIndexPKColumns);
+ int indexedColumnsCount = 0;
+ for (int i = indexPosOffset; i<index.getPKColumns().size();i++) {
+ PColumn indexColumn = index.getPKColumns().get(i);
+ PColumn column = IndexUtil.getDataColumn(dataTable, indexColumn.getName().getString());
+ boolean isPKColumn = SchemaUtil.isPKColumn(column);
+ if (!isPKColumn) {
+ indexedColumnsCount++;
+ }
+ }
+ int indexPkColumnCount = this.dataRowKeySchema.getFieldCount() + indexedColumnsCount - (isDataTableSalted ? 1 : 0) - (isMultiTenant ? 1 : 0);
+ this.rowKeyMetaData = newRowKeyMetaData(indexPkColumnCount);
BitSet bitSet = this.rowKeyMetaData.getViewConstantColumnBitSet();
int dataPosOffset = (isDataTableSalted ? 1 : 0) + (this.isMultiTenant ? 1 : 0);
@@ -281,7 +291,9 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
// The dataRowKeySchema includes the salt byte field,
// so we must adjust for that here.
int dataPosOffset = isDataTableSalted ? 1 : 0 ;
- int nIndexedColumns = getIndexPkColumnCount();
+ BitSet viewConstantColumnBitSet = this.rowKeyMetaData.getViewConstantColumnBitSet();
+ int nIndexedColumns = getIndexPkColumnCount() - getNumViewConstants();
+ //int nIndexedColumns = getIndexPkColumnCount();
int[][] dataRowKeyLocator = new int[2][nIndexedColumns];
// Skip data table salt byte
int maxRowKeyOffset = rowKeyPtr.getOffset() + rowKeyPtr.getLength();
@@ -298,7 +310,7 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
output.write(viewIndexId);
}
- BitSet viewConstantColumnBitSet = this.rowKeyMetaData.getViewConstantColumnBitSet();
+ //BitSet viewConstantColumnBitSet = this.rowKeyMetaData.getViewConstantColumnBitSet();
// Write index row key
for (int i = dataPosOffset; i < dataRowKeySchema.getFieldCount(); i++) {
Boolean hasValue=dataRowKeySchema.next(ptr, i, maxRowKeyOffset);
@@ -383,6 +395,15 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
}
}
+ private int getNumViewConstants() {
+ BitSet bitSet = this.rowKeyMetaData.getViewConstantColumnBitSet();
+ int num = 0;
+ for (int i = 0; i < dataRowKeySchema.getFieldCount(); i++) {
+ if (bitSet.get(i)) num++;
+ }
+ return num;
+ }
+
@SuppressWarnings("deprecation")
public Put buildUpdateMutation(KeyValueBuilder kvBuilder, ValueGetter valueGetter, ImmutableBytesWritable dataRowKeyPtr, long ts) throws IOException {
Put put = null;
@@ -668,11 +689,14 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
int nIndexPkColumns = getIndexPkColumnCount();
dataPkPosition = new int[nIndexPkColumns];
Arrays.fill(dataPkPosition, -1);
+ int numViewConstantColumns = 0;
BitSet viewConstantColumnBitSet = rowKeyMetaData.getViewConstantColumnBitSet();
for (int i = dataPkOffset; i < dataRowKeySchema.getFieldCount(); i++) {
if (!viewConstantColumnBitSet.get(i)) {
int dataPkPosition = rowKeyMetaData.getIndexPkPosition(i-dataPkOffset);
this.dataPkPosition[dataPkPosition] = i;
+ } else {
+ numViewConstantColumns++;
}
}
@@ -680,7 +704,8 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
// We only get rid of nulls for variable length types, so we have to be careful to consider the type of the
// index table, not the data type of the data table
int indexedColumnTypesPos = indexedColumnTypes.size()-1;
- int indexPkPos = nIndexPkColumns-1;
+ //int indexPkPos = nIndexPkColumns-1;
+ int indexPkPos = nIndexPkColumns - numViewConstantColumns - 1;
while (indexPkPos >= 0) {
int dataPkPos = dataPkPosition[indexPkPos];
boolean isDataNullable;
@@ -703,7 +728,8 @@ public class IndexMaintainer implements Writable, Iterable<ColumnReference> {
}
private int getIndexPkColumnCount() {
- return dataRowKeySchema.getFieldCount() + indexedColumns.size() - (isDataTableSalted ? 1 : 0) - (isMultiTenant ? 1 : 0) - (viewIndexId == null ? 0 : 1);
+ return dataRowKeySchema.getFieldCount() + indexedColumns.size() - (isDataTableSalted ? 1 : 0) - (isMultiTenant ? 1 : 0);
+ //return dataRowKeySchema.getFieldCount() + indexedColumns.size() - (isDataTableSalted ? 1 : 0) - (isMultiTenant ? 1 : 0) - (viewIndexId == null ? 0 : 1);
}
private RowKeyMetaData newRowKeyMetaData() {