{-# LANGUAGE FlexibleContexts      #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies          #-}
module Opaleye.Join where
import qualified Opaleye.Field               as F
import qualified Opaleye.Internal.Unpackspec as U
import qualified Opaleye.Internal.Join as J
import qualified Opaleye.Internal.MaybeFields as M
import qualified Opaleye.Internal.PrimQuery as PQ
import qualified Opaleye.Select   as S
import qualified Opaleye.SqlTypes as T
import qualified Data.Profunctor.Product.Default as D
optional :: D.Default U.Unpackspec a a
         => S.SelectArr i a
         
         -> S.SelectArr i (M.MaybeFields a)
         
         
         
optional :: forall a i.
Default Unpackspec a a =>
SelectArr i a -> SelectArr i (MaybeFields a)
optional = forall i a. SelectArr i a -> SelectArr i (MaybeFields a)
M.optional
optionalRestrict :: D.Default U.Unpackspec a a
                 => S.Select a
                 
                 -> S.SelectArr (a -> F.Field T.SqlBool) (M.MaybeFields a)
                 
                 
                 
                 
optionalRestrict :: forall a.
Default Unpackspec a a =>
Select a -> SelectArr (a -> Field SqlBool) (MaybeFields a)
optionalRestrict = forall a.
Default Unpackspec a a =>
Select a -> SelectArr (a -> Field SqlBool) (MaybeFields a)
J.optionalRestrict
leftJoin  :: (D.Default U.Unpackspec fieldsL fieldsL,
              D.Default U.Unpackspec fieldsR fieldsR,
              D.Default J.NullMaker fieldsR nullableFieldsR)
          => S.Select fieldsL  
          -> S.Select fieldsR  
          -> ((fieldsL, fieldsR) -> F.Field T.SqlBool) 
          -> S.Select (fieldsL, nullableFieldsR) 
leftJoin :: forall fieldsL fieldsR nullableFieldsR.
(Default Unpackspec fieldsL fieldsL,
 Default Unpackspec fieldsR fieldsR,
 Default NullMaker fieldsR nullableFieldsR) =>
Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (fieldsL, nullableFieldsR)
leftJoin = forall fieldsL fieldsR nullableFieldsR.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (fieldsL, nullableFieldsR)
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 :: * -> * -> *) a b. Default p a b => p a b
D.def
leftJoinA :: (D.Default U.Unpackspec fieldsR fieldsR,
              D.Default J.NullMaker fieldsR nullableFieldsR)
          => S.Select fieldsR
          
          -> S.SelectArr (fieldsR -> F.Field T.SqlBool) nullableFieldsR
          
          
leftJoinA :: forall fieldsR nullableFieldsR.
(Default Unpackspec fieldsR fieldsR,
 Default NullMaker fieldsR nullableFieldsR) =>
Select fieldsR
-> SelectArr (fieldsR -> Field SqlBool) nullableFieldsR
leftJoinA = forall fieldsR nullableFieldsR.
Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsR
-> SelectArr (fieldsR -> Field SqlBool) nullableFieldsR
leftJoinAExplict 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
rightJoin  :: (D.Default U.Unpackspec fieldsL fieldsL,
               D.Default U.Unpackspec fieldsR fieldsR,
               D.Default J.NullMaker fieldsL nullableFieldsL)
           => S.Select fieldsL 
           -> S.Select fieldsR 
           -> ((fieldsL, fieldsR) -> F.Field T.SqlBool) 
           -> S.Select (nullableFieldsL, fieldsR) 
rightJoin :: forall fieldsL fieldsR nullableFieldsL.
(Default Unpackspec fieldsL fieldsL,
 Default Unpackspec fieldsR fieldsR,
 Default NullMaker fieldsL nullableFieldsL) =>
Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, fieldsR)
rightJoin = forall fieldsL fieldsR nullableFieldsL.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsL nullableFieldsL
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, fieldsR)
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 :: * -> * -> *) a b. Default p a b => p a b
D.def
fullJoin  :: (D.Default U.Unpackspec fieldsL fieldsL,
              D.Default U.Unpackspec fieldsR fieldsR,
              D.Default J.NullMaker fieldsL nullableFieldsL,
              D.Default J.NullMaker fieldsR nullableFieldsR)
          => S.Select fieldsL 
          -> S.Select fieldsR 
          -> ((fieldsL, fieldsR) -> F.Field T.SqlBool) 
          -> S.Select (nullableFieldsL, nullableFieldsR) 
fullJoin :: forall fieldsL fieldsR nullableFieldsL nullableFieldsR.
(Default Unpackspec fieldsL fieldsL,
 Default Unpackspec fieldsR fieldsR,
 Default NullMaker fieldsL nullableFieldsL,
 Default NullMaker fieldsR nullableFieldsR) =>
Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, nullableFieldsR)
fullJoin = 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)
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 :: * -> * -> *) a b. Default p a b => p a b
D.def forall (p :: * -> * -> *) a b. Default p a b => p a b
D.def
leftJoinExplicit :: U.Unpackspec fieldsL fieldsL
                 -> U.Unpackspec fieldsR fieldsR
                 -> J.NullMaker fieldsR nullableFieldsR
                 -> S.Select fieldsL -> S.Select fieldsR
                 -> ((fieldsL, fieldsR) -> F.Field T.SqlBool)
                 -> S.Select (fieldsL, nullableFieldsR)
leftJoinExplicit :: forall fieldsL fieldsR nullableFieldsR.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (fieldsL, nullableFieldsR)
leftJoinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB NullMaker fieldsR nullableFieldsR
nullmaker =
  forall columnsA columnsB returnedColumnsA returnedColumnsB.
Unpackspec columnsA columnsA
-> Unpackspec columnsB columnsB
-> (columnsA -> returnedColumnsA)
-> (columnsB -> returnedColumnsB)
-> JoinType
-> Query columnsA
-> Query columnsB
-> ((columnsA, columnsB) -> Field SqlBool)
-> Query (returnedColumnsA, returnedColumnsB)
J.joinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB forall a. a -> a
id (forall a b. NullMaker a b -> a -> b
J.toNullable NullMaker fieldsR nullableFieldsR
nullmaker) JoinType
PQ.LeftJoin
leftJoinAExplict :: U.Unpackspec fieldsR fieldsR
                 -> J.NullMaker fieldsR nullableFieldsR
                 -> S.Select fieldsR
                 -> S.SelectArr (fieldsR -> F.Field T.SqlBool) nullableFieldsR
leftJoinAExplict :: forall fieldsR nullableFieldsR.
Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsR
-> SelectArr (fieldsR -> Field SqlBool) nullableFieldsR
leftJoinAExplict = forall fieldsR nullableFieldsR.
Unpackspec fieldsR fieldsR
-> NullMaker fieldsR nullableFieldsR
-> Select fieldsR
-> SelectArr (fieldsR -> Field SqlBool) nullableFieldsR
J.leftJoinAExplicit
rightJoinExplicit :: U.Unpackspec fieldsL fieldsL
                  -> U.Unpackspec fieldsR fieldsR
                  -> J.NullMaker fieldsL nullableFieldsL
                  -> S.Select fieldsL -> S.Select fieldsR
                  -> ((fieldsL, fieldsR) -> F.Field T.SqlBool)
                  -> S.Select (nullableFieldsL, fieldsR)
rightJoinExplicit :: forall fieldsL fieldsR nullableFieldsL.
Unpackspec fieldsL fieldsL
-> Unpackspec fieldsR fieldsR
-> NullMaker fieldsL nullableFieldsL
-> Select fieldsL
-> Select fieldsR
-> ((fieldsL, fieldsR) -> Field SqlBool)
-> Select (nullableFieldsL, fieldsR)
rightJoinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB NullMaker fieldsL nullableFieldsL
nullmaker =
  forall columnsA columnsB returnedColumnsA returnedColumnsB.
Unpackspec columnsA columnsA
-> Unpackspec columnsB columnsB
-> (columnsA -> returnedColumnsA)
-> (columnsB -> returnedColumnsB)
-> JoinType
-> Query columnsA
-> Query columnsB
-> ((columnsA, columnsB) -> Field SqlBool)
-> Query (returnedColumnsA, returnedColumnsB)
J.joinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB (forall a b. NullMaker a b -> a -> b
J.toNullable NullMaker fieldsL nullableFieldsL
nullmaker) forall a. a -> a
id JoinType
PQ.RightJoin
fullJoinExplicit :: U.Unpackspec fieldsL fieldsL
                 -> U.Unpackspec fieldsR fieldsR
                 -> J.NullMaker fieldsL nullableFieldsL
                 -> J.NullMaker fieldsR nullableFieldsR
                 -> S.Select fieldsL -> S.Select fieldsR
                 -> ((fieldsL, fieldsR) -> F.Field T.SqlBool)
                 -> S.Select (nullableFieldsL, nullableFieldsR)
fullJoinExplicit :: 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)
fullJoinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB NullMaker fieldsL nullableFieldsL
nullmakerA NullMaker fieldsR nullableFieldsR
nullmakerB =
  forall columnsA columnsB returnedColumnsA returnedColumnsB.
Unpackspec columnsA columnsA
-> Unpackspec columnsB columnsB
-> (columnsA -> returnedColumnsA)
-> (columnsB -> returnedColumnsB)
-> JoinType
-> Query columnsA
-> Query columnsB
-> ((columnsA, columnsB) -> Field SqlBool)
-> Query (returnedColumnsA, returnedColumnsB)
J.joinExplicit Unpackspec fieldsL fieldsL
uA Unpackspec fieldsR fieldsR
uB (forall a b. NullMaker a b -> a -> b
J.toNullable NullMaker fieldsL nullableFieldsL
nullmakerA) (forall a b. NullMaker a b -> a -> b
J.toNullable NullMaker fieldsR nullableFieldsR
nullmakerB) JoinType
PQ.FullJoin
optionalRestrictExplicit :: U.Unpackspec a a
                         -> S.Select a
                         -> S.SelectArr (a -> F.Field T.SqlBool) (M.MaybeFields a)
optionalRestrictExplicit :: forall a.
Unpackspec a a
-> Select a -> SelectArr (a -> Field SqlBool) (MaybeFields a)
optionalRestrictExplicit = forall a.
Unpackspec a a
-> Select a -> SelectArr (a -> Field SqlBool) (MaybeFields a)
J.optionalRestrictExplicit
optionalExplicit :: U.Unpackspec a a
                 -> S.SelectArr i a
                 -> S.SelectArr i (M.MaybeFields a)
optionalExplicit :: forall a i.
Unpackspec a a -> SelectArr i a -> SelectArr i (MaybeFields a)
optionalExplicit Unpackspec a a
_ = forall i a. SelectArr i a -> SelectArr i (MaybeFields a)
M.optional