presto-connector/src/main/java/com/facebook/presto/maxcompute/utils/ArrowToPageConverter.java [40:83]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class ArrowToPageConverter
{
    private final Map<String, TypeInfo> odpsTypeMap;
    private final List<ColumnHandle> requireColumns;
    private final Map<String, String> columnNameConvertMap;

    public ArrowToPageConverter(List<ColumnHandle> requireColumns, List<Column> schema)
    {
        this.odpsTypeMap = requireNonNull(schema, "schema is null").stream().collect(Collectors.toMap(Column::getName, Column::getTypeInfo));
        this.requireColumns = requireNonNull(requireColumns, "requireColumns is null");

        // It seems that Presto is not case-sensitive (all columns are automatically converted to lowercase), but MaxCompute is,
        // so we use columnNameConvertMap to do the conversion to convert the lowercase column names in the ColumnHandle to the correct column names.
        this.columnNameConvertMap = schema.stream().collect(Collectors.toMap(c -> c.getName().toLowerCase(), Column::getName));
    }

    public void convert(PageBuilder pageBuilder, VectorSchemaRoot vectorSchemaRoot)
    {
        pageBuilder.declarePositions(vectorSchemaRoot.getRowCount());
        for (int column = 0; column < requireColumns.size(); column++) {
            String requireColumnName = ((MaxComputeColumnHandle) requireColumns.get(column)).getName();
            String filedName = columnNameConvertMap.getOrDefault(requireColumnName, requireColumnName);
            FieldVector vector = vectorSchemaRoot.getVector(filedName);

            ArrowVectorAccessor dataAccessor = ArrowUtils.createColumnVectorAccessor(vector, odpsTypeMap.get(filedName));
            BlockBuilder blockBuilder = pageBuilder.getBlockBuilder(column);
            Type prestoType = ((MaxComputeColumnHandle) requireColumns.get(column)).getType();
            TypeInfo odpsType = odpsTypeMap.get(filedName);
            transferData(dataAccessor, blockBuilder, prestoType, odpsType, vector.getValueCount());
        }
    }

    private void transferData(ArrowVectorAccessor dataAccessor, BlockBuilder blockBuilder, Type prestoType, TypeInfo odpsType, int valueCount)
    {
        Class<?> javaType = prestoType.getJavaType();
        for (int index = 0; index < valueCount; index++) {
            Object data = ArrowUtils.getData(dataAccessor, odpsType, index);
            if (data == null) {
                blockBuilder.appendNull();
            }
            else if (javaType == boolean.class) {
                prestoType.writeBoolean(blockBuilder, (Boolean) data);
            }
            else if (javaType == long.class) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



trino-connector/src/main/java/io/trino/plugin/maxcompute/utils/ArrowToPageConverter.java [37:80]:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class ArrowToPageConverter
{
    private final Map<String, TypeInfo> odpsTypeMap;
    private final List<ColumnHandle> requireColumns;
    private final Map<String, String> columnNameConvertMap;

    public ArrowToPageConverter(List<ColumnHandle> requireColumns, List<Column> schema)
    {
        this.odpsTypeMap = requireNonNull(schema, "schema is null").stream().collect(Collectors.toMap(Column::getName, Column::getTypeInfo));
        this.requireColumns = requireNonNull(requireColumns, "requireColumns is null");

        // It seems that Presto is not case-sensitive (all columns are automatically converted to lowercase), but MaxCompute is,
        // so we use columnNameConvertMap to do the conversion to convert the lowercase column names in the ColumnHandle to the correct column names.
        this.columnNameConvertMap = schema.stream().collect(Collectors.toMap(c -> c.getName().toLowerCase(), Column::getName));
    }

    public void convert(PageBuilder pageBuilder, VectorSchemaRoot vectorSchemaRoot)
    {
        pageBuilder.declarePositions(vectorSchemaRoot.getRowCount());
        for (int column = 0; column < requireColumns.size(); column++) {
            String requireColumnName = ((MaxComputeColumnHandle) requireColumns.get(column)).getName();
            String filedName = columnNameConvertMap.getOrDefault(requireColumnName, requireColumnName);
            FieldVector vector = vectorSchemaRoot.getVector(filedName);

            ArrowVectorAccessor dataAccessor = ArrowUtils.createColumnVectorAccessor(vector, odpsTypeMap.get(filedName));
            BlockBuilder blockBuilder = pageBuilder.getBlockBuilder(column);
            Type prestoType = ((MaxComputeColumnHandle) requireColumns.get(column)).getType();
            TypeInfo odpsType = odpsTypeMap.get(filedName);
            transferData(dataAccessor, blockBuilder, prestoType, odpsType, vector.getValueCount());
        }
    }

    private void transferData(ArrowVectorAccessor dataAccessor, BlockBuilder blockBuilder, Type prestoType, TypeInfo odpsType, int valueCount)
    {
        Class<?> javaType = prestoType.getJavaType();
        for (int index = 0; index < valueCount; index++) {
            Object data = ArrowUtils.getData(dataAccessor, odpsType, index);
            if (data == null) {
                blockBuilder.appendNull();
            }
            else if (javaType == boolean.class) {
                prestoType.writeBoolean(blockBuilder, (Boolean) data);
            }
            else if (javaType == long.class) {
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -



