ApacheCalcite实现方言转换的代码

定义

创新互联公司是一家以网站建设公司、网页设计、品牌设计、软件运维、成都网站推广、小程序App开发等移动开发为一体互联网公司。已累计为成都OPP胶袋等众行业中小客户提供优质的互联网建站和软件开发服务。

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. * *

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 )} 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 Calcite 实现方言转换的代码的文章就介绍到这了,更多相关Apache Calcite方言转换内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


分享标题:ApacheCalcite实现方言转换的代码
本文地址:http://azwzsj.com/article/cdeisc.html