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配置并兼容HTTP实现代码解析
Mar 31 Servers
Nginx下SSL证书安装部署步骤介绍
Dec 06 Servers
Nginx性能优化之Gzip压缩设置详解(最大程度提高页面打开速度)
Feb 12 Servers
CentOS下安装Jenkins的完整步骤
Apr 07 Servers
Nginx+Tomcat负载均衡多实例详解
Apr 11 Servers
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
Apr 29 Servers
docker 制作mysql镜像并自动安装
May 20 Servers
讨论nginx location 顺序问题
May 30 Servers
Windows10安装Apache2.4的方法步骤
Jun 25 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
GPU服务器的多用户配置方法
Jul 07 Servers
Docker容器harbor私有仓库部署和管理
Aug 05 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基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
用jscript实现列出安装的软件列表
2007/06/18 Javascript
ASP.NET jQuery 实例17 通过使用jQuery validation插件校验ListBox
2012/02/03 Javascript
jquery必须知道的一些常用特效方法及使用示例(整理)
2013/06/24 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
jQuery实现限制textarea文本框输入字符数量的方法
2015/05/28 Javascript
页面内容排序插件jSort使用方法
2015/10/10 Javascript
Seajs 简易文档 提供简单、极致的模块化开发体验
2016/04/13 Javascript
详解在React里使用&quot;Vuex&quot;
2018/04/02 Javascript
React Form组件的实现封装杂谈
2018/05/07 Javascript
vue配置多页面的实现方法
2018/05/22 Javascript
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
微信小程序可滑动月日历组件使用详解
2019/10/21 Javascript
[02:32]【DOTA2亚洲邀请赛】iceice,梦开始的地方
2017/03/13 DOTA
15行Python代码实现网易云热门歌单实例教程
2019/03/10 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
python操作yaml说明
2020/04/08 Python
python程序如何进行保存
2020/07/03 Python
浅析HTML5中的download属性使用
2019/03/13 HTML / CSS
欧洲领先的电子和电信零售商和服务提供商:Currys PC World Business
2017/12/05 全球购物
美国球鞋寄卖网站:Stadium Goods
2018/05/09 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
C面试题
2015/10/08 面试题
实习教师自我鉴定
2013/12/12 职场文书
2014年端午节活动方案
2014/03/11 职场文书
旅游安全协议书
2014/04/21 职场文书
农民工工资承诺书大全
2015/05/04 职场文书
化验室安全管理制度
2015/08/06 职场文书
《植物妈妈有办法》教学反思
2016/02/23 职场文书
《秋思》教学反思
2016/02/23 职场文书
小学一年级语文教学反思
2016/03/03 职场文书
关于销售人员的年终工作总结要点
2019/08/15 职场文书
TV动画《八十龟酱观察日记》第四季宣传PV公布
2022/04/06 日漫
Valheim服务器 Mod修改安装教程 【ValheimPlus】
2022/12/24 Servers