美文网首页
Calcite CBO ② - VolcanoPlanner 之

Calcite CBO ② - VolcanoPlanner 之

作者: 牛肉圆粉不加葱 | 来源:发表于2024-02-17 08:59 被阅读0次

    一、IterativeRuleQueue

    该算法不断的从 RuleQueue 中取出 Rule 并执行,该过程有两个退出条件:

    1. RuleQueue 空了:没有 Rule 需要执行了
    2. 超时:在规则执行时抛出 VolcanoTimeoutException 异常,当 VolcanoPlanner 的 cancelFlag 设置为 true 时会抛出这个异常,所以在使用如果觉得优化时间太长,超过一定时间可设置cancleFlag 为 true 强制优化结束

    IterativeRuleQueue 主要成员变量:

    • final MatchList matchList

    其中 MatchList 如下

    二、MatchList

    class MatchList {
    
      /**
       * 只能放 SubstitutionRule 对应的 RuleMatch
       * 为了能区分出来以优先执行 SubstitutionRules
       */
      private final Queue<VolcanoRuleMatch> preQueue = new ArrayDeque<>();
    
      // 新的非替换规则对应的 RuleMatch 被追加到这个队列的末尾
      // 先进先出,不以任何方式排序。
      private final Queue<VolcanoRuleMatch> queue = new ArrayDeque<>();
    
      /**
       * Multi-map of RelSubset to VolcanoRuleMatches.
       */
      // multimap 容器保存的是有序的键/值对,但它可以保存重复的元素
      // multimap 中会出现具有相同键的元素序列,它们会被添加到容器
      final Multimap<RelSubset, VolcanoRuleMatch> matchMap =
          HashMultimap.create();
    
      // 优先把替换规则对应的 RuleMatch 拿出来
      @Nullable VolcanoRuleMatch poll() {
        VolcanoRuleMatch match = preQueue.poll();
        if (match == null) {
          match = queue.poll();
        }
        return match;
      }
    
      void offer(VolcanoRuleMatch match) {
        if (match.getRule() instanceof SubstitutionRule) {
          preQueue.offer(match);
        } else {
          queue.offer(match);
        }
      }
    
    }
    

    可以看到 matchList 如下,(如之前 setRoot 中所述)越底下的节点的 class 对应的 RuleMatch 在 matchList 中越前面

    三、IterativeRuleDriver#drive() 核心流程

    注①:什么情况下 rel 会被剪枝?

    注②propagateCostImprovements(rel) 是按需递归更新 parents 的 cost,比如 rel 的 bestCost 发生变化导致爸爸的 bestCost 发生变化,则会进一步更新爷爷的;如果没有导致爸爸的 bestCost 变化,则不会去更新爸爸的和爷爷的 cost

    最终的到这样一个 RelSet Tree:

    相关文章

      网友评论

          本文标题:Calcite CBO ② - VolcanoPlanner 之

          本文链接:https://www.haomeiwen.com/subject/mppnodtx.html