Calcite的VolcanoPlanner调用流程简介

文章目录总结
前言
之前分析过的调用以及Graph的变化 , 这次再来看看的的调用和的变化
从的单测不难发现 , 提供给用户直接调用的接口主要是、、三个
实际上更这三个方法都被封装在了中 , 用户一般直接使用#run或者实现自己的去调用这三个方法 。
不只是会改变 , 也调用方法注册每个
如果有等价的 , 还会用merge方法合并两个等价的

Calcite的VolcanoPlanner调用流程简介

文章插图
当执行完 , 已经持有每个对应的
中的有相同的 , 是的子集
并没有那么复杂 , 而是直接调用到了
如果是调用 , 否则会走一些列对处理
#将规则暂时存到了队列中
trait和root都设置好了可以开始找最优的计划了 。确保根的转换ions注册物化相关的 , .drive()会使用优化规则进行转换
将规则从取出(注册的时候放入的) , 调用到相应规则的方法
需要转换的时候会调用 , 也会触发新节点的注册(就会添加等价的 , 之后从等价的中找最优计划)
有些的方法进入后 , 判断完不适合转换会提前不会调用
总结
用dot图来表示如下:、主要是在注册激活对应的规则放入 , 从取出规则并应用 。
因为注册的时候是递归调用 , 而且要考虑和 , 还要考虑是否等价 , 所以调用流程非常复杂 。
附上dot的源码
【Calcite的VolcanoPlanner调用流程简介】# http://www.graphviz.org/content/clusterdigraph G {subgraph cluster_0 {changeTraits -> ensureRegistered ;onRegister -> ensureRegistered;registerImpl -> onRegister;registerImpl -> registerSubset[label = "RelSubset"];registerImpl -> addRelToSet;registerImpl -> "apDigestToRel.putIfAbsent";registerImpl -> fireRule;subgraph cluster_2 {label = "not RelSubset"onRegister;addRelToSet;"apDigestToRel.putIfAbsent";fireRule;}register -> ensureRegistered[label = "equivRel!=null"];register -> registerImpl[label = "equivRel==null"];ensureRegistered -> register[label = "subset==null" ];ensureRegistered -> merge[label = "equivRel!=null"] ;ensureRegistered -> canonize;subgraph cluster_1 {label = "subset!=null "merge;canonize;}findBestExp -> ensureRootConverters;ensureRootConverters -> register[label = "AbstractConverter"];findBestExp -> registerMaterializations -> registerImpl;setRoot -> registerImpl;subgraph cluster_3 {label = "";changeTraits;setRoot;findBestExp;}label = "VolcanoPlanner";}fireRule -> addMatch[label = "......"];subgraph cluster_4 {label = "IterativeRuleQueue";"popMatch";"addMatch"}findBestExp -> "drive";"drive" -> "popMatch";"drive" -> "match.onMatch" -> "getRule().onMatch";"getRule().onMatch" -> "transformTo"[label = "......"];transformTo -> ensureRegistered[label = "......"];subgraph cluster_5 {label = "IterativeRuleDriver";drive}subgraph cluster_6 {label = "VolcanoRuleMatch""match.onMatch"}subgraph cluster_7 {label = "ConverterRule""getRule().onMatch"}subgraph cluster_8 {label = "RelOptRuleCall""transformTo"}}