in athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/data/BlockUtils.java [223:383]
public static void setValue(FieldVector vector, int pos, Object value)
{
try {
if (value == null) {
setNullValue(vector, pos);
return;
}
/**
* We will convert any types that are not supported by setValue to types that are supported
* ex) (not supported) org.joda.time.LocalDateTime which is returned on read from vectors
* will be converted to (supported) java.time.ZonedDateTime
*/
//TODO: add all types
switch (vector.getMinorType()) {
case TIMESTAMPMILLITZ:
if (value instanceof org.joda.time.LocalDateTime) {
DateTimeZone dtz = ((org.joda.time.LocalDateTime) value).getChronology().getZone();
long dateTimeWithZone = ((org.joda.time.LocalDateTime) value).toDateTime(dtz).getMillis();
((TimeStampMilliTZVector) vector).setSafe(pos, dateTimeWithZone);
}
if (value instanceof ZonedDateTime) {
long dateTimeWithZone = DateTimeFormatterUtil.packDateTimeWithZone((ZonedDateTime) value);
((TimeStampMilliTZVector) vector).setSafe(pos, dateTimeWithZone);
}
else if (value instanceof LocalDateTime) {
long dateTimeWithZone = DateTimeFormatterUtil.packDateTimeWithZone(
((LocalDateTime) value).atZone(UTC_ZONE_ID).toInstant().toEpochMilli(), UTC_ZONE_ID.getId());
((TimeStampMilliTZVector) vector).setSafe(pos, dateTimeWithZone);
}
else if (value instanceof Date) {
long ldtInLong = Instant.ofEpochMilli(((Date) value).getTime())
.atZone(UTC_ZONE_ID).toInstant().toEpochMilli();
long dateTimeWithZone = DateTimeFormatterUtil.packDateTimeWithZone(ldtInLong, UTC_ZONE_ID.getId());
((TimeStampMilliTZVector) vector).setSafe(pos, dateTimeWithZone);
}
else {
((TimeStampMilliTZVector) vector).setSafe(pos, (long) value);
}
break;
case DATEMILLI:
if (value instanceof Date) {
((DateMilliVector) vector).setSafe(pos, ((Date) value).getTime());
}
else if (value instanceof LocalDateTime) {
((DateMilliVector) vector).setSafe(
pos,
((LocalDateTime) value).atZone(UTC_ZONE_ID).toInstant().toEpochMilli());
}
else {
((DateMilliVector) vector).setSafe(pos, (long) value);
}
break;
case DATEDAY:
if (value instanceof Date) {
org.joda.time.Days days = org.joda.time.Days.daysBetween(EPOCH,
new org.joda.time.DateTime(((Date) value).getTime()));
((DateDayVector) vector).setSafe(pos, days.getDays());
}
else if (value instanceof LocalDate) {
int days = (int) ((LocalDate) value).toEpochDay();
((DateDayVector) vector).setSafe(pos, days);
}
else if (value instanceof Long) {
((DateDayVector) vector).setSafe(pos, ((Long) value).intValue());
}
else {
((DateDayVector) vector).setSafe(pos, (int) value);
}
break;
case FLOAT8:
((Float8Vector) vector).setSafe(pos, (double) value);
break;
case FLOAT4:
((Float4Vector) vector).setSafe(pos, (float) value);
break;
case INT:
if (value != null && value instanceof Long) {
//This may seem odd at first but many frameworks (like Presto) use long as the preferred
//native java type for representing integers. We do this to keep type conversions simple.
((IntVector) vector).setSafe(pos, ((Long) value).intValue());
}
else {
((IntVector) vector).setSafe(pos, (int) value);
}
break;
case TINYINT:
if (value instanceof Byte) {
((TinyIntVector) vector).setSafe(pos, (byte) value);
}
else {
((TinyIntVector) vector).setSafe(pos, (int) value);
}
break;
case SMALLINT:
if (value instanceof Short) {
((SmallIntVector) vector).setSafe(pos, (short) value);
}
else {
((SmallIntVector) vector).setSafe(pos, (int) value);
}
break;
case UINT1:
((UInt1Vector) vector).setSafe(pos, (int) value);
break;
case UINT2:
((UInt2Vector) vector).setSafe(pos, (int) value);
break;
case UINT4:
((UInt4Vector) vector).setSafe(pos, (int) value);
break;
case UINT8:
((UInt8Vector) vector).setSafe(pos, (int) value);
break;
case BIGINT:
((BigIntVector) vector).setSafe(pos, (long) value);
break;
case VARBINARY:
((VarBinaryVector) vector).setSafe(pos, (byte[]) value);
break;
case DECIMAL:
DecimalVector dVector = ((DecimalVector) vector);
if (value instanceof Double) {
BigDecimal bdVal = new BigDecimal((double) value);
bdVal = bdVal.setScale(dVector.getScale(), RoundingMode.HALF_UP);
dVector.setSafe(pos, bdVal);
}
else {
BigDecimal scaledValue = ((BigDecimal) value).setScale(dVector.getScale(), RoundingMode.HALF_UP);
((DecimalVector) vector).setSafe(pos, scaledValue);
}
break;
case VARCHAR:
if (value instanceof Text) {
((VarCharVector) vector).setSafe(pos, (Text) value);
}
else {
// always fall back to the object's toString()
((VarCharVector) vector).setSafe(pos, value.toString().getBytes(Charsets.UTF_8));
}
break;
case BIT:
if (value instanceof Integer && (int) value > 0) {
((BitVector) vector).setSafe(pos, 1);
}
else if (value instanceof Boolean && (boolean) value) {
((BitVector) vector).setSafe(pos, 1);
}
else {
((BitVector) vector).setSafe(pos, 0);
}
break;
default:
throw new IllegalArgumentException("Unknown type " + vector.getMinorType());
}
}
catch (RuntimeException ex) {
String fieldName = (vector != null) ? vector.getField().getName() : "null_vector";
throw new RuntimeException("Unable to set value for field " + fieldName + " using value " + value, ex);
}
}