in paimon-trino-common/src/main/java/org/apache/paimon/trino/TrinoPageSourceBase.java [232:289]
private void writeBlock(BlockBuilder output, Type type, DataType logicalType, Object value) {
if (type instanceof ArrayType) {
BlockBuilder builder = output.beginBlockEntry();
InternalArray arrayData = (InternalArray) value;
DataType elementType = DataTypeChecks.getNestedTypes(logicalType).get(0);
for (int i = 0; i < arrayData.size(); i++) {
appendTo(
type.getTypeParameters().get(0),
elementType,
InternalRowUtils.get(arrayData, i, elementType),
builder);
}
output.closeEntry();
return;
}
if (type instanceof RowType) {
InternalRow rowData = (InternalRow) value;
BlockBuilder builder = output.beginBlockEntry();
for (int index = 0; index < type.getTypeParameters().size(); index++) {
Type fieldType = type.getTypeParameters().get(index);
DataType fieldLogicalType =
((org.apache.paimon.types.RowType) logicalType).getTypeAt(index);
appendTo(
fieldType,
fieldLogicalType,
InternalRowUtils.get(rowData, index, fieldLogicalType),
builder);
}
output.closeEntry();
return;
}
if (type instanceof MapType) {
InternalMap mapData = (InternalMap) value;
InternalArray keyArray = mapData.keyArray();
InternalArray valueArray = mapData.valueArray();
DataType keyType = ((org.apache.paimon.types.MapType) logicalType).getKeyType();
DataType valueType = ((org.apache.paimon.types.MapType) logicalType).getValueType();
BlockBuilder builder = output.beginBlockEntry();
for (int i = 0; i < keyArray.size(); i++) {
appendTo(
type.getTypeParameters().get(0),
keyType,
InternalRowUtils.get(keyArray, i, keyType),
builder);
appendTo(
type.getTypeParameters().get(1),
valueType,
InternalRowUtils.get(valueArray, i, valueType),
builder);
}
output.closeEntry();
return;
}
throw new TrinoException(
GENERIC_INTERNAL_ERROR, "Unhandled type for Block: " + type.getTypeSignature());
}