You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@seatunnel.apache.org by "ic4y (via GitHub)" <gi...@apache.org> on 2023/05/11 09:29:50 UTC

[GitHub] [incubator-seatunnel] ic4y commented on a diff in pull request #4470: [Feature][Connector-v2] Add Snowflake Source&Sink connector

ic4y commented on code in PR #4470:
URL: https://github.com/apache/incubator-seatunnel/pull/4470#discussion_r1190884214


##########
seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/internal/dialect/snowflake/SnowflakeTypeMapper.java:
##########
@@ -0,0 +1,138 @@
+/*
+ * 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.snowflake;
+
+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.connectors.seatunnel.jdbc.internal.dialect.JdbcDialectTypeMapper;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.sql.ResultSetMetaData;
+import java.sql.SQLException;
+
+@Slf4j
+public class SnowflakeTypeMapper implements JdbcDialectTypeMapper {
+
+    /* ============================ data types ===================== */
+    private static final String SNOWFLAKE_NUMBER = "NUMBER";
+    private static final String SNOWFLAKE_DECIMAL = "DECIMAL";
+    private static final String SNOWFLAKE_NUMERIC = "NUMERIC";
+    private static final String SNOWFLAKE_INT = "INT";
+    private static final String SNOWFLAKE_INTEGER = "INTEGER";
+    private static final String SNOWFLAKE_BIGINT = "BIGINT";
+    private static final String SNOWFLAKE_SMALLINT = "SMALLINT";
+    private static final String SNOWFLAKE_TINYINT = "TINYINT";
+    private static final String SNOWFLAKE_BYTEINT = "BYTEINT";
+
+    private static final String SNOWFLAKE_FLOAT = "FLOAT";
+    private static final String SNOWFLAKE_FLOAT4 = "FLOAT4";
+    private static final String SNOWFLAKE_FLOAT8 = "FLOAT8";
+    private static final String SNOWFLAKE_DOUBLE = "DOUBLE";
+    private static final String SNOWFLAKE_DOUBLE_PRECISION = "DOUBLE PRECISION";
+    private static final String SNOWFLAKE_REAL = "REAL";
+
+    private static final String SNOWFLAKE_VARCHAR = "VARCHAR";
+    private static final String SNOWFLAKE_CHAR = "CHAR";
+    private static final String SNOWFLAKE_CHARACTER = "CHARACTER";
+    private static final String SNOWFLAKE_STRING = "STRING";
+    private static final String SNOWFLAKE_TEXT = "TEXT";
+    private static final String SNOWFLAKE_BINARY = "BINARY";
+    private static final String SNOWFLAKE_VARBINARY = "VARBINARY";
+
+    private static final String SNOWFLAKE_BOOLEAN = "BOOLEAN";
+
+    private static final String SNOWFLAKE_DATE = "DATE";
+    private static final String SNOWFLAKE_DATE_TIME = "DATE_TIME";
+    private static final String SNOWFLAKE_TIME = "TIME";
+    private static final String SNOWFLAKE_TIMESTAMP = "TIMESTAMP";
+    private static final String SNOWFLAKE_TIMESTAMP_LTZ = "TIMESTAMPLTZ";
+    private static final String SNOWFLAKE_TIMESTAMP_NTZ = "TIMESTAMPNTZ";
+    private static final String SNOWFLAKE_TIMESTAMP_TZ = "TIMESTAMPTZ";
+
+    private static final String SNOWFLAKE_GEOGRAPHY = "GEOGRAPHY";
+    private static final String SNOWFLAKE_GEOMETRY = "GEOMETRY";
+
+    private static final String SNOWFLAKE_VARIANT = "VARIANT";
+    private static final String SNOWFLAKE_OBJECT = "OBJECT";
+
+    @Override
+    public SeaTunnelDataType<?> mapping(ResultSetMetaData metadata, int colIndex)
+            throws SQLException {
+        String snowflakeType = metadata.getColumnTypeName(colIndex).toUpperCase();
+        int precision = metadata.getPrecision(colIndex);
+        int scale = metadata.getScale(colIndex);
+        switch (snowflakeType) {
+            case SNOWFLAKE_SMALLINT:
+            case SNOWFLAKE_TINYINT:
+            case SNOWFLAKE_BYTEINT:
+                return BasicType.SHORT_TYPE;
+            case SNOWFLAKE_INTEGER:
+            case SNOWFLAKE_INT:
+                return BasicType.INT_TYPE;
+            case SNOWFLAKE_BIGINT:
+                return BasicType.LONG_TYPE;
+            case SNOWFLAKE_DECIMAL:
+            case SNOWFLAKE_NUMERIC:
+            case SNOWFLAKE_NUMBER:
+                return new DecimalType(precision, scale);
+            case SNOWFLAKE_REAL:
+            case SNOWFLAKE_FLOAT4:
+                return BasicType.FLOAT_TYPE;
+            case SNOWFLAKE_DOUBLE:
+            case SNOWFLAKE_DOUBLE_PRECISION:
+            case SNOWFLAKE_FLOAT8:
+            case SNOWFLAKE_FLOAT:
+                return BasicType.DOUBLE_TYPE;
+            case SNOWFLAKE_BOOLEAN:
+                return BasicType.BOOLEAN_TYPE;
+            case SNOWFLAKE_CHAR:
+            case SNOWFLAKE_CHARACTER:
+            case SNOWFLAKE_VARCHAR:
+            case SNOWFLAKE_STRING:
+            case SNOWFLAKE_TEXT:
+            case SNOWFLAKE_VARIANT:
+            case SNOWFLAKE_OBJECT:
+            case SNOWFLAKE_GEOMETRY:

Review Comment:
   In Snowflake, to convert `SNOWFLAKE_GEOMETRY` and `SNOWFLAKE_GEOGRAPHY` into EWKT format strings, you need to set session-level parameters (GEOGRAPHY_OUTPUT_FORMAT='EWKT', GEOMETRY_OUTPUT_FORMAT='EWKT').
   
   Reference: https://docs.snowflake.com/en/sql-reference/data-types-geospatial



-- 
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: commits-unsubscribe@seatunnel.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org