private SeaTunnelDataType orcDataType2SeaTunnelDataType()

in seatunnel-connectors-v2/connector-file/connector-file-base/src/main/java/org/apache/seatunnel/connectors/seatunnel/file/source/reader/OrcReadStrategy.java [242:353]


    private SeaTunnelDataType<?> orcDataType2SeaTunnelDataType(
            TypeDescription typeDescription, SeaTunnelDataType<?> configType) {
        switch (typeDescription.getCategory()) {
            case BOOLEAN:
                return getFinalType(BasicType.BOOLEAN_TYPE, configType);
            case INT:
                return getFinalType(BasicType.INT_TYPE, configType);
            case BYTE:
                return getFinalType(BasicType.BYTE_TYPE, configType);
            case SHORT:
                return getFinalType(BasicType.SHORT_TYPE, configType);
            case LONG:
                return getFinalType(BasicType.LONG_TYPE, configType);
            case FLOAT:
                return getFinalType(BasicType.FLOAT_TYPE, configType);
            case DOUBLE:
                return getFinalType(BasicType.DOUBLE_TYPE, configType);
            case BINARY:
                return getFinalType(PrimitiveByteArrayType.INSTANCE, configType);
            case STRING:
            case VARCHAR:
            case CHAR:
                return getFinalType(BasicType.STRING_TYPE, configType);
            case DATE:
                return getFinalType(LocalTimeType.LOCAL_DATE_TYPE, configType);
            case TIMESTAMP:
                // Support only return time when the type is timestamps
                if (configType != null && configType.getSqlType().equals(SqlType.TIME)) {
                    return LocalTimeType.LOCAL_TIME_TYPE;
                }
                return getFinalType(LocalTimeType.LOCAL_DATE_TIME_TYPE, configType);
            case DECIMAL:
                int precision = typeDescription.getPrecision();
                int scale = typeDescription.getScale();
                return getFinalType(new DecimalType(precision, scale), configType);
            case LIST:
                TypeDescription listType = typeDescription.getChildren().get(0);
                SeaTunnelDataType<?> seaTunnelDataType =
                        orcDataType2SeaTunnelDataType(listType, null);
                if (configType instanceof ArrayType) {
                    SeaTunnelDataType<?> elementType = ((ArrayType) configType).getElementType();
                    seaTunnelDataType = orcDataType2SeaTunnelDataType(listType, elementType);
                }
                switch (seaTunnelDataType.getSqlType()) {
                    case STRING:
                        return ArrayType.STRING_ARRAY_TYPE;
                    case BOOLEAN:
                        return ArrayType.BOOLEAN_ARRAY_TYPE;
                    case TINYINT:
                        return ArrayType.BYTE_ARRAY_TYPE;
                    case SMALLINT:
                        return ArrayType.SHORT_ARRAY_TYPE;
                    case INT:
                        return ArrayType.INT_ARRAY_TYPE;
                    case BIGINT:
                        return ArrayType.LONG_ARRAY_TYPE;
                    case FLOAT:
                        return ArrayType.FLOAT_ARRAY_TYPE;
                    case DOUBLE:
                        return ArrayType.DOUBLE_ARRAY_TYPE;
                    default:
                        String errorMsg =
                                String.format(
                                        "SeaTunnel array type not supported this genericType [%s] yet",
                                        seaTunnelDataType);
                        throw new FileConnectorException(
                                CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE, errorMsg);
                }
            case MAP:
                TypeDescription keyType = typeDescription.getChildren().get(0);
                TypeDescription valueType = typeDescription.getChildren().get(1);
                if (configType instanceof MapType) {
                    SeaTunnelDataType<?> keyDataType = ((MapType<?, ?>) configType).getKeyType();
                    SeaTunnelDataType<?> valueDataType =
                            ((MapType<?, ?>) configType).getValueType();
                    keyDataType = orcDataType2SeaTunnelDataType(keyType, keyDataType);
                    valueDataType = orcDataType2SeaTunnelDataType(valueType, valueDataType);
                    return new MapType<>(keyDataType, valueDataType);
                } else {
                    return new MapType<>(
                            orcDataType2SeaTunnelDataType(keyType, null),
                            orcDataType2SeaTunnelDataType(valueType, null));
                }
            case STRUCT:
                List<TypeDescription> children = typeDescription.getChildren();
                String[] fieldNames = typeDescription.getFieldNames().toArray(TYPE_ARRAY_STRING);
                SeaTunnelDataType<?>[] fieldTypes = new SeaTunnelDataType[children.size()];
                if (configType instanceof SeaTunnelRowType) {
                    for (int i = 0; i < children.size(); i++) {
                        fieldTypes[i] =
                                orcDataType2SeaTunnelDataType(
                                        children.get(i),
                                        ((SeaTunnelRowType) configType).getFieldType(i));
                    }
                } else {
                    fieldTypes =
                            children.stream()
                                    .map(f -> orcDataType2SeaTunnelDataType(f, null))
                                    .toArray(SeaTunnelDataType<?>[]::new);
                }
                return new SeaTunnelRowType(fieldNames, fieldTypes);
            default:
                // do nothing
                // never get in there
                String errorMsg =
                        String.format(
                                "SeaTunnel file connector not supported this orc type [%s] yet",
                                typeDescription.getCategory());
                throw new FileConnectorException(
                        CommonErrorCodeDeprecated.UNSUPPORTED_DATA_TYPE, errorMsg);
        }
    }