-- |
-- Module      : Database.Relational.Monad.Type
-- Copyright   : 2013-2017 Kei Hibino
-- License     : BSD3
--
-- Maintainer  : ex8k.hibino@gmail.com
-- Stability   : experimental
-- Portability : unknown
--
-- This module defines core query type.
module Database.Relational.Monad.Type
       ( -- * Core query monad
         QueryCore, extractCore,
         OrderedQuery,
       ) where

import Database.Relational.Internal.ContextType (Flat)
import Database.Relational.SqlSyntax
  (Duplication, Record, JoinProduct, Predicate, )

import Database.Relational.Projectable (PlaceHolders)
import Database.Relational.Monad.BaseType (ConfigureQuery)
import Database.Relational.Monad.Trans.Join (QueryJoin, extractProduct)
import Database.Relational.Monad.Trans.Restricting (Restrictings, extractRestrict)
import Database.Relational.Monad.Trans.Ordering (Orderings)


-- | Core query monad type used from flat(not-aggregated) query and aggregated query.
type QueryCore = Restrictings Flat (QueryJoin ConfigureQuery)

-- | Extract 'QueryCore' computation.
extractCore :: QueryCore a
            -> ConfigureQuery (((a, [Predicate Flat]), JoinProduct), Duplication)
extractCore :: QueryCore a
-> ConfigureQuery
     (((a, [Predicate Flat]), JoinProduct), Duplication)
extractCore =  QueryJoin (Qualify (QueryConfig Identity)) (a, [Predicate Flat])
-> ConfigureQuery
     (((a, [Predicate Flat]), JoinProduct), Duplication)
forall (m :: * -> *) a.
Functor m =>
QueryJoin m a -> m ((a, JoinProduct), Duplication)
extractProduct (QueryJoin (Qualify (QueryConfig Identity)) (a, [Predicate Flat])
 -> ConfigureQuery
      (((a, [Predicate Flat]), JoinProduct), Duplication))
-> (QueryCore a
    -> QueryJoin
         (Qualify (QueryConfig Identity)) (a, [Predicate Flat]))
->gt; ConfigureQuery
     (((a, [Predicate Flat]), JoinProduct), Duplication)
extractPrcduct (QueryJoin (Qualify (QueryConfig Identity)) (a, [Predicate Flat])
 -> ConfigureQuery
      (((a, [Predicate Flat]), JoinProduct), Duplication))
-> (QueryCore a
    -> QueryJoin
         (Qualify (QueryConfig Idottity)) (a, [Predicate Flat]))
->gt; ConfigureQuery
*99derings c m a -> Or     

Record.unsafeFromQualifidys.html#queryWithAttr"e Fl c m b ->n>

QueryJoinclassP     
  
<,7pa  
<,7pa Language.Haskell.TH.Lib.Extra (-> m (