This is an automated email from the ASF dual-hosted git repository.

kxiao pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 0fb935d47540ec3ca75fd4bdd88e8e526b85688c
Author: airborne12 <airborn...@gmail.com>
AuthorDate: Thu Sep 21 20:30:27 2023 +0800

    [Improve](count on index) improve performance for count on index other than 
match (#24678)
---
 .../rules/implementation/AggregateStrategies.java  | 39 ++++++++++++----------
 1 file changed, 21 insertions(+), 18 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java
index e118c4ee9b..166ddd3bd9 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/implementation/AggregateStrategies.java
@@ -17,8 +17,11 @@
 
 package org.apache.doris.nereids.rules.implementation;
 
+import org.apache.doris.analysis.IndexDef.IndexType;
 import org.apache.doris.catalog.Column;
 import org.apache.doris.catalog.KeysType;
+import org.apache.doris.catalog.MaterializedIndexMeta;
+import org.apache.doris.catalog.OlapTable;
 import org.apache.doris.catalog.PrimitiveType;
 import org.apache.doris.common.Pair;
 import org.apache.doris.nereids.CascadesContext;
@@ -36,7 +39,6 @@ import org.apache.doris.nereids.trees.expressions.Alias;
 import org.apache.doris.nereids.trees.expressions.Cast;
 import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.IsNull;
-import org.apache.doris.nereids.trees.expressions.Match;
 import org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.SlotReference;
 import org.apache.doris.nereids.trees.expressions.functions.ExpressionTrait;
@@ -77,7 +79,6 @@ import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
@@ -103,8 +104,8 @@ public class AggregateStrategies implements 
ImplementationRuleFactory {
             RuleType.COUNT_ON_INDEX_WITHOUT_PROJECT.build(
                 logicalAggregate(
                     logicalFilter(
-                        logicalOlapScan().when(this::isDupOrMowKeyTable)
-                    ).when(filter -> 
containsMatchExpression(filter.getConjuncts())))
+                        
logicalOlapScan().when(this::isDupOrMowKeyTable).when(this::isInvertedIndexEnabledOnTable)
+                    ).when(filter -> filter.getConjuncts().size() > 0))
                     .when(agg -> enablePushDownCountOnIndex())
                     .when(agg -> agg.getGroupByExpressions().size() == 0)
                     .when(agg -> {
@@ -123,8 +124,8 @@ public class AggregateStrategies implements 
ImplementationRuleFactory {
                 logicalAggregate(
                     logicalProject(
                         logicalFilter(
-                            logicalOlapScan().when(this::isDupOrMowKeyTable)
-                        ).when(filter -> 
containsMatchExpression(filter.getConjuncts()))))
+                            
logicalOlapScan().when(this::isDupOrMowKeyTable).when(this::isInvertedIndexEnabledOnTable)
+                        ).when(filter -> filter.getConjuncts().size() > 0)))
                     .when(agg -> enablePushDownCountOnIndex())
                     .when(agg -> agg.getGroupByExpressions().size() == 0)
                     .when(agg -> {
@@ -230,18 +231,6 @@ public class AggregateStrategies implements 
ImplementationRuleFactory {
         );
     }
 
-    private boolean containsMatchExpression(Set<Expression> expressions) {
-        List<Expression> exprs = new ArrayList<>();
-        expressions.forEach(conjunct -> {
-            conjunct.getInputSlots().forEach(slot -> {
-                if (!slot.getName().equalsIgnoreCase(Column.DELETE_SIGN)) {
-                    exprs.add(conjunct);
-                }
-            });
-        });
-        return exprs.stream().allMatch(expr -> expr instanceof Match);
-    }
-
     private boolean enablePushDownCountOnIndex() {
         ConnectContext connectContext = ConnectContext.get();
         return connectContext != null && 
connectContext.getSessionVariable().isEnablePushDownCountOnIndex();
@@ -256,6 +245,20 @@ public class AggregateStrategies implements 
ImplementationRuleFactory {
         return false;
     }
 
+    private boolean isInvertedIndexEnabledOnTable(LogicalOlapScan logicalScan) 
{
+        if (logicalScan == null) {
+            return false;
+        }
+
+        OlapTable olapTable = logicalScan.getTable();
+        Map<Long, MaterializedIndexMeta> indexIdToMeta = 
olapTable.getIndexIdToMeta();
+
+        return indexIdToMeta.values().stream()
+                .anyMatch(indexMeta -> indexMeta.getIndexes().stream()
+                        .anyMatch(index -> index.getIndexType() == 
IndexType.INVERTED
+                                || index.getIndexType() == IndexType.BITMAP));
+    }
+
     /**
      * sql: select count(*) from tbl where column match 'token'
      * <p>


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to