上层尽量简单的封装请求,所以它定义为标准的SQL,代码里告诉Calcite,虚拟出来的表是什么、字段是什么、字段类型是什么等,整体抽象为一个个Schema,对于我们来说就查Calcite虚拟出来东西,不用关心底层真正对接了哪些数据源,底层通过定义各种adapter,来对接不同的查询和存储引擎
自定义解析
- 创建模型,model.json
- 自定义SchemaFactory,CsvSchemaFactory
- 自定义Schema,CsvSchema
- 自定义Table,CsvTable、CsvScannableTable
- 自定义Enumerator,CsvEnumerator
Calcite 主要功能
SQL 解析
SQL 校验
查询优化
SQL 生成器
数据连接
Catelog: 主要定义SQL语义相关的元数据与命名空间。
SQL parser: 主要是把SQL转化成AST.
SQL validator: 通过Catalog来校证AST.
Query optimizer: 将AST转化成物理执行计划、优化物理执行计划.
SQL generator: 反向将物理执行计划转化成SQL语句.
属性 描述
approximateDecimal 是否可以接受DECIMAL类型上的聚合函数的近似结果
approximateDistinctCount 是否可以接受聚合函数COUNT(DISTINCT …)的近似结果
approximateTopN 是否可以接受”TopN”查询(ORDER BY aggFun() DESC LIMIT n)的近似结果
caseSensitive 标识符是否区分大小写。如果未指定,则使用来自于lex的值。
conformance SQL一致性级别。值:DEFAULT(默认,类似于PRAGMATIC_2003),LENIENT,MYSQL_5,ORACLE_10,ORACLE_12,PRAGMATIC_99,PRAGMATIC_2003,STRICT_92,STRICT_99,STRICT_2003,SQL_SERVER_2008。
createMaterializations Calcite是否创建物化的东西。默认false
defaultNullCollation 如果在查询中既不指定NULLS FIRST也不指定NULLS LAST,应如何对NULL值进行排序。缺省值为HIGH,与Oracle相同,对NULL值进行排序。
druidFetch 执行一次SELECT查询时,Druid适配器应该读取多少行。
forceDecorrelate 计划器是否应该尽可能地相互关联。默认为true。
fun 内置函数和运算符的集合。有效值是“标准”(默认),“oracle”,“空间”,并可以使用逗号连接组合,例如“oracle,spatial”。
lex 词汇(关键字)策略。值是ORACLE(默认),MYSQL,MYSQL_ANSI,SQL_SERVER,JAVA。
materializationsEnabled Calcite是否使用物化的东西。默认false
model JSON模型文件的URI
parserFactory 解析器工厂。实现SqlParserImplFactory 接口的类的名称,并且有一个公有的默认构造方法或者INSTANCE常量
quoting 如何引用标识符。值是DOUBLE_QUOTE,BACK_QUOTE,BRACKET。如果未指定,则使用来自于lex的值。
quotedCasing 如何存储使用了引号的标识符。值是UNCHANGED, TO_UPPER, TO_LOWER。如果未指定,则使用来自于lex的值。
schema 初始化schema名称
schemaFactory Schema工厂。实现SchemaFactory接口的类的名称,并且有一个公有的默认构造方法或者INSTANCE常量。如果指定了model,此属性会被忽略。
schemaType Schema类型。值必须是“MAP”(默认值),“JDBC”或“CUSTOM”。(如果schemaFactory指定则隐式指定为CUSTOM类型)如果指定了model,此属性会被忽略。
spark 指定是否应将Spark用作无法推送到源系统的处理引擎。如果为false(默认值),则Calcite将生成实现了Enumerable接口的代码。
timeZone 时区,例如“gmt-3”。默认是JVM的时区。
typeSystem 类型系统。实现了接口RelDataTypeSystem的类的名称,并具有公有的默认构造函数或INSTANCE常量。
unquotedCasing 如果标识符未被引用,如何存储。有效值是UNCHANGED,TO_UPPER,TO_LOWER。如果未指定,则使用来自于lex的值。