前言
之前分析了Flink中如何使用Calcite的,这次再来看看Kylin。与Flink直接使用Calcite的社区版本不同,Kylin单独维护了一个自己版本的Calcite 这种方式优点是遇到能够更深入的开发一些社区不具备的功能,缺点是和社区同步升级成本较高(Calcite的社区版本已经到1.30.0了,Kylin还是在1.16.0的基础上发版)
文件概览
先粗略的看看Calcite解析优化query的几个阶段,Kylin都编写了哪些文件
Parse
Kylin只做DQL,又是比较严格的标准SQL,所以对Calcite在语法上的新增不多
Validate
Validate都是直接用的SqlValidatorImpl,而不是Flink那样继承SqlValidatorImpl 类型也只是稍微作了调整
convert
接下来的convert是用的SqlToRelConverter
optimize
没有新增HepPlanner和VolcanoPlanner,只是新增了一些OLAPRelNode
单测分析
在Kylin的单测中有一个QueryConnectionTest和Calcite的JdbcTest很像,但它只有一个测试方法 执行的流程和Calcite的差不多
Parse
SqlParserImpl也是用JavaCC代码生成的
Validate
validateQuery的入口,对SqlNode进行递归的校验
Convert
将SqlNode转为RelNode
Optimize
Convert完了后到Hepplanner进行优化,不过这个qury比较简单没什么需要优化的 大部分代码都直接复用着Calcite的,只是在某些细节进行调整并没有像Flink那样大量的继承重写某个Calcite的类
|