微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在方解石计划器中应用规则

如何解决如何在方解石计划器中应用规则

我有以下代码

    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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?