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