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