首页 >> 大全

Calcite的VolcanoPlanner调用流程简介

2023-10-06 大全 30 作者:考证青年

文章目录 总结

前言

之前分析过的调用以及Graph的变化,这次再来看看的的调用和的变化

从的单测不难发现,提供给用户直接调用的接口主要是、、三个

实际上更这三个方法都被封装在了中,用户一般直接使用#run或者实现自己的去调用这三个方法。

不只是会改变,也调用方法注册每个

如果有等价的,还会用merge方法合并两个等价的

如何调用_调用方式_

当执行完,已经持有每个对应的

中的有相同的,是的子集

并没有那么复杂,而是直接调用到了

如果是调用,否则会走一些列对处理

#将规则暂时存到了队列中

trait和root都设置好了可以开始找最优的计划了。确保根的转换ions注册物化相关的,.drive()会使用优化规则进行转换

将规则从取出(注册的时候放入的),调用到相应规则的方法

需要转换的时候会调用,也会触发新节点的注册(就会添加等价的,之后从等价的中找最优计划)

有些的方法进入后,判断完不适合转换会提前不会调用

总结

用dot图来表示如下:、主要是在注册激活对应的规则放入,从取出规则并应用。

因为注册的时候是递归调用,而且要考虑和,还要考虑是否等价,所以调用流程非常复杂。

附上dot的源码

# 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"}
}

关于我们

最火推荐

小编推荐

联系我们


版权声明:本站内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 88@qq.com 举报,一经查实,本站将立刻删除。备案号:桂ICP备2021009421号
Powered By Z-BlogPHP.
复制成功
微信号:
我知道了