{-# LANGUAGE
ConstraintKinds
, DeriveGeneric
, DerivingStrategies
, FlexibleContexts
, FlexibleInstances
, GADTs
, GeneralizedNewtypeDeriving
, LambdaCase
, MultiParamTypeClasses
, OverloadedLabels
, OverloadedStrings
, QuantifiedConstraints
, ScopedTypeVariables
, StandaloneDeriving
, TypeApplications
, TypeFamilies
, TypeInType
, TypeOperators
, RankNTypes
, UndecidableInstances
#-}
module Squeal.PostgreSQL.Query.From.Set
(
type (-|->)
, type (--|->)
, SetFun
, SetFunN
, generateSeries
, generateSeriesStep
, generateSeriesTimestamp
, unsafeSetFunction
, setFunction
, unsafeSetFunctionN
, setFunctionN
) where
import Data.ByteString (ByteString)
import Generics.SOP hiding (from)
import GHC.TypeLits
import qualified Generics.SOP as SOP
import Squeal.PostgreSQL.Type.Alias
import Squeal.PostgreSQL.Expression
import Squeal.PostgreSQL.Query.From
import Squeal.PostgreSQL.Render
import Squeal.PostgreSQL.Type.List
import Squeal.PostgreSQL.Type.Schema
type (-|->) arg set = forall db. SetFun db arg set
type (--|->) arg set = forall db. SetFunN db arg set
type SetFun db arg row
= forall lat with params
. Expression 'Ungrouped lat with db params '[] arg
-> FromClause lat with db params '[row]
type SetFunN db args set
= forall lat with params
. NP (Expression 'Ungrouped lat with db params '[]) args
-> FromClause lat with db params '[set]
unsafeSetFunction
:: forall fun ty row. KnownSymbol fun
=> ByteString
-> ty -|-> (fun ::: row)
unsafeSetFunction :: ByteString -> ty -|-> (fun ::: row)
unsafeSetFunction ByteString
fun Expression 'Ungrouped lat with db params '[] ty
x = ByteString -> FromClause lat with db params '[fun ::: row]
forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause (ByteString -> FromClause lat with db params '[fun ::: row])
-> ByteString -> FromClause lat with db params '[fun ::: row]
forall a b. (a -> b) -> a -> b
$
ByteString
fun ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString -> ByteString
parenthesized (Expression 'Ungrouped lat with db params '[] ty -> ByteString
forall sql. RenderSQL sql => sql -> ByteString
renderSQL Expression 'Ungrouped lat with db params '[] ty
x)
setFunction
:: ( Has sch db schema
, Has fun schema ('Function ('[ty] :=> 'ReturnsTable row)) )
=> QualifiedAlias sch fun
-> SetFun db ty (fun ::: row)
setFunction :: QualifiedAlias sch fun -> SetFun db ty (fun ::: row)
setFunction QualifiedAlias sch fun
fun = ByteString -> ty -|-> (fun ::: row)
forall (fun :: Symbol) (ty :: NullType) (row :: RowType).
KnownSymbol fun =>
ByteString -> ty -|-> (fun ::: row)
unsafeSetFunction (QualifiedAlias sch fun -> ByteString
forall sql. RenderSQL sql => sql -> ByteString
renderSQL QualifiedAlias sch fun
fun)
unsafeSetFunctionN
:: forall fun tys row. (SOP.SListI tys, KnownSymbol fun)
=> ByteString
-> tys --|-> (fun ::: row)
unsafeSetFunctionN :: ByteString -> tys --|-> (fun ::: row)
unsafeSetFunctionN ByteString
fun NP (Expression 'Ungrouped lat with db params '[]) tys
xs = ByteString -> FromClause lat with db params '[fun ::: row]
forall (lat :: FromType) (with :: FromType) (db :: SchemasType)
(params :: [NullType]) (from :: FromType).
ByteString -> FromClause lat with db params from
UnsafeFromClause (ByteString -> FromClause lat with db params '[fun ::: row])
-> ByteString -> FromClause lat with db params '[fun ::: row]
forall a b. (a -> b) -> a -> b
$
ByteString
fun ByteString -> ByteString -> ByteString
forall a. Semigroup a => a -> a -> a
<> ByteString -> ByteString
parenthesized ((forall (x :: NullType).
Expression 'Ungrouped lat with db params '[] x -> ByteString)
-> NP (Expression 'Ungrouped lat with db params '[]) tys
-> ByteString
forall k (xs :: [k]) (expression :: k -> *).
SListI xs =>
(forall (x :: k). expression x -> ByteString)
-> NP expression xs -> ByteString
renderCommaSeparated forall sql. RenderSQL sql => sql -> ByteString
forall (x :: NullType).
Expression 'Ungrouped lat with db params '[] x -> ByteString
renderSQL NP (Expression 'Ungrouped lat with db params '[]) tys
xs)
setFunctionN
:: ( Has sch db schema
, Has fun schema ('Function (tys :=> 'ReturnsTable row))
, SOP.SListI tys )
=> QualifiedAlias sch fun
-> SetFunN db tys (fun ::: row)
setFunctionN :: QualifiedAlias sch fun -> SetFunN db tys (fun ::: row)
setFunctionN QualifiedAlias sch fun
fun = ByteString -> tys --|-> (fun ::: row)
forall (fun :: Symbol) (tys :: [NullType]) (row :: RowType).
(SListI tys, KnownSymbol fun) =>
ByteString -> tys --|-> (fun ::: row)
unsafeSetFunctionN (QualifiedAlias sch fun -> ByteString
forall sql. RenderSQL sql => sql -> ByteString
renderSQL QualifiedAlias sch fun
fun)
generateSeries
:: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
=> '[ null ty, null ty] --|->
("generate_series" ::: '["generate_series" ::: null ty])
generateSeries :: '[null ty, null ty]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
generateSeries = ByteString
-> '[null ty, null ty]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
forall (fun :: Symbol) (tys :: [NullType]) (row :: RowType).
(SListI tys, KnownSymbol fun) =>
ByteString -> tys --|-> (fun ::: row)
unsafeSetFunctionN ByteString
"generate_series"
generateSeriesStep
:: ty `In` '[ 'PGint4, 'PGint8, 'PGnumeric]
=> '[null ty, null ty, null ty] --|->
("generate_series" ::: '["generate_series" ::: null ty])
generateSeriesStep :: '[null ty, null ty, null ty]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
generateSeriesStep = ByteString
-> '[null ty, null ty, null ty]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
forall (fun :: Symbol) (tys :: [NullType]) (row :: RowType).
(SListI tys, KnownSymbol fun) =>
ByteString -> tys --|-> (fun ::: row)
unsafeSetFunctionN ByteString
"generate_series"
generateSeriesTimestamp
:: ty `In` '[ 'PGtimestamp, 'PGtimestamptz]
=> '[null ty, null ty, null 'PGinterval] --|->
("generate_series" ::: '["generate_series" ::: null ty])
generateSeriesTimestamp :: '[null ty, null ty, null 'PGinterval]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
generateSeriesTimestamp = ByteString
-> '[null ty, null ty, null 'PGinterval]
--|-> ("generate_series" ::: '["generate_series" ::: null ty])
forall (fun :: Symbol) (tys :: [NullType]) (row :: RowType).
(SListI tys, KnownSymbol fun) =>
ByteString -> tys --|-> (fun ::: row)
unsafeSetFunctionN ByteString
"generate_series"