public static Object getData()

in trino-connector/src/main/java/io/trino/plugin/maxcompute/utils/ArrowUtils.java [130:193]


    public static Object getData(ArrowVectorAccessor dataAccessor, TypeInfo typeInfo, int rowId)
    {
        if (dataAccessor.isNullAt(rowId)) {
            return null;
        }
        switch (typeInfo.getOdpsType()) {
            case BOOLEAN:
                return ((ArrowBitAccessor) dataAccessor).getBoolean(rowId);
            case TINYINT:
                return ((Number) ((ArrowTinyIntAccessor) dataAccessor).getByte(rowId)).longValue();
            case SMALLINT:
                return ((Number) ((ArrowSmallIntAccessor) dataAccessor).getShort(rowId)).longValue();
            case INT:
                return ((Number) ((ArrowIntAccessor) dataAccessor).getInt(rowId)).longValue();
            case BIGINT:
                return ((ArrowBigIntAccessor) dataAccessor).getLong(rowId);
            case FLOAT:
                // return int bits
                return ((Number) Float.floatToIntBits(((ArrowFloat4Accessor) dataAccessor).getFloat(rowId))).longValue();
            case DOUBLE:
                return ((ArrowFloat8Accessor) dataAccessor).getDouble(rowId);
            case DECIMAL:
                BigDecimal decimal = ((ArrowDecimalAccessor) dataAccessor).getDecimal(rowId);
                if (((DecimalTypeInfo) typeInfo).getPrecision() <= MAX_SHORT_PRECISION) {
                    // short decimal (long)
                    return decimal.unscaledValue().longValue();
                }
                else {
                    // long decimal (BigInt)
                    return Decimals.encodeScaledValue(decimal, ((DecimalTypeInfo) typeInfo).getScale());
                }
            case STRING:
            case VARCHAR:
            case JSON:
                return Slices.wrappedBuffer(((ArrowVarCharAccessor) dataAccessor).getBytes(rowId));
            // char type need to trim tail spaces
            case CHAR:
                String str = new String(((ArrowVarCharAccessor) dataAccessor).getBytes(rowId),
                        StandardCharsets.UTF_8).replaceAll("\\s+$", "");
                return Slices.wrappedBuffer(str.getBytes(StandardCharsets.UTF_8));
            case BINARY:
                return Slices.wrappedBuffer(((ArrowVarBinaryAccessor) dataAccessor).getBinary(rowId));
            case DATE:
                // return epoch days
                return ((Number) ((ArrowDateDayAccessor) dataAccessor).getEpochDay(rowId)).longValue();
            case DATETIME:
            case TIMESTAMP:
            case TIMESTAMP_NTZ:
                // return epoch millis
                return convertToEpochMillis(((ArrowTimestampAccessor) dataAccessor).getType(),
                        ((ArrowTimestampAccessor) dataAccessor).getEpochTime(rowId));
            case ARRAY:
                return ((ArrowArrayAccessorForBlock) dataAccessor).getArray(rowId);
            case MAP:
                return ((ArrowMapAccessorForRecord) dataAccessor).getMap(rowId);
            case STRUCT:
                return ((ArrowStructAccessorForRecord) dataAccessor).getStruct(rowId);
            case UNKNOWN:
                return ((SimpleDataAccessor) dataAccessor).get(rowId);
            default:
                throw new UnsupportedOperationException(
                        "Datatype not supported: " + typeInfo.getTypeName());
        }
    }