mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-11-11 17:40:27 +00:00
AbstractExposedKeyValuesRepo#set fix
This commit is contained in:
@@ -9,6 +9,8 @@
|
|||||||
* `Repos`:
|
* `Repos`:
|
||||||
* `Cache`:
|
* `Cache`:
|
||||||
* Fix of `FullKeyValueCacheRepo` fields usage
|
* Fix of `FullKeyValueCacheRepo` fields usage
|
||||||
|
* `Exposed`:
|
||||||
|
* `AbstractExposedKeyValuesRepo` will produce `onValueRemoved` event on `set` if some data has been removed
|
||||||
|
|
||||||
## 0.24.6
|
## 0.24.6
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import dev.inmo.micro_utils.repos.KeyValuesRepo
|
|||||||
import kotlinx.coroutines.channels.BufferOverflow
|
import kotlinx.coroutines.channels.BufferOverflow
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.statements.InsertStatement
|
|
||||||
import org.jetbrains.exposed.sql.statements.UpdateBuilder
|
import org.jetbrains.exposed.sql.statements.UpdateBuilder
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
|
|
||||||
@@ -57,18 +56,48 @@ abstract class AbstractExposedKeyValuesRepo<Key, Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
transaction(database) {
|
val (oldObjects, insertedResults) = transaction(database) {
|
||||||
|
val oldObjects = selectAll().where { selectByIds(toSet.keys.toList()) }.map { it.asKey to it.asObject }
|
||||||
|
|
||||||
deleteWhere {
|
deleteWhere {
|
||||||
selectByIds(it, toSet.keys.toList())
|
selectByIds(it, toSet.keys.toList())
|
||||||
}
|
}
|
||||||
batchInsert(
|
val inserted = batchInsert(
|
||||||
prepreparedData,
|
prepreparedData,
|
||||||
) { (k, v) ->
|
) { (k, v) ->
|
||||||
insert(k, v, this)
|
insert(k, v, this)
|
||||||
}.map {
|
}.map {
|
||||||
it.asKey to it.asObject
|
it.asKey to it.asObject
|
||||||
}
|
}
|
||||||
}.forEach { _onNewValue.emit(it) }
|
oldObjects to inserted
|
||||||
|
}.let {
|
||||||
|
val mappedFirst = it
|
||||||
|
.first
|
||||||
|
.asSequence()
|
||||||
|
.groupBy { it.first }
|
||||||
|
.mapValues { it.value.map { it.second }.toSet() }
|
||||||
|
val mappedSecond = it
|
||||||
|
.second
|
||||||
|
.asSequence()
|
||||||
|
.groupBy { it.first }
|
||||||
|
.mapValues { it.value.map { it.second }.toSet() }
|
||||||
|
mappedFirst to mappedSecond
|
||||||
|
}
|
||||||
|
val deletedResults = oldObjects.mapNotNull { (k, vs) ->
|
||||||
|
k to vs.filter { v ->
|
||||||
|
insertedResults[k] ?.contains(v) != true
|
||||||
|
}.ifEmpty { return@mapNotNull null }
|
||||||
|
}
|
||||||
|
deletedResults.forEach { (k, vs) ->
|
||||||
|
vs.forEach { v ->
|
||||||
|
_onValueRemoved.emit(k to v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
insertedResults.forEach { (k, vs) ->
|
||||||
|
vs.forEach { v ->
|
||||||
|
_onNewValue.emit(k to v)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun remove(toRemove: Map<Key, List<Value>>) {
|
override suspend fun remove(toRemove: Map<Key, List<Value>>) {
|
||||||
|
|||||||
Reference in New Issue
Block a user