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

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


The following commit(s) were added to refs/heads/opt_perf by this push:
     new 31f38a5c2b [enhancement](agg)remove unnessasery group by exprs (#12944)
31f38a5c2b is described below

commit 31f38a5c2bb750c8b9a5d0fb7706d73ed5399e6e
Author: starocean999 <40539150+starocean...@users.noreply.github.com>
AuthorDate: Sun Sep 25 10:14:55 2022 +0800

    [enhancement](agg)remove unnessasery group by exprs (#12944)
---
 .../main/java/org/apache/doris/analysis/Expr.java  | 25 ++++++++++++++++++++++
 .../java/org/apache/doris/analysis/SelectStmt.java | 20 +++++++++++++++++
 2 files changed, 45 insertions(+)

diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
index d0a07c68e7..d0259d1e22 100755
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/Expr.java
@@ -51,6 +51,7 @@ import java.io.DataOutput;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -2007,4 +2008,28 @@ public abstract class Expr extends TreeNode<Expr> 
implements ParseNode, Cloneabl
             child.materializeSrcExpr();
         }
     }
+
+    private boolean islinearRelationshipHelper(SlotId slotId) {
+        if (!((this instanceof ArithmeticExpr) || (this instanceof SlotRef) || 
(this instanceof LiteralExpr))) {
+            return false;
+        }
+        for (Expr child : children) {
+            if (!child.islinearRelationshipHelper(slotId)) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    public boolean islinearRelationship(SlotId slotId) {
+        List<SlotRef> slotRefs = Lists.newArrayList();
+        Expr.collectList(Collections.singletonList(this), SlotRef.class, 
slotRefs);
+        if (slotRefs.size() > 1) {
+            return false;
+        }
+        if (slotRefs.isEmpty() || (slotRefs.size() == 1 && 
slotRefs.get(0).getSlotId() != slotId)) {
+            return false;
+        }
+        return islinearRelationshipHelper(slotId);
+    }
 }
diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java 
b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
index 97f7318275..b8fb4b53c4 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/SelectStmt.java
@@ -1067,6 +1067,26 @@ public class SelectStmt extends QueryStmt {
 
             if (!groupByClause.isGroupByExtension()) {
                 groupingExprs.removeIf(Expr::isConstant);
+                ArrayList<Expr> slotExprs = new ArrayList<>();
+                ArrayList<Expr> otherExprs = new ArrayList<>();
+                for (Expr expr : groupingExprs) {
+                    if (expr instanceof SlotRef) {
+                        slotExprs.add(expr);
+                    } else {
+                        otherExprs.add(expr);
+                    }
+                }
+
+                ArrayList<Expr> removeExprs = new ArrayList<>();
+                for (Expr otherExpr : otherExprs) {
+                    for (Expr slotExpr : slotExprs) {
+                        if (otherExpr.islinearRelationship(((SlotRef) 
slotExpr).getSlotId())) {
+                            removeExprs.add(otherExpr);
+                            break;
+                        }
+                    }
+                }
+                groupingExprs.removeAll(removeExprs);
             }
 
             if (groupingInfo != null) {


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

Reply via email to