private static List normalizeFields()

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;
    }