in paimon-web-api/src/main/java/org/apache/paimon/web/api/table/TableMetadata.java [80:139]
private static List<ColumnMetadata> normalizeFields(
List<ColumnMetadata> columns, List<String> primaryKeys, List<String> partitionKeys) {
List<String> fieldNames =
columns.stream().map(ColumnMetadata::name).collect(Collectors.toList());
Set<String> duplicateColumns = duplicate(fieldNames);
Preconditions.checkState(
duplicateColumns.isEmpty(),
"Table column %s must not contain duplicate fields. Found: %s",
fieldNames,
duplicateColumns);
Set<String> allFields = new HashSet<>(fieldNames);
duplicateColumns = duplicate(partitionKeys);
Preconditions.checkState(
duplicateColumns.isEmpty(),
"Partition key constraint %s must not contain duplicate columns. Found: %s",
partitionKeys,
duplicateColumns);
Preconditions.checkState(
allFields.containsAll(partitionKeys),
"Table column %s should include all partition fields %s",
fieldNames,
partitionKeys);
if (primaryKeys.isEmpty()) {
return columns;
}
duplicateColumns = duplicate(primaryKeys);
Preconditions.checkState(
duplicateColumns.isEmpty(),
"Primary key constraint %s must not contain duplicate columns. Found: %s",
primaryKeys,
duplicateColumns);
Preconditions.checkState(
allFields.containsAll(primaryKeys),
"Table column %s should include all primary key constraint %s",
fieldNames,
primaryKeys);
Set<String> pkSet = new HashSet<>(primaryKeys);
Preconditions.checkState(
pkSet.containsAll(partitionKeys),
"Primary key constraint %s should include all partition fields %s",
primaryKeys,
partitionKeys);
// primary key should not nullable
List<ColumnMetadata> newFields = new ArrayList<>();
for (ColumnMetadata field : columns) {
if (pkSet.contains(field.name()) && field.type().isNullable()) {
newFields.add(
new ColumnMetadata(
field.name(), field.type().copy(false), field.description()));
} else {
newFields.add(field);
}
}
return newFields;
}