in fluss-common/src/main/java/com/alibaba/fluss/row/compacted/CompactedRowWriter.java [306:373]
public static FieldWriter createFieldWriter(DataType fieldType) {
final FieldWriter fieldWriter;
switch (fieldType.getTypeRoot()) {
case CHAR:
case STRING:
fieldWriter = (writer, pos, value) -> writer.writeString((BinaryString) value);
break;
case BOOLEAN:
fieldWriter = (writer, pos, value) -> writer.writeBoolean((boolean) value);
break;
case BINARY:
case BYTES:
fieldWriter = (writer, pos, value) -> writer.writeBytes((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:
final int timestampNtzPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeTimestampNtz(
(TimestampNtz) value, timestampNtzPrecision);
break;
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampLtzPrecision = getPrecision(fieldType);
fieldWriter =
(writer, pos, value) ->
writer.writeTimestampLtz(
(TimestampLtz) value, timestampLtzPrecision);
break;
default:
throw new IllegalArgumentException("Unsupported type for IndexedRow: " + fieldType);
}
if (!fieldType.isNullable()) {
return fieldWriter;
}
return (writer, pos, value) -> {
if (value == null) {
writer.setNullAt(pos);
} else {
fieldWriter.writeField(writer, pos, value);
}
};
}