2016-10-24 1 views
1

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

わかったように、カルサイトはこの機能をサポートしていません。

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

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

RelOptRuleはいいですか?誰でもこの機能を実装することをお勧めしますか?

ありがとうございました。

答えて

2

新しいRelOptRuleを作成する方法があります。ルール内のノードを直接削除しないでください。代わりに、置換するノードを含むサブツリーに一致させます(たとえば、TableScanの上にFilterなど)。そして、サブツリー全体をフィルターを押し下げる等価ノードに置き換えます。

これは、通常、特定のアダプタの呼び出し規約に準拠する関連操作のサブクラスを作成することによって処理されます。たとえば、Cassandraアダプターでは、があり、これは、に対応しています。CassandraTableScanの上にあります。 convert関数は、CassandraFilterインスタンスを作成します。 CassandraFilterインスタンスは、クエリが実際に発行されたときにフィルタが使用できるように必要な情報を設定します。

Cassandra、MongoDB、またはElasticsearchアダプタのコードの一部を参照するほうが、よりシンプルなので便利です。おそらくもっと詳細なアドバイスを受けるので、これをメーリングリストに持ってくることをお勧めします。

+0

'convert'関数は私が望むものですが、いくつかのルールでそれを見つけました。 – inferno

1

私は、Project/Filter/Aggregate RelNode upper TableScanをプッシュダウンするためにいくつかのRelOptRuleを作成しました。多分他の人に役立つでしょう。

RelOptRuleは、一部のを定義するために使用されます。ルールはRelNode全体でサブツリーを一致させます。一致する場合は、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); 
    } 
} 

このルールは、その後、onMatchメソッドを呼び出し、Filter->TableScanサブツリーと一致します。メソッドはtransformTotableScanのみです。結果は以下のように、全体RelNode TableScanに置き換えFilter->TableScan次のとおりです。新しいRelNodeのRelDataTypeがマッチしたサブツリーに等しくなければならないこと

Project 
    | 
TableScan 

方解石使用するいくつかのルールをサポートし、。例えばFilterJoinRule,FilterTableScanRuleなどとなる。

関連する問題