2012-12-07 18 views

Odpowiedz

31

Slick's stabilny API osiąga to poprzez to, co nazywa podniósł osadzania. Twój przykład wyraźnie używa stabilnego API (tak jak używasz === dla równości, a nie ==).

Piękno Slicka (i z kolei Scala) polega na tym, że tyle osiąga się bez użycia makr lub Scala-Virtualized. (Side Uwaga: Slick za API eksperymentalny robi makr użyciu - a to pozwoli Ci korzystać == zamiast === lub is)

Tłumaczenie do SQL odbywa się za pomocą:

  1. Scala for składnia rozumienia, która jest tłumaczona na wywołania metod. tabelach określono w Slick są Monady - mają magiczne foreach, map, flatMap i filter metody, które pozwalają, aby ulegać ekspresji w for „pętli”, podczas gdy Scala tłumaczy ich połączeń metodę (poprawnie pokazano w kodzie dostarczone przez the other answer by @emil-ivanov).

    jak w przypadku regularnych kolekcji Scala The for jest cukier syntaktyczny dla zagnieżdżonego metody wywołania flatMap/map i filter; przeciwieństwie regularne zbiory, wersje slick Table obiektów w z map i filter powrót reprezentacje z zapytaniem, budując go wraz z każdego stanu filtra (if) lub dołączyć (jak w s <- Suppliers if s.id is c.supID)

    WIĘC typ z q2 nie jest zwykły zbiór (jak dla zrozumienia w Scala jest zazwyczaj używany do powrotu), ale raczej przedstawienie zapytania. (Podobnie jak Scala Option Monad współpracuje również z for listowe mimo nie będąc „zbieranie” (w ten sposób, że List lub Map IS))

    Można zobaczyć kwerendy podstawowej z q2.selectStatement.

  2. Scala niejawny podnoszenia - c.price nie jest Int lecz przedstawia wartość kolumny - tak ekspresja c.price < 9.0 się c.price.<(Const(9.0)) (e Int jest podnoszony do żądanego typu) i < jest tylko metoda klasy , która reprezentuje c.price, Column. Metoda < nie robi tego, co < zwykle robi (w przypadku zwykłego Int S) - to po prostu zwraca reprezentację AST SQL odpowiadającej price < 9 że staje się częścią SQL, który jest generowany i wysłany do JDBC do wykonać.

Jest jeszcze wiele innych szczegółów, ale myślę, że monada zapytania i ukryte podnoszenie są głównymi składnikami.

+0

Naprawdę świetny post. Niejawne podnoszenie jest dość sprytne –

14

W Scala „pętla” for nie jest rzeczywiście szczególna konstrukcja języka, ale raczej cukier syntaktyczny. Pierwszym przykładem

val q2 = for { 
    c <- Coffees if c.price < 9.0 
    s <- Suppliers if s.id === c.supID 
} yield (c.name, s.name) 

przekłada się na coś w linii:

val q2 = Coffees.withFilter(_.price < 9.0).flatMap(c => 
    Suppliers.withFilter(_.id === c.supID).map(s => 
     (c.name, s.name) 
    ) 
) 

Teraz flatMap, map, withFilter (i foreach) w rzeczywistości nie filtrować kolekcję, ale raczej zebrać co hapening w AST (drzewo składni abstrakcyjnej), które następnie jest obsługiwane przez Slick w celu przetłumaczenia na język SQL.

Również c.price, c.supID faktycznie Slick column s, których <, >, === (i tak dalej), metodami nie wraca bool, ale zbierania porównania, jak również, co jest następnie przekazywana do konwersji do SQL.

This is a talk przez twórców, gdzie większość z nich jest opisana (poprawnie).

Powiązane problemy