This is an automated email from the ASF dual-hosted git repository. amashenkov pushed a commit to branch ignite-19497 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 8276700f76d01321bb297daa70c855d90c71a54d Author: amashenkov <[email protected]> AuthorDate: Tue Aug 1 22:18:28 2023 +0300 Replace IgniteIndex with IgniteSchemaIndex --- .../sql/engine/exec/LogicalRelImplementor.java | 8 +++--- .../internal/sql/engine/exec/RowConverter.java | 2 +- .../internal/sql/engine/exec/ScannableTable.java | 4 +-- .../sql/engine/exec/ScannableTableImpl.java | 5 ++-- .../sql/engine/exec/rel/IndexScanNode.java | 8 +++--- .../engine/rel/logical/IgniteLogicalIndexScan.java | 6 ++-- .../sql/engine/rule/LogicalScanConverterRule.java | 7 ++--- .../sql/engine/rule/logical/ExposeIndexRule.java | 4 +-- .../sql/engine/schema/CatalogSqlSchemaManager.java | 33 ++++++++++++++-------- .../sql/engine/schema/IgniteSchemaIndex.java | 27 +++++++++++++++++- .../exec/rel/IndexScanNodeExecutionTest.java | 15 ++++++++-- .../engine/exec/rel/ScannableTableSelfTest.java | 17 ++++------- .../internal/sql/engine/framework/TestIndex.java | 1 + 13 files changed, 87 insertions(+), 50 deletions(-) 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 464a0c0d5a..0b4e3e7cd0 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 @@ -103,8 +103,8 @@ import org.apache.ignite.internal.sql.engine.rel.agg.IgniteReduceHashAggregate; import org.apache.ignite.internal.sql.engine.rel.agg.IgniteReduceSortAggregate; import org.apache.ignite.internal.sql.engine.rel.set.IgniteSetOp; import org.apache.ignite.internal.sql.engine.rule.LogicalScanConverterRule; -import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteTable; import org.apache.ignite.internal.sql.engine.trait.Destination; import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution; @@ -329,7 +329,7 @@ public class LogicalRelImplementor<RowT> implements IgniteRelVisitor<Node<RowT>> RelDataType rowType = tbl.getRowType(typeFactory, requiredColumns); ScannableTable scannableTable = resolvedDependencies.scannableTable(tbl.id()); - IgniteIndex idx = tbl.getIndex(rel.indexName()); + IgniteSchemaIndex idx = tbl.indexes().get(rel.indexName()); List<SearchBounds> searchBounds = rel.searchBounds(); RexNode condition = rel.condition(); @@ -343,8 +343,8 @@ public class LogicalRelImplementor<RowT> implements IgniteRelVisitor<Node<RowT>> if (searchBounds != null) { Comparator<RowT> searchRowComparator = null; - if (idx.collations() != null) { - searchRowComparator = expressionFactory.comparator(TraitUtils.createCollation(idx.collations())); + if (idx.type() != Type.SORTED) { + searchRowComparator = expressionFactory.comparator(idx.collation()); } ranges = expressionFactory.ranges(searchBounds, idx.getRowType(typeFactory, tbl.descriptor()), searchRowComparator); diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RowConverter.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RowConverter.java index 3abd4cd5c9..ff6df49cdd 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RowConverter.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/exec/RowConverter.java @@ -40,7 +40,7 @@ public final class RowConverter { /** * Creates binary tuple schema for index rows. */ - public static BinaryTupleSchema createIndexRowSchema(List<String> indexedColumns, TableDescriptor tableDescriptor) { + public static BinaryTupleSchema createIndexRowSchema(List<Integer> indexedColumns, TableDescriptor tableDescriptor) { Element[] elements = indexedColumns.stream() .map(tableDescriptor::columnDescriptor) .map(colDesc -> new Element(colDesc.physicalType(), true)) 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 1ea160ca8e..7d52acc2e9 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 @@ -57,7 +57,7 @@ public interface ScannableTable { * @return A publisher that produces rows. */ <RowT> Publisher<RowT> indexRangeScan(ExecutionContext<RowT> ctx, PartitionWithTerm partWithTerm, - RowFactory<RowT> rowFactory, int indexId, List<String> columns, + RowFactory<RowT> rowFactory, int indexId, List<Integer> columns, @Nullable RangeCondition<RowT> cond, @Nullable BitSet requiredColumns); /** @@ -74,6 +74,6 @@ public interface ScannableTable { * @return A publisher that produces rows. */ <RowT> Publisher<RowT> indexLookup(ExecutionContext<RowT> ctx, PartitionWithTerm partWithTerm, - RowFactory<RowT> rowFactory, int indexId, List<String> columns, + RowFactory<RowT> rowFactory, int indexId, List<Integer> columns, RowT key, @Nullable BitSet 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 147086a52b..b20e934673 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 @@ -83,7 +83,7 @@ public class ScannableTableImpl implements ScannableTable { PartitionWithTerm partWithTerm, RowFactory<RowT> rowFactory, int indexId, - List<String> columns, + List<Integer> columns, @Nullable RangeCondition<RowT> cond, @Nullable BitSet requiredColumns ) { @@ -143,7 +143,8 @@ public class ScannableTableImpl implements ScannableTable { PartitionWithTerm partWithTerm, RowFactory<RowT> rowFactory, int indexId, - List<String> columns, RowT key, + List<Integer> columns, + RowT key, @Nullable BitSet requiredColumns ) { 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 55ad834cdf..52647241eb 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 @@ -31,7 +31,7 @@ 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.metadata.PartitionWithTerm; -import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.TableDescriptor; import org.apache.ignite.internal.sql.engine.util.Commons; import org.apache.ignite.internal.util.SubscriptionUtils; @@ -43,7 +43,7 @@ import org.jetbrains.annotations.Nullable; */ public class IndexScanNode<RowT> extends StorageScanNode<RowT> { /** Schema index. */ - private final IgniteIndex schemaIndex; + private final IgniteSchemaIndex schemaIndex; private final ScannableTable table; @@ -75,7 +75,7 @@ public class IndexScanNode<RowT> extends StorageScanNode<RowT> { public IndexScanNode( ExecutionContext<RowT> ctx, RowHandler.RowFactory<RowT> rowFactory, - IgniteIndex schemaIndex, + IgniteSchemaIndex schemaIndex, ScannableTable table, TableDescriptor tableDescriptor, Collection<PartitionWithTerm> partsWithTerms, @@ -124,7 +124,7 @@ public class IndexScanNode<RowT> extends StorageScanNode<RowT> { private Publisher<RowT> partitionPublisher(PartitionWithTerm partWithTerm, @Nullable RangeCondition<RowT> cond) { int indexId = schemaIndex.id(); - List<String> columns = schemaIndex.columns(); + List<Integer> columns = schemaIndex.collation().getKeys(); ExecutionContext<RowT> ctx = context(); switch (schemaIndex.type()) { diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/logical/IgniteLogicalIndexScan.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/logical/IgniteLogicalIndexScan.java index d76a263c68..25ba268f2a 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/logical/IgniteLogicalIndexScan.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rel/logical/IgniteLogicalIndexScan.java @@ -28,9 +28,9 @@ import org.apache.calcite.util.mapping.Mappings; import org.apache.ignite.internal.sql.engine.prepare.bounds.SearchBounds; import org.apache.ignite.internal.sql.engine.rel.AbstractIndexScan; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; import org.apache.ignite.internal.sql.engine.schema.IgniteTable; -import org.apache.ignite.internal.sql.engine.trait.TraitUtils; import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory; import org.apache.ignite.internal.sql.engine.util.Commons; import org.apache.ignite.internal.sql.engine.util.RexUtils; @@ -53,8 +53,8 @@ public class IgniteLogicalIndexScan extends AbstractIndexScan { ) { IgniteTable tbl = table.unwrap(IgniteTable.class); IgniteTypeFactory typeFactory = Commons.typeFactory(cluster); - IgniteIndex index = tbl.getIndex(idxName); - RelCollation collation = TraitUtils.createCollation(index.columns(), index.collations(), tbl.descriptor()); + IgniteSchemaIndex index = tbl.indexes().get(idxName); + RelCollation collation = index.collation(); List<SearchBounds> searchBounds; if (index.type() == Type.HASH) { diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java index 836cfe19de..42632f6469 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/LogicalScanConverterRule.java @@ -39,10 +39,9 @@ import org.apache.ignite.internal.sql.engine.rel.IgniteTableScan; import org.apache.ignite.internal.sql.engine.rel.ProjectableFilterableTableScan; import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalIndexScan; import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalTableScan; -import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteTable; -import org.apache.ignite.internal.sql.engine.trait.TraitUtils; /** * LogicalScanConverterRule. @@ -62,10 +61,10 @@ public abstract class LogicalScanConverterRule<T extends ProjectableFilterableTa ) { RelOptCluster cluster = rel.getCluster(); IgniteTable table = rel.getTable().unwrap(IgniteTable.class); - IgniteIndex index = table.getIndex(rel.indexName()); + IgniteSchemaIndex index = table.indexes().get(rel.indexName()); RelDistribution distribution = table.distribution(); - RelCollation collation = TraitUtils.createCollation(index.columns(), index.collations(), table.descriptor()); + RelCollation collation = index.collation(); RelCollation outputCollation = index.type() == Type.HASH ? RelCollations.EMPTY : collation; if (rel.projects() != null || rel.requiredColumns() != null) { diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/ExposeIndexRule.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/ExposeIndexRule.java index ffd52389dd..2eb00d359b 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/ExposeIndexRule.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/rule/logical/ExposeIndexRule.java @@ -32,8 +32,8 @@ import org.apache.calcite.util.ImmutableBitSet; import org.apache.ignite.internal.sql.engine.prepare.bounds.SearchBounds; import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalIndexScan; import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalTableScan; -import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.IgniteTable; import org.immutables.value.Value; @@ -85,7 +85,7 @@ public class ExposeIndexRule extends RelRule<ExposeIndexRule.Config> { /** Filter pre known not applicable variants. Significant shrink search space in some cases. */ private static boolean filter(IgniteTable table, String idxName, List<SearchBounds> searchBounds) { - IgniteIndex index = table.getIndex(idxName); + IgniteSchemaIndex index = table.indexes().get(idxName); return index.type() == Type.SORTED || (searchBounds != null && searchBounds.stream().noneMatch(bound -> bound.type() == SearchBounds.Type.RANGE)); diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/CatalogSqlSchemaManager.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/CatalogSqlSchemaManager.java index 432ad5834c..861018ba3b 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/CatalogSqlSchemaManager.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/CatalogSqlSchemaManager.java @@ -50,6 +50,7 @@ import org.apache.ignite.internal.schema.DefaultValueGenerator; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution; import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; /** @@ -116,21 +117,11 @@ public class CatalogSqlSchemaManager implements SqlSchemaManager { TableDescriptorImpl tableDescriptorImpl = tableDescriptorMap.get(tableId); assert tableDescriptorImpl != null : "Table is not found in schema: " + tableId; - String indexName = indexDescriptor.name(); Map<String, IgniteSchemaIndex> tableIndexes = schemaTableIndexes.computeIfAbsent(tableId, id -> new LinkedHashMap<>()); - Type type; - if (indexDescriptor instanceof CatalogSortedIndexDescriptor) { - type = Type.SORTED; - } else if (indexDescriptor instanceof CatalogHashIndexDescriptor) { - type = Type.HASH; - } else { - throw new IllegalArgumentException("Unexpected index type: " + indexDescriptor); - } + IgniteSchemaIndex schemaIndex = createSchemaIndex(indexDescriptor, tableDescriptorImpl); - RelCollation indexCollation = IgniteSchemaIndex.createIndexCollation(indexDescriptor, tableDescriptorImpl); - IgniteSchemaIndex schemaIndex = new IgniteSchemaIndex(indexName, type, tableDescriptorImpl.distribution(), indexCollation); - tableIndexes.put(indexName, schemaIndex); + tableIndexes.put(schemaIndex.name(), schemaIndex); schemaTableIndexes.put(tableId, tableIndexes); } @@ -156,6 +147,24 @@ public class CatalogSqlSchemaManager implements SqlSchemaManager { return rootSchema.add(schemaName, igniteSchema); } + private static IgniteSchemaIndex createSchemaIndex(CatalogIndexDescriptor indexDescriptor, TableDescriptorImpl tableDescriptorImpl) { + Type type; + if (indexDescriptor instanceof CatalogSortedIndexDescriptor) { + type = IgniteIndex.Type.SORTED; + } else if (indexDescriptor instanceof CatalogHashIndexDescriptor) { + type = IgniteIndex.Type.HASH; + } else { + throw new IllegalArgumentException("Unexpected index type: " + indexDescriptor); + } + + int indexId = indexDescriptor.id(); + String indexName = indexDescriptor.name(); + IgniteDistribution distribution = tableDescriptorImpl.distribution(); + RelCollation indexCollation = IgniteSchemaIndex.createIndexCollation(indexDescriptor, tableDescriptorImpl); + + return new IgniteSchemaIndex(indexId, indexName, type, distribution, indexCollation); + } + private static TableDescriptorImpl createTableDescriptor(CatalogTableDescriptor descriptor) { List<ColumnDescriptor> colDescriptors = new ArrayList<>(); List<Integer> colocationColumns = new ArrayList<>(); diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSchemaIndex.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSchemaIndex.java index 5a5171bca4..09870c0fdc 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSchemaIndex.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteSchemaIndex.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.sql.engine.schema; +import static org.apache.ignite.internal.sql.engine.util.TypeUtils.native2relationalType; + import java.util.ArrayList; import java.util.List; import org.apache.calcite.plan.Convention; @@ -28,6 +30,8 @@ import org.apache.calcite.rel.RelCollations; import org.apache.calcite.rel.RelFieldCollation; import org.apache.calcite.rel.RelFieldCollation.Direction; import org.apache.calcite.rel.RelFieldCollation.NullDirection; +import org.apache.calcite.rel.type.RelDataType; +import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rex.RexNode; import org.apache.calcite.util.ImmutableBitSet; import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor; @@ -37,12 +41,15 @@ import org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescript import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalIndexScan; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex.Type; import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution; +import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory; /** * Auxiliary data structure to represent a table index. */ public class IgniteSchemaIndex { + private final int id; + private final String name; private final IgniteDistribution tableDistribution; @@ -52,13 +59,19 @@ public class IgniteSchemaIndex { private final Type type; /** Constructor. */ - public IgniteSchemaIndex(String name, Type type, IgniteDistribution tableDistribution, RelCollation collation) { + public IgniteSchemaIndex(int indexId, String name, Type type, IgniteDistribution tableDistribution, RelCollation collation) { + this.id = indexId; this.name = name; this.type = type; this.tableDistribution = tableDistribution; this.collation = collation; } + /** Returns an id of the index. */ + public int id() { + return id; + } + /** Returns the name of this index. */ public String name() { return name; @@ -140,4 +153,16 @@ public class IgniteSchemaIndex { throw new IllegalArgumentException("Unexpected index type: " + descriptor); } } + + //TODO: cache rowType as it can't be changed. + public RelDataType getRowType(IgniteTypeFactory typeFactory, TableDescriptor tableDescriptor) { + RelDataTypeFactory.Builder b = new RelDataTypeFactory.Builder(typeFactory); + + for (RelFieldCollation fieldCollation : collation.getFieldCollations()) { + ColumnDescriptor colDesc = tableDescriptor.columnDescriptor(fieldCollation.getFieldIndex()); + b.add(colDesc.name(), native2relationalType(typeFactory, colDesc.physicalType(), colDesc.nullable())); + } + + return b.build(); + } } 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 1b6fb59cde..86525e3aaf 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 @@ -32,6 +32,7 @@ import java.util.concurrent.Flow.Publisher; import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.Flow.Subscription; import java.util.stream.Collectors; +import org.apache.calcite.rel.RelCollation; import org.apache.calcite.rel.type.RelDataType; import org.apache.calcite.rel.type.RelDataTypeFactory; import org.apache.calcite.rel.type.RelDataTypeFactory.Builder; @@ -49,8 +50,11 @@ import org.apache.ignite.internal.sql.engine.exec.exp.RangeCondition; import org.apache.ignite.internal.sql.engine.metadata.PartitionWithTerm; import org.apache.ignite.internal.sql.engine.planner.AbstractPlannerTest.TestTableDescriptor; import org.apache.ignite.internal.sql.engine.schema.IgniteIndex; +import org.apache.ignite.internal.sql.engine.schema.IgniteSchemaIndex; import org.apache.ignite.internal.sql.engine.schema.TableDescriptor; +import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution; import org.apache.ignite.internal.sql.engine.trait.IgniteDistributions; +import org.apache.ignite.internal.sql.engine.trait.TraitUtils; import org.apache.ignite.internal.sql.engine.util.Commons; import org.apache.ignite.internal.table.InternalTable; import org.jetbrains.annotations.Nullable; @@ -177,7 +181,12 @@ public class IndexScanNodeExecutionTest extends AbstractExecutionTest { TableDescriptor tableDescriptor = new TestTableDescriptor(IgniteDistributions::single, rowType); - IgniteIndex schemaIndex = new IgniteIndex(index); + //TODO: avoid IgniteIndex creation. + IgniteIndex idx = new IgniteIndex(index); + RelCollation collations = TraitUtils.createCollation(idx.columns(), idx.collations(), tableDescriptor); + IgniteDistribution distribution = tableDescriptor.distribution(); + + IgniteSchemaIndex schemaIndex = new IgniteSchemaIndex(index.id(), index.name(), idx.type(), distribution, collations); RowFactory<Object[]> rowFactory = ctx.rowHandler().factory(ctx.getTypeFactory(), rowType); SingleRangeIterable<Object[]> conditions = new SingleRangeIterable<>(new Object[]{}, null, false, false); List<PartitionWithTerm> partitions = scannableTable.getPartitions(); @@ -212,7 +221,7 @@ public class IndexScanNodeExecutionTest extends AbstractExecutionTest { /** {@inheritDoc} */ @Override public <RowT> Publisher<RowT> indexRangeScan(ExecutionContext<RowT> ctx, PartitionWithTerm partWithTerm, - RowFactory<RowT> rowFactory, int indexId, List<String> columns, + RowFactory<RowT> rowFactory, int indexId, List<Integer> columns, @Nullable RangeCondition<RowT> cond, @Nullable BitSet requiredColumns) { List<T> list = partitionedData.get(partWithTerm.partId()); @@ -221,7 +230,7 @@ public class IndexScanNodeExecutionTest extends AbstractExecutionTest { @Override public <RowT> Publisher<RowT> indexLookup(ExecutionContext<RowT> ctx, PartitionWithTerm partWithTerm, - RowFactory<RowT> rowFactory, int indexId, List<String> columns, + RowFactory<RowT> rowFactory, int indexId, List<Integer> columns, RowT key, @Nullable BitSet requiredColumns) { return newPublisher(ctx, partWithTerm, rowFactory); 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/rel/ScannableTableSelfTest.java index 0e0dfd5d9d..fd91cfabbf 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/rel/ScannableTableSelfTest.java @@ -48,11 +48,11 @@ import java.util.concurrent.Flow.Subscriber; import java.util.concurrent.Flow.Subscription; import java.util.concurrent.SubmissionPublisher; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; 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.ignite.internal.hlc.HybridTimestamp; import org.apache.ignite.internal.index.SortedIndex; @@ -641,7 +641,7 @@ public class ScannableTableSelfTest { RowHandler<Object[]> rowHandler = ArrayRowHandler.INSTANCE; RowFactory<Object[]> rowFactory = rowHandler.factory(TYPE_FACTORY, input.rowType); RangeCondition<Object[]> rangeCondition = condition.asRangeCondition(); - List<String> indexColumns = input.getIndexColumns(); + List<Integer> indexColumns = input.getIndexColumns(); Publisher<Object[]> publisher = scannableTable.indexRangeScan(ctx, new PartitionWithTerm(partitionId, term), rowFactory, indexId, indexColumns, rangeCondition, requiredFields); @@ -675,7 +675,7 @@ public class ScannableTableSelfTest { RowHandler<Object[]> rowHandler = ArrayRowHandler.INSTANCE; RowFactory<Object[]> rowFactory = rowHandler.factory(TYPE_FACTORY, input.rowType); - List<String> indexColumns = input.getIndexColumns(); + List<Integer> indexColumns = input.getIndexColumns(); Publisher<Object[]> publisher = scannableTable.indexLookup(ctx, new PartitionWithTerm(partitionId, term), rowFactory, indexId, indexColumns, key, requiredFields); @@ -743,15 +743,8 @@ public class ScannableTableSelfTest { 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; + private List<Integer> getIndexColumns() { + return indexColumns.stream().boxed().collect(Collectors.toList()); } } diff --git a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestIndex.java b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestIndex.java index f9da45677b..dd8449e6bb 100644 --- a/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestIndex.java +++ b/modules/sql-engine/src/test/java/org/apache/ignite/internal/sql/engine/framework/TestIndex.java @@ -66,6 +66,7 @@ public class TestIndex extends IgniteIndex { } /** Returns an id of the index. */ + @Override public int id() { return id; }
