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

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


The following commit(s) were added to refs/heads/main by this push:
     new bc3ba3b737e IGNITE-28452 Sql. Cleanup ScannableTable interface (#7928)
bc3ba3b737e is described below

commit bc3ba3b737e03cb0d492d806dd5b5763175654fb
Author: korlov42 <[email protected]>
AuthorDate: Wed Apr 8 14:40:39 2026 +0300

    IGNITE-28452 Sql. Cleanup ScannableTable interface (#7928)
---
 .../engine/exec/ExecutableTableRegistryImpl.java   | 11 ++++-
 .../sql/engine/exec/LogicalRelImplementor.java     |  1 -
 .../internal/sql/engine/exec/ScannableTable.java   |  5 ---
 .../sql/engine/exec/ScannableTableImpl.java        | 50 ++++++++++++++++++----
 .../sql/engine/exec/rel/IndexScanNode.java         | 20 +--------
 .../sql/engine/schema/SqlSchemaManagerImpl.java    | 34 ++++++++++++---
 .../sql/engine/exec/DummyScannableTable.java       |  3 --
 .../exec/{rel => }/ScannableTableSelfTest.java     | 49 ++++++++-------------
 .../exec/rel/IndexScanNodeExecutionTest.java       | 21 ++++-----
 .../exec/rel/TableScanNodeExecutionTest.java       |  3 +-
 .../sql/engine/framework/TestBuilders.java         |  5 +--
 .../sql/engine/framework/TestClusterTest.java      |  4 +-
 12 files changed, 113 insertions(+), 93 deletions(-)

diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
index b8816786908..67b22af346f 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ExecutableTableRegistryImpl.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
 import java.util.Objects;
 import java.util.function.Supplier;
 import org.apache.ignite.internal.hlc.ClockService;
@@ -24,6 +26,8 @@ import org.apache.ignite.internal.replicator.ReplicaService;
 import org.apache.ignite.internal.schema.SchemaDescriptor;
 import org.apache.ignite.internal.schema.SchemaManager;
 import org.apache.ignite.internal.schema.SchemaRegistry;
+import org.apache.ignite.internal.sql.engine.exec.ScannableTableImpl.IndexMeta;
+import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
 import org.apache.ignite.internal.sql.engine.schema.IgniteTable;
 import org.apache.ignite.internal.sql.engine.schema.PartitionCalculator;
 import org.apache.ignite.internal.sql.engine.schema.SqlSchemaManager;
@@ -92,8 +96,13 @@ public class ExecutableTableRegistryImpl implements 
ExecutableTableRegistry {
                 tableDescriptor, schemaRegistry, schemaDescriptor
         );
 
+        Int2ObjectMap<IndexMeta> indexMeta = new Int2ObjectOpenHashMap<>();
+        for (IgniteIndex index : sqlTable.indexes().values()) {
+            indexMeta.put(index.id(), new 
ScannableTableImpl.IndexMeta(index.collation().getFieldCollations().size()));
+        }
+
         InternalTable internalTable = table.internalTable();
-        ScannableTable scannableTable = new ScannableTableImpl(internalTable, 
converterFactory);
+        ScannableTable scannableTable = new ScannableTableImpl(internalTable, 
indexMeta, converterFactory);
         TableRowConverter rowConverter = converterFactory.create(null);
 
         UpdatableTableImpl updatableTable = new UpdatableTableImpl(
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/LogicalRelImplementor.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/LogicalRelImplementor.java
index 4a6305b0cce..75a7a3eaa54 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/LogicalRelImplementor.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/LogicalRelImplementor.java
@@ -522,7 +522,6 @@ public class LogicalRelImplementor<RowT> implements 
IgniteRelVisitor<Node<RowT>>
                 rowFactory,
                 idx,
                 scannableTable,
-                tbl.descriptor(),
                 partitionProvider,
                 comp,
                 ranges,
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTable.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTable.java
index 4f385ebf49d..b753554c0f4 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTable.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTable.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
-import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Flow.Publisher;
 import org.apache.ignite.internal.sql.engine.api.expressions.RowFactory;
@@ -55,7 +54,6 @@ public interface ScannableTable {
      * @param partWithConsistencyToken Partition.
      * @param rowFactory Row factory.
      * @param indexId Index id.
-     * @param columns Index columns.
      * @param cond Index condition.
      * @param requiredColumns Required columns.
      * @return A publisher that produces rows.
@@ -65,7 +63,6 @@ public interface ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             @Nullable RangeCondition<RowT> cond,
             int @Nullable [] requiredColumns
     );
@@ -78,7 +75,6 @@ public interface ScannableTable {
      * @param partWithConsistencyToken Partition.
      * @param rowFactory Row factory.
      * @param indexId Index id.
-     * @param columns Index columns.
      * @param key A key to lookup.
      * @param requiredColumns Required columns.
      * @return A publisher that produces rows.
@@ -88,7 +84,6 @@ public interface ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             RowT key,
             int @Nullable [] requiredColumns
     );
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableImpl.java
index 44cb6a12946..9179fa5d64e 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableImpl.java
@@ -23,7 +23,7 @@ import static 
org.apache.ignite.internal.storage.index.SortedIndexStorage.GREATE
 import static org.apache.ignite.internal.storage.index.SortedIndexStorage.LESS;
 import static 
org.apache.ignite.internal.storage.index.SortedIndexStorage.LESS_OR_EQUAL;
 
-import java.util.List;
+import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Flow.Publisher;
 import org.apache.ignite.internal.binarytuple.BinaryTuple;
@@ -39,6 +39,7 @@ import org.apache.ignite.internal.table.InternalTable;
 import org.apache.ignite.internal.table.OperationContext;
 import org.apache.ignite.internal.table.TxContext;
 import org.apache.ignite.internal.tx.InternalTransaction;
+import org.apache.ignite.internal.util.IgniteUtils;
 import org.apache.ignite.internal.util.subscription.TransformingPublisher;
 import org.jetbrains.annotations.Nullable;
 
@@ -49,11 +50,18 @@ public class ScannableTableImpl implements ScannableTable {
 
     private final InternalTable internalTable;
 
+    private final Int2ObjectMap<IndexMeta> indexMeta;
+
     private final TableRowConverterFactory converterFactory;
 
     /** Constructor. */
-    public ScannableTableImpl(InternalTable internalTable, 
TableRowConverterFactory converterFactory) {
+    public ScannableTableImpl(
+            InternalTable internalTable,
+            Int2ObjectMap<IndexMeta> indexMeta,
+            TableRowConverterFactory converterFactory
+    ) {
         this.internalTable = internalTable;
+        this.indexMeta = indexMeta;
         this.converterFactory = converterFactory;
     }
 
@@ -83,7 +91,6 @@ public class ScannableTableImpl implements ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             @Nullable RangeCondition<RowT> cond,
             int @Nullable [] requiredColumns
     ) {
@@ -94,6 +101,14 @@ public class ScannableTableImpl implements ScannableTable {
         BinaryTuplePrefix lower;
         BinaryTuplePrefix upper;
 
+        IndexMeta meta = indexMeta.get(indexId);
+
+        if (meta == null) {
+            throw new IllegalStateException(format("Index metadata not found 
[tableId={}, tableName={}, indexId={}].",
+                    internalTable.tableId(), internalTable.name(), indexId));
+        }
+
+        int indexKeySize = meta.indexKeySize;
         int flags = 0;
 
         if (cond == null) {
@@ -101,8 +116,8 @@ public class ScannableTableImpl implements ScannableTable {
             lower = null;
             upper = null;
         } else {
-            lower = toBinaryTuplePrefix(columns.size(), handler, cond.lower());
-            upper = toBinaryTuplePrefix(columns.size(), handler, cond.upper());
+            lower = toBinaryTuplePrefix(indexKeySize, handler, cond.lower());
+            upper = toBinaryTuplePrefix(indexKeySize, handler, cond.upper());
 
             flags |= (cond.lowerInclude()) ? GREATER_OR_EQUAL : GREATER;
             flags |= (cond.upperInclude()) ? LESS_OR_EQUAL : LESS;
@@ -130,7 +145,6 @@ public class ScannableTableImpl implements ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             RowT key,
             int @Nullable [] requiredColumns
     ) {
@@ -140,8 +154,19 @@ public class ScannableTableImpl implements ScannableTable {
 
         BinaryTuple keyTuple = handler.toBinaryTuple(key);
 
-        assert keyTuple.elementCount() == columns.size()
-                : format("Key should contain exactly {} fields, but was {}", 
columns.size(), handler.toString(key));
+        if (IgniteUtils.assertionsEnabled()) {
+            IndexMeta meta = indexMeta.get(indexId);
+
+            if (meta == null) {
+                throw new IllegalStateException(format("Index metadata not 
found [tableId={}, tableName={}, indexId={}].",
+                        internalTable.tableId(), internalTable.name(), 
indexId));
+            }
+
+            int indexKeySize = meta.indexKeySize;
+
+            assert keyTuple.elementCount() == indexKeySize
+                    : format("Key should contain exactly {} fields, but was 
{}", indexKeySize, handler.toString(key));
+        }
 
         int partId = partWithConsistencyToken.partId();
 
@@ -224,4 +249,13 @@ public class ScannableTableImpl implements ScannableTable {
 
         return TxContext.readWrite(txAttributes.id(), 
txAttributes.coordinatorId(), commitPartition, enlistmentConsistencyToken);
     }
+
+    /** Metadata required to process scan over particular index. */
+    public static class IndexMeta {
+        private final int indexKeySize;
+
+        IndexMeta(int indexKeySize) {
+            this.indexKeySize = indexKeySize;
+        }
+    }
 }
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
index 18ba95b6173..baee1191383 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNode.java
@@ -27,8 +27,6 @@ import java.util.List;
 import java.util.concurrent.Flow.Publisher;
 import java.util.function.Function;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
-import org.apache.calcite.rel.RelFieldCollation;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.ignite.internal.lang.IgniteStringBuilder;
 import org.apache.ignite.internal.sql.engine.api.expressions.RowFactory;
@@ -38,9 +36,7 @@ import 
org.apache.ignite.internal.sql.engine.exec.PartitionWithConsistencyToken;
 import org.apache.ignite.internal.sql.engine.exec.ScannableTable;
 import org.apache.ignite.internal.sql.engine.exec.exp.RangeCondition;
 import org.apache.ignite.internal.sql.engine.exec.exp.RangeIterable;
-import org.apache.ignite.internal.sql.engine.schema.ColumnDescriptor;
 import org.apache.ignite.internal.sql.engine.schema.IgniteIndex;
-import org.apache.ignite.internal.sql.engine.schema.TableDescriptor;
 import org.apache.ignite.internal.util.SubscriptionUtils;
 import org.apache.ignite.internal.util.TransformingIterator;
 import org.jetbrains.annotations.Nullable;
@@ -66,14 +62,11 @@ public class IndexScanNode<RowT> extends 
StorageScanNode<RowT> {
 
     private final @Nullable Comparator<RowT> comp;
 
-    private final List<String> columns;
-
     /**
      * Constructor.
      *
      * @param ctx Execution context.
      * @param rowFactory Row factory.
-     * @param tableDescriptor Table descriptor.
      * @param partitionProvider Partition provider.
      * @param comp Rows comparator.
      * @param rangeConditions Range conditions.
@@ -86,7 +79,6 @@ public class IndexScanNode<RowT> extends 
StorageScanNode<RowT> {
             RowFactory<RowT> rowFactory,
             IgniteIndex schemaIndex,
             ScannableTable table,
-            TableDescriptor tableDescriptor,
             PartitionProvider<RowT> partitionProvider,
             @Nullable Comparator<RowT> comp,
             @Nullable RangeIterable<RowT> rangeConditions,
@@ -103,12 +95,6 @@ public class IndexScanNode<RowT> extends 
StorageScanNode<RowT> {
         this.rangeConditions = rangeConditions;
         this.comp = comp;
         this.factory = rowFactory;
-
-        columns = schemaIndex.collation().getFieldCollations().stream()
-                .map(RelFieldCollation::getFieldIndex)
-                .map(tableDescriptor::columnDescriptor)
-                .map(ColumnDescriptor::name)
-                .collect(Collectors.toList());
     }
 
     /** {@inheritDoc} */
@@ -159,12 +145,10 @@ public class IndexScanNode<RowT> extends 
StorageScanNode<RowT> {
 
         switch (schemaIndex.type()) {
             case SORTED:
-                return table.indexRangeScan(ctx, partWithConsistencyToken, 
factory, indexId,
-                        columns, cond, requiredColumns);
+                return table.indexRangeScan(ctx, partWithConsistencyToken, 
factory, indexId, cond, requiredColumns);
 
             case HASH:
-                return table.indexLookup(ctx, partWithConsistencyToken, 
factory, indexId,
-                        columns, cond.lower(), requiredColumns);
+                return table.indexLookup(ctx, partWithConsistencyToken, 
factory, indexId, cond.lower(), requiredColumns);
 
             default:
                 throw new AssertionError("Unexpected index type: " + 
schemaIndex.type());
diff --git 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
index 07bfa7624c4..a43a3a29370 100644
--- 
a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
+++ 
b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/SqlSchemaManagerImpl.java
@@ -186,11 +186,12 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
                 throw new IgniteInternalException(Common.INTERNAL_ERR, "Table 
with given id not found: " + tableId);
             }
 
-            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), 
tableDescriptor.updateTimestamp());
+            HybridTimestamp tableTime = deriveTableTimestamp(tableDescriptor, 
catalog);
+            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), tableTime);
 
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (x) -> {
                 TableDescriptor descriptor = 
createTableDescriptorForTable(catalog, tableDescriptor);
-                return createTableDataOnlyTable(catalog, tableDescriptor, 
descriptor);
+                return createTableDataOnlyTable(catalog, tableTime, 
tableDescriptor, descriptor);
             });
 
             Map<String, IgniteIndex> tableIndexes = getIndexes(catalog,
@@ -202,6 +203,24 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
         });
     }
 
+    private static HybridTimestamp deriveTableTimestamp(CatalogTableDescriptor 
table, Catalog catalog) {
+        // Consolidated time accounting for update time of all table-related 
objects which affects either 
+        // planning or sql-related execution.
+        //
+        // Indexes included because ScannableTable contains index-related 
meta, hence we need to create
+        // new instance as soon as any indexes has changed or new index has 
been added. Such kind of 
+        // consolidation doesn't account for DROP, but in case of indexes this 
should not be a big deal
+        // because it's rather infrequent operation.
+        HybridTimestamp time = table.updateTimestamp();
+        for (CatalogIndexDescriptor index : catalog.indexes(table.id())) {
+            if (index.updateTimestamp().compareTo(time) > 0) {
+                time = index.updateTimestamp();
+            }
+        }
+
+        return time; 
+    }
+
     private static long cacheKey(int part1, int part2) {
         long cacheKey = part1;
         cacheKey <<= 32;
@@ -232,12 +251,13 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
         // Assemble sql-engine.TableDescriptors as they are required by 
indexes.
         for (CatalogTableDescriptor tableDescriptor : 
schemaDescriptor.tables()) {
-            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), 
tableDescriptor.updateTimestamp());
+            HybridTimestamp tableTime = deriveTableTimestamp(tableDescriptor, 
catalog);
+            CacheKey tableKey = tableCacheKey(tableDescriptor.id(), tableTime);
 
             // Load cached table by (id, version)
             IgniteTableImpl igniteTable = tableCache.get(tableKey, (k) -> {
                 TableDescriptor descriptor = 
createTableDescriptorForTable(catalog, tableDescriptor);
-                return createTableDataOnlyTable(catalog, tableDescriptor, 
descriptor);
+                return createTableDataOnlyTable(catalog, tableTime, 
tableDescriptor, descriptor);
             });
 
             // Get actual indices
@@ -445,6 +465,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
     private IgniteTableImpl createTableDataOnlyTable(
             Catalog catalog,
+            HybridTimestamp tableTime,
             CatalogTableDescriptor table,
             TableDescriptor descriptor
     ) {
@@ -455,7 +476,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
         CatalogZoneDescriptor zoneDescriptor = getZoneDescriptor(catalog, 
table.zoneId());
 
-        return createTable(table, descriptor, tableIndexes, zoneDescriptor, 
sqlStatisticManager);
+        return createTable(table, tableTime, descriptor, tableIndexes, 
zoneDescriptor, sqlStatisticManager);
     }
 
     private Map<String, IgniteIndex> getIndexes(Catalog catalog, int tableId, 
int primaryKeyIndexId) {
@@ -501,6 +522,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
 
     private static IgniteTableImpl createTable(
             CatalogTableDescriptor catalogTableDescriptor,
+            HybridTimestamp tableTime,
             TableDescriptor tableDescriptor,
             Map<String, IgniteIndex> indexes,
             CatalogZoneDescriptor zoneDescriptor,
@@ -526,7 +548,7 @@ public class SqlSchemaManagerImpl implements 
SqlSchemaManager {
                 tableName,
                 tableId,
                 catalogTableDescriptor.latestSchemaVersion(),
-                catalogTableDescriptor.updateTimestamp().longValue(),
+                tableTime.longValue(),
                 tableDescriptor,
                 primaryKeyColumns,
                 statistic,
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DummyScannableTable.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DummyScannableTable.java
index b2f0f01e44f..24545083514 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DummyScannableTable.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/DummyScannableTable.java
@@ -17,7 +17,6 @@
 
 package org.apache.ignite.internal.sql.engine.exec;
 
-import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Flow.Publisher;
 import org.apache.ignite.internal.sql.engine.api.expressions.RowFactory;
@@ -44,7 +43,6 @@ class DummyScannableTable implements ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             @Nullable RangeCondition<RowT> cond,
             int @Nullable [] requiredColumns
     ) {
@@ -57,7 +55,6 @@ class DummyScannableTable implements ScannableTable {
             PartitionWithConsistencyToken partWithConsistencyToken,
             RowFactory<RowT> rowFactory,
             int indexId,
-            List<String> columns,
             RowT key,
             int @Nullable [] requiredColumns
     ) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ScannableTableSelfTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableSelfTest.java
similarity index 95%
rename from 
modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ScannableTableSelfTest.java
rename to 
modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableSelfTest.java
index 33815f21301..de8952db36c 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/ScannableTableSelfTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/ScannableTableSelfTest.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.sql.engine.exec.rel;
+package org.apache.ignite.internal.sql.engine.exec;
 
 import static org.apache.ignite.internal.lang.IgniteStringFormatter.format;
 import static 
org.apache.ignite.internal.storage.index.SortedIndexStorage.GREATER_OR_EQUAL;
@@ -38,6 +38,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 import static org.mockito.Mockito.when;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import java.util.ArrayList;
 import java.util.BitSet;
 import java.util.HashMap;
@@ -53,7 +54,6 @@ import java.util.stream.IntStream;
 import java.util.stream.Stream;
 import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory.Builder;
-import org.apache.calcite.rel.type.RelDataTypeField;
 import org.apache.calcite.sql.type.SqlTypeName;
 import org.apache.calcite.util.ImmutableIntList;
 import org.apache.ignite.internal.binarytuple.BinaryTuple;
@@ -63,12 +63,7 @@ import org.apache.ignite.internal.replicator.ZonePartitionId;
 import org.apache.ignite.internal.schema.BinaryRow;
 import org.apache.ignite.internal.schema.BinaryRowEx;
 import org.apache.ignite.internal.sql.engine.api.expressions.RowFactory;
-import org.apache.ignite.internal.sql.engine.exec.ExecutionContext;
-import 
org.apache.ignite.internal.sql.engine.exec.PartitionWithConsistencyToken;
-import org.apache.ignite.internal.sql.engine.exec.ScannableTable;
-import org.apache.ignite.internal.sql.engine.exec.ScannableTableImpl;
-import org.apache.ignite.internal.sql.engine.exec.TableRowConverter;
-import org.apache.ignite.internal.sql.engine.exec.TxAttributes;
+import org.apache.ignite.internal.sql.engine.exec.ScannableTableImpl.IndexMeta;
 import org.apache.ignite.internal.sql.engine.exec.exp.RangeCondition;
 import org.apache.ignite.internal.sql.engine.framework.ArrayRowHandler;
 import org.apache.ignite.internal.sql.engine.framework.NoOpTransaction;
@@ -101,6 +96,7 @@ import org.mockito.junit.jupiter.MockitoExtension;
 public class ScannableTableSelfTest extends BaseIgniteAbstractTest {
 
     private static final IgniteTypeFactory TYPE_FACTORY = 
Commons.typeFactory();
+    private static final int INDEX_ID = 3;
 
     @Mock(lenient = true)
     private InternalTable internalTable;
@@ -181,7 +177,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         Object[] lowerValue = lower == Bound.NONE ? null : new Object[]{1};
         Object[] upperValue = upper == Bound.NONE ? null : new Object[]{10};
         TestRangeCondition<Object[]> condition = new TestRangeCondition<>();
@@ -243,7 +239,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
 
         TestRangeCondition<Object[]> condition = new TestRangeCondition<>();
         // Set any valid bounds, they are not of our interest here.
@@ -285,7 +281,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         TestRangeCondition<Object[]> condition = new TestRangeCondition<>();
         // Set any valid bounds, they are not of our interest here.
         condition.setLower(Bound.INCLUSIVE, new Object[]{0});
@@ -314,7 +310,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         TestRangeCondition<Object[]> condition = new TestRangeCondition<>();
         // Bound columns != input columns.
         condition.setLower(Bound.INCLUSIVE, new Object[]{1, 2});
@@ -344,7 +340,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         TestRangeCondition<Object[]> condition = new TestRangeCondition<>();
         condition.setLower(Bound.INCLUSIVE, new Object[]{1, 2});
 
@@ -389,7 +385,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         Object[] key = {1};
 
         ArgumentCaptor<IndexScanCriteria.Lookup> criteriaCaptor = 
ArgumentCaptor.forClass(IndexScanCriteria.Lookup.class);
@@ -432,7 +428,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         Object[] key = {1};
 
         ResultCollector collector = tester.indexLookUp(partitionId, 
consistencyToken, tx, indexId, key);
@@ -468,7 +464,7 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
         int partitionId = 1;
         long consistencyToken = 2;
-        int indexId = 3;
+        int indexId = INDEX_ID;
         Object[] key = {1};
 
         ResultCollector collector = tester.indexLookUp(partitionId, 
consistencyToken, tx, indexId, key);
@@ -508,7 +504,11 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
         Tester(TestInput input) {
             this.input = input;
             rowConverter = new RowCollectingTableRowConverter(input);
-            scannableTable = new ScannableTableImpl(internalTable, rf -> 
rowConverter);
+            scannableTable = new ScannableTableImpl(
+                    internalTable,
+                    Int2ObjectMaps.singleton(INDEX_ID, new 
IndexMeta(input.indexColumns.cardinality())),
+                    rf -> rowConverter
+            );
         }
 
         ResultCollector tableScan(int partitionId, long consistencyToken, 
NoOpTransaction tx) {
@@ -560,14 +560,12 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
 
             RowFactory<Object[]> rowFactory = 
ArrayRowHandler.INSTANCE.create(input.rowSchema);
             RangeCondition<Object[]> rangeCondition = 
condition.asRangeCondition();
-            List<String> indexColumns = input.getIndexColumns();
 
             Publisher<Object[]> publisher = scannableTable.indexRangeScan(
                     ctx,
                     new PartitionWithConsistencyToken(partitionId, 
consistencyToken),
                     rowFactory,
                     indexId,
-                    indexColumns,
                     rangeCondition,
                     requiredFields
             );
@@ -592,14 +590,12 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
                     eq(OperationContext.create(txContext)));
 
             RowFactory<Object[]> rowFactory = 
ArrayRowHandler.INSTANCE.create(input.rowSchema);
-            List<String> indexColumns = input.getIndexColumns();
 
             Publisher<Object[]> publisher = scannableTable.indexLookup(
                     ctx,
                     new PartitionWithConsistencyToken(partitionId, 
consistencyToken),
                     rowFactory,
                     indexId,
-                    indexColumns,
                     key,
                     requiredFields
             );
@@ -668,17 +664,6 @@ public class ScannableTableSelfTest extends 
BaseIgniteAbstractTest {
         void sendError(Throwable t) {
             publisher.closeExceptionally(t);
         }
-
-        private List<String> getIndexColumns() {
-            List<String> columns = new ArrayList<>();
-
-            indexColumns.stream().forEach(i -> {
-                RelDataTypeField field = rowType.getFieldList().get(i);
-                columns.add(field.getName());
-            });
-
-            return columns;
-        }
     }
 
     // Collects rows received from an input source.
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNodeExecutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNodeExecutionTest.java
index eb97e9dfc7a..a21e9126a53 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNodeExecutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/IndexScanNodeExecutionTest.java
@@ -97,7 +97,7 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
 
         Comparator<Object[]> cmp = Comparator.comparing(row -> 
(Comparable<Object>) row[0]);
 
-        IndexScanNode<Object[]> node = 
tester.createSortedIndex(indexDescriptor, tableDescriptor, scannableTable, cmp);
+        IndexScanNode<Object[]> node = 
tester.createSortedIndex(indexDescriptor, scannableTable, cmp);
         List<Object[]> result = tester.execute(node);
 
         validateResult(result, List.of(new Object[]{1}, new Object[]{2}, new 
Object[]{4}, new Object[]{5}));
@@ -121,7 +121,7 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
         scannableTable.setPartitionData(0, new Object[]{2}, new Object[]{1});
         scannableTable.setPartitionData(2, new Object[]{0});
 
-        IndexScanNode<Object[]> node = tester.createHashIndex(indexDescriptor, 
tableDescriptor, scannableTable);
+        IndexScanNode<Object[]> node = tester.createHashIndex(indexDescriptor, 
scannableTable);
         List<Object[]> result = tester.execute(node);
 
         validateResult(result, List.of(new Object[]{2}, new Object[]{1}, new 
Object[]{0}));
@@ -180,7 +180,7 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
                 ? TestBuilders.indexRangeScan(DataProvider.fromRow(new 
Object[]{42}, partDataSize))
                 : TestBuilders.indexLookup(DataProvider.fromRow(new 
Object[]{42}, partDataSize));
 
-        IndexScanNode<Object[]> scanNode = new IndexScanNode<>(ctx, 
rowFactory, indexDescriptor, scannableIndex, tableDescriptor,
+        IndexScanNode<Object[]> scanNode = new IndexScanNode<>(ctx, 
rowFactory, indexDescriptor, scannableIndex,
                 c -> partitions, comparator, conditions, null, null, null);
         RootNode<Object[]> rootNode = new RootNode<>(ctx);
 
@@ -232,14 +232,13 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
             this.ctx = ctx;
         }
 
-        IndexScanNode<Object[]> createSortedIndex(IgniteIndex indexDescriptor, 
TableDescriptor tableDescriptor,
+        IndexScanNode<Object[]> createSortedIndex(IgniteIndex indexDescriptor,
                 TestScannableTable<?> scannableTable, Comparator<Object[]> 
cmp) {
-            return createIndexNode(ctx, indexDescriptor, tableDescriptor, 
scannableTable, cmp);
+            return createIndexNode(ctx, indexDescriptor, scannableTable, cmp);
         }
 
-        IndexScanNode<Object[]> createHashIndex(IgniteIndex desc, 
TableDescriptor tableDescriptor,
-                TestScannableTable<?> scannableTable) {
-            return createIndexNode(ctx, desc, tableDescriptor, scannableTable, 
null);
+        IndexScanNode<Object[]> createHashIndex(IgniteIndex desc, 
TestScannableTable<?> scannableTable) {
+            return createIndexNode(ctx, desc, scannableTable, null);
         }
 
         List<Object[]> execute(IndexScanNode<Object[]> indexNode) {
@@ -271,7 +270,7 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
     }
 
     private static IndexScanNode<Object[]> 
createIndexNode(ExecutionContext<Object[]> ctx, IgniteIndex indexDescriptor,
-            TableDescriptor tableDescriptor, TestScannableTable<?> 
scannableTable, @Nullable Comparator<Object[]> comparator) {
+            TestScannableTable<?> scannableTable, @Nullable 
Comparator<Object[]> comparator) {
 
         StructTypeBuilder rowSchemaBuilder = NativeTypes.structBuilder();
 
@@ -287,7 +286,7 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
         List<PartitionWithConsistencyToken> partitions = 
scannableTable.getPartitions();
         PartitionProvider<Object[]> partitionProvider = 
PartitionProvider.fromPartitions(partitions);
 
-        return new IndexScanNode<>(ctx, rowFactory, indexDescriptor, 
scannableTable, tableDescriptor, partitionProvider,
+        return new IndexScanNode<>(ctx, rowFactory, indexDescriptor, 
scannableTable, partitionProvider,
                 comparator, conditions, null, null, null);
     }
 
@@ -325,7 +324,6 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
                 PartitionWithConsistencyToken partWithConsistencyToken,
                 RowFactory<RowT> rowFactory,
                 int indexId,
-                List<String> columns,
                 @Nullable RangeCondition<RowT> cond,
                 int @Nullable [] requiredColumns
         ) {
@@ -340,7 +338,6 @@ public class IndexScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
                 PartitionWithConsistencyToken partWithConsistencyToken,
                 RowFactory<RowT> rowFactory,
                 int indexId,
-                List<String> columns,
                 RowT key,
                 int @Nullable [] requiredColumns
         ) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/TableScanNodeExecutionTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/TableScanNodeExecutionTest.java
index 56cb29c2c71..5d3941cc864 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/TableScanNodeExecutionTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/exec/rel/TableScanNodeExecutionTest.java
@@ -29,6 +29,7 @@ import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectMaps;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Spliterator;
@@ -227,7 +228,7 @@ public class TableScanNodeExecutionTest extends 
AbstractExecutionTest<Object[]>
                     return (RowT) TestInternalTableImpl.ROW;
                 }
             };
-            ScannableTableImpl scanableTable = new 
ScannableTableImpl(internalTable, rf -> rowConverter);
+            ScannableTableImpl scanableTable = new 
ScannableTableImpl(internalTable, Int2ObjectMaps.emptyMap(), rf -> 
rowConverter);
             PartitionProvider<Object[]> partitionProvider = 
PartitionProvider.fromPartitions(partsWithConsistencyTokens);
             IgniteTable schemaTable = mock(IgniteTable.class);
             TableScanNode<Object[]> scanNode = new TableScanNode<>(ctx, 
rowFactory, schemaTable, scanableTable,
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
index 438afc8ddde..0ca1189d5e4 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestBuilders.java
@@ -271,7 +271,6 @@ public class TestBuilders {
                     PartitionWithConsistencyToken partWithConsistencyToken,
                     RowFactory<RowT> rowFactory,
                     int indexId,
-                    List<String> columns,
                     @Nullable RangeCondition<RowT> cond,
                     int @Nullable [] requiredColumns
             ) {
@@ -296,7 +295,7 @@ public class TestBuilders {
         return new AbstractScannableTable() {
             @Override
             public <RowT> Publisher<RowT> indexLookup(ExecutionContext<RowT> 
ctx, PartitionWithConsistencyToken partWithConsistencyToken,
-                    RowFactory<RowT> rowFactory, int indexId, List<String> 
columns, RowT key,
+                    RowFactory<RowT> rowFactory, int indexId, RowT key,
                     int @Nullable [] requiredColumns) {
                 return new TransformingPublisher<>(
                         SubscriptionUtils.fromIterable(
@@ -1585,7 +1584,6 @@ public class TestBuilders {
                 PartitionWithConsistencyToken partWithConsistencyToken,
                 RowFactory<RowT> rowFactory,
                 int indexId,
-                List<String> columns,
                 @Nullable RangeCondition<RowT> cond,
                 int @Nullable [] requiredColumns) {
             throw new UnsupportedOperationException();
@@ -1597,7 +1595,6 @@ public class TestBuilders {
                 PartitionWithConsistencyToken partWithConsistencyToken,
                 RowFactory<RowT> rowFactory,
                 int indexId,
-                List<String> columns,
                 RowT key,
                 int @Nullable [] requiredColumns
         ) {
diff --git 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestClusterTest.java
 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestClusterTest.java
index d743fe95c5b..c7e019f12f3 100644
--- 
a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestClusterTest.java
+++ 
b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestClusterTest.java
@@ -93,7 +93,7 @@ public class TestClusterTest extends BaseIgniteAbstractTest {
 
         @Override
         public <RowT> Publisher<RowT> indexRangeScan(ExecutionContext<RowT> 
ctx, PartitionWithConsistencyToken partWithConsistencyToken,
-                RowFactory<RowT> rowFactory, int indexId, List<String> 
columns, @Nullable RangeCondition<RowT> cond,
+                RowFactory<RowT> rowFactory, int indexId, @Nullable 
RangeCondition<RowT> cond,
 
                 int @Nullable [] requiredColumns) {
 
@@ -108,7 +108,7 @@ public class TestClusterTest extends BaseIgniteAbstractTest 
{
 
         @Override
         public <RowT> Publisher<RowT> indexLookup(ExecutionContext<RowT> ctx, 
PartitionWithConsistencyToken partWithConsistencyToken,
-                RowFactory<RowT> rowFactory, int indexId, List<String> 
columns, RowT key,
+                RowFactory<RowT> rowFactory, int indexId, RowT key,
                 int @Nullable [] requiredColumns) {
 
             return new TransformingPublisher<>(


Reply via email to