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 相关文章推荐
Apache POI的基本使用详解
Nov 07 Servers
详解使用内网穿透工具Ngrok代理本地服务
Mar 31 Servers
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
Apr 07 Servers
Docker 镜像介绍以及commit相关操作
Apr 13 Servers
安装Windows Server 2012 R2企业版操作系统并设置好相关参数
Apr 29 Servers
Nginx 常用配置
May 15 Servers
聊聊配置 Nginx 访问与错误日志的问题
May 25 Servers
Windows Server 2022 超融合部署(图文教程)
Jun 25 Servers
Windows Server 修改远程桌面端口的实现
Jun 25 Servers
nginx之queue的具体使用
Jun 28 Servers
使用 DataAnt 监控 Apache APISIX的原理解析
Jul 07 Servers
Win10系统搭建ftp文件服务器详细教程
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
Ajax PHP 边学边练 之三 数据库
2009/11/26 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
jQuery渐变发光导航菜单的实例代码
2013/03/27 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
JS实现很酷的EMAIL地址添加功能实例
2015/02/28 Javascript
原生js实现类似弹窗抖动效果
2015/04/02 Javascript
JS实现的最简Table选项卡效果
2015/10/14 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
BootStrap扔进Django里的方法详解
2016/05/13 Javascript
D3.js实现饼状图的方法详解
2016/09/21 Javascript
JavaScript利用正则表达式替换字符串中的内容
2016/12/12 Javascript
微信小程序联网请求的轮播图
2017/07/07 Javascript
微信小程序自定义模态对话框实例详解
2017/08/16 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
对vuex中getters计算过滤操作详解
2019/11/06 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
[00:36]DOTA2上海特级锦标赛 Alliance战队宣传片
2016/03/04 DOTA
[54:54]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
python通过floor函数舍弃小数位的方法
2015/03/17 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python实现复制文件到指定目录
2019/10/16 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
女性时尚网购:Chic Me
2019/07/30 全球购物
秋季运动会广播稿
2014/02/22 职场文书
六五普法规划实施方案
2014/03/21 职场文书
小学生作文评语大全
2014/04/21 职场文书
少先队工作总结2015
2015/05/13 职场文书
会计专业2019暑假实习报告
2019/06/21 职场文书
PHP 技巧 * SVG 保存为图片(分享图生成)
2021/04/02 PHP
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏