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访问的网站改成https访问
Mar 31 Servers
Nginx配置之实现多台服务器负载均衡
Aug 02 Servers
Nginx速查手册及常见问题
Apr 07 Servers
Consul在linux环境的集群部署
Apr 08 Servers
CentOS7安装GlusterFS集群以及相关配置
Apr 12 Servers
Windows Server 2019 配置远程控制以及管理方法
Apr 28 Servers
服务器间如何实现文件共享
May 20 Servers
Nginx本地配置SSL访问的实例教程
May 30 Servers
WinServer2012搭建DNS服务器的方法步骤
Jun 10 Servers
详解ZABBIX监控ESXI主机的问题
Jun 21 Servers
Nginx安装配置详解
Jun 25 Servers
Flink 侧流输出源码示例解析
Sep 23 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
php限制上传文件类型并保存上传文件的方法
2015/03/13 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
Jquery Change与bind事件代码
2011/09/29 Javascript
JavaScript高级程序设计(第3版)学习笔记6 初识js对象
2012/10/11 Javascript
jQuery中对节点进行操作的相关介绍
2013/04/16 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
jquery实现点击消失的代码
2014/03/03 Javascript
一个jquery实现的不错的多行文字图片滚动效果
2014/09/28 Javascript
使用js获取图片原始尺寸
2014/12/03 Javascript
javascript遇到html5的一些表单属性
2015/07/05 Javascript
NodeJS的Promise的用法解析
2016/05/05 NodeJs
纯JS实现图片验证码功能并兼容IE6-8(推荐)
2017/04/19 Javascript
js学习总结_基于数据类型检测的四种方式(必看)
2017/07/04 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
vue.js多页面开发环境搭建过程
2019/04/24 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
Python Web框架Flask中使用新浪SAE云存储实例
2015/02/08 Python
python读写二进制文件的方法
2015/05/09 Python
从源码解析Python的Flask框架中request对象的用法
2016/06/02 Python
详解Django-auth-ldap 配置方法
2018/12/10 Python
python redis 批量设置过期key过程解析
2019/11/26 Python
Python调用shell命令常用方法(4种)
2020/05/11 Python
python如何对链表操作
2020/10/10 Python
龟牌英国商店:Turtle Wax Brand Store UK
2019/07/02 全球购物
请解释virtual关键字的含义
2015/06/17 面试题
建筑自我鉴定
2013/10/19 职场文书
大学生入党自我鉴定
2013/10/31 职场文书
法律专业推荐信范文
2013/11/29 职场文书
大学生实习自我鉴定
2013/12/11 职场文书
校园安全标语
2014/06/07 职场文书
最美乡村教师观后感
2015/06/11 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android