module Database.Relational.Query.Monad.Simple (
QuerySimple, SimpleQuery,
simple,
toSQL,
toSubQuery,
) where
import Database.Relational.Query.Context (Flat)
import Database.Relational.Query.Projection (Projection)
import qualified Database.Relational.Query.Projection as Projection
import Database.Relational.Query.Internal.BaseSQL (Duplication, OrderingTerm)
import Database.Relational.Query.Monad.Trans.Join (join')
import Database.Relational.Query.Monad.Trans.Restricting (restrictings)
import Database.Relational.Query.Monad.Trans.Ordering
(Orderings, orderings, extractOrderingTerms)
import Database.Relational.Query.Monad.BaseType (ConfigureQuery, askConfig)
import Database.Relational.Query.Monad.Type (QueryCore, extractCore, OrderedQuery)
import Database.Relational.Query.Projectable (PlaceHolders)
import Database.Relational.Query.Sub (SubQuery, QueryRestriction, JoinProduct, flatSubQuery)
import qualified Database.Relational.Query.Sub as SubQuery
type QuerySimple = Orderings Flat QueryCore
type SimpleQuery p r = OrderedQuery Flat QueryCore p r
simple :: ConfigureQuery a -> QuerySimple a
simple = orderings . restrictings . join'
extract :: SimpleQuery p r
-> ConfigureQuery (((((PlaceHolders p, Projection Flat r), [OrderingTerm]), QueryRestriction Flat),
JoinProduct), Duplication)
extract = extractCore . extractOrderingTerms
toSQL :: SimpleQuery p r
-> ConfigureQuery String
toSQL = fmap SubQuery.toSQL . toSubQuery
toSubQuery :: SimpleQuery p r
-> ConfigureQuery SubQuery
toSubQuery q = do
(((((_ph, pj), ot), rs), pd), da) <- extract q
c <- askConfig
return $ flatSubQuery c (Projection.untype pj) da pd rs ot