packages feed

sqel-0.0.1.0: lib/Sqel/Query/Combinators.hs

module Sqel.Query.Combinators where

import Sqel.Class.Mods (MapMod, setMod)
import Sqel.Data.Dd (Dd (Dd), DdK (DdK), Struct (Prim))
import Sqel.Data.FragType (FragType (Limit, Offset, Order, Where))
import Sqel.Data.Order (Order)
import Sqel.Data.Sel (Sel (SelAuto, SelUnused), mkSel)
import Sqel.Data.SelectExpr (SelectAtom (SelectAtom))
import Sqel.Data.Selector (Selector (Selector))
import Sqel.Data.Sql (Sql, sql)
import Sqel.Prim (primMod)
import Sqel.Sql.Prepared (dollar)

whereOp :: Sql -> SelectAtom
whereOp op =
  SelectAtom Where (\ sel i -> [sql|##{sel} #{op} #{dollar i}|])

whereEq :: SelectAtom
whereEq =
  whereOp "="

whereGt :: SelectAtom
whereGt =
  whereOp ">"

whereGte :: SelectAtom
whereGte =
  whereOp ">="

whereLt :: SelectAtom
whereLt =
  whereOp "<"

whereLte :: SelectAtom
whereLte =
  whereOp "<="

whereLike :: SelectAtom
whereLike =
  whereOp "like"

greater ::
  MapMod SelectAtom s0 s1 =>
  Dd s0 ->
  Dd s1
greater =
  setMod whereGt

greaterEq ::
  MapMod SelectAtom s0 s1 =>
  Dd s0 ->
  Dd s1
greaterEq =
  setMod whereGte

less ::
  MapMod SelectAtom s0 s1 =>
  Dd s0 ->
  Dd s1
less =
  setMod whereLt

lessEq ::
  MapMod SelectAtom s0 s1 =>
  Dd s0 ->
  Dd s1
lessEq =
  setMod whereLte

like ::
  MapMod SelectAtom s0 s1 =>
  Dd s0 ->
  Dd s1
like =
  setMod whereLike

nocond :: Dd ('DdK sel p a s) -> Dd ('DdK 'SelUnused p a s)
nocond (Dd _ p s) =
  Dd mkSel p s

limit ::
  Dd ('DdK 'SelUnused '[SelectAtom] a 'Prim)
limit =
  nocond (primMod (SelectAtom Limit (const dollar)))

offset ::
  Dd ('DdK 'SelUnused '[SelectAtom] a 'Prim)
offset =
  nocond (primMod (SelectAtom Offset (const dollar)))

order ::
  Order ->
  Dd ('DdK 'SelAuto '[SelectAtom] a 'Prim)
order dir =
  primMod (SelectAtom (Order dir) (\ (Selector sel) _ -> sel))