in fluss-common/src/main/java/com/alibaba/fluss/row/InternalRow.java [210:276]
static FieldGetter createFieldGetter(DataType fieldType, int fieldPos) {
final FieldGetter fieldGetter;
// ordered by type root definition
switch (fieldType.getTypeRoot()) {
case CHAR:
final int bytesLength = getLength(fieldType);
fieldGetter = row -> row.getChar(fieldPos, bytesLength);
break;
case STRING:
fieldGetter = row -> row.getString(fieldPos);
break;
case BOOLEAN:
fieldGetter = row -> row.getBoolean(fieldPos);
break;
case BINARY:
final int binaryLength = getLength(fieldType);
fieldGetter = row -> row.getBinary(fieldPos, binaryLength);
break;
case BYTES:
fieldGetter = row -> row.getBytes(fieldPos);
break;
case DECIMAL:
final int decimalPrecision = getPrecision(fieldType);
final int decimalScale = getScale(fieldType);
fieldGetter = row -> row.getDecimal(fieldPos, decimalPrecision, decimalScale);
break;
case TINYINT:
fieldGetter = row -> row.getByte(fieldPos);
break;
case SMALLINT:
fieldGetter = row -> row.getShort(fieldPos);
break;
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
fieldGetter = row -> row.getInt(fieldPos);
break;
case BIGINT:
fieldGetter = row -> row.getLong(fieldPos);
break;
case FLOAT:
fieldGetter = row -> row.getFloat(fieldPos);
break;
case DOUBLE:
fieldGetter = row -> row.getDouble(fieldPos);
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
final int timestampNtzPrecision = getPrecision(fieldType);
fieldGetter = row -> row.getTimestampNtz(fieldPos, timestampNtzPrecision);
break;
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampLtzPrecision = getPrecision(fieldType);
fieldGetter = row -> row.getTimestampLtz(fieldPos, timestampLtzPrecision);
break;
default:
throw new IllegalArgumentException("Illegal type: " + fieldType);
}
if (!fieldType.isNullable()) {
return fieldGetter;
}
return row -> {
if (row.isNullAt(fieldPos)) {
return null;
}
return fieldGetter.getFieldOrNull(row);
};
}