{-# 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 exprs = UnsafeExpression $ "ROW" <> parenthesized
(renderCommaSeparated (\ (expr `As` _) -> renderSQL expr) exprs)
rowStar
:: Has tab from row
=> Alias tab
-> Expression grp lat with db params from (null ('PGcomposite row))
rowStar tab = UnsafeExpression $ "ROW" <>
parenthesized (renderSQL tab <> ".*")
field
:: ( Has sch db schema
, Has tydef schema ('Typedef ('PGcomposite row))
, Has field row ty)
=> QualifiedAlias sch tydef
-> Alias field
-> Expression grp lat with db params from ('NotNull ('PGcomposite row))
-> Expression grp lat with db params from ty
field td fld expr = UnsafeExpression $
parenthesized (renderSQL expr <> "::" <> renderSQL td)
<> "." <> renderSQL fld