Slick's stable API achieves this via what it calls lifted embedding. Your example is clearly using the stable API (as you use ===
for equality and not ==
).
The beauty of Slick (and in turn Scala) is that - this much is achieved without using macros or Scala-Virtualized. (Side Note: Slick's experimental API does use macros - and this will allow you to use ==
instead of ===
or is
)
The translation to SQL is achieved using:
Scala's
for
comprehension syntax, which is translated to method calls. Tables defined in Slick are Monads - they have the magicforeach
,map
,flatMap
, andfilter
methods which allow them to be expressed infor
'loops' while Scala translates them to method calls (as correctly illustrated in the code provided by the other answer by @emil-ivanov).As with regular Scala collections, the
for
is syntactic sugar for nested method calls toflatMap
/map
andfilter
; unlike regular collections, the SlickTable
objects' versions ofmap
andfilter
return representations of a query, building it along with every filter condition (if
) or join (as ins <- Suppliers if s.id is c.supID
)So the type of
q2
is not your usual collection (as a for comprehension in Scala is typically used to return), but rather a representation of a query. (Just as the Scala Option Monad also works withfor
comprehensions despite not being a 'collection' (in the way thatList
orMap
is))You can see the underlying query with
q2.selectStatement
.Scala's implicit lifting -
c.price
is not anInt
but rather a representation of a column value - so the expressionc.price < 9.0
becomesc.price.<(Const(9.0))
(anInt
is lifted to the desired type), and<
is a just a method of the class that representsc.price
, aColumn
. The<
method does not do what<
usually does (in the case of plainInt
s) - it simply returns a representation of the SQL AST corresponding toprice < 9
that becomes part of the SQL that is generated and sent off to JDBC to execute.
There's a whole lot else going on, in terms of details, but I think the query monad and the implicit lifting are the chief ingredients.