public static List<List<KeyRange>> flattenRanges(List<List<KeyRange>> ranges, RowKeySchema schema, int bucketNum) {
if (ranges == null || ranges.isEmpty()) {
return ScanRanges.NOTHING.getRanges();
}
int count = 1;
for (int i = 1; i < ranges.size(); i++) {
count *= ranges.get(i).size();
}
KeyRange[] expandedRanges = new KeyRange[count];
int[] position = new int[ranges.size()];
int estimatedKeyLength = ScanUtil.estimateMaximumKeyLength(schema, 1, ranges);
int idx = 0, length;
byte saltByte;
byte[] key = new byte[estimatedKeyLength];
do {
length = ScanUtil.setKey(schema, ranges, position, Bound.LOWER, key, 1, 0, ranges.size(), 1);
saltByte = SaltingUtil.getSaltingByte(key, 1, length, bucketNum);
key[0] = saltByte;
byte[] saltedKey = Arrays.copyOf(key, length + 1);
KeyRange range = PDataType.VARBINARY.getKeyRange(saltedKey, true, saltedKey, true);
expandedRanges[idx++] = range;
} while (incrementKey(ranges, position));
Arrays.sort(expandedRanges, KeyRange.COMPARATOR);
List<KeyRange> expandedRangesList = Arrays.asList(expandedRanges);
return Collections.singletonList(expandedRangesList);
}