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

amashenkov pushed a commit to branch ignite-24976
in repository https://gitbox.apache.org/repos/asf/ignite-3.git

commit 7f04b339bfb7037ebfc38bd3efb6d57ceba3bd8e
Author: amashenkov <[email protected]>
AuthorDate: Mon Mar 31 22:45:13 2025 +0300

    Avoid boxing/unboxing and unnecessary type validation when copying tuple 
values.
---
 .../ignite/internal/schema/BinaryRowConverter.java | 69 ++++++++++++++++++++++
 .../schema/registry/UpgradingRowAdapter.java       |  2 +-
 .../ExtendedFieldDeserializingProjectedTuple.java  |  2 +-
 .../util/FieldDeserializingProjectedTuple.java     |  2 +-
 4 files changed, 72 insertions(+), 3 deletions(-)

diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryRowConverter.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryRowConverter.java
index 8ea03495b08..3821c957cf2 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryRowConverter.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryRowConverter.java
@@ -28,6 +28,7 @@ import 
org.apache.ignite.internal.binarytuple.BinaryTupleBuilder;
 import org.apache.ignite.internal.binarytuple.BinaryTupleFormatException;
 import org.apache.ignite.internal.binarytuple.BinaryTupleParser;
 import org.apache.ignite.internal.binarytuple.BinaryTupleParser.Sink;
+import org.apache.ignite.internal.lang.InternalTuple;
 import org.apache.ignite.internal.schema.BinaryTupleSchema.Element;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.TestOnly;
@@ -149,6 +150,74 @@ public class BinaryRowConverter implements 
ColumnsExtractor {
         throw new InvalidTypeException("Unexpected type value: " + 
element.typeSpec());
     }
 
+    /**
+     * Helper method that copy column value from given tuple to the binary 
tuple builder.
+     *
+     * @param delegate Source tuple to copy value from.
+     * @param builder Binary tuple builder to copy value to.
+     * @param element Binary schema element of the source tuple.
+     * @param col Column index in the delegate tuple.
+     */
+    public static void copyColumnValue(InternalTuple delegate, 
BinaryTupleBuilder builder, Element element, int col) {
+        if (delegate.hasNullValue(col)) {
+            builder.appendNull();
+
+            return;
+        }
+
+        switch (element.typeSpec()) {
+            case BOOLEAN:
+                builder.appendBoolean(delegate.booleanValue(col));
+                return;
+            case INT8:
+                builder.appendByte(delegate.byteValue(col));
+                return;
+            case INT16:
+                builder.appendShort(delegate.shortValue(col));
+                return;
+            case INT32:
+                builder.appendInt(delegate.intValue(col));
+                return;
+            case INT64:
+                builder.appendLong(delegate.longValue(col));
+                return;
+            case FLOAT:
+                builder.appendFloat(delegate.floatValue(col));
+                return;
+            case DOUBLE:
+                builder.appendDouble(delegate.doubleValue(col));
+                return;
+            case DECIMAL:
+                builder.appendDecimalNotNull(delegate.decimalValue(col, 
element.decimalScale()), element.decimalScale());
+                return;
+            case UUID:
+                builder.appendUuidNotNull(delegate.uuidValue(col));
+                return;
+            case BYTES:
+                builder.appendBytesNotNull(delegate.bytesValue(col));
+                return;
+            case STRING:
+                builder.appendStringNotNull(delegate.stringValue(col));
+                return;
+            case DATE:
+                builder.appendDateNotNull(delegate.dateValue(col));
+                return;
+            case TIME:
+                builder.appendTimeNotNull(delegate.timeValue(col));
+                return;
+            case DATETIME:
+                builder.appendDateTimeNotNull(delegate.dateTimeValue(col));
+                return;
+            case TIMESTAMP:
+                builder.appendTimestampNotNull(delegate.timestampValue(col));
+                return;
+            default:
+                break;
+        }
+
+        throw new InvalidTypeException("Unexpected type value: " + 
element.typeSpec());
+    }
+
     /**
      * Returns destination tuple schema.
      */
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapter.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapter.java
index 58026797b57..7028f00cbea 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapter.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/registry/UpgradingRowAdapter.java
@@ -460,7 +460,7 @@ public class UpgradingRowAdapter implements Row {
         for (int col = 0; col < size; col++) {
             Element element = newBinaryTupleSchema.element(col);
 
-            BinaryRowConverter.appendValue(builder, element, value(col));
+            BinaryRowConverter.copyColumnValue(this, builder, element, col);
         }
 
         return new BinaryTuple(size, builder.build()).byteBuffer();
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/ExtendedFieldDeserializingProjectedTuple.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/ExtendedFieldDeserializingProjectedTuple.java
index 6529e5102f1..2db9b8e0349 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/ExtendedFieldDeserializingProjectedTuple.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/ExtendedFieldDeserializingProjectedTuple.java
@@ -85,7 +85,7 @@ public class ExtendedFieldDeserializingProjectedTuple extends 
FieldDeserializing
 
             Element element = schema.element(col);
 
-            BinaryRowConverter.appendValue(builder, element, 
schema.value(delegate, col));
+            BinaryRowConverter.copyColumnValue(delegate, builder, element, 
col);
         }
 
         delegate = new BinaryTuple(projection.length, builder.build());
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/FieldDeserializingProjectedTuple.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/FieldDeserializingProjectedTuple.java
index 1bcd63b6e03..73cd1df4e9c 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/FieldDeserializingProjectedTuple.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/util/FieldDeserializingProjectedTuple.java
@@ -66,7 +66,7 @@ public class FieldDeserializingProjectedTuple extends 
AbstractProjectedTuple {
 
             Element element = schema.element(col);
 
-            BinaryRowConverter.appendValue(builder, element, 
schema.value(delegate, col));
+            BinaryRowConverter.copyColumnValue(delegate, builder, element, 
col);
         }
 
         delegate = new BinaryTuple(projection.length, builder.build());

Reply via email to