This is an automated email from the ASF dual-hosted git repository. dataroaring pushed a commit to branch branch-3.0 in repository https://gitbox.apache.org/repos/asf/doris.git
commit 128df04effbc827b29a943f800c548395a2dfaeb Author: zy-kkk <zhongy...@gmail.com> AuthorDate: Thu May 16 16:54:30 2024 +0800 [refactor](jdbc catalog) split trino jdbc executor (#34932) --- be/src/vec/exec/vjdbc_connector.cpp | 3 +- .../org/apache/doris/jdbc/JdbcExecutorFactory.java | 3 + .../org/apache/doris/jdbc/TrinoJdbcExecutor.java | 161 +++++++++++++++++++++ .../datasource/jdbc/client/JdbcTrinoClient.java | 4 +- 4 files changed, 169 insertions(+), 2 deletions(-) diff --git a/be/src/vec/exec/vjdbc_connector.cpp b/be/src/vec/exec/vjdbc_connector.cpp index a2cdf9e315d..bef99daf0bb 100644 --- a/be/src/vec/exec/vjdbc_connector.cpp +++ b/be/src/vec/exec/vjdbc_connector.cpp @@ -514,7 +514,8 @@ Status JdbcConnector::_check_type(SlotDescriptor* slot_desc, const std::string& case TYPE_DATETIMEV2: { if (type_str != "java.sql.Timestamp" && type_str != "java.time.LocalDateTime" && type_str != "java.sql.Date" && type_str != "java.time.LocalDate" && - type_str != "oracle.sql.TIMESTAMP" && type_str != "java.time.OffsetDateTime") { + type_str != "oracle.sql.TIMESTAMP" && type_str != "java.time.OffsetDateTime" && + type_str != "java.lang.String") { return Status::InternalError(error_msg); } break; 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 2f75a59864f..5f60745fc4d 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 @@ -38,6 +38,9 @@ public class JdbcExecutorFactory { return "org/apache/doris/jdbc/ClickHouseJdbcExecutor"; case SAP_HANA: return "org/apache/doris/jdbc/SapHanaJdbcExecutor"; + case TRINO: + case PRESTO: + return "org/apache/doris/jdbc/TrinoJdbcExecutor"; default: return "org/apache/doris/jdbc/DefaultJdbcExecutor"; } diff --git a/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/TrinoJdbcExecutor.java b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/TrinoJdbcExecutor.java new file mode 100644 index 00000000000..0ffb00f9261 --- /dev/null +++ b/fe/be-java-extensions/jdbc-scanner/src/main/java/org/apache/doris/jdbc/TrinoJdbcExecutor.java @@ -0,0 +1,161 @@ +// 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.google.common.collect.Lists; + +import java.math.BigDecimal; +import java.sql.Array; +import java.sql.Date; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +public class TrinoJdbcExecutor extends BaseJdbcExecutor { + public TrinoJdbcExecutor(byte[] thriftParams) throws Exception { + super(thriftParams); + } + + @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.DATETIME + || outputTable.getColumnType(i).getType() == Type.DATETIMEV2) { + block.add(new Timestamp[batchSizeNum]); + } else if (outputTable.getColumnType(i).getType() == Type.ARRAY) { + 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: + return resultSet.getObject(columnIndex + 1, LocalDate.class); + case DATETIME: + case DATETIMEV2: + return resultSet.getObject(columnIndex + 1, Timestamp.class); + case CHAR: + case VARCHAR: + case STRING: + return resultSet.getObject(columnIndex + 1, String.class); + case ARRAY: { + Array array = resultSet.getArray(columnIndex + 1); + if (array == null) { + return null; + } + Object[] dataArray = (Object[]) array.getArray(); + if (dataArray.length == 0) { + return Collections.emptyList(); + } + return Arrays.asList(dataArray); + } + default: + throw new IllegalArgumentException("Unsupported column type: " + type.getType()); + } + } + + @Override + protected ColumnValueConverter getOutputConverter(ColumnType columnType, String replaceString) { + switch (columnType.getType()) { + case DATETIME: + case DATETIMEV2: + return createConverter( + input -> ((Timestamp) input).toLocalDateTime(), java.time.LocalDateTime.class); + case ARRAY: + return createConverter( + input -> convertArray((List<?>) input, columnType.getChildTypes().get(0)), List.class); + default: + return null; + } + } + + private List<?> convertArray(List<?> array, ColumnType type) { + if (array == null) { + return null; + } + if (array.isEmpty()) { + return Collections.emptyList(); + } + switch (type.getType()) { + case DATE: + case DATEV2: { + List<LocalDate> result = Lists.newArrayList(); + for (Object element : array) { + result.add(element != null ? ((Date) element).toLocalDate() : null); + } + return result; + } + case DATETIME: + case DATETIMEV2: { + List<LocalDateTime> result = Lists.newArrayList(); + for (Object element : array) { + result.add(element != null ? ((Timestamp) element).toLocalDateTime() : null); + } + return result; + } + case ARRAY: { + List<List<?>> resultArray = Lists.newArrayList(); + for (Object element : array) { + if (element == null) { + resultArray.add(null); + } else { + resultArray.add( + Lists.newArrayList(convertArray((List<?>) element, type.getChildTypes().get(0)))); + } + } + return resultArray; + } + default: + return array; + } + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcTrinoClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcTrinoClient.java index 006bf5a44f9..eac97580574 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcTrinoClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcTrinoClient.java @@ -50,6 +50,8 @@ public class JdbcTrinoClient extends JdbcClient { return Type.BOOLEAN; case "date": return ScalarType.createDateV2Type(); + case "json": + return ScalarType.createStringType(); default: break; } @@ -83,7 +85,7 @@ public class JdbcTrinoClient extends JdbcClient { return ArrayType.create(type, true); } - if (trinoType.startsWith("varchar")) { + if (trinoType.startsWith("varchar") || trinoType.startsWith("time")) { return ScalarType.createStringType(); } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org