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