2012-03-01 1 views
1

Я пытаюсь создать фреймворк в Java, который будет поддерживать цепочку/конвейерные запросы, в которых вывод одного запроса будет преобразован для использования в качестве ввода других запросов. Что-то вроде PyCascading Эти запросы будут выполнены во время выполнения. Я посмотрел на некоторые рамки и натолкнулся на Apache Camel & Spring Integration, поскольку они обеспечивают концепцию цепочки и маршрутизации (шаблоны интеграции предприятия). Я нашел Apache Camel лучше, чем Spring Integration (IMHO).Создание запроектированных запросов SQL/NOSQL в Java

Должен ли я пойти на верхушку Apache для своих фреймов или есть лучший способ добиться этого?

Мой Синтаксис запросов будет

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

Я бы цепь операторы SQL в SQL 'выберите account.id со счета, клиент где account.custid = клиент. id и customer.name = 'ABC'' Вытаскивание данных из базы данных просто для его возврата снова неэффективно. –

+0

Я согласен с тем, что это будет лучшим способом, но мои таблицы sql будут находиться в распределенных базах данных, и это может быть SQL или NOSQL. Таким образом, объект запроса будет заботиться о выполнении. – Abhishek

+0

Я бы сохранил все данные, которые, вероятно, будут объединены логически вместе. По возможности я бы поместил несвязанные данные в разные базы данных. Я бы попробовал только одну или две базы данных, которые предоставят вам все, что вам нужно. –

ответ

1

Это возможно с помощью camel-jdbc и несколько основных функций Camel (как simple), чтобы позволить Вам встраивать результат разбора ...

код [ CAMEL-JDBC] возвращается в тело OUT как ArrayList [HashMap [String, Object]] Объект List содержит список строк, а объекты Map содержат каждую строку со строковым ключом в качестве имени столбца.

Этот результат может быть использован для динамического построения последующих запросов ...

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

Могу ли я каким-то образом передать свой объект вместо того, чтобы полагаться на метод toString в setBody() или есть способ, которым я могу использовать объекты? – Abhishek

+0

вы можете использовать Processor или Bean, чтобы делать все, что хотите внутри маршрута ... см. Http://camel.apache.org/processor.html, http://camel.apache.org/bean.html –

Смежные вопросы