in paimon-common/src/main/java/org/apache/paimon/data/serializer/RowCompactedSerializer.java [259:332]
private static FieldReader createFieldReader(DataType fieldType) {
final FieldReader fieldReader;
// ordered by type root definition
switch (fieldType.getTypeRoot()) {
case CHAR:
case VARCHAR:
fieldReader = (reader, pos) -> reader.readString();
break;
case BOOLEAN:
fieldReader = (reader, pos) -> reader.readBoolean();
break;
case BINARY:
case VARBINARY:
fieldReader = (reader, pos) -> reader.readBinary();
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:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampPrecision = getPrecision(fieldType);
fieldReader = (reader, pos) -> reader.readTimestamp(timestampPrecision);
break;
case ARRAY:
fieldReader = (reader, pos) -> reader.readArray();
break;
case MULTISET:
case MAP:
fieldReader = (reader, pos) -> reader.readMap();
break;
case ROW:
RowCompactedSerializer serializer = new RowCompactedSerializer((RowType) fieldType);
fieldReader = (reader, pos) -> reader.readRow(serializer);
break;
default:
String msg =
String.format(
"type %s not support in %s",
fieldType.getTypeRoot().toString(),
RowCompactedSerializer.class.getName());
throw new IllegalArgumentException(msg);
}
if (!fieldType.isNullable()) {
return fieldReader;
}
return (reader, pos) -> {
if (reader.isNullAt(pos)) {
return null;
}
return fieldReader.readField(reader, pos);
};
}