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 <[email protected]>
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);

Reply via email to