{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Opaleye.FunctionalJoin (
fullJoinF,
joinF,
leftJoinF,
rightJoinF,
) where
import Control.Applicative ((<$>), (<*>))
import Control.Arrow ((<<<))
import qualified Data.Profunctor.Product.Default as D
import qualified Data.Profunctor.Product as PP
import qualified Opaleye.Field as C
import qualified Opaleye.Field as F
import qualified Opaleye.Internal.Join as IJ
import qualified Opaleye.Internal.Operators as IO
import qualified Opaleye.Internal.Unpackspec as IU
import qualified Opaleye.Join as J
import qualified Opaleye.Select as S
import qualified Opaleye.SqlTypes as T
import qualified Opaleye.Operators as O
{-# DEPRECATED joinF "Use 'Opaleye.Operators.where_' and @do@ notation instead. Will be removed in 0.10." #-}
joinF :: (fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> F.Field T.SqlBool)
-> S.Select fieldsL
-> S.Select fieldsR
-> S.Select fieldsResult
joinF :: forall fieldsL fieldsR fieldsResult.
(fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> Field SqlBool)
-> Select fieldsL
-> Select fieldsR
-> Select fieldsResult
joinF fieldsL -> fieldsR -> fieldsResult
f fieldsL -> fieldsR -> Field SqlBool
cond Select fieldsL
l Select fieldsR
r =
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry fieldsL -> fieldsR -> fieldsResult
f) (forall a. (a -> Field SqlBool) -> SelectArr a a
O.keepWhen (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry fieldsL -> fieldsR -> Field SqlBool
cond) forall {k} (cat :: k -> k -> *) (b :: k) (c :: k) (a :: k).
Category cat =>
cat b c -> cat a b -> cat a c
<<< ((,) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Select fieldsL
l forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Select fieldsR
r))
{-# DEPRECATED leftJoinF "Use 'Opaleye.Join.optional' instead. Will be removed in 0.10." #-}
leftJoinF :: (D.Default IO.IfPP fieldsResult fieldsResult,
D.Default IU.Unpackspec fieldsL fieldsL,
D.Default IU.Unpackspec fieldsR fieldsR)
=> (fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsResult)
-> (fieldsL -> fieldsR -> F.Field T.SqlBool)
-> S.Select fieldsL
-> S.Select fieldsR
-> S.Select fieldsResult
leftJoinF :: forall fieldsResult fieldsL fieldsR.
(Default IfPP fieldsResult fieldsResult,
Default Unpackspec fieldsL fieldsL,
Default Unpackspec fieldsR fieldsR) =>
(fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsResult)
-> (fieldsL -> fieldsR -> Field SqlBool)
-> Select fieldsL
-> Select fieldsR
-> Select fieldsResult
leftJoinF fieldsL -> fieldsR -> fieldsResult
f fieldsL -> fieldsResult
fL fieldsL -> fieldsR -> Field SqlBool
cond Select fieldsL
l Select fieldsR
r = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a}. (fieldsL, (fieldsR, FieldNullable a)) -> fieldsResult
ret Select (fieldsL, (fieldsR, FieldNullable SqlBool))
j
where a1 :: SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
x -> (a
x, Bool -> Field SqlBool
T.sqlBool Bool
True))
j :: Select (fieldsL, (fieldsR, FieldNullable SqlBool))
j = forall fieldsL fieldsR nullableFieldsR.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (fieldsL, nullableFieldsR)
J.leftJoinExplicit forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
(forall (p :: * -> * -> *) a0 a1 b0 b1.
ProductProfunctor p =>
(p a0 b0, p a1 b1) -> p (a0, a1) (b0, b1)
PP.p2 (forall a b. (a -> b) -> NullMaker a b
IJ.NullMaker forall a. a -> a
id, NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool))
Select fieldsL
l
(forall {a}. SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 Select fieldsR
r)
(\(fieldsL
l', (fieldsR
r', Field SqlBool
_)) -> fieldsL -> fieldsR -> Field SqlBool
cond fieldsL
l' fieldsR
r')
ret :: (fieldsL, (fieldsR, FieldNullable a)) -> fieldsResult
ret (fieldsL
lr, (fieldsR
rr, FieldNullable a
rc)) = forall fields.
Default IfPP fields fields =>
Field SqlBool -> fields -> fields -> fields
O.ifThenElseMany (forall a. FieldNullable a -> Field SqlBool
C.isNull FieldNullable a
rc) (fieldsL -> fieldsResult
fL fieldsL
lr) (fieldsL -> fieldsR -> fieldsResult
f fieldsL
lr fieldsR
rr)
nullmakerBool :: IJ.NullMaker (F.Field T.SqlBool)
(F.FieldNullable T.SqlBool)
nullmakerBool :: NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool = forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
{-# DEPRECATED rightJoinF "Use 'Opaleye.Join.optional' instead. Will be removed in 0.10." #-}
rightJoinF :: (D.Default IO.IfPP fieldsResult fieldsResult,
D.Default IU.Unpackspec fieldsL fieldsL,
D.Default IU.Unpackspec fieldsR fieldsR)
=> (fieldsL -> fieldsR -> fieldsResult)
-> (fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> F.Field T.SqlBool)
-> S.Select fieldsL
-> S.Select fieldsR
-> S.Select fieldsResult
rightJoinF :: forall fieldsResult fieldsL fieldsR.
(Default IfPP fieldsResult fieldsResult,
Default Unpackspec fieldsL fieldsL,
Default Unpackspec fieldsR fieldsR) =>
(fieldsL -> fieldsR -> fieldsResult)
-> (fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> Field SqlBool)
-> Select fieldsL
-> Select fieldsR
-> Select fieldsResult
rightJoinF fieldsL -> fieldsR -> fieldsResult
f fieldsR -> fieldsResult
fR fieldsL -> fieldsR -> Field SqlBool
cond Select fieldsL
l Select fieldsR
r = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a}. ((fieldsL, FieldNullable a), fieldsR) -> fieldsResult
ret Select ((fieldsL, FieldNullable SqlBool), fieldsR)
j
where a1 :: SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
x -> (a
x, Bool -> Field SqlBool
T.sqlBool Bool
True))
j :: Select ((fieldsL, FieldNullable SqlBool), fieldsR)
j = forall fieldsL fieldsR nullableFieldsL.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsL nullableFieldsL
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, fieldsR)
J.rightJoinExplicit forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
(forall (p :: * -> * -> *) a0 a1 b0 b1.
ProductProfunctor p =>
(p a0 b0, p a1 b1) -> p (a0, a1) (b0, b1)
PP.p2 (forall a b. (a -> b) -> NullMaker a b
IJ.NullMaker forall a. a -> a
id, NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool))
(forall {a}. SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 Select fieldsL
l)
Select fieldsR
r
(\((fieldsL
l', Field SqlBool
_), fieldsR
r') -> fieldsL -> fieldsR -> Field SqlBool
cond fieldsL
l' fieldsR
r')
ret :: ((fieldsL, FieldNullable a), fieldsR) -> fieldsResult
ret ((fieldsL
lr, FieldNullable a
lc), fieldsR
rr) = forall fields.
Default IfPP fields fields =>
Field SqlBool -> fields -> fields -> fields
O.ifThenElseMany (forall a. FieldNullable a -> Field SqlBool
C.isNull FieldNullable a
lc) (fieldsR -> fieldsResult
fR fieldsR
rr) (fieldsL -> fieldsR -> fieldsResult
f fieldsL
lr fieldsR
rr)
nullmakerBool :: IJ.NullMaker (F.Field T.SqlBool)
(F.FieldNullable T.SqlBool)
nullmakerBool :: NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool = forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
fullJoinF :: (D.Default IO.IfPP fieldsResult fieldsResult,
D.Default IU.Unpackspec fieldsL fieldsL,
D.Default IU.Unpackspec fieldsR fieldsR)
=> (fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsResult)
-> (fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> F.Field T.SqlBool)
-> S.Select fieldsL
-> S.Select fieldsR
-> S.Select fieldsResult
fullJoinF :: forall fieldsResult fieldsL fieldsR.
(Default IfPP fieldsResult fieldsResult,
Default Unpackspec fieldsL fieldsL,
Default Unpackspec fieldsR fieldsR) =>
(fieldsL -> fieldsR -> fieldsResult)
-> (fieldsL -> fieldsResult)
-> (fieldsR -> fieldsResult)
-> (fieldsL -> fieldsR -> Field SqlBool)
-> Select fieldsL
-> Select fieldsR
-> Select fieldsResult
fullJoinF fieldsL -> fieldsR -> fieldsResult
f fieldsL -> fieldsResult
fL fieldsR -> fieldsResult
fR fieldsL -> fieldsR -> Field SqlBool
cond Select fieldsL
l Select fieldsR
r = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall {a} {a}.
((fieldsL, FieldNullable a), (fieldsR, FieldNullable a))
-> fieldsResult
ret Select
((fieldsL, FieldNullable SqlBool),
(fieldsR, FieldNullable SqlBool))
j
where a1 :: SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\a
x -> (a
x, Bool -> Field SqlBool
T.sqlBool Bool
True))
j :: Select
((fieldsL, FieldNullable SqlBool),
(fieldsR, FieldNullable SqlBool))
j = forall fieldsL fieldsR nullableFieldsL nullableFieldsR.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsL nullableFieldsL
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, nullableFieldsR)
J.fullJoinExplicit forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
(forall (p :: * -> * -> *) a0 a1 b0 b1.
ProductProfunctor p =>
(p a0 b0, p a1 b1) -> p (a0, a1) (b0, b1)
PP.p2 (forall a b. (a -> b) -> NullMaker a b
IJ.NullMaker forall a. a -> a
id, NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool))
(forall (p :: * -> * -> *) a0 a1 b0 b1.
ProductProfunctor p =>
(p a0 b0, p a1 b1) -> p (a0, a1) (b0, b1)
PP.p2 (forall a b. (a -> b) -> NullMaker a b
IJ.NullMaker forall a. a -> a
id, NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool))
(forall {a}. SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 Select fieldsL
l)
(forall {a}. SelectArr () a -> SelectArr () (a, Field SqlBool)
a1 Select fieldsR
r)
(\((fieldsL
l', Field SqlBool
_), (fieldsR
r', Field SqlBool
_)) -> fieldsL -> fieldsR -> Field SqlBool
cond fieldsL
l' fieldsR
r')
ret :: ((fieldsL, FieldNullable a), (fieldsR, FieldNullable a))
-> fieldsResult
ret ((fieldsL
lr, FieldNullable a
lc), (fieldsR
rr, FieldNullable a
rc)) = forall fields.
Default IfPP fields fields =>
Field SqlBool -> fields -> fields -> fields
O.ifThenElseMany (forall a. FieldNullable a -> Field SqlBool
C.isNull FieldNullable a
lc)
(fieldsR -> fieldsResult
fR fieldsR
rr)
(forall fields.
Default IfPP fields fields =>
Field SqlBool -> fields -> fields -> fields
O.ifThenElseMany (forall a. FieldNullable a -> Field SqlBool
C.isNull FieldNullable a
rc)
(fieldsL -> fieldsResult
fL fieldsL
lr)
(fieldsL -> fieldsR -> fieldsResult
f fieldsL
lr fieldsR
rr))
nullmakerBool :: IJ.NullMaker (F.Field T.SqlBool)
(F.FieldNullable T.SqlBool)
nullmakerBool :: NullMaker (Field SqlBool) (FieldNullable SqlBool)
nullmakerBool = forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def