Using Middleware, you can perform any operation for each of all updates. For example,
In DatabaseType protocol, we can return the set of middlewares. This property would be called for each update.
struct Database: DatabaseType {
...
var middlewares: [AnyMiddleware<RootState.Database>] {
[
// Here
]
}
}
We can return MiddlewareType
object here. However since it’s a generic protocol, it needs to wrap up with AnyMiddleware object to return as an array.
struct AnyMiddleware
public struct AnyMiddleware<Database> : MiddlewareType where Database : VergeORM.DatabaseType {
public init<Base>(_ base: Base) where Database == Base.Database, Base : VergeORM.MiddlewareType
public init(performAfterUpdates: @escaping (DatabaseBatchUpdateContext<Database>) -> ())
public func performAfterUpdates(context: DatabaseBatchUpdateContext<Database>)
}
To wrap your middleware up with AnyMiddleware
public struct MyMiddleware<Database: DatabaseType>: MiddlewareType {
...
}
let middleware = MyMiddleware()
AnyMiddleware<Database>(middleware)
To create anonymous middleware using AnyMiddleware
AnyMiddleware<Database>(performAfterUpdates: { (context) in
// ... any operation
})
MiddlewareType.performAfterUpdates
let autoIndex = AnyMiddleware<RootState.Database>(performAfterUpdates: { (context) in
let ids = context.insertsOrUpdates.author.all().map { $0.id }
context.indexes.bookMiddleware.append(contentsOf: ids)
})
This sample code adds identifier of Author that added on batch-updates. This means it manages Index automatically. Finally, returns this object on middlewares property.
let autoIndex = ...
struct Database: DatabaseType {
...
var middlewares: [AnyMiddleware<RootState.Database>] {
[
autoIndex
]
}
}