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

yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new 1f2c06dd6e [enhancement](rewrite) Remove unused wide common factors to 
improve scan performance in ExtractCommonFactorsRule (#14381)
1f2c06dd6e is described below

commit 1f2c06dd6e81c6e12ec73b4030288a3d236bfead
Author: caiconghui <55968745+caicong...@users.noreply.github.com>
AuthorDate: Sat Nov 19 13:23:49 2022 +0800

    [enhancement](rewrite) Remove unused wide common factors to improve scan 
performance in ExtractCommonFactorsRule (#14381)
    
    * [enhancemeng](sql) Remove unused wide common factors to improve scan 
performance in ExtractCommonFactorsRule
    
    * fix regression test
    
    Co-authored-by: caiconghui1 <caicongh...@jd.com>
---
 .../org/apache/doris/rewrite/ExtractCommonFactorsRule.java   | 12 ++++++++----
 .../doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java  |  8 ++++++++
 .../suites/tpch_sf1_p1/tpch_sf1/explain/test_q12.groovy      |  4 ++--
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
index 0ec42b7c59..6ff72d858b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/rewrite/ExtractCommonFactorsRule.java
@@ -20,12 +20,14 @@ package org.apache.doris.rewrite;
 import org.apache.doris.analysis.Analyzer;
 import org.apache.doris.analysis.BinaryPredicate;
 import org.apache.doris.analysis.CompoundPredicate;
+import org.apache.doris.analysis.CompoundPredicate.Operator;
 import org.apache.doris.analysis.Expr;
 import org.apache.doris.analysis.InPredicate;
 import org.apache.doris.analysis.LiteralExpr;
 import org.apache.doris.analysis.SlotRef;
 import org.apache.doris.common.AnalysisException;
 import org.apache.doris.planner.PlanNode;
+import org.apache.doris.rewrite.ExprRewriter.ClauseType;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.BoundType;
@@ -70,7 +72,7 @@ public class ExtractCommonFactorsRule implements 
ExprRewriteRule {
             return null;
         } else if (expr instanceof CompoundPredicate
                 && ((CompoundPredicate) expr).getOp() == 
CompoundPredicate.Operator.OR) {
-            Expr rewrittenExpr = 
extractCommonFactors(exprFormatting((CompoundPredicate) expr), analyzer);
+            Expr rewrittenExpr = 
extractCommonFactors(exprFormatting((CompoundPredicate) expr), analyzer, 
clauseType);
             if (rewrittenExpr != null) {
                 return rewrittenExpr;
             }
@@ -101,7 +103,7 @@ public class ExtractCommonFactorsRule implements 
ExprRewriteRule {
      * 4. Construct new expr:
      * @return: a and b' and (b or (e and f))
      */
-    private Expr extractCommonFactors(List<List<Expr>> exprs, Analyzer 
analyzer) {
+    private Expr extractCommonFactors(List<List<Expr>> exprs, Analyzer 
analyzer, ExprRewriter.ClauseType clauseType) {
         if (exprs.size() < 2) {
             return null;
         }
@@ -156,9 +158,11 @@ public class ExtractCommonFactorsRule implements 
ExprRewriteRule {
         }
 
         // 3. find merge cross the clause
-        if (analyzer.getContext() != null && 
analyzer.getContext().getSessionVariable().isExtractWideRangeExpr()) {
+        if (analyzer.getContext() != null && clauseType == 
ClauseType.WHERE_CLAUSE
+                && 
analyzer.getContext().getSessionVariable().isExtractWideRangeExpr()) {
             Expr wideCommonExpr = findWideRangeExpr(clearExprs);
-            if (wideCommonExpr != null) {
+            if (wideCommonExpr != null && !(wideCommonExpr instanceof 
CompoundPredicate
+                    && ((CompoundPredicate) wideCommonExpr).getOp() == 
Operator.OR)) {
                 commonFactorList.add(wideCommonExpr);
             }
         }
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
 
b/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
index 802e4f7f9e..bb6807abee 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/rewrite/ExtractCommonFactorsRuleFunctionTest.java
@@ -83,6 +83,14 @@ public class ExtractCommonFactorsRuleFunctionTest {
         Assert.assertEquals(1, StringUtils.countMatches(planString, 
"`tb1`.`k1` = `tb2`.`k1`"));
     }
 
+
+    @Test
+    public void testWideCommonFactorsWithOrPredicate() throws Exception {
+        String query = "select * from tb1 where tb1.k1 > 1000 or tb1.k1 < 200 
or tb1.k1 = 300";
+        String planString = dorisAssert.query(query).explainQuery();
+        Assert.assertTrue(planString.contains("PREDICATES: (`tb1`.`k1` > 1000 
OR `tb1`.`k1` < 200 OR `tb1`.`k1` = 300)"));
+    }
+
     @Test
     public void testWideCommonFactorsWithEqualPredicate() throws Exception {
         String query = "select * from tb1, tb2 where (tb1.k1=1 and tb2.k1=1) 
or (tb1.k1 =2 and tb2.k1=2)";
diff --git 
a/regression-test/suites/tpch_sf1_p1/tpch_sf1/explain/test_q12.groovy 
b/regression-test/suites/tpch_sf1_p1/tpch_sf1/explain/test_q12.groovy
index f2ef14e5ba..7b42b5e413 100644
--- a/regression-test/suites/tpch_sf1_p1/tpch_sf1/explain/test_q12.groovy
+++ b/regression-test/suites/tpch_sf1_p1/tpch_sf1/explain/test_q12.groovy
@@ -59,11 +59,11 @@ suite("test_explain_tpch_sf_1_q12") {
                explainStr.contains("VTOP-N\n" + 
                                "  |  order by: <slot 10> <slot 7> `l_shipmode` 
ASC") && 
                explainStr.contains("VAGGREGATE (merge finalize)\n" + 
-                               "  |  output: sum(<slot 8> sum(CASE WHEN 
((<slot 18> = '1-URGENT' OR <slot 18> = '2-HIGH') AND (<slot 18> = '1-URGENT' 
OR <slot 18> = '2-HIGH')) THEN 1 ELSE 0 END)), sum(<slot 9> sum(CASE WHEN <slot 
18> != '1-URGENT' AND <slot 18> != '2-HIGH' THEN 1 ELSE 0 END))\n" + 
+                               "  |  output: sum(<slot 8> sum(CASE WHEN (<slot 
18> = '1-URGENT' OR <slot 18> = '2-HIGH') THEN 1 ELSE 0 END)), sum(<slot 9> 
sum(CASE WHEN <slot 18> != '1-URGENT' AND <slot 18> != '2-HIGH' THEN 1 ELSE 0 
END))\n" +
                                "  |  group by: <slot 7> `l_shipmode`") && 
                explainStr.contains("VAGGREGATE (update serialize)\n" + 
                                "  |  STREAMING\n" + 
-                               "  |  output: sum(CASE WHEN ((<slot 18> = 
'1-URGENT' OR <slot 18> = '2-HIGH') AND (<slot 18> = '1-URGENT' OR <slot 18> = 
'2-HIGH')) THEN 1 ELSE 0 END), sum(CASE WHEN <slot 18> != '1-URGENT' AND <slot 
18> != '2-HIGH' THEN 1 ELSE 0 END)\n" + 
+                               "  |  output: sum(CASE WHEN (<slot 18> = 
'1-URGENT' OR <slot 18> = '2-HIGH') THEN 1 ELSE 0 END), sum(CASE WHEN <slot 18> 
!= '1-URGENT' AND <slot 18> != '2-HIGH' THEN 1 ELSE 0 END)\n" +
                                "  |  group by: <slot 13>") && 
                explainStr.contains("join op: INNER JOIN(BROADCAST)[Tables are 
not in the same group]\n" + 
                                "  |  equal join conjunct: `l_orderkey` = 
`o_orderkey`\n" + 


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

Reply via email to