{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Eventium.Store.Sql.Operations
( SqlEventStoreConfig (..),
sqlEventStoreReader,
sqlGlobalEventStoreReader,
sqlGetProjectionIds,
sqlGetStreamEvents,
sqlMaxEventVersion,
sqlStoreEvents,
unsafeSqlStoreGlobalStreamEvents,
)
where
import Control.Monad.IO.Class
import Data.Foldable (for_)
import Data.Maybe (listToMaybe)
import Data.Text (Text)
import Database.Persist
import Database.Persist.Class (SafeToInsert)
import Database.Persist.Names (EntityNameDB (..), FieldNameDB (..))
import Database.Persist.Sql
import Eventium.Store.Class
import Eventium.Store.Sql.Orphans as X ()
import Eventium.UUID
data SqlEventStoreConfig entity serialized
= SqlEventStoreConfig
{ forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity,
forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity,
forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber,
forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigUUID :: entity -> UUID,
forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigVersion :: entity -> EventVersion,
forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigData :: entity -> serialized,
forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity),
forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigUUIDField :: EntityField entity UUID,
forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigVersionField :: EntityField entity EventVersion,
forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigDataField :: EntityField entity serialized
}
sqlEventStoreReader ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
VersionedEventStoreReader (SqlPersistT m) serialized
sqlEventStoreReader :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> VersionedEventStoreReader (SqlPersistT m) serialized
sqlEventStoreReader SqlEventStoreConfig entity serialized
config = (QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized])
-> EventStoreReader
UUID EventVersion (SqlPersistT m) (VersionedStreamEvent serialized)
forall key position (m :: * -> *) event.
(QueryRange key position -> m [event])
-> EventStoreReader key position m event
EventStoreReader ((QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized])
-> EventStoreReader
UUID
EventVersion
(SqlPersistT m)
(VersionedStreamEvent serialized))
-> (QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized])
-> EventStoreReader
UUID EventVersion (SqlPersistT m) (VersionedStreamEvent serialized)
forall a b. (a -> b) -> a -> b
$ SqlEventStoreConfig entity serialized
-> QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized]
forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized]
sqlGetStreamEvents SqlEventStoreConfig entity serialized
config
sqlGlobalEventStoreReader ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
GlobalEventStoreReader (SqlPersistT m) serialized
sqlGlobalEventStoreReader :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> GlobalEventStoreReader (SqlPersistT m) serialized
sqlGlobalEventStoreReader SqlEventStoreConfig entity serialized
config =
(QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized])
-> EventStoreReader
() SequenceNumber (SqlPersistT m) (GlobalStreamEvent serialized)
forall key position (m :: * -> *) event.
(QueryRange key position -> m [event])
-> EventStoreReader key position m event
EventStoreReader ((QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized])
-> EventStoreReader
() SequenceNumber (SqlPersistT m) (GlobalStreamEvent serialized))
-> (QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized])
-> EventStoreReader
() SequenceNumber (SqlPersistT m) (GlobalStreamEvent serialized)
forall a b. (a -> b) -> a -> b
$ SqlEventStoreConfig entity serialized
-> QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized]
forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized]
sqlGetAllEventsInRange SqlEventStoreConfig entity serialized
config
sqlEventToGlobalStream ::
SqlEventStoreConfig entity serialized ->
Entity entity ->
GlobalStreamEvent serialized
sqlEventToGlobalStream :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Entity entity -> GlobalStreamEvent serialized
sqlEventToGlobalStream config :: SqlEventStoreConfig entity serialized
config@SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} (Entity Key entity
key entity
event) =
()
-> SequenceNumber
-> VersionedStreamEvent serialized
-> StreamEvent () SequenceNumber (VersionedStreamEvent serialized)
forall key position event.
key -> position -> event -> StreamEvent key position event
StreamEvent () (Key entity -> SequenceNumber
sqlEventStoreConfigUnKey Key entity
key) (SqlEventStoreConfig entity serialized
-> entity -> VersionedStreamEvent serialized
forall entity serialized.
SqlEventStoreConfig entity serialized
-> entity -> VersionedStreamEvent serialized
sqlEventToVersioned SqlEventStoreConfig entity serialized
config entity
event)
sqlEventToVersioned ::
SqlEventStoreConfig entity serialized ->
entity ->
VersionedStreamEvent serialized
sqlEventToVersioned :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> entity -> VersionedStreamEvent serialized
sqlEventToVersioned SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} entity
entity =
UUID
-> EventVersion
-> serialized
-> StreamEvent UUID EventVersion serialized
forall key position event.
key -> position -> event -> StreamEvent key position event
StreamEvent
(entity -> UUID
sqlEventStoreConfigUUID entity
entity)
(entity -> EventVersion
sqlEventStoreConfigVersion entity
entity)
(entity -> serialized
sqlEventStoreConfigData entity
entity)
sqlGetProjectionIds ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
SqlPersistT m [UUID]
sqlGetProjectionIds :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized -> SqlPersistT m [UUID]
sqlGetProjectionIds SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} =
(Single UUID -> UUID) -> [Single UUID] -> [UUID]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Single UUID -> UUID
forall a. Single a -> a
unSingle ([Single UUID] -> [UUID])
-> ReaderT SqlBackend m [Single UUID]
-> ReaderT SqlBackend m [UUID]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Text -> [PersistValue] -> ReaderT SqlBackend m [Single UUID]
forall a (m :: * -> *) backend.
(RawSql a, MonadIO m, BackendCompatible SqlBackend backend) =>
Text -> [PersistValue] -> ReaderT backend m [a]
rawSql (Text
"SELECT DISTINCT " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
uuidFieldName Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
" FROM " Text -> Text -> Text
forall a. Semigroup a => a -> a -> a
<> Text
tableName) []
where
tableName :: Text
tableName = EntityNameDB -> Text
unEntityNameDB (EntityNameDB -> Text) -> EntityNameDB -> Text
forall a b. (a -> b) -> a -> b
$ entity -> EntityNameDB
forall record. PersistEntity record => record -> EntityNameDB
tableDBName (UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity UUID
nil EventVersion
0 serialized
forall a. HasCallStack => a
undefined)
uuidFieldName :: Text
uuidFieldName = FieldNameDB -> Text
unFieldNameDB (FieldNameDB -> Text) -> FieldNameDB -> Text
forall a b. (a -> b) -> a -> b
$ EntityField entity (Key entity) -> FieldNameDB
forall record typ.
PersistEntity record =>
EntityField record typ -> FieldNameDB
fieldDBName EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField
sqlGetStreamEvents ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
QueryRange UUID EventVersion ->
SqlPersistT m [VersionedStreamEvent serialized]
sqlGetStreamEvents :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> QueryRange UUID EventVersion
-> SqlPersistT m [VersionedStreamEvent serialized]
sqlGetStreamEvents config :: SqlEventStoreConfig entity serialized
config@SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} QueryRange {UUID
QueryLimit EventVersion
QueryStart EventVersion
queryRangeKey :: UUID
queryRangeStart :: QueryStart EventVersion
queryRangeLimit :: QueryLimit EventVersion
queryRangeLimit :: forall key position. QueryRange key position -> QueryLimit position
queryRangeStart :: forall key position. QueryRange key position -> QueryStart position
queryRangeKey :: forall key position. QueryRange key position -> key
..} = do
[Entity entity]
entities <- [Filter entity]
-> [SelectOpt entity] -> ReaderT SqlBackend m [Entity entity]
forall record backend (m :: * -> *).
(MonadIO m, PersistQueryRead backend,
PersistRecordBackend record backend) =>
[Filter record]
-> [SelectOpt record] -> ReaderT backend m [Entity record]
selectList [Filter entity]
filters [SelectOpt entity]
selectOpts
[VersionedStreamEvent serialized]
-> SqlPersistT m [VersionedStreamEvent serialized]
forall a. a -> ReaderT SqlBackend m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([VersionedStreamEvent serialized]
-> SqlPersistT m [VersionedStreamEvent serialized])
-> [VersionedStreamEvent serialized]
-> SqlPersistT m [VersionedStreamEvent serialized]
forall a b. (a -> b) -> a -> b
$ SqlEventStoreConfig entity serialized
-> entity -> VersionedStreamEvent serialized
forall entity serialized.
SqlEventStoreConfig entity serialized
-> entity -> VersionedStreamEvent serialized
sqlEventToVersioned SqlEventStoreConfig entity serialized
config (entity -> VersionedStreamEvent serialized)
-> (Entity entity -> entity)
-> Entity entity
-> VersionedStreamEvent serialized
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Entity entity -> entity
forall record. Entity record -> record
entityVal (Entity entity -> VersionedStreamEvent serialized)
-> [Entity entity] -> [VersionedStreamEvent serialized]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Entity entity]
entities
where
startFilter :: [Filter entity]
startFilter =
case QueryStart EventVersion
queryRangeStart of
QueryStart EventVersion
StartFromBeginning -> []
StartQueryAt EventVersion
start -> [EntityField entity EventVersion
sqlEventStoreConfigVersionField EntityField entity EventVersion -> EventVersion -> Filter entity
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Filter v
>=. EventVersion
start]
([Filter entity]
endFilter, [SelectOpt entity]
endSelectOpt) =
case QueryLimit EventVersion
queryRangeLimit of
QueryLimit EventVersion
NoQueryLimit -> ([], [])
MaxNumberOfEvents Int
maxNum -> ([], [Int -> SelectOpt entity
forall record. Int -> SelectOpt record
LimitTo Int
maxNum])
StopQueryAt EventVersion
stop -> ([EntityField entity EventVersion
sqlEventStoreConfigVersionField EntityField entity EventVersion -> EventVersion -> Filter entity
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Filter v
<=. EventVersion
stop], [])
filters :: [Filter entity]
filters = (EntityField entity UUID
sqlEventStoreConfigUUIDField EntityField entity UUID -> UUID -> Filter entity
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Filter v
==. UUID
queryRangeKey) Filter entity -> [Filter entity] -> [Filter entity]
forall a. a -> [a] -> [a]
: [Filter entity]
startFilter [Filter entity] -> [Filter entity] -> [Filter entity]
forall a. [a] -> [a] -> [a]
++ [Filter entity]
endFilter
selectOpts :: [SelectOpt entity]
selectOpts = EntityField entity (Key entity) -> SelectOpt entity
forall record typ. EntityField record typ -> SelectOpt record
Asc EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField SelectOpt entity -> [SelectOpt entity] -> [SelectOpt entity]
forall a. a -> [a] -> [a]
: [SelectOpt entity]
endSelectOpt
sqlGetAllEventsInRange ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
QueryRange () SequenceNumber ->
SqlPersistT m [GlobalStreamEvent serialized]
sqlGetAllEventsInRange :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> QueryRange () SequenceNumber
-> SqlPersistT m [GlobalStreamEvent serialized]
sqlGetAllEventsInRange config :: SqlEventStoreConfig entity serialized
config@SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} QueryRange {()
QueryLimit SequenceNumber
QueryStart SequenceNumber
queryRangeLimit :: forall key position. QueryRange key position -> QueryLimit position
queryRangeStart :: forall key position. QueryRange key position -> QueryStart position
queryRangeKey :: forall key position. QueryRange key position -> key
queryRangeKey :: ()
queryRangeStart :: QueryStart SequenceNumber
queryRangeLimit :: QueryLimit SequenceNumber
..} = do
[Entity entity]
entities <- [Filter entity]
-> [SelectOpt entity] -> ReaderT SqlBackend m [Entity entity]
forall record backend (m :: * -> *).
(MonadIO m, PersistQueryRead backend,
PersistRecordBackend record backend) =>
[Filter record]
-> [SelectOpt record] -> ReaderT backend m [Entity record]
selectList [Filter entity]
filters [SelectOpt entity]
selectOpts
[GlobalStreamEvent serialized]
-> SqlPersistT m [GlobalStreamEvent serialized]
forall a. a -> ReaderT SqlBackend m a
forall (m :: * -> *) a. Monad m => a -> m a
return ([GlobalStreamEvent serialized]
-> SqlPersistT m [GlobalStreamEvent serialized])
-> [GlobalStreamEvent serialized]
-> SqlPersistT m [GlobalStreamEvent serialized]
forall a b. (a -> b) -> a -> b
$ SqlEventStoreConfig entity serialized
-> Entity entity -> GlobalStreamEvent serialized
forall entity serialized.
SqlEventStoreConfig entity serialized
-> Entity entity -> GlobalStreamEvent serialized
sqlEventToGlobalStream SqlEventStoreConfig entity serialized
config (Entity entity -> GlobalStreamEvent serialized)
-> [Entity entity] -> [GlobalStreamEvent serialized]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Entity entity]
entities
where
startFilter :: [Filter entity]
startFilter =
case QueryStart SequenceNumber
queryRangeStart of
QueryStart SequenceNumber
StartFromBeginning -> []
StartQueryAt SequenceNumber
start -> [EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField EntityField entity (Key entity) -> Key entity -> Filter entity
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Filter v
>=. SequenceNumber -> Key entity
sqlEventStoreConfigMakeKey SequenceNumber
start]
([Filter entity]
endFilter, [SelectOpt entity]
endSelectOpt) =
case QueryLimit SequenceNumber
queryRangeLimit of
QueryLimit SequenceNumber
NoQueryLimit -> ([], [])
MaxNumberOfEvents Int
maxNum -> ([], [Int -> SelectOpt entity
forall record. Int -> SelectOpt record
LimitTo Int
maxNum])
StopQueryAt SequenceNumber
stop -> ([EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField EntityField entity (Key entity) -> Key entity -> Filter entity
forall v typ.
PersistField typ =>
EntityField v typ -> typ -> Filter v
<=. SequenceNumber -> Key entity
sqlEventStoreConfigMakeKey SequenceNumber
stop], [])
filters :: [Filter entity]
filters = [Filter entity]
startFilter [Filter entity] -> [Filter entity] -> [Filter entity]
forall a. [a] -> [a] -> [a]
++ [Filter entity]
endFilter
selectOpts :: [SelectOpt entity]
selectOpts = EntityField entity (Key entity) -> SelectOpt entity
forall record typ. EntityField record typ -> SelectOpt record
Asc EntityField entity (Key entity)
sqlEventStoreConfigSequenceNumberField SelectOpt entity -> [SelectOpt entity] -> [SelectOpt entity]
forall a. a -> [a] -> [a]
: [SelectOpt entity]
endSelectOpt
sqlMaxEventVersion ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
(FieldNameDB -> FieldNameDB -> FieldNameDB -> Text) ->
UUID ->
SqlPersistT m EventVersion
sqlMaxEventVersion :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text)
-> UUID
-> SqlPersistT m EventVersion
sqlMaxEventVersion SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} FieldNameDB -> FieldNameDB -> FieldNameDB -> Text
maxVersionSql UUID
uuid =
let tableName :: FieldNameDB
tableName = Text -> FieldNameDB
FieldNameDB (Text -> FieldNameDB) -> Text -> FieldNameDB
forall a b. (a -> b) -> a -> b
$ EntityNameDB -> Text
unEntityNameDB (EntityNameDB -> Text) -> EntityNameDB -> Text
forall a b. (a -> b) -> a -> b
$ entity -> EntityNameDB
forall record. PersistEntity record => record -> EntityNameDB
tableDBName (UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity UUID
nil EventVersion
0 serialized
forall a. HasCallStack => a
undefined)
uuidFieldName :: FieldNameDB
uuidFieldName = EntityField entity UUID -> FieldNameDB
forall record typ.
PersistEntity record =>
EntityField record typ -> FieldNameDB
fieldDBName EntityField entity UUID
sqlEventStoreConfigUUIDField
versionFieldName :: FieldNameDB
versionFieldName = EntityField entity EventVersion -> FieldNameDB
forall record typ.
PersistEntity record =>
EntityField record typ -> FieldNameDB
fieldDBName EntityField entity EventVersion
sqlEventStoreConfigVersionField
rawVals :: ReaderT SqlBackend m [Single EventVersion]
rawVals = Text
-> [PersistValue] -> ReaderT SqlBackend m [Single EventVersion]
forall a (m :: * -> *) backend.
(RawSql a, MonadIO m, BackendCompatible SqlBackend backend) =>
Text -> [PersistValue] -> ReaderT backend m [a]
rawSql (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text
maxVersionSql FieldNameDB
tableName FieldNameDB
uuidFieldName FieldNameDB
versionFieldName) [UUID -> PersistValue
forall a. PersistField a => a -> PersistValue
toPersistValue UUID
uuid]
in EventVersion
-> (Single EventVersion -> EventVersion)
-> Maybe (Single EventVersion)
-> EventVersion
forall b a. b -> (a -> b) -> Maybe a -> b
maybe EventVersion
0 Single EventVersion -> EventVersion
forall a. Single a -> a
unSingle (Maybe (Single EventVersion) -> EventVersion)
-> ([Single EventVersion] -> Maybe (Single EventVersion))
-> [Single EventVersion]
-> EventVersion
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Single EventVersion] -> Maybe (Single EventVersion)
forall a. [a] -> Maybe a
listToMaybe ([Single EventVersion] -> EventVersion)
-> ReaderT SqlBackend m [Single EventVersion]
-> ReaderT SqlBackend m EventVersion
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ReaderT SqlBackend m [Single EventVersion]
rawVals
sqlStoreEvents ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend, SafeToInsert entity) =>
SqlEventStoreConfig entity serialized ->
Maybe (Text -> Text) ->
(FieldNameDB -> FieldNameDB -> FieldNameDB -> Text) ->
UUID ->
[serialized] ->
SqlPersistT m EventVersion
sqlStoreEvents :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend, SafeToInsert entity) =>
SqlEventStoreConfig entity serialized
-> Maybe (Text -> Text)
-> (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text)
-> UUID
-> [serialized]
-> SqlPersistT m EventVersion
sqlStoreEvents config :: SqlEventStoreConfig entity serialized
config@SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} Maybe (Text -> Text)
mLockCommand FieldNameDB -> FieldNameDB -> FieldNameDB -> Text
maxVersionSql UUID
uuid [serialized]
events = do
EventVersion
versionNum <- SqlEventStoreConfig entity serialized
-> (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text)
-> UUID
-> SqlPersistT m EventVersion
forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> (FieldNameDB -> FieldNameDB -> FieldNameDB -> Text)
-> UUID
-> SqlPersistT m EventVersion
sqlMaxEventVersion SqlEventStoreConfig entity serialized
config FieldNameDB -> FieldNameDB -> FieldNameDB -> Text
maxVersionSql UUID
uuid
let entities :: [entity]
entities = (EventVersion -> serialized -> entity)
-> [EventVersion] -> [serialized] -> [entity]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity UUID
uuid) [EventVersion
versionNum EventVersion -> EventVersion -> EventVersion
forall a. Num a => a -> a -> a
+ EventVersion
1 ..] [serialized]
events
Maybe (Text -> Text)
-> ((Text -> Text) -> ReaderT SqlBackend m ())
-> ReaderT SqlBackend m ()
forall (t :: * -> *) (f :: * -> *) a b.
(Foldable t, Applicative f) =>
t a -> (a -> f b) -> f ()
for_ Maybe (Text -> Text)
mLockCommand (((Text -> Text) -> ReaderT SqlBackend m ())
-> ReaderT SqlBackend m ())
-> ((Text -> Text) -> ReaderT SqlBackend m ())
-> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ \Text -> Text
lockCommand -> Text -> [PersistValue] -> ReaderT SqlBackend m ()
forall (m :: * -> *) backend.
(MonadIO m, BackendCompatible SqlBackend backend) =>
Text -> [PersistValue] -> ReaderT backend m ()
rawExecute (Text -> Text
lockCommand Text
tableName) []
[Key entity]
_ <- [entity] -> ReaderT SqlBackend m [Key entity]
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
PersistRecordBackend record backend, SafeToInsert record) =>
[record] -> ReaderT backend m [Key record]
forall record (m :: * -> *).
(MonadIO m, PersistRecordBackend record SqlBackend,
SafeToInsert record) =>
[record] -> ReaderT SqlBackend m [Key record]
insertMany [entity]
entities
EventVersion -> SqlPersistT m EventVersion
forall a. a -> ReaderT SqlBackend m a
forall (m :: * -> *) a. Monad m => a -> m a
return (EventVersion -> SqlPersistT m EventVersion)
-> EventVersion -> SqlPersistT m EventVersion
forall a b. (a -> b) -> a -> b
$ EventVersion
versionNum EventVersion -> EventVersion -> EventVersion
forall a. Num a => a -> a -> a
+ Int -> EventVersion
EventVersion ([serialized] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [serialized]
events)
where
tableName :: Text
tableName = EntityNameDB -> Text
unEntityNameDB (EntityNameDB -> Text) -> EntityNameDB -> Text
forall a b. (a -> b) -> a -> b
$ entity -> EntityNameDB
forall record. PersistEntity record => record -> EntityNameDB
tableDBName (UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity UUID
nil EventVersion
0 serialized
forall a. HasCallStack => a
undefined)
unsafeSqlStoreGlobalStreamEvents ::
(MonadIO m, PersistEntity entity, PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized ->
[GlobalStreamEvent serialized] ->
SqlPersistT m ()
unsafeSqlStoreGlobalStreamEvents :: forall (m :: * -> *) entity serialized.
(MonadIO m, PersistEntity entity,
PersistEntityBackend entity ~ SqlBackend) =>
SqlEventStoreConfig entity serialized
-> [GlobalStreamEvent serialized] -> SqlPersistT m ()
unsafeSqlStoreGlobalStreamEvents SqlEventStoreConfig {EntityField entity serialized
EntityField entity UUID
EntityField entity EventVersion
EntityField entity (Key entity)
entity -> serialized
entity -> UUID
entity -> EventVersion
UUID -> EventVersion -> serialized -> entity
SequenceNumber -> Key entity
Key entity -> SequenceNumber
sqlEventStoreConfigSequenceMakeEntity :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> UUID
sqlEventStoreConfigVersion :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> EventVersion
sqlEventStoreConfigData :: forall entity serialized.
SqlEventStoreConfig entity serialized -> entity -> serialized
sqlEventStoreConfigSequenceNumberField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: forall entity serialized.
SqlEventStoreConfig entity serialized -> EntityField entity UUID
sqlEventStoreConfigVersionField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity EventVersion
sqlEventStoreConfigDataField :: forall entity serialized.
SqlEventStoreConfig entity serialized
-> EntityField entity serialized
sqlEventStoreConfigSequenceMakeEntity :: UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigMakeKey :: SequenceNumber -> Key entity
sqlEventStoreConfigUnKey :: Key entity -> SequenceNumber
sqlEventStoreConfigUUID :: entity -> UUID
sqlEventStoreConfigVersion :: entity -> EventVersion
sqlEventStoreConfigData :: entity -> serialized
sqlEventStoreConfigSequenceNumberField :: EntityField entity (Key entity)
sqlEventStoreConfigUUIDField :: EntityField entity UUID
sqlEventStoreConfigVersionField :: EntityField entity EventVersion
sqlEventStoreConfigDataField :: EntityField entity serialized
..} [GlobalStreamEvent serialized]
events =
[Entity entity] -> ReaderT SqlBackend m ()
forall backend record (m :: * -> *).
(PersistStoreWrite backend, MonadIO m,
PersistRecordBackend record backend) =>
[Entity record] -> ReaderT backend m ()
forall record (m :: * -> *).
(MonadIO m, PersistRecordBackend record SqlBackend) =>
[Entity record] -> ReaderT SqlBackend m ()
insertEntityMany ([Entity entity] -> ReaderT SqlBackend m ())
-> [Entity entity] -> ReaderT SqlBackend m ()
forall a b. (a -> b) -> a -> b
$ (GlobalStreamEvent serialized -> Entity entity)
-> [GlobalStreamEvent serialized] -> [Entity entity]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap GlobalStreamEvent serialized -> Entity entity
mkEventEntity [GlobalStreamEvent serialized]
events
where
mkEventEntity :: GlobalStreamEvent serialized -> Entity entity
mkEventEntity (StreamEvent () SequenceNumber
seqNum (StreamEvent UUID
uuid EventVersion
vers serialized
event)) =
Key entity -> entity -> Entity entity
forall record. Key record -> record -> Entity record
Entity
(SequenceNumber -> Key entity
sqlEventStoreConfigMakeKey SequenceNumber
seqNum)
(UUID -> EventVersion -> serialized -> entity
sqlEventStoreConfigSequenceMakeEntity UUID
uuid EventVersion
vers serialized
event)