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

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new fc7c49e3d5b [opt](paimon) support mapping Paimon column type "Row" to 
Doris type "Struct" (#33786)
fc7c49e3d5b is described below

commit fc7c49e3d5be395c72639a1a770db041379754dd
Author: 苏小刚 <suxiaogang...@icloud.com>
AuthorDate: Sun Apr 28 19:38:00 2024 +0800

    [opt](paimon) support mapping Paimon column type "Row" to Doris type 
"Struct" (#33786)
---
 .../main/java/org/apache/doris/paimon/PaimonColumnValue.java |  6 +++++-
 .../main/java/org/apache/doris/paimon/PaimonTypeUtils.java   | 10 +++++++++-
 .../apache/doris/datasource/paimon/PaimonExternalTable.java  | 10 ++++++++++
 .../data/external_table_p0/paimon/test_paimon_catalog.out    | 10 ++++++++++
 .../external_table_p0/paimon/test_paimon_catalog.groovy      | 12 ++++++++----
 5 files changed, 42 insertions(+), 6 deletions(-)

diff --git 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonColumnValue.java
 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonColumnValue.java
index b1b7440649e..d102ebd2fdf 100644
--- 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonColumnValue.java
+++ 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonColumnValue.java
@@ -166,6 +166,10 @@ public class PaimonColumnValue implements ColumnValue {
 
     @Override
     public void unpackStruct(List<Integer> structFieldIndex, List<ColumnValue> 
values) {
-
+        // todo: support pruned struct fields
+        InternalRow row = record.getRow(idx, structFieldIndex.size());
+        for (int i : structFieldIndex) {
+            values.add(new PaimonColumnValue(row, i, 
dorisType.getChildTypes().get(i)));
+        }
     }
 }
diff --git 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTypeUtils.java
 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTypeUtils.java
index c0bb94dd8e4..1b8046494d2 100644
--- 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTypeUtils.java
+++ 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTypeUtils.java
@@ -25,6 +25,7 @@ import org.apache.paimon.types.BigIntType;
 import org.apache.paimon.types.BinaryType;
 import org.apache.paimon.types.BooleanType;
 import org.apache.paimon.types.CharType;
+import org.apache.paimon.types.DataField;
 import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.DataTypeDefaultVisitor;
 import org.apache.paimon.types.DateType;
@@ -48,6 +49,7 @@ import org.slf4j.LoggerFactory;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * Convert paimon type to doris type.
@@ -190,7 +192,13 @@ public class PaimonTypeUtils {
 
         @Override
         public PaimonColumnType visit(RowType rowType) {
-            return this.defaultMethod(rowType);
+            PaimonColumnType paimonColumnType = new 
PaimonColumnType(Type.STRUCT);
+            List<DataField> fields = rowType.getFields();
+            List<ColumnType> childTypes = fields.stream()
+                    .map(field -> fromPaimonType(field.name(), field.type()))
+                    .collect(Collectors.toList());
+            paimonColumnType.setChildTypes(childTypes);
+            return paimonColumnType;
         }
 
         @Override
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalTable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalTable.java
index af2da32374f..7d870f36059 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/datasource/paimon/PaimonExternalTable.java
@@ -39,9 +39,12 @@ import org.apache.paimon.types.ArrayType;
 import org.apache.paimon.types.DataField;
 import org.apache.paimon.types.DecimalType;
 import org.apache.paimon.types.MapType;
+import org.apache.paimon.types.RowType;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class PaimonExternalTable extends ExternalTable {
 
@@ -131,6 +134,13 @@ public class PaimonExternalTable extends ExternalTable {
                 MapType mapType = (MapType) dataType;
                 return new org.apache.doris.catalog.MapType(
                         paimonTypeToDorisType(mapType.getKeyType()), 
paimonTypeToDorisType(mapType.getValueType()));
+            case ROW:
+                RowType rowType = (RowType) dataType;
+                List<DataField> fields = rowType.getFields();
+                return new org.apache.doris.catalog.StructType(fields.stream()
+                        .map(field -> new 
org.apache.doris.catalog.StructField(field.name(),
+                                paimonTypeToDorisType(field.type())))
+                        .collect(Collectors.toCollection(ArrayList::new)));
             case TIME_WITHOUT_TIME_ZONE:
                 return Type.UNSUPPORTED;
             default:
diff --git 
a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out 
b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
index 430292ceb86..92cfe08294c 100644
--- a/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
+++ b/regression-test/data/external_table_p0/paimon/test_paimon_catalog.out
@@ -548,3 +548,13 @@ bbb
 2      [[0, 0, 0], [1, 0, 0], [0, 1, 1]]       [["a", "5", "f"], ["7", "2", 
"3"], ["1", "b", "f"]]     [["11", "a8", "e3"], ["f4", "ee", "c3"], ["0f", 
"c6", "05"]]    
[["b723869515b24e9fbb54503f8a7584f083479998766213b784a9c530cbc0376bd5035054c657437251b85fa3dd41a0483776",
 
"ee780d81d3e9faa36aad06522a09cf9b18e00614c991d2c079243dcc7190f3dd6559e75e2c1992270272d9a9c01e950c7bd4",
 
"6e825a52cdae65786801caae53182956c80f88a48fa258a90d2c93302023c78b83f1dce758615a74731c9eef993a8c1dc4ad"],
 ["2ae97869372970f7ad7d0007a1 [...]
 3      [[1, 0, 0], [1, 0, 1], [1, 0, 1]]       [["c", "6", "4"], ["1", "e", 
"7"], ["7", "1", "d"]]     [["50", "a9", "b0"], ["02", "bf", "3a"], ["0a", 
"1d", "9a"]]    
[["2df05ba6ce8661f0fb9bc88386a1ba67188e3e99a4142a0703e1cd8bdf041fbc20131e50bea2a9891498c638ebac842d3d46",
 
"f6fecf3a4263ed8d4c5b63e4b3d9f4084b83835d9fba2046bf48d0a8068f2044c48271a1e9726741a09badea72c37cf18de3",
 
"d23af3266db4eda12673f5c451d36343ba1cea00fbfeeff2165de40e834778eb96a1199cb523dd394b4f08824f6af2a7d894"],
 ["dc00e9b27b9540e170caf93805 [...]
 
+-- !c102 --
+1      {"c_boolean": 1, "c_tinyint": 1, "c_smallint": 2, "c_int": 3, 
"c_bigint": 4, "c_float": 5.1, "c_double": 6.2, "c_decimal": 7.30, "c_char": 
"6", "c_varchar": "9", "c_binary": "a", "c_varbinary": "bbbb", "c_date": 
"2020-01-01", "c_timestamp": "2020-01-01 00:00:00.000000", "c_array": [1, 2, 
3], "c_map": {"a":1, "b":2}, "c_row": {"c_int": 3, "c_float": 4.1, "c_varchar": 
"5"}}
+2      {"c_boolean": 1, "c_tinyint": 5, "c_smallint": 6, "c_int": 7, 
"c_bigint": 8, "c_float": 10.2, "c_double": 11.4, "c_decimal": 12.60, "c_char": 
"7", "c_varchar": "10", "c_binary": "c", "c_varbinary": "dddd", "c_date": 
"2021-06-15", "c_timestamp": "2021-06-15 06:00:00.000000", "c_array": [4, 5, 
6], "c_map": {"a":6, "b":7}, "c_row": {"c_int": 8, "c_float": 9.2, "c_varchar": 
"10"}}
+3      {"c_boolean": 1, "c_tinyint": 9, "c_smallint": 10, "c_int": 11, 
"c_bigint": 12, "c_float": 13.3, "c_double": 14.6, "c_decimal": 15.90, 
"c_char": "8", "c_varchar": "11", "c_binary": "e", "c_varbinary": "ffff", 
"c_date": "2022-12-31", "c_timestamp": "2022-12-31 12:59:59.000000", "c_array": 
[7, 8, 9], "c_map": {"a":11, "b":12}, "c_row": {"c_int": 13, "c_float": 14.3, 
"c_varchar": "15"}}
+
+-- !c103 --
+1      {"c_boolean": 1, "c_tinyint": 1, "c_smallint": 2, "c_int": 3, 
"c_bigint": 4, "c_float": 5.1, "c_double": 6.2, "c_decimal": 7.30, "c_char": 
"6", "c_varchar": "9", "c_binary": "a", "c_varbinary": "bbbb", "c_date": 
"2020-01-01", "c_timestamp": "2020-01-01 00:00:00.000000", "c_array": [1, 2, 
3], "c_map": {"a":1, "b":2}, "c_row": {"c_int": 3, "c_float": 4.1, "c_varchar": 
"5"}}
+2      {"c_boolean": 1, "c_tinyint": 5, "c_smallint": 6, "c_int": 7, 
"c_bigint": 8, "c_float": 10.2, "c_double": 11.4, "c_decimal": 12.60, "c_char": 
"7", "c_varchar": "10", "c_binary": "c", "c_varbinary": "dddd", "c_date": 
"2021-06-15", "c_timestamp": "2021-06-15 06:00:00.000000", "c_array": [4, 5, 
6], "c_map": {"a":6, "b":7}, "c_row": {"c_int": 8, "c_float": 9.2, "c_varchar": 
"10"}}
+3      {"c_boolean": 1, "c_tinyint": 9, "c_smallint": 10, "c_int": 11, 
"c_bigint": 12, "c_float": 13.3, "c_double": 14.6, "c_decimal": 15.90, 
"c_char": "8", "c_varchar": "11", "c_binary": "e", "c_varbinary": "ffff", 
"c_date": "2022-12-31", "c_timestamp": "2022-12-31 12:59:59.000000", "c_array": 
[7, 8, 9], "c_map": {"a":11, "b":12}, "c_row": {"c_int": 13, "c_float": 14.3, 
"c_varchar": "15"}}
+
diff --git 
a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy 
b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
index 70ccb1c97d7..53ab596a82f 100644
--- a/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
+++ b/regression-test/suites/external_table_p0/paimon/test_paimon_catalog.groovy
@@ -56,10 +56,7 @@ suite("test_paimon_catalog", 
"p0,external,doris,external_docker,external_docker_
     sql """drop catalog ${hms_ctl_name}""";
 
     String enabled = context.config.otherConfigs.get("enablePaimonTest")
-        if (enabled != null && 
enabled.equalsIgnoreCase("enable_deprecated_case")) {
-            // The timestamp type of paimon has no logical or converted type,
-            // and is conflict with column type change from bigint to 
timestamp.
-            // Deprecated currently.
+        if (enabled != null && enabled.equalsIgnoreCase("true")) {
             def qt_all_type = { String table_name ->
                 qt_all """select * from ${table_name} order by c1"""
                 qt_predict_like_1 """select * from ${table_name} where c13 
like '%3%' order by c1"""
@@ -174,6 +171,9 @@ suite("test_paimon_catalog", 
"p0,external,doris,external_docker,external_docker_
 
             def c100= """select * from array_nested order by c1;"""
 
+            def c102= """select * from row_native_test order by id;"""
+            def c103= """select * from row_jni_test order by id;"""
+
             String hdfs_port = context.config.otherConfigs.get("hive2HdfsPort")
             String catalog_name = "ctl_test_paimon_catalog"
             String externalEnvIp = 
context.config.otherConfigs.get("externalEnvIp")
@@ -271,6 +271,10 @@ suite("test_paimon_catalog", 
"p0,external,doris,external_docker,external_docker_
             qt_c98 c98
             qt_c99 c99
             qt_c100 c100
+            qt_c102 c102
+            sql """ set force_jni_scanner=true; """
+            qt_c103 c103
+            sql """ set force_jni_scanner=false; """
 
             // test view from jion paimon
             sql """ switch internal """


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to