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]