Cascades 优化器经过严格验证吗

Viewed 12

最近看优化器的代码,感觉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还让规则重复了

1 Answers

可能不影响正确性,但总归看着不对劲