{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Database.Relational.Monad.Unique
( QueryUnique, unsafeUniqueSubQuery,
toSubQuery,
) where
import Control.Applicative (Applicative)
import Database.Relational.Internal.ContextType (Flat)
import Database.Relational.SqlSyntax
(Duplication, Record, JoinProduct, NodeAttr,
SubQuery, Predicate, Qualified, )
import qualified Database.Relational.Record as Record
import Database.Relational.Projectable (PlaceHolders)
import Database.Relational.Monad.Class (MonadQualify, MonadQuery)
import Database.Relational.Monad.Trans.Join (unsafeSubQueryWithAttr)
import Database.Relational.Monad.Trans.Restricting (restrictings)
import Database.Relational.Monad.BaseType (ConfigureQuery, askConfig)
import Database.Relational.Monad.Type (QueryCore, extractCore)
import Database.Relational.SqlSyntax (flatSubQuery)
newtype QueryUnique a = QueryUnique (QueryCore a)
deriving (MonadQualify ConfigureQuery, Monad QueryUnique
Functor QueryUnique
MonadQualify ConfigureQuery QueryUnique
Predicate Flat -> QueryUnique ()
Duplication -> QueryUnique ()
forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat r)
forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat (Maybe r))
forall (m :: * -> *).
Functor m
-> Monad m
-> MonadQualify ConfigureQuery m
-> (Duplication -> m ())
-> (Predicate Flat -> m ())
-> (forall p r. Relation p r -> m (PlaceHolders p, Record Flat r))
-> (forall p r.
Relation p r -> m (PlaceHolders p, Record Flat (Maybe r)))
-> MonadQuery m
queryMaybe' :: forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat (Maybe r))
$cqueryMaybe' :: forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat (Maybe r))
query' :: forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat r)
$cquery' :: forall p r.
Relation p r -> QueryUnique (PlaceHolders p, Record Flat r)
restrictJoin :: Predicate Flat -> QueryUnique ()
$crestrictJoin :: Predicate Flat -> QueryUnique ()
setDuplication :: Duplication -> QueryUnique ()
$csetDuplication :: Duplication -> QueryUnique ()
MonadQuery, Applicative QueryUnique
forall a. a -> QueryUnique a
forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
forall a b. QueryUnique a -> (a -> QueryUnique b) -> QueryUnique b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: forall a. a -> QueryUnique a
$creturn :: forall a. a -> QueryUnique a
>> :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
$c>> :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
>>= :: forall a b. QueryUnique a -> (a -> QueryUnique b) -> QueryUnique b
$c>>= :: forall a b. QueryUnique a -> (a -> QueryUnique b) -> QueryUnique b
Monad, Functor QueryUnique
forall a. a -> QueryUnique a
forall a b. QueryUnique a -> QueryUnique b -> QueryUnique a
forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
forall a b. QueryUnique (a -> b) -> QueryUnique a -> QueryUnique b
forall a b c.
(a -> b -> c) -> QueryUnique a -> QueryUnique b -> QueryUnique c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique a
$c<* :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique a
*> :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
$c*> :: forall a b. QueryUnique a -> QueryUnique b -> QueryUnique b
liftA2 :: forall a b c.
(a -> b -> c) -> QueryUnique a -> QueryUnique b -> QueryUnique c
$cliftA2 :: forall a b c.
(a -> b -> c) -> QueryUnique a -> QueryUnique b -> QueryUnique c
<*> :: forall a b. QueryUnique (a -> b) -> QueryUnique a -> QueryUnique b
$c<*> :: forall a b. QueryUnique (a -> b) -> QueryUnique a -> QueryUnique b
pure :: forall a. a -> QueryUnique a
$cpure :: forall a. a -> QueryUnique a
Applicative, forall a b. a -> QueryUnique b -> QueryUnique a
forall a b. (a -> b) -> QueryUnique a -> QueryUnique b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: forall a b. a -> QueryUnique b -> QueryUnique a
$c<$ :: forall a b. a -> QueryUnique b -> QueryUnique a
fmap :: forall a b. (a -> b) -> QueryUnique a -> QueryUnique b
$cfmap :: forall a b. (a -> b) -> QueryUnique a -> QueryUnique b
Functor)
unsafeUniqueSubQuery :: NodeAttr
-> Qualified SubQuery
-> QueryUnique (Record c r)
unsafeUniqueSubQuery :: forall c r.
NodeAttr -> Qualified SubQuery -> QueryUnique (Record c r)
unsafeUniqueSubQuery NodeAttr
a = forall a. QueryCore a -> QueryUnique a
QueryUnique forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (m :: * -> *) a c. Monad m => m a -> Restrictings c m a
restrictings forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (q :: * -> *) c r.
MonadQualify ConfigureQuery q =>
NodeAttr -> Qualified SubQuery -> QueryJoin q (Record c r)
unsafeSubQueryWithAttr NodeAttr
a
extract :: QueryUnique a
-> ConfigureQuery (((a, [Predicate Flat]), JoinProduct), Duplication)
(QueryUnique QueryCore a
c) = forall a.
QueryCore a
-> ConfigureQuery
(((a, [Predicate Flat]), JoinProduct), Duplication)
extractCore QueryCore a
c
toSubQuery :: QueryUnique (PlaceHolders p, Record c r)
-> ConfigureQuery SubQuery
toSubQuery :: forall p c r.
QueryUnique (PlaceHolders p, Record c r) -> ConfigureQuery SubQuery
toSubQuery QueryUnique (PlaceHolders p, Record c r)
q = do
((((PlaceHolders p
_ph, Record c r
pj), [Predicate Flat]
rs), JoinProduct
pd), Duplication
da) <- forall a.
QueryUnique a
-> ConfigureQuery
(((a, [Predicate Flat]), JoinProduct), Duplication)
extract QueryUnique (PlaceHolders p, Record c r)
q
Config
c <- ConfigureQuery Config
askConfig
forall (m :: * -> *) a. Monad m => a -> m a
return forall a b. (a -> b) -> a -> b
$ Config
-> Tuple
-> Duplication
-> JoinProduct
-> [Predicate Flat]
-> [OrderingTerm]
-> SubQuery
flatSubQuery Config
c (forall c r. Record c r -> Tuple
Record.untype Record c r
pj) Duplication
da JoinProduct
pd [Predicate Flat]
rs []