2012-03-01 4 views
1

私は、1つのクエリの出力が別のクエリの入力として使用されるように変換される連鎖/パイプラインクエリをサポートするフレームワークをJavaで作成しようとしています。何かのようにPyCascadingこれらのクエリは実行時に行われます。私はいくつかのフレームワークを見て、Apache Camel & Spring Integrationのようになりました。チェーンとルーティング(エンタープライズ統合パターン)のコンセプトを提供しています。 Apache CamelはSpring Integration(IMHO)より優れています。Javaでのパイプライン化されたSQL/NOSQLクエリの作成


私のフレームワーク用にApache Camelを使うべきでしょうか、これを実現する良い方法がありますか?

私のクエリ構文[

これはあなたが解析した結果をインライン化することを可能にするために camel-jdbcといくつかの基本的なキャメルの機能(のような simple)を使用して可能である
Query query1 = "select customer.id from customer where customer.name = 'ABC'"; 
Query query2 = "select account.id from account where account.custid in {$1}"; 
// $1 will be the input of second query 
from(query1).inputto(query2).printOutput(); 
+0

'口座からaccount.id選択し、顧客account.custid =顧客。 idとcustomer.name = 'ABC'''''''''' '' '' '' '' '' '' '' '' 'をもう一度返すだけでデータベースからデータを引き出すのは非効率的です。 –

+0

私はそれが良い方法だと思うが、私のSQLテーブルは分散データベースになるだろうし、SQLやNOSQLかもしれない。したがって、クエリオブジェクトは実行の世話をしています。 – Abhishek

+0

論理的に結合される可能性があるすべてのデータを保持します。可能であれば、無関係のデータを異なるデータベースに入れるだけです。私はあなたに必要なものすべてを与える1つか2つのデータベースしか持たないようにしようとします。 –

答えて

1

...

だろうCAMEL-JDBC]結果はArrayオブジェクトとして返されます。ArrayList [HashMap [String、Object]] Listオブジェクトには行のリストが含まれ、Mapの オブジェクトには各行にStringキーが列名として含まれます。この結果は、その後、動的に後続の問合せを構築するために使用することができます

...私はチェーンSQLでのSQL文を希望

from("direct:start") 
    .setBody(constant("select customer.id as ID from customer where customer.name = 'ABC'")) 
    .to("jdbc:myDataSource") 

    //now, use simple/ognl to extract the first result and the 'ID' from the Map in the body 
    .setBody(simple("select account.id from account where account.custid in ${body[0][ID]}")) 
    .to("jdbc:myDataSource") 

    .log("ACCOUNT IDS = ${body}"); 
+0

setBody()のtoStringメソッドに頼るのではなく、何とか自分のオブジェクトを渡すことができますか?それとも、オブジェクトを使用できる方法はありますか? – Abhishek

+0

あなたは、プロセッサやBeanを使って、ルート内の任意のことを行うことができます。http://camel.apache.org/processor.html、http://camel.apache.org/bean.htmlを参照してください。 –