{-# LANGUAGE
ConstraintKinds
, DeriveGeneric
, DerivingStrategies
, FlexibleContexts
, FlexibleInstances
, GADTs
, GeneralizedNewtypeDeriving
, LambdaCase
, MultiParamTypeClasses
, OverloadedLabels
, OverloadedStrings
, QuantifiedConstraints
, ScopedTypeVariables
, StandaloneDeriving
, TypeApplications
, TypeFamilies
, DataKinds
, PolyKinds
, TypeOperators
, RankNTypes
, UndecidableInstances
#-}
module Squeal.PostgreSQL.Query.From.Join
(
JoinItem (..)
, cross, crossJoin, crossJoinLateral
, inner, innerJoin, innerJoinLateral
, leftOuter, leftOuterJoin, leftOuterJoinLateral
, rightOuter, rightOuterJoin, rightOuterJoinLateral
, fullOuter, fullOuterJoin, fullOuterJoinLateral
) where
import Generics.SOP hiding (from)
import qualified Generics.SOP as SOP
import Squeal.PostgreSQL.Type.Alias
import Squeal.PostgreSQL.Expression
import Squeal.PostgreSQL.Expression.Logic
import Squeal.PostgreSQL.Query
import Squeal.PostgreSQL.Query.From
import Squeal.PostgreSQL.Query.From.Set
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.List
import Squeal.PostgreSQL.Type.Schema
data JoinItem
(lat :: FromType)
(with :: FromType)
(db :: SchemasType)
(params :: [NullType])
(left :: FromType)
(right :: FromType) where
Join
:: FromClause lat with db params right
-> JoinItem lat with db params left right
JoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinFunction
:: SetFun db arg set
-> Expression 'Ungrouped lat with db params left arg
-> JoinItem lat with db params left '[set]
JoinFunctionN
:: SListI args
=> SetFunN db args set
-> NP (Expression 'Ungrouped lat with db params left) args
-> JoinItem lat with db params left '[set]
instance RenderSQL (JoinItem lat with db params left right) where
renderSQL :: JoinItem lat with db params left right -> ByteString
renderSQL = \case
Join FromClause lat with db params right
tab -> ByteString
"JOIN" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params right
tab
JoinLateral Aliased (Query (Join lat left) with db params) query
qry -> ByteString
"JOIN LATERAL" ByteString -> ByteString -> ByteString
<+>
forall {k} (expression :: k -> *) (aliased :: (Symbol, k)).
(forall (ty :: k). expression ty -> ByteString)
-> Aliased expression aliased -> ByteString
renderAliased (ByteString -> ByteString
parenthesized forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall sql. RenderSQL sql => sql -> ByteString
renderSQL) Aliased (Query (Join lat left) with db params) query
qry
JoinFunction SetFun db arg set
fun Expression 'Ungrouped lat with db params left arg
x -> ByteString
"JOIN" ByteString -> ByteString -> ByteString
<+>
forall sql. RenderSQL sql => sql -> ByteString
renderSQL (SetFun db arg set
fun (forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType]) (from :: FromType)
(ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression 'Ungrouped lat with db params left arg
x)))
JoinFunctionN SetFunN db args set
fun NP (Expression 'Ungrouped lat with db params left) args
xs -> ByteString
"JOIN" ByteString -> ByteString -> ByteString
<+>
forall sql. RenderSQL sql => sql -> ByteString
renderSQL (SetFunN db args set
fun (forall {k} {l} (h :: (k -> *) -> l -> *) (xs :: l) (f :: k -> *)
(f' :: k -> *).
(SListIN (Prod h) xs, HAp h) =>
(forall (a :: k). f a -> f' a) -> h f xs -> h f' xs
SOP.hmap (forall (grp :: Grouping) (lat :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType]) (from :: FromType)
(ty :: NullType).
ByteString -> Expression grp lat with db params from ty
UnsafeExpression forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall sql. RenderSQL sql => sql -> ByteString
renderSQL) NP (Expression 'Ungrouped lat with db params left) args
xs))
cross
:: JoinItem lat with db params left right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
cross :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
cross JoinItem lat with db params left right
item FromClause lat with db params left
tab = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause forall a b. (a -> b) -> a -> b
$
forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params left
tab ByteString -> ByteString -> ByteString
<+> ByteString
"CROSS" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL JoinItem lat with db params left right
item
crossJoin
:: FromClause lat with db params right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
crossJoin :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
crossJoin = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
cross forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> JoinItem lat with db params left right
Join
crossJoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> FromClause lat with db params left
-> FromClause lat with db params (Join left '[query])
crossJoinLateral :: forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> FromClause lat with db params left
-> FromClause lat with db params (Join left '[query])
crossJoinLateral = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
cross forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinLateral
inner
:: JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
inner :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
inner JoinItem lat with db params left right
item Condition 'Ungrouped lat with db params (Join left right)
on FromClause lat with db params left
tab = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause forall a b. (a -> b) -> a -> b
$
forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params left
tab ByteString -> ByteString -> ByteString
<+> ByteString
"INNER" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL JoinItem lat with db params left right
item ByteString -> ByteString -> ByteString
<+> ByteString
"ON" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Condition 'Ungrouped lat with db params (Join left right)
on
innerJoin
:: FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
innerJoin :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
innerJoin = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
inner forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> JoinItem lat with db params left right
Join
innerJoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join left '[query])
innerJoinLateral :: forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join left '[query])
innerJoinLateral = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left right)
inner forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinLateral
leftOuter
:: JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuter :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuter JoinItem lat with db params left right
item Condition 'Ungrouped lat with db params (Join left right)
on FromClause lat with db params left
tab = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause forall a b. (a -> b) -> a -> b
$
forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params left
tab ByteString -> ByteString -> ByteString
<+> ByteString
"LEFT OUTER" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL JoinItem lat with db params left right
item ByteString -> ByteString -> ByteString
<+> ByteString
"ON" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Condition 'Ungrouped lat with db params (Join left right)
on
leftOuterJoin
:: FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuterJoin :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuterJoin = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> JoinItem lat with db params left right
Join
leftOuterJoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom '[query]))
leftOuterJoinLateral :: forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom '[query]))
leftOuterJoinLateral = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join left (NullifyFrom right))
leftOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinLateral
rightOuter
:: JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuter :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuter JoinItem lat with db params left right
item Condition 'Ungrouped lat with db params (Join left right)
on FromClause lat with db params left
tab = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause forall a b. (a -> b) -> a -> b
$
forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params left
tab ByteString -> ByteString -> ByteString
<+> ByteString
"RIGHT OUTER" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL JoinItem lat with db params left right
item ByteString -> ByteString -> ByteString
<+> ByteString
"ON" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Condition 'Ungrouped lat with db params (Join left right)
on
rightOuterJoin
:: FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuterJoin :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuterJoin = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> JoinItem lat with db params left right
Join
rightOuterJoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) '[query])
rightOuterJoinLateral :: forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) '[query])
rightOuterJoinLateral = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (Join (NullifyFrom left) right)
rightOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinLateral
fullOuter
:: JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuter :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuter JoinItem lat with db params left right
item Condition 'Ungrouped lat with db params (Join left right)
on FromClause lat with db params left
tab = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause forall a b. (a -> b) -> a -> b
$
forall sql. RenderSQL sql => sql -> ByteString
renderSQL FromClause lat with db params left
tab ByteString -> ByteString -> ByteString
<+> ByteString
"FULL OUTER" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL JoinItem lat with db params left right
item ByteString -> ByteString -> ByteString
<+> ByteString
"ON" ByteString -> ByteString -> ByteString
<+> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Condition 'Ungrouped lat with db params (Join left right)
on
fullOuterJoin
:: FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuterJoin :: forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuterJoin = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (right :: FromType) (left :: FromType).
FromClause lat with db params right
-> JoinItem lat with db params left right
Join
fullOuterJoinLateral
:: Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left '[query]))
fullOuterJoinLateral :: forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> Condition 'Ungrouped lat with db params (Join left '[query])
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left '[query]))
fullOuterJoinLateral = forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (left :: FromType) (right :: FromType).
JoinItem lat with db params left right
-> Condition 'Ungrouped lat with db params (Join left right)
-> FromClause lat with db params left
-> FromClause lat with db params (NullifyFrom (Join left right))
fullOuter forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (lat :: FromType) (left :: FromType) (with :: FromType)
(db :: SchemasType) (params :: [NullType])
(query :: (Symbol, RowType)).
Aliased (Query (Join lat left) with db params) query
-> JoinItem lat with db params left '[query]
JoinLateral