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());
