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