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