From 33d04d5f2761698bb4b263f8d5e4840f16c86f4b Mon Sep 17 00:00:00 2001 From: Felipe Lessa Date: Mon, 3 Sep 2012 15:57:20 -0300 Subject: [PATCH] Implement sub. --- src/Database/Esqueleto/Internal/Language.hs | 2 +- src/Database/Esqueleto/Internal/Sql.hs | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Database/Esqueleto/Internal/Language.hs b/src/Database/Esqueleto/Internal/Language.hs index 96d135a..10a14e1 100644 --- a/src/Database/Esqueleto/Internal/Language.hs +++ b/src/Database/Esqueleto/Internal/Language.hs @@ -21,7 +21,7 @@ class (Functor query, Applicative query, Monad query) => where_ :: expr (Single Bool) -> query () -- | 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. (^.) :: (PersistEntity val, PersistField typ) => diff --git a/src/Database/Esqueleto/Internal/Sql.hs b/src/Database/Esqueleto/Internal/Sql.hs index a829edf..0ae70f6 100644 --- a/src/Database/Esqueleto/Internal/Sql.hs +++ b/src/Database/Esqueleto/Internal/Sql.hs @@ -19,7 +19,6 @@ import Database.Persist.Store import qualified Control.Monad.Supply as S import qualified Control.Monad.Trans.Reader as R 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.Builder as TLB @@ -102,6 +101,8 @@ instance Esqueleto SqlQuery SqlExpr SqlPersist where 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), []) where name esc = esc . fieldDB . persistFieldDef @@ -144,7 +145,9 @@ select :: ( SqlSelect a => SqlQuery a -> SqlPersist m [SqlSelectRet r] select query = do conn <- getConnection - uncurry rawSql $ toRawSelectSql (fromDBName conn) query + uncurry rawSql $ + first (TL.toStrict . TLB.toLazyText) $ + toRawSelectSql (fromDBName conn) query -- | Get current database 'Connection'. @@ -153,7 +156,7 @@ getConnection = SqlPersist R.ask -- | 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 = let (ret, SideData fromClauses whereClauses) = flip S.evalSupply (idents ()) $ @@ -163,9 +166,7 @@ toRawSelectSql esc query = (selectText, selectVars) = makeSelect esc ret (whereText, whereVars) = makeWhere esc whereClauses - text = TL.toStrict $ - TLB.toLazyText $ - mconcat + text = mconcat [ "SELECT " , selectText , makeFrom esc fromClauses