calcite 是一个数据源管理工具,功能非常强大,且我们常用的多个框架底层都是基于他的实现,如:sharding jdbc。
这里以jdbcSchema 为例,讲解他的主要实现原理.比如我们编写以下sql,我们讲解他的执行原理:
select * from table1
这里我们查询了table1表,我们知道在calcite中,所有表都对应一个Table.
由此我们定位到对应的实现为JdbcTable,如下:
1)将sql 转换为关系代数
由此我们得出,在JdbcSchema中每个表是一个TranslatableTable。TranslatableTable提供了一个toRel方法,将上下文信息解析为要执行的关系代数:
这个说一下,calcite提供了SqlToRelConverter,将sql转换为关系代数,有兴趣的可以看下他的实现
2) 关系代数优化
这里主要是对查询条件优化,下沉处理,可以得到一个优化后关系代数。
若onMatch返回true匹配到对应的规则后则进行执行,具体可以看看RelOpRule的子类,有哪些规则。
2)将关系代数转换为sql
generateSql核心逻辑
calcite 通过JdbcImplementor 将关系代数先转换为一个sql的对象,再根据不同的方言,将sql对象再转换成sql语句。
JdbcImplementor也是一个访问器,是RelToSql转换器
sql真正生成在下面:
先转换成语句对象,再根据方法转换成对应的语法。
不同的操作有不同的实现类,以Select操作为例, 具体转换对应代码在:
根据上下文信息,输出sql语句的部分。
SqlWriter 定义了对象不同属性输出sql方法:
由具体的方言指定。