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