Java 在使用RelBuilder构建RelNode时,是否有任何方法可以删除特定规则?
我正在使用RelBuilder构建一个RelNodeJava 在使用RelBuilder构建RelNode时,是否有任何方法可以删除特定规则?,java,apache-calcite,Java,Apache Calcite,我正在使用RelBuilder构建一个RelNode FrameworkConfig frameworkConfig = config().build(); final RelBuilder builder = RelBuilder.create(frameworkConfig); RelNode root = builder.scan("ITEM", "TEST") .filter(
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()
MyFilterableTable中的扫描方法
公共可枚举扫描(DataContext根目录、列表筛选器)
将合并的筛选器字符串获取为[和(=($0,'AM_TestItem_21Aug17_0614'),=($3,'Item'))]
我想要这些过滤器的单独条目,而不是合并条目。
我希望计划者忽略FilterMerge规则
有什么方法可以做到这一点吗?在使用
RelBuilder
API时,没有简单的方法可以有选择地启用/禁用规则,而且鉴于此API仅用于创建计划,这是正常的
此外,依赖过滤器不会被合并这一事实不是一个好主意,因为将来当存在两个相邻的过滤器操作符时,当前通过FilterMergeRule
进行的合并很有可能通过RelBuilder完成
然而,在扫描操作中,您可以调用
RelOptUtil#conjunctions
方法,该方法将过滤器拆分为单独的连接,如果我很好地理解您的用例,这或多或少是您希望获得的 谢谢你的回复。RelOptUtil#连接给出了由和分解的单独条件。Usedroot.getCluster().getPlanner().removule(FilterMergeRule.INSTANCE)
在优化中忽略FilterMergeRule
规则。
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());
}