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