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 028f363b88eabd779001847a79a35f1150478c79 Author: amashenkov <[email protected]> AuthorDate: Tue Aug 15 13:19:34 2023 +0300 Improve index collation calculation. --- .../internal/sql/engine/SqlQueryProcessor.java | 4 ++-- .../sql/engine/exec/LogicalRelImplementor.java | 6 +----- .../internal/sql/engine/schema/IgniteIndex.java | 24 ++++++++++++++-------- .../internal/sql/engine/trait/TraitUtils.java | 16 +++++++++++++++ 4 files changed, 34 insertions(+), 16 deletions(-) diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java index 0657622a10..4c3aaa1c07 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/SqlQueryProcessor.java @@ -439,7 +439,7 @@ public class SqlQueryProcessor implements QueryProcessor { .build(); return prepareSvc.prepareAsync(result, ctx) - .thenApply(plan -> { + .thenApplyAsync(plan -> { var dataCursor = executionSrvc.executePlan(tx.get(), plan, ctx); SqlQueryType queryType = plan.type(); @@ -468,7 +468,7 @@ public class SqlQueryProcessor implements QueryProcessor { } } ); - }); + }, taskExecutor); }); stage.whenComplete((cur, ex) -> { 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 5f1594b957..3135a26571 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 @@ -344,11 +344,7 @@ public class LogicalRelImplementor<RowT> implements IgniteRelVisitor<Node<RowT>> RangeIterable<RowT> ranges = null; if (searchBounds != null) { - Comparator<RowT> searchRowComparator = null; - - if (idx.type() == Type.SORTED) { - searchRowComparator = expressionFactory.comparator(IgniteIndex.deriveCollations(idx, tbl.descriptor().columnsCount())); - } + Comparator<RowT> searchRowComparator = IgniteIndex.createComparator(expressionFactory, idx); ranges = expressionFactory.ranges(searchBounds, idx.rowType(typeFactory, tbl.descriptor()), searchRowComparator); } diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteIndex.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteIndex.java index 723cd0e749..61094ae845 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteIndex.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/schema/IgniteIndex.java @@ -20,6 +20,7 @@ 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.Comparator; import java.util.List; import org.apache.calcite.plan.Convention; import org.apache.calcite.plan.RelOptCluster; @@ -34,15 +35,16 @@ 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.calcite.util.mapping.Mapping; -import org.apache.calcite.util.mapping.Mappings; import org.apache.ignite.internal.catalog.descriptors.CatalogHashIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogIndexColumnDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogIndexDescriptor; import org.apache.ignite.internal.catalog.descriptors.CatalogSortedIndexDescriptor; +import org.apache.ignite.internal.sql.engine.exec.exp.ExpressionFactory; import org.apache.ignite.internal.sql.engine.rel.logical.IgniteLogicalIndexScan; import org.apache.ignite.internal.sql.engine.trait.IgniteDistribution; +import org.apache.ignite.internal.sql.engine.trait.TraitUtils; import org.apache.ignite.internal.sql.engine.type.IgniteTypeFactory; +import org.jetbrains.annotations.Nullable; /** * Schema object representing an Index. @@ -88,6 +90,8 @@ public class IgniteIndex { private final RelCollation collation; + private RelCollation indexRowCollation; + private final Type type; private RelDataType rowType; @@ -99,6 +103,10 @@ public class IgniteIndex { this.type = type; this.tableDistribution = tableDistribution; this.collation = collation; + + if (type != Type.SORTED) { + indexRowCollation = TraitUtils.trimmedCollation(collation.getFieldCollations()); + } } /** Returns an id of the index. */ @@ -223,13 +231,11 @@ public class IgniteIndex { } /** Index row collation. */ - public static RelCollation deriveCollations(IgniteIndex index, int targetSize) { - assert index.type == Type.SORTED; - - List<RelFieldCollation> fieldCollations = index.collation().getFieldCollations(); - - Mapping mapping = Mappings.target(RelCollations.ordinals(fieldCollations), targetSize); + public static <RowT> @Nullable Comparator<RowT> createComparator(ExpressionFactory<RowT> factory, IgniteIndex index) { + if (index.type != Type.SORTED) { + return null; + } - return RelCollations.permute(index.collation(), mapping); + return factory.comparator(index.indexRowCollation); } } diff --git a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java index a1731075ea..5af7efabc3 100644 --- a/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java +++ b/modules/sql-engine/src/main/java/org/apache/ignite/internal/sql/engine/trait/TraitUtils.java @@ -397,6 +397,22 @@ public class TraitUtils { return processed; } + /** + * Creates {@link RelCollation} object from a given collations. + * + * @param collations Original collation. + * @return a {@link RelCollation} object. + */ + public static RelCollation trimmedCollation(List<RelFieldCollation> collations) { + int i = 0; + List<RelFieldCollation> result = new ArrayList<>(collations.size()); + for (RelFieldCollation fieldCollation : collations) { + result.add(fieldCollation.withFieldIndex(i++)); + } + + return RelCollations.of(result); + } + /** * Creates collations from provided keys. *
