in paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java [162:245]
private static FieldWriter createFieldWriter(DataType fieldType) {
final FieldWriter fieldWriter;
switch (fieldType.getTypeRoot()) {
case CHAR:
case VARCHAR:
fieldWriter = (writer, pos, value) -> writer.writeString((BinaryString) value);
break;
case BOOLEAN:
fieldWriter = (writer, pos, value) -> writer.writeBoolean((boolean) value);
break;
case BINARY:
case VARBINARY:
fieldWriter = (writer, pos, value) -> writer.writeBinary((byte[]) value);
break;
case DECIMAL:
final int decimalPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeDecimal((Decimal) value, decimalPrecision);
break;
case TINYINT:
fieldWriter = (writer, pos, value) -> writer.writeByte((byte) value);
break;
case SMALLINT:
fieldWriter = (writer, pos, value) -> writer.writeShort((short) value);
break;
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
fieldWriter = (writer, pos, value) -> writer.writeInt((int) value);
break;
case BIGINT:
fieldWriter = (writer, pos, value) -> writer.writeLong((long) value);
break;
case FLOAT:
fieldWriter = (writer, pos, value) -> writer.writeFloat((float) value);
break;
case DOUBLE:
fieldWriter = (writer, pos, value) -> writer.writeDouble((double) value);
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeTimestamp((Timestamp) value, timestampPrecision);
break;
case ARRAY:
Serializer<InternalArray> arraySerializer = InternalSerializers.create(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeArray(
(InternalArray) value,
(InternalArraySerializer) arraySerializer);
break;
case MULTISET:
case MAP:
Serializer<InternalMap> mapSerializer = InternalSerializers.create(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeMap(
(InternalMap) value, (InternalMapSerializer) mapSerializer);
break;
case ROW:
RowCompactedSerializer rowSerializer =
new RowCompactedSerializer((RowType) fieldType);
fieldWriter =
(writer, pos, value) -> writer.writeRow((InternalRow) value, rowSerializer);
break;
default:
throw new IllegalArgumentException();
}
if (!fieldType.isNullable()) {
return fieldWriter;
}
return (writer, pos, value) -> {
if (value == null) {
writer.setNullAt(pos);
} else {
fieldWriter.writeField(writer, pos, value);
}
};
}