You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2025/04/01 09:45:57 UTC

(ignite-3) branch ignite-24976 created (now 32c518fe507)

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

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


      at 32c518fe507 Optimize virtual columns injection.

This branch includes the following new commits:

     new 7f04b339bfb Avoid boxing/unboxing and unnecessary type validation when copying tuple values.
     new 32c518fe507 Optimize virtual columns injection.

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(ignite-3) 02/02: Optimize virtual columns injection.

Posted by am...@apache.org.
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 32c518fe5079ffbd733d12817ccdf6d0385f0926
Author: amashenkov <am...@apache.org>
AuthorDate: Mon Mar 31 22:50:18 2025 +0300

    Optimize virtual columns injection.
---
 .../engine/exec/ProjectedTableRowConverterImpl.java  |  8 ++++----
 .../engine/exec/TableRowConverterFactoryImpl.java    | 11 +++++++++--
 .../internal/sql/engine/exec/VirtualColumn.java      |  7 ++++---
 .../ExtendedFieldDeserializingProjectedTuple.java    | 20 ++++++++------------
 .../exec/ProjectedTableRowConverterSelfTest.java     |  3 ++-
 5 files changed, 27 insertions(+), 22 deletions(-)

diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterImpl.java
index 99a19bdacb6..7ce4b3e0cf5 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterImpl.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.BitSet;
-import java.util.List;
 import org.apache.ignite.internal.lang.InternalTuple;
 import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.BinaryTuple;
@@ -42,7 +42,7 @@ public class ProjectedTableRowConverterImpl extends TableRowConverterImpl {
 
     private final BinaryTupleSchema fullTupleSchema;
 
-    private final List<VirtualColumn> virtualColumns;
+    private final Int2ObjectMap<VirtualColumn> virtualColumns;
 
     /** Constructor. */
     ProjectedTableRowConverterImpl(
@@ -50,7 +50,7 @@ public class ProjectedTableRowConverterImpl extends TableRowConverterImpl {
             BinaryTupleSchema fullTupleSchema,
             SchemaDescriptor schemaDescriptor,
             BitSet requiredColumns,
-            List<VirtualColumn> extraColumns
+            Int2ObjectMap<VirtualColumn> extraColumns
     ) {
         super(schemaRegistry, schemaDescriptor);
 
@@ -68,7 +68,7 @@ public class ProjectedTableRowConverterImpl extends TableRowConverterImpl {
             }
         }
 
-        for (VirtualColumn col : extraColumns) {
+        for (VirtualColumn col : extraColumns.values()) {
             requiredColumnsMapping[requiredIndex++] = col.columnIndex();
         }
     }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/TableRowConverterFactoryImpl.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/TableRowConverterFactoryImpl.java
index 1cac952417d..d5f4b951973 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/TableRowConverterFactoryImpl.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/TableRowConverterFactoryImpl.java
@@ -17,8 +17,9 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import java.util.BitSet;
-import java.util.List;
 import java.util.function.IntFunction;
 import org.apache.ignite.internal.schema.BinaryTupleSchema;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
@@ -102,7 +103,13 @@ public class TableRowConverterFactoryImpl implements TableRowConverterFactory {
                 fullTupleSchema,
                 schemaDescriptor,
                 requiredColumns,
-                requireVirtualColumn ? List.of(virtualColumnFactory.apply(partId)) : List.of()
+                requireVirtualColumn ? createVirtualColumns(partId) : Int2ObjectMaps.emptyMap()
         );
     }
+
+    private Int2ObjectMap<VirtualColumn> createVirtualColumns(int partId) {
+        VirtualColumn column = virtualColumnFactory.apply(partId);
+
+        return Int2ObjectMaps.singleton(column.columnIndex(), column);
+    }
 }
diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/VirtualColumn.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/VirtualColumn.java
index fb643469b1b..af13b590c75 100644
--- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/VirtualColumn.java
+++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/VirtualColumn.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import org.apache.ignite.internal.schema.BinaryTupleSchema.Element;
 import org.apache.ignite.internal.tostring.IgniteToStringExclude;
 import org.apache.ignite.internal.tostring.S;
 import org.apache.ignite.internal.type.NativeType;
@@ -26,7 +27,7 @@ import org.apache.ignite.internal.type.NativeType;
  */
 public class VirtualColumn {
     private final int columnIndex;
-    private final NativeType type;
+    private final Element type;
     private final boolean nullable;
     @IgniteToStringExclude
     private final Object value;
@@ -34,7 +35,7 @@ public class VirtualColumn {
     VirtualColumn(int columnIndex, NativeType type, boolean nullable, Object value) {
         this.columnIndex = columnIndex;
         this.value = value;
-        this.type = type;
+        this.type = new Element(type, nullable);
         this.nullable = nullable;
     }
 
@@ -42,7 +43,7 @@ public class VirtualColumn {
         return columnIndex;
     }
 
-    public NativeType type() {
+    public Element schemaType() {
         return type;
     }
 
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 2db9b8e0349..cbff4cd33c8 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
@@ -18,13 +18,12 @@
 package org.apache.ignite.internal.sql.engine.util;
 
 import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
-import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import java.math.BigDecimal;
 import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
-import java.util.List;
 import java.util.UUID;
 import org.apache.ignite.internal.binarytuple.BinaryTupleBuilder;
 import org.apache.ignite.internal.lang.InternalTuple;
@@ -43,7 +42,7 @@ import org.apache.ignite.internal.sql.engine.exec.VirtualColumn;
  */
 public class ExtendedFieldDeserializingProjectedTuple extends FieldDeserializingProjectedTuple {
 
-    private final Int2ObjectMap<VirtualColumn> extraColumns;
+    private Int2ObjectMap<VirtualColumn> extraColumns;
 
     /**
      * Constructor.
@@ -57,12 +56,10 @@ public class ExtendedFieldDeserializingProjectedTuple extends FieldDeserializing
      * @param extraColumns Extra columns.
      */
     public ExtendedFieldDeserializingProjectedTuple(BinaryTupleSchema schema, InternalTuple delegate, int[] projection,
-            List<VirtualColumn> extraColumns) {
+            Int2ObjectMap<VirtualColumn> extraColumns) {
         super(schema, delegate, projection);
 
-        this.extraColumns = new Int2ObjectOpenHashMap<>(extraColumns.size());
-
-        extraColumns.forEach(c -> this.extraColumns.put(c.columnIndex(), c));
+        this.extraColumns = extraColumns;
     }
 
     @Override
@@ -75,10 +72,9 @@ public class ExtendedFieldDeserializingProjectedTuple extends FieldDeserializing
 
             newProjection[i] = i;
 
-            if (extraColumns.containsKey(col)) {
-                VirtualColumn column = extraColumns.get(col);
-
-                BinaryRowConverter.appendValue(builder, new Element(column.type(), true), column.value());
+            VirtualColumn column = extraColumns.get(col);
+            if (column != null) {
+                BinaryRowConverter.appendValue(builder, column.schemaType(), column.value());
 
                 continue;
             }
@@ -90,7 +86,7 @@ public class ExtendedFieldDeserializingProjectedTuple extends FieldDeserializing
 
         delegate = new BinaryTuple(projection.length, builder.build());
         projection = newProjection;
-        extraColumns.clear();
+        extraColumns = Int2ObjectMaps.emptyMap();
     }
 
     private boolean isExtraColumn(int col) {
diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterSelfTest.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterSelfTest.java
index 067450001ec..8df7f9fa6c7 100644
--- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterSelfTest.java
+++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ProjectedTableRowConverterSelfTest.java
@@ -19,6 +19,7 @@ package org.apache.ignite.internal.sql.engine.exec;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import java.nio.ByteBuffer;
 import java.util.List;
 import java.util.Map;
@@ -92,7 +93,7 @@ public class ProjectedTableRowConverterSelfTest extends BaseIgniteAbstractTest {
                 BinaryTupleSchema.createRowSchema(schema),
                 schema,
                 BitSets.of(1, 3),
-                List.of()
+                Int2ObjectMaps.emptyMap()
         );
 
         RowWrapper row = converter.toRow(executionContext, binaryRow, rowFactory);


(ignite-3) 01/02: Avoid boxing/unboxing and unnecessary type validation when copying tuple values.

Posted by am...@apache.org.
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 <am...@apache.org>
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());