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 267c11207b3 [feature](paimon)paimon catalog supports complex types 
(#25364)
267c11207b3 is described below

commit 267c11207b3fb273e1581fc391eb24d8052c42e4
Author: DongLiang-0 <[email protected]>
AuthorDate: Mon Oct 23 17:32:13 2023 +0800

    [feature](paimon)paimon catalog supports complex types (#25364)
---
 .../apache/doris/common/jni/vec/ColumnType.java    |  5 ++--
 .../org/apache/doris/paimon/PaimonColumnValue.java | 34 +++++++++++++++++++---
 .../org/apache/doris/paimon/PaimonJniScanner.java  |  1 -
 .../org/apache/doris/paimon/PaimonTableCache.java  |  2 --
 .../org/apache/doris/paimon/PaimonTypeUtils.java   | 28 ++++++++++++++++--
 .../catalog/external/PaimonExternalTable.java      | 10 +++++++
 .../paimon/test_paimon_catalog.out                 | 20 ++++++++++++-
 .../paimon/test_paimon_catalog.groovy              | 10 ++++++-
 8 files changed, 96 insertions(+), 14 deletions(-)

diff --git 
a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/jni/vec/ColumnType.java
 
b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/jni/vec/ColumnType.java
index 76d21072c85..e981c4d0418 100644
--- 
a/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/jni/vec/ColumnType.java
+++ 
b/fe/be-java-extensions/java-common/src/main/java/org/apache/doris/common/jni/vec/ColumnType.java
@@ -358,8 +358,9 @@ public class ColumnType {
                         String keyValue = lowerCaseType.substring(4, 
lowerCaseType.length() - 1);
                         int index = findNextNestedField(keyValue);
                         if (index != keyValue.length() && index != 0) {
-                            ColumnType keyType = parseType("key", 
keyValue.substring(0, index));
-                            ColumnType valueType = parseType("value", 
keyValue.substring(index + 1));
+                            ColumnType keyType = parseType("key", 
keyValue.substring(0, index).trim());
+                            ColumnType valueType =
+                                    parseType("value", 
keyValue.substring(index + 1).trim());
                             ColumnType mapType = new ColumnType(columnName, 
Type.MAP);
                             mapType.setChildTypes(Arrays.asList(keyType, 
valueType));
                             return mapType;
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 a8783fe5294..c55b80b6e86 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
@@ -20,6 +20,9 @@ package org.apache.doris.paimon;
 import org.apache.doris.common.jni.vec.ColumnType;
 import org.apache.doris.common.jni.vec.ColumnValue;
 
+import org.apache.paimon.data.DataGetters;
+import org.apache.paimon.data.InternalArray;
+import org.apache.paimon.data.InternalMap;
 import org.apache.paimon.data.InternalRow;
 
 import java.math.BigDecimal;
@@ -32,12 +35,18 @@ import java.util.List;
 
 public class PaimonColumnValue implements ColumnValue {
     private int idx;
-    private InternalRow record;
-    ColumnType dorisType;
+    private DataGetters record;
+    private ColumnType dorisType;
 
     public PaimonColumnValue() {
     }
 
+    public PaimonColumnValue(DataGetters record, int idx, ColumnType 
columnType) {
+        this.idx = idx;
+        this.record = record;
+        this.dorisType = columnType;
+    }
+
     public void setIdx(int idx, ColumnType dorisType) {
         this.idx = idx;
         this.dorisType = dorisType;
@@ -130,12 +139,29 @@ public class PaimonColumnValue implements ColumnValue {
 
     @Override
     public void unpackArray(List<ColumnValue> values) {
-
+        InternalArray recordArray = record.getArray(idx);
+        for (int i = 0; i < recordArray.size(); i++) {
+            PaimonColumnValue arrayColumnValue = new 
PaimonColumnValue((DataGetters) recordArray, i,
+                    dorisType.getChildTypes().get(0));
+            values.add(arrayColumnValue);
+        }
     }
 
     @Override
     public void unpackMap(List<ColumnValue> keys, List<ColumnValue> values) {
-
+        InternalMap map = record.getMap(idx);
+        InternalArray key = map.keyArray();
+        for (int i = 0; i < key.size(); i++) {
+            PaimonColumnValue keyColumnValue = new 
PaimonColumnValue((DataGetters) key, i,
+                    dorisType.getChildTypes().get(0));
+            keys.add(keyColumnValue);
+        }
+        InternalArray value = map.valueArray();
+        for (int i = 0; i < value.size(); i++) {
+            PaimonColumnValue valueColumnValue = new 
PaimonColumnValue((DataGetters) value, i,
+                    dorisType.getChildTypes().get(1));
+            values.add(valueColumnValue);
+        }
     }
 
     @Override
diff --git 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java
 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java
index 4e3cda8222f..524f05edd23 100644
--- 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java
+++ 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonJniScanner.java
@@ -40,7 +40,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
-
 public class PaimonJniScanner extends JniScanner {
     private static final Logger LOG = 
LoggerFactory.getLogger(PaimonJniScanner.class);
     private static final String PAIMON_OPTION_PREFIX = "paimon_option_prefix.";
diff --git 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTableCache.java
 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTableCache.java
index caf1f156de5..f57ffeb5592 100644
--- 
a/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTableCache.java
+++ 
b/fe/be-java-extensions/paimon-scanner/src/main/java/org/apache/doris/paimon/PaimonTableCache.java
@@ -34,7 +34,6 @@ import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
-
 public class PaimonTableCache {
     private static final Logger LOG = 
LoggerFactory.getLogger(PaimonTableCache.class);
     // Max cache num of paimon table
@@ -83,7 +82,6 @@ public class PaimonTableCache {
         }
     }
 
-
     public static class TableExt {
         private Table table;
         private long createTime;
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 b2a9450a6de..575809c5df9 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
@@ -45,6 +45,10 @@ import org.apache.paimon.types.VarCharType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 /**
  * Convert paimon type to doris type.
  */
@@ -56,9 +60,11 @@ public class PaimonTypeUtils {
 
     public static ColumnType fromPaimonType(String columnName, DataType type) {
         PaimonColumnType paimonColumnType = 
type.accept(PaimonToDorisTypeVisitor.INSTANCE);
-        return new ColumnType(columnName, paimonColumnType.getType(), 
paimonColumnType.getLength(),
+        ColumnType columnType = new ColumnType(columnName, 
paimonColumnType.getType(), paimonColumnType.getLength(),
                 paimonColumnType.getPrecision(),
                 paimonColumnType.getScale());
+        columnType.setChildTypes(paimonColumnType.getChildTypes());
+        return columnType;
     }
 
     private static class PaimonToDorisTypeVisitor extends 
DataTypeDefaultVisitor<PaimonColumnType> {
@@ -153,7 +159,10 @@ public class PaimonTypeUtils {
 
         @Override
         public PaimonColumnType visit(ArrayType arrayType) {
-            return this.defaultMethod(arrayType);
+            PaimonColumnType paimonColumnType = new 
PaimonColumnType(Type.ARRAY);
+            ColumnType elementColumnType = fromPaimonType("dummy-element", 
arrayType.getElementType());
+            
paimonColumnType.setChildTypes(Collections.singletonList(elementColumnType));
+            return paimonColumnType;
         }
 
         @Override
@@ -163,7 +172,11 @@ public class PaimonTypeUtils {
 
         @Override
         public PaimonColumnType visit(MapType mapType) {
-            return this.defaultMethod(mapType);
+            PaimonColumnType paimonColumnType = new PaimonColumnType(Type.MAP);
+            ColumnType key = fromPaimonType("dummy-key", mapType.getKeyType());
+            ColumnType value = fromPaimonType("dummy-value", 
mapType.getValueType());
+            paimonColumnType.setChildTypes(Arrays.asList(key, value));
+            return paimonColumnType;
         }
 
         @Override
@@ -184,6 +197,7 @@ public class PaimonTypeUtils {
         private int length;
         private int precision;
         private int scale;
+        private List<ColumnType> childTypes;
 
         public PaimonColumnType(Type type) {
             this.type = type;
@@ -225,5 +239,13 @@ public class PaimonTypeUtils {
         public void setPrecision(int precision) {
             this.precision = precision;
         }
+
+        public void setChildTypes(List<ColumnType> childTypes) {
+            this.childTypes = childTypes;
+        }
+
+        public List<ColumnType> getChildTypes() {
+            return childTypes;
+        }
     }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/PaimonExternalTable.java
 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/PaimonExternalTable.java
index 2ad593b1b38..679a7842975 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/catalog/external/PaimonExternalTable.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/catalog/external/PaimonExternalTable.java
@@ -31,8 +31,10 @@ import org.apache.logging.log4j.Logger;
 import org.apache.paimon.schema.TableSchema;
 import org.apache.paimon.table.AbstractFileStoreTable;
 import org.apache.paimon.table.Table;
+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 java.util.HashMap;
 import java.util.List;
@@ -111,6 +113,14 @@ public class PaimonExternalTable extends ExternalTable {
             case TIMESTAMP_WITHOUT_TIME_ZONE:
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
                 return 
ScalarType.createDatetimeV2Type(PAIMON_DATETIME_SCALE_MS);
+            case ARRAY:
+                ArrayType arrayType = (ArrayType) dataType;
+                Type innerType = 
paimonPrimitiveTypeToDorisType(arrayType.getElementType());
+                return org.apache.doris.catalog.ArrayType.create(innerType, 
true);
+            case MAP:
+                MapType mapType = (MapType) dataType;
+                return new org.apache.doris.catalog.MapType(
+                        paimonTypeToDorisType(mapType.getKeyType()), 
paimonTypeToDorisType(mapType.getValueType()));
             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 4918db4555c..bc1a15cb369 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
@@ -55,8 +55,8 @@
 1      2       3       4       5       6       7       8       9.1     10.1    
11.10   2020-02-02      13str   14varchar       a       true    aaaa    
2023-08-13T09:32:38.530
 
 -- !c19 --
-11     22      aa      bb      cc
 1      2       a       b       c
+11     22      aa      bb      cc
 
 -- !c20 --
 1      2       a       b       c
@@ -66,3 +66,21 @@
 
 -- !c22 --
 
+-- !c23 --
+1      [1111, 2222, 3333]      {"a_test":1}
+2      [4444, 5555, 6666]      {"b_test":0, "bbb":1}
+3      [7777, 8888, 9999]      {"c_test":1, "ccc":0}
+
+-- !c24 --
+1      [1111, 2222, 3333]      {"a_test":1}
+
+-- !c25 --
+true   \N      \N      \N
+\N     false   true    \N
+\N     \N      \N      false
+
+-- !c26 --
+3333
+6666
+9999
+
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 ad72a47e64d..0b9b35d7aa5 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
@@ -72,10 +72,14 @@ suite("test_paimon_catalog", 
"p0,external,doris,external_docker,external_docker_
             def c15 = """select * from all_table where c15='a';"""
             def c16 = """select * from all_table where c16=true;"""
             def c18 = """select * from all_table where c18='2023-08-13 
09:32:38.53';"""
-            def c19 = """select * from auto_bucket;"""
+            def c19 = """select * from auto_bucket order by user_id;"""
             def c20 = """select * from auto_bucket where dt="b";"""
             def c21 = """select * from auto_bucket where dt="b" and hh="c";"""
             def c22 = """select * from auto_bucket where dt="d";"""
+            def c23 = """select * from complex_tab order by c1;"""
+            def c24 = """select * from complex_tab where c1=1;"""
+            def c26 = """select array_max(c2) from complex_tab"""
+            def c25 = """select c3['a_test'], c3['b_test'], c3['bbb'], 
c3['ccc'] from complex_tab"""
 
             String hdfs_port = context.config.otherConfigs.get("hdfs_port")
             String catalog_name = "paimon1"
@@ -111,5 +115,9 @@ suite("test_paimon_catalog", 
"p0,external,doris,external_docker,external_docker_
             qt_c20 c20
             qt_c21 c21
             qt_c22 c22
+            qt_c23 c23
+            qt_c24 c24
+            qt_c25 c25
+            qt_c26 c26
         }
 }


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

Reply via email to