in paimon-format/src/main/java/org/apache/paimon/format/avro/AvroToRowDataConverters.java [104:156]
static AvroToRowDataConverter createConverter(DataType type) {
switch (type.getTypeRoot()) {
case TINYINT:
return avroObject -> ((Integer) avroObject).byteValue();
case SMALLINT:
return avroObject -> ((Integer) avroObject).shortValue();
case BOOLEAN: // boolean
case INTEGER: // int
case BIGINT: // long
case FLOAT: // float
case DOUBLE: // double
return avroObject -> avroObject;
case DATE:
return AvroToRowDataConverters::convertToDate;
case TIME_WITHOUT_TIME_ZONE:
return AvroToRowDataConverters::convertToTime;
case TIMESTAMP_WITHOUT_TIME_ZONE:
int precision = ((TimestampType) type).getPrecision();
if (precision <= 3) {
return AvroToRowDataConverters::convertToTimestampFromMillis;
} else if (precision <= 6) {
return AvroToRowDataConverters::convertToTimestampFromMicros;
} else {
throw new UnsupportedOperationException("Unsupported precision: " + precision);
}
case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
precision = ((LocalZonedTimestampType) type).getPrecision();
if (precision <= 3) {
return AvroToRowDataConverters::convertToTimestampFromMillis;
} else if (precision <= 6) {
return AvroToRowDataConverters::convertToTimestampFromMicros;
} else {
throw new UnsupportedOperationException("Unsupported precision: " + precision);
}
case CHAR:
case VARCHAR:
return avroObject -> BinaryString.fromString(avroObject.toString());
case BINARY:
case VARBINARY:
return AvroToRowDataConverters::convertToBytes;
case DECIMAL:
return createDecimalConverter((DecimalType) type);
case ARRAY:
return createArrayConverter((ArrayType) type);
case ROW:
return createRowConverter((RowType) type);
case MAP:
case MULTISET:
return createMapConverter(type);
default:
throw new UnsupportedOperationException("Unsupported type: " + type);
}
}