当前位置:服务器 > > 正文

java温度转换自动识别(Apache Calcite 实现方言转换的代码)

时间:2021-10-12 00:54:47类别:服务器

java温度转换自动识别

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

    上一篇下一篇

    猜您喜欢

    热门推荐