in common/src/main/java/org/apache/gravitino/json/JsonUtils.java [1120:1219]
public Partitioning deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
JsonNode node = p.getCodec().readTree(p);
Preconditions.checkArgument(
node != null && !node.isNull() && node.isObject(),
"Cannot parse partitioning from invalid JSON: %s",
node);
Preconditions.checkArgument(
node.has(STRATEGY), "Cannot parse partitioning from missing strategy: %s", node);
String strategy = getString(STRATEGY, node);
switch (Partitioning.Strategy.getByName(strategy)) {
case IDENTITY:
return IdentityPartitioningDTO.of(getStringList(FIELD_NAME, node).toArray(new String[0]));
case YEAR:
return YearPartitioningDTO.of(getStringList(FIELD_NAME, node).toArray(new String[0]));
case MONTH:
return MonthPartitioningDTO.of(getStringList(FIELD_NAME, node).toArray(new String[0]));
case DAY:
return DayPartitioningDTO.of(getStringList(FIELD_NAME, node).toArray(new String[0]));
case HOUR:
return HourPartitioningDTO.of(getStringList(FIELD_NAME, node).toArray(new String[0]));
case BUCKET:
int numBuckets = getInt(NUM_BUCKETS, node);
List<String[]> fieldNames = Lists.newArrayList();
node.get(FIELD_NAMES).forEach(field -> fieldNames.add(getStringArray((ArrayNode) field)));
return BucketPartitioningDTO.of(numBuckets, fieldNames.toArray(new String[0][0]));
case TRUNCATE:
int width = getInt(WIDTH, node);
return TruncatePartitioningDTO.of(
width, getStringList(FIELD_NAME, node).toArray(new String[0]));
case LIST:
List<String[]> listFields = Lists.newArrayList();
node.get(FIELD_NAMES).forEach(field -> listFields.add(getStringArray((ArrayNode) field)));
if (!node.hasNonNull(ASSIGNMENTS_NAME)) {
return ListPartitioningDTO.of(listFields.toArray(new String[0][0]));
}
Preconditions.checkArgument(
node.get(ASSIGNMENTS_NAME).isArray(),
"Cannot parse list partitioning from non-array assignments: %s",
node);
List<ListPartitionDTO> assignments = Lists.newArrayList();
node.get(ASSIGNMENTS_NAME)
.forEach(
assignment -> {
PartitionDTO partitionDTO = readPartition(assignment);
Preconditions.checkArgument(
partitionDTO instanceof ListPartitionDTO,
"Cannot parse list partitioning from non-list assignment: %s",
assignment);
assignments.add((ListPartitionDTO) partitionDTO);
});
return ListPartitioningDTO.of(
listFields.toArray(new String[0][0]), assignments.toArray(new ListPartitionDTO[0]));
case RANGE:
String[] fields = getStringList(FIELD_NAME, node).toArray(new String[0]);
if (!node.hasNonNull(ASSIGNMENTS_NAME)) {
return RangePartitioningDTO.of(fields);
}
Preconditions.checkArgument(
node.get(ASSIGNMENTS_NAME).isArray(),
"Cannot parse range partitioning from non-array assignments: %s",
node);
List<RangePartitionDTO> rangeAssignments = Lists.newArrayList();
node.get(ASSIGNMENTS_NAME)
.forEach(
assignment -> {
PartitionDTO partitionDTO = readPartition(assignment);
Preconditions.checkArgument(
partitionDTO instanceof RangePartitionDTO,
"Cannot parse range partitioning from non-range assignment: %s",
assignment);
rangeAssignments.add((RangePartitionDTO) partitionDTO);
});
return RangePartitioningDTO.of(
fields, rangeAssignments.toArray(new RangePartitionDTO[0]));
case FUNCTION:
String functionName = getString(FUNCTION_NAME, node);
Preconditions.checkArgument(
node.has(FUNCTION_ARGS),
"Cannot parse function partitioning from missing function args: %s",
node);
List<FunctionArg> args = Lists.newArrayList();
node.get(FUNCTION_ARGS).forEach(arg -> args.add(readFunctionArg(arg)));
return FunctionPartitioningDTO.of(functionName, args.toArray(FunctionArg.EMPTY_ARGS));
default:
throw new IOException("Unknown partitioning strategy: " + strategy);
}
}