You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ra...@apache.org on 2014/10/31 02:03:08 UTC
git commit: PHOENIX-1387 Local index is not use when the query like
"select * from dataTable where c1 like 'abc%'".
Repository: phoenix
Updated Branches:
refs/heads/master 668bc2310 -> 4de425131
PHOENIX-1387 Local index is not use when the query like "select * from dataTable where c1 like 'abc%'".
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/4de42513
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/4de42513
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/4de42513
Branch: refs/heads/master
Commit: 4de4251310cfcef12178713d6d6e93b0882a4f4d
Parents: 668bc23
Author: Rajeshbabu Chintaguntla <ra...@huawei.com>
Authored: Wed Oct 29 21:19:09 2014 +0530
Committer: Rajeshbabu Chintaguntla <ra...@huawei.com>
Committed: Fri Oct 31 06:32:16 2014 +0530
----------------------------------------------------------------------
.../phoenix/end2end/index/LocalIndexIT.java | 24 +++++++++-
.../phoenix/end2end/index/MutableIndexIT.java | 15 +++++-
.../phoenix/compile/ProjectionCompiler.java | 50 +++++++++++++++++---
3 files changed, 80 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/4de42513/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
index 7fa69d4..f03d053 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/LocalIndexIT.java
@@ -266,7 +266,29 @@ public class LocalIndexIT extends BaseIndexIT {
HBaseAdmin admin = driver.getConnectionQueryServices(getUrl(), TestUtil.TEST_PROPERTIES).getAdmin();
int numRegions = admin.getTableRegions(TableName.valueOf(DATA_TABLE_NAME)).size();
- String query = "SELECT t_id, k1, k2,V1 FROM " + DATA_TABLE_NAME +" where v1='a'";
+ String query = "SELECT * FROM " + DATA_TABLE_NAME +" where v1 like 'a%'";
+ rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
+
+ assertEquals(
+ "CLIENT PARALLEL " + numRegions + "-WAY RANGE SCAN OVER "
+ + MetaDataUtil.getLocalIndexTableName(DATA_TABLE_NAME) + " [-32768,'a'] - [-32768,'b']\nCLIENT MERGE SORT",
+ QueryUtil.getExplainPlan(rs));
+
+ rs = conn1.createStatement().executeQuery(query);
+ assertTrue(rs.next());
+ assertEquals("f", rs.getString("t_id"));
+ assertEquals(1, rs.getInt("k1"));
+ assertEquals(2, rs.getInt("k2"));
+ assertEquals("a", rs.getString("v1"));
+ assertEquals(3, rs.getInt("k3"));
+ assertTrue(rs.next());
+ assertEquals("j", rs.getString("t_id"));
+ assertEquals(2, rs.getInt("k1"));
+ assertEquals(4, rs.getInt("k2"));
+ assertEquals("a", rs.getString("v1"));
+ assertEquals(2, rs.getInt("k3"));
+ assertFalse(rs.next());
+ query = "SELECT t_id, k1, k2,V1 FROM " + DATA_TABLE_NAME +" where v1='a'";
rs = conn1.createStatement().executeQuery("EXPLAIN "+ query);
assertEquals(
http://git-wip-us.apache.org/repos/asf/phoenix/blob/4de42513/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
index 429f96c..b4cbf9b 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/index/MutableIndexIT.java
@@ -333,7 +333,20 @@ public class MutableIndexIT extends BaseMutableIndexIT {
assertEquals(4, rs.getInt(2));
assertEquals(5L, rs.getLong(3));
assertFalse(rs.next());
-
+ if(localIndex) {
+ query = "SELECT b.* from " + DATA_TABLE_FULL_NAME + " where int_col1 = 4";
+ rs = conn.createStatement().executeQuery("EXPLAIN " + query);
+ assertEquals("CLIENT PARALLEL 1-WAY RANGE SCAN OVER _LOCAL_IDX_" + DATA_TABLE_FULL_NAME +" [-32768]\n" +
+ " SERVER FILTER BY TO_INTEGER(INT_COL1) = 4\nCLIENT MERGE SORT", QueryUtil.getExplainPlan(rs));
+ rs = conn.createStatement().executeQuery(query);
+ assertTrue(rs.next());
+ assertEquals("varchar_b", rs.getString(1));
+ assertEquals("charb", rs.getString(2));
+ assertEquals(5, rs.getInt(3));
+ assertEquals(5, rs.getLong(4));
+ assertFalse(rs.next());
+
+ }
} finally {
conn.close();
}
http://git-wip-us.apache.org/repos/asf/phoenix/blob/4de42513/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 0647e2e..3204e03 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
@@ -66,12 +66,15 @@ import org.apache.phoenix.schema.ColumnNotFoundException;
import org.apache.phoenix.schema.ColumnRef;
import org.apache.phoenix.schema.KeyValueSchema;
import org.apache.phoenix.schema.KeyValueSchema.KeyValueSchemaBuilder;
+import org.apache.phoenix.schema.ColumnFamilyNotFoundException;
+import org.apache.phoenix.schema.LocalIndexDataColumnRef;
import org.apache.phoenix.schema.PColumn;
import org.apache.phoenix.schema.PColumnFamily;
import org.apache.phoenix.schema.PDataType;
import org.apache.phoenix.schema.PDatum;
import org.apache.phoenix.schema.PName;
import org.apache.phoenix.schema.PTable;
+import org.apache.phoenix.schema.PTable.IndexType;
import org.apache.phoenix.schema.PTable.ViewType;
import org.apache.phoenix.schema.PTableKey;
import org.apache.phoenix.schema.PTableType;
@@ -172,9 +175,11 @@ public class ProjectionCompiler {
int tableOffset = table.getBucketNum() == null ? 0 : 1;
int minTablePKOffset = getMinPKOffset(table, tenantId);
int minIndexPKOffset = getMinPKOffset(index, tenantId);
- if (index.getColumns().size()-minIndexPKOffset != table.getColumns().size()-minTablePKOffset) {
- // We'll end up not using this by the optimizer, so just throw
- throw new ColumnNotFoundException(WildcardParseNode.INSTANCE.toString());
+ if (index.getIndexType() != IndexType.LOCAL) {
+ if (index.getColumns().size()-minIndexPKOffset != table.getColumns().size()-minTablePKOffset) {
+ // We'll end up not using this by the optimizer, so just throw
+ throw new ColumnNotFoundException(WildcardParseNode.INSTANCE.toString());
+ }
}
for (int i = tableOffset, j = tableOffset; i < table.getColumns().size(); i++) {
PColumn column = table.getColumns().get(i);
@@ -185,8 +190,23 @@ public class ProjectionCompiler {
}
PColumn tableColumn = table.getColumns().get(i);
String indexColName = IndexUtil.getIndexColumnName(tableColumn);
- PColumn indexColumn = index.getColumn(indexColName);
- ColumnRef ref = new ColumnRef(tableRef,indexColumn.getPosition());
+ PColumn indexColumn = null;
+ ColumnRef ref = null;
+ try {
+ indexColumn = index.getColumn(indexColName);
+ ref = new ColumnRef(tableRef, indexColumn.getPosition());
+ } catch (ColumnNotFoundException e) {
+ if (index.getIndexType() == IndexType.LOCAL) {
+ try {
+ ref = new LocalIndexDataColumnRef(context, indexColName);
+ indexColumn = ref.getColumn();
+ } catch (ColumnFamilyNotFoundException c) {
+ throw e;
+ }
+ } else {
+ throw e;
+ }
+ }
String colName = tableColumn.getName().getString();
if (resolveColumn) {
if (tableRef.getTableAlias() != null) {
@@ -230,8 +250,24 @@ public class ProjectionCompiler {
PTable table = conn.getMetaDataCache().getTable(new PTableKey(conn.getTenantId(), tableName));
PColumnFamily pfamily = table.getColumnFamily(cfName);
for (PColumn column : pfamily.getColumns()) {
- PColumn indexColumn = index.getColumn(IndexUtil.getIndexColumnName(column));
- ColumnRef ref = new ColumnRef(tableRef, indexColumn.getPosition());
+ String indexColName = IndexUtil.getIndexColumnName(column);
+ PColumn indexColumn = null;
+ ColumnRef ref = null;
+ try {
+ indexColumn = index.getColumn(indexColName);
+ ref = new ColumnRef(tableRef, indexColumn.getPosition());
+ } catch (ColumnNotFoundException e) {
+ if (index.getIndexType() == IndexType.LOCAL) {
+ try {
+ ref = new LocalIndexDataColumnRef(context, indexColName);
+ indexColumn = ref.getColumn();
+ } catch (ColumnFamilyNotFoundException c) {
+ throw e;
+ }
+ } else {
+ throw e;
+ }
+ }
Expression expression = ref.newColumnExpression();
projectedExpressions.add(expression);
String colName = column.getName().toString();