scalaz
scalaz

Reputation: 81

Slick 3 join queries

I should select data from 3 tables result from each query I will use with inSet operation

 val q1 = tQ.filter(...).groupBy(_.s).map(_._1)
 val r1 = Await.result(db.run(q1.result), Duration.Inf)

 val q2 = tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1)
 val r2 = Await.result(db.run(q2.result), Duration.Inf)

 val q3 = tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1)
 val r3 = Await.result(db.run(q3.result), Duration.Inf)

Can I join 2 small queries to the ONE ?

Thanks!

Upvotes: 1

Views: 886

Answers (1)

Anna Zubenko
Anna Zubenko

Reputation: 1663

Slick queries are highly composable. Something like this should do:

val q = for {
  r1 <- tQ.filter(...).groupBy(_.s).map(_._1).result
  r2 <- tQ.filter(...inSet(r1)).groupBy(_.s).map(_._1).result
  r3 <- tQ.filter(...inSet(r2)).groupBy(_.s).map(_._1).result
} yield r3

Await.result(db.run(q), Duration.Inf)

If X is some type you want to pass to inSet, then your .filter(...).groupBy(...).map(_._1) type is Query[Xs, X, Seq]. Calling .result gives DBIO[Seq[Xs]]. Since you are in for comprehension block and all comprehensions have DBIO type, your rN results actually are Seq[X] so you can pass them to inSet method.

Check out documentation on monadic joins.

You might also want to consider using inSetBind.

Upvotes: 3

Related Questions