seawinde commented on code in PR #63899:
URL: https://github.com/apache/doris/pull/63899#discussion_r3628813879


##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/PartitionIncrementMaintainer.java:
##########
@@ -743,6 +762,64 @@ public Plan getOriginalPlan() {
             return originalPlan;
         }
 
+        private Expression shuttleExpressionWithLineage(Expression expression, 
Plan plan) {
+            return shuttleExpressionWithLineage(ImmutableList.of(expression), 
plan).get(0);
+        }
+
+        private List<? extends Expression> shuttleExpressionWithLineage(List<? 
extends Expression> expressions,
+                Plan plan) {
+            if (expressions.isEmpty()) {
+                return ImmutableList.of();
+            }
+            ExpressionLineageReplacer.ExpressionReplaceContext replaceContext =
+                    new 
ExpressionLineageReplacer.ExpressionReplaceContext(expressions);
+            for (NamedExpression namedExpression : 
getLineageExpressionIndex(plan)) {
+                if 
(!replaceContext.getUsedExprIdSet().contains(namedExpression.getExprId())) {
+                    continue;
+                }
+                
namedExpression.accept(ExpressionLineageReplacer.NamedExpressionCollector.INSTANCE,
 replaceContext);
+            }
+            List<? extends Expression> replacedExpressions = 
replaceContext.getReplacedExpressions();
+            if (replacedExpressions == null || expressions.size() != 
replacedExpressions.size()) {

Review Comment:
   已在 f2ae6ae 中删除。getReplacedExpressions() 的返回数量始终与输入一致,这里的 fallback 不会生效。



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/PartitionIncrementMaintainer.java:
##########
@@ -683,8 +690,19 @@ public static final class PartitionIncrementCheckContext {
         private final Set<Set<Slot>> shuttledEqualSlotSet = new HashSet<>();
         private final Map<CTEId, Plan> producerCteIdToPlanMap;
         private final Plan originalPlan;
+        // Cache lineage-visible named expressions per plan identity to avoid 
repeated full plan walks.
+        private final Map<Plan, List<NamedExpression>> 
planLineageExpressionIndexes = new IdentityHashMap<>();
+        // Cache normalized expressions within this check context; 
normalization uses the same CascadesContext.
+        private final Map<Expression, Expression> normalizedExpressionMap = 
new IdentityHashMap<>();

Review Comment:
   已在 f2ae6ae 中删除 normalizedExpressionMap,直接执行 normalization。



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/PartitionIncrementMaintainer.java:
##########
@@ -743,6 +762,64 @@ public Plan getOriginalPlan() {
             return originalPlan;
         }
 
+        private Expression shuttleExpressionWithLineage(Expression expression, 
Plan plan) {
+            return shuttleExpressionWithLineage(ImmutableList.of(expression), 
plan).get(0);
+        }
+
+        private List<? extends Expression> shuttleExpressionWithLineage(List<? 
extends Expression> expressions,
+                Plan plan) {
+            if (expressions.isEmpty()) {
+                return ImmutableList.of();
+            }
+            ExpressionLineageReplacer.ExpressionReplaceContext replaceContext =
+                    new 
ExpressionLineageReplacer.ExpressionReplaceContext(expressions);
+            for (NamedExpression namedExpression : 
getLineageExpressionIndex(plan)) {
+                if 
(!replaceContext.getUsedExprIdSet().contains(namedExpression.getExprId())) {
+                    continue;
+                }
+                
namedExpression.accept(ExpressionLineageReplacer.NamedExpressionCollector.INSTANCE,
 replaceContext);
+            }
+            List<? extends Expression> replacedExpressions = 
replaceContext.getReplacedExpressions();
+            if (replacedExpressions == null || expressions.size() != 
replacedExpressions.size()) {
+                return 
ExpressionUtils.shuttleExpressionWithLineage(expressions, plan);
+            }
+            return replacedExpressions;
+        }
+
+        private List<? extends Expression> 
shuttleAndNormalizeExpressionWithLineage(
+                Collection<? extends Expression> expressions, Plan plan) {
+            if (expressions.isEmpty()) {
+                return ImmutableList.of();
+            }
+            List<? extends Expression> shuttledExpressions =
+                    
shuttleExpressionWithLineage(ImmutableList.copyOf(expressions), plan);
+            List<Expression> normalizedExpressions = new 
ArrayList<>(shuttledExpressions.size());
+            for (Expression expression : shuttledExpressions) {
+                normalizedExpressions.add(normalizeExpression(expression));
+            }
+            return normalizedExpressions;
+        }
+
+        private Expression normalizeExpression(Expression expression) {
+            Expression normalizedExpression = 
normalizedExpressionMap.get(expression);
+            if (normalizedExpression == null) {
+                normalizedExpression = 
expressionNormalization.rewrite(expression, expressionRewriteContext);
+                normalizedExpressionMap.put(expression, normalizedExpression);
+            }
+            return normalizedExpression;
+        }
+
+        private List<NamedExpression> getLineageExpressionIndex(Plan plan) {
+            List<NamedExpression> lineageExpressionIndex = 
planLineageExpressionIndexes.get(plan);
+            if (lineageExpressionIndex == null) {
+                List<NamedExpression> collectedIndex = new ArrayList<>();
+                plan.accept(LineageExpressionCollector.INSTANCE, 
collectedIndex);
+                lineageExpressionIndex = ImmutableList.copyOf(collectedIndex);

Review Comment:
   已在 f2ae6ae 中删除 ImmutableList.copyOf(collectedIndex),直接缓存本地构造的 collectedIndex。



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/PartitionIncrementMaintainer.java:
##########
@@ -743,6 +762,64 @@ public Plan getOriginalPlan() {
             return originalPlan;
         }
 
+        private Expression shuttleExpressionWithLineage(Expression expression, 
Plan plan) {
+            return shuttleExpressionWithLineage(ImmutableList.of(expression), 
plan).get(0);
+        }
+
+        private List<? extends Expression> shuttleExpressionWithLineage(List<? 
extends Expression> expressions,
+                Plan plan) {
+            if (expressions.isEmpty()) {
+                return ImmutableList.of();
+            }
+            ExpressionLineageReplacer.ExpressionReplaceContext replaceContext =
+                    new 
ExpressionLineageReplacer.ExpressionReplaceContext(expressions);
+            for (NamedExpression namedExpression : 
getLineageExpressionIndex(plan)) {
+                if 
(!replaceContext.getUsedExprIdSet().contains(namedExpression.getExprId())) {
+                    continue;
+                }
+                
namedExpression.accept(ExpressionLineageReplacer.NamedExpressionCollector.INSTANCE,
 replaceContext);
+            }
+            List<? extends Expression> replacedExpressions = 
replaceContext.getReplacedExpressions();
+            if (replacedExpressions == null || expressions.size() != 
replacedExpressions.size()) {
+                return 
ExpressionUtils.shuttleExpressionWithLineage(expressions, plan);
+            }
+            return replacedExpressions;
+        }
+
+        private List<? extends Expression> 
shuttleAndNormalizeExpressionWithLineage(
+                Collection<? extends Expression> expressions, Plan plan) {
+            if (expressions.isEmpty()) {
+                return ImmutableList.of();
+            }
+            List<? extends Expression> shuttledExpressions =
+                    
shuttleExpressionWithLineage(ImmutableList.copyOf(expressions), plan);

Review Comment:
   这里保留 ImmutableList.copyOf。下层接口接收 List,而这里的入口是 Collection,需要在这里完成类型转换。改成 new 
ArrayList<>(expressions) 同样需要一次 O(n) 拷贝,而且会引入可变列表,没有收益。



##########
fe/fe-core/src/main/java/org/apache/doris/nereids/rules/exploration/mv/PartitionIncrementMaintainer.java:
##########
@@ -772,6 +849,25 @@ public Void 
visitLogicalCatalogRelation(LogicalCatalogRelation relation,
         }
     }
 
+    private static final class LineageExpressionCollector extends 
DefaultPlanVisitor<Void, List<NamedExpression>> {

Review Comment:
   这里不抽公共工具。NondeterministicFunctionCollector 和 RelationCollector 
的收集目标不同;ExpressionLineageReplacer 是遍历时根据 usedExprIdSet 直接完成替换,当前 collector 
只负责建立本次 context 使用的 NamedExpression index,并跳过 GroupPlan。它们没有统一的复用语义,抽取会扩大改动范围。



-- 
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