最近看优化器的代码,感觉bug有点多啊
TopDownVisitorRewriteJob.java
@Override
public void execute(JobContext jobContext) {
Plan originPlan = jobContext.getCascadesContext().getRewritePlan();
Optional<Rules> relateRules = getRelatedRules(originPlan, rules, jobContext.getCascadesContext());
if (!relateRules.isPresent()) {
return;
}
Plan root = rewrite(
null, -1, originPlan, jobContext, rules, false, new ProcessState(originPlan)
);
jobContext.getCascadesContext().setRewritePlan(root);
jobContext.getCascadesContext().setRewritePlan(root);
}
jobContext.getCascadesContext().setRewritePlan(root);写了两遍,relateRules没使用,把所有的规则都传进去了
/** getRelateRules */
public static Optional<Rules> getRelatedRules(Plan plan, Rules originRules, CascadesContext context) {
List<Rule> validRules = originRules.filterValidRules(context);
if (validRules.isEmpty()) {
return Optional.empty();
}
return Optional.of(originRules);
}
filterValidRules 方法应该是没副作用的,为什么直接就返回了originRules
FilteredRules.java
@Override
public List<Rule> filterValidRules(CascadesContext cascadesContext) {
BitSet disableRules = cascadesContext.getAndCacheDisableRules();
if (disableRules.isEmpty()) {
return allRules;
}
List<Rule> validRules = new ArrayList<>(allRules);
for (Rule rule : allRules) {
if (!disableRules.get(rule.getRuleType().type())) {
validRules.add(rule);
}
}
return validRules;
}
List validRules = new ArrayList<>(allRules); 这啥都没过滤后面的add还让规则重复了