morrySnow commented on code in PR #40803:
URL: https://github.com/apache/doris/pull/40803#discussion_r1764522779
##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/AbstractMaterializedViewAggregateRule.java:
##########
@@ -324,6 +326,46 @@ protected Expression tryRewriteExpression(StructInfo
queryStructInfo, Expression
return rewrittenExpression;
}
+ /**
+ * Not all query after rewritten successfully can compensate union all
+ * Such as:
+ * mv def sql is as following, partition column is a
+ * select a, b, count(*) from t1 group by a, b
+ * Query is as following:
+ * select b, count(*) from t1 group by b, after rewritten by materialized
view successfully
+ * If mv part partition is invalid, can not compensate union all, because
result is wrong after
+ * compensate union all.
+ */
+ @Override
+ protected boolean canUnionRewrite(Plan queryPlan, MTMV mtmv,
CascadesContext cascadesContext) {
+ // check query plan is contain the partition column
+ Optional<LogicalAggregate<Plan>> logicalAggregateOptional =
+ queryPlan.collectFirst(planTreeNode -> planTreeNode instanceof
LogicalAggregate);
+ if (!logicalAggregateOptional.isPresent()) {
+ return true;
+ }
+
+ List<Expression> groupByExpressions =
logicalAggregateOptional.get().getGroupByExpressions();
+ if (groupByExpressions.isEmpty()) {
+ // Scalar aggregate can not compensate union all
+ return false;
+ }
+ String relatedCol = mtmv.getMvPartitionInfo().getRelatedCol();
+ boolean canUnionRewrite = false;
+ // Check the query plan group by expression contains partition col or
not
+ List<? extends Expression> groupByShuttledExpressions =
+
ExpressionUtils.shuttleExpressionWithLineage(groupByExpressions, queryPlan, new
BitSet());
+ for (Expression expression : groupByShuttledExpressions) {
+ canUnionRewrite = !expression.collectToSet(expr -> expr instanceof
SlotReference
+ && ((SlotReference) expr).isColumnFromTable()
+ && ((SlotReference)
expr).getColumn().get().getName().equals(relatedCol)).isEmpty();
Review Comment:
check table name too
--
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]