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

JingsongLi 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 43a1dc58d4 [core] support some basic operations for vector type (#8213)
43a1dc58d4 is described below

commit 43a1dc58d4841e6eb1a727a5e5949ad3c996fb72
Author: Stefanietry <[email protected]>
AuthorDate: Fri Jun 12 15:09:18 2026 +0800

    [core] support some basic operations for vector type (#8213)
---
 .../org/apache/paimon/utils/InternalRowUtils.java  | 34 +++++++++++++++++-----
 .../apache/paimon/utils/InternalRowUtilsTest.java  | 18 ++++++++++++
 2 files changed, 45 insertions(+), 7 deletions(-)

diff --git 
a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowUtils.java 
b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowUtils.java
index 4cfe35e398..668d1d21a0 100644
--- a/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowUtils.java
+++ b/paimon-common/src/main/java/org/apache/paimon/utils/InternalRowUtils.java
@@ -22,6 +22,7 @@ import org.apache.paimon.data.BinaryArray;
 import org.apache.paimon.data.BinaryMap;
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.BinaryString;
+import org.apache.paimon.data.BinaryVector;
 import org.apache.paimon.data.DataGetters;
 import org.apache.paimon.data.Decimal;
 import org.apache.paimon.data.GenericArray;
@@ -30,6 +31,7 @@ import org.apache.paimon.data.GenericRow;
 import org.apache.paimon.data.InternalArray;
 import org.apache.paimon.data.InternalMap;
 import org.apache.paimon.data.InternalRow;
+import org.apache.paimon.data.InternalVector;
 import org.apache.paimon.data.NestedRow;
 import org.apache.paimon.data.Timestamp;
 import org.apache.paimon.types.ArrayType;
@@ -42,6 +44,7 @@ import org.apache.paimon.types.MapType;
 import org.apache.paimon.types.MultisetType;
 import org.apache.paimon.types.RowType;
 import org.apache.paimon.types.TimestampType;
+import org.apache.paimon.types.VectorType;
 
 import javax.annotation.Nullable;
 
@@ -75,11 +78,11 @@ public class InternalRowUtils {
                 if (((InternalArray) data1).size() != ((InternalArray) 
data2).size()) {
                     return false;
                 }
-                ArrayType arrayType = (ArrayType) dataType;
+                DataType elementType = arrayOrVectorElementType(dataType);
                 for (int i = 0; i < ((InternalArray) data1).size(); i++) {
-                    Object value1 = get((InternalArray) data1, i, 
arrayType.getElementType());
-                    Object value2 = get((InternalArray) data2, i, 
arrayType.getElementType());
-                    if (!equals(value1, value2, arrayType.getElementType())) {
+                    Object value1 = get((InternalArray) data1, i, elementType);
+                    Object value2 = get((InternalArray) data2, i, elementType);
+                    if (!equals(value1, value2, elementType)) {
                         return false;
                     }
                 }
@@ -147,11 +150,11 @@ public class InternalRowUtils {
                 result = 37 * result + hash(v, rowType.getTypeAt(i));
             }
         } else if (data instanceof InternalArray) {
-            ArrayType arrayType = (ArrayType) dataType;
+            DataType elementType = arrayOrVectorElementType(dataType);
             int len = ((InternalArray) data).size();
             for (int i = 0; i < len; i++) {
-                Object v = get((InternalArray) data, i, 
arrayType.getElementType());
-                result = 37 * result + hash(v, arrayType.getElementType());
+                Object v = get((InternalArray) data, i, elementType);
+                result = 37 * result + hash(v, elementType);
             }
         } else if (data instanceof InternalMap) {
             MapType mapType = (MapType) dataType;
@@ -261,6 +264,9 @@ public class InternalRowUtils {
         } else if (o instanceof InternalRow) {
             return copyInternalRow((InternalRow) o, (RowType) type);
         } else if (o instanceof InternalArray) {
+            if (type instanceof VectorType) {
+                return copyVector((InternalVector) o, (VectorType) type);
+            }
             return copyArray((InternalArray) o, ((ArrayType) 
type).getElementType());
         } else if (o instanceof InternalMap) {
             if (type instanceof MapType) {
@@ -282,6 +288,20 @@ public class InternalRowUtils {
         return o;
     }
 
+    private static DataType arrayOrVectorElementType(DataType dataType) {
+        return dataType instanceof VectorType
+                ? ((VectorType) dataType).getElementType()
+                : ((ArrayType) dataType).getElementType();
+    }
+
+    private static InternalVector copyVector(InternalVector from, VectorType 
vectorType) {
+        if (from instanceof BinaryVector) {
+            return ((BinaryVector) from).copy();
+        }
+
+        return BinaryVector.fromInternalArray(from, 
vectorType.getElementType());
+    }
+
     public static Object get(DataGetters dataGetters, int pos, DataType 
fieldType) {
         if (dataGetters.isNullAt(pos)) {
             return null;
diff --git 
a/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowUtilsTest.java 
b/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowUtilsTest.java
index 70d32c928c..821d52a540 100644
--- 
a/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowUtilsTest.java
+++ 
b/paimon-common/src/test/java/org/apache/paimon/utils/InternalRowUtilsTest.java
@@ -20,11 +20,13 @@ package org.apache.paimon.utils;
 
 import org.apache.paimon.data.BinaryRow;
 import org.apache.paimon.data.BinaryString;
+import org.apache.paimon.data.BinaryVector;
 import org.apache.paimon.data.Decimal;
 import org.apache.paimon.data.GenericArray;
 import org.apache.paimon.data.GenericMap;
 import org.apache.paimon.data.GenericRow;
 import org.apache.paimon.data.InternalRow;
+import org.apache.paimon.data.InternalVector;
 import org.apache.paimon.data.Timestamp;
 import org.apache.paimon.data.serializer.InternalRowSerializer;
 import org.apache.paimon.datagen.DataGenerator;
@@ -195,6 +197,22 @@ public class InternalRowUtilsTest {
                 .isEqualTo(InternalRowUtils.hash(row2, rowType));
     }
 
+    @Test
+    public void testCopyVector() {
+        RowType rowType =
+                RowType.builder().field("v", DataTypes.VECTOR(3, 
DataTypes.FLOAT())).build();
+        BinaryVector vector = BinaryVector.fromPrimitiveArray(new float[] 
{1.0f, 2.0f, 3.0f});
+        GenericRow row = GenericRow.of(vector);
+
+        GenericRow copied = (GenericRow) InternalRowUtils.copyInternalRow(row, 
rowType);
+        InternalVector copiedVector = copied.getVector(0);
+        assertThat(copiedVector).isNotSameAs(vector);
+        assertThat(copiedVector.toFloatArray()).containsExactly(1.0f, 2.0f, 
3.0f);
+        assertThat(InternalRowUtils.equals(row, copied, rowType)).isTrue();
+        assertThat(InternalRowUtils.hash(row, rowType))
+                .isEqualTo(InternalRowUtils.hash(copied, rowType));
+    }
+
     @Test
     public void testEqualsAndHashCodeNegativeCase() {
         // different array len

Reply via email to