您当前的位置:首页 > 网站建设 > 网站维护
| php | asp | css | H5 | javascript | Mysql | Dreamweaver | Delphi | 网站维护 | 帝国cms | React | 考试系统 | ajax | jQuery |

Apache Calcite 实现方言转换的代码

51自学网 2022-07-04 11:32:43
  网站维护

定义

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: 是否大小写敏感(列名 表明 函数名等)}
// 方法区(不同的数据源根据细节的不同实现自定义的复写方法)allowsAsconfigureParserconfigureParsercontainsNonAsciicreatedefaultNullDirectionemptyContextemulateJoinTypeForCrossJoinemulateNullDirectionemulateNullDirectionWithIsNullgetCalendarPolicygetCastSpecgetConformancegetDatabaseProductgetNullCollationgetProductgetQuotedCasinggetQuotinggetSingleRowTableNamegetTypeSystemgetUnquotedCasinghasImplicitTableAliasidentifierNeedsQuoteisCaseSensitivequoteIdentifierquoteIdentifierquoteIdentifierquoteStringLiteralquoteStringLiteralquoteStringLiteralUnicodequoteTimestampLiteralrequiresAliasForFromItemsrewriteSingleValueExprsupportsAggregateFunctionsupportsAliasedValuessupportsCharSetsupportsDataTypesupportsFunctionsupportsGroupByWithCubesupportsGroupByWithRollupsupportsImplicitTypeCoercionsupportsNestedAggregationssupportsOffsetFetchsupportsWindowFunctionsunparseCallunparseDateTimeLiteralunparseFetchUsingAnsiunparseFetchUsingLimitunparseLimitunparseOffsetunparseOffsetFetchunparseSqlDatetimeArithmeticunparseSqlIntervalLiteralunparseSqlIntervalQualifierunparseTopNunquoteStringLiteral

使用方式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`";
// 解析过的SqlNodesqlNode.toSqlString(CalciteSqlDialect.DEFAULT).getSql();

下载地址:
apache基于端口创建虚拟主机的示例
修改Docker镜像默认存储位置的方法(解决方法)
51自学网,即我要自学网,自学EXCEL、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。
京ICP备13026421号-1