public static void setValue()

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