morrySnow commented on code in PR #36567:
URL: https://github.com/apache/doris/pull/36567#discussion_r1651016828


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java:
##########
@@ -331,11 +337,64 @@ private boolean isGroupByEquals(Pair<Plan, 
LogicalAggregate<Plan>> queryTopPlanA
                 queryAggregate.getGroupByExpressions(), queryTopPlan, 
queryStructInfo.getTableBitSet())) {
             queryGroupShuttledExpression.add(queryExpression);
         }
+
+        // try to eliminate group by dimension by function dependency if group 
by expression is not in query
+        Map<Expression, Expression> 
viewShuttledExpressionQueryBasedToGroupByExpressionMap = new HashMap<>();
+        Map<Expression, Expression> 
groupByExpressionToViewShuttledExpressionQueryBasedMap = new HashMap<>();
+        List<Expression> viewGroupByExpressions = 
viewAggregate.getGroupByExpressions();
+        List<? extends Expression> viewGroupByShuttledExpressions = 
ExpressionUtils.shuttleExpressionWithLineage(
+                viewGroupByExpressions, viewTopPlan, 
viewStructInfo.getTableBitSet());
+
+        for (int index = 0; index < viewGroupByExpressions.size(); index++) {
+            Expression viewExpression = viewGroupByExpressions.get(index);
+            Expression viewGroupExpressionQueryBased = ExpressionUtils.replace(
+                    viewGroupByShuttledExpressions.get(index),
+                    viewToQuerySlotMapping.toSlotReferenceMap());
+            
viewShuttledExpressionQueryBasedToGroupByExpressionMap.put(viewGroupExpressionQueryBased,
+                    viewExpression);
+            
groupByExpressionToViewShuttledExpressionQueryBasedMap.put(viewExpression,
+                    viewGroupExpressionQueryBased
+            );
+        }
+        if 
(queryGroupShuttledExpression.equals(viewShuttledExpressionQueryBasedToGroupByExpressionMap.values()))
 {
+            // return true, if equals directly
+            return true;
+        }
+        List<NamedExpression> projects = new ArrayList<>();
+        for (Expression expression : queryGroupShuttledExpression) {
+            if 
(!viewShuttledExpressionQueryBasedToGroupByExpressionMap.containsKey(expression))
 {
+                // query group expression is not in view group by expression
+                return false;
+            }
+            Expression chosenExpression = 
viewShuttledExpressionQueryBasedToGroupByExpressionMap.get(expression);
+            projects.add(chosenExpression instanceof NamedExpression
+                    ? (NamedExpression) chosenExpression : new 
Alias(chosenExpression));
+        }
+        LogicalProject<LogicalAggregate<Plan>> project = new 
LogicalProject<>(projects, viewAggregate);
+        // try to eliminate group by expression which is not in query group by 
expression
+        Plan rewrittenPlan = 
MaterializedViewUtils.rewriteByRules(cascadesContext,
+                childContext -> {
+                    Rewriter.getCteChildrenRewriter(childContext,
+                            ImmutableList.of(Rewriter.topDown(new 
EliminateGroupByKey()))).execute();

Review Comment:
   why need apply this rule seperately? rewrite the whole mv plan tree could 
not eliminate group by key?



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to