private Extractor makeExtractor()

in athena-federation-sdk/src/main/java/com/amazonaws/athena/connector/lambda/handlers/UserDefinedFunctionHandler.java [322:488]


    private Extractor makeExtractor(Field outputField, List<ArrowValueProjector> valueProjectors, Method udfMethod)
    {
        Types.MinorType fieldType = Types.getMinorTypeForArrowType(outputField.getType());

        Object[] arguments = new Object[valueProjectors.size()];

        switch (fieldType) {
            case INT:
                return (IntExtractor) (Object inputRowNum, NullableIntHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (int) result;
                    }
                };
            case DATEMILLI:
                return (DateMilliExtractor) (Object inputRowNum, NullableDateMilliHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = ((LocalDateTime) result).atZone(BlockUtils.UTC_ZONE_ID).toInstant().toEpochMilli();
                    }
                };
            case DATEDAY:
                return (DateDayExtractor) (Object inputRowNum, NullableDateDayHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (int) ((LocalDate) result).toEpochDay();
                    }
                };
            case TINYINT:
                return (TinyIntExtractor) (Object inputRowNum, NullableTinyIntHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (byte) result;
                    }
                };
            case SMALLINT:
                return (SmallIntExtractor) (Object inputRowNum, NullableSmallIntHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (short) result;
                    }
                };
            case FLOAT4:
                return (Float4Extractor) (Object inputRowNum, NullableFloat4Holder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (float) result;
                    }
                };
            case FLOAT8:
                return (Float8Extractor) (Object inputRowNum, NullableFloat8Holder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (double) result;
                    }
                };
            case DECIMAL:
                return (DecimalExtractor) (Object inputRowNum, NullableDecimalHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = ((BigDecimal) result);
                    }
                };
            case BIT:
                return (BitExtractor) (Object inputRowNum, NullableBitHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = ((boolean) result) ? 1 : 0;
                    }
                };
            case BIGINT:
                return (BigIntExtractor) (Object inputRowNum, NullableBigIntHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (long) result;
                    }
                };
            case VARCHAR:
                return (VarCharExtractor) (Object inputRowNum, NullableVarCharHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = ((String) result);
                    }
                };
            case VARBINARY:
                return (VarBinaryExtractor) (Object inputRowNum, NullableVarBinaryHolder dst) ->
                {
                    Object result = invokeMethod(udfMethod, arguments, (int) inputRowNum, valueProjectors);

                    if (result == null) {
                        dst.isSet = 0;
                    }
                    else {
                        dst.isSet = 1;
                        dst.value = (byte[]) result;
                    }
                };
            default:
                return null;
        }
    }