in fluss-common/src/main/java/com/alibaba/fluss/row/encode/paimon/PaimonBinaryRowWriter.java [367:435]
public static FieldWriter createFieldWriter(DataType fieldType) {
final FieldWriter fieldWriter;
switch (fieldType.getTypeRoot()) {
case CHAR:
case STRING:
fieldWriter = (writer, pos, value) -> writer.writeString(pos, (BinaryString) value);
break;
case BOOLEAN:
fieldWriter = (writer, pos, value) -> writer.writeBoolean(pos, (boolean) value);
break;
case BINARY:
case BYTES:
fieldWriter = (writer, pos, value) -> writer.writeBytes(pos, (byte[]) value);
break;
case DECIMAL:
final int decimalPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeDecimal(pos, (Decimal) value, decimalPrecision);
break;
case TINYINT:
fieldWriter = (writer, pos, value) -> writer.writeByte(pos, (byte) value);
break;
case SMALLINT:
fieldWriter = (writer, pos, value) -> writer.writeShort(pos, (short) value);
break;
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
fieldWriter = (writer, pos, value) -> writer.writeInt(pos, (int) value);
break;
case BIGINT:
fieldWriter = (writer, pos, value) -> writer.writeLong(pos, (long) value);
break;
case FLOAT:
fieldWriter = (writer, pos, value) -> writer.writeFloat(pos, (float) value);
break;
case DOUBLE:
fieldWriter = (writer, pos, value) -> writer.writeDouble(pos, (double) value);
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
final int timestampNtzPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeTimestampNtz(
pos, (TimestampNtz) value, timestampNtzPrecision);
break;
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampLtzPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeTimestampLtz(
pos, (TimestampLtz) value, timestampLtzPrecision);
break;
default:
throw new IllegalArgumentException(
"Unsupported type for Paimon BinaryRow writer: " + fieldType);
}
if (!fieldType.isNullable()) {
return fieldWriter;
}
return (writer, pos, value) -> {
if (value == null) {
writer.setNullAt(pos);
} else {
fieldWriter.writeField(writer, pos, value);
}
};
}