in amoro-format-iceberg/src/main/java/org/apache/amoro/log/data/LogArrayData.java [70:131]
static ElementGetter createElementGetter(Types.NestedField field) {
final ElementGetter elementGetter;
Type elementType = field.type();
switch (elementType.typeId()) {
case BOOLEAN:
elementGetter = LogArrayData::getBoolean;
break;
case INTEGER:
case DATE:
elementGetter = LogArrayData::getInt;
break;
case LONG:
case TIME:
elementGetter = LogArrayData::getLong;
break;
case FLOAT:
elementGetter = LogArrayData::getFloat;
break;
case DOUBLE:
elementGetter = LogArrayData::getDouble;
break;
case TIMESTAMP:
Types.TimestampType timestamp = (Types.TimestampType) elementType;
if (timestamp.shouldAdjustToUTC()) {
elementGetter = LogArrayData::getInstant;
} else {
elementGetter = LogArrayData::getTimestamp;
}
break;
case STRING:
elementGetter = LogArrayData::getString;
break;
case UUID:
case FIXED:
case BINARY:
elementGetter = LogArrayData::getBinary;
break;
case DECIMAL:
elementGetter = LogArrayData::getDecimal;
break;
case LIST:
elementGetter = LogArrayData::getArray;
break;
case MAP:
elementGetter = LogArrayData::getMap;
break;
case STRUCT:
elementGetter = LogArrayData::getStruct;
break;
default:
throw new UnsupportedOperationException("Not Support to parse type: " + elementType);
}
if (field.isRequired()) {
return elementGetter;
}
return (array, pos) -> {
if (array.isNullAt(pos)) {
return null;
}
return elementGetter.getElementOrNull(array, pos);
};
}