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的rewrite
Mar 09 Servers
Apache压力测试工具的安装使用
Mar 31 Servers
nginx 多个location转发任意请求或访问静态资源文件的实现
Mar 31 Servers
nginx 防盗链防爬虫配置详解
Mar 31 Servers
Apache Pulsar结合Hudi构建Lakehouse方案分析
Mar 31 Servers
Kubernetes关键组件与结构组成介绍
Mar 31 Servers
Windows和Linux上部署Golang并运行程序
Apr 22 Servers
shell进度条追踪指令执行时间的场景分析
Jun 16 Servers
服务器SVN搭建图文安装过程
Jun 21 Servers
windows server2008 开启端口的实现方法
Jun 25 Servers
Windows Server 2016服务器用户管理及远程授权图文教程
Aug 14 Servers
CentOS7 minimal 最小化安装网络设置过程
Dec 24 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四舍五入、取整、round函数使用示例
2015/02/06 PHP
html下载本地
2006/06/19 Javascript
JS模拟多线程
2007/02/07 Javascript
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
浅析JavaScript中的typeof运算符
2013/11/30 Javascript
input禁止键盘及中文输入,但可以点击
2014/02/13 Javascript
js单词形式的运算符
2014/05/06 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
javascript监听页面刷新和页面关闭事件方法详解
2017/01/09 Javascript
vue项目在安卓低版本机显示空白的原因分析(两种)
2018/09/04 Javascript
Vue移动端右滑屏幕返回上一页附源码下载
2019/06/26 Javascript
vue+elementUI组件table实现前端分页功能
2020/11/15 Javascript
vue调用微信JSDK 扫一扫,相册等需要注意的事项
2021/01/03 Vue.js
[52:06]完美世界DOTA2联赛决赛日 Inki vs LBZS 第一场 11.08
2020/11/10 DOTA
python复制文件到指定目录的实例
2018/04/27 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
python实现桌面气泡提示功能
2019/07/29 Python
logging level级别介绍
2020/02/21 Python
keras实现多GPU或指定GPU的使用介绍
2020/06/17 Python
HTML5 本地存储实现购物车功能
2017/09/07 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
中专毕业生自荐信范文
2013/11/28 职场文书
大学生期末自我鉴定
2014/02/01 职场文书
生产部厂长助理职位说明书
2014/03/03 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
初三学习决心书
2014/03/11 职场文书
人事专员岗位说明书
2014/07/29 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
大专生自我鉴定怎么写
2014/09/16 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
校园广播稿精选
2014/10/01 职场文书
三好学生竞选稿
2015/11/21 职场文书
子女赡养老人协议书
2016/03/23 职场文书
Python包管理工具pip的15 个使用小技巧
2021/05/17 Python