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反向代理多个服务器的实现方法
Mar 31 Servers
本地通过nginx配置反向代理的全过程记录
Mar 31 Servers
Nginx的基本概念和原理
Mar 21 Servers
Kubernetes中Deployment的升级与回滚
Apr 01 Servers
Nginx速查手册及常见问题
Apr 07 Servers
Windows server 2012 配置Telnet以及用法详解
Apr 28 Servers
阿里云 Windows server 2019 配置FTP
Apr 28 Servers
安装harbor作为docker镜像仓库的问题
Jun 14 Servers
Linux下搭建SFTP服务器的命令详解
Jun 25 Servers
Nginx配置使用详解
Jul 07 Servers
Windows server 2003卸载和安装IIS的图文教程
Jul 15 Servers
Valheim服务器 Mod修改安装教程 【ValheimPlus】
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 已经成熟
2006/12/04 PHP
php 函数使用方法与函数定义方法
2010/05/09 PHP
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php使用GeoIP库实例
2014/06/27 PHP
PHP使用array_multisort对多个数组或多维数组进行排序
2014/12/16 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PHP多进程编程实例详解
2017/07/19 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
JQuery触发radio或checkbox的change事件
2012/12/18 Javascript
仿当当网淘宝网等主流电子商务网站商品分类导航菜单
2013/09/25 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
jquery通过扩展select控件实现支持enter或focus选择的方法
2015/11/19 Javascript
bootstrap实现弹窗和拖动效果
2016/01/03 Javascript
JavaScript数组去重的两种方法推荐
2016/04/05 Javascript
js canvas实现QQ拨打电话特效
2017/05/10 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
JS实现页面跳转与刷新的方法汇总
2019/08/30 Javascript
python操作xml文件示例
2014/04/07 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
python实现简易版计算器
2020/06/22 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python脚本修改阿里云的访问控制列表的方法
2019/03/08 Python
详解centos7+django+python3+mysql+阿里云部署项目全流程
2019/11/15 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
Python爬虫逆向分析某云音乐加密参数的实例分析
2020/12/04 Python
John Varvatos官方网站:设计师男士时装
2017/02/08 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
Osklen官方在线商店:巴西服装品牌
2019/04/25 全球购物
Traffic People官网:女式花裙、上衣和连身裤
2020/10/12 全球购物
企业管理毕业生求职信
2014/03/11 职场文书
家长学校实施方案
2014/03/15 职场文书
支行行长竞聘演讲稿
2014/05/15 职场文书
信用卡工资证明范本
2014/10/17 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
JavaScript 定时器详情
2021/11/11 Javascript