module Orville.PostgreSQL.Execution.EntityOperations
( insertEntity
, insertEntityAndReturnRowCount
, insertAndReturnEntity
, insertEntities
, insertAndReturnEntities
, insertEntitiesAndReturnRowCount
, updateEntity
, updateEntityAndReturnRowCount
, updateAndReturnEntity
, updateFields
, updateFieldsAndReturnEntities
, updateFieldsAndReturnRowCount
, deleteEntity
, deleteEntityAndReturnRowCount
, deleteAndReturnEntity
, deleteEntities
, deleteEntitiesAndReturnRowCount
, deleteAndReturnEntities
, findEntitiesBy
, findFirstEntityBy
, findEntity
, findEntities
)
where
import Control.Exception (Exception, throwIO)
import qualified Control.Monad as Monad
import Control.Monad.IO.Class (MonadIO (liftIO))
import Data.List.NonEmpty (NonEmpty ((:|)))
import Data.Maybe (listToMaybe)
import qualified Orville.PostgreSQL.Execution.Delete as Delete
import qualified Orville.PostgreSQL.Execution.Insert as Insert
import qualified Orville.PostgreSQL.Execution.Select as Select
import qualified Orville.PostgreSQL.Execution.SelectOptions as SelectOptions
import qualified Orville.PostgreSQL.Execution.Update as Update
import qualified Orville.PostgreSQL.Expr as Expr
import qualified Orville.PostgreSQL.Internal.RowCountExpectation as RowCountExpectation
import qualified Orville.PostgreSQL.Monad as Monad
import qualified Orville.PostgreSQL.Schema as Schema
insertEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
writeEntity ->
m ()
insertEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity -> writeEntity -> m ()
insertEntity TableDefinition key writeEntity readEntity
entityTable =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ()) -> (writeEntity -> m Int) -> writeEntity -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition key writeEntity readEntity -> writeEntity -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity -> writeEntity -> m Int
insertEntityAndReturnRowCount TableDefinition key writeEntity readEntity
entityTable
insertEntityAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
writeEntity ->
m Int
insertEntityAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity -> writeEntity -> m Int
insertEntityAndReturnRowCount TableDefinition key writeEntity readEntity
entityTable writeEntity
entity =
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m Int
insertEntitiesAndReturnRowCount TableDefinition key writeEntity readEntity
entityTable (writeEntity
entity writeEntity -> [writeEntity] -> NonEmpty writeEntity
forall a. a -> [a] -> NonEmpty a
:| [])
insertAndReturnEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
writeEntity ->
m readEntity
insertAndReturnEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> writeEntity -> m readEntity
insertAndReturnEntity TableDefinition key writeEntity readEntity
entityTable writeEntity
entity = do
[readEntity]
returnedEntities <- TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m [readEntity]
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m [readEntity]
insertAndReturnEntities TableDefinition key writeEntity readEntity
entityTable (writeEntity
entity writeEntity -> [writeEntity] -> NonEmpty writeEntity
forall a. a -> [a] -> NonEmpty a
:| [])
String -> [readEntity] -> m readEntity
forall (m :: * -> *) a. MonadIO m => String -> [a] -> m a
RowCountExpectation.expectExactlyOneRow
String
"insertAndReturnEntity RETURNING clause"
[readEntity]
returnedEntities
insertEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
NonEmpty writeEntity ->
m ()
insertEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m ()
insertEntities TableDefinition key writeEntity readEntity
tableDef =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ())
-> (NonEmpty writeEntity -> m Int) -> NonEmpty writeEntity -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m Int
insertEntitiesAndReturnRowCount TableDefinition key writeEntity readEntity
tableDef
insertEntitiesAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
NonEmpty writeEntity ->
m Int
insertEntitiesAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m Int
insertEntitiesAndReturnRowCount TableDefinition key writeEntity readEntity
tableDef =
Insert readEntity NoReturningClause -> m Int
forall (m :: * -> *) readEntity.
MonadOrville m =>
Insert readEntity NoReturningClause -> m Int
Insert.executeInsert (Insert readEntity NoReturningClause -> m Int)
-> (NonEmpty writeEntity -> Insert readEntity NoReturningClause)
-> NonEmpty writeEntity
-> m Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> Insert readEntity NoReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> Insert readEntity NoReturningClause
Insert.insertToTable TableDefinition key writeEntity readEntity
tableDef
insertAndReturnEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
NonEmpty writeEntity ->
m [readEntity]
insertAndReturnEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> m [readEntity]
insertAndReturnEntities TableDefinition key writeEntity readEntity
tableDef =
Insert readEntity ReturningClause -> m [readEntity]
forall (m :: * -> *) readEntity.
MonadOrville m =>
Insert readEntity ReturningClause -> m [readEntity]
Insert.executeInsertReturnEntities (Insert readEntity ReturningClause -> m [readEntity])
-> (NonEmpty writeEntity -> Insert readEntity ReturningClause)
-> NonEmpty writeEntity
-> m [readEntity]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> Insert readEntity ReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> NonEmpty writeEntity -> Insert readEntity ReturningClause
Insert.insertToTableReturning TableDefinition key writeEntity readEntity
tableDef
updateEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
writeEntity ->
m ()
updateEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> m ()
updateEntity TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ()) -> (writeEntity -> m Int) -> writeEntity -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> m Int
updateEntityAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key
updateEntityAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
writeEntity ->
m Int
updateEntityAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> m Int
updateEntityAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key writeEntity
writeEntity =
case TableDefinition (HasKey key) writeEntity readEntity
-> key
-> writeEntity
-> Maybe (Update readEntity NoReturningClause)
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> key
-> writeEntity
-> Maybe (Update readEntity NoReturningClause)
Update.updateToTable TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key writeEntity
writeEntity of
Maybe (Update readEntity NoReturningClause)
Nothing ->
IO Int -> m Int
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO Int -> m Int)
-> (TableDefinition (HasKey key) writeEntity readEntity -> IO Int)
-> TableDefinition (HasKey key) writeEntity readEntity
-> m Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EmptyUpdateError -> IO Int
forall e a. Exception e => e -> IO a
throwIO (EmptyUpdateError -> IO Int)
-> (TableDefinition (HasKey key) writeEntity readEntity
-> EmptyUpdateError)
-> TableDefinition (HasKey key) writeEntity readEntity
-> IO Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableIdentifier -> EmptyUpdateError
EmptyUpdateError (TableIdentifier -> EmptyUpdateError)
-> (TableDefinition (HasKey key) writeEntity readEntity
-> TableIdentifier)
-> TableDefinition (HasKey key) writeEntity readEntity
-> EmptyUpdateError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition (HasKey key) writeEntity readEntity
-> TableIdentifier
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity -> TableIdentifier
Schema.tableIdentifier (TableDefinition (HasKey key) writeEntity readEntity -> m Int)
-> TableDefinition (HasKey key) writeEntity readEntity -> m Int
forall a b. (a -> b) -> a -> b
$ TableDefinition (HasKey key) writeEntity readEntity
tableDef
Just Update readEntity NoReturningClause
update ->
Update readEntity NoReturningClause -> m Int
forall (m :: * -> *) readEntity returningClause.
MonadOrville m =>
Update readEntity returningClause -> m Int
Update.executeUpdate Update readEntity NoReturningClause
update
updateAndReturnEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
writeEntity ->
m (Maybe readEntity)
updateAndReturnEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> m (Maybe readEntity)
updateAndReturnEntity TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key writeEntity
writeEntity =
case TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> Maybe (Update readEntity ReturningClause)
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> key -> writeEntity -> Maybe (Update readEntity ReturningClause)
Update.updateToTableReturning TableDefinition (HasKey key) writeEntity readEntity
tableDef key
key writeEntity
writeEntity of
Maybe (Update readEntity ReturningClause)
Nothing ->
IO (Maybe readEntity) -> m (Maybe readEntity)
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (IO (Maybe readEntity) -> m (Maybe readEntity))
-> (TableDefinition (HasKey key) writeEntity readEntity
-> IO (Maybe readEntity))
-> TableDefinition (HasKey key) writeEntity readEntity
-> m (Maybe readEntity)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. EmptyUpdateError -> IO (Maybe readEntity)
forall e a. Exception e => e -> IO a
throwIO (EmptyUpdateError -> IO (Maybe readEntity))
-> (TableDefinition (HasKey key) writeEntity readEntity
-> EmptyUpdateError)
-> TableDefinition (HasKey key) writeEntity readEntity
-> IO (Maybe readEntity)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableIdentifier -> EmptyUpdateError
EmptyUpdateError (TableIdentifier -> EmptyUpdateError)
-> (TableDefinition (HasKey key) writeEntity readEntity
-> TableIdentifier)
-> TableDefinition (HasKey key) writeEntity readEntity
-> EmptyUpdateError
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition (HasKey key) writeEntity readEntity
-> TableIdentifier
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity -> TableIdentifier
Schema.tableIdentifier (TableDefinition (HasKey key) writeEntity readEntity
-> m (Maybe readEntity))
-> TableDefinition (HasKey key) writeEntity readEntity
-> m (Maybe readEntity)
forall a b. (a -> b) -> a -> b
$ TableDefinition (HasKey key) writeEntity readEntity
tableDef
Just Update readEntity ReturningClause
update -> do
[readEntity]
returnedEntities <- Update readEntity ReturningClause -> m [readEntity]
forall (m :: * -> *) readEntity.
MonadOrville m =>
Update readEntity ReturningClause -> m [readEntity]
Update.executeUpdateReturnEntities Update readEntity ReturningClause
update
String -> [readEntity] -> m (Maybe readEntity)
forall (m :: * -> *) a. MonadIO m => String -> [a] -> m (Maybe a)
RowCountExpectation.expectAtMostOneRow
String
"updateAndReturnEntity RETURNING clause"
[readEntity]
returnedEntities
updateFields ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
NonEmpty Expr.SetClause ->
Maybe Expr.BooleanExpr ->
m ()
updateFields :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause -> Maybe BooleanExpr -> m ()
updateFields TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ())
-> (Maybe BooleanExpr -> m Int) -> Maybe BooleanExpr -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause -> Maybe BooleanExpr -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause -> Maybe BooleanExpr -> m Int
updateFieldsAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses
updateFieldsAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
NonEmpty Expr.SetClause ->
Maybe Expr.BooleanExpr ->
m Int
updateFieldsAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause -> Maybe BooleanExpr -> m Int
updateFieldsAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses Maybe BooleanExpr
mbWhereCondition =
Update readEntity NoReturningClause -> m Int
forall (m :: * -> *) readEntity returningClause.
MonadOrville m =>
Update readEntity returningClause -> m Int
Update.executeUpdate (Update readEntity NoReturningClause -> m Int)
-> Update readEntity NoReturningClause -> m Int
forall a b. (a -> b) -> a -> b
$
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause
-> Maybe BooleanExpr
-> Update readEntity NoReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> NonEmpty SetClause
-> Maybe BooleanExpr
-> Update readEntity NoReturningClause
Update.updateToTableFields TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses Maybe BooleanExpr
mbWhereCondition
updateFieldsAndReturnEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
NonEmpty Expr.SetClause ->
Maybe Expr.BooleanExpr ->
m [readEntity]
updateFieldsAndReturnEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause -> Maybe BooleanExpr -> m [readEntity]
updateFieldsAndReturnEntities TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses Maybe BooleanExpr
mbWhereCondition =
Update readEntity ReturningClause -> m [readEntity]
forall (m :: * -> *) readEntity.
MonadOrville m =>
Update readEntity ReturningClause -> m [readEntity]
Update.executeUpdateReturnEntities (Update readEntity ReturningClause -> m [readEntity])
-> Update readEntity ReturningClause -> m [readEntity]
forall a b. (a -> b) -> a -> b
$
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty SetClause
-> Maybe BooleanExpr
-> Update readEntity ReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> NonEmpty SetClause
-> Maybe BooleanExpr
-> Update readEntity ReturningClause
Update.updateToTableFieldsReturning TableDefinition (HasKey key) writeEntity readEntity
tableDef NonEmpty SetClause
setClauses Maybe BooleanExpr
mbWhereCondition
deleteEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
m ()
deleteEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity -> key -> m ()
deleteEntity TableDefinition (HasKey key) writeEntity readEntity
entityTable =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ()) -> (key -> m Int) -> key -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition (HasKey key) writeEntity readEntity -> key -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity -> key -> m Int
deleteEntityAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
entityTable
deleteEntityAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
m Int
deleteEntityAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity -> key -> m Int
deleteEntityAndReturnRowCount TableDefinition (HasKey key) writeEntity readEntity
entityTable key
key =
let
primaryKeyCondition :: BooleanExpr
primaryKeyCondition =
PrimaryKey key -> key -> BooleanExpr
forall key. PrimaryKey key -> key -> BooleanExpr
Schema.primaryKeyEquals
(TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
Schema.tablePrimaryKey TableDefinition (HasKey key) writeEntity readEntity
entityTable)
key
key
in
Delete readEntity NoReturningClause -> m Int
forall (m :: * -> *) readEntity.
MonadOrville m =>
Delete readEntity NoReturningClause -> m Int
Delete.executeDelete (Delete readEntity NoReturningClause -> m Int)
-> Delete readEntity NoReturningClause -> m Int
forall a b. (a -> b) -> a -> b
$
TableDefinition (HasKey key) writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity NoReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity NoReturningClause
Delete.deleteFromTable TableDefinition (HasKey key) writeEntity readEntity
entityTable (BooleanExpr -> Maybe BooleanExpr
forall a. a -> Maybe a
Just BooleanExpr
primaryKeyCondition)
deleteAndReturnEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
m (Maybe readEntity)
deleteAndReturnEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> m (Maybe readEntity)
deleteAndReturnEntity TableDefinition (HasKey key) writeEntity readEntity
entityTable key
key = do
let
primaryKeyCondition :: BooleanExpr
primaryKeyCondition =
PrimaryKey key -> key -> BooleanExpr
forall key. PrimaryKey key -> key -> BooleanExpr
Schema.primaryKeyEquals
(TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
Schema.tablePrimaryKey TableDefinition (HasKey key) writeEntity readEntity
entityTable)
key
key
[readEntity]
returnedEntities <- TableDefinition (HasKey key) writeEntity readEntity
-> Maybe BooleanExpr -> m [readEntity]
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m [readEntity]
deleteAndReturnEntities TableDefinition (HasKey key) writeEntity readEntity
entityTable (BooleanExpr -> Maybe BooleanExpr
forall a. a -> Maybe a
Just BooleanExpr
primaryKeyCondition)
String -> [readEntity] -> m (Maybe readEntity)
forall (m :: * -> *) a. MonadIO m => String -> [a] -> m (Maybe a)
RowCountExpectation.expectAtMostOneRow
String
"deleteAndReturnEntity RETURNING clause"
[readEntity]
returnedEntities
deleteEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
Maybe Expr.BooleanExpr ->
m ()
deleteEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m ()
deleteEntities TableDefinition key writeEntity readEntity
entityTable =
m Int -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
Monad.void (m Int -> m ())
-> (Maybe BooleanExpr -> m Int) -> Maybe BooleanExpr -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m Int
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m Int
deleteEntitiesAndReturnRowCount TableDefinition key writeEntity readEntity
entityTable
deleteEntitiesAndReturnRowCount ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
Maybe Expr.BooleanExpr ->
m Int
deleteEntitiesAndReturnRowCount :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m Int
deleteEntitiesAndReturnRowCount TableDefinition key writeEntity readEntity
entityTable Maybe BooleanExpr
whereCondition =
Delete readEntity NoReturningClause -> m Int
forall (m :: * -> *) readEntity.
MonadOrville m =>
Delete readEntity NoReturningClause -> m Int
Delete.executeDelete (Delete readEntity NoReturningClause -> m Int)
-> Delete readEntity NoReturningClause -> m Int
forall a b. (a -> b) -> a -> b
$
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity NoReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity NoReturningClause
Delete.deleteFromTable TableDefinition key writeEntity readEntity
entityTable Maybe BooleanExpr
whereCondition
deleteAndReturnEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
Maybe Expr.BooleanExpr ->
m [readEntity]
deleteAndReturnEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> m [readEntity]
deleteAndReturnEntities TableDefinition key writeEntity readEntity
entityTable Maybe BooleanExpr
whereCondition =
Delete readEntity ReturningClause -> m [readEntity]
forall (m :: * -> *) readEntity.
MonadOrville m =>
Delete readEntity ReturningClause -> m [readEntity]
Delete.executeDeleteReturnEntities (Delete readEntity ReturningClause -> m [readEntity])
-> Delete readEntity ReturningClause -> m [readEntity]
forall a b. (a -> b) -> a -> b
$
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity ReturningClause
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> Maybe BooleanExpr -> Delete readEntity ReturningClause
Delete.deleteFromTableReturning TableDefinition key writeEntity readEntity
entityTable Maybe BooleanExpr
whereCondition
findEntitiesBy ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
SelectOptions.SelectOptions ->
m [readEntity]
findEntitiesBy :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> SelectOptions -> m [readEntity]
findEntitiesBy TableDefinition key writeEntity readEntity
entityTable SelectOptions
selectOptions =
Select readEntity -> m [readEntity]
forall (m :: * -> *) row. MonadOrville m => Select row -> m [row]
Select.executeSelect (Select readEntity -> m [readEntity])
-> Select readEntity -> m [readEntity]
forall a b. (a -> b) -> a -> b
$
TableDefinition key writeEntity readEntity
-> SelectOptions -> Select readEntity
forall key writeEntity readEntity.
TableDefinition key writeEntity readEntity
-> SelectOptions -> Select readEntity
Select.selectTable TableDefinition key writeEntity readEntity
entityTable SelectOptions
selectOptions
findFirstEntityBy ::
Monad.MonadOrville m =>
Schema.TableDefinition key writeEntity readEntity ->
SelectOptions.SelectOptions ->
m (Maybe readEntity)
findFirstEntityBy :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> SelectOptions -> m (Maybe readEntity)
findFirstEntityBy TableDefinition key writeEntity readEntity
entityTable SelectOptions
selectOptions =
[readEntity] -> Maybe readEntity
forall a. [a] -> Maybe a
listToMaybe
([readEntity] -> Maybe readEntity)
-> m [readEntity] -> m (Maybe readEntity)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> TableDefinition key writeEntity readEntity
-> SelectOptions -> m [readEntity]
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> SelectOptions -> m [readEntity]
findEntitiesBy TableDefinition key writeEntity readEntity
entityTable (Int -> SelectOptions
SelectOptions.limit Int
1 SelectOptions -> SelectOptions -> SelectOptions
forall a. Semigroup a => a -> a -> a
<> SelectOptions
selectOptions)
findEntity ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
key ->
m (Maybe readEntity)
findEntity :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> key -> m (Maybe readEntity)
findEntity TableDefinition (HasKey key) writeEntity readEntity
entityTable key
key =
let
primaryKeyCondition :: BooleanExpr
primaryKeyCondition =
PrimaryKey key -> key -> BooleanExpr
forall key. PrimaryKey key -> key -> BooleanExpr
Schema.primaryKeyEquals
(TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
Schema.tablePrimaryKey TableDefinition (HasKey key) writeEntity readEntity
entityTable)
key
key
in
TableDefinition (HasKey key) writeEntity readEntity
-> SelectOptions -> m (Maybe readEntity)
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> SelectOptions -> m (Maybe readEntity)
findFirstEntityBy TableDefinition (HasKey key) writeEntity readEntity
entityTable (BooleanExpr -> SelectOptions
SelectOptions.where_ BooleanExpr
primaryKeyCondition)
findEntities ::
Monad.MonadOrville m =>
Schema.TableDefinition (Schema.HasKey key) writeEntity readEntity ->
NonEmpty key ->
m [readEntity]
findEntities :: forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition (HasKey key) writeEntity readEntity
-> NonEmpty key -> m [readEntity]
findEntities TableDefinition (HasKey key) writeEntity readEntity
entityTable NonEmpty key
keys =
let
primaryKeyCondition :: BooleanExpr
primaryKeyCondition =
PrimaryKey key -> NonEmpty key -> BooleanExpr
forall key. PrimaryKey key -> NonEmpty key -> BooleanExpr
Schema.primaryKeyIn
(TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
forall key writeEntity readEntity.
TableDefinition (HasKey key) writeEntity readEntity
-> PrimaryKey key
Schema.tablePrimaryKey TableDefinition (HasKey key) writeEntity readEntity
entityTable)
NonEmpty key
keys
in
TableDefinition (HasKey key) writeEntity readEntity
-> SelectOptions -> m [readEntity]
forall (m :: * -> *) key writeEntity readEntity.
MonadOrville m =>
TableDefinition key writeEntity readEntity
-> SelectOptions -> m [readEntity]
findEntitiesBy TableDefinition (HasKey key) writeEntity readEntity
entityTable (BooleanExpr -> SelectOptions
SelectOptions.where_ BooleanExpr
primaryKeyCondition)
newtype EmptyUpdateError
= EmptyUpdateError Schema.TableIdentifier
instance Show EmptyUpdateError where
show :: EmptyUpdateError -> String
show (EmptyUpdateError TableIdentifier
tableId) =
String
"EmptyUdateError: "
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> TableIdentifier -> String
Schema.tableIdToString TableIdentifier
tableId
String -> ShowS
forall a. Semigroup a => a -> a -> a
<> String
" has no columns to update."
instance Exception EmptyUpdateError