如何在Calcite中将项目,过滤,聚合下推到TableScan

inf*_*rno 5 java database apache-calcite

我正在使用Apache Calcite来实现分布式OLAP系统,该数据源是RDBMS。所以我想将RelNode树中的项目/过滤器/聚合推到MyTableScan extends TableScan。在MyTableScanRelBuilder得到推RelNode。最后,RelBuilder生成对源数据库的查询。同时,RelNode应移动或修改原始树中的项目/过滤器/集合。

据我所知,方解石不支持此功能。

当前的局限性:JDBC适配器当前仅下推表扫描操作。所有其他处理(过滤,联接,聚集等)都在方解石内部进行。我们的目标是尽可能减少对源系统的处理,尽可能地翻译语法,数据类型和内置函数。如果Calcite查询基于单个JDBC数据库中的表,则原则上整个查询应转到该数据库。如果表来自多个JDBC来源,或JDBC和非JDBC的混合,则Calcite将使用它可以使用的最高效的分布式查询方法。

我认为,这RelOptRule可能是一个不错的选择。不幸的是,当我创建new时RelOptRule,我不容易找到要删除的父节点。

RelOptRule是个好选择吗?任何人都有实现此功能的好主意吗?

谢谢。

Mic*_*ior 6

创建新产品RelOptRule是必经之路。请注意,您不应该尝试直接删除规则内的任何节点。而是,您匹配一个包含要替换的节点的子树(例如,位于Filter顶部的TableScan)。然后,将整个子树替换为等效节点,从而向下推动过滤器。

通常,通过创建符合特定适配器调用约定的相关操作的子类来处理此问题。例如,在Cassandra适配器中,有一个CassandraFilterRule与匹配LogicalFilterCassandraTableScanconvert然后,该函数构造一个CassandraFilter实例。该CassandraFilter实例设置必要的信息,以便在实际发出查询时,过滤器可用。

浏览Cassandra,MongoDB或Elasticsearch适配器的某些代码可能会有所帮助,因为它们比较简单。我也建议将其添加到邮件列表中,因为您可能会在此获得更详细的建议。


inf*_*rno 5

我创建了一些RelOptRule来下推项目/过滤器/聚合 RelNode 上部 TableScan。也许对其他人有帮助。

\n\n

RelOptRule用于定义一些规则来匹配整个RelNode中的子树。当匹配时,调用该onMatch方法做一些事情。

\n\n

在该onMatch方法中,我们可以创建一个新的RelNode,并调用该transformTo方法来替换匹配的子树。

\n\n

例如:

\n\n
Project\n  |\nFilter\n  |\nTableScan\n
Run Code Online (Sandbox Code Playgroud)\n\n

PushDownFilter规则如下:

\n\n
  public class PushDownFilter extends RelOptRule {\n\n  public PushDownFilter(RelOptRuleOperand operand, String description) {\n    super(operand, "Push_down_rule:" + description);\n  }\n\n  public static final PushDownFilter INSTANCE =\n      new PushDownFilter(\n          operand(\n              Filter.class,\n              operand(TableScan.class, none())),\n          "filter_tableScan");\n\n  @Override\n  public void onMatch(RelOptRuleCall call) {\n    LogicalFilter filter = (LogicalFilter) call.rels[0];\n    TableScan tableScan = (TableScan) call.rels[1];\n    // push down filter\n    call.transformTo(tableScan);\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该规则将匹配Filter->TableScan子树,然后调用该onMatch方法。该方法transformTotableScan. 将结果替换Filter->TableScanTableScan,整个RelNode如下:

\n\n
Project\n  |\nTableScan\n
Run Code Online (Sandbox Code Playgroud)\n\n

注意,新的RelNodeRelDataType必须等于匹配子树\xe3\x80\x82

\n\n

方解石支持一些规则使用,例如FilterJoinRuleFilterTableScanRule等等。

\n