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

jakevin 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 8206252e0a5 [Performance](Nereids): refactor GroupMatching (#25960)
8206252e0a5 is described below

commit 8206252e0a554971b38067d97a7ed0dbc24c77a3
Author: jakevin <jakevin...@gmail.com>
AuthorDate: Fri Oct 27 10:56:42 2023 +0800

    [Performance](Nereids): refactor GroupMatching (#25960)
    
    Refactor GroupMatching to improve performance.
---
 .../nereids/pattern/GroupExpressionMatching.java   |  4 +-
 .../doris/nereids/pattern/GroupMatching.java       | 86 +++++-----------------
 2 files changed, 19 insertions(+), 71 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java
index e685f8484ff..f73ddcc8868 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java
@@ -26,7 +26,6 @@ import org.apache.doris.nereids.trees.plans.Plan;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
-import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
@@ -150,8 +149,7 @@ public class GroupExpressionMatching implements 
Iterable<Plan> {
                 }
             }
 
-            List<Plan> matchingChildren = new ArrayList<>();
-            new GroupMatching(childPattern, 
childGroup).forEach(matchingChildren::add);
+            List<Plan> matchingChildren = 
GroupMatching.getAllMatchingPlans(childPattern, childGroup);
             return matchingChildren;
         }
 
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupMatching.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupMatching.java
index a76a07d7fd1..b3e59590d37 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupMatching.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupMatching.java
@@ -22,85 +22,35 @@ import org.apache.doris.nereids.memo.GroupExpression;
 import org.apache.doris.nereids.trees.plans.GroupPlan;
 import org.apache.doris.nereids.trees.plans.Plan;
 
-import com.google.common.collect.Iterators;
-
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Objects;
 
 /**
  * Get all pattern matching subtree in query plan from a group.
  */
-public class GroupMatching implements Iterable<Plan> {
-    private final Pattern pattern;
-    private final Group group;
-
-    public GroupMatching(Pattern pattern, Group group) {
-        this.pattern = Objects.requireNonNull(pattern);
-        this.group = Objects.requireNonNull(group);
-    }
-
-    public final Iterator<Plan> iterator() {
-        return new GroupIterator(pattern, group);
-    }
-
+public class GroupMatching {
     /**
-     * Iterator to get all subtrees from a group.
+     * Get all pattern matching subtree in query plan from a group.
      */
-    public static class GroupIterator implements Iterator<Plan> {
-        private final List<Iterator<Plan>> iterator;
-        private int iteratorIndex = 0;
-
-        /**
-         * Constructor.
-         *
-         * @param pattern pattern to match
-         * @param group group to be matched
-         */
-        public GroupIterator(Pattern<? extends Plan> pattern, Group group) {
-            this.iterator = new ArrayList<>();
-
-            if (pattern.isGroup() || pattern.isMultiGroup()) {
-                GroupPlan groupPlan = new GroupPlan(group);
-                if (((Pattern<Plan>) pattern).matchPredicates(groupPlan)) {
-                    this.iterator.add(Iterators.singletonIterator(groupPlan));
-                }
-            } else {
-                for (GroupExpression groupExpression : 
group.getLogicalExpressions()) {
-                    GroupExpressionMatching.GroupExpressionIterator 
groupExpressionIterator =
-                            new GroupExpressionMatching(pattern, 
groupExpression).iterator();
-                    if (groupExpressionIterator.hasNext()) {
-                        this.iterator.add(groupExpressionIterator);
-                    }
-                }
-                for (GroupExpression groupExpression : 
group.getPhysicalExpressions()) {
-                    GroupExpressionMatching.GroupExpressionIterator 
groupExpressionIterator =
-                            new GroupExpressionMatching(pattern, 
groupExpression).iterator();
-                    if (groupExpressionIterator.hasNext()) {
-                        this.iterator.add(groupExpressionIterator);
-                    }
-                }
+    public static List<Plan> getAllMatchingPlans(Pattern pattern, Group group) 
{
+        List<Plan> matchingPlans = new ArrayList<>();
+        if (pattern.isGroup() || pattern.isMultiGroup()) {
+            GroupPlan groupPlan = new GroupPlan(group);
+            if (((Pattern<Plan>) pattern).matchPredicates(groupPlan)) {
+                matchingPlans.add(groupPlan);
             }
-        }
-
-        @Override
-        public final boolean hasNext() {
-            return iteratorIndex < iterator.size();
-        }
-
-        @Override
-        public final Plan next() {
-            if (!hasNext()) {
-                throw new NoSuchElementException();
+        } else {
+            for (GroupExpression groupExpression : 
group.getLogicalExpressions()) {
+                for (Plan plan : new GroupExpressionMatching(pattern, 
groupExpression)) {
+                    matchingPlans.add(plan);
+                }
             }
-
-            Plan result = iterator.get(iteratorIndex).next();
-            if (!iterator.get(iteratorIndex).hasNext()) {
-                iteratorIndex++;
+            for (GroupExpression groupExpression : 
group.getPhysicalExpressions()) {
+                for (Plan plan : new GroupExpressionMatching(pattern, 
groupExpression)) {
+                    matchingPlans.add(plan);
+                }
             }
-            return result;
         }
+        return matchingPlans;
     }
 }


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

Reply via email to