YannByron commented on code in PR #2377:
URL: https://github.com/apache/fluss/pull/2377#discussion_r2710678340
##########
fluss-common/src/main/java/org/apache/fluss/utils/InternalRowUtils.java:
##########
@@ -22,15 +22,117 @@
* Software Foundation (ASF) under the Apache License, Version 2.0. See the
NOTICE file distributed with this work for
* additional information regarding copyright ownership. */
+import org.apache.fluss.row.BinaryMap;
+import org.apache.fluss.row.BinaryRow;
import org.apache.fluss.row.BinaryString;
import org.apache.fluss.row.Decimal;
+import org.apache.fluss.row.GenericArray;
+import org.apache.fluss.row.GenericMap;
+import org.apache.fluss.row.GenericRow;
+import org.apache.fluss.row.InternalArray;
+import org.apache.fluss.row.InternalMap;
+import org.apache.fluss.row.InternalRow;
import org.apache.fluss.row.TimestampLtz;
import org.apache.fluss.row.TimestampNtz;
+import org.apache.fluss.types.ArrayType;
+import org.apache.fluss.types.DataType;
import org.apache.fluss.types.DataTypeRoot;
+import org.apache.fluss.types.MapType;
+import org.apache.fluss.types.RowType;
+
+import java.util.HashMap;
+import java.util.Map;
/** Utility class for {@link org.apache.fluss.row.InternalRow} related
operations. */
public class InternalRowUtils {
+ public static InternalRow copyRow(InternalRow row, RowType rowType) {
+ if (row instanceof BinaryRow) {
+ return ((BinaryRow) row).copy();
+ } else {
+ InternalRow.FieldGetter[] fieldGetters =
InternalRow.createFieldGetters(rowType);
+ GenericRow genericRow = new GenericRow(row.getFieldCount());
+ for (int i = 0; i < row.getFieldCount(); i++) {
+ genericRow.setField(
+ i, copyRow(fieldGetters[i].getFieldOrNull(row),
rowType.getTypeAt(i)));
+ }
+ return genericRow;
+ }
+ }
+
+ public static InternalArray copyArray(InternalArray from, DataType
eleType) {
+ if (!eleType.isNullable()) {
+ switch (eleType.getTypeRoot()) {
+ case BOOLEAN:
+ return new GenericArray(from.toBooleanArray());
+ case TINYINT:
+ return new GenericArray(from.toByteArray());
+ case SMALLINT:
+ return new GenericArray(from.toShortArray());
+ case INTEGER:
+ case DATE:
+ case TIME_WITHOUT_TIME_ZONE:
+ return new GenericArray(from.toIntArray());
+ case BIGINT:
+ return new GenericArray(from.toLongArray());
+ case FLOAT:
+ return new GenericArray(from.toFloatArray());
+ case DOUBLE:
+ return new GenericArray(from.toDoubleArray());
+ }
+ }
+
+ InternalArray.ElementGetter elementGetter =
InternalArray.createElementGetter(eleType);
+ Object[] newArray = new Object[from.size()];
+ for (int i = 0; i < newArray.length; ++i) {
+ if (!from.isNullAt(i)) {
+ newArray[i] = copyRow(elementGetter.getElementOrNull(from, i),
eleType);
+ } else {
+ newArray[i] = null;
+ }
+ }
+ return new GenericArray(newArray);
+ }
+
+ public static InternalMap copyMap(InternalMap map, DataType keyType,
DataType valueType) {
+ if (map instanceof BinaryMap) {
+ return ((BinaryMap) map).copy();
+ }
+ InternalArray.ElementGetter keyGetter =
InternalArray.createElementGetter(keyType);
+ InternalArray.ElementGetter valueGetter =
InternalArray.createElementGetter(valueType);
+ Map<Object, Object> newMap = new HashMap<>();
+ InternalArray keys = map.keyArray();
+ InternalArray values = map.valueArray();
+ for (int i = 0; i < keys.size(); i++) {
+ newMap.put(
+ copyRow(keyGetter.getElementOrNull(keys, i), keyType),
+ copyRow(valueGetter.getElementOrNull(values, i),
valueType));
+ }
+ return new GenericMap(newMap);
+ }
+
+ public static Object copyRow(Object o, DataType type) {
Review Comment:
OK. `copyArray` is used outside, others is changed to `private`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]