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站点配置SSL强制跳转443
Mar 09 Servers
Nginx配置SSL证书出错解决方案
Mar 31 Servers
Nginx URL重写rewrite机制原理及使用实例
Apr 01 Servers
Nginx部署vue项目和配置代理的问题解析
Aug 04 Servers
Nginx 路由转发和反向代理location配置实现
Nov 11 Servers
详解nginx location指令
Jan 18 Servers
Windows server 2012搭建FTP服务器
Apr 29 Servers
KVM基础命令详解
Apr 30 Servers
openEuler 搭建java开发环境的详细过程
Jun 10 Servers
Windows server 2022创建创建林、域树、子域的步骤
Jun 25 Servers
windows server 2016 域环境搭建的方法步骤(图文)
Jun 25 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 echo 输出字符串函数详解
2010/05/13 PHP
php无限遍历目录示例
2014/02/21 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
php reset() 函数指针指向数组中的第一个元素并输出实例代码
2016/11/21 PHP
PHP实现的回溯算法示例
2017/08/15 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
Jquery焦点与失去焦点示例应用
2014/06/10 Javascript
JQuery设置获取下拉菜单某个选项的值(比较全)
2014/08/05 Javascript
网页禁用右键菜单和鼠标拖动选择方法小结
2015/02/25 Javascript
Javascript函数的参数
2015/07/16 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jquery实现列表上下移动功能
2016/02/25 Javascript
JavaScript遍历Json串浏览器输出的结果不统一问题
2016/11/03 Javascript
JS中Attr的用法详解
2017/10/09 Javascript
解决js ajax同步请求造成浏览器假死的问题
2018/01/18 Javascript
Ajax请求时无法重定向的问题解决代码详解
2019/06/21 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
解决小程序无法触发SESSION问题
2020/02/03 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
2020/07/20 Javascript
Vue中强制组件重新渲染的正确方法
2021/01/03 Vue.js
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码
2019/07/31 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
使用Pytorch来拟合函数方式
2020/01/14 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
以工厂直接定价的传奇性能:Ben Hogan Golf
2019/01/04 全球购物
工商管理专业实习大学生自我鉴定
2013/09/19 职场文书
大学四年职业生涯规划书范文
2014/01/02 职场文书
男方婚礼答谢词
2015/01/20 职场文书
Redis基本数据类型List常用操作命令
2022/06/01 Redis