calcite jdbcSchema源码级分析

calcite 是一个数据源管理工具,功能非常强大,且我们常用的多个框架底层都是基于他的实现,如:sharding jdbc。

这里以jdbcSchema 为例,讲解他的主要实现原理.比如我们编写以下sql,我们讲解他的执行原理:

  select * from table1

这里我们查询了table1表,我们知道在calcite中,所有表都对应一个Table.

由此我们定位到对应的实现为JdbcTable,如下:


image.png

1)将sql 转换为关系代数

由此我们得出,在JdbcSchema中每个表是一个TranslatableTable。TranslatableTable提供了一个toRel方法,将上下文信息解析为要执行的关系代数:


image.png

这个说一下,calcite提供了SqlToRelConverter,将sql转换为关系代数,有兴趣的可以看下他的实现


image.png

2) 关系代数优化

这里主要是对查询条件优化,下沉处理,可以得到一个优化后关系代数。


image.png

若onMatch返回true匹配到对应的规则后则进行执行,具体可以看看RelOpRule的子类,有哪些规则。

2)将关系代数转换为sql

image.png

generateSql核心逻辑


image.png

calcite 通过JdbcImplementor 将关系代数先转换为一个sql的对象,再根据不同的方言,将sql对象再转换成sql语句。

JdbcImplementor也是一个访问器,是RelToSql转换器


image.png

sql真正生成在下面:


image.png

先转换成语句对象,再根据方法转换成对应的语法。

不同的操作有不同的实现类,以Select操作为例, 具体转换对应代码在:


image.png

根据上下文信息,输出sql语句的部分。
SqlWriter 定义了对象不同属性输出sql方法:

由具体的方言指定。

image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容