Apache Calcite 实现方言转换的代码


Posted in Servers onApril 24, 2021

定义

Calcite能够通过解析Sql为SqlNode,再将SqlNode转化为特定数据库的方言的形式实现Sql的统一。

实现

在Calcite中实现方言转换的主要类是SqlDialect基类,其具体的变量含义如下:

public class SqlDialect {

BUILT_IN_OPERATORS_LIST: 支持的内置定义函数或者运算符(例如:abs and..)

// 列 表的标识符
String identifierQuoteString:    标识符的开始符号
String identifierEndQuoteString: 标识符的结束符号
String identifierEscapedQuote: (暂时没有弄明白这个在做什么,像是字符串中的转义符?)

// 常量的标识符
String literalQuoteString:    常量的开始符号
String literalEndQuoteString: 常量的结束符号
String literalEscapedQuote:(暂时没有弄明白这个在做什么,像是字符串中的转义符?)

DatabaseProduct databaseProduct: 所属的数据库产品
NullCollation nullCollation: 在进行排序查询式,空值的返回顺序
RelDataTypeSystem dataTypeSystem: 数据类型

// 和解析相关
Casing unquotedCasing: 大小写转换
Casing quotedCasing: 大小写转换
boolean caseSensitive: 是否大小写敏感(列名 表明 函数名等)
}
// 方法区(不同的数据源根据细节的不同实现自定义的复写方法)
allowsAs
configureParser
configureParser
containsNonAscii
create
defaultNullDirection
emptyContext
emulateJoinTypeForCrossJoin
emulateNullDirection
emulateNullDirectionWithIsNull
getCalendarPolicy
getCastSpec
getConformance
getDatabaseProduct
getNullCollation
getProduct
getQuotedCasing
getQuoting
getSingleRowTableName
getTypeSystem
getUnquotedCasing
hasImplicitTableAlias
identifierNeedsQuote
isCaseSensitive
quoteIdentifier
quoteIdentifier
quoteIdentifier
quoteStringLiteral
quoteStringLiteral
quoteStringLiteralUnicode
quoteTimestampLiteral
requiresAliasForFromItems
rewriteSingleValueExpr
supportsAggregateFunction
supportsAliasedValues
supportsCharSet
supportsDataType
supportsFunction
supportsGroupByWithCube
supportsGroupByWithRollup
supportsImplicitTypeCoercion
supportsNestedAggregations
supportsOffsetFetch
supportsWindowFunctions
unparseCall
unparseDateTimeLiteral
unparseFetchUsingAnsi
unparseFetchUsingLimit
unparseLimit
unparseOffset
unparseOffsetFetch
unparseSqlDatetimeArithmetic
unparseSqlIntervalLiteral
unparseSqlIntervalQualifier
unparseTopN
unquoteStringLiteral

使用方式Demo

/** Returns SqlNode for type in "cast(column as type)", which might be
  * different between databases by type name, precision etc.
  *
  * <p>If this method returns null, the cast will be omitted. In the default
  * implementation, this is the case for the NULL type, and therefore
  * {@code CAST(NULL AS <nulltype>)} is rendered as {@code NULL}. */
  public SqlNode getCastSpec(RelDataType type)

  这个方法就可以根据具体的数据源的数据类型进行转换,例如:

  @Override public SqlNode getCastSpec(RelDataType type) {
    switch (type.getSqlTypeName()) {
    case VARCHAR:
      // MySQL doesn't have a VARCHAR type, only CHAR.
      int vcMaxPrecision = this.getTypeSystem().getMaxPrecision(SqlTypeName.CHAR);
      int precision = type.getPrecision();
      if (vcMaxPrecision > 0 && precision > vcMaxPrecision) {
        precision = vcMaxPrecision;
      }
      return new SqlDataTypeSpec(
          new SqlBasicTypeNameSpec(SqlTypeName.CHAR, precision, SqlParserPos.ZERO),
          SqlParserPos.ZERO);
    }
    return super.getCastSpec(type);
  }

  就可以经Sql中的Cast语句Cast为特定的类型:

  final String query = "select cast(\"product_id\" as varchar(50)), \"product_id\" "
       + "from \"product\" ";
   final String expected = "SELECT CAST(`product_id` AS CHAR(50)), `product_id`\n"
       + "FROM `foodmart`.`product`";
// 解析过的SqlNode
sqlNode.toSqlString(CalciteSqlDialect.DEFAULT).getSql();

到此这篇关于Apache Calcite 实现方言转换的代码的文章就介绍到这了,更多相关Apache Calcite方言转换内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Servers 相关文章推荐
nginx proxy_cache 缓存配置详解
Mar 31 Servers
nginx里的rewrite跳转的实现
Mar 31 Servers
Nginx本地目录映射实现代码实例
Mar 31 Servers
Nginx四层负载均衡的配置指南
Jun 11 Servers
Apache Hudi数据布局黑科技降低一半查询时间
Mar 31 Servers
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
Apr 07 Servers
nginx搭建NFS网络文件系统
Apr 14 Servers
IIS服务器中设置HTTP重定向访问HTTPS
Apr 29 Servers
KVM基础命令详解
Apr 30 Servers
centos环境下nginx高可用集群的搭建指南
Jul 23 Servers
apache虚拟主机配置的三种方式(小结)
Jul 23 Servers
nginx配置指令之server_name的具体使用
Aug 14 Servers
apache基于端口创建虚拟主机的示例
Apr 24 #Servers
Nginx进程管理和重载原理详解
详解Apache SkyWalking 告警配置指南
Apr 22 #Servers
apache基于端口创建虚拟主机的示例
Apr 22 #Servers
Nginx使用X-Accel-Redirect实现静态文件下载的统计、鉴权、防盗链、限速等
Apr 04 #Servers
Nginx工作原理和优化总结。
利用Nginx代理如何解决前端跨域问题详析
Apr 02 #Servers
You might like
php使用GD创建保持宽高比缩略图的方法
2015/04/17 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
Yii快速入门经典教程
2015/12/28 PHP
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
jquery链式操作的正确使用方法
2014/01/06 Javascript
使用jquery选择器如何获取父级元素、同级元素、子元素
2014/05/14 Javascript
javascript如何定义对象数组
2016/06/07 Javascript
jQuery模仿京东/天猫商品左侧分类导航菜单效果
2016/06/29 Javascript
js制作网站首页图片轮播特效代码
2016/08/30 Javascript
jQuery绑定事件的四种方式介绍
2016/10/31 Javascript
Bootstrap中data-target 到底是什么
2017/02/14 Javascript
vue中页面跳转拦截器的实现方法
2017/08/23 Javascript
详解vue-cil和webpack中本地静态图片的路径问题解决方案
2017/09/27 Javascript
AngularJS中table表格基本操作示例
2017/10/10 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
koa-router路由参数和前端路由的结合详解
2019/05/19 Javascript
小程序中canvas的drawImage方法参数使用详解
2019/07/04 Javascript
layui关闭弹窗后刷新主页面和当前更改项的例子
2019/09/06 Javascript
微信小程序实现下滑到底部自动翻页功能
2020/03/07 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
python实现将内容分行输出
2015/11/05 Python
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
2018/08/25 Python
对Python2与Python3中__bool__方法的差异详解
2018/11/01 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
澳大利亚UGG工厂直销:Australian Ugg Boots
2017/10/14 全球购物
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
捷克移动配件网上商店:ProMobily.cz
2019/03/15 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
我的珠宝盒:Ma boîte à bijoux
2019/08/27 全球购物
单位办理社保介绍信
2014/01/10 职场文书
cf收人广告词大全
2014/03/14 职场文书
老公保证书范文
2014/04/29 职场文书
初三新学期计划书
2014/05/03 职场文书
PHP基本语法
2021/03/31 PHP