华域联盟 Linux Apache Calcite 实现方言转换的代码

Apache Calcite 实现方言转换的代码

Apache Calcite 实现方言转换的代码

 更新时间:2021年04月23日 09:57:31   作者:Nobi  
这篇文章主要介绍了Apache Calcite 实现方言转换的代码,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

定义

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方言转换内容请搜索华域联盟以前的文章或继续浏览下面的相关文章希望大家以后多多支持华域联盟!

您可能感兴趣的文章:

相关文章

  • linux引导系统的方法分析

    linux引导系统的方法分析

    这篇文章主要介绍了linux引导系统的方法,总结分析了Linux引导系统相关原理、操作命令与注意事项,需要的朋友可以参考下

    2020-03-03

  • 基于windowx的Hyper-v安装CentOS系统

    基于windowx的Hyper-v安装CentOS系统

    这篇文章主要介绍了基于windowx的Hyper-v安装CentOS系统 ,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

    2019-07-07

  • Linux 中PHP的安装教程

    Linux 中PHP的安装教程

    这篇文章主要介绍了Linux 中PHP的安装教程,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下

    2016-11-11

  • 解决VScode配置远程调试Linux程序的问题

    解决VScode配置远程调试Linux程序的问题

    这篇文章主要介绍了VScode配置远程调试Linux程序及问题解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

    2020-08-08

  • linux用户组以及权限总结

    linux用户组以及权限总结

    这篇文章主要介绍了linux用户组以及权限总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    2019-05-05

  • Linux常见问题解决方案汇总

    Linux常见问题解决方案汇总

    今天小编就为大家分享一篇关于Linux常见问题解决方案汇总,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧

    2019-02-02

  • Linux系统安装Tomcat并配置Service启动关闭

    Linux系统安装Tomcat并配置Service启动关闭

    这篇文章主要介绍了Linux系统安装Tomcat并配置Service启动关闭,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    2020-09-09

  • 详解如何在Linux中重置MySQL或者MariaDB的root密码

    详解如何在Linux中重置MySQL或者MariaDB的root密码

    本篇文章主要介绍了如何在 Linux 中重置 MySQL 或者 MariaDB 的 root 密码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。

    2017-03-03

  • Linux下完全删除用户的两种方法

    Linux下完全删除用户的两种方法

    这篇文章主要介绍了Linux下完全删除用户的两种方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

    2018-10-10

  • linux性能调试之vmstat分析

    linux性能调试之vmstat分析

    这篇文章主要介绍了linux性能调试之vmstat分析。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    2018-03-03

最新评论

本文由 华域联盟 原创撰写:华域联盟 » Apache Calcite 实现方言转换的代码

转载请保留出处和原文链接:https://www.cnhackhy.com/3379.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

上一篇
Apache Calcite 实现方言转换的代码

已经没有了

Linux实现驱动模块传参过程解析

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们