This is an automated email from the ASF dual-hosted git repository.
amashenkov 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 8c537d12a4 IGNITE-19621 Sql. Shrink planner search space by removing
pre known not applicable indexes (#2202)
8c537d12a4 is described below
commit 8c537d12a48e1dce16d04da745bf2e209c0d5096
Author: Evgeniy Stanilovskiy <[email protected]>
AuthorDate: Fri Jun 23 17:23:23 2023 +0300
IGNITE-19621 Sql. Shrink planner search space by removing pre known not
applicable indexes (#2202)
---
.../internal/sql/engine/rule/logical/ExposeIndexRule.java | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
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 264eaaed5e..ffd52389dd 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
@@ -29,8 +29,11 @@ import org.apache.calcite.plan.RelRule;
import org.apache.calcite.rel.RelNode;
import org.apache.calcite.rex.RexNode;
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.IgniteTable;
import org.immutables.value.Value;
@@ -42,7 +45,7 @@ import org.immutables.value.Value;
public class ExposeIndexRule extends RelRule<ExposeIndexRule.Config> {
public static final RelOptRule INSTANCE =
Config.DEFAULT.withDescription("ExposeIndexRule").toRule();
- public ExposeIndexRule(Config config) {
+ private ExposeIndexRule(Config config) {
super(config);
}
@@ -65,6 +68,7 @@ public class ExposeIndexRule extends
RelRule<ExposeIndexRule.Config> {
List<IgniteLogicalIndexScan> indexes =
igniteTable.indexes().keySet().stream()
.map(idxName -> igniteTable.toRel(cluster, optTable, idxName,
proj, condition, requiredCols))
+ .filter(idx -> filter(igniteTable, idx.indexName(),
idx.searchBounds()))
.collect(Collectors.toList());
if (indexes.isEmpty()) {
@@ -79,6 +83,14 @@ public class ExposeIndexRule extends
RelRule<ExposeIndexRule.Config> {
call.transformTo(indexes.get(0), equivMap);
}
+ /** 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);
+
+ return index.type() == Type.SORTED || (searchBounds != null
+ && searchBounds.stream().noneMatch(bound -> bound.type() ==
SearchBounds.Type.RANGE));
+ }
+
/**
* Rule's configuration.
*/