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

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


The following commit(s) were added to refs/heads/opt_memtable_speed by this 
push:
     new a186907b13 [opt](Nereids): enable distinct pushdown (#23196)
a186907b13 is described below

commit a186907b1329c8277937be2f1a22517bb3eadfd5
Author: xzj7019 <[email protected]>
AuthorDate: Sat Aug 19 12:11:47 2023 +0800

    [opt](Nereids): enable distinct pushdown (#23196)
    
    * [opt](Nereids): enable distinct pushdown
    
    * [opt](Nereids): enable distinct pushdown
    
    * [opt](Nereids): enable distinct pushdown
    
    ---------
    
    Co-authored-by: zhongjian.xzj 
<[email protected]>
---
 .../apache/doris/nereids/jobs/executor/Rewriter.java    |  7 ++++---
 .../nereids/rules/expression/rules/CaseWhenToIf.java    |  5 +++++
 .../rules/rewrite/PushdownDistinctThroughJoin.java      | 11 +++++++++++
 .../java/org/apache/doris/nereids/util/PlanUtils.java   |  9 +++++++++
 .../main/java/org/apache/doris/qe/SessionVariable.java  | 17 +++++++++++++++++
 5 files changed, 46 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
index 626c6094be..6f20208dac 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/jobs/executor/Rewriter.java
@@ -83,6 +83,7 @@ import 
org.apache.doris.nereids.rules.rewrite.PushConjunctsIntoJdbcScan;
 import org.apache.doris.nereids.rules.rewrite.PushFilterInsideJoin;
 import org.apache.doris.nereids.rules.rewrite.PushProjectIntoOneRowRelation;
 import org.apache.doris.nereids.rules.rewrite.PushProjectThroughUnion;
+import org.apache.doris.nereids.rules.rewrite.PushdownDistinctThroughJoin;
 import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughProject;
 import org.apache.doris.nereids.rules.rewrite.PushdownFilterThroughWindow;
 import org.apache.doris.nereids.rules.rewrite.PushdownLimit;
@@ -251,9 +252,9 @@ public class Rewriter extends AbstractBatchJobExecutor {
                     topDown(new BuildAggForUnion())
             ),
 
-            // topic("Distinct",
-            //         
costBased(custom(RuleType.PUSH_DOWN_DISTINCT_THROUGH_JOIN, 
PushdownDistinctThroughJoin::new))
-            // ),
+            topic("Distinct",
+                    custom(RuleType.PUSHDOWN_DISTINCT_THROUGH_JOIN, 
PushdownDistinctThroughJoin::new)
+            ),
 
             topic("Limit optimization",
                     topDown(
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
index 6372338406..08a07bbb6b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/expression/rules/CaseWhenToIf.java
@@ -24,6 +24,7 @@ import org.apache.doris.nereids.trees.expressions.Expression;
 import org.apache.doris.nereids.trees.expressions.WhenClause;
 import org.apache.doris.nereids.trees.expressions.functions.scalar.If;
 import org.apache.doris.nereids.trees.expressions.literal.NullLiteral;
+import org.apache.doris.qe.ConnectContext;
 
 /**
  * Rewrite rule to convert CASE WHEN to IF.
@@ -37,6 +38,10 @@ public class CaseWhenToIf extends 
AbstractExpressionRewriteRule {
     @Override
     public Expression visitCaseWhen(CaseWhen caseWhen, 
ExpressionRewriteContext context) {
         Expression expr = caseWhen;
+        if (ConnectContext.get() == null || 
ConnectContext.get().getSessionVariable() == null
+                || 
!ConnectContext.get().getSessionVariable().isEnableCaseWhenTransformation()) {
+            return expr;
+        }
         if (caseWhen.getWhenClauses().size() == 1) {
             WhenClause whenClause = caseWhen.getWhenClauses().get(0);
             Expression operand = whenClause.getOperand();
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java
index 7cfc9f35aa..c7bdafea9c 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/PushdownDistinctThroughJoin.java
@@ -19,11 +19,14 @@ package org.apache.doris.nereids.rules.rewrite;
 
 import org.apache.doris.nereids.jobs.JobContext;
 import org.apache.doris.nereids.trees.plans.Plan;
+import org.apache.doris.nereids.trees.plans.algebra.Relation;
 import org.apache.doris.nereids.trees.plans.logical.LogicalAggregate;
 import org.apache.doris.nereids.trees.plans.logical.LogicalJoin;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 import org.apache.doris.nereids.trees.plans.visitor.CustomRewriter;
 import org.apache.doris.nereids.trees.plans.visitor.DefaultPlanRewriter;
+import org.apache.doris.nereids.util.PlanUtils;
+import org.apache.doris.qe.ConnectContext;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,7 +43,12 @@ public class PushdownDistinctThroughJoin extends 
DefaultPlanRewriter<JobContext>
 
     @Override
     public Plan visitLogicalAggregate(LogicalAggregate<? extends Plan> agg, 
JobContext context) {
+        if (ConnectContext.get() == null || 
ConnectContext.get().getSessionVariable() == null
+                || 
!ConnectContext.get().getSessionVariable().isEnableDistinctPushDown()) {
+            return agg;
+        }
         agg = visitChildren(this, agg, context);
+
         if (agg.hasPushed() || !agg.isDistinct() || isLeaf(agg.child())) {
             return agg;
         }
@@ -80,6 +88,9 @@ public class PushdownDistinctThroughJoin extends 
DefaultPlanRewriter<JobContext>
     }
 
     private Plan withDistinct(Plan plan) {
+        if (PlanUtils.skipProjectFilterLimit(plan) instanceof Relation) {
+            return plan;
+        }
         return new LogicalAggregate<>(ImmutableList.copyOf(plan.getOutput()), 
true, true, plan);
     }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
index 5ded1dab5e..17034c15e6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/util/PlanUtils.java
@@ -24,6 +24,7 @@ import 
org.apache.doris.nereids.trees.expressions.NamedExpression;
 import org.apache.doris.nereids.trees.expressions.Slot;
 import org.apache.doris.nereids.trees.plans.Plan;
 import org.apache.doris.nereids.trees.plans.logical.LogicalFilter;
+import org.apache.doris.nereids.trees.plans.logical.LogicalLimit;
 import org.apache.doris.nereids.trees.plans.logical.LogicalProject;
 
 import com.google.common.collect.ImmutableList;
@@ -96,4 +97,12 @@ public class PlanUtils {
             }
         }).collect(ImmutableList.toImmutableList());
     }
+
+    public static Plan skipProjectFilterLimit(Plan plan) {
+        if (plan instanceof LogicalProject && ((LogicalProject<?>) 
plan).isAllSlots()
+                || plan instanceof LogicalFilter || plan instanceof 
LogicalLimit) {
+            return plan.child(0);
+        }
+        return plan;
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java 
b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index eb5f1434e6..57a2eb1f2d 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -232,6 +232,9 @@ public class SessionVariable implements Serializable, 
Writable {
     public static final String DISABLE_NEREIDS_RULES = "disable_nereids_rules";
     public static final String ENABLE_NEW_COST_MODEL = "enable_new_cost_model";
     public static final String ENABLE_FALLBACK_TO_ORIGINAL_PLANNER = 
"enable_fallback_to_original_planner";
+    public static final String ENABLE_DISTINCT_PUSHDOWN = 
"enable_distinct_pushdown";
+
+    public static final String ENABLE_CASEWHEN_TRANSFORMATION = 
"enable_casewhen_transformation";
     public static final String ENABLE_NEREIDS_TIMEOUT = 
"enable_nereids_timeout";
 
     public static final String FORBID_UNKNOWN_COLUMN_STATS = 
"forbid_unknown_col_stats";
@@ -908,6 +911,12 @@ public class SessionVariable implements Serializable, 
Writable {
     @VariableMgr.VarAttr(name = ENABLE_FALLBACK_TO_ORIGINAL_PLANNER, 
needForward = true)
     public boolean enableFallbackToOriginalPlanner = true;
 
+    @VariableMgr.VarAttr(name = ENABLE_DISTINCT_PUSHDOWN)
+    public boolean enableDistinctPushDown = false;
+
+    @VariableMgr.VarAttr(name = ENABLE_CASEWHEN_TRANSFORMATION)
+    public boolean enableCaseWhenTransformation = true;
+
     @VariableMgr.VarAttr(name = ENABLE_NEREIDS_TIMEOUT, needForward = true)
     public boolean enableNereidsTimeout = true;
 
@@ -2457,6 +2466,14 @@ public class SessionVariable implements Serializable, 
Writable {
                 new 
SetVar(SessionVariable.ENABLE_FALLBACK_TO_ORIGINAL_PLANNER, new 
StringLiteral("true")));
     }
 
+    public boolean isEnableDistinctPushDown() {
+        return enableDistinctPushDown;
+    }
+
+    public boolean isEnableCaseWhenTransformation() {
+        return enableCaseWhenTransformation;
+    }
+
     public void disableNereidsPlannerOnce() throws DdlException {
         if (!enableNereidsPlanner) {
             return;


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to