{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.ValueExpression
( ValueExpression
, cast
, ParameterName
, columnReference
, valueExpression
, rowValueConstructor
, functionCall
, functionCallNamedParams
)
where
import qualified Data.List.NonEmpty as NE
import Orville.PostgreSQL.Expr.DataType (DataType)
import Orville.PostgreSQL.Expr.Name (ColumnName, FunctionName)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
import Orville.PostgreSQL.Raw.SqlValue (SqlValue)
newtype ValueExpression = ValueExpression RawSql.RawSql
deriving (RawSql -> ValueExpression
ValueExpression -> RawSql
(ValueExpression -> RawSql)
-> (RawSql -> ValueExpression) -> SqlExpression ValueExpression
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: ValueExpression -> RawSql
toRawSql :: ValueExpression -> RawSql
$cunsafeFromRawSql :: RawSql -> ValueExpression
unsafeFromRawSql :: RawSql -> ValueExpression
RawSql.SqlExpression)
cast :: ValueExpression -> DataType -> ValueExpression
cast :: ValueExpression -> DataType -> ValueExpression
cast ValueExpression
value DataType
dataType =
RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression) -> RawSql -> ValueExpression
forall a b. (a -> b) -> a -> b
$
ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql ValueExpression
value
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"::"
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> DataType -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql DataType
dataType
columnReference :: ColumnName -> ValueExpression
columnReference :: ColumnName -> ValueExpression
columnReference = RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression)
-> (ColumnName -> RawSql) -> ColumnName -> ValueExpression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ColumnName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql
valueExpression :: SqlValue -> ValueExpression
valueExpression :: SqlValue -> ValueExpression
valueExpression = RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression)
-> (SqlValue -> RawSql) -> SqlValue -> ValueExpression
forall b c a. (b -> c) -> (a -> b) -> a -> c
. SqlValue -> RawSql
RawSql.parameter
rowValueConstructor :: NE.NonEmpty ValueExpression -> ValueExpression
rowValueConstructor :: NonEmpty ValueExpression -> ValueExpression
rowValueConstructor NonEmpty ValueExpression
elements =
RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression) -> RawSql -> ValueExpression
forall a b. (a -> b) -> a -> b
$
RawSql
RawSql.leftParen
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> NonEmpty ValueExpression -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.comma NonEmpty ValueExpression
elements
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
functionCall :: FunctionName -> [ValueExpression] -> ValueExpression
functionCall :: FunctionName -> [ValueExpression] -> ValueExpression
functionCall FunctionName
functionName [ValueExpression]
parameters =
RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression) -> RawSql -> ValueExpression
forall a b. (a -> b) -> a -> b
$
FunctionName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql FunctionName
functionName
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.leftParen
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> [ValueExpression] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.comma [ValueExpression]
parameters
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
newtype ParameterName = ParameterName RawSql.RawSql
deriving (RawSql -> ParameterName
ParameterName -> RawSql
(ParameterName -> RawSql)
-> (RawSql -> ParameterName) -> SqlExpression ParameterName
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: ParameterName -> RawSql
toRawSql :: ParameterName -> RawSql
$cunsafeFromRawSql :: RawSql -> ParameterName
unsafeFromRawSql :: RawSql -> ParameterName
RawSql.SqlExpression)
functionCallNamedParams :: FunctionName -> [(ParameterName, ValueExpression)] -> ValueExpression
functionCallNamedParams :: FunctionName
-> [(ParameterName, ValueExpression)] -> ValueExpression
functionCallNamedParams FunctionName
functionName [(ParameterName, ValueExpression)]
parameters =
RawSql -> ValueExpression
ValueExpression (RawSql -> ValueExpression) -> RawSql -> ValueExpression
forall a b. (a -> b) -> a -> b
$
FunctionName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql FunctionName
functionName
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.leftParen
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.comma (((ParameterName, ValueExpression) -> RawSql)
-> [(ParameterName, ValueExpression)] -> [RawSql]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ParameterName -> ValueExpression -> RawSql)
-> (ParameterName, ValueExpression) -> RawSql
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ParameterName -> ValueExpression -> RawSql
namedParameterArgument) [(ParameterName, ValueExpression)]
parameters)
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
namedParameterArgument :: ParameterName -> ValueExpression -> RawSql.RawSql
namedParameterArgument :: ParameterName -> ValueExpression -> RawSql
namedParameterArgument ParameterName
name ValueExpression
value =
ParameterName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql ParameterName
name
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> String -> RawSql
RawSql.fromString String
"=>"
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.space
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> ValueExpression -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql ValueExpression
value