This is an automated email from the ASF dual-hosted git repository.

lokiore pushed a commit to branch PHOENIX-6978-feature
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/PHOENIX-6978-feature by this 
push:
     new 0dfa094a70 PHOENIX-7041 (ADDENDUM ): Populate ROW_KEY_PREFIX column 
when creating views (#1821)
0dfa094a70 is described below

commit 0dfa094a7032cf353c01101c460bc2e19c854ab8
Author: Jacob Isaac <[email protected]>
AuthorDate: Fri Feb 16 11:34:07 2024 -0800

    PHOENIX-7041 (ADDENDUM ): Populate ROW_KEY_PREFIX column when creating 
views (#1821)
    
    * Refactored ROW_KEY_PREFIX column name to ROW_KEY_MATCHER
---
 ...fixTestIT.java => BaseRowKeyMatcherTestIT.java} | 721 ++++++++++++---------
 ... LongViewIndexDisabledBaseRowKeyMatcherIT.java} |  26 +-
 ...> LongViewIndexEnabledBaseRowKeyMatcherIT.java} |  26 +-
 .../phoenix/end2end/ReadOnlyViewOnReadOnlyIT.java  |   3 +-
 .../apache/phoenix/end2end/TTLAsPhoenixTTLIT.java  |   7 +-
 .../phoenix/compile/CreateTableCompiler.java       |  14 +-
 .../org/apache/phoenix/compile/WhereOptimizer.java |  40 +-
 .../phoenix/coprocessor/MetaDataEndpointImpl.java  |  23 +-
 .../phoenix/jdbc/PhoenixDatabaseMetaData.java      |   4 +-
 .../phoenix/query/ConnectionQueryServicesImpl.java |   3 +-
 .../org/apache/phoenix/query/QueryConstants.java   |   4 +-
 .../org/apache/phoenix/schema/DelegateTable.java   |   4 +-
 .../org/apache/phoenix/schema/MetaDataClient.java  |  21 +-
 .../java/org/apache/phoenix/schema/PTable.java     |   2 +-
 .../java/org/apache/phoenix/schema/PTableImpl.java |  30 +-
 .../apache/phoenix/schema/transform/Transform.java |   2 +-
 phoenix-core/src/main/protobuf/PTable.proto        |   2 +-
 17 files changed, 541 insertions(+), 391 deletions(-)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/BaseRowKeyPrefixTestIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
similarity index 54%
rename from 
phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/BaseRowKeyPrefixTestIT.java
rename to 
phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
index d66403cae6..76d4f5da41 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/BaseRowKeyPrefixTestIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
@@ -16,7 +16,7 @@
  * limitations under the License.
  */
 
-package org.apache.phoenix.end2end.prefix;
+package org.apache.phoenix.end2end;
 
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.hadoop.hbase.CompareOperator;
@@ -40,7 +40,6 @@ import org.apache.phoenix.compile.FromCompiler;
 import org.apache.phoenix.compile.StatementContext;
 import org.apache.phoenix.compile.WhereOptimizer;
 import org.apache.phoenix.coprocessor.TableInfo;
-import org.apache.phoenix.end2end.ParallelStatsDisabledIT;
 import org.apache.phoenix.expression.Expression;
 import org.apache.phoenix.expression.RowKeyColumnExpression;
 import org.apache.phoenix.jdbc.PhoenixConnection;
@@ -72,7 +71,6 @@ import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.PropertiesUtil;
 import org.apache.phoenix.util.SchemaUtil;
 import org.apache.phoenix.util.ViewUtil;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -104,9 +102,9 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public abstract class BaseRowKeyPrefixTestIT extends ParallelStatsDisabledIT {
+public abstract class BaseRowKeyMatcherTestIT extends ParallelStatsDisabledIT {
 
-    private static final Logger LOGGER = 
LoggerFactory.getLogger(BaseRowKeyPrefixTestIT.class);
+    private static final Logger LOGGER = 
LoggerFactory.getLogger(BaseRowKeyMatcherTestIT.class);
 
     public static final String TENANT_URL_FMT = "%s;%s=%s";
     public static final String ORG_ID_PREFIX = "00D0x0000";
@@ -126,34 +124,33 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
     public static final Random RANDOM_GEN = new Random();
     public static final int MAX_ROWS = 10000;
 
-
     // Returns the String form of the data type
     private String getType(PDataType pkType) {
         String pkTypeStr = "VARCHAR(25)";
         switch (pkType.getSqlType()) {
-            case Types.VARCHAR:
-                pkTypeStr = "VARCHAR(25)";
-                break;
-            case Types.CHAR:
-                pkTypeStr = "CHAR(15)";
-                break;
-            case Types.DECIMAL:
-                pkTypeStr = "DECIMAL(8,2)";
-                break;
-            case Types.INTEGER:
-                pkTypeStr = "INTEGER";
-                break;
-            case Types.BIGINT:
-                pkTypeStr = "BIGINT";
-                break;
-            case Types.DATE:
-                pkTypeStr = "DATE";
-                break;
-            case Types.TIMESTAMP:
-                pkTypeStr = "TIMESTAMP";
-                break;
-            default:
-                pkTypeStr = "VARCHAR(25)";
+        case Types.VARCHAR:
+            pkTypeStr = "VARCHAR(25)";
+            break;
+        case Types.CHAR:
+            pkTypeStr = "CHAR(15)";
+            break;
+        case Types.DECIMAL:
+            pkTypeStr = "DECIMAL(8,2)";
+            break;
+        case Types.INTEGER:
+            pkTypeStr = "INTEGER";
+            break;
+        case Types.BIGINT:
+            pkTypeStr = "BIGINT";
+            break;
+        case Types.DATE:
+            pkTypeStr = "DATE";
+            break;
+        case Types.TIMESTAMP:
+            pkTypeStr = "TIMESTAMP";
+            break;
+        default:
+            pkTypeStr = "VARCHAR(25)";
         }
         return pkTypeStr;
     }
@@ -192,35 +189,35 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
     private Object getPKData(String testPKTypes) {
         Random rnd = new Random();
         switch (testPKTypes) {
-            case "VARCHAR": {
-                return RandomStringUtils.randomAlphanumeric(25);
-            }
-            case "CHAR(15)": {
-                //pkTypeStr = "CHAR(15)";
-                return RandomStringUtils.randomAlphanumeric(15);
-            }
-            case "CHAR(3)": {
-                //pkTypeStr = "CHAR(3)";
-                return RandomStringUtils.randomAlphanumeric(3);
-            }
-            case "DECIMAL":
-                //pkTypeStr = "DECIMAL(8,2)";
-                return Math.floor(rnd.nextInt(50000) * rnd.nextDouble());
-            case "INTEGER":
-                //pkTypeStr = "INTEGER";
-                return rnd.nextInt(50000);
-            case "BIGINT":
-                //pkTypeStr = "BIGINT";
-                return rnd.nextInt(50000);
-            case "DATE":
-                //pkTypeStr = "DATE";
-                return new Date(System.currentTimeMillis() + 
rnd.nextInt(50000));
-            case "TIMESTAMP":
-                //pkTypeStr = "TIMESTAMP";
-                return new Timestamp(System.currentTimeMillis() + 
rnd.nextInt(50000));
-            default:
-                // pkTypeStr = "VARCHAR(25)";
-                return RandomStringUtils.randomAlphanumeric(25);
+        case "VARCHAR": {
+            return RandomStringUtils.randomAlphanumeric(25);
+        }
+        case "CHAR(15)": {
+            //pkTypeStr = "CHAR(15)";
+            return RandomStringUtils.randomAlphanumeric(15);
+        }
+        case "CHAR(3)": {
+            //pkTypeStr = "CHAR(3)";
+            return RandomStringUtils.randomAlphanumeric(3);
+        }
+        case "DECIMAL":
+            //pkTypeStr = "DECIMAL(8,2)";
+            return Math.floor(rnd.nextInt(50000) * rnd.nextDouble());
+        case "INTEGER":
+            //pkTypeStr = "INTEGER";
+            return rnd.nextInt(50000);
+        case "BIGINT":
+            //pkTypeStr = "BIGINT";
+            return rnd.nextInt(50000);
+        case "DATE":
+            //pkTypeStr = "DATE";
+            return new Date(System.currentTimeMillis() + rnd.nextInt(50000));
+        case "TIMESTAMP":
+            //pkTypeStr = "TIMESTAMP";
+            return new Timestamp(System.currentTimeMillis() + 
rnd.nextInt(50000));
+        default:
+            // pkTypeStr = "VARCHAR(25)";
+            return RandomStringUtils.randomAlphanumeric(25);
 
         }
     }
@@ -231,19 +228,24 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
         try (Connection globalConnection = 
DriverManager.getConnection(getUrl())) {
             try (Statement cstmt = globalConnection.createStatement()) {
-                String CO_BASE_TBL_TEMPLATE = "CREATE TABLE IF NOT EXISTS 
%s(OID CHAR(15) NOT NULL,KP CHAR(3) NOT NULL, COL1 VARCHAR,CREATED_DATE 
DATE,CREATED_BY CHAR(15),LAST_UPDATE DATE,LAST_UPDATE_BY 
CHAR(15),SYSTEM_MODSTAMP DATE CONSTRAINT pk PRIMARY KEY (OID,KP)) 
COLUMN_ENCODED_BYTES=0 %s";
-                cstmt.execute(String.format(CO_BASE_TBL_TEMPLATE, 
baseTableName, isMultiTenant ? ", MULTI_TENANT=true" : ""));
+                String
+                        CO_BASE_TBL_TEMPLATE =
+                        "CREATE TABLE IF NOT EXISTS %s(" +
+                                "OID CHAR(15) NOT NULL,KP CHAR(3) NOT NULL, " +
+                                "COL1 VARCHAR,CREATED_DATE DATE,CREATED_BY 
CHAR(15)," +
+                                "LAST_UPDATE DATE,LAST_UPDATE_BY 
CHAR(15),SYSTEM_MODSTAMP DATE " +
+                                "CONSTRAINT pk PRIMARY KEY (OID,KP)) 
COLUMN_ENCODED_BYTES=0 %s";
+                cstmt.execute(String.format(CO_BASE_TBL_TEMPLATE, 
baseTableName,
+                        isMultiTenant ? ", MULTI_TENANT=true" : ""));
             }
         }
     }
 
     // Helper method to create a global view
-    // Return a pair [view-key, row-prefix for the view]
-    private Pair<String, byte[]> createGlobalView(String tableName,
-            int partition,
-            PDataType[] pkTypes,
-            SortOrder[] pkOrders,
-            boolean hasGlobalViewIndexes) throws SQLException {
+    // Return a pair [view-key, row-key-matcher for the view]
+    private Pair<String, byte[]> createGlobalView(String tableName, int 
partition,
+            PDataType[] pkTypes, SortOrder[] pkOrders, boolean 
hasGlobalViewIndexes)
+            throws SQLException {
 
         String pkType1Str = getType(pkTypes[0]);
         String pkType2Str = getType(pkTypes[1]);
@@ -252,71 +254,77 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         String baseTableName = String.format(BASE_TABLE_NAME_FMT, tableName);
         String partitionName = String.format(PARTITION_FMT, partition);
         String globalViewName = String.format(GLOBAL_VIEW_NAME_FMT, 
partitionName);
-        try (PhoenixConnection globalConnection = 
DriverManager.getConnection(getUrl()).unwrap(PhoenixConnection.class)) {
+        try (PhoenixConnection globalConnection = 
DriverManager.getConnection(getUrl())
+                .unwrap(PhoenixConnection.class)) {
             try (Statement cstmt = globalConnection.createStatement()) {
-                String VIEW_TEMPLATE = "CREATE VIEW IF NOT EXISTS %s(ID1 %s 
not null,ID2 %s not null,ID3 %s not null, ROW_ID CHAR(15) not null, COL2 
VARCHAR " +
-                        "CONSTRAINT pk PRIMARY KEY (ID1 %s, ID2 %s, ID3 %s, 
ROW_ID)) " +
-                        "AS SELECT * FROM %s WHERE KP = '%s'";
-
-                cstmt.execute(String.format(VIEW_TEMPLATE, globalViewName, 
pkType1Str, pkType2Str, pkType3Str,
-                        
pkOrders[0].name(),pkOrders[1].name(),pkOrders[2].name(), baseTableName, 
partitionName));
+                String
+                        VIEW_TEMPLATE =
+                        "CREATE VIEW IF NOT EXISTS %s(" +
+                                "ID1 %s not null,ID2 %s not null,ID3 %s not 
null, " +
+                                "ROW_ID CHAR(15) not null, COL2 VARCHAR " +
+                                "CONSTRAINT pk PRIMARY KEY (ID1 %s, ID2 %s, 
ID3 %s, ROW_ID)) " +
+                                "AS SELECT * FROM %s WHERE KP = '%s'";
+
+                cstmt.execute(String.format(VIEW_TEMPLATE, globalViewName, 
pkType1Str, pkType2Str,
+                        pkType3Str, pkOrders[0].name(), pkOrders[1].name(), 
pkOrders[2].name(),
+                        baseTableName, partitionName));
                 if (hasGlobalViewIndexes) {
                     String indexNamePrefix = String.format("G%s", partition);
-                    String GLOBAL_INDEX_TEMPLATE = "CREATE INDEX IF NOT EXISTS 
%s_COL2_INDEX ON %s (COL2) INCLUDE(SYSTEM_MODSTAMP)";
-                    cstmt.execute(String.format(GLOBAL_INDEX_TEMPLATE, 
indexNamePrefix, globalViewName));
+                    String
+                            GLOBAL_INDEX_TEMPLATE =
+                            "CREATE INDEX IF NOT EXISTS %s_COL2_INDEX ON %s 
(COL2) " +
+                                    "INCLUDE(SYSTEM_MODSTAMP)";
+                    cstmt.execute(
+                            String.format(GLOBAL_INDEX_TEMPLATE, 
indexNamePrefix, globalViewName));
                 }
 
-                return 
getRowKeyPrefixesFromView(globalConnection.unwrap(PhoenixConnection.class), 
globalViewName);
+                return 
getRowKeyMatchersFromView(globalConnection.unwrap(PhoenixConnection.class),
+                        globalViewName);
             }
         }
     }
 
     // Helper method to create a tenant view
-    // Return a pair [view-key, row-prefix for the view]
+    // Return a pair [view-key, row-key-matcher for the view]
 
-    private Pair<String, byte[]> createTenantView(
-            boolean extendPK,
-            int partition,
-            int tenant,
-            int tenantViewNum,
-            String[] pkNames,
-            PDataType[] pkTypes) throws SQLException {
+    private Pair<String, byte[]> createTenantView(boolean extendPK, int 
partition, int tenant,
+            int tenantViewNum, String[] pkNames, PDataType[] pkTypes) throws 
SQLException {
 
         String partitionName = String.format(PARTITION_FMT, partition);
         String globalViewName = String.format(GLOBAL_VIEW_NAME_FMT, 
partitionName);
 
         String tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, tenant);
-        String tenantConnectionUrl = String.format(TENANT_URL_FMT, getUrl(), 
TENANT_ID_ATTRIB, tenantId);
+        String
+                tenantConnectionUrl =
+                String.format(TENANT_URL_FMT, getUrl(), TENANT_ID_ATTRIB, 
tenantId);
         String tenantViewName = String.format(TENANT_VIEW_NAME_FMT, 
partitionName, tenantViewNum);
-        //String tenantViewOptions = (partition % 2 != 0) ? 
String.format("TTL=%d", new Random().nextInt(300)) : "";
         String tenantViewOptions = "";
         try (Connection tenantConnection = 
DriverManager.getConnection(tenantConnectionUrl)) {
             tenantConnection.setAutoCommit(true);
             try (Statement cstmt = tenantConnection.createStatement()) {
-                String VIEW_WITH_PK_TEMPLATE = "CREATE VIEW IF NOT EXISTS 
%s(ZID CHAR(15) NOT NULL,COL3 VARCHAR CONSTRAINT pk PRIMARY KEY (ZID)) " +
-                        "AS SELECT * FROM %s %s %s";
+                String
+                        VIEW_WITH_PK_TEMPLATE =
+                        "CREATE VIEW IF NOT EXISTS %s(ZID CHAR(15) NOT 
NULL,COL3 VARCHAR " +
+                                "CONSTRAINT pk PRIMARY KEY (ZID)) " + "AS 
SELECT * FROM %s %s %s";
                 String VIEW_WO_PK_TEMPLATE = "CREATE VIEW IF NOT EXISTS %s AS 
SELECT * from %s %s";
                 if (extendPK) {
-                    cstmt.execute(String.format(VIEW_WITH_PK_TEMPLATE, 
tenantViewName, globalViewName, getWhereClause(pkNames, pkTypes), 
tenantViewOptions));
+                    cstmt.execute(
+                            String.format(VIEW_WITH_PK_TEMPLATE, 
tenantViewName, globalViewName,
+                                    getWhereClause(pkNames, pkTypes), 
tenantViewOptions));
                 } else {
-                    cstmt.execute(String.format(VIEW_WO_PK_TEMPLATE, 
tenantViewName, globalViewName, tenantViewOptions));
+                    cstmt.execute(String.format(VIEW_WO_PK_TEMPLATE, 
tenantViewName, globalViewName,
+                            tenantViewOptions));
                 }
-                return 
getRowKeyPrefixesFromView(tenantConnection.unwrap(PhoenixConnection.class), 
tenantViewName);
+                return 
getRowKeyMatchersFromView(tenantConnection.unwrap(PhoenixConnection.class),
+                        tenantViewName);
             }
         }
     }
 
     // Helper method to create rows for a given tenant view
-    private void upsertTenantViewRows(
-            boolean isMultiTenant,
-            boolean extendPK,
-            int partition,
-            int tenant,
-            int tenantViewNum,
-            int rowIndex,
-            String[] pkNames,
-            PDataType[] pkTypes
-            ) throws SQLException {
+    private void upsertTenantViewRows(boolean isMultiTenant, boolean extendPK, 
int partition,
+            int tenant, int tenantViewNum, int rowIndex, String[] pkNames, 
PDataType[] pkTypes)
+            throws SQLException {
 
         String rid = String.format(ROW_ID_FMT, rowIndex);
         String zid = String.format(ZID_FMT, rowIndex);
@@ -330,19 +338,44 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         String partitionName = String.format(PARTITION_FMT, partition);
 
         String tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, tenant);
-        String tenantConnectionUrl = String.format(TENANT_URL_FMT, getUrl(), 
TENANT_ID_ATTRIB, tenantId);
+        String
+                tenantConnectionUrl =
+                String.format(TENANT_URL_FMT, getUrl(), TENANT_ID_ATTRIB, 
tenantId);
         String tenantViewName = String.format(TENANT_VIEW_NAME_FMT, 
partitionName, tenantViewNum);
-        try (PhoenixConnection tenantConnection = 
DriverManager.getConnection(tenantConnectionUrl).unwrap(PhoenixConnection.class))
 {
+        try (PhoenixConnection tenantConnection = 
DriverManager.getConnection(tenantConnectionUrl)
+                .unwrap(PhoenixConnection.class)) {
             tenantConnection.setAutoCommit(true);
-            String TENANT_VIEW_WITH_PK = String.format("UPSERT INTO %s(ROW_ID, 
ZID, COL1, COL2, COL3, SYSTEM_MODSTAMP) VALUES(?, ?, ?, ?, ?, ?)", 
tenantViewName);
-            String TENANT_VIEW_WO_PK = String.format("UPSERT INTO %s(ID1, ID2, 
ID3, ROW_ID, COL1, COL2, SYSTEM_MODSTAMP) VALUES(?, ?, ?, ?, ?, ?, ?)", 
tenantViewName);
-            String NON_MULTI_TENANT_VIEW_WO_PK = String.format("UPSERT INTO 
%s(OID, ID1, ID2, ID3, ROW_ID, COL1, COL2, SYSTEM_MODSTAMP) VALUES(?, ?, ?, ?, 
?, ?, ?, ?)", tenantViewName);
-            String NON_MULTI_TENANT_VIEW_WITH_PK = String.format("UPSERT INTO 
%s(OID, ROW_ID, ZID, COL1, COL2, COL3, SYSTEM_MODSTAMP) VALUES(?, ?, ?, ?, ?, 
?, ?)", tenantViewName);
+            String
+                    TENANT_VIEW_WITH_PK =
+                    String.format(
+                            "UPSERT INTO %s(ROW_ID, ZID, COL1, COL2, COL3, 
SYSTEM_MODSTAMP) " +
+                                    "VALUES(?, ?, ?, ?, ?, ?)",
+                            tenantViewName);
+            String
+                    TENANT_VIEW_WO_PK =
+                    String.format(
+                            "UPSERT INTO %s(ID1, ID2, ID3, ROW_ID, COL1, COL2, 
SYSTEM_MODSTAMP) " +
+                                    "VALUES(?, ?, ?, ?, ?, ?, ?)",
+                            tenantViewName);
+            String
+                    NON_MULTI_TENANT_VIEW_WO_PK =
+                    String.format(
+                            "UPSERT INTO %s(OID, ID1, ID2, ID3, ROW_ID, COL1, 
COL2, " +
+                                    "SYSTEM_MODSTAMP) " +
+                                    "VALUES(?, ?, ?, ?, ?, ?, ?, ?)",
+                            tenantViewName);
+            String
+                    NON_MULTI_TENANT_VIEW_WITH_PK =
+                    String.format(
+                            "UPSERT INTO %s(OID, ROW_ID, ZID, COL1, COL2, 
COL3, SYSTEM_MODSTAMP) " +
+                                    "VALUES(?, ?, ?, ?, ?, ?, ?)",
+                            tenantViewName);
 
             if (isMultiTenant) {
                 if (extendPK) {
                     // Case: MultiTenant and ExtendedPK
-                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(TENANT_VIEW_WITH_PK)) {
+                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(
+                            TENANT_VIEW_WITH_PK)) {
                         pstmt.setObject(1, rid);
                         pstmt.setObject(2, zid);
                         pstmt.setObject(3, col1);
@@ -356,7 +389,8 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
                     pk1 = getData(pkTypes[0]);
                     pk2 = getData(pkTypes[1]);
                     pk3 = getData(pkTypes[2]);
-                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(TENANT_VIEW_WO_PK)) {
+                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(
+                            TENANT_VIEW_WO_PK)) {
                         pstmt.setObject(1, pk1);
                         pstmt.setObject(2, pk2);
                         pstmt.setObject(3, pk3);
@@ -371,7 +405,8 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
             } else {
                 if (extendPK) {
                     // Case: Non MultiTenant and ExtendedPK
-                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(NON_MULTI_TENANT_VIEW_WITH_PK)) {
+                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(
+                            NON_MULTI_TENANT_VIEW_WITH_PK)) {
                         pstmt.setObject(1, tenantId);
                         pstmt.setObject(2, rid);
                         pstmt.setObject(3, zid);
@@ -386,7 +421,8 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
                     pk1 = getData(pkTypes[0]);
                     pk2 = getData(pkTypes[1]);
                     pk3 = getData(pkTypes[2]);
-                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(NON_MULTI_TENANT_VIEW_WO_PK)) {
+                    try (PreparedStatement pstmt = 
tenantConnection.prepareStatement(
+                            NON_MULTI_TENANT_VIEW_WO_PK)) {
                         pstmt.setObject(1, tenantId);
                         pstmt.setObject(2, pk1);
                         pstmt.setObject(3, pk2);
@@ -401,50 +437,48 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
             }
 
-        }
-        finally {
-            LOGGER.debug(String.format("Upsert values " +
-                    "tenantId = %s, pk1 = %s, pk2 = %s, pk3 = %s, rid = %s, 
col1 = %s, col2 = %s",
-                    tenantId,
-                    pk1,
-                    pk2,
-                    pk3,
-                    rid,
-                    col1,
-                    col2));
+        } finally {
+            LOGGER.debug(String.format(
+                    "Upsert values " +
+                            "tenantId = %s, pk1 = %s, pk2 = %s, pk3 = %s, " +
+                            "rid = %s, col1 = %s, col2 = %s",
+                    tenantId, pk1, pk2, pk3, rid, col1, col2));
         }
     }
 
-    // Helper to get rowKeyPrefix from Metadata.
-    private Pair<String, byte[]> getRowKeyPrefixesFromView(PhoenixConnection 
connection, String viewName)
-            throws SQLException {
+    // Helper to get rowKeyMatcher from Metadata.
+    private Pair<String, byte[]> getRowKeyMatchersFromView(PhoenixConnection 
connection,
+            String viewName) throws SQLException {
 
         PName tenantId = connection.getTenantId();
         PTable view = PhoenixRuntime.getTable(connection, viewName);
         String tenantViewKey = String.format("%s.%s", tenantId, viewName);
-        byte[] rowkeyPrefix = view.getRowKeyPrefix();
-        return new Pair(tenantViewKey, rowkeyPrefix);
+        byte[] rowKeyMatcher = view.getRowKeyMatcher();
+        return new Pair(tenantViewKey, rowKeyMatcher);
 
     }
-    // Helper to get rowKeyPrefix from Metadata.
-    private Pair<String, byte[]> getRowKeyPrefixesFromView(PhoenixConnection 
connection, PTable view)
-            throws SQLException {
-        return getRowKeyPrefixesFromView(connection, 
view.getName().getString());
-    }
 
+    // Helper to get rowKeyMatcher from Metadata.
+    private Pair<String, byte[]> getRowKeyMatchersFromView(PhoenixConnection 
connection,
+            PTable view) throws SQLException {
+        return getRowKeyMatchersFromView(connection, 
view.getName().getString());
+    }
 
-    // Helper to assert that row prefix generated by the 2 WhereOptimizer 
methods are the same
-    private byte[] assertRowKeyPrefixForView(PhoenixConnection connection, 
PTable view, Pair<String, byte[]> rowKeyInfo)
-            throws SQLException {
+    // Helper to assert that row key matcher generated by the 2 WhereOptimizer 
methods are the same
+    private byte[] assertRowKeyMatcherForView(PhoenixConnection connection, 
PTable view,
+            Pair<String, byte[]> rowKeyInfo) throws SQLException {
 
         String viewStatement = view.getViewStatement();
         SelectStatement viewSelectStatement = new 
SQLParser(viewStatement).parseQuery();
 
-        PhoenixPreparedStatement preparedViewStatement =
+        PhoenixPreparedStatement
+                preparedViewStatement =
                 
connection.prepareStatement(viewStatement).unwrap(PhoenixPreparedStatement.class);
 
         ColumnResolver resolver = 
FromCompiler.getResolverForQuery(viewSelectStatement, connection);
-        StatementContext viewStatementContext = new 
StatementContext(preparedViewStatement, resolver);
+        StatementContext
+                viewStatementContext =
+                new StatementContext(preparedViewStatement, resolver);
 
         PTable viewStatementTable = 
viewStatementContext.getCurrentTable().getTable();
 
@@ -452,58 +486,87 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         BitSet isViewColumnReferencedToBe = new BitSet(nColumns);
         // Used to track column references in a view
         ExpressionCompiler
-                expressionCompiler = new 
CreateTableCompiler.ColumnTrackingExpressionCompiler(viewStatementContext, 
isViewColumnReferencedToBe);
+                expressionCompiler =
+                new 
CreateTableCompiler.ColumnTrackingExpressionCompiler(viewStatementContext,
+                        isViewColumnReferencedToBe);
         ParseNode whereNode = viewSelectStatement.getWhere();
 
         Expression whereExpression = whereNode.accept(expressionCompiler);
 
-
         byte[][] viewColumnConstantsToBe = new byte[nColumns][];
         CreateTableCompiler.ViewWhereExpressionVisitor
-                visitor = new 
CreateTableCompiler.ViewWhereExpressionVisitor(viewStatementTable, 
viewColumnConstantsToBe);
+                visitor =
+                new 
CreateTableCompiler.ViewWhereExpressionVisitor(viewStatementTable,
+                        viewColumnConstantsToBe);
         whereExpression.accept(visitor);
 
-        TableName tableName = 
TableName.createNormalized(view.getSchemaName().getString(), 
view.getTableName().getString());
-        byte[] rowKeyPrefix1 = 
WhereOptimizer.getRowKeyPrefix(viewStatementContext, tableName, 
viewStatementTable, whereExpression);
-        byte[] rowKeyPrefix2 = WhereOptimizer.getRowKeyPrefix(connection, 
tableName, viewStatementTable, viewColumnConstantsToBe, 
isViewColumnReferencedToBe);
-        LOGGER.debug(String.format("target-view-name = %s, physical = %s, 
stmt-table = %s\n, row-prefix-0 = %s (syscat)\n, row-prefix-1 = %s\n, 
row-prefix-2 = %s\n",
-                view.getName().getString(),
-                viewStatementTable.getPhysicalName().getString(),
+        TableName
+                tableName =
+                TableName.createNormalized(view.getSchemaName().getString(),
+                        view.getTableName().getString());
+        byte[]
+                rowKeyMatcher1 =
+                WhereOptimizer.getRowKeyMatcher(viewStatementContext, 
tableName, viewStatementTable,
+                        whereExpression);
+        byte[]
+                rowKeyMatcher2 =
+                WhereOptimizer.getRowKeyMatcher(connection, tableName, 
viewStatementTable,
+                        viewColumnConstantsToBe, isViewColumnReferencedToBe);
+        LOGGER.debug(String.format(
+                "target-view-name = %s, physical = %s, stmt-table = %s\n, " +
+                        "row-matcher-0 = %s (syscat)\n, row-matcher-1 = %s\n, 
row-matcher-2 = %s\n",
+                view.getName().getString(), 
viewStatementTable.getPhysicalName().getString(),
                 viewStatementTable.getName().getString(),
-                Bytes.toStringBinary(rowKeyInfo.getSecond()),
-                Bytes.toStringBinary(rowKeyPrefix1),
-                Bytes.toStringBinary(rowKeyPrefix2)
-        ));
-        assertTrue("RowKey Prefixes do not match", 
Bytes.compareTo(rowKeyInfo.getSecond(), rowKeyPrefix1) == 0);
-        assertTrue("RowKey Prefixes do not match", 
Bytes.compareTo(rowKeyInfo.getSecond(), rowKeyPrefix2) == 0);
-        return rowKeyPrefix1;
+                Bytes.toStringBinary(rowKeyInfo.getSecond()), 
Bytes.toStringBinary(rowKeyMatcher1),
+                Bytes.toStringBinary(rowKeyMatcher2)));
+        assertTrue("RowKey matcher pattern do not match",
+                Bytes.compareTo(rowKeyInfo.getSecond(), rowKeyMatcher1) == 0);
+        assertTrue("RowKey matcher patterns do not match",
+                Bytes.compareTo(rowKeyInfo.getSecond(), rowKeyMatcher2) == 0);
+        return rowKeyMatcher1;
     }
 
-    // Helper method to return the row prefixes for the whole view hierarchy 
under the table.
-    private Map<String, byte[]> assertRowKeyPrefixesForTable(String url, 
String parentSchemaName, String parentTableName) {
+    // Helper method to return the row-key matcher patterns
+    // for the whole view hierarchy under the table.
+    private Map<String, byte[]> assertRowKeyMatchersForTable(String url, 
String parentSchemaName,
+            String parentTableName) {
         Map<String, byte[]> viewToRowKeyMap = Maps.newHashMap();
         Properties tenantProps = PropertiesUtil.deepCopy(new Properties());
         try (Connection globalConnection = DriverManager.getConnection(url)) {
-            ConnectionQueryServices cqs = 
globalConnection.unwrap(PhoenixConnection.class).getQueryServices();
-            try (Table childLinkTable = 
cqs.getTable(SchemaUtil.getPhysicalName(
-                    SYSTEM_LINK_HBASE_TABLE_NAME.toBytes(), 
cqs.getProps()).getName())) {
-                Pair<List<PTable>, List<TableInfo>> allDescendants =
+            ConnectionQueryServices
+                    cqs =
+                    
globalConnection.unwrap(PhoenixConnection.class).getQueryServices();
+            try (Table childLinkTable = cqs.getTable(
+                    
SchemaUtil.getPhysicalName(SYSTEM_LINK_HBASE_TABLE_NAME.toBytes(),
+                            cqs.getProps()).getName())) {
+                Pair<List<PTable>, List<TableInfo>>
+                        allDescendants =
                         ViewUtil.findAllDescendantViews(childLinkTable, 
cqs.getConfiguration(),
                                 EMPTY_BYTE_ARRAY, parentSchemaName.getBytes(),
-                                parentTableName.getBytes(), 
HConstants.LATEST_TIMESTAMP, false);
+                                parentTableName.getBytes(),
+                                HConstants.LATEST_TIMESTAMP, false);
                 for (PTable view : allDescendants.getFirst()) {
                     PName tenantId = view.getTenantId();
                     String viewName = view.getName().getString();
 
-                    Connection stmtConnection = tenantId == null?
-                            globalConnection :  DriverManager.getConnection(
-                            String.format("%s;%s=%s", url, TENANT_ID_ATTRIB, 
tenantId.getString()), tenantProps);
-
-                    Pair<String, byte[]> rowKeyInfo  = 
getRowKeyPrefixesFromView(stmtConnection.unwrap(PhoenixConnection.class), view);
-                    
assertRowKeyPrefixForView(stmtConnection.unwrap(PhoenixConnection.class), view, 
rowKeyInfo);
+                    Connection
+                            stmtConnection =
+                            tenantId == null ?
+                                    globalConnection :
+                                    DriverManager.getConnection(
+                                            String.format("%s;%s=%s", url, 
TENANT_ID_ATTRIB,
+                                                    tenantId.getString()), 
tenantProps);
+
+                    Pair<String, byte[]>
+                            rowKeyInfo =
+                            getRowKeyMatchersFromView(
+                                    
stmtConnection.unwrap(PhoenixConnection.class), view);
+                    
assertRowKeyMatcherForView(stmtConnection.unwrap(PhoenixConnection.class), view,
+                            rowKeyInfo);
                     viewToRowKeyMap.put(rowKeyInfo.getFirst(), 
rowKeyInfo.getSecond());
                 }
-            };
+            }
+            ;
         } catch (SQLException | IOException e) {
             throw new RuntimeException(e);
         }
@@ -516,53 +579,55 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         StringBuilder builder = new StringBuilder("WHERE ");
         Random rnd = new Random();
 
-        for (int b=0;b<testPKTypes.length;b++) {
-            if (b>0) builder.append(" AND ");
+        for (int b = 0; b < testPKTypes.length; b++) {
+            if (b > 0) builder.append(" AND ");
             switch (testPKTypes[b].getSqlType()) {
-                case Types.VARCHAR: {
-                    // pkTypeStr = "VARCHAR(25)";
-                    builder.append(pkNames[b]).append(" = ").append("'")
-                            
.append(RandomStringUtils.randomAlphanumeric(25)).append("'");
-                    break;
-                }
-                case Types.CHAR: {
-                    //pkTypeStr = "CHAR(15)";
-                    builder.append(pkNames[b]).append(" = ").append("'")
-                            
.append(RandomStringUtils.randomAlphanumeric(15)).append("'");
-                    break;
-                }
-                case Types.DECIMAL:
-                    //pkTypeStr = "DECIMAL(8,2)";
-                    builder.append(pkNames[b]).append(" = 
").append(rnd.nextDouble());
-                    break;
-                case Types.INTEGER:
-                    //pkTypeStr = "INTEGER";
-                    builder.append(pkNames[b]).append(" = 
").append(rnd.nextInt(500000));
-                    break;
-                case Types.BIGINT:
-                    //pkTypeStr = "BIGINT";
-                    builder.append(pkNames[b]).append(" = 
").append(rnd.nextLong());
-                    break;
-                case Types.DATE:
-                    //pkTypeStr = "DATE";
-                    builder.append(pkNames[b]).append(" = ").append(" 
TO_DATE('2022-03-21T15:03:57+00:00') ");
-                    break;
-                case Types.TIMESTAMP:
-                    //pkTypeStr = "TIMESTAMP";
-                    builder.append(pkNames[b]).append(" = ").append(" 
TO_TIMESTAMP('2019-10-27T16:17:57+00:00') ");
-                    break;
-                default:
-                    // pkTypeStr = "VARCHAR(25)";
-                    builder.append(pkNames[b]).append("=").append("'")
-                            
.append(RandomStringUtils.randomAlphanumeric(15)).append("'");
+            case Types.VARCHAR: {
+                // pkTypeStr = "VARCHAR(25)";
+                builder.append(pkNames[b]).append(" = ").append("'")
+                        
.append(RandomStringUtils.randomAlphanumeric(25)).append("'");
+                break;
+            }
+            case Types.CHAR: {
+                //pkTypeStr = "CHAR(15)";
+                builder.append(pkNames[b]).append(" = ").append("'")
+                        
.append(RandomStringUtils.randomAlphanumeric(15)).append("'");
+                break;
+            }
+            case Types.DECIMAL:
+                //pkTypeStr = "DECIMAL(8,2)";
+                builder.append(pkNames[b]).append(" = 
").append(rnd.nextDouble());
+                break;
+            case Types.INTEGER:
+                //pkTypeStr = "INTEGER";
+                builder.append(pkNames[b]).append(" = 
").append(rnd.nextInt(500000));
+                break;
+            case Types.BIGINT:
+                //pkTypeStr = "BIGINT";
+                builder.append(pkNames[b]).append(" = 
").append(rnd.nextLong());
+                break;
+            case Types.DATE:
+                //pkTypeStr = "DATE";
+                builder.append(pkNames[b]).append(" = ")
+                        .append(" TO_DATE('2022-03-21T15:03:57+00:00') ");
+                break;
+            case Types.TIMESTAMP:
+                //pkTypeStr = "TIMESTAMP";
+                builder.append(pkNames[b]).append(" = ")
+                        .append(" TO_TIMESTAMP('2019-10-27T16:17:57+00:00') ");
+                break;
+            default:
+                // pkTypeStr = "VARCHAR(25)";
+                builder.append(pkNames[b]).append("=").append("'")
+                        
.append(RandomStringUtils.randomAlphanumeric(15)).append("'");
             }
         }
         return builder.toString();
     }
 
     // Asserts that the row matched by the rowId and tenantId matches the 
prefix
-    private void assertHBaseRowKeyMatchesPrefix(PhoenixConnection connection, 
byte[] hbaseTableName, int rowId, byte[] prefix)
-            throws IOException, SQLException {
+    private void assertHBaseRowKeyMatchesPrefix(PhoenixConnection connection, 
byte[] hbaseTableName,
+            int rowId, byte[] prefix) throws IOException, SQLException {
 
         byte[] rowkey = ByteUtil.EMPTY_BYTE_ARRAY;
         String rid = String.format(ROW_ID_FMT, rowId);
@@ -589,29 +654,26 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
             PrefixFilter matchFilter = new PrefixFilter(prefix);
             LOGGER.debug(String.format("row-key = %s, tenantId = %s, prefix = 
%s, matched = %s",
-                    Bytes.toStringBinary(rowkey),
-                    tenantId,
-                    Bytes.toStringBinary(prefix),
+                    Bytes.toStringBinary(rowkey), tenantId, 
Bytes.toStringBinary(prefix),
                     
!matchFilter.filterRowKey(KeyValueUtil.createFirstOnRow(rowkey))));
         }
     }
 
-
     // Asserts that the row matching the tenantId and rowId matches with the 
viewIndexId
-    private void assertIndexTableRowKeyMatchesPrefix(PhoenixConnection 
connection, PTable viewIndex, byte[] hbaseIndexTableName, int rowId)
-            throws IOException, SQLException {
+    private void assertIndexTableRowKeyMatchesPrefix(PhoenixConnection 
connection, PTable viewIndex,
+            byte[] hbaseIndexTableName, int rowId) throws IOException, 
SQLException {
 
         byte[] rowkey = ByteUtil.EMPTY_BYTE_ARRAY;
         String rid = String.format(ROW_ID_FMT, rowId);
 
-
         try (Table tbl = 
connection.getQueryServices().getTable(hbaseIndexTableName)) {
 
             PName tenantId = connection.getTenantId();
             Scan allRows = new Scan();
             FilterList andFilter = new FilterList();
             if (tenantId != null) {
-                andFilter.addFilter(new RowFilter(CompareOperator.EQUAL, new 
SubstringComparator(tenantId.getString())));
+                andFilter.addFilter(new RowFilter(CompareOperator.EQUAL,
+                        new SubstringComparator(tenantId.getString())));
             }
             andFilter.addFilter(new RowFilter(CompareOperator.EQUAL, new 
SubstringComparator(rid)));
             allRows.setFilter(andFilter);
@@ -620,23 +682,29 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
             for (Result result = scanner.next(); result != null; result = 
scanner.next()) {
                 PColumn viewIndexIdPKColumn = viewIndex.getPKColumns().get(0);
                 RowKeyColumnExpression
-                        viewIndexIdColExpr = new 
RowKeyColumnExpression(viewIndexIdPKColumn, new 
RowKeyValueAccessor(viewIndex.getPKColumns(), 0));
+                        viewIndexIdColExpr =
+                        new RowKeyColumnExpression(viewIndexIdPKColumn,
+                                new 
RowKeyValueAccessor(viewIndex.getPKColumns(), 0));
                 ImmutableBytesWritable ptr = new ImmutableBytesWritable();
                 viewIndexIdColExpr.evaluate(new ResultTuple(result), ptr);
                 long actualViewIndexID;
                 if (hasLongViewIndexEnabled()) {
                     actualViewIndexID = 
PLong.INSTANCE.getCodec().decodeLong(ptr, SortOrder.ASC);
                 } else {
-                    actualViewIndexID = 
PSmallint.INSTANCE.getCodec().decodeShort(ptr, SortOrder.ASC);
+                    actualViewIndexID =
+                            PSmallint.INSTANCE.getCodec().decodeShort(ptr, 
SortOrder.ASC);
                 }
 
-                assertTrue("ViewIndexId's not match", 
viewIndex.getViewIndexId() == actualViewIndexID);
+                assertTrue("ViewIndexId's not match",
+                        viewIndex.getViewIndexId() == actualViewIndexID);
                 rowkey = result.getRow();
                 numMatchingRows++;
             }
-            assertEquals(String.format("Expected rows do match for index table 
= %s, row-key = %s, rowId = %s",
-                    Bytes.toString(hbaseIndexTableName), 
Bytes.toStringBinary(rowkey), rowId),
-                    1, numMatchingRows);
+            assertEquals(String.format(
+                            "Expected rows do match for index table = %s, 
row-key = %s, rowId = %s",
+                            Bytes.toString(hbaseIndexTableName),
+                            Bytes.toStringBinary(rowkey), rowId), 1,
+                    numMatchingRows);
 
         }
     }
@@ -644,16 +712,16 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
     protected abstract boolean hasLongViewIndexEnabled();
 
     private SortOrder[][] getSortOrders() {
-        SortOrder[][] sortOrders = new SortOrder[][] {
-                {SortOrder.ASC, SortOrder.ASC, SortOrder.ASC},
-                {SortOrder.ASC, SortOrder.ASC, SortOrder.DESC},
-                {SortOrder.ASC, SortOrder.DESC, SortOrder.ASC},
-                {SortOrder.ASC, SortOrder.DESC, SortOrder.DESC},
-                {SortOrder.DESC, SortOrder.ASC, SortOrder.ASC},
-                {SortOrder.DESC, SortOrder.ASC, SortOrder.DESC},
-                {SortOrder.DESC, SortOrder.DESC, SortOrder.ASC},
-                {SortOrder.DESC, SortOrder.DESC, SortOrder.DESC}
-        };
+        SortOrder[][]
+                sortOrders =
+                new SortOrder[][] { { SortOrder.ASC, SortOrder.ASC, 
SortOrder.ASC },
+                        { SortOrder.ASC, SortOrder.ASC, SortOrder.DESC },
+                        { SortOrder.ASC, SortOrder.DESC, SortOrder.ASC },
+                        { SortOrder.ASC, SortOrder.DESC, SortOrder.DESC },
+                        { SortOrder.DESC, SortOrder.ASC, SortOrder.ASC },
+                        { SortOrder.DESC, SortOrder.ASC, SortOrder.DESC },
+                        { SortOrder.DESC, SortOrder.DESC, SortOrder.ASC },
+                        { SortOrder.DESC, SortOrder.DESC, SortOrder.DESC } };
         return sortOrders;
     }
 
@@ -661,21 +729,22 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
         List<PDataType[]> testCases = new ArrayList<>();
         // Test Case 1: PK1 = Integer, PK2 = Integer, PK3 = Integer
-        testCases.add(new PDataType[] { PInteger.INSTANCE, PInteger.INSTANCE, 
PInteger.INSTANCE});
+        testCases.add(new PDataType[] { PInteger.INSTANCE, PInteger.INSTANCE, 
PInteger.INSTANCE });
         // Test Case 2: PK1 = Long, PK2 = Long, PK3 = Long
-        testCases.add(new PDataType[] {PLong.INSTANCE, PLong.INSTANCE, 
PLong.INSTANCE});
+        testCases.add(new PDataType[] { PLong.INSTANCE, PLong.INSTANCE, 
PLong.INSTANCE });
         // Test Case 3: PK1 = Timestamp, PK2 = Timestamp, PK3 = Timestamp
-        testCases.add(new PDataType[] { PTimestamp.INSTANCE, 
PTimestamp.INSTANCE, PTimestamp.INSTANCE});
+        testCases.add(
+                new PDataType[] { PTimestamp.INSTANCE, PTimestamp.INSTANCE, 
PTimestamp.INSTANCE });
         // Test Case 4: PK1 = Char, PK2 = Char, PK3 = Char
-        testCases.add(new PDataType[] {PChar.INSTANCE, PChar.INSTANCE, 
PChar.INSTANCE});
+        testCases.add(new PDataType[] { PChar.INSTANCE, PChar.INSTANCE, 
PChar.INSTANCE });
         // Test Case 5: PK1 = Decimal, PK2 = Decimal, PK3 = Integer
         // last PK cannot be of variable length when creating a view on top of 
it
-        testCases.add(new PDataType[] { PDecimal.INSTANCE, PDecimal.INSTANCE, 
PInteger.INSTANCE});
+        testCases.add(new PDataType[] { PDecimal.INSTANCE, PDecimal.INSTANCE, 
PInteger.INSTANCE });
         // Test Case 6: PK1 = Date, PK2 = Date, PK3 = Date
-        testCases.add(new PDataType[] { PDate.INSTANCE, PDate.INSTANCE, 
PDate.INSTANCE});
+        testCases.add(new PDataType[] { PDate.INSTANCE, PDate.INSTANCE, 
PDate.INSTANCE });
         // Test Case 7: PK1 = Varchar, PK2 = Varchar, PK3 = Integer
         // last PK cannot be of variable length when creating a view on top of 
it
-        testCases.add(new PDataType[] {PVarchar.INSTANCE, PVarchar.INSTANCE, 
PInteger.INSTANCE});
+        testCases.add(new PDataType[] { PVarchar.INSTANCE, PVarchar.INSTANCE, 
PInteger.INSTANCE });
 
         return testCases;
     }
@@ -687,15 +756,16 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
             SortOrder[][] sortOrders = getSortOrders();
 
             String tableName = "";
-            tableName = createViewHierarchy(testCases, sortOrders, 
500,5000,3,true, true, false);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName = createViewHierarchy(
+                    testCases, sortOrders, 500, 5000, 3,
+                    true, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
-            tableName = createViewHierarchy(testCases, sortOrders, 
600,6000,3,false, true, false);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName =
+                    createViewHierarchy(
+                            testCases, sortOrders, 600, 6000, 3,
+                            false, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
 
         } catch (Exception e) {
@@ -710,29 +780,31 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
             List<PDataType[]> testCases = getTestCases();
             SortOrder[][] sortOrders = getSortOrders();
             String tableName = "";
-            tableName = createViewHierarchy(testCases, sortOrders, 
100,1000,3,true, false, false);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName =
+                    createViewHierarchy(
+                            testCases, sortOrders, 100, 1000, 3,
+                            true, false, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
-            tableName = createViewHierarchy(testCases, sortOrders, 
200,2000,3,false, false, false);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName =
+                    createViewHierarchy(
+                            testCases, sortOrders, 200, 2000, 3,
+                            false, false, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
-            tableName = createViewHierarchy(testCases, sortOrders, 
300,3000,3,true, false, true);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName = createViewHierarchy(
+                    testCases, sortOrders, 300, 3000, 3,
+                    true, false, true);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
 
-            tableName = createViewHierarchy(testCases, sortOrders, 
400,4000,3,false, false, true);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName =
+                    createViewHierarchy(
+                            testCases, sortOrders, 400, 4000, 3,
+                            false, false, true);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
 
-
         } catch (Exception e) {
             e.printStackTrace();
             LOGGER.error(e.getMessage());
@@ -745,12 +817,15 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         try {
             List<PDataType[]> testCases = new ArrayList<>();
             // Test Case 1: PK1 = Integer, PK2 = Integer, PK3 = Integer
-            testCases.add(new PDataType[] {PInteger.INSTANCE, 
PInteger.INSTANCE, PInteger.INSTANCE});
-
-            SortOrder[][] sortOrders = new SortOrder[][] {
-                    {SortOrder.ASC, SortOrder.ASC, SortOrder.ASC}
-            };
-            createViewHierarchy(testCases, sortOrders, 900,9000,3,false, true, 
true);
+            testCases.add(
+                    new PDataType[] { PInteger.INSTANCE, PInteger.INSTANCE, 
PInteger.INSTANCE });
+
+            SortOrder[][]
+                    sortOrders =
+                    new SortOrder[][] { { SortOrder.ASC, SortOrder.ASC, 
SortOrder.ASC } };
+            createViewHierarchy(
+                    testCases, sortOrders, 900, 9000, 3,
+                    false, true, true);
             fail();
         } catch (SQLException sqle) {
             
assertEquals(VIEW_CANNOT_EXTEND_PK_WITH_PARENT_INDEXES.getErrorCode(),
@@ -766,16 +841,17 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         try {
             List<PDataType[]> testCases = new ArrayList<>();
             // Test Case 1: PK1 = Integer, PK2 = Integer, PK3 = Integer
-            testCases.add(new PDataType[] {PInteger.INSTANCE, 
PInteger.INSTANCE, PInteger.INSTANCE});
+            testCases.add(
+                    new PDataType[] { PInteger.INSTANCE, PInteger.INSTANCE, 
PInteger.INSTANCE });
 
-            SortOrder[][] sortOrders = new SortOrder[][] {
-                    {SortOrder.ASC, SortOrder.ASC, SortOrder.ASC}
-            };
+            SortOrder[][]
+                    sortOrders =
+                    new SortOrder[][] { { SortOrder.ASC, SortOrder.ASC, 
SortOrder.ASC } };
             String tableName = "";
-            tableName = createViewHierarchy(testCases, sortOrders, 
910,9100,3,true, true, true);
-            assertRowKeyPrefixesForTable(
-                    getUrl(),
-                    SchemaUtil.getSchemaNameFromFullName(tableName),
+            tableName = createViewHierarchy(
+                    testCases, sortOrders, 910, 9100, 3,
+                    true, true, true);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
                     SchemaUtil.getTableNameFromFullName(tableName));
             fail();
         } catch (SQLException sqle) {
@@ -787,7 +863,9 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
     }
 
-    private String createViewHierarchy(List<PDataType[]> testCases, 
SortOrder[][] sortOrders, int startPartition, int startRowId, int numTenants, 
boolean isMultiTenant, boolean extendPK, boolean hasGlobalViewIndexes) throws 
Exception {
+    private String createViewHierarchy(List<PDataType[]> testCases, 
SortOrder[][] sortOrders,
+            int startPartition, int startRowId, int numTenants, boolean 
isMultiTenant,
+            boolean extendPK, boolean hasGlobalViewIndexes) throws Exception {
 
         Map<String, byte[]> actualViewToRowKeyMap = Maps.newHashMap();
         String tableName = BaseTest.generateUniqueName();
@@ -797,51 +875,73 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
         String baseTableName = String.format(BASE_TABLE_NAME_FMT, tableName);
         String indexTableName = String.format(INDEX_TABLE_NAME_FMT, tableName);
 
-
         int partition = startPartition;
         int rowId = startRowId;
 
         // Create the global view
-        for (int testCase=0;testCase<testCases.size();testCase++) {
-            for (int index=0;index<sortOrders.length;index++) {
+        for (int testCase = 0; testCase < testCases.size(); testCase++) {
+            for (int index = 0; index < sortOrders.length; index++) {
                 partition++;
-                Pair<String, byte[]> gvRowKeyInfo = 
createGlobalView(tableName,partition, testCases.get(testCase), 
sortOrders[index], hasGlobalViewIndexes);
+                Pair<String, byte[]>
+                        gvRowKeyInfo =
+                        createGlobalView(tableName, partition, 
testCases.get(testCase),
+                                sortOrders[index], hasGlobalViewIndexes);
                 actualViewToRowKeyMap.put(gvRowKeyInfo.getFirst(), 
gvRowKeyInfo.getSecond());
-                LOGGER.debug(String.format("Created global view %s with 
partition = %d", gvRowKeyInfo.getFirst(), partition));
+                LOGGER.debug(String.format("Created global view %s with 
partition = %d",
+                        gvRowKeyInfo.getFirst(), partition));
             }
         }
 
         partition = startPartition;
-        String[] globalViewPKNames = new String[] {"ID1", "ID2", "ID3"};
+        String[] globalViewPKNames = new String[] { "ID1", "ID2", "ID3" };
         // Create the tenant view for each partition
-        for (int testCase=0;testCase<testCases.size();testCase++) {
-            for (int index=0;index<sortOrders.length;index++) {
+        for (int testCase = 0; testCase < testCases.size(); testCase++) {
+            for (int index = 0; index < sortOrders.length; index++) {
                 partition++;
-                for (int tenant=1;tenant<=numTenants;tenant++) {
-                    Pair<String, byte[]> tvRowKeyInfo = 
createTenantView(extendPK, partition, tenant, 1, globalViewPKNames, 
testCases.get(testCase));
+                for (int tenant = 1; tenant <= numTenants; tenant++) {
+                    Pair<String, byte[]>
+                            tvRowKeyInfo =
+                            createTenantView(
+                                    extendPK, partition, tenant, 1, 
globalViewPKNames,
+                                    testCases.get(testCase));
                     actualViewToRowKeyMap.put(tvRowKeyInfo.getFirst(), 
tvRowKeyInfo.getSecond());
-                    LOGGER.debug(String.format("Created tenant view %s 
[partition = %d]", tvRowKeyInfo.getFirst(), partition));
+                    LOGGER.debug(String.format("Created tenant view %s 
[partition = %d]",
+                            tvRowKeyInfo.getFirst(), partition));
                 }
             }
         }
 
         partition = startPartition;
         // Upsert rows into the tenant view for each partition
-        for (int testCase=0;testCase<testCases.size();testCase++) {
-            for (int index=0;index<sortOrders.length;index++) {
+        for (int testCase = 0; testCase < testCases.size(); testCase++) {
+            for (int index = 0; index < sortOrders.length; index++) {
                 partition++;
-                for (int tenant=1;tenant<=numTenants;tenant++) {
+                for (int tenant = 1; tenant <= numTenants; tenant++) {
                     rowId++;
                     try {
-                        upsertTenantViewRows(isMultiTenant, extendPK, 
partition, tenant, 1, rowId, globalViewPKNames, testCases.get(testCase));
+                        upsertTenantViewRows(
+                                isMultiTenant, extendPK, partition, tenant, 1, 
rowId,
+                                globalViewPKNames, testCases.get(testCase));
                     } catch (Exception ex) {
-                        String testInfo = 
Arrays.stream(testCases.get(testCase)).map(String::valueOf).collect(Collectors.joining(","));
-                        String sortInfo = 
Arrays.stream(sortOrders[index]).map(String::valueOf).collect(Collectors.joining(","));
-                        String pkInfo = 
Arrays.stream(globalViewPKNames).map(String::valueOf).collect(Collectors.joining(","));
+                        String
+                                testInfo =
+                                
Arrays.stream(testCases.get(testCase)).map(String::valueOf)
+                                        .collect(Collectors.joining(","));
+                        String
+                                sortInfo =
+                                
Arrays.stream(sortOrders[index]).map(String::valueOf)
+                                        .collect(Collectors.joining(","));
+                        String
+                                pkInfo =
+                                
Arrays.stream(globalViewPKNames).map(String::valueOf)
+                                        .collect(Collectors.joining(","));
                         LOGGER.error(ex.getMessage());
                         ex.printStackTrace();
-                        fail(String.format("isMultiTenant(%s), extendPK(%s), 
partition(%d), tenant(%s), rowId(%s), pkInfo(%s), testInfo(%s), sortInfo(%s)",
-                                isMultiTenant, extendPK, partition, tenant, 
rowId, pkInfo, testInfo, sortInfo));
+                        fail(String.format(
+                                "isMultiTenant(%s), extendPK(%s), 
partition(%d), tenant(%s), " +
+                                        "rowId(%s), pkInfo(%s), testInfo(%s), 
sortInfo(%s)",
+                                isMultiTenant, extendPK, partition, tenant,
+                                rowId, pkInfo, testInfo, sortInfo));
                     }
                 }
             }
@@ -849,25 +949,32 @@ public abstract class BaseRowKeyPrefixTestIT extends 
ParallelStatsDisabledIT {
 
         partition = startPartition;
         rowId = startRowId;
-        // Validate the rowPrefix from SYSTEM.CATALOG prefix matches the 
rowkey from HBase
+        // Validate the matcher pattern from SYSTEM.CATALOG matches the rowkey 
from HBase
         // for each tenant view
-        // actualViewToRowKeyMap holds row prefix for each view (global and 
tenant specific)
-        for (int testCase=0;testCase<testCases.size();testCase++) {
-            for (int index=0;index<sortOrders.length;index++) {
+        // actualViewToRowKeyMap holds matcher pattern for each view (global 
and tenant specific)
+        for (int testCase = 0; testCase < testCases.size(); testCase++) {
+            for (int index = 0; index < sortOrders.length; index++) {
                 partition++;
-                for (int tenant=1;tenant<=numTenants;tenant++) {
+                for (int tenant = 1; tenant <= numTenants; tenant++) {
                     rowId++;
                     String partitionName = String.format(PARTITION_FMT, 
partition);
 
                     String tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, 
tenant);
-                    String tenantConnectionUrl = String.format(TENANT_URL_FMT, 
getUrl(), TENANT_ID_ATTRIB, tenantId);
+                    String
+                            tenantConnectionUrl =
+                            String.format(TENANT_URL_FMT, getUrl(), 
TENANT_ID_ATTRIB, tenantId);
                     String tenantViewName = 
String.format(TENANT_VIEW_NAME_FMT, partitionName, 1);
                     String tenantViewKey = String.format("%s.%s", tenantId, 
tenantViewName);
-                    try (PhoenixConnection tenantConnection = 
DriverManager.getConnection(tenantConnectionUrl).unwrap(PhoenixConnection.class))
 {
-                        assertHBaseRowKeyMatchesPrefix(tenantConnection, 
baseTableName.getBytes(StandardCharsets.UTF_8), rowId, 
actualViewToRowKeyMap.get(tenantViewKey));
+                    try (PhoenixConnection tenantConnection = 
DriverManager.getConnection(
+                            
tenantConnectionUrl).unwrap(PhoenixConnection.class)) {
+                        assertHBaseRowKeyMatchesPrefix(tenantConnection,
+                                
baseTableName.getBytes(StandardCharsets.UTF_8), rowId,
+                                actualViewToRowKeyMap.get(tenantViewKey));
                         if (hasGlobalViewIndexes) {
                             PTable view = 
PhoenixRuntime.getTable(tenantConnection, tenantViewName);
-                            
assertIndexTableRowKeyMatchesPrefix(tenantConnection, view.getIndexes().get(0), 
indexTableName.getBytes(StandardCharsets.UTF_8), rowId);
+                            
assertIndexTableRowKeyMatchesPrefix(tenantConnection,
+                                    view.getIndexes().get(0),
+                                    
indexTableName.getBytes(StandardCharsets.UTF_8), rowId);
                         }
                     }
                 }
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexDisabledBaseRowKeyPrefixIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexDisabledBaseRowKeyMatcherIT.java
similarity index 63%
rename from 
phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexDisabledBaseRowKeyPrefixIT.java
rename to 
phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexDisabledBaseRowKeyMatcherIT.java
index a4fc076a6a..a8ae4aa759 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexDisabledBaseRowKeyPrefixIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexDisabledBaseRowKeyMatcherIT.java
@@ -1,8 +1,25 @@
-package org.apache.phoenix.end2end.prefix;
+/*
+ * 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.end2end;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
-import org.apache.phoenix.end2end.NeedsOwnMiniClusterTest;
 import org.apache.phoenix.hbase.index.util.IndexManagementUtil;
 import org.apache.phoenix.query.ConfigurationFactory;
 import org.apache.phoenix.query.QueryServices;
@@ -15,7 +32,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 @Category(NeedsOwnMiniClusterTest.class)
-public class LongViewIndexDisabledBaseRowKeyPrefixIT extends 
BaseRowKeyPrefixTestIT {
+public class LongViewIndexDisabledBaseRowKeyMatcherIT extends 
BaseRowKeyMatcherTestIT {
 
     @BeforeClass
     public static synchronized void doSetup() throws Exception {
@@ -23,7 +40,8 @@ public class LongViewIndexDisabledBaseRowKeyPrefixIT extends 
BaseRowKeyPrefixTes
         conf.set(QueryServices.PHOENIX_TABLE_TTL_ENABLED, 
String.valueOf(true));
         conf.set(QueryServices.LONG_VIEW_INDEX_ENABLED_ATTRIB, 
String.valueOf(false));
         conf.set(QueryServices.INDEX_REGION_OBSERVER_ENABLED_ATTRIB, "true");
-        conf.set(IndexManagementUtil.WAL_EDIT_CODEC_CLASS_KEY, 
"org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec");
+        conf.set(IndexManagementUtil.WAL_EDIT_CODEC_CLASS_KEY,
+                
"org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec");
 
         // Clear the cached singletons so we can inject our own.
         InstanceResolver.clearSingletons();
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexEnabledBaseRowKeyPrefixIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexEnabledBaseRowKeyMatcherIT.java
similarity index 63%
rename from 
phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexEnabledBaseRowKeyPrefixIT.java
rename to 
phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexEnabledBaseRowKeyMatcherIT.java
index 11358c8d94..a7778aea1e 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/prefix/LongViewIndexEnabledBaseRowKeyPrefixIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/LongViewIndexEnabledBaseRowKeyMatcherIT.java
@@ -1,8 +1,25 @@
-package org.apache.phoenix.end2end.prefix;
+/*
+ * 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.end2end;
 
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HBaseConfiguration;
-import org.apache.phoenix.end2end.NeedsOwnMiniClusterTest;
 import org.apache.phoenix.hbase.index.util.IndexManagementUtil;
 import org.apache.phoenix.query.ConfigurationFactory;
 import org.apache.phoenix.query.QueryServices;
@@ -15,7 +32,7 @@ import java.util.HashMap;
 import java.util.Map;
 
 @Category(NeedsOwnMiniClusterTest.class)
-public class LongViewIndexEnabledBaseRowKeyPrefixIT extends 
BaseRowKeyPrefixTestIT {
+public class LongViewIndexEnabledBaseRowKeyMatcherIT extends 
BaseRowKeyMatcherTestIT {
 
     @BeforeClass
     public static synchronized void doSetup() throws Exception {
@@ -23,7 +40,8 @@ public class LongViewIndexEnabledBaseRowKeyPrefixIT extends 
BaseRowKeyPrefixTest
         conf.set(QueryServices.PHOENIX_TABLE_TTL_ENABLED, 
String.valueOf(true));
         conf.set(QueryServices.LONG_VIEW_INDEX_ENABLED_ATTRIB, 
String.valueOf(true));
         conf.set(QueryServices.INDEX_REGION_OBSERVER_ENABLED_ATTRIB, "true");
-        conf.set(IndexManagementUtil.WAL_EDIT_CODEC_CLASS_KEY, 
"org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec");
+        conf.set(IndexManagementUtil.WAL_EDIT_CODEC_CLASS_KEY,
+                
"org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec");
 
         // Clear the cached singletons so we can inject our own.
         InstanceResolver.clearSingletons();
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadOnlyViewOnReadOnlyIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadOnlyViewOnReadOnlyIT.java
index 5825990a47..774f0f9864 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadOnlyViewOnReadOnlyIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ReadOnlyViewOnReadOnlyIT.java
@@ -46,12 +46,13 @@ public class ReadOnlyViewOnReadOnlyIT extends 
BaseTenantSpecificViewIndexIT {
             //base table
             String tableName = generateUniqueName();
             conn.createStatement().execute("CREATE TABLE IF NOT EXISTS  " + 
tableName + "  ("
+                    + "TID CHAR(15) NOT NULL,"
                     + " ID INTEGER NOT NULL,"
                     + " COL1 INTEGER NOT NULL,"
                     + " COL2 bigint NOT NULL,"
                     + " CREATED_DATE DATE,"
                     + " CREATION_TIME BIGINT,"
-                    + " CONSTRAINT NAME_PK PRIMARY KEY (ID, COL1, COL2))"
+                    + " CONSTRAINT NAME_PK PRIMARY KEY (TID, ID, COL1, COL2))"
                     + " TTL = " + DEFAULT_TTL_FOR_TEST
                     + "," + UPDATE_CACHE_FREQUENCY + " = 100000000"
                     + ", MULTI_TENANT = true");
diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TTLAsPhoenixTTLIT.java 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TTLAsPhoenixTTLIT.java
index a2c959b16f..62fc219e9c 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TTLAsPhoenixTTLIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TTLAsPhoenixTTLIT.java
@@ -47,6 +47,7 @@ import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TTL_NOT_DEFINED;
 import static org.apache.phoenix.util.PhoenixRuntime.TENANT_ID_ATTRIB;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 @Category(ParallelStatsDisabledTest.class)
@@ -66,6 +67,8 @@ public class TTLAsPhoenixTTLIT extends 
ParallelStatsDisabledIT{
                     createTableWithOrWithOutTTLAsItsProperty(conn, true)));
             assertEquals("TTL is not set correctly at Phoenix level", 
DEFAULT_TTL_FOR_TEST,
                     table.getTTL());
+            assertTrue("RowKeyMatcher should be Null",
+                    (Bytes.compareTo(HConstants.EMPTY_BYTE_ARRAY, 
table.getRowKeyMatcher()) == 0));
         }
     }
 
@@ -182,7 +185,9 @@ public class TTLAsPhoenixTTLIT extends 
ParallelStatsDisabledIT{
             indexes = conn.unwrap(PhoenixConnection.class).getTable(new 
PTableKey(null, tableName)).getIndexes();
             for (PTable index : indexes) {
                 assertTTLValueOfIndex(PhoenixDatabaseMetaData.TTL_NOT_DEFINED, 
index);
-                assertNull(index.getRowKeyPrefix());
+                assertTrue(Bytes.compareTo(
+                        index.getRowKeyMatcher(), HConstants.EMPTY_BYTE_ARRAY) 
== 0
+                );
             }
 
             //Test setting TTL as index property not allowed while creating 
them or setting them explicitly.
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
index 45b4f9958d..6250ed8799 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/compile/CreateTableCompiler.java
@@ -98,7 +98,7 @@ public class CreateTableCompiler {
         String viewStatementToBe = null;
         byte[][] viewColumnConstantsToBe = null;
         BitSet isViewColumnReferencedToBe = null;
-        byte[] rowKeyPrefix = ByteUtil.EMPTY_BYTE_ARRAY;
+        byte[] rowKeyMatcher = ByteUtil.EMPTY_BYTE_ARRAY;
 
         // Check whether column families having local index column family 
suffix or not if present
         // don't allow creating table.
@@ -186,7 +186,7 @@ public class CreateTableCompiler {
                 validateCreateViewCompilation(connection, parentToBe,
                     columnDefs, pkConstraint);
             } else if (where != null && viewTypeToBe == ViewType.UPDATABLE) {
-                rowKeyPrefix = WhereOptimizer.getRowKeyPrefix(context, 
create.getTableName(),
+                rowKeyMatcher = WhereOptimizer.getRowKeyMatcher(context, 
create.getTableName(),
                         parentToBe, where);
             }
             verifyIfAnyParentHasIndexesAndViewExtendsPk(parentToBe, 
columnDefs, pkConstraint);
@@ -218,7 +218,7 @@ public class CreateTableCompiler {
         final PTable parent = parentToBe;
 
         return new CreateTableMutationPlan(context, client, finalCreate, 
splits, parent,
-                viewStatement, viewType, rowKeyPrefix,
+                viewStatement, viewType, rowKeyMatcher,
                 viewColumnConstants, isViewColumnReferenced, connection);
     }
 
@@ -474,12 +474,12 @@ public class CreateTableCompiler {
         private final byte[][] viewColumnConstants;
         private final BitSet isViewColumnReferenced;
 
-        private final byte[] rowKeyPrefix;
+        private final byte[] rowKeyMatcher;
         private final PhoenixConnection connection;
 
         private CreateTableMutationPlan(StatementContext context, 
MetaDataClient client,
                 CreateTableStatement finalCreate, byte[][] splits, PTable 
parent,
-                String viewStatement, ViewType viewType, byte[] rowKeyPrefix,
+                String viewStatement, ViewType viewType, byte[] rowKeyMatcher,
                 byte[][] viewColumnConstants, BitSet isViewColumnReferenced,
                 PhoenixConnection connection) {
             super(context, CreateTableCompiler.this.operation);
@@ -489,7 +489,7 @@ public class CreateTableCompiler {
             this.parent = parent;
             this.viewStatement = viewStatement;
             this.viewType = viewType;
-            this.rowKeyPrefix = rowKeyPrefix;
+            this.rowKeyMatcher = rowKeyMatcher;
             this.viewColumnConstants = viewColumnConstants;
             this.isViewColumnReferenced = isViewColumnReferenced;
             this.connection = connection;
@@ -499,7 +499,7 @@ public class CreateTableCompiler {
         public MutationState execute() throws SQLException {
             try {
                 return client.createTable(finalCreate, splits, parent, 
viewStatement,
-                        viewType, MetaDataUtil.getViewIndexIdDataType(), 
rowKeyPrefix,
+                        viewType, MetaDataUtil.getViewIndexIdDataType(), 
rowKeyMatcher,
                         viewColumnConstants, isViewColumnReferenced);
             } finally {
                 if (client.getConnection() != connection) {
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 c18778d449..4b174aaf4f 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
@@ -482,7 +482,7 @@ public class WhereOptimizer {
         return keyRanges;
     }
 
-    public static byte[] getRowKeyPrefix(
+    public static byte[] getRowKeyMatcher(
             final StatementContext context,
             final TableName tableNameNode,
             final PTable parentTable,
@@ -498,7 +498,9 @@ public class WhereOptimizer {
         }
         KeyExpressionVisitor visitor = new KeyExpressionVisitor(context, 
parentTable);
         KeyExpressionVisitor.KeySlots keySlots = 
viewWhereExpression.accept(visitor);
-
+        if (keySlots == null) {
+            return ByteUtil.EMPTY_BYTE_ARRAY;
+        }
         for (KeyExpressionVisitor.KeySlot slot : keySlots.getSlots()) {
             if (slot != null) {
                 if (schema.getField(slot.getPKPosition()).getSortOrder() == 
SortOrder.DESC) {
@@ -510,28 +512,28 @@ public class WhereOptimizer {
         }
         ScanRanges scanRange = ScanRanges.createSingleSpan(
                 schema, rowKeySlotRangesList, null, false);
-        byte[] rowKeyPrefix = scanRange.getScanRange().getLowerRange();
+        byte[] rowKeyMatcher = scanRange.getScanRange().getLowerRange();
         // TODO : make it a TRACE log before submission
         if (LOGGER.isTraceEnabled()) {
-            String rowKeyPrefixStr = Bytes.toStringBinary(rowKeyPrefix);
-            String rowKeyPrefixHex = Bytes.toHex(rowKeyPrefix);
-            byte[] rowKeyPrefixFromHex = Bytes.fromHex(rowKeyPrefixHex);
-            assert Bytes.compareTo(rowKeyPrefix, rowKeyPrefixFromHex) == 0;
+            String rowKeyMatcherStr = Bytes.toStringBinary(rowKeyMatcher);
+            String rowKeyMatcherHex = Bytes.toHex(rowKeyMatcher);
+            byte[] rowKeyMatcherFromHex = Bytes.fromHex(rowKeyMatcherHex);
+            assert Bytes.compareTo(rowKeyMatcher, rowKeyMatcherFromHex) == 0;
             LOGGER.trace(String.format("View info view-name = %s, 
view-stmt-name (parent) = %s, "
                             + "primary-keys = %d, key-ranges: size = %d, list 
= %s ",
                     tableNameNode.toString(), parentTable.getName().toString(),
                     parentTable.getPKColumns().size(), 
rowKeySlotRangesList.size(),
                     rowKeySlotRangesList.isEmpty() ? "null" : 
rowKeySlotRangesList.toString()));
-            LOGGER.trace(String.format("RowKey Prefix info Hex-value = %s, 
StringBinary value = %s",
-                    rowKeyPrefixHex, rowKeyPrefixStr));
+            LOGGER.trace(String.format("RowKey Matcher info Hex-value = 
%s,StringBinary value = %s",
+                    rowKeyMatcherHex, rowKeyMatcherStr));
 
         }
-        return rowKeyPrefix;
+        return rowKeyMatcher;
     }
 
 
     @VisibleForTesting
-    public static byte[] getRowKeyPrefix(
+    public static byte[] getRowKeyMatcher(
             final PhoenixConnection connection,
             final TableName tableNameNode,
             final PTable parentTable,
@@ -578,25 +580,25 @@ public class WhereOptimizer {
 
         ScanRanges scanRange = ScanRanges.createSingleSpan(
                 schema, rowKeySlotRangesList, null, false);
-        byte[] rowKeyPrefix = scanRange.getScanRange().getLowerRange();
+        byte[] rowKeyMatcher = scanRange.getScanRange().getLowerRange();
 
         // TODO : make it a TRACE log before submission
         if (LOGGER.isTraceEnabled()) {
-            String rowKeyPrefixStr = Bytes.toStringBinary(rowKeyPrefix);
-            String rowKeyPrefixHex = Bytes.toHex(rowKeyPrefix);
-            byte[] rowKeyPrefixFromHex = Bytes.fromHex(rowKeyPrefixHex);
-            assert Bytes.compareTo(rowKeyPrefix, rowKeyPrefixFromHex) == 0;
+            String rowKeyMatcherStr = Bytes.toStringBinary(rowKeyMatcher);
+            String rowKeyMatcherHex = Bytes.toHex(rowKeyMatcher);
+            byte[] rowKeyMatcherFromHex = Bytes.fromHex(rowKeyMatcherHex);
+            assert Bytes.compareTo(rowKeyMatcher, rowKeyMatcherFromHex) == 0;
 
             LOGGER.trace(String.format("View info view-name = %s, 
view-stmt-name (parent) = %s, "
                             + "primary-keys = %d, key-ranges:  size = %d, list 
= %s ",
                     tableNameNode.toString(), parentTable.getName().toString(),
                     parentTable.getPKColumns().size(), 
rowKeySlotRangesList.size(),
                     rowKeySlotRangesList.isEmpty() ? "null" : 
rowKeySlotRangesList.toString()));
-            LOGGER.trace(String.format("RowKey Prefix info Hex-value = %s, 
StringBinary value = %s",
-                    rowKeyPrefixHex, rowKeyPrefixStr));
+            LOGGER.trace(String.format("RowKey Matcher info Hex-value = 
%s,StringBinary value = %s",
+                    rowKeyMatcherHex, rowKeyMatcherStr));
 
         }
-        return rowKeyPrefix;
+        return rowKeyMatcher;
 
     }
 
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 ae5046c1b6..c79adaf030 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
@@ -62,7 +62,7 @@ import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TTL_NOT_DEFINED;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.PHYSICAL_TABLE_NAME_BYTES;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.PK_NAME_BYTES;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.RETURN_TYPE_BYTES;
-import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_PREFIX_BYTES;
+import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_MATCHER_BYTES;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SALT_BUCKETS_BYTES;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SCHEMA_VERSION_BYTES;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SORT_ORDER_BYTES;
@@ -374,8 +374,8 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
         TABLE_FAMILY_BYTES, STREAMING_TOPIC_NAME_BYTES);
     private static final Cell TTL_KV = 
createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY,
             TABLE_FAMILY_BYTES, TTL_BYTES);
-    private static final Cell ROW_KEY_PREFIX_KV = 
createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY,
-            TABLE_FAMILY_BYTES, ROW_KEY_PREFIX_BYTES);
+    private static final Cell ROW_KEY_MATCHER_KV = 
createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY,
+            TABLE_FAMILY_BYTES, ROW_KEY_MATCHER_BYTES);
     private static final Cell INDEX_WHERE_KV = 
createFirstOnRow(ByteUtil.EMPTY_BYTE_ARRAY,
             TABLE_FAMILY_BYTES, INDEX_WHERE_BYTES);
 
@@ -416,8 +416,7 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
             SCHEMA_VERSION_KV,
             EXTERNAL_SCHEMA_ID_KV,
             STREAMING_TOPIC_NAME_KV,
-            TTL_KV,
-            ROW_KEY_PREFIX_KV,
+            TTL_KV, ROW_KEY_MATCHER_KV,
             INDEX_WHERE_KV
     );
 
@@ -465,7 +464,7 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
     private static final int STREAMING_TOPIC_NAME_INDEX =
         TABLE_KV_COLUMNS.indexOf(STREAMING_TOPIC_NAME_KV);
     private static final int TTL_INDEX = TABLE_KV_COLUMNS.indexOf(TTL_KV);
-    private static final int ROW_KEY_PREFIX_INDEX = 
TABLE_KV_COLUMNS.indexOf(ROW_KEY_PREFIX_KV);
+    private static final int ROW_KEY_MATCHER_INDEX = 
TABLE_KV_COLUMNS.indexOf(ROW_KEY_MATCHER_KV);
     private static final int INDEX_WHERE_INDEX =
             TABLE_KV_COLUMNS.indexOf(INDEX_WHERE_KV);
     // KeyValues for Column
@@ -1431,12 +1430,12 @@ TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
             // TODO: Need to Update Cache for Alter Commands, can use 
PHOENIX-6883.
         }
 
-        Cell rowKeyPrefixKv = tableKeyValues[ROW_KEY_PREFIX_INDEX];
-        byte[] rowKeyPrefix = rowKeyPrefixKv != null
-                ? CellUtil.cloneValue(rowKeyPrefixKv)
-                : null;
-        builder.setRowKeyPrefix(rowKeyPrefix != null ? rowKeyPrefix
-                : oldTable != null ? oldTable.getRowKeyPrefix() : null);
+        Cell rowKeyMatcherKv = tableKeyValues[ROW_KEY_MATCHER_INDEX];
+        byte[] rowKeyMatcher = rowKeyMatcherKv != null
+                ? CellUtil.cloneValue(rowKeyMatcherKv)
+                : HConstants.EMPTY_BYTE_ARRAY;
+        builder.setRowKeyMatcher(rowKeyMatcher != null ? rowKeyMatcher
+                : oldTable != null ? oldTable.getRowKeyMatcher() : 
HConstants.EMPTY_BYTE_ARRAY);
 
 
         Cell indexWhereKv = tableKeyValues[INDEX_WHERE_INDEX];
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
index 1b3ebddb45..8632f056ba 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/jdbc/PhoenixDatabaseMetaData.java
@@ -417,8 +417,8 @@ public class PhoenixDatabaseMetaData implements 
DatabaseMetaData {
     public static final String STREAMING_TOPIC_NAME = "STREAMING_TOPIC_NAME";
     public static final byte[] STREAMING_TOPIC_NAME_BYTES = 
Bytes.toBytes(STREAMING_TOPIC_NAME);
 
-    public static final String ROW_KEY_PREFIX = "ROW_KEY_PREFIX";
-    public static final byte[] ROW_KEY_PREFIX_BYTES = 
Bytes.toBytes(ROW_KEY_PREFIX);
+    public static final String ROW_KEY_MATCHER = "ROW_KEY_MATCHER";
+    public static final byte[] ROW_KEY_MATCHER_BYTES = 
Bytes.toBytes(ROW_KEY_MATCHER);
 
     public static final String INDEX_WHERE = "INDEX_WHERE";
     public static final byte[] INDEX_WHERE_BYTES = Bytes.toBytes(INDEX_WHERE);
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index fdc51bb36c..eea4a0f72a 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -4208,8 +4208,7 @@ public class ConnectionQueryServicesImpl extends 
DelegateQueryServices implement
                     PhoenixDatabaseMetaData.TTL + " " + 
PInteger.INSTANCE.getSqlTypeName());
             metaConnection = addColumnsIfNotExists(metaConnection,
                     PhoenixDatabaseMetaData.SYSTEM_CATALOG, 
MIN_SYSTEM_TABLE_TIMESTAMP_5_2_0 - 1,
-                    PhoenixDatabaseMetaData.ROW_KEY_PREFIX + " " +
-                            PVarbinary.INSTANCE.getSqlTypeName());
+                    PhoenixDatabaseMetaData.ROW_KEY_MATCHER + " " + 
PVarbinary.INSTANCE.getSqlTypeName());
             metaConnection = addColumnsIfNotExists(metaConnection, 
PhoenixDatabaseMetaData.SYSTEM_CATALOG,
                     MIN_SYSTEM_TABLE_TIMESTAMP_5_2_0,
                     PhoenixDatabaseMetaData.INDEX_WHERE + " " + 
PVarchar.INSTANCE.getSqlTypeName());
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java 
b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java
index 2ef9404a33..13f9ce86d5 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/query/QueryConstants.java
@@ -119,7 +119,7 @@ import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.QUERY_STATUS;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.REF_GENERATION;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.REMARKS;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.RETURN_TYPE;
-import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_PREFIX;
+import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_MATCHER;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SALT_BUCKETS;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SCAN_METRICS_JSON;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SCHEMA_VERSION;
@@ -345,7 +345,7 @@ public interface QueryConstants {
             EXTERNAL_SCHEMA_ID + " VARCHAR, \n" +
             STREAMING_TOPIC_NAME + " VARCHAR, \n" +
             TTL + " INTEGER, \n" +
-            ROW_KEY_PREFIX + " VARBINARY, \n" +
+            ROW_KEY_MATCHER + " VARBINARY, \n" +
             INDEX_WHERE + " VARCHAR, \n" +
             // Column metadata (will be null for table row)
             DATA_TYPE + " INTEGER," +
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateTable.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateTable.java
index f928aef134..d6c03e2898 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/DelegateTable.java
@@ -403,8 +403,8 @@ public class DelegateTable implements PTable {
     public String getStreamingTopicName() { return 
delegate.getStreamingTopicName(); }
 
     @Override
-    public byte[] getRowKeyPrefix() {
-        return delegate.getRowKeyPrefix();
+    public byte[] getRowKeyMatcher() {
+        return delegate.getRowKeyMatcher();
     }
 
     public String getIndexWhere() {
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index f34cb3f0a6..28cc250444 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -241,7 +241,7 @@ import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.PHYSICAL_NAME;
 import static 
org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.PHYSICAL_TABLE_NAME;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.PK_NAME;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.RETURN_TYPE;
-import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_PREFIX;
+import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.ROW_KEY_MATCHER;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SALT_BUCKETS;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SCHEMA_VERSION;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SORT_ORDER;
@@ -353,7 +353,7 @@ public class MetaDataClient {
                     SCHEMA_VERSION + "," +
                     STREAMING_TOPIC_NAME + "," +
                     TTL + "," +
-                    ROW_KEY_PREFIX + "," +
+                    ROW_KEY_MATCHER + "," +
                     INDEX_WHERE +
                     ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 
?, ?, ?, ?, ?, ?, " +
                 "?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
@@ -968,7 +968,7 @@ public class MetaDataClient {
             String viewStatement,
             ViewType viewType,
             PDataType viewIndexIdType,
-            byte[] rowKeyPrefix,
+            byte[] rowKeyMatcher,
             byte[][] viewColumnConstants,
             BitSet isViewColumnReferenced
     ) throws SQLException {
@@ -1043,7 +1043,7 @@ public class MetaDataClient {
                 viewStatement,
                 viewType,
                 viewIndexIdType,
-                rowKeyPrefix,
+                rowKeyMatcher,
                 viewColumnConstants,
                 isViewColumnReferenced,
                 false,
@@ -1731,7 +1731,7 @@ public class MetaDataClient {
                     PTableType.INDEX,
                     statement.ifNotExists(),
                     null,
-                    null,
+                    statement.getWhere(),
                     statement.getBindCount(),
                     null
             );
@@ -2117,7 +2117,7 @@ public class MetaDataClient {
 
     private PTable createTableInternal(CreateTableStatement statement, 
byte[][] splits,
             final PTable parent, String viewStatement, ViewType viewType, 
PDataType viewIndexIdType,
-            final byte[] rowKeyPrefix,
+            final byte[] rowKeyMatcher,
             final byte[][] viewColumnConstants, final BitSet 
isViewColumnReferenced,
             boolean allocateIndexId, IndexType indexType, Date 
asyncCreatedDate,
             Map<String,Object> tableProps,
@@ -2988,7 +2988,7 @@ public class MetaDataClient {
                         .setIndexes(Collections.<PTable>emptyList())
                         .setPhysicalNames(ImmutableList.<PName>of())
                         .setColumns(columns.values())
-                        .setRowKeyPrefix(rowKeyPrefix)
+                        .setRowKeyMatcher(rowKeyMatcher)
                         .setTTL(TTL_NOT_DEFINED)
                         .setIndexWhere(statement.getWhereClause() == null ? 
null
                                 : statement.getWhereClause().toString())
@@ -3243,10 +3243,11 @@ public class MetaDataClient {
                 tableUpsert.setInt(34, ttl);
             }
 
-            if (rowKeyPrefix == null) {
+            if ((rowKeyMatcher == null) ||
+                    Bytes.compareTo(rowKeyMatcher, 
HConstants.EMPTY_BYTE_ARRAY) == 0) {
                 tableUpsert.setNull(35, Types.VARBINARY);
             } else {
-                tableUpsert.setBytes(35, rowKeyPrefix);
+                tableUpsert.setBytes(35, rowKeyMatcher);
             }
             if (tableType == INDEX && statement.getWhereClause() != null) {
                 tableUpsert.setString(36, 
statement.getWhereClause().toString());
@@ -3396,7 +3397,7 @@ public class MetaDataClient {
                         result.getTable().getExternalSchemaId() : null)
                         .setStreamingTopicName(streamingTopicName)
                         .setTTL(ttl == null || ttl == TTL_NOT_DEFINED ? 
ttlFromHierarchy : ttl)
-                        .setRowKeyPrefix(rowKeyPrefix)
+                        .setRowKeyMatcher(rowKeyMatcher)
                         .setIndexWhere(statement.getWhereClause() == null ? 
null
                                 : statement.getWhereClause().toString())
                         .build();
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java
index eb0d42a1c4..820593e8c6 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTable.java
@@ -969,7 +969,7 @@ public interface PTable extends PMetaDataEntity {
      * @return Prefixed KeyRange generated by the expression representing the 
view statement. In
      * other words this will be one-to-one mapping between view and PREFIXED 
KeyRange that'll exist.
      */
-    byte[] getRowKeyPrefix();
+    byte[] getRowKeyMatcher();
 
     /**
      *
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
index 15adf81813..e9ceb59969 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/PTableImpl.java
@@ -213,7 +213,7 @@ public class PTableImpl implements PTable {
     private String schemaVersion;
     private String externalSchemaId;
     private String streamingTopicName;
-    private byte[] rowKeyPrefix;
+    private byte[] rowKeyMatcher;
     private String indexWhere;
     private Expression indexWhereExpression;
     private Set<ColumnReference> indexWhereColumns;
@@ -281,7 +281,7 @@ public class PTableImpl implements PTable {
         private String externalSchemaId;
         private String streamingTopicName;
         private int ttl;
-        private byte[] rowKeyPrefix;
+        private byte[] rowKeyMatcher;
         private String indexWhere;
 
         // Used to denote which properties a view has explicitly modified
@@ -693,9 +693,9 @@ public class PTableImpl implements PTable {
             return this;
         }
 
-        public Builder setRowKeyPrefix(byte[] rowKeyPrefix) {
-            if (rowKeyPrefix != null) {
-                this.rowKeyPrefix = rowKeyPrefix;
+        public Builder setRowKeyMatcher(byte[] rowKeyMatcher) {
+            if (rowKeyMatcher != null) {
+                this.rowKeyMatcher = rowKeyMatcher;
             }
             return this;
         }
@@ -996,7 +996,7 @@ public class PTableImpl implements PTable {
         this.schemaVersion = builder.schemaVersion;
         this.externalSchemaId = builder.externalSchemaId;
         this.streamingTopicName = builder.streamingTopicName;
-        this.rowKeyPrefix = builder.rowKeyPrefix;
+        this.rowKeyMatcher = builder.rowKeyMatcher;
         this.indexWhere = builder.indexWhere;
     }
 
@@ -1076,7 +1076,7 @@ public class PTableImpl implements PTable {
                 .setExternalSchemaId(table.getExternalSchemaId())
                 .setStreamingTopicName(table.getStreamingTopicName())
                 .setTTL(table.getTTL())
-                .setRowKeyPrefix(table.getRowKeyPrefix())
+                .setRowKeyMatcher(table.getRowKeyMatcher())
                 .setIndexWhere(table.getIndexWhere());
     }
 
@@ -2012,9 +2012,9 @@ public class PTableImpl implements PTable {
             ttl = table.getTtl();
         }
 
-        byte[] rowKeyPrefix = null;
-        if (table.hasRowKeyPrefix()) {
-            rowKeyPrefix = table.getRowKeyPrefix().toByteArray();
+        byte[] rowKeyMatcher = null;
+        if (table.hasRowKeyMatcher()) {
+            rowKeyMatcher = table.getRowKeyMatcher().toByteArray();
         }
 
         String indexWhere = null;
@@ -2077,7 +2077,7 @@ public class PTableImpl implements PTable {
                     .setExternalSchemaId(externalSchemaId)
                     .setStreamingTopicName(streamingTopicName)
                     .setTTL(ttl)
-                    .setRowKeyPrefix(rowKeyPrefix)
+                    .setRowKeyMatcher(rowKeyMatcher)
                     .setIndexWhere(indexWhere)
                     .build();
         } catch (SQLException e) {
@@ -2216,8 +2216,8 @@ public class PTableImpl implements PTable {
             
builder.setStreamingTopicName(ByteStringer.wrap(PVarchar.INSTANCE.toBytes(table.getStreamingTopicName())));
         }
         builder.setTtl(table.getTTL());
-        if (table.getRowKeyPrefix() != null) {
-            
builder.setRowKeyPrefix(ByteStringer.wrap(table.getRowKeyPrefix()));
+        if (table.getRowKeyMatcher() != null) {
+            
builder.setRowKeyMatcher(ByteStringer.wrap(table.getRowKeyMatcher()));
         }
         if (table.getIndexWhere() != null) {
             builder.setIndexWhere(ByteStringer.wrap(PVarchar.INSTANCE.toBytes(
@@ -2357,8 +2357,8 @@ public class PTableImpl implements PTable {
     }
 
     @Override
-    public byte[] getRowKeyPrefix() {
-        return rowKeyPrefix;
+    public byte[] getRowKeyMatcher() {
+        return rowKeyMatcher;
     }
 
     public String getIndexWhere() {
diff --git 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/transform/Transform.java 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/transform/Transform.java
index af67012912..e9ca0e56f8 100644
--- 
a/phoenix-core/src/main/java/org/apache/phoenix/schema/transform/Transform.java
+++ 
b/phoenix-core/src/main/java/org/apache/phoenix/schema/transform/Transform.java
@@ -201,7 +201,7 @@ public class Transform {
                 .setIsChangeDetectionEnabled(table.isChangeDetectionEnabled())
                 .setStreamingTopicName(table.getStreamingTopicName())
                 .setTTL(table.getTTL())
-                .setRowKeyPrefix(table.getRowKeyPrefix())
+                .setRowKeyMatcher(table.getRowKeyMatcher())
                 // Transformables
                 .setImmutableStorageScheme(
                         (changedProps.getImmutableStorageSchemeProp() != null? 
changedProps.getImmutableStorageSchemeProp():table.getImmutableStorageScheme()))
diff --git a/phoenix-core/src/main/protobuf/PTable.proto 
b/phoenix-core/src/main/protobuf/PTable.proto
index 8d685937dd..46a4be6a79 100644
--- a/phoenix-core/src/main/protobuf/PTable.proto
+++ b/phoenix-core/src/main/protobuf/PTable.proto
@@ -118,7 +118,7 @@ message PTable {
   optional PTable transformingNewTable=51;
   optional bytes streamingTopicName=52;
   optional int32 ttl = 53;
-  optional bytes rowKeyPrefix = 54;
+  optional bytes rowKeyMatcher = 54;
   optional bytes indexWhere=55;
 }
 

Reply via email to