9

私は Apache Calcite を使用して、データソースが RDBMS である分散 OLAP システムを実装しています。RelNodeだから私はプロジェクト/フィルター/集約をツリーにプッシュダウンしたいMyTableScan extends TableScan. では、押されMyTableScanたを取得します。最後に、ソース データベースへのクエリを生成します。同時に、元のツリーのプロジェクト/フィルター/集計を移動または変更する必要があります。RelBuilderRelNodeRelBuilderRelNode

私が知っているように、Calcite はこの機能をサポートしていません。

現在の制限: JDBC アダプターは現在、テーブル スキャン操作のみをプッシュします。他のすべての処理 (フィルタリング、結合、集計など) は Calcite 内で行われます。私たちの目標は、できるだけ多くの処理をソース システムにプッシュ ダウンし、構文、データ型、および組み込み関数を変換することです。Calcite クエリが単一の JDBC データベースのテーブルに基づいている場合、原則としてクエリ全体がそのデータベースに送信されます。テーブルが複数の JDBC ソースからのものである場合、または JDBC と非 JDBC が混在している場合、Calcite は可能な限り最も効率的な分散クエリ アプローチを使用します。

私の意見でRelOptRuleは、良い選択かもしれません。残念ながら、 new を作成するとRelOptRule、ノードを削除する親ノードを簡単に見つけることができません。

RelOptRule良い選択ですか?この機能を実装する良いアイデアはありますか?

ありがとう。

4

2 に答える 2

5

RelOptRuleProject/Filter/Aggregate RelNode の上位 TableScan をプッシュ ダウンするためにいくつか作成しました。他の人に役立つかもしれません。

RelOptRuleRelNode 全体のサブツリーに一致するいくつかのルールを定義するために使用されます。一致したら、メソッドを呼び出してonMatch何かを行います。

このonMatchメソッドでは、1 つの新しい RelNode を作成し、transformToメソッドを呼び出して、一致したサブツリーを置き換えることができます。

例えば:

Project
  |
Filter
  |
TableScan

PushDownFilterルールは次のとおりです。

  public class PushDownFilter extends RelOptRule {

  public PushDownFilter(RelOptRuleOperand operand, String description) {
    super(operand, "Push_down_rule:" + description);
  }

  public static final PushDownFilter INSTANCE =
      new PushDownFilter(
          operand(
              Filter.class,
              operand(TableScan.class, none())),
          "filter_tableScan");

  @Override
  public void onMatch(RelOptRuleCall call) {
    LogicalFilter filter = (LogicalFilter) call.rels[0];
    TableScan tableScan = (TableScan) call.rels[1];
    // push down filter
    call.transformTo(tableScan);
  }
}

このルールはFilter->TableScanサブツリーに一致し、メソッドを呼び出しますonMatch。メソッドのみtransformTotableScan結果は、次のように RelNode 全体が にFilter->TableScan置き換えられます。TableScan

Project
  |
TableScan

新しい RelNodeのRelDataTypeは、一致したサブツリーと等しくなければならないことに注意してください。</p>

Calcite は、使用するいくつかのルールをサポートしています。たとえばFilterJoinRuleFilterTableScanRuleなどです。

于 2016-11-25T08:00:56.947 に答える