2015-12-21 21 views
5

Używając narzędzia Slick 3.1, jak połączyć wiele zapytań w jedno zapytanie dla tego samego typu? Jest to nie łączenie lub związek, ale łączenie zapytania "segmenty" w celu utworzenia pojedynczego zapytania. Te "segmenty" mogą być dowolnymi indywidualnie ważnymi zapytaniami.łączenie gładkich zapytań w pojedyncze zapytanie

val query = TableQuery[SomeThingValid] 

// build up pieces of the query in various parts of the application logic 
val q1 = query.filter(_.value > 10) 
val q2 = query.filter(_.value < 40) 
val q3 = query.sortBy(_.date.desc) 
val q4 = query.take(5) 

// how to combine these into a single query ? 
val finalQ = ??? q1 q2 q3 q4 ??? 

// in order to run in a single request 
val result = DB.connection.run(finalQ.result) 

EDIT: oczekiwany SQL powinno być coś takiego:

SELECT * FROM "SomeThingValid" WHERE "SomeThingValid"."value" > 10 AND "SomeThingValid"."valid" < 40 ORDER BY "MemberFeedItem"."date" DESC LIMIT 5 
+1

Nie jestem całkowicie pewien, czego oczekujesz w rezultacie. Chyba muszę zapytać: jak zrobiłbyś to w prostym SQL? –

+0

@ PatrykĆwiek z przykładowym oczekiwanym sql – IUnknown

Odpowiedz

4
val q1 = query.filter(_.value > 10) 
val q2 = q1.filter(_.value < 40) 
val q3 = q2.sortBy(_.date.desc) 
val q4 = q3.take(5) 

myślę, że należy coś zrobić jak wyżej (i przejść około Query s), ale jeśli nalegać na przejściu około zapytania „segmentów”, coś takiego może działać:

type QuerySegment = Query[SomeThingValid, SomeThingValid, Seq] => Query[SomeThingValid, SomeThingValid, Seq] 

val q1: QuerySegment = _.filter(_.value > 10) 
val q2: QuerySegment = _.filter(_.value < 40) 
val q3: QuerySegment = _.sortBy(_.date.desc) 
val q4: QuerySegment = _.take(5) 

val finalQ = Function.chain(Seq(q1, q2, q3, q4))(query) 
+0

Tak, mogę dodać klauzule do zapytania, celem było zrobienie różnych zapytań, które zostały utworzone i połączenie ich w celu wygenerowania sql jak w przykładzie. – IUnknown

+0

@IUnknown zobacz moją edycję. – danielnixon

+0

ładne, dziękuję - właśnie to szukałem – IUnknown

0

Używałem ten "wzorzec" z slick2.0

val query = TableQuery[SomeThingValid] 

val flag1, flag3 = false 
val flag2, flag4 = true 

val bottomFilteredQuery = if(flag1) query.filter(_.value > 10) else query 
val topFilteredQuery = if(flag2) bottomFilteredQuery.filter(_.value < 40) else bottomFilteredQuery 
val sortedQuery = if(flag3) topFilteredQuery.soryBy(_.date.desc) else topFilteredQuery 
val finalQ = if(flag4) sortedQuery.take(5) else sortedQuery 
+0

to nie zadziała w moim przypadku, ponieważ zapytanie przychodzące jest niedeterministycznym zestawem arbitralnym. – IUnknown

-1

myślę, że to powinno działać . Ale jeszcze tego nie testowałem.

val users = TableQuery[Users] 
val filter1: Query[Users, User, Seq] = users.filter(condition1) 
val filter2: Query[Users, User, Seq] = users.filter(condition2) 
(filter1 ++ filter2).result.headOption 
Powiązane problemy