网创优客建站品牌官网
为成都网站建设公司企业提供高品质网站建设
热线:028-86922220
成都专业网站建设公司

定制建站费用3500元

符合中小企业对网站设计、功能常规化式的企业展示型网站建设

成都品牌网站建设

品牌网站建设费用6000元

本套餐主要针对企业品牌型网站、中高端设计、前端互动体验...

成都商城网站建设

商城网站建设费用8000元

商城网站建设因基本功能的需求不同费用上面也有很大的差别...

成都微信网站建设

手机微信网站建站3000元

手机微信网站开发、微信官网、微信商城网站...

建站知识

当前位置:首页 > 建站知识

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://bjjierui.cn/article/cdeisc.html

其他资讯