924060929 commented on code in PR #10241:
URL: https://github.com/apache/doris/pull/10241#discussion_r901287014


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/pattern/GroupExpressionMatching.java:
##########
@@ -60,58 +59,101 @@ public GroupExpressionIterator<Plan> iterator() {
          * @param pattern pattern to match
          * @param groupExpression group expression to be matched
          */
-        public GroupExpressionIterator(Pattern<? extends NODE_TYPE, NODE_TYPE> 
pattern,
-                GroupExpression groupExpression) {
-            results = Lists.newArrayList();
-
+        public GroupExpressionIterator(Pattern<Plan, Plan> pattern, 
GroupExpression groupExpression) {
             if (!pattern.matchOperator(groupExpression.getOperator())) {
                 return;
             }
-            if (pattern.arity() > groupExpression.arity()) {
+
+            // (logicalFilter(), multi()) match (logicalFilter()),
+            // but (logicalFilter(), logicalFilter(), multi()) not match 
(logicalFilter())
+            boolean extraMulti = pattern.arity() == groupExpression.arity() + 1
+                    && (pattern.hasMultiChild() || 
pattern.hasMultiGroupChild());
+            if (pattern.arity() > groupExpression.arity() && !extraMulti) {
                 return;
             }
-            if (pattern.arity() < groupExpression.arity()
-                    && (!pattern.children().contains(Pattern.MULTI)
-                    || !pattern.children().contains(Pattern.MULTI_FIXED))) {
+
+            // (multi()) match (logicalFilter(), logicalFilter()),
+            // but (logicalFilter()) not match (logicalFilter(), 
logicalFilter())
+            if (!pattern.isAny() && pattern.arity() < groupExpression.arity()
+                    && !pattern.hasMultiChild() && 
!pattern.hasMultiGroupChild()) {
                 return;
             }
 
-            NODE_TYPE root = 
groupExpression.getOperator().toTreeNode(groupExpression);
-
-            List<List<NODE_TYPE>> childrenResults = 
Lists.newArrayListWithCapacity(groupExpression.arity());
-            for (int i = 0; i < groupExpression.arity(); ++i) {
-                childrenResults.add(Lists.newArrayList());
-                int patternChildIndex = i >= pattern.arity() ? pattern.arity() 
- 1 : i;
-                for (NODE_TYPE child : new GroupMatching<NODE_TYPE>(
-                        pattern.child(patternChildIndex), 
groupExpression.child(i))) {
-                    childrenResults.get(i).add(child);
-                }
+            // Pattern.GROUP / Pattern.MULTI / Pattern.MULTI_GROUP can not 
match GroupExpression
+            if (pattern.isGroup() || pattern.isMulti() || 
pattern.isMultiGroup()) {

Review Comment:
   just for the future.
   for example. the pattern: `union(logicalRelation(), multi())` means union 
with first child is logicalRelation and has empty or multi other children. so 
this plan tree can matched:
   1. union(logicalRelation())
   2. union(logicalRelation(), logicalProject()),
   3. union(logicalRelation(), logicalProject(), logicalProject()).
   and rule can see the real child plan type is logicalRelation and 
logicalProject.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


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

Reply via email to