hailin0 commented on code in PR #6950:
URL: https://github.com/apache/seatunnel/pull/6950#discussion_r1668568030


##########
seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/saphana/SapHanaTypeConverter.java:
##########
@@ -0,0 +1,487 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package 
org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.saphana;
+
+import org.apache.seatunnel.api.table.catalog.Column;
+import org.apache.seatunnel.api.table.catalog.PhysicalColumn;
+import org.apache.seatunnel.api.table.converter.BasicTypeDefine;
+import org.apache.seatunnel.api.table.converter.TypeConverter;
+import org.apache.seatunnel.api.table.type.ArrayType;
+import org.apache.seatunnel.api.table.type.BasicType;
+import org.apache.seatunnel.api.table.type.DecimalType;
+import org.apache.seatunnel.api.table.type.LocalTimeType;
+import org.apache.seatunnel.api.table.type.PrimitiveByteArrayType;
+import org.apache.seatunnel.api.table.type.SeaTunnelDataType;
+import org.apache.seatunnel.common.exception.CommonError;
+import org.apache.seatunnel.connectors.seatunnel.common.source.TypeDefineUtils;
+import 
org.apache.seatunnel.connectors.seatunnel.jdbc.internal.dialect.DatabaseIdentifier;
+
+import com.google.auto.service.AutoService;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.Arrays;
+import java.util.List;
+
+// reference
+// 
https://help.sap.com/docs/SAP_HANA_PLATFORM/4fe29514fd584807ac9f2a04f6754767/20a1569875191014b507cf392724b7eb.html?locale=en-US
+@Slf4j
+@AutoService(TypeConverter.class)
+public class SapHanaTypeConverter implements TypeConverter<BasicTypeDefine> {
+    // ============================data types=====================
+
+    // -------------------------binary-------------------------
+    public static final String HANA_BINARY = "BINARY";
+    public static final String HANA_VARBINARY = "VARBINARY";
+
+    // -------------------------boolean----------------------------
+    public static final String HANA_BOOLEAN = "BOOLEAN";
+
+    // -------------------------string----------------------------
+    public static final String HANA_VARCHAR = "VARCHAR";
+    public static final String HANA_NVARCHAR = "NVARCHAR";
+    public static final String HANA_ALPHANUM = "ALPHANUM";
+    public static final String HANA_SHORTTEXT = "SHORTTEXT";
+
+    // -------------------------datetime----------------------------
+    public static final String HANA_DATE = "DATE";
+    public static final String HANA_TIME = "TIME";
+    public static final String HANA_SECONDDATE = "SECONDDATE";
+    public static final String HANA_TIMESTAMP = "TIMESTAMP";
+
+    // -------------------------lob----------------------------
+    public static final String HANA_BLOB = "BLOB";
+    public static final String HANA_CLOB = "CLOB";
+    public static final String HANA_NCLOB = "NCLOB";
+    public static final String HANA_TEXT = "TEXT";
+    public static final String HANA_BINTEXT = "BINTEXT";
+
+    // -------------------------array----------------------------
+    public static final String HANA_ARRAY = "ARRAY";
+
+    // -------------------------number----------------------------
+    public static final String HANA_TINYINT = "TINYINT";
+    public static final String HANA_SMALLINT = "SMALLINT";
+    public static final String HANA_INTEGER = "INTEGER";
+    public static final String HANA_BIGINT = "BIGINT";
+    public static final String HANA_SMALLDECIMAL = "SMALLDECIMAL";
+    public static final String HANA_DECIMAL = "DECIMAL";
+    public static final String HANA_DOUBLE = "DOUBLE";
+    public static final String HANA_REAL = "REAL";
+
+    // -------------------------special----------------------------
+    public static final String HANA_ST_POINT = "ST_POINT";
+    public static final String HANA_ST_GEOMETRY = "ST_GEOMETRY";
+
+    public static final int MAX_PRECISION = 38;
+    public static final int DEFAULT_PRECISION = MAX_PRECISION;
+    public static final int MAX_SCALE = 6176;
+    public static final int MAX_SMALL_DECIMAL_SCALE = 368;
+    public static final int DEFAULT_SCALE = 0;
+    public static final int TIMESTAMP_DEFAULT_SCALE = 7;
+    public static final int MAX_TIMESTAMP_SCALE = 7;
+    public static final long MAX_BINARY_LENGTH = 5000;
+    public static final long MAX_LOB_LENGTH = Integer.MAX_VALUE;
+    public static final long MAX_NVARCHAR_LENGTH = 5000;
+
+    public static final List<String> shouldAppendLength =
+            Arrays.asList(
+                    HANA_BINARY,
+                    HANA_VARBINARY,
+                    HANA_VARCHAR,
+                    HANA_NVARCHAR,
+                    HANA_ALPHANUM,
+                    HANA_SHORTTEXT);
+
+    public static final SapHanaTypeConverter INSTANCE = new 
SapHanaTypeConverter();
+
+    @Override
+    public String identifier() {
+        return DatabaseIdentifier.SAP_HANA;
+    }
+
+    @Override
+    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.charToByteLength(typeDefine.getLength(), 
2));

Review Comment:
   ```suggestion
                   
builder.columnLength(TypeDefineUtils.charTo4ByteLength(typeDefine.getLength()));
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to