module Database.Relational.Monad.Type
       ( 
         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)
type QueryCore = Restrictings Flat (QueryJoin ConfigureQuery)
extractCore :: QueryCore a
            -> ConfigureQuery (((a, [Predicate Flat]), JoinProduct), Duplication)
extractCore =  extractProduct . extractRestrict
type OrderedQuery c m p r = Orderings c m (PlaceHolders p, Record c r)