使用RelBuilder构建RelNode时,有什么方法可以删除特定规则?

时间:2019-12-19 05:30:03

标签: java apache-calcite

我正在使用RelBuilder构建RelNode。

FrameworkConfig frameworkConfig = config().build();
 final RelBuilder builder = RelBuilder.create(frameworkConfig);
  RelNode root =
                 builder.scan("ITEM", "TEST")
                 .filter(
                         builder.equals(builder.field("ITEM_ID"), builder.literal("AM_TestItem_21Aug17_0614")))
                 .filter(
                        builder.equals(builder.field("OBJECT_TYPE"), builder.literal("Item")))
                 .build();

 PreparedStatement preparedStatement = RelRunners.run(root)
 preparedStatement.executeQuery()
    public static Frameworks.ConfigBuilder config() {
        CalciteSchema rootSchema1 = CalciteSchema.createRootSchema(true);
        rootSchema1 = rootSchema1.add("ITEM", new MySchema());
        // MySchema consists of Map of MyFilterableTable which extends AbstractTable and implements FilterableTable
        return Frameworks.newConfigBuilder().defaultSchema(rootSchema1.plus());
    }
MyFilterableTable public Enumerable<Object[]> scan(DataContext root, List<RexNode> filters)中的

scan方法 获取合并的过滤器字符串为[AND(=($ 0,'AM_TestItem_21Aug17_0614'),=($ 3,'Item'))]

我想要这些过滤器的单独条目,而不要合并一个。 我希望计划者忽略FilterMergeRule。

有什么办法吗?

1 个答案:

答案 0 :(得分:1)

使用RelBuilder API时,没有简单的方法来选择性地启用/禁用规则,这是正常现象,因为该API仅用于创建计划。

此外,不要依赖于过滤器不会合并这一事实也不是一个好主意,因为将来很有可能使用RelBuilder来完成当前通过FilterMergeRule进行的合并当有两个相邻的过滤器运算符时。

尽管如此,在扫描操作内部,您可以调用RelOptUtil#conjunctions方法,该方法将过滤器拆分为单独的连接,如果我很了解您的用例,则或多或少会得到您想要的结果。