in fluss-common/src/main/java/com/alibaba/fluss/row/indexed/IndexedRowReader.java [206:272]
static FieldReader createFieldReader(DataType fieldType) {
final FieldReader fieldReader;
// ordered by type root definition
switch (fieldType.getTypeRoot()) {
case CHAR:
final int charLength = getLength(fieldType);
fieldReader = (reader, pos) -> reader.readChar(charLength);
break;
case STRING:
fieldReader = (reader, pos) -> reader.readString();
break;
case BOOLEAN:
fieldReader = (reader, pos) -> reader.readBoolean();
break;
case BINARY:
final int binaryLength = getLength(fieldType);
fieldReader = (reader, pos) -> reader.readBinary(binaryLength);
break;
case BYTES:
fieldReader = (reader, pos) -> reader.readBytes();
break;
case DECIMAL:
final int decimalPrecision = getPrecision(fieldType);
final int decimalScale = getScale(fieldType);
fieldReader = (reader, pos) -> reader.readDecimal(decimalPrecision, decimalScale);
break;
case TINYINT:
fieldReader = (reader, pos) -> reader.readByte();
break;
case SMALLINT:
fieldReader = (reader, pos) -> reader.readShort();
break;
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
fieldReader = (reader, pos) -> reader.readInt();
break;
case BIGINT:
fieldReader = (reader, pos) -> reader.readLong();
break;
case FLOAT:
fieldReader = (reader, pos) -> reader.readFloat();
break;
case DOUBLE:
fieldReader = (reader, pos) -> reader.readDouble();
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
final int timestampNtzPrecision = getPrecision(fieldType);
fieldReader = (reader, pos) -> reader.readTimestampNtz(timestampNtzPrecision);
break;
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampLtzPrecision = getPrecision(fieldType);
fieldReader = (reader, pos) -> reader.readTimestampLtz(timestampLtzPrecision);
break;
default:
throw new IllegalArgumentException("Unsupported type for IndexedRow: " + fieldType);
}
if (!fieldType.isNullable()) {
return fieldReader;
}
return (reader, pos) -> {
if (reader.isNullAt(pos)) {
return null;
}
return fieldReader.readField(reader, pos);
};
}