
org.enodeframework.mysql.MySQLPublishedVersionStore.kt Maven / Gradle / Ivy
package org.enodeframework.mysql
import io.vertx.mysqlclient.MySQLPool
import io.vertx.sqlclient.Tuple
import org.enodeframework.common.io.IOHelper
import org.enodeframework.configurations.EventStoreConfiguration
import org.enodeframework.eventing.IPublishedVersionStore
import org.enodeframework.mysql.handler.MySQLFindPublishedVersionHandler
import org.enodeframework.mysql.handler.MySQLUpsertPublishedVersionHandler
import java.time.LocalDateTime
import java.util.concurrent.CompletableFuture
/**
* @author [email protected]
*/
class MySQLPublishedVersionStore(
private val client: MySQLPool, private val configuration: EventStoreConfiguration
) : IPublishedVersionStore {
override fun updatePublishedVersionAsync(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String, publishedVersion: Int
): CompletableFuture {
return IOHelper.tryIOFuncAsync({
updatePublishedVersion(processorName, aggregateRootTypeName, aggregateRootId, publishedVersion)
}, "UpdatePublishedVersionAsync")
}
private fun updatePublishedVersion(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String, publishedVersion: Int
): CompletableFuture {
val insert = publishedVersion == 1
if (insert) {
return insertVersionAsync(processorName, aggregateRootTypeName, aggregateRootId, publishedVersion)
}
return updateVersionAsync(processorName, aggregateRootTypeName, aggregateRootId, publishedVersion)
}
private fun updateVersionAsync(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String, publishedVersion: Int
): CompletableFuture {
val handler = MySQLUpsertPublishedVersionHandler(
configuration.publishedUkName, "$processorName#$aggregateRootTypeName#$aggregateRootId#$publishedVersion"
)
val sql = String.format(UPDATE_SQL, configuration.publishedTableName)
val tuple = Tuple.of(
publishedVersion, LocalDateTime.now(), processorName, aggregateRootId, publishedVersion - 1
)
client.preparedQuery(sql).execute(tuple).onComplete(handler)
return handler.future
}
private fun insertVersionAsync(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String, publishedVersion: Int
): CompletableFuture {
val handler = MySQLUpsertPublishedVersionHandler(
configuration.publishedUkName, "$processorName#$aggregateRootTypeName#$aggregateRootId#$publishedVersion"
)
val sql = String.format(INSERT_SQL, configuration.publishedTableName)
val tuple = Tuple.of(processorName, aggregateRootTypeName, aggregateRootId, 1, LocalDateTime.now())
client.preparedQuery(sql).execute(tuple).onComplete(handler)
return handler.future
}
override fun getPublishedVersionAsync(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String
): CompletableFuture {
return IOHelper.tryIOFuncAsync({
getPublishedVersion(processorName, aggregateRootTypeName, aggregateRootId)
}, "UpdatePublishedVersionAsync")
}
private fun getPublishedVersion(
processorName: String, aggregateRootTypeName: String, aggregateRootId: String
): CompletableFuture {
val handler = MySQLFindPublishedVersionHandler("$aggregateRootId#$processorName#$aggregateRootTypeName")
val sql = String.format(SELECT_SQL, configuration.publishedTableName)
client.preparedQuery(sql).execute(Tuple.of(processorName, aggregateRootId)).onComplete(handler)
return handler.future
}
companion object {
private const val INSERT_SQL =
"INSERT INTO %s (processor_name, aggregate_root_type_name, aggregate_root_id, version, gmt_create) VALUES (?, ?, ?, ?, ?)"
private const val UPDATE_SQL =
"UPDATE %s SET version = ?, gmt_create = ? WHERE processor_name = ? AND aggregate_root_id = ? AND version = ?"
private const val SELECT_SQL = "SELECT version FROM %s WHERE processor_name = ? AND aggregate_root_id = ?"
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy