in paimon-common/src/main/java/org/apache/paimon/data/InternalArray.java [76:153]
static ElementGetter createElementGetter(DataType elementType) {
final ElementGetter elementGetter;
// ordered by type root definition
switch (elementType.getTypeRoot()) {
case CHAR:
case VARCHAR:
elementGetter = InternalArray::getString;
break;
case BOOLEAN:
elementGetter = InternalArray::getBoolean;
break;
case BINARY:
case VARBINARY:
elementGetter = InternalArray::getBinary;
break;
case DECIMAL:
final int decimalPrecision = getPrecision(elementType);
final int decimalScale = getScale(elementType);
elementGetter =
(array, pos) -> array.getDecimal(pos, decimalPrecision, decimalScale);
break;
case TINYINT:
elementGetter = InternalArray::getByte;
break;
case SMALLINT:
elementGetter = InternalArray::getShort;
break;
case INTEGER:
case DATE:
case TIME_WITHOUT_TIME_ZONE:
elementGetter = InternalArray::getInt;
break;
case BIGINT:
elementGetter = InternalArray::getLong;
break;
case FLOAT:
elementGetter = InternalArray::getFloat;
break;
case DOUBLE:
elementGetter = InternalArray::getDouble;
break;
case TIMESTAMP_WITHOUT_TIME_ZONE:
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
final int timestampPrecision = getPrecision(elementType);
elementGetter = (array, pos) -> array.getTimestamp(pos, timestampPrecision);
break;
case ARRAY:
elementGetter = InternalArray::getArray;
break;
case MULTISET:
case MAP:
elementGetter = InternalArray::getMap;
break;
case ROW:
final int rowFieldCount = getFieldCount(elementType);
elementGetter = (array, pos) -> array.getRow(pos, rowFieldCount);
break;
case VARIANT:
elementGetter = InternalArray::getVariant;
break;
default:
String msg =
String.format(
"type %s not support in %s",
elementType.getTypeRoot().toString(),
InternalArray.class.getName());
throw new IllegalArgumentException(msg);
}
if (!elementType.isNullable()) {
return elementGetter;
}
return (array, pos) -> {
if (array.isNullAt(pos)) {
return null;
}
return elementGetter.getElementOrNull(array, pos);
};
}