in paimon-presto-common/src/main/java/org/apache/paimon/presto/PrestoTypeUtils.java [236:287]
public static Block singleValueToBlock(Type prestoType, Object value) {
if (value == null) {
return null;
}
BlockBuilder output = prestoType.createBlockBuilder(null, 1);
Class<?> javaType = prestoType.getJavaType();
if (javaType == boolean.class) {
prestoType.writeBoolean(output, (Boolean) value);
} else if (javaType == long.class) {
if (prestoType.equals(BIGINT)
|| prestoType.equals(INTEGER)
|| prestoType.equals(TINYINT)
|| prestoType.equals(SMALLINT)
|| prestoType.equals(DATE)) {
prestoType.writeLong(output, ((Number) value).longValue());
} else if (prestoType.equals(REAL)) {
prestoType.writeLong(output, Float.floatToIntBits((Float) value));
} else if (prestoType instanceof com.facebook.presto.common.type.DecimalType) {
Verify.verify(isShortDecimal(prestoType), "The type should be short decimal");
com.facebook.presto.common.type.DecimalType decimalType =
(com.facebook.presto.common.type.DecimalType) prestoType;
BigDecimal decimal = ((Decimal) value).toBigDecimal();
prestoType.writeLong(
output, encodeShortScaledValue(decimal, decimalType.getScale()));
} else if (prestoType.equals(TIMESTAMP)) {
prestoType.writeLong(
output,
((Timestamp) value)
.toLocalDateTime()
.atZone(ZoneId.systemDefault())
.toInstant()
.toEpochMilli());
} else if (prestoType.equals(TIME)) {
prestoType.writeLong(output, (int) value * 1_000);
} else {
throw new PrestoException(
GENERIC_INTERNAL_ERROR,
format("Unhandled type for %s: %s", javaType.getSimpleName(), prestoType));
}
} else if (javaType == double.class) {
prestoType.writeDouble(output, ((Number) value).doubleValue());
} else if (prestoType instanceof com.facebook.presto.common.type.DecimalType) {
writeObject(output, prestoType, value);
} else if (javaType == Slice.class) {
writeSlice(output, prestoType, value);
} else {
throw new PrestoException(
GENERIC_INTERNAL_ERROR,
format("Unhandled type for %s: %s", javaType.getSimpleName(), prestoType));
}
return output.build();
}