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.
      *

Reply via email to