如何解决如何在方解石计划器中应用规则
SchemaPlus rootSchema = CalciteUtils.registerRootSchema();
final FrameworkConfig fromworkConfig = Frameworks.newConfigBuilder()
.parserConfig(sqlParser.Config.DEFAULT)
.defaultSchema(rootSchema)
.traitDefs(ConventionTraitDef.INSTANCE,ReldistributionTraitDef.INSTANCE)
.build();
String sql="select * from users";
Volcanoplanner planner = new Volcanoplanner();
planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
planner.addRule(FilterJoinRule.FilterIntoJoinRule.FILTER_ON_JOIN);
planner.addRule(ReduceExpressionsRule.PROJECT_INSTANCE);
planner.addRule(PruneEmptyRules.PROJECT_INSTANCE);
// add ConverterRule
planner.addRule(EnumerableRules.ENUMERABLE_MERGE_JOIN_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_SORT_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_VALUES_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_FILTER_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_FILTER_TO_CALC_RULE);
planner.addRule(EnumerableRules.ENUMERABLE_PROJECT_TO_CALC_RULE);
sqlTypeFactoryImpl factory = new sqlTypeFactoryImpl(RelDataTypeSystem.DEFAULT);
// sql parser
sqlParser parser = sqlParser.create(sql,sqlParser.Config.DEFAULT);
sqlNode parsed = parser.parseStmt();
LOGGER.info("The sqlNode after parsed is:\n{}",parsed.toString());
CalciteCatalogReader calciteCatalogReader = new CalciteCatalogReader(
CalciteSchema.from(rootSchema),CalciteSchema.from(rootSchema).path(null),factory,new CalciteConnectionConfigImpl(new Properties()));
// sql validate
sqlValidator validator = sqlValidatorUtil.newValidator(sqlStdOperatorTable.instance(),calciteCatalogReader,CalciteUtils.conformance(fromworkConfig));
sqlNode validated = validator.validate(parsed);
LOGGER.info("The sqlNode after validated is:\n{}",validated.toString());
final RexBuilder rexBuilder = CalciteUtils.createRexBuilder(factory);
final RelOptCluster cluster = RelOptCluster.create(planner,rexBuilder);
// init sqlToRelConverter config
final sqlToRelConverter.Config config = sqlToRelConverter.configBuilder()
.withConfig(fromworkConfig.getsqlToRelConverterConfig())
.withTrimUnusedFields(false)
.withConvertTableAccess(false)
.build();
// sqlNode toRelNode
final sqlToRelConverter sqlToRelConverter = new sqlToRelConverter(new CalciteUtils.ViewExpanderImpl(),validator,cluster,fromworkConfig.getConvertletTable(),config);
RelRoot root = sqlToRelConverter.convertQuery(validated,true,true);
root = root.withRel(sqlToRelConverter.flattenTypes(root.rel,true));
final RelBuilder relBuilder = config.getRelBuilderFactory().create(cluster,null);
root = root.withRel(RelDecorrelator.decorrelateQuery(root.rel,relBuilder));
RelNode relNode = root.rel;
LOGGER.info("The relational expression string before optimized is:\n{}",RelOptUtil.toString(relNode));
RelTraitSet desiredTraits =
relNode.getCluster().traitSet().replace(EnumerableConvention.INSTANCE);
relNode = planner.changeTraits(relNode,desiredTraits);
planner.setRoot(relNode);
relNode = planner.findBestExp();
System.out.println("-----------------------------------------------------------");
System.out.println("The Best relational expression string:");
System.out.println(RelOptUtil.toString(relNode));
System.out.println("-----------------------------------------------------------");
EnumerableFilter的impement方法将引发异常,因此我将EnumberableFilter和EnumerableProject转换为EnumerableCalc。但是规则Enumerable_FILTER_TO_CALC和Enumerable_PROJECT_TO_CALS似乎无效。怎么了?
我发现这两个规则不是ConvertRule的子类。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。