我正在使用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)
中的扫描方法获取合并的过滤器字符串为[AND(=($ 0,'AM_TestItem_21Aug17_0614'),=($ 3,'Item'))]
我想要这些过滤器的单独条目,而不是合并的条目。
我希望计划者忽略FilterMergeRule。
有什么办法吗?
最佳答案
使用RelBuilder
API时,没有简单的方法有选择地启用/禁用规则,这是正常现象,因为该API仅用于创建计划。
此外,不要依赖于滤镜不会被合并的事实不是一个好主意,因为将来很有可能当两个相邻的RelBuilder一起使用RelBuilder完成当前通过FilterMergeRule
完成的合并过滤器运算符。
不过,在扫描操作内部,您可以调用RelOptUtil#conjunctions
方法,该方法将过滤器拆分为单独的连接,如果我很了解您的用例,则或多或少希望获得该连接。