This is an automated email from the ASF dual-hosted git repository.

zykkk pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 22d4543346a [refactor](jdbc catalog) split sap_hana jdbc executor 
(#34772)
22d4543346a is described below

commit 22d4543346a7fc1155fbceb2253ee40ab9316c91
Author: zy-kkk <[email protected]>
AuthorDate: Mon May 13 22:36:52 2024 +0800

    [refactor](jdbc catalog) split sap_hana jdbc executor (#34772)
---
 .../org/apache/doris/jdbc/BaseJdbcExecutor.java    |  12 ++
 .../org/apache/doris/jdbc/JdbcExecutorFactory.java |   2 +
 .../org/apache/doris/jdbc/SapHanaJdbcExecutor.java | 132 +++++++++++++++++++++
 .../datasource/jdbc/client/JdbcSapHanaClient.java  |   8 +-
 4 files changed, 150 insertions(+), 4 deletions(-)

diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
index 7474824446c..6b64d6e0e5f 100644
--- 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/BaseJdbcExecutor.java
@@ -556,4 +556,16 @@ public abstract class BaseJdbcExecutor implements 
JdbcExecutor {
             }
         }
     }
+
+    protected String defaultByteArrayToHexString(byte[] bytes) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : bytes) {
+            String hex = Integer.toHexString(0xFF & b);
+            if (hex.length() == 1) {
+                hexString.append('0');
+            }
+            hexString.append(hex.toUpperCase());
+        }
+        return hexString.toString();
+    }
 }
diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutorFactory.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutorFactory.java
index 75aa20c149b..3282ba99379 100644
--- 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutorFactory.java
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/JdbcExecutorFactory.java
@@ -32,6 +32,8 @@ public class JdbcExecutorFactory {
                 return "org/apache/doris/jdbc/SQLServerJdbcExecutor";
             case DB2:
                 return "org/apache/doris/jdbc/DB2JdbcExecutor";
+            case SAP_HANA:
+                return "org/apache/doris/jdbc/SapHanaJdbcExecutor";
             default:
                 return "org/apache/doris/jdbc/DefaultJdbcExecutor";
         }
diff --git 
a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/SapHanaJdbcExecutor.java
 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/SapHanaJdbcExecutor.java
new file mode 100644
index 00000000000..442e4efceda
--- /dev/null
+++ 
b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/SapHanaJdbcExecutor.java
@@ -0,0 +1,132 @@
+// 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.doris.jdbc;
+
+import org.apache.doris.common.jni.vec.ColumnType;
+import org.apache.doris.common.jni.vec.ColumnType.Type;
+import org.apache.doris.common.jni.vec.ColumnValueConverter;
+import org.apache.doris.common.jni.vec.VectorTable;
+
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.log4j.Logger;
+
+import java.math.BigDecimal;
+import java.sql.Clob;
+import java.sql.Date;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+public class SapHanaJdbcExecutor extends BaseJdbcExecutor {
+    private static final Logger LOG = 
Logger.getLogger(SapHanaJdbcExecutor.class);
+
+    public SapHanaJdbcExecutor(byte[] thriftParams) throws Exception {
+        super(thriftParams);
+    }
+
+    @Override
+    protected void setValidationQuery(HikariDataSource ds) {
+        ds.setConnectionTestQuery("SELECT 1 FROM DUMMY");
+    }
+
+    @Override
+    protected void initializeBlock(int columnCount, String[] 
replaceStringList, int batchSizeNum,
+            VectorTable outputTable) {
+        for (int i = 0; i < columnCount; ++i) {
+            if (outputTable.getColumnType(i).getType() == Type.DATE
+                    || outputTable.getColumnType(i).getType() == Type.DATEV2) {
+                block.add(new Date[batchSizeNum]);
+            } else if (outputTable.getColumnType(i).getType() == Type.DATETIME
+                    || outputTable.getColumnType(i).getType() == 
Type.DATETIMEV2) {
+                block.add(new Timestamp[batchSizeNum]);
+            } else if (outputTable.getColumnType(i).getType() == Type.STRING) {
+                block.add(new Object[batchSizeNum]);
+            } else {
+                
block.add(outputTable.getColumn(i).newObjectContainerArray(batchSizeNum));
+            }
+        }
+    }
+
+    @Override
+    protected Object getColumnValue(int columnIndex, ColumnType type, String[] 
replaceStringList) throws SQLException {
+        switch (type.getType()) {
+            case BOOLEAN:
+                return resultSet.getObject(columnIndex + 1, Boolean.class);
+            case TINYINT:
+                return resultSet.getObject(columnIndex + 1, Byte.class);
+            case SMALLINT:
+                return resultSet.getObject(columnIndex + 1, Short.class);
+            case INT:
+                return resultSet.getObject(columnIndex + 1, Integer.class);
+            case BIGINT:
+                return resultSet.getObject(columnIndex + 1, Long.class);
+            case FLOAT:
+                return resultSet.getObject(columnIndex + 1, Float.class);
+            case DOUBLE:
+                return resultSet.getObject(columnIndex + 1, Double.class);
+            case DECIMALV2:
+            case DECIMAL32:
+            case DECIMAL64:
+            case DECIMAL128:
+                return resultSet.getObject(columnIndex + 1, BigDecimal.class);
+            case DATE:
+            case DATEV2:
+            case DATETIME:
+            case DATETIMEV2:
+            case CHAR:
+            case VARCHAR:
+            case STRING:
+                return resultSet.getObject(columnIndex + 1);
+            default:
+                throw new IllegalArgumentException("Unsupported column type: " 
+ type.getType());
+        }
+    }
+
+    @Override
+    protected ColumnValueConverter getOutputConverter(ColumnType columnType, 
String replaceString) {
+        switch (columnType.getType()) {
+            case DATE:
+            case DATEV2:
+                return createConverter(
+                        input -> ((Date) input).toLocalDate(), 
LocalDate.class);
+            case DATETIME:
+            case DATETIMEV2:
+                return createConverter(
+                        input -> ((Timestamp) input).toLocalDateTime(), 
LocalDateTime.class);
+            case STRING:
+                return createConverter(input -> {
+                    if (input instanceof Clob) {
+                        try {
+                            return ((Clob) input).getSubString(1, (int) 
((Clob) input).length());
+                        } catch (SQLException e) {
+                            LOG.error("Failed to get string from clob", e);
+                            return null;
+                        }
+                    } else if (input instanceof byte[]) {
+                        return defaultByteArrayToHexString((byte[]) input);
+                    } else {
+                        return input.toString();
+                    }
+                }, String.class);
+            default:
+                return null;
+        }
+    }
+
+}
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcSapHanaClient.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcSapHanaClient.java
index a35ed60609e..34dde63c806 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcSapHanaClient.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcSapHanaClient.java
@@ -83,14 +83,14 @@ public class JdbcSapHanaClient extends JdbcClient {
             case "NVARCHAR":
             case "ALPHANUM":
             case "SHORTTEXT":
-                return ScalarType.createStringType();
-            case "BINARY":
-            case "VARBINARY":
-            case "BLOB":
             case "CLOB":
             case "NCLOB":
             case "TEXT":
             case "BINTEXT":
+            case "BINARY":
+            case "VARBINARY":
+                return ScalarType.createStringType();
+            case "BLOB":
             case "ST_GEOMETRY":
             case "ST_POINT":
             default:


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to