{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Orville.PostgreSQL.Expr.Insert
( InsertExpr
, insertExpr
, InsertColumnList
, insertColumnList
, InsertSource
, insertSqlValues
, RowValues
, rowValues
)
where
import Data.Maybe (catMaybes)
import Orville.PostgreSQL.Expr.Name (ColumnName, Qualified, TableName)
import Orville.PostgreSQL.Expr.ReturningExpr (ReturningExpr)
import qualified Orville.PostgreSQL.Raw.RawSql as RawSql
import Orville.PostgreSQL.Raw.SqlValue (SqlValue)
newtype InsertExpr
= InsertExpr RawSql.RawSql
deriving
(
RawSql -> InsertExpr
InsertExpr -> RawSql
(InsertExpr -> RawSql)
-> (RawSql -> InsertExpr) -> SqlExpression InsertExpr
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: InsertExpr -> RawSql
toRawSql :: InsertExpr -> RawSql
$cunsafeFromRawSql :: RawSql -> InsertExpr
unsafeFromRawSql :: RawSql -> InsertExpr
RawSql.SqlExpression
)
insertExpr ::
Qualified TableName ->
Maybe InsertColumnList ->
InsertSource ->
Maybe ReturningExpr ->
InsertExpr
insertExpr :: Qualified TableName
-> Maybe InsertColumnList
-> InsertSource
-> Maybe ReturningExpr
-> InsertExpr
insertExpr Qualified TableName
target Maybe InsertColumnList
maybeInsertColumns InsertSource
source Maybe ReturningExpr
maybeReturning =
RawSql -> InsertExpr
InsertExpr
(RawSql -> InsertExpr)
-> ([RawSql] -> RawSql) -> [RawSql] -> InsertExpr
forall b c a. (b -> c) -> (a -> b) -> a -> c
. RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.space
([RawSql] -> InsertExpr) -> [RawSql] -> InsertExpr
forall a b. (a -> b) -> a -> b
$ [Maybe RawSql] -> [RawSql]
forall a. [Maybe a] -> [a]
catMaybes
[ RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ String -> RawSql
RawSql.fromString String
"INSERT INTO"
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ Qualified TableName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Qualified TableName
target
, (InsertColumnList -> RawSql)
-> Maybe InsertColumnList -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap InsertColumnList -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe InsertColumnList
maybeInsertColumns
, RawSql -> Maybe RawSql
forall a. a -> Maybe a
Just (RawSql -> Maybe RawSql) -> RawSql -> Maybe RawSql
forall a b. (a -> b) -> a -> b
$ InsertSource -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql InsertSource
source
, (ReturningExpr -> RawSql) -> Maybe ReturningExpr -> Maybe RawSql
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ReturningExpr -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql Maybe ReturningExpr
maybeReturning
]
newtype InsertColumnList
= InsertColumnList RawSql.RawSql
deriving
(
RawSql -> InsertColumnList
InsertColumnList -> RawSql
(InsertColumnList -> RawSql)
-> (RawSql -> InsertColumnList) -> SqlExpression InsertColumnList
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: InsertColumnList -> RawSql
toRawSql :: InsertColumnList -> RawSql
$cunsafeFromRawSql :: RawSql -> InsertColumnList
unsafeFromRawSql :: RawSql -> InsertColumnList
RawSql.SqlExpression
)
insertColumnList :: [ColumnName] -> InsertColumnList
insertColumnList :: [ColumnName] -> InsertColumnList
insertColumnList [ColumnName]
columnNames =
RawSql -> InsertColumnList
InsertColumnList (RawSql -> InsertColumnList) -> RawSql -> InsertColumnList
forall a b. (a -> b) -> a -> b
$
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 ((ColumnName -> RawSql) -> [ColumnName] -> [RawSql]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ColumnName -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql [ColumnName]
columnNames)
RawSql -> RawSql -> RawSql
forall a. Semigroup a => a -> a -> a
<> RawSql
RawSql.rightParen
newtype InsertSource
= InsertSource RawSql.RawSql
deriving
(
RawSql -> InsertSource
InsertSource -> RawSql
(InsertSource -> RawSql)
-> (RawSql -> InsertSource) -> SqlExpression InsertSource
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: InsertSource -> RawSql
toRawSql :: InsertSource -> RawSql
$cunsafeFromRawSql :: RawSql -> InsertSource
unsafeFromRawSql :: RawSql -> InsertSource
RawSql.SqlExpression
)
insertRowValues :: [RowValues] -> InsertSource
insertRowValues :: [RowValues] -> InsertSource
insertRowValues [RowValues]
rows =
RawSql -> InsertSource
InsertSource (RawSql -> InsertSource) -> RawSql -> InsertSource
forall a b. (a -> b) -> a -> b
$
String -> RawSql
RawSql.fromString String
"VALUES "
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 ((RowValues -> RawSql) -> [RowValues] -> [RawSql]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap RowValues -> RawSql
forall a. SqlExpression a => a -> RawSql
RawSql.toRawSql [RowValues]
rows)
insertSqlValues :: [[SqlValue]] -> InsertSource
insertSqlValues :: [[SqlValue]] -> InsertSource
insertSqlValues =
[RowValues] -> InsertSource
insertRowValues ([RowValues] -> InsertSource)
-> ([[SqlValue]] -> [RowValues]) -> [[SqlValue]] -> InsertSource
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([SqlValue] -> RowValues) -> [[SqlValue]] -> [RowValues]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap [SqlValue] -> RowValues
rowValues
newtype RowValues
= RowValues RawSql.RawSql
deriving
(
RawSql -> RowValues
RowValues -> RawSql
(RowValues -> RawSql)
-> (RawSql -> RowValues) -> SqlExpression RowValues
forall a. (a -> RawSql) -> (RawSql -> a) -> SqlExpression a
$ctoRawSql :: RowValues -> RawSql
toRawSql :: RowValues -> RawSql
$cunsafeFromRawSql :: RawSql -> RowValues
unsafeFromRawSql :: RawSql -> RowValues
RawSql.SqlExpression
)
rowValues :: [SqlValue] -> RowValues
rowValues :: [SqlValue] -> RowValues
rowValues [SqlValue]
values =
RawSql -> RowValues
RowValues (RawSql -> RowValues) -> RawSql -> RowValues
forall a b. (a -> b) -> a -> b
$
[RawSql] -> RawSql
forall a. Monoid a => [a] -> a
mconcat
[ RawSql
RawSql.leftParen
, RawSql -> [RawSql] -> RawSql
forall sql (f :: * -> *).
(SqlExpression sql, Foldable f) =>
RawSql -> f sql -> RawSql
RawSql.intercalate RawSql
RawSql.comma ((SqlValue -> RawSql) -> [SqlValue] -> [RawSql]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap SqlValue -> RawSql
RawSql.parameter [SqlValue]
values)
, RawSql
RawSql.rightParen
]