mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-11-11 09:30:43 +00:00
ReadKeyValuesRepo#removeWithValue
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package dev.inmo.micro_utils.repos
|
||||
|
||||
import dev.inmo.micro_utils.pagination.*
|
||||
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
||||
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
|
||||
@@ -44,9 +45,23 @@ interface WriteKeyValuesRepo<Key, Value> : Repo {
|
||||
|
||||
suspend fun add(toAdd: Map<Key, List<Value>>)
|
||||
|
||||
/**
|
||||
* Removes [Value]s by passed [Key]s without full clear of all data by [Key]
|
||||
*/
|
||||
suspend fun remove(toRemove: Map<Key, List<Value>>)
|
||||
|
||||
/**
|
||||
* Removes [v] without full clear of all data by [Key]s with [v]
|
||||
*/
|
||||
suspend fun removeWithValue(v: Value)
|
||||
|
||||
/**
|
||||
* Fully clear all data by [k]
|
||||
*/
|
||||
suspend fun clear(k: Key)
|
||||
/**
|
||||
* Clear [v] **with** full clear of all data by [Key]s with [v]
|
||||
*/
|
||||
suspend fun clearWithValue(v: Value)
|
||||
|
||||
suspend fun set(toSet: Map<Key, List<Value>>) {
|
||||
@@ -100,6 +115,21 @@ interface KeyValuesRepo<Key, Value> : ReadKeyValuesRepo<Key, Value>, WriteKeyVal
|
||||
keysResult.currentPageIfNotEmpty()
|
||||
}
|
||||
}
|
||||
suspend override fun removeWithValue(v: Value) {
|
||||
val toRemove = mutableMapOf<Key, List<Value>>()
|
||||
|
||||
doForAllWithNextPaging {
|
||||
keys(it).also {
|
||||
it.results.forEach {
|
||||
if (contains(it, v)) {
|
||||
toRemove[it] = listOf(v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
remove(toRemove)
|
||||
}
|
||||
}
|
||||
typealias OneToManyKeyValueRepo<Key,Value> = KeyValuesRepo<Key, Value>
|
||||
|
||||
|
||||
@@ -97,6 +97,8 @@ open class MapperWriteKeyValuesRepo<FromKey, FromValue, ToKey, ToValue>(
|
||||
}.toMap()
|
||||
)
|
||||
|
||||
override suspend fun removeWithValue(v: FromValue) = to.removeWithValue(v.toOutValue())
|
||||
|
||||
override suspend fun set(toSet: Map<FromKey, List<FromValue>>) {
|
||||
to.set(
|
||||
toSet.map { (k, vs) -> k.toOutKey() to vs.map { v -> v.toOutValue() } }.toMap()
|
||||
|
||||
@@ -4,6 +4,7 @@ import dev.inmo.micro_utils.pagination.FirstPagePagination
|
||||
import dev.inmo.micro_utils.pagination.utils.doForAllWithNextPaging
|
||||
import dev.inmo.micro_utils.repos.KeyValueRepo
|
||||
import dev.inmo.micro_utils.repos.KeyValuesRepo
|
||||
import dev.inmo.micro_utils.repos.set
|
||||
import dev.inmo.micro_utils.repos.unset
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
@@ -60,6 +61,24 @@ open class KeyValuesFromKeyValueRepo<Key, Value, ValuesIterable : Iterable<Value
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun removeWithValue(v: Value) {
|
||||
val toRemove = mutableMapOf<Key, List<Value>>()
|
||||
|
||||
doForAllWithNextPaging {
|
||||
original.keys(it).also {
|
||||
it.results.forEach {
|
||||
val data = original.get(it) ?: return@forEach
|
||||
|
||||
if (v in data) {
|
||||
toRemove[it] = listOf(v)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
remove(toRemove)
|
||||
}
|
||||
|
||||
override suspend fun add(toAdd: Map<Key, List<Value>>) {
|
||||
original.set(
|
||||
toAdd.mapNotNull { (k, adding) ->
|
||||
|
||||
@@ -6,6 +6,7 @@ import dev.inmo.micro_utils.common.mapNotNullA
|
||||
import dev.inmo.micro_utils.pagination.*
|
||||
import dev.inmo.micro_utils.pagination.utils.reverse
|
||||
import dev.inmo.micro_utils.repos.*
|
||||
import dev.inmo.micro_utils.repos.crud.asId
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.MutableSharedFlow
|
||||
import kotlinx.coroutines.flow.asSharedFlow
|
||||
@@ -260,6 +261,19 @@ class OneToManyAndroidRepo<Key, Value>(
|
||||
_onValueRemoved.emit(k to v)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun removeWithValue(v: Value) {
|
||||
helper.blockingWritableTransaction {
|
||||
val keys = select(tableName, idColumnArray, "$valueColumnName=?", arrayOf(v.valueAsString())).map {
|
||||
it.asId.keyFromString()
|
||||
}
|
||||
keys.filter {
|
||||
delete(tableName, "$idColumnName=? AND $valueColumnName=?", arrayOf(it.keyAsString(), v.valueAsString())) > 0
|
||||
}
|
||||
}.forEach { k ->
|
||||
_onValueRemoved.emit(k to v)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun <Key, Value> OneToManyAndroidRepo(
|
||||
|
||||
Reference in New Issue
Block a user