ankitsinghal commented on code in PR #1353:
URL: https://github.com/apache/phoenix/pull/1353#discussion_r844322557


##########
phoenix-core/src/main/java/org/apache/phoenix/util/SchemaUtil.java:
##########
@@ -595,25 +594,35 @@ public static boolean isSystemTable(byte[] fullTableName) 
{
         if (QueryConstants.SYSTEM_SCHEMA_NAME.equals(schemaName)) return true;
         return false;
     }
-    
-    // Given the splits and the rowKeySchema, find out the keys that 
-    public static byte[][] processSplits(byte[][] splits, 
LinkedHashSet<PColumn> pkColumns, Integer saltBucketNum, boolean 
defaultRowKeyOrder) throws SQLException {
-        // FIXME: shouldn't this return if splits.length == 0?
-        if (splits == null) return null;
-        // We do not accept user specified splits if the table is salted and 
we specify defaultRowKeyOrder. In this case,
-        // throw an exception.
-        if (splits.length > 0 && saltBucketNum != null && defaultRowKeyOrder) {
-            throw new 
SQLExceptionInfo.Builder(SQLExceptionCode.NO_SPLITS_ON_SALTED_TABLE).build().buildException();
-        }
-        // If the splits are not specified and table is salted, pre-split the 
table. 
-        if (splits.length == 0 && saltBucketNum != null) {
-            splits = SaltingUtil.getSalteByteSplitPoints(saltBucketNum);
-        }
-        byte[][] newSplits = new byte[splits.length][];
+
+    // Given the splits and the rowKeySchema, add the split points based on 
saltBucketNum, as well
+    // as the ones passed in the parameter, call processSplit on both, and 
return the union.
+    public static byte[][] processSplits(byte[][] splits, 
LinkedHashSet<PColumn> pkColumns, Integer saltBucketNum) throws SQLException {
+        if (splits == null) {
+            splits = new byte[0][];
+        }
+
+        TreeSet<byte[]> allSplits = new TreeSet<>(new 
Bytes.ByteArrayComparator());
+
+        // Add the salted split points, if any
+        if (saltBucketNum != null) {
+            byte[][] saltSplits = 
SaltingUtil.getSaltedByteSplitPoints(saltBucketNum);
+            for (int i=0; i<saltSplits.length; i++) {
+                allSplits.add(processSplit(saltSplits[i], pkColumns));
+            }
+        }
+
+        //Add the specified split points
         for (int i=0; i<splits.length; i++) {
-            newSplits[i] = processSplit(splits[i], pkColumns); 
+            allSplits.add(processSplit(splits[i], pkColumns));

Review Comment:
   How we are ensuring that the explicit split will always start with the SALT 
< buckets?



##########
phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionlessQueryServicesImpl.java:
##########
@@ -289,8 +289,11 @@ public MetaDataMutationResult getTable(PName tenantId, 
byte[] schemaBytes, byte[
     }
     
     private static List<HRegionLocation> generateRegionLocations(byte[] 
physicalName, byte[][] splits) {
-        byte[] startKey = HConstants.EMPTY_START_ROW;
         List<HRegionLocation> regions = 
Lists.newArrayListWithExpectedSize(splits.length);
+        if (splits.length == 0) {
+            return regions;
+        }
+        byte[] startKey = HConstants.EMPTY_START_ROW;

Review Comment:
   nit:
   ```suggestion
           if (splits.length == 0) {
               return regions;
           }
           List<HRegionLocation> regions = 
Lists.newArrayListWithExpectedSize(splits.length);
           byte[] startKey = HConstants.EMPTY_START_ROW;
   ```



##########
phoenix-core/src/it/java/org/apache/phoenix/end2end/salted/SaltedTableIT.java:
##########
@@ -63,14 +65,43 @@ public void testTableWithInvalidBucketNumber() throws 
Exception {
     }
 
     @Test
-    public void testTableWithSplit() throws Exception {
-        try {
-            createTestTable(getUrl(), "create table " + generateUniqueName() + 
" (a_integer integer not null primary key) SALT_BUCKETS = 4",
-                    new byte[][] {{1}, {2,3}, {2,5}, {3}}, null);
+    public void testTableWithExplicitSplit() throws Exception {
+        byte[][] expectedStartKeys =
+        new byte[][] { {},
+            {1, 0, 0, 0, 0},
+            {2, 0, 0, 0, 0},
+            {2, 3, 0, 0, 0},
+            {2, 5, 0, 0, 0},
+            {3, 0, 0, 0, 0}};
+        String tableName = generateUniqueName();
+        createTestTable(getUrl(), "create table " + tableName + " (a_integer 
integer not null primary key) SALT_BUCKETS = 4",
+                new byte[][] {{1}, {2,3}, {2,5}, {3}}, null);
+        Admin admin = utility.getAdmin();
+        ArrayList<byte[]> startKeys = new ArrayList<>();
+        List<RegionInfo> regionInfos =
+                admin.getRegions(TableName.valueOf(tableName));
+        for (RegionInfo regionInfo : regionInfos) {
+            startKeys.add(regionInfo.getStartKey());
+        }
+        assertTrue(Arrays.deepEquals(expectedStartKeys, startKeys.toArray()));

Review Comment:
   This makes sense, we are ensuring that we never overlap two buckets.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to