mirror of
https://github.com/InsanusMokrassar/MicroUtils.git
synced 2025-01-11 02:09:56 +00:00
commit
cf1fd32b08
10
CHANGELOG.md
10
CHANGELOG.md
@ -1,5 +1,15 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## 0.17.5
|
||||||
|
|
||||||
|
* `Common`:
|
||||||
|
* Conversations of number primitives with bounds care
|
||||||
|
* `Repos`:
|
||||||
|
* `Common`:
|
||||||
|
* By default, `getAll` for repos will take all the size of repo as page size
|
||||||
|
* New extension for all built-in repos `maxPagePagination`
|
||||||
|
* All the repos got `getAll` functions
|
||||||
|
|
||||||
## 0.17.4
|
## 0.17.4
|
||||||
|
|
||||||
* `Serialization`:
|
* `Serialization`:
|
||||||
|
@ -0,0 +1,28 @@
|
|||||||
|
package dev.inmo.micro_utils.common
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert [this] [Long] to [Int] with bounds of [Int.MIN_VALUE] and [Int.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Long.toCoercedInt(): Int = coerceIn(Int.MIN_VALUE.toLong(), Int.MAX_VALUE.toLong()).toInt()
|
||||||
|
/**
|
||||||
|
* Convert [this] [Long] to [Short] with bounds of [Short.MIN_VALUE] and [Short.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Long.toCoercedShort(): Short = coerceIn(Short.MIN_VALUE.toLong(), Short.MAX_VALUE.toLong()).toShort()
|
||||||
|
/**
|
||||||
|
* Convert [this] [Long] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Long.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toLong(), Byte.MAX_VALUE.toLong()).toByte()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert [this] [Int] to [Short] with bounds of [Short.MIN_VALUE] and [Short.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Int.toCoercedShort(): Short = coerceIn(Short.MIN_VALUE.toInt(), Short.MAX_VALUE.toInt()).toShort()
|
||||||
|
/**
|
||||||
|
* Convert [this] [Int] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Int.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toInt(), Byte.MAX_VALUE.toInt()).toByte()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert [this] [Short] to [Byte] with bounds of [Byte.MIN_VALUE] and [Byte.MAX_VALUE]
|
||||||
|
*/
|
||||||
|
fun Short.toCoercedByte(): Byte = coerceIn(Byte.MIN_VALUE.toShort(), Byte.MAX_VALUE.toShort()).toByte()
|
@ -14,5 +14,5 @@ crypto_js_version=4.1.1
|
|||||||
# Project data
|
# Project data
|
||||||
|
|
||||||
group=dev.inmo
|
group=dev.inmo
|
||||||
version=0.17.4
|
version=0.17.5
|
||||||
android_code_version=186
|
android_code_version=187
|
||||||
|
@ -8,7 +8,7 @@ kslog = "1.0.0"
|
|||||||
|
|
||||||
jb-compose = "1.3.1"
|
jb-compose = "1.3.1"
|
||||||
jb-exposed = "0.41.1"
|
jb-exposed = "0.41.1"
|
||||||
jb-dokka = "1.7.20"
|
jb-dokka = "1.8.10"
|
||||||
|
|
||||||
klock = "3.4.0"
|
klock = "3.4.0"
|
||||||
uuid = "0.7.0"
|
uuid = "0.7.0"
|
||||||
|
@ -2,6 +2,7 @@ package dev.inmo.micro_utils.repos.cache
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.repos.*
|
import dev.inmo.micro_utils.repos.*
|
||||||
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
import dev.inmo.micro_utils.repos.cache.cache.KVCache
|
||||||
|
import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
@ -15,6 +16,12 @@ open class ReadCRUDCacheRepo<ObjectType, IdType>(
|
|||||||
kvCache.set(id, it)
|
kvCache.set(id, it)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> {
|
||||||
|
return kvCache.getAll().takeIf { it.size.toLong() == count() } ?: parentRepo.getAll().also {
|
||||||
|
kvCache.actualizeAll(true) { it }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun contains(id: IdType): Boolean = kvCache.contains(id) || parentRepo.contains(id)
|
override suspend fun contains(id: IdType): Boolean = kvCache.contains(id) || parentRepo.contains(id)
|
||||||
|
|
||||||
override suspend fun invalidate() = kvCache.clear()
|
override suspend fun invalidate() = kvCache.clear()
|
||||||
|
@ -24,6 +24,12 @@ open class ReadKeyValueCacheRepo<Key,Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = kvCache.getAll().takeIf {
|
||||||
|
it.size.toLong() == count()
|
||||||
|
} ?: parentRepo.getAll().also {
|
||||||
|
kvCache.set(it)
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun invalidate() = kvCache.clear()
|
override suspend fun invalidate() = kvCache.clear()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,6 +52,14 @@ open class AutoRecacheReadCRUDRepo<RegisteredObject, Id>(
|
|||||||
kvCache.contains(id)
|
kvCache.contains(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Id, RegisteredObject> = actionWrapper.wrap {
|
||||||
|
originalRepo.getAll()
|
||||||
|
}.onSuccess {
|
||||||
|
kvCache.actualizeAll(clear = true) { it }
|
||||||
|
}.getOrElse {
|
||||||
|
kvCache.getAll()
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun count(): Long = actionWrapper.wrap {
|
override suspend fun count(): Long = actionWrapper.wrap {
|
||||||
originalRepo.count()
|
originalRepo.count()
|
||||||
}.getOrElse {
|
}.getOrElse {
|
||||||
|
@ -52,6 +52,14 @@ open class AutoRecacheReadKeyValueRepo<Id, RegisteredObject>(
|
|||||||
kvCache.contains(key)
|
kvCache.contains(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Id, RegisteredObject> = actionWrapper.wrap {
|
||||||
|
originalRepo.getAll()
|
||||||
|
}.onSuccess {
|
||||||
|
kvCache.actualizeAll(clear = true) { it }
|
||||||
|
}.getOrElse {
|
||||||
|
kvCache.getAll()
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun count(): Long = actionWrapper.wrap {
|
override suspend fun count(): Long = actionWrapper.wrap {
|
||||||
originalRepo.count()
|
originalRepo.count()
|
||||||
}.getOrElse {
|
}.getOrElse {
|
||||||
|
@ -58,6 +58,12 @@ open class FullReadCRUDCacheRepo<ObjectType, IdType>(
|
|||||||
{ if (it) parentRepo.getById(id) ?.let { set(id, it) } }
|
{ if (it) parentRepo.getById(id) ?.let { set(id, it) } }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> = doOrTakeAndActualize(
|
||||||
|
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
||||||
|
{ getAll() },
|
||||||
|
{ kvCache.actualizeAll(clear = true) { it } }
|
||||||
|
)
|
||||||
|
|
||||||
override suspend fun getById(id: IdType): ObjectType? = doOrTakeAndActualize(
|
override suspend fun getById(id: IdType): ObjectType? = doOrTakeAndActualize(
|
||||||
{ get(id) ?.optional ?: Optional.absent() },
|
{ get(id) ?.optional ?: Optional.absent() },
|
||||||
{ getById(id) },
|
{ getById(id) },
|
||||||
|
@ -9,7 +9,6 @@ import dev.inmo.micro_utils.repos.cache.util.actualizeAll
|
|||||||
import dev.inmo.micro_utils.repos.pagination.getAll
|
import dev.inmo.micro_utils.repos.pagination.getAll
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.Job
|
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
|
|
||||||
open class FullReadKeyValueCacheRepo<Key,Value>(
|
open class FullReadKeyValueCacheRepo<Key,Value>(
|
||||||
@ -59,6 +58,12 @@ open class FullReadKeyValueCacheRepo<Key,Value>(
|
|||||||
{ if (it) parentRepo.get(key) ?.also { kvCache.set(key, it) } }
|
{ if (it) parentRepo.get(key) ?.also { kvCache.set(key, it) } }
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = doOrTakeAndActualize(
|
||||||
|
{ getAll().takeIf { it.isNotEmpty() }.optionalOrAbsentIfNull },
|
||||||
|
{ getAll() },
|
||||||
|
{ kvCache.actualizeAll(clear = true) { it } }
|
||||||
|
)
|
||||||
|
|
||||||
override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult<Key> = doOrTakeAndActualize(
|
override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult<Key> = doOrTakeAndActualize(
|
||||||
{ keys(pagination, reversed).takeIf { it.results.isNotEmpty() }.optionalOrAbsentIfNull },
|
{ keys(pagination, reversed).takeIf { it.results.isNotEmpty() }.optionalOrAbsentIfNull },
|
||||||
{ keys(pagination, reversed) },
|
{ keys(pagination, reversed) },
|
||||||
|
@ -28,7 +28,7 @@ suspend inline fun <K, V> KVCache<K, V>.actualizeAll(
|
|||||||
clear: Boolean = true,
|
clear: Boolean = true,
|
||||||
) {
|
) {
|
||||||
actualizeAll(clear) {
|
actualizeAll(clear) {
|
||||||
repo.getAll { keys(it) }.toMap()
|
repo.getAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -37,7 +37,7 @@ suspend inline fun <K, V> KVCache<K, List<V>>.actualizeAll(
|
|||||||
clear: Boolean = true,
|
clear: Boolean = true,
|
||||||
) {
|
) {
|
||||||
actualizeAll(clear) {
|
actualizeAll(clear) {
|
||||||
repo.getAll { keys(it) }.toMap()
|
repo.getAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -46,8 +46,6 @@ suspend inline fun <K, V> KVCache<K, V>.actualizeAll(
|
|||||||
clear: Boolean = true,
|
clear: Boolean = true,
|
||||||
) {
|
) {
|
||||||
actualizeAll(clear) {
|
actualizeAll(clear) {
|
||||||
repo.getAllByWithNextPaging {
|
repo.getAll()
|
||||||
getIdsByPagination(it)
|
|
||||||
}.mapNotNull { it to (repo.getById(it) ?: return@mapNotNull null) }.toMap()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,10 @@ package dev.inmo.micro_utils.repos
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.doAllWithCurrentPaging
|
import dev.inmo.micro_utils.pagination.utils.doAllWithCurrentPaging
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.getAllByWithNextPaging
|
||||||
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||||
import dev.inmo.micro_utils.pagination.utils.paginate
|
import dev.inmo.micro_utils.pagination.utils.paginate
|
||||||
|
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -51,6 +53,16 @@ interface ReadKeyValueRepo<Key, Value> : Repo {
|
|||||||
*/
|
*/
|
||||||
suspend fun contains(key: Key): Boolean
|
suspend fun contains(key: Key): Boolean
|
||||||
|
|
||||||
|
suspend fun getAll(): Map<Key, Value> = getAllByWithNextPaging(maxPagePagination()) {
|
||||||
|
keys(it).let {
|
||||||
|
it.changeResultsUnchecked(
|
||||||
|
it.results.mapNotNull {
|
||||||
|
it to (get(it) ?: return@mapNotNull null)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return count of all collection objects
|
* @return count of all collection objects
|
||||||
*/
|
*/
|
||||||
|
@ -2,6 +2,9 @@ package dev.inmo.micro_utils.repos
|
|||||||
|
|
||||||
import dev.inmo.micro_utils.pagination.Pagination
|
import dev.inmo.micro_utils.pagination.Pagination
|
||||||
import dev.inmo.micro_utils.pagination.PaginationResult
|
import dev.inmo.micro_utils.pagination.PaginationResult
|
||||||
|
import dev.inmo.micro_utils.pagination.changeResultsUnchecked
|
||||||
|
import dev.inmo.micro_utils.pagination.utils.getAllWithCurrentPaging
|
||||||
|
import dev.inmo.micro_utils.repos.pagination.maxPagePagination
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
|
|
||||||
interface ReadCRUDRepo<ObjectType, IdType> : Repo {
|
interface ReadCRUDRepo<ObjectType, IdType> : Repo {
|
||||||
@ -9,6 +12,14 @@ interface ReadCRUDRepo<ObjectType, IdType> : Repo {
|
|||||||
suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<IdType>
|
suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<IdType>
|
||||||
suspend fun getById(id: IdType): ObjectType?
|
suspend fun getById(id: IdType): ObjectType?
|
||||||
suspend fun contains(id: IdType): Boolean
|
suspend fun contains(id: IdType): Boolean
|
||||||
|
suspend fun getAll(): Map<IdType, ObjectType> = getAllWithCurrentPaging(maxPagePagination()) {
|
||||||
|
getIdsByPagination(it).let {
|
||||||
|
it.changeResultsUnchecked(
|
||||||
|
it.results.mapNotNull { it to (getById(it) ?: return@mapNotNull null) }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
suspend fun count(): Long
|
suspend fun count(): Long
|
||||||
}
|
}
|
||||||
typealias ReadStandardCRUDRepo<ObjectType, IdType> = ReadCRUDRepo<ObjectType, IdType>
|
typealias ReadStandardCRUDRepo<ObjectType, IdType> = ReadCRUDRepo<ObjectType, IdType>
|
||||||
|
@ -32,6 +32,10 @@ open class MapperReadCRUDRepo<FromId, FromRegistered, ToId, ToRegistered>(
|
|||||||
|
|
||||||
override suspend fun contains(id: FromId): Boolean = to.contains(id.toOutKey())
|
override suspend fun contains(id: FromId): Boolean = to.contains(id.toOutKey())
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<FromId, FromRegistered> = to.getAll().asSequence().associate { (k, v) ->
|
||||||
|
k.toInnerKey() to v.toInnerValue()
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun getById(id: FromId): FromRegistered? = to.getById(
|
override suspend fun getById(id: FromId): FromRegistered? = to.getById(
|
||||||
id.toOutKey()
|
id.toOutKey()
|
||||||
) ?.toInnerValue()
|
) ?.toInnerValue()
|
||||||
|
@ -55,6 +55,10 @@ open class MapperReadKeyValueRepo<FromKey, FromValue, ToKey, ToValue>(
|
|||||||
key.toOutKey()
|
key.toOutKey()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<FromKey, FromValue> = to.getAll().map { (k, v) ->
|
||||||
|
k.toInnerKey() to v.toInnerValue()
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
override suspend fun count(): Long = to.count()
|
override suspend fun count(): Long = to.count()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,12 +1,19 @@
|
|||||||
package dev.inmo.micro_utils.repos.pagination
|
package dev.inmo.micro_utils.repos.pagination
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.toCoercedInt
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
|
|
||||||
suspend inline fun <T, ID, REPO : ReadCRUDRepo<T, ID>> REPO.getAll(
|
suspend inline fun <T, ID, REPO : ReadCRUDRepo<T, ID>> REPO.getAll(
|
||||||
|
pagination: Pagination,
|
||||||
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<T>
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<T>
|
||||||
): List<T> = getAllWithNextPaging {
|
): List<T> = getAllWithNextPaging(pagination) {
|
||||||
methodCaller(this, it)
|
methodCaller(this, it)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend inline fun <T, ID, REPO : ReadCRUDRepo<T, ID>> REPO.getAll(
|
||||||
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<T>
|
||||||
|
): List<T> = getAll(maxPagePagination(), methodCaller)
|
||||||
|
@ -1,15 +1,22 @@
|
|||||||
package dev.inmo.micro_utils.repos.pagination
|
package dev.inmo.micro_utils.repos.pagination
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.toCoercedInt
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
|
||||||
suspend inline fun <Key, Value, REPO : ReadKeyValueRepo<Key, Value>> REPO.getAll(
|
suspend inline fun <Key, Value, REPO : ReadKeyValueRepo<Key, Value>> REPO.getAll(
|
||||||
|
pagination: Pagination,
|
||||||
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
||||||
): List<Pair<Key, Value>> = getAllWithNextPaging {
|
): List<Pair<Key, Value>> = getAllWithNextPaging(pagination) {
|
||||||
val result = methodCaller(it)
|
val result = methodCaller(it)
|
||||||
result.changeResultsUnchecked(
|
result.changeResultsUnchecked(
|
||||||
result.results.mapNotNull { it to (get(it) ?: return@mapNotNull null) }
|
result.results.mapNotNull { it to (get(it) ?: return@mapNotNull null) }
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend inline fun <Key, Value, REPO : ReadKeyValueRepo<Key, Value>> REPO.getAll(
|
||||||
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
||||||
|
): List<Pair<Key, Value>> = getAll(maxPagePagination(), methodCaller)
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.pagination
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.toCoercedInt
|
||||||
|
import dev.inmo.micro_utils.pagination.FirstPagePagination
|
||||||
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
|
||||||
|
suspend inline fun ReadCRUDRepo<*, *>.maxPagePagination() = FirstPagePagination(count().toCoercedInt())
|
||||||
|
suspend inline fun ReadKeyValueRepo<*, *>.maxPagePagination() = FirstPagePagination(count().toCoercedInt())
|
||||||
|
suspend inline fun ReadKeyValuesRepo<*, *>.maxPagePagination() = FirstPagePagination(count().toCoercedInt())
|
@ -1,13 +1,15 @@
|
|||||||
package dev.inmo.micro_utils.repos.pagination
|
package dev.inmo.micro_utils.repos.pagination
|
||||||
|
|
||||||
|
import dev.inmo.micro_utils.common.toCoercedInt
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
import dev.inmo.micro_utils.pagination.utils.getAllWithNextPaging
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
|
||||||
suspend inline fun <Key, Value, REPO : ReadKeyValuesRepo<Key, Value>> REPO.getAll(
|
suspend inline fun <Key, Value, REPO : ReadKeyValuesRepo<Key, Value>> REPO.getAll(
|
||||||
|
pagination: Pagination,
|
||||||
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
||||||
): List<Pair<Key, List<Value>>> = getAllWithNextPaging {
|
): List<Pair<Key, List<Value>>> = getAllWithNextPaging(pagination) {
|
||||||
val keysResult = methodCaller(it)
|
val keysResult = methodCaller(it)
|
||||||
keysResult.changeResultsUnchecked(
|
keysResult.changeResultsUnchecked(
|
||||||
keysResult.results.map { k ->
|
keysResult.results.map { k ->
|
||||||
@ -15,3 +17,8 @@ suspend inline fun <Key, Value, REPO : ReadKeyValuesRepo<Key, Value>> REPO.getAl
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend inline fun <Key, Value, REPO : ReadKeyValuesRepo<Key, Value>> REPO.getAll(
|
||||||
|
@Suppress("REDUNDANT_INLINE_SUSPEND_FUNCTION_TYPE")
|
||||||
|
crossinline methodCaller: suspend REPO.(Pagination) -> PaginationResult<Key>
|
||||||
|
): List<Pair<Key, List<Value>>> = getAll(maxPagePagination(), methodCaller)
|
||||||
|
@ -12,6 +12,8 @@ open class ReadCRUDFromKeyValueRepo<RegisteredType, IdType>(
|
|||||||
|
|
||||||
override suspend fun count(): Long = original.count()
|
override suspend fun count(): Long = original.count()
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, RegisteredType> = original.getAll()
|
||||||
|
|
||||||
override suspend fun getByPagination(pagination: Pagination): PaginationResult<RegisteredType> = original.values(pagination)
|
override suspend fun getByPagination(pagination: Pagination): PaginationResult<RegisteredType> = original.values(pagination)
|
||||||
|
|
||||||
override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<IdType> = original.keys(pagination)
|
override suspend fun getIdsByPagination(pagination: Pagination): PaginationResult<IdType> = original.keys(pagination)
|
||||||
|
@ -11,6 +11,7 @@ import dev.inmo.micro_utils.pagination.utils.paginate
|
|||||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
||||||
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
import dev.inmo.micro_utils.repos.ReadKeyValuesRepo
|
||||||
|
import dev.inmo.micro_utils.repos.pagination.getAll
|
||||||
import dev.inmo.micro_utils.repos.transforms.kvs.ReadKeyValuesFromKeyValueRepo
|
import dev.inmo.micro_utils.repos.transforms.kvs.ReadKeyValuesFromKeyValueRepo
|
||||||
import kotlin.jvm.JvmInline
|
import kotlin.jvm.JvmInline
|
||||||
|
|
||||||
@ -40,6 +41,8 @@ value class ReadKeyValueFromCRUDRepo<Key, Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = original.getAll()
|
||||||
|
|
||||||
override suspend fun count(): Long = original.count()
|
override suspend fun count(): Long = original.count()
|
||||||
|
|
||||||
override suspend fun contains(key: Key): Boolean = original.contains(key)
|
override suspend fun contains(key: Key): Boolean = original.contains(key)
|
||||||
|
@ -41,6 +41,8 @@ open class ReadKeyValueFromKeyValuesRepo<Key, Value>(
|
|||||||
return original.contains(key)
|
return original.contains(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, List<Value>> = original.getAll()
|
||||||
|
|
||||||
override suspend fun keys(v: List<Value>, pagination: Pagination, reversed: Boolean): PaginationResult<Key> {
|
override suspend fun keys(v: List<Value>, pagination: Pagination, reversed: Boolean): PaginationResult<Key> {
|
||||||
val keys = mutableSetOf<Key>()
|
val keys = mutableSetOf<Key>()
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package dev.inmo.micro_utils.repos
|
package dev.inmo.micro_utils.repos
|
||||||
|
|
||||||
import dev.inmo.micro_utils.common.Warning
|
import dev.inmo.micro_utils.common.Warning
|
||||||
|
import dev.inmo.micro_utils.common.filename
|
||||||
import dev.inmo.micro_utils.pagination.*
|
import dev.inmo.micro_utils.pagination.*
|
||||||
import dev.inmo.micro_utils.pagination.utils.reverse
|
import dev.inmo.micro_utils.pagination.utils.reverse
|
||||||
import kotlinx.coroutines.*
|
import kotlinx.coroutines.*
|
||||||
@ -94,6 +95,8 @@ class FileReadKeyValueRepo(
|
|||||||
return File(folder, key).exists()
|
return File(folder, key).exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<String, File> = (folder.listFiles() ?.toList() ?: emptyList()).associateBy { it.filename.name }
|
||||||
|
|
||||||
override suspend fun count(): Long = folder.list() ?.size ?.toLong() ?: 0L
|
override suspend fun count(): Long = folder.list() ?.size ?.toLong() ?: 0L
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,6 +32,18 @@ abstract class AbstractAndroidCRUDRepo<ObjectType, IdType>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> = helper.readableTransaction {
|
||||||
|
select(
|
||||||
|
tableName,
|
||||||
|
null,
|
||||||
|
""
|
||||||
|
).use {
|
||||||
|
it.map {
|
||||||
|
it.toId() to it.toObject()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.toMap()
|
||||||
|
|
||||||
override suspend fun getById(id: IdType): ObjectType? = helper.readableTransaction {
|
override suspend fun getById(id: IdType): ObjectType? = helper.readableTransaction {
|
||||||
select(
|
select(
|
||||||
tableName,
|
tableName,
|
||||||
|
@ -104,6 +104,15 @@ class KeyValueStore<T : Any> internal constructor (
|
|||||||
|
|
||||||
override suspend fun contains(key: String): Boolean = sharedPreferences.contains(key)
|
override suspend fun contains(key: String): Boolean = sharedPreferences.contains(key)
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<String, T> {
|
||||||
|
val resultMap = mutableMapOf<String, T>()
|
||||||
|
for ((k, v) in sharedPreferences.all) {
|
||||||
|
@Suppress("UNCHECKED_CAST")
|
||||||
|
resultMap[k] = (v as? T) ?: continue
|
||||||
|
}
|
||||||
|
return resultMap.toMap()
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun count(): Long = sharedPreferences.all.size.toLong()
|
override suspend fun count(): Long = sharedPreferences.all.size.toLong()
|
||||||
|
|
||||||
override suspend fun set(toSet: Map<String, T>) {
|
override suspend fun set(toSet: Map<String, T>) {
|
||||||
|
@ -45,5 +45,9 @@ abstract class AbstractExposedReadCRUDRepo<ObjectType, IdType>(
|
|||||||
select { selectById(id) }.limit(1).any()
|
select { selectById(id) }.limit(1).any()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> = transaction(database) {
|
||||||
|
selectAll().associate { it.asId to it.asObject }
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun count(): Long = transaction(db = database) { selectAll().count() }
|
override suspend fun count(): Long = transaction(db = database) { selectAll().count() }
|
||||||
}
|
}
|
||||||
|
@ -5,7 +5,6 @@ import dev.inmo.micro_utils.repos.ReadKeyValueRepo
|
|||||||
import dev.inmo.micro_utils.repos.exposed.*
|
import dev.inmo.micro_utils.repos.exposed.*
|
||||||
import dev.inmo.micro_utils.repos.exposed.utils.selectPaginated
|
import dev.inmo.micro_utils.repos.exposed.utils.selectPaginated
|
||||||
import org.jetbrains.exposed.sql.*
|
import org.jetbrains.exposed.sql.*
|
||||||
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
|
|
||||||
import org.jetbrains.exposed.sql.transactions.transaction
|
import org.jetbrains.exposed.sql.transactions.transaction
|
||||||
|
|
||||||
abstract class AbstractExposedReadKeyValueRepo<Key, Value>(
|
abstract class AbstractExposedReadKeyValueRepo<Key, Value>(
|
||||||
@ -32,6 +31,8 @@ abstract class AbstractExposedReadKeyValueRepo<Key, Value>(
|
|||||||
select { selectById(key) }.limit(1).any()
|
select { selectById(key) }.limit(1).any()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = transaction(database) { selectAll().associate { it.asKey to it.asObject } }
|
||||||
|
|
||||||
override suspend fun count(): Long = transaction(database) { selectAll().count() }
|
override suspend fun count(): Long = transaction(database) { selectAll().count() }
|
||||||
|
|
||||||
override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult<Key> = transaction(database) {
|
override suspend fun keys(pagination: Pagination, reversed: Boolean): PaginationResult<Key> = transaction(database) {
|
||||||
|
@ -26,6 +26,8 @@ class ReadMapCRUDRepo<ObjectType, IdType>(
|
|||||||
|
|
||||||
override suspend fun contains(id: IdType): Boolean = map.containsKey(id)
|
override suspend fun contains(id: IdType): Boolean = map.containsKey(id)
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> = map.toMap()
|
||||||
|
|
||||||
override suspend fun count(): Long = map.size.toLong()
|
override suspend fun count(): Long = map.size.toLong()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ class ReadMapKeyValueRepo<Key, Value>(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = map.toMap()
|
||||||
|
|
||||||
override suspend fun contains(key: Key): Boolean = map.containsKey(key)
|
override suspend fun contains(key: Key): Boolean = map.containsKey(key)
|
||||||
|
|
||||||
override suspend fun count(): Long = map.size.toLong()
|
override suspend fun count(): Long = map.size.toLong()
|
||||||
|
@ -44,6 +44,7 @@ class KtorCRUDRepoClient<ObjectType, IdType, InputValue> (
|
|||||||
typeInfo<PaginationResult<ObjectType>>(),
|
typeInfo<PaginationResult<ObjectType>>(),
|
||||||
typeInfo<PaginationResult<IdType>>(),
|
typeInfo<PaginationResult<IdType>>(),
|
||||||
contentType,
|
contentType,
|
||||||
|
typeInfo<Map<IdType, ObjectType>>(),
|
||||||
idSerializer
|
idSerializer
|
||||||
),
|
),
|
||||||
KtorWriteCrudRepoClient<ObjectType, IdType, InputValue>(
|
KtorWriteCrudRepoClient<ObjectType, IdType, InputValue>(
|
||||||
|
@ -5,6 +5,7 @@ import dev.inmo.micro_utils.pagination.*
|
|||||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.countRouting
|
import dev.inmo.micro_utils.repos.ktor.common.countRouting
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
||||||
|
import dev.inmo.micro_utils.repos.ktor.common.getAllRoute
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.idParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.idParameterName
|
||||||
import io.ktor.client.HttpClient
|
import io.ktor.client.HttpClient
|
||||||
import io.ktor.client.call.body
|
import io.ktor.client.call.body
|
||||||
@ -21,6 +22,7 @@ class KtorReadCRUDRepoClient<ObjectType, IdType> (
|
|||||||
private val paginationObjectType: TypeInfo,
|
private val paginationObjectType: TypeInfo,
|
||||||
private val paginationIdType: TypeInfo,
|
private val paginationIdType: TypeInfo,
|
||||||
private val contentType: ContentType,
|
private val contentType: ContentType,
|
||||||
|
private val mapTypeInfo: TypeInfo,
|
||||||
private val idSerializer: suspend (IdType) -> String
|
private val idSerializer: suspend (IdType) -> String
|
||||||
) : ReadCRUDRepo<ObjectType, IdType> {
|
) : ReadCRUDRepo<ObjectType, IdType> {
|
||||||
override suspend fun getByPagination(pagination: Pagination): PaginationResult<ObjectType> = httpClient.get(
|
override suspend fun getByPagination(pagination: Pagination): PaginationResult<ObjectType> = httpClient.get(
|
||||||
@ -58,6 +60,15 @@ class KtorReadCRUDRepoClient<ObjectType, IdType> (
|
|||||||
contentType(contentType)
|
contentType(contentType)
|
||||||
}.body()
|
}.body()
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<IdType, ObjectType> = httpClient.get(
|
||||||
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
getAllRoute
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
contentType(contentType)
|
||||||
|
}.body(mapTypeInfo)
|
||||||
|
|
||||||
override suspend fun count(): Long = httpClient.get(
|
override suspend fun count(): Long = httpClient.get(
|
||||||
buildStandardUrl(
|
buildStandardUrl(
|
||||||
baseUrl,
|
baseUrl,
|
||||||
@ -80,6 +91,7 @@ inline fun <reified ObjectType, IdType> KtorReadCRUDRepoClient(
|
|||||||
typeInfo<PaginationResult<ObjectType>>(),
|
typeInfo<PaginationResult<ObjectType>>(),
|
||||||
typeInfo<PaginationResult<IdType>>(),
|
typeInfo<PaginationResult<IdType>>(),
|
||||||
contentType,
|
contentType,
|
||||||
|
typeInfo<Map<IdType, ObjectType>>(),
|
||||||
idSerializer
|
idSerializer
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,6 +23,7 @@ class KtorReadKeyValueRepoClient<Key, Value>(
|
|||||||
private val objectType: TypeInfo,
|
private val objectType: TypeInfo,
|
||||||
private val paginationResultObjectsTypeInfo: TypeInfo,
|
private val paginationResultObjectsTypeInfo: TypeInfo,
|
||||||
private val paginationResultIdsTypeInfo: TypeInfo,
|
private val paginationResultIdsTypeInfo: TypeInfo,
|
||||||
|
private val mapKeyValueTypeInfo: TypeInfo,
|
||||||
private val idSerializer: suspend (Key) -> String,
|
private val idSerializer: suspend (Key) -> String,
|
||||||
private val valueSerializer: suspend (Value) -> String
|
private val valueSerializer: suspend (Value) -> String
|
||||||
) : ReadKeyValueRepo<Key, Value> {
|
) : ReadKeyValueRepo<Key, Value> {
|
||||||
@ -48,6 +49,15 @@ class KtorReadKeyValueRepoClient<Key, Value>(
|
|||||||
contentType(contentType)
|
contentType(contentType)
|
||||||
}.body()
|
}.body()
|
||||||
|
|
||||||
|
override suspend fun getAll(): Map<Key, Value> = httpClient.get(
|
||||||
|
buildStandardUrl(
|
||||||
|
baseUrl,
|
||||||
|
getAllRoute
|
||||||
|
)
|
||||||
|
) {
|
||||||
|
contentType(contentType)
|
||||||
|
}.body(mapKeyValueTypeInfo)
|
||||||
|
|
||||||
override suspend fun values(
|
override suspend fun values(
|
||||||
pagination: Pagination,
|
pagination: Pagination,
|
||||||
reversed: Boolean
|
reversed: Boolean
|
||||||
@ -103,6 +113,7 @@ inline fun <reified Key, reified Value> KtorReadKeyValueRepoClient(
|
|||||||
typeInfo<Value>(),
|
typeInfo<Value>(),
|
||||||
typeInfo<PaginationResult<Value>>(),
|
typeInfo<PaginationResult<Value>>(),
|
||||||
typeInfo<PaginationResult<Key>>(),
|
typeInfo<PaginationResult<Key>>(),
|
||||||
|
typeInfo<Map<Key, Value>>(),
|
||||||
idSerializer,
|
idSerializer,
|
||||||
valueSerializer
|
valueSerializer
|
||||||
)
|
)
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
package dev.inmo.micro_utils.repos.ktor.common
|
||||||
|
|
||||||
|
const val getAllRoute = "getAll"
|
@ -83,6 +83,9 @@ class CRUDTests {
|
|||||||
assertEquals(map.size, 0)
|
assertEquals(map.size, 0)
|
||||||
assertEquals(map.size.toLong(), crudClient.count())
|
assertEquals(map.size.toLong(), crudClient.count())
|
||||||
assertEquals(0, crudClient.count())
|
assertEquals(0, crudClient.count())
|
||||||
|
|
||||||
|
assertEquals(map, crudClient.getAll())
|
||||||
|
|
||||||
server.stop()
|
server.stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -133,6 +133,8 @@ class KVTests {
|
|||||||
crudClient.count()
|
crudClient.count()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
assertEquals(map, crudClient.getAll())
|
||||||
|
|
||||||
server.stop()
|
server.stop()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@ import dev.inmo.micro_utils.pagination.extractPagination
|
|||||||
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
import dev.inmo.micro_utils.repos.ReadCRUDRepo
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.countRouting
|
import dev.inmo.micro_utils.repos.ktor.common.countRouting
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
import dev.inmo.micro_utils.repos.ktor.common.crud.*
|
||||||
|
import dev.inmo.micro_utils.repos.ktor.common.getAllRoute
|
||||||
import dev.inmo.micro_utils.repos.ktor.common.idParameterName
|
import dev.inmo.micro_utils.repos.ktor.common.idParameterName
|
||||||
import io.ktor.http.HttpStatusCode
|
import io.ktor.http.HttpStatusCode
|
||||||
import io.ktor.server.application.call
|
import io.ktor.server.application.call
|
||||||
@ -53,6 +54,10 @@ inline fun <reified ObjectType, reified IdType> Route.configureReadCRUDRepoRoute
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get(getAllRoute) {
|
||||||
|
call.respond(originalRepo.getAll())
|
||||||
|
}
|
||||||
|
|
||||||
get(countRouting) {
|
get(countRouting) {
|
||||||
call.respond(
|
call.respond(
|
||||||
originalRepo.count()
|
originalRepo.count()
|
||||||
|
@ -70,6 +70,10 @@ inline fun <reified Key, reified Value> Route.configureReadKeyValueRepoRoutes (
|
|||||||
call.respond(originalRepo.contains(key))
|
call.respond(originalRepo.contains(key))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
get(getAllRoute) {
|
||||||
|
call.respond(originalRepo.getAll())
|
||||||
|
}
|
||||||
|
|
||||||
get(countRoute) {
|
get(countRoute) {
|
||||||
call.respond(originalRepo.count())
|
call.respond(originalRepo.count())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user