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());
}
}