java - 使用 RelBuilder 构建 RelNode 时,有什么方法可以删除特定规则?
问题描述
我正在使用 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 中的 scan 方法
public Enumerable<Object[]> scan(DataContext root, List<RexNode> filters)
将合并的过滤器字符串作为 [AND(=($0, 'AM_TestItem_21Aug17_0614'), =($3, 'Item'))]
我想要这些过滤器的单独条目,而不是合并一个。我希望计划者忽略 FilterMergeRule。
有没有办法做到这一点?
解决方案
使用 API 时没有简单的方法可以选择性地启用/禁用规则RelBuilder
,这是正常的,因为此 API 仅用于创建计划。
此外,依赖过滤器不会被合并这一事实并不是一个好主意,因为将来FilterMergeRule
当有两个相邻的过滤器运算符时,很有可能通过 RelBuilder 完成当前完成的合并。
不过,在扫描操作中,您可以调用RelOptUtil#conjunctions
将过滤器拆分为单独的连词的方法,如果我很好地理解您的用例,这或多或少是您想要获得的。
推荐阅读
- android - Android kotlin 在任何视图更改大小时检查是否有任何视图滑出屏幕
- python - python中CherryPy中配置的默认`server.socket_queue_size`在哪里
- excel - 如何使用 VBA Excel 中的复选框启用/禁用命令按钮
- google-sheets - 如果多个单元格不为空白并且我正在格式化的单元格为空白,则有条件地格式化
- elasticsearch - 在 Logstash 中将字段从字符串转换为日期
- c# - 我可以在利用 ReportExecutionService 执行我的 SSRS 脚本方面获得一些帮助吗
- flutter - Flutter Mobx Observer 没有重建
- google-apps-script - Google表格根据单元格编号值添加行
- amazon-dynamodb - DynamoDB - GSI 创建时间如何用于按需表?
- dynamic - Teradata 中有没有办法将行转换为列而不更改对新值的查询