Implement sub.
This commit is contained in:
parent
fe7a32e7e4
commit
33d04d5f27
@ -21,7 +21,7 @@ class (Functor query, Applicative query, Monad query) =>
|
|||||||
where_ :: expr (Single Bool) -> query ()
|
where_ :: expr (Single Bool) -> query ()
|
||||||
|
|
||||||
-- | Execute a subquery in an expression.
|
-- | Execute a subquery in an expression.
|
||||||
sub :: query (expr a) -> expr a
|
sub :: PersistField a => query (expr (Single a)) -> expr (Single a)
|
||||||
|
|
||||||
-- | Project a field of an entity.
|
-- | Project a field of an entity.
|
||||||
(^.) :: (PersistEntity val, PersistField typ) =>
|
(^.) :: (PersistEntity val, PersistField typ) =>
|
||||||
|
|||||||
@ -19,7 +19,6 @@ import Database.Persist.Store
|
|||||||
import qualified Control.Monad.Supply as S
|
import qualified Control.Monad.Supply as S
|
||||||
import qualified Control.Monad.Trans.Reader as R
|
import qualified Control.Monad.Trans.Reader as R
|
||||||
import qualified Control.Monad.Trans.Writer as W
|
import qualified Control.Monad.Trans.Writer as W
|
||||||
import qualified Data.Text as T
|
|
||||||
import qualified Data.Text.Lazy as TL
|
import qualified Data.Text.Lazy as TL
|
||||||
import qualified Data.Text.Lazy.Builder as TLB
|
import qualified Data.Text.Lazy.Builder as TLB
|
||||||
|
|
||||||
@ -102,6 +101,8 @@ instance Esqueleto SqlQuery SqlExpr SqlPersist where
|
|||||||
|
|
||||||
where_ expr = Q $ W.tell mempty { sdWhereClause = Where expr }
|
where_ expr = Q $ W.tell mempty { sdWhereClause = Where expr }
|
||||||
|
|
||||||
|
sub query = ERaw $ \esc -> first parens (toRawSelectSql esc query)
|
||||||
|
|
||||||
EEntity (I ident) ^. field = ERaw $ \esc -> (ident <> ("." <> name esc field), [])
|
EEntity (I ident) ^. field = ERaw $ \esc -> (ident <> ("." <> name esc field), [])
|
||||||
where name esc = esc . fieldDB . persistFieldDef
|
where name esc = esc . fieldDB . persistFieldDef
|
||||||
|
|
||||||
@ -144,7 +145,9 @@ select :: ( SqlSelect a
|
|||||||
=> SqlQuery a -> SqlPersist m [SqlSelectRet r]
|
=> SqlQuery a -> SqlPersist m [SqlSelectRet r]
|
||||||
select query = do
|
select query = do
|
||||||
conn <- getConnection
|
conn <- getConnection
|
||||||
uncurry rawSql $ toRawSelectSql (fromDBName conn) query
|
uncurry rawSql $
|
||||||
|
first (TL.toStrict . TLB.toLazyText) $
|
||||||
|
toRawSelectSql (fromDBName conn) query
|
||||||
|
|
||||||
|
|
||||||
-- | Get current database 'Connection'.
|
-- | Get current database 'Connection'.
|
||||||
@ -153,7 +156,7 @@ getConnection = SqlPersist R.ask
|
|||||||
|
|
||||||
|
|
||||||
-- | Pretty prints a 'SqlQuery' into a SQL query.
|
-- | Pretty prints a 'SqlQuery' into a SQL query.
|
||||||
toRawSelectSql :: SqlSelect a => Escape -> SqlQuery a -> (T.Text, [PersistValue])
|
toRawSelectSql :: SqlSelect a => Escape -> SqlQuery a -> (TLB.Builder, [PersistValue])
|
||||||
toRawSelectSql esc query =
|
toRawSelectSql esc query =
|
||||||
let (ret, SideData fromClauses whereClauses) =
|
let (ret, SideData fromClauses whereClauses) =
|
||||||
flip S.evalSupply (idents ()) $
|
flip S.evalSupply (idents ()) $
|
||||||
@ -163,9 +166,7 @@ toRawSelectSql esc query =
|
|||||||
(selectText, selectVars) = makeSelect esc ret
|
(selectText, selectVars) = makeSelect esc ret
|
||||||
(whereText, whereVars) = makeWhere esc whereClauses
|
(whereText, whereVars) = makeWhere esc whereClauses
|
||||||
|
|
||||||
text = TL.toStrict $
|
text = mconcat
|
||||||
TLB.toLazyText $
|
|
||||||
mconcat
|
|
||||||
[ "SELECT "
|
[ "SELECT "
|
||||||
, selectText
|
, selectText
|
||||||
, makeFrom esc fromClauses
|
, makeFrom esc fromClauses
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user