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 相关文章推荐
使用goaccess分析nginx日志的详细方法
Jul 09 Servers
Nginx+Tomcat负载均衡集群的实现示例
Oct 24 Servers
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
Apr 07 Servers
nginx.conf配置文件结构小结
Apr 08 Servers
centos7安装mysql5.7经验记录
May 02 Servers
使用Nginx的访问日志统计PV与UV
May 06 Servers
Linux中文件的基本属性介绍
Jun 01 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
Nginx报404错误的详细解决方法
Jul 23 Servers
win7配置本地ftp服务器的图文教程
Aug 05 Servers
ssh服务器拒绝了密码 请再试一次已解决(亲测有效)
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 XPath对XML文件查找及修改实现代码
2011/07/27 PHP
PHP类的反射用法实例
2014/11/03 PHP
PHP中的数组处理函数实例总结
2016/01/09 PHP
PHP创建/删除/复制文件夹、文件
2016/05/03 PHP
PHP面相对象中的重载与重写
2017/02/13 PHP
THINKPHP5分页数据对象处理过程解析
2020/10/28 PHP
EASYUI TREEGRID异步加载数据实现方法
2012/08/22 Javascript
jQuery scroll事件实现监控滚动条分页示例
2014/04/04 Javascript
详解javascript传统方法实现异步校验
2016/01/22 Javascript
JavaScript html5 canvas绘制时钟效果
2016/03/01 Javascript
js 判断一组日期是否是连续的简单实例
2016/07/11 Javascript
vue制作加载更多功能的正确打开方式
2016/10/12 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
自定义require函数让浏览器按需加载Js文件
2016/11/24 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
微信小程序结合mock.js实现后台模拟及调试
2019/03/28 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
python中的yield使用方法
2014/02/11 Python
使用Python生成随机密码的示例分享
2016/02/18 Python
python生成器,可迭代对象,迭代器区别和联系
2018/02/04 Python
对Python3中的print函数以及与python2的对比分析
2018/05/02 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python程序包的构建和发布过程示例详解
2019/06/09 Python
基于python实现简单网页服务器代码实例
2020/09/14 Python
盛大笔试题
2016/11/05 面试题
WebSphere面试题:在WebSphere里面如何部署一个应用
2015/08/02 面试题
读书活动实施方案
2014/03/10 职场文书
公司委托书格式范文
2014/04/04 职场文书
大型营销活动计划书
2014/04/28 职场文书
公民代理授权委托书
2014/09/24 职场文书
就业意向书范本
2015/05/11 职场文书
勇敢的心观后感
2015/06/09 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
2019朋友新婚祝福语精选
2019/10/10 职场文书