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