public Column convert()

in seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/saphana/SapHanaTypeConverter.java [118:309]


    public Column convert(BasicTypeDefine typeDefine) {
        PhysicalColumn.PhysicalColumnBuilder builder =
                PhysicalColumn.builder()
                        .name(typeDefine.getName())
                        .sourceType(typeDefine.getColumnType())
                        .nullable(typeDefine.isNullable())
                        .defaultValue(typeDefine.getDefaultValue())
                        .comment(typeDefine.getComment());

        String hanaType = typeDefine.getDataType().toUpperCase();
        if (typeDefine.getColumnType().endsWith(" ARRAY")) {
            typeDefine.setColumnType(typeDefine.getColumnType().replace(" ARRAY", ""));
            typeDefine.setDataType(removeColumnSizeIfNeed(typeDefine.getColumnType()));
            Column arrayColumn = convert(typeDefine);
            SeaTunnelDataType<?> newType;
            switch (arrayColumn.getDataType().getSqlType()) {
                case STRING:
                    newType = ArrayType.STRING_ARRAY_TYPE;
                    break;
                case BOOLEAN:
                    newType = ArrayType.BOOLEAN_ARRAY_TYPE;
                    break;
                case TINYINT:
                    newType = ArrayType.BYTE_ARRAY_TYPE;
                    break;
                case SMALLINT:
                    newType = ArrayType.SHORT_ARRAY_TYPE;
                    break;
                case INT:
                    newType = ArrayType.INT_ARRAY_TYPE;
                    break;
                case BIGINT:
                    newType = ArrayType.LONG_ARRAY_TYPE;
                    break;
                case FLOAT:
                    newType = ArrayType.FLOAT_ARRAY_TYPE;
                    break;
                case DOUBLE:
                    newType = ArrayType.DOUBLE_ARRAY_TYPE;
                    break;
                case DATE:
                    newType = ArrayType.LOCAL_DATE_ARRAY_TYPE;
                    break;
                case TIME:
                    newType = ArrayType.LOCAL_TIME_ARRAY_TYPE;
                    break;
                case TIMESTAMP:
                    newType = ArrayType.LOCAL_DATE_TIME_ARRAY_TYPE;
                    break;
                default:
                    throw CommonError.unsupportedDataType(
                            "SeaTunnel",
                            arrayColumn.getDataType().getSqlType().toString(),
                            typeDefine.getName());
            }
            return new PhysicalColumn(
                    arrayColumn.getName(),
                    newType,
                    arrayColumn.getColumnLength(),
                    arrayColumn.getScale(),
                    arrayColumn.isNullable(),
                    arrayColumn.getDefaultValue(),
                    arrayColumn.getComment(),
                    arrayColumn.getSourceType() + " ARRAY",
                    arrayColumn.getOptions());
        }
        switch (hanaType) {
            case HANA_BINARY:
            case HANA_VARBINARY:
                builder.dataType(PrimitiveByteArrayType.INSTANCE);
                if (typeDefine.getLength() == null || typeDefine.getLength() == 0) {
                    builder.columnLength(MAX_BINARY_LENGTH);
                } else {
                    builder.columnLength(typeDefine.getLength());
                }
                break;
            case HANA_BOOLEAN:
                builder.dataType(BasicType.BOOLEAN_TYPE);
                break;
            case HANA_VARCHAR:
            case HANA_ALPHANUM:
            case HANA_CLOB:
            case HANA_NCLOB:
            case HANA_TEXT:
            case HANA_BINTEXT:
                builder.dataType(BasicType.STRING_TYPE);
                if (typeDefine.getLength() == null || typeDefine.getLength() == 0) {
                    builder.columnLength(MAX_LOB_LENGTH);
                } else {
                    builder.columnLength(typeDefine.getLength());
                }
                break;
            case HANA_NVARCHAR:
            case HANA_SHORTTEXT:
                builder.dataType(BasicType.STRING_TYPE);
                builder.columnLength(TypeDefineUtils.charTo4ByteLength(typeDefine.getLength()));
                break;
            case HANA_DATE:
                builder.dataType(LocalTimeType.LOCAL_DATE_TYPE);
                break;
            case HANA_TIME:
                builder.dataType(LocalTimeType.LOCAL_TIME_TYPE);
                builder.scale(0);
                break;
            case HANA_SECONDDATE:
                builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                builder.scale(0);
                break;
            case HANA_TIMESTAMP:
                builder.dataType(LocalTimeType.LOCAL_DATE_TIME_TYPE);
                if (typeDefine.getScale() == null) {
                    builder.scale(TIMESTAMP_DEFAULT_SCALE);
                } else {
                    builder.scale(typeDefine.getScale());
                }
                break;
            case HANA_BLOB:
                builder.dataType(PrimitiveByteArrayType.INSTANCE);
                builder.columnLength(typeDefine.getLength());
                break;
            case HANA_TINYINT:
            case HANA_SMALLINT:
                builder.dataType(BasicType.SHORT_TYPE);
                break;
            case HANA_INTEGER:
                builder.dataType(BasicType.INT_TYPE);
                break;
            case HANA_BIGINT:
                builder.dataType(BasicType.LONG_TYPE);
                break;
            case HANA_DECIMAL:
                Integer scale = typeDefine.getScale();
                long precision =
                        typeDefine.getLength() != null
                                ? typeDefine.getLength().intValue()
                                : MAX_PRECISION - 4;
                if (scale == null) {
                    builder.dataType(new DecimalType((int) precision, 0));
                    builder.columnLength(precision);
                    builder.scale(0);
                } else if (scale < 0) {
                    int newPrecision = (int) (precision - scale);
                    if (newPrecision == 1) {
                        builder.dataType(BasicType.SHORT_TYPE);
                    } else if (newPrecision <= 9) {
                        builder.dataType(BasicType.INT_TYPE);
                    } else if (newPrecision <= 18) {
                        builder.dataType(BasicType.LONG_TYPE);
                    } else if (newPrecision < 38) {
                        builder.dataType(new DecimalType(newPrecision, 0));
                        builder.columnLength((long) newPrecision);
                    } else {
                        builder.dataType(new DecimalType(DEFAULT_PRECISION, 0));
                        builder.columnLength((long) DEFAULT_PRECISION);
                    }
                } else {
                    builder.dataType(new DecimalType((int) precision, scale));
                    builder.columnLength(precision);
                    builder.scale(scale);
                }
                break;
            case HANA_SMALLDECIMAL:
                int smallDecimalScale = typeDefine.getScale() != null ? typeDefine.getScale() : 0;
                if (typeDefine.getPrecision() == null) {
                    builder.dataType(new DecimalType(DEFAULT_PRECISION, smallDecimalScale));
                    builder.columnLength((long) DEFAULT_PRECISION);
                    builder.scale(smallDecimalScale);
                } else {
                    builder.dataType(
                            new DecimalType(
                                    typeDefine.getPrecision().intValue(), smallDecimalScale));
                    builder.columnLength(typeDefine.getPrecision());
                    builder.scale(smallDecimalScale);
                }
                break;
            case HANA_REAL:
                builder.dataType(BasicType.FLOAT_TYPE);
                break;
            case HANA_DOUBLE:
                builder.dataType(BasicType.DOUBLE_TYPE);
                break;
            case HANA_ST_POINT:
            case HANA_ST_GEOMETRY:
                builder.columnLength(typeDefine.getLength());
                builder.dataType(PrimitiveByteArrayType.INSTANCE);
                break;
            default:
                throw CommonError.convertToSeaTunnelTypeError(
                        DatabaseIdentifier.SAP_HANA, hanaType, typeDefine.getName());
        }
        return builder.build();
    }