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

jisaac 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 5505bd3ce5 PHOENIX-7041 (ADDENDUM-2): ROW_KEY_MATCHER should support 
various tenantId data types (#1900)
5505bd3ce5 is described below

commit 5505bd3ce5b11ea17a86ad49c3644d5aac3444a9
Author: Jacob Isaac <[email protected]>
AuthorDate: Mon Jun 17 17:13:24 2024 -0700

    PHOENIX-7041 (ADDENDUM-2): ROW_KEY_MATCHER should support various tenantId 
data types (#1900)
---
 .../phoenix/end2end/BaseRowKeyMatcherTestIT.java   | 111 +++++++++++++++++----
 .../apache/phoenix/end2end/TTLAsPhoenixTTLIT.java  |  10 +-
 .../org/apache/phoenix/compile/WhereOptimizer.java |  17 +++-
 3 files changed, 110 insertions(+), 28 deletions(-)

diff --git 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
index 76d4f5da41..941d98fc92 100644
--- 
a/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
+++ 
b/phoenix-core/src/it/java/org/apache/phoenix/end2end/BaseRowKeyMatcherTestIT.java
@@ -26,6 +26,8 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.ResultScanner;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.client.Table;
+import org.apache.hadoop.hbase.filter.BinaryComparator;
+import org.apache.hadoop.hbase.filter.BinaryComponentComparator;
 import org.apache.hadoop.hbase.filter.FilterList;
 import org.apache.hadoop.hbase.filter.PrefixFilter;
 import org.apache.hadoop.hbase.filter.RowFilter;
@@ -64,11 +66,13 @@ import org.apache.phoenix.schema.types.PInteger;
 import org.apache.phoenix.schema.types.PLong;
 import org.apache.phoenix.schema.types.PSmallint;
 import org.apache.phoenix.schema.types.PTimestamp;
+import org.apache.phoenix.schema.types.PTinyint;
 import org.apache.phoenix.schema.types.PVarchar;
 import org.apache.phoenix.thirdparty.com.google.common.collect.Maps;
 import org.apache.phoenix.util.ByteUtil;
 import org.apache.phoenix.util.PhoenixRuntime;
 import org.apache.phoenix.util.PropertiesUtil;
+import org.apache.phoenix.util.ScanUtil;
 import org.apache.phoenix.util.SchemaUtil;
 import org.apache.phoenix.util.ViewUtil;
 import org.junit.Test;
@@ -223,7 +227,8 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
     }
 
     // Helper method to create a base table
-    private void createBaseTable(String tableName, boolean isMultiTenant) 
throws SQLException {
+    private void createBaseTable(String tableName, boolean isMultiTenant, 
PDataType tenantDataType)
+            throws SQLException {
         String baseTableName = String.format(BASE_TABLE_NAME_FMT, tableName);
 
         try (Connection globalConnection = 
DriverManager.getConnection(getUrl())) {
@@ -231,11 +236,12 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
                 String
                         CO_BASE_TBL_TEMPLATE =
                         "CREATE TABLE IF NOT EXISTS %s(" +
-                                "OID CHAR(15) NOT NULL,KP CHAR(3) NOT NULL, " +
+                                "OID %s 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,
+                        getType(tenantDataType),
                         isMultiTenant ? ", MULTI_TENANT=true" : ""));
             }
         }
@@ -287,13 +293,19 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
     // Helper method to create a tenant view
     // Return a pair [view-key, row-key-matcher for the view]
 
-    private Pair<String, byte[]> createTenantView(boolean extendPK, int 
partition, int tenant,
+    private Pair<String, byte[]> createTenantView(boolean extendPK, int 
partition,
+            PDataType tenantIdType, 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 tenantId = "";
+        if (tenantIdType.getSqlType() == Types.VARCHAR || 
tenantIdType.getSqlType() == Types.CHAR) {
+            tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, tenant);
+        } else {
+            tenantId = String.format("%015d", tenant);
+        }
         String
                 tenantConnectionUrl =
                 String.format(TENANT_URL_FMT, getUrl(), TENANT_ID_ATTRIB, 
tenantId);
@@ -323,7 +335,8 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
 
     // 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)
+            PDataType tenantIdType, int tenant, int tenantViewNum, int 
rowIndex,
+            String[] pkNames, PDataType[] pkTypes)
             throws SQLException {
 
         String rid = String.format(ROW_ID_FMT, rowIndex);
@@ -337,7 +350,12 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
 
         String partitionName = String.format(PARTITION_FMT, partition);
 
-        String tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, tenant);
+        String tenantId = "";
+        if (tenantIdType.getSqlType() == Types.VARCHAR || 
tenantIdType.getSqlType() == Types.CHAR) {
+            tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, tenant);
+        } else {
+            tenantId = String.format("%015d", tenant);
+        }
         String
                 tenantConnectionUrl =
                 String.format(TENANT_URL_FMT, getUrl(), TENANT_ID_ATTRIB, 
tenantId);
@@ -638,9 +656,6 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
             Scan allRows = new Scan();
             // Add tenant as the prefix filter
             FilterList andFilter = new FilterList();
-            if (tenantId != null) {
-                andFilter.addFilter(new PrefixFilter(tenantId.getBytes()));
-            }
             andFilter.addFilter(new RowFilter(CompareOperator.EQUAL, new 
SubstringComparator(rid)));
             allRows.setFilter(andFilter);
             ResultScanner scanner = tbl.getScanner(allRows);
@@ -668,13 +683,8 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
 
         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(rid)));
             allRows.setFilter(andFilter);
             ResultScanner scanner = tbl.getScanner(allRows);
@@ -774,6 +784,55 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
         }
     }
 
+    @Test
+    public void testViewsWithVariousTenantIdTypes() {
+        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 } };
+
+            String tableName = "";
+            tableName = createViewHierarchy( PInteger.INSTANCE,
+                    testCases, sortOrders, 700, 7000, 3,
+                    true, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+
+            tableName = createViewHierarchy( PLong.INSTANCE,
+                    testCases, sortOrders, 710, 7100, 3,
+                    true, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+
+            tableName = createViewHierarchy( PSmallint.INSTANCE,
+                    testCases, sortOrders, 720, 7200, 3,
+                    true, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+
+            tableName = createViewHierarchy( PTinyint.INSTANCE,
+                    testCases, sortOrders, 730, 7300, 3,
+                    true, true, false);
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+            assertRowKeyMatchersForTable(getUrl(), 
SchemaUtil.getSchemaNameFromFullName(tableName),
+                    SchemaUtil.getTableNameFromFullName(tableName));
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            LOGGER.error(e.getMessage());
+        }
+    }
+
     @Test
     public void testViewsWithoutExtendedPK() {
         try {
@@ -862,16 +921,23 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
         }
 
     }
-
     private String createViewHierarchy(List<PDataType[]> testCases, 
SortOrder[][] sortOrders,
             int startPartition, int startRowId, int numTenants, boolean 
isMultiTenant,
             boolean extendPK, boolean hasGlobalViewIndexes) throws Exception {
+        return createViewHierarchy(PChar.INSTANCE, testCases, sortOrders, 
startPartition,
+                startRowId, numTenants,isMultiTenant, 
extendPK,hasGlobalViewIndexes);
+    }
+
+
+    private String createViewHierarchy(PDataType tenantIdType, 
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();
 
         // Create a base table
-        createBaseTable(tableName, isMultiTenant);
+        createBaseTable(tableName, isMultiTenant, tenantIdType);
         String baseTableName = String.format(BASE_TABLE_NAME_FMT, tableName);
         String indexTableName = String.format(INDEX_TABLE_NAME_FMT, tableName);
 
@@ -902,7 +968,7 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
                     Pair<String, byte[]>
                             tvRowKeyInfo =
                             createTenantView(
-                                    extendPK, partition, tenant, 1, 
globalViewPKNames,
+                                    extendPK, partition, tenantIdType, tenant, 
1, globalViewPKNames,
                                     testCases.get(testCase));
                     actualViewToRowKeyMap.put(tvRowKeyInfo.getFirst(), 
tvRowKeyInfo.getSecond());
                     LOGGER.debug(String.format("Created tenant view %s 
[partition = %d]",
@@ -920,8 +986,8 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
                     rowId++;
                     try {
                         upsertTenantViewRows(
-                                isMultiTenant, extendPK, partition, tenant, 1, 
rowId,
-                                globalViewPKNames, testCases.get(testCase));
+                                isMultiTenant, extendPK, partition, 
tenantIdType, tenant,
+                                1, rowId, globalViewPKNames, 
testCases.get(testCase));
                     } catch (Exception ex) {
                         String
                                 testInfo =
@@ -959,7 +1025,12 @@ public abstract class BaseRowKeyMatcherTestIT extends 
ParallelStatsDisabledIT {
                     rowId++;
                     String partitionName = String.format(PARTITION_FMT, 
partition);
 
-                    String tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, 
tenant);
+                    String tenantId = "";
+                    if (tenantIdType.getSqlType() == Types.VARCHAR || 
tenantIdType.getSqlType() == Types.CHAR) {
+                        tenantId = String.format(ORG_ID_FMT, ORG_ID_PREFIX, 
tenant);
+                    } else {
+                        tenantId = String.format("%015d", tenant);
+                    }
                     String
                             tenantConnectionUrl =
                             String.format(TENANT_URL_FMT, getUrl(), 
TENANT_ID_ATTRIB, tenantId);
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 82735fa7b0..ac835947e0 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
@@ -230,8 +230,8 @@ public class TTLAsPhoenixTTLIT extends 
ParallelStatsDisabledIT{
     @Test
     public void testSettingTTLForViewsOnTableWithTTL() throws Exception {
         try (Connection conn = DriverManager.getConnection(getUrl())) {
-            String tenantID = generateUniqueName();
-            String tenantID1 = generateUniqueName();
+            String tenantID = generateUniqueName().substring(1);
+            String tenantID1 = generateUniqueName().substring(1);
 
             Properties props = new Properties();
             props.setProperty(TENANT_ID_ATTRIB, tenantID);
@@ -303,7 +303,7 @@ public class TTLAsPhoenixTTLIT extends 
ParallelStatsDisabledIT{
     @Test
     public void testAlteringTTLToNONEAndThenSettingAtAnotherLevel() throws 
Exception {
         try (Connection conn = DriverManager.getConnection(getUrl())) {
-            String tenantID = generateUniqueName();
+            String tenantID = generateUniqueName().substring(1);
 
             Properties props = new Properties();
             props.setProperty(TENANT_ID_ATTRIB, tenantID);
@@ -370,8 +370,8 @@ public class TTLAsPhoenixTTLIT extends 
ParallelStatsDisabledIT{
     @Test
     public void testAlteringTTLAtOneLevelAndCheckingAtAnotherLevel() throws 
Exception {
         try (Connection conn = DriverManager.getConnection(getUrl())) {
-            String tenantID = generateUniqueName();
-            String tenantID1 = generateUniqueName();
+            String tenantID = generateUniqueName().substring(1);
+            String tenantID1 = generateUniqueName().substring(1);
 
             Properties props = new Properties();
             props.setProperty(TENANT_ID_ATTRIB, tenantID);
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 4b174aaf4f..ab2c4670bb 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
@@ -487,12 +487,17 @@ public class WhereOptimizer {
             final TableName tableNameNode,
             final PTable parentTable,
             final Expression viewWhereExpression
-    ) {
+    ) throws SQLException {
         RowKeySchema schema = parentTable.getRowKeySchema();
         List<List<KeyRange>> rowKeySlotRangesList = new ArrayList<>();
+        Integer nBuckets = parentTable.getBucketNum();
+        boolean isSalted = nBuckets != null;
         PName tenantId = context.getConnection().getTenantId();
+        boolean isMultiTenant = tenantId != null && 
parentTable.isMultiTenant();
+
         byte[] tenantIdBytes = tenantId == null
-                ? ByteUtil.EMPTY_BYTE_ARRAY : 
tenantId.getString().getBytes(StandardCharsets.UTF_8);
+                ? ByteUtil.EMPTY_BYTE_ARRAY :
+                ScanUtil.getTenantIdBytes(schema, isSalted, tenantId, 
isMultiTenant, false);
         if (tenantIdBytes.length != 0) {
             
rowKeySlotRangesList.add(Arrays.asList(KeyRange.POINT.apply(tenantIdBytes)));
         }
@@ -542,10 +547,16 @@ public class WhereOptimizer {
     ) throws SQLException {
 
         RowKeySchema schema = parentTable.getRowKeySchema();
+        Integer nBuckets = parentTable.getBucketNum();
+        boolean isSalted = nBuckets != null;
+
         List<List<KeyRange>> rowKeySlotRangesList = new ArrayList<>();
         PName tenantId = connection.getTenantId();
+        boolean isMultiTenant = tenantId != null && 
parentTable.isMultiTenant();
         byte[] tenantIdBytes = tenantId == null
-                ? ByteUtil.EMPTY_BYTE_ARRAY : 
tenantId.getString().getBytes(StandardCharsets.UTF_8);
+                ? ByteUtil.EMPTY_BYTE_ARRAY :
+                ScanUtil.getTenantIdBytes(schema, isSalted, tenantId, 
isMultiTenant, false);
+
         if (tenantIdBytes.length != 0) {
             
rowKeySlotRangesList.add(Arrays.asList(KeyRange.POINT.apply(tenantIdBytes)));
         }

Reply via email to