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

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


The following commit(s) were added to refs/heads/master by this push:
     new 92550da4c [core] Reuse partitionCastExecutors in 
InternalRowPartitionComputer
92550da4c is described below

commit 92550da4c41a57bb14a30ae8d2d2f49e0e9462bb
Author: Jingsong <[email protected]>
AuthorDate: Wed Oct 23 16:23:00 2024 +0200

    [core] Reuse partitionCastExecutors in InternalRowPartitionComputer
---
 .../paimon/utils/InternalRowPartitionComputer.java | 40 +++++++++++++++-------
 .../java/org/apache/paimon/utils/TypeUtils.java    | 20 -----------
 .../spark/commands/WriteIntoPaimonTable.scala      |  3 +-
 3 files changed, 29 insertions(+), 34 deletions(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
 
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
index 1bc8eecc8..8de2720a2 100644
--- 
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
+++ 
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowPartitionComputer.java
@@ -18,16 +18,20 @@
 
 package org.apache.paimon.utils;
 
+import org.apache.paimon.casting.CastExecutor;
+import org.apache.paimon.casting.CastExecutors;
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.InternalRow;
+import org.apache.paimon.data.InternalRow.FieldGetter;
 import org.apache.paimon.types.DataType;
 import org.apache.paimon.types.RowType;
+import org.apache.paimon.types.VarCharType;
 
-import java.util.Arrays;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import static 
org.apache.paimon.utils.InternalRowUtils.createNullCheckingFieldGetter;
 import static org.apache.paimon.utils.TypeUtils.castFromString;
 
 /** PartitionComputer for {@link InternalRow}. */
@@ -35,7 +39,8 @@ public class InternalRowPartitionComputer {
 
     protected final String defaultPartValue;
     protected final String[] partitionColumns;
-    protected final InternalRow.FieldGetter[] partitionFieldGetters;
+    protected final FieldGetter[] partitionFieldGetters;
+    protected final CastExecutor[] partitionCastExecutors;
     protected final List<DataType> types;
     protected final boolean legacyPartitionName;
 
@@ -49,14 +54,14 @@ public class InternalRowPartitionComputer {
         this.types = rowType.getFieldTypes();
         this.legacyPartitionName = legacyPartitionName;
         List<String> columnList = rowType.getFieldNames();
-        this.partitionFieldGetters =
-                Arrays.stream(partitionColumns)
-                        .mapToInt(columnList::indexOf)
-                        .mapToObj(
-                                i ->
-                                        
InternalRowUtils.createNullCheckingFieldGetter(
-                                                rowType.getTypeAt(i), i))
-                        .toArray(InternalRow.FieldGetter[]::new);
+        this.partitionFieldGetters = new FieldGetter[partitionColumns.length];
+        this.partitionCastExecutors = new 
CastExecutor[partitionColumns.length];
+        for (String partitionColumn : partitionColumns) {
+            int i = columnList.indexOf(partitionColumn);
+            DataType type = rowType.getTypeAt(i);
+            partitionFieldGetters[i] = createNullCheckingFieldGetter(type, i);
+            partitionCastExecutors[i] = CastExecutors.resolve(type, 
VarCharType.STRING_TYPE);
+        }
     }
 
     public LinkedHashMap<String, String> generatePartValues(InternalRow in) {
@@ -64,8 +69,17 @@ public class InternalRowPartitionComputer {
 
         for (int i = 0; i < partitionFieldGetters.length; i++) {
             Object field = partitionFieldGetters[i].getFieldOrNull(in);
-            String partitionValue =
-                    TypeUtils.castPartitionValueToString(field, types.get(i), 
legacyPartitionName);
+            String partitionValue = null;
+            if (field != null) {
+                if (legacyPartitionName) {
+                    partitionValue = field.toString();
+                } else {
+                    Object casted = partitionCastExecutors[i].cast(field);
+                    if (casted != null) {
+                        partitionValue = casted.toString();
+                    }
+                }
+            }
             if (StringUtils.isNullOrWhitespaceOnly(partitionValue)) {
                 partitionValue = defaultPartValue;
             }
@@ -90,7 +104,7 @@ public class InternalRowPartitionComputer {
 
     public static String partToSimpleString(
             RowType partitionType, BinaryRow partition, String delimiter, int 
maxLength) {
-        InternalRow.FieldGetter[] getters = partitionType.fieldGetters();
+        FieldGetter[] getters = partitionType.fieldGetters();
         StringBuilder builder = new StringBuilder();
         for (int i = 0; i < getters.length; i++) {
             Object part = getters[i].getFieldOrNull(partition);
diff --git a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java 
b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
index 046e3d4b3..8d8d84953 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/TypeUtils.java
@@ -18,8 +18,6 @@
 
 package org.apache.paimon.utils;
 
-import org.apache.paimon.casting.CastExecutor;
-import org.apache.paimon.casting.CastExecutors;
 import org.apache.paimon.data.BinaryString;
 import org.apache.paimon.data.Decimal;
 import org.apache.paimon.data.GenericArray;
@@ -90,24 +88,6 @@ public class TypeUtils {
                         .collect(Collectors.toList()));
     }
 
-    public static String castPartitionValueToString(
-            Object value, DataType type, boolean legacyPartitionName) {
-        if (value == null) {
-            return null;
-        }
-        if (legacyPartitionName) {
-            return value.toString();
-        }
-
-        CastExecutor<Object, Object> castExecutor =
-                (CastExecutor<Object, Object>) CastExecutors.resolve(type, 
VarCharType.STRING_TYPE);
-        if (castExecutor == null) {
-            throw new UnsupportedOperationException(type + " is not 
supported");
-        }
-        Object result = castExecutor.cast(value);
-        return result == null ? null : result.toString();
-    }
-
     public static Object castFromString(String s, DataType type) {
         return castFromStringInternal(s, type, false);
     }
diff --git 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/WriteIntoPaimonTable.scala
 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/WriteIntoPaimonTable.scala
index eda39ae1e..27d9a0786 100644
--- 
a/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/WriteIntoPaimonTable.scala
+++ 
b/paimon-spark/paimon-spark-common/src/main/scala/org/apache/paimon/spark/commands/WriteIntoPaimonTable.scala
@@ -78,7 +78,8 @@ case class WriteIntoPaimonTable(
       val partitionComputer = new InternalRowPartitionComputer(
         coreOptions.partitionDefaultName,
         TypeUtils.project(table.rowType(), table.partitionKeys()),
-        table.partitionKeys().asScala.toArray
+        table.partitionKeys().asScala.toArray,
+        coreOptions.legacyPartitionName()
       )
       val partitions = commitMessages
         .map(c => c.partition())

Reply via email to