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() {