{-# language DataKinds #-}
module Rel8.Query.Exists
( exists, inQuery
, present, with, withBy
, absent, without, withoutBy
)
where
import Prelude hiding ( filter )
import qualified Opaleye.Exists as Opaleye
import qualified Opaleye.Operators as Opaleye
import Rel8.Expr ( Expr )
import Rel8.Expr.Opaleye ( fromColumn, fromPrimExpr )
import Rel8.Query ( Query )
import Rel8.Query.Filter ( filter )
import Rel8.Query.Opaleye ( mapOpaleye )
import Rel8.Table.Eq ( EqTable, (==:) )
exists :: Query a -> Query (Expr Bool)
exists :: forall a. Query a -> Query (Expr Bool)
exists = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. PrimExpr -> Expr a
fromPrimExpr forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (n :: Nullability) b. Field_ n b -> PrimExpr
fromColumn) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a b. (Select a -> Select b) -> Query a -> Query b
mapOpaleye forall a. Select a -> Select (Field_ 'NonNullable SqlBool)
Opaleye.exists
inQuery :: EqTable a => a -> Query a -> Query (Expr Bool)
inQuery :: forall a. EqTable a => a -> Query a -> Query (Expr Bool)
inQuery a
a = forall a. Query a -> Query (Expr Bool)
exists forall b c a. (b -> c) -> (a -> b) -> a -> c
. (forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (a -> Expr Bool) -> a -> Query a
filter (a
a forall a. EqTable a => a -> a -> Expr Bool
==:))
present :: Query a -> Query ()
present :: forall a. Query a -> Query ()
present = forall a b. (Select a -> Select b) -> Query a -> Query b
mapOpaleye forall a b. SelectArr a b -> SelectArr a ()
Opaleye.restrictExists
absent :: Query a -> Query ()
absent :: forall a. Query a -> Query ()
absent = forall a b. (Select a -> Select b) -> Query a -> Query b
mapOpaleye forall a b. SelectArr a b -> SelectArr a ()
Opaleye.restrictNotExists
with :: (a -> Query b) -> a -> Query a
with :: forall a b. (a -> Query b) -> a -> Query a
with a -> Query b
f a
a = a
a forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a. Query a -> Query ()
present (a -> Query b
f a
a)
withBy :: (a -> b -> Expr Bool) -> Query b -> a -> Query a
withBy :: forall a b. (a -> b -> Expr Bool) -> Query b -> a -> Query a
withBy a -> b -> Expr Bool
predicate Query b
bs = forall a b. (a -> Query b) -> a -> Query a
with forall a b. (a -> b) -> a -> b
$ \a
a -> Query b
bs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (a -> Expr Bool) -> a -> Query a
filter (a -> b -> Expr Bool
predicate a
a)
without :: (a -> Query b) -> a -> Query a
without :: forall a b. (a -> Query b) -> a -> Query a
without a -> Query b
f a
a = a
a forall (f :: * -> *) a b. Functor f => a -> f b -> f a
<$ forall a. Query a -> Query ()
absent (a -> Query b
f a
a)
withoutBy :: (a -> b -> Expr Bool) -> Query b -> a -> Query a
withoutBy :: forall a b. (a -> b -> Expr Bool) -> Query b -> a -> Query a
withoutBy a -> b -> Expr Bool
predicate Query b
bs = forall a b. (a -> Query b) -> a -> Query a
without forall a b. (a -> b) -> a -> b
$ \a
a -> Query b
bs forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall a. (a -> Expr Bool) -> a -> Query a
filter (a -> b -> Expr Bool
predicate a
a)