{-# LANGUAGE
AllowAmbiguousTypes
, DataKinds
, FlexibleContexts
, FlexibleInstances
, MultiParamTypeClasses
, OverloadedLabels
, OverloadedStrings
, RankNTypes
, ScopedTypeVariables
, TypeApplications
, TypeFamilies
, TypeOperators
, UndecidableInstances
#-}
module Squeal.PostgreSQL.Expression.Composite
(
row
, rowStar
, field
) where
import qualified Generics.SOP as SOP
import Squeal.PostgreSQL.Type.Alias
import Squeal.PostgreSQL.Expression
import Squeal.PostgreSQL.Type.List
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.Schema
row
:: SOP.SListI row
=> NP (Aliased (Expression grp lat with db params from)) row
-> Expression grp lat with db params from (null ('PGcomposite row))
row :: forall (row :: [(Symbol, NullType)]) (grp :: Grouping)
(lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType)
(null :: PGType -> NullType).
SListI row =>
NP (Aliased (Expression grp lat with db params from)) row
-> Expression grp lat with db params from (null ('PGcomposite row))
row NP (Aliased (Expression grp lat with db params from)) row
exprs = 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 a b. (a -> b) -> a -> b
$ ByteString
"ROW" forall a. Semigroup a => a -> a -> a
<> ByteString -> ByteString
parenthesized
(forall {k} (xs :: [k]) (expression :: k -> *).
SListI xs =>
(forall (x :: k). expression x -> ByteString)
-> NP expression xs -> ByteString
renderCommaSeparated (\ (Expression grp lat with db params from ty
expr `As` Alias alias
_) -> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression grp lat with db params from ty
expr) NP (Aliased (Expression grp lat with db params from)) row
exprs)
rowStar
:: Has tab from row
=> Alias tab
-> Expression grp lat with db params from (null ('PGcomposite row))
rowStar :: forall (tab :: Symbol) (from :: FromType)
(row :: [(Symbol, NullType)]) (grp :: Grouping) (lat :: FromType)
(with :: FromType) (db :: SchemasType) (params :: [NullType])
(null :: PGType -> NullType).
Has tab from row =>
Alias tab
-> Expression grp lat with db params from (null ('PGcomposite row))
rowStar Alias tab
tab = 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 a b. (a -> b) -> a -> b
$ ByteString
"ROW" forall a. Semigroup a => a -> a -> a
<>
ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Alias tab
tab forall a. Semigroup a => a -> a -> a
<> ByteString
".*")
field
:: ( relss ~ DbRelations db
, Has sch relss rels
, Has rel rels row
, Has field row ty
)
=> QualifiedAlias sch rel
-> Alias field
-> Expression grp lat with db params from ('NotNull ('PGcomposite row))
-> Expression grp lat with db params from ty
field :: forall (relss :: [(Symbol, FromType)]) (db :: SchemasType)
(sch :: Symbol) (rels :: FromType) (rel :: Symbol)
(row :: [(Symbol, NullType)]) (field :: Symbol) (ty :: NullType)
(grp :: Grouping) (lat :: FromType) (with :: FromType)
(params :: [NullType]) (from :: FromType).
(relss ~ DbRelations db, Has sch relss rels, Has rel rels row,
Has field row ty) =>
QualifiedAlias sch rel
-> Alias field
-> Expression
grp lat with db params from ('NotNull ('PGcomposite row))
-> Expression grp lat with db params from ty
field QualifiedAlias sch rel
rel Alias field
fld Expression
grp lat with db params from ('NotNull ('PGcomposite row))
expr = 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 a b. (a -> b) -> a -> b
$
ByteString -> ByteString
parenthesized (forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression
grp lat with db params from ('NotNull ('PGcomposite row))
expr forall a. Semigroup a => a -> a -> a
<> ByteString
"::" forall a. Semigroup a => a -> a -> a
<> forall sql. RenderSQL sql => sql -> ByteString
renderSQL QualifiedAlias sch rel
rel)
forall a. Semigroup a => a -> a -> a
<> ByteString
"." forall a. Semigroup a => a -> a -> a
<> forall sql. RenderSQL sql => sql -> ByteString
renderSQL Alias field
fld