From 5a9cabc4bd87ca9579c5f8b853ec8bc7bc3d8155 Mon Sep 17 00:00:00 2001 From: InsanusMokrassar Date: Sat, 14 Nov 2020 17:27:26 +0600 Subject: [PATCH] add ReadStandardKeyValueRepo#keys with value parameter --- CHANGELOG.md | 2 ++ .../micro_utils/repos/StandartKeyValueRepo.kt | 1 + .../repos/mappers/KeyValueMappers.kt | 17 +++++++++++++++++ .../micro_utils/repos/keyvalue/KeyValueStore.kt | 14 ++++++++++++++ .../exposed/keyvalue/ExposedReadKeyValueRepo.kt | 10 ++++++++++ .../inmo/micro_utils/repos/MapKeyValueRepo.kt | 12 ++++++++++++ .../key_value/KtorReadStandardKeyValueRepo.kt | 13 +++++++++++++ .../KtorReadOneToManyKeyValueRepo.kt | 3 +++ .../repos/ktor/common/ParametersNames.kt | 5 +++++ .../one_to_many/OneToManyParametersNames.kt | 9 ++++++--- .../key_value/KtorStandartReadKeyValueRepo.kt | 7 ++++--- .../ConfigureOneToManyReadKeyValueRepoRoutes.kt | 13 ++++++------- 12 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/ParametersNames.kt diff --git a/CHANGELOG.md b/CHANGELOG.md index 07d8f37bbcb..a924ecc06ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,8 @@ * `Repos`: * `ReadOneToManyKeyValueRepo` got `keys` method with value parameter * All implementations inside of this library has been updated + * `ReadStandardKeyValueRepo` got `keys` method with value parameter + * All implementations inside of this library has been updated ## 0.3.3 diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt index d5f632739f9..e66ee7bd2f3 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/StandartKeyValueRepo.kt @@ -8,6 +8,7 @@ interface ReadStandardKeyValueRepo : Repo { suspend fun get(k: Key): Value? suspend fun values(pagination: Pagination, reversed: Boolean = false): PaginationResult suspend fun keys(pagination: Pagination, reversed: Boolean = false): PaginationResult + suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean = false): PaginationResult suspend fun contains(key: Key): Boolean suspend fun count(): Long } diff --git a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt index 6a770683a4d..f8c935bf659 100644 --- a/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt +++ b/repos/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/mappers/KeyValueMappers.kt @@ -44,6 +44,23 @@ open class MapperReadStandardKeyValueRepo( ) } + override suspend fun keys( + v: FromValue, + pagination: Pagination, + reversed: Boolean + ): PaginationResult = to.keys( + v.toOutValue(), + pagination, + reversed + ).let { + PaginationResult( + it.page, + it.pagesNumber, + it.results.map { it.toInnerKey() }, + it.size + ) + } + override suspend fun contains(key: FromKey): Boolean = to.contains( key.toOutKey() ) diff --git a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt index bcf16a4f7a6..cce02f6c0d0 100644 --- a/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt +++ b/repos/common/src/main/kotlin/dev/inmo/micro_utils/repos/keyvalue/KeyValueStore.kt @@ -96,6 +96,20 @@ class KeyValueStore internal constructor ( } } + override suspend fun keys(v: T, pagination: Pagination, reversed: Boolean): PaginationResult { + val resultPagination = if (reversed) pagination.reverse(count()) else pagination + return sharedPreferences.all.mapNotNull { (k, value) -> if (value == v) k else null }.paginate( + resultPagination + ).let { + PaginationResult( + it.page, + it.pagesNumber, + it.results.let { if (reversed) it.reversed() else it }, + it.size + ) + } + } + override suspend fun contains(key: String): Boolean = sharedPreferences.contains(key) override suspend fun count(): Long = sharedPreferences.all.size.toLong() diff --git a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt index 2137a329a02..cec2b7b0b45 100644 --- a/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt +++ b/repos/exposed/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/exposed/keyvalue/ExposedReadKeyValueRepo.kt @@ -33,6 +33,16 @@ open class ExposedReadKeyValueRepo( } }.createPaginationResult(pagination, count()) + override suspend fun keys(value: Value, pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { + select { valueColumn.eq(value) }.let { + it.count() to it.paginate(pagination, keyColumn to if (reversed) SortOrder.DESC else SortOrder.ASC).map { + it[keyColumn] + } + } + }.let { (count, list) -> + list.createPaginationResult(pagination, count) + } + override suspend fun values(pagination: Pagination, reversed: Boolean): PaginationResult = transaction(database) { selectAll().paginate(pagination, keyColumn to if (reversed) SortOrder.DESC else SortOrder.ASC).map { it[valueColumn] diff --git a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt index 6b6fbfb77f5..6269c29678a 100644 --- a/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt +++ b/repos/inmemory/src/commonMain/kotlin/dev/inmo/micro_utils/repos/MapKeyValueRepo.kt @@ -39,6 +39,18 @@ class ReadMapKeyValueRepo( } } + override suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean): PaginationResult { + val keys: List = map.mapNotNull { (k, value) -> if (v == value) k else null } + val actualPagination = if (reversed) pagination.reverse(keys.size) else pagination + return keys.paginate(actualPagination).let { + if (reversed) { + it.copy(results = it.results.reversed()) + } else { + it + } + } + } + override suspend fun contains(key: Key): Boolean = map.containsKey(key) override suspend fun count(): Long = map.size.toLong() diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt index 4ad73bf32b4..cf55b6b1740 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/key_value/KtorReadStandardKeyValueRepo.kt @@ -6,6 +6,7 @@ import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* +import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import io.ktor.client.HttpClient import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer @@ -50,6 +51,18 @@ class KtorReadStandardKeyValueRepo ( PaginationResult.serializer(keySerializer) ) + override suspend fun keys(v: Value, pagination: Pagination, reversed: Boolean): PaginationResult = client.uniget( + buildStandardUrl( + baseUrl, + keysRoute, + mapOf( + valueParameterName to valueSerializer.encodeUrlQueryValue(v), + reversedParameterName to Boolean.serializer().encodeUrlQueryValue(reversed) + ) + pagination.asUrlQueryParts + ), + PaginationResult.serializer(keySerializer) + ) + override suspend fun contains(key: Key): Boolean = client.uniget( buildStandardUrl( baseUrl, diff --git a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt index fe96655361f..ced11c17618 100644 --- a/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt +++ b/repos/ktor/client/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/client/one_to_many/KtorReadOneToManyKeyValueRepo.kt @@ -5,7 +5,10 @@ import dev.inmo.micro_utils.ktor.client.uniget import dev.inmo.micro_utils.ktor.common.buildStandardUrl import dev.inmo.micro_utils.pagination.* import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo +import dev.inmo.micro_utils.repos.ktor.common.keyParameterName import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* +import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName +import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import io.ktor.client.HttpClient import kotlinx.serialization.KSerializer import kotlinx.serialization.builtins.serializer diff --git a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/ParametersNames.kt b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/ParametersNames.kt new file mode 100644 index 00000000000..85bece83603 --- /dev/null +++ b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/ParametersNames.kt @@ -0,0 +1,5 @@ +package dev.inmo.micro_utils.repos.ktor.common + +const val keyParameterName = "key" +const val valueParameterName = "value" +const val reversedParameterName = "reversed" \ No newline at end of file diff --git a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyParametersNames.kt b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyParametersNames.kt index c8f8b2ea7eb..2e8d9b29cc3 100644 --- a/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyParametersNames.kt +++ b/repos/ktor/common/src/commonMain/kotlin/dev/inmo/micro_utils/repos/ktor/common/one_to_many/OneToManyParametersNames.kt @@ -1,5 +1,8 @@ package dev.inmo.micro_utils.repos.ktor.common.one_to_many -const val keyParameterName = "key" -const val valueParameterName = "value" -const val reversedParameterName = "reversed" \ No newline at end of file +@Deprecated("Replaced", ReplaceWith("keyParameterName", "dev.inmo.micro_utils.repos.ktor.common.keyParameterName")) +const val keyParameterName = dev.inmo.micro_utils.repos.ktor.common.keyParameterName +@Deprecated("Replaced", ReplaceWith("valueParameterName", "dev.inmo.micro_utils.repos.ktor.common.valueParameterName")) +const val valueParameterName = dev.inmo.micro_utils.repos.ktor.common.valueParameterName +@Deprecated("Replaced", ReplaceWith("reversedParameterName", "dev.inmo.micro_utils.repos.ktor.common.reversedParameterName")) +const val reversedParameterName = dev.inmo.micro_utils.repos.ktor.common.reversedParameterName \ No newline at end of file diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt index 38281bbb534..92990226f65 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/key_value/KtorStandartReadKeyValueRepo.kt @@ -1,11 +1,11 @@ package dev.inmo.micro_utils.repos.ktor.server.key_value -import dev.inmo.micro_utils.ktor.server.decodeUrlQueryValueOrSendError -import dev.inmo.micro_utils.ktor.server.unianswer +import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.pagination.extractPagination import dev.inmo.micro_utils.repos.ReadStandardKeyValueRepo import dev.inmo.micro_utils.repos.ktor.common.key_value.* +import dev.inmo.micro_utils.repos.ktor.common.valueParameterName import io.ktor.application.call import io.ktor.routing.Route import io.ktor.routing.get @@ -49,10 +49,11 @@ fun Route.configureReadStandartKeyValueRepoRoutes ( reversedParameterName, Boolean.serializer() ) ?: return@get + val value = call.decodeUrlQueryValue(valueParameterName, valueSerializer) call.unianswer( PaginationResult.serializer(keySerializer), - originalRepo.keys(parination, reversed) + value ?.let { originalRepo.keys(value, parination, reversed) } ?: originalRepo.keys(parination, reversed) ) } diff --git a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt index fb872845dc7..0cbcf2a5691 100644 --- a/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt +++ b/repos/ktor/server/src/jvmMain/kotlin/dev/inmo/micro_utils/repos/ktor/server/one_to_many/ConfigureOneToManyReadKeyValueRepoRoutes.kt @@ -4,7 +4,11 @@ import dev.inmo.micro_utils.ktor.server.* import dev.inmo.micro_utils.pagination.PaginationResult import dev.inmo.micro_utils.pagination.extractPagination import dev.inmo.micro_utils.repos.ReadOneToManyKeyValueRepo +import dev.inmo.micro_utils.repos.ktor.common.* +import dev.inmo.micro_utils.repos.ktor.common.keyParameterName import dev.inmo.micro_utils.repos.ktor.common.one_to_many.* +import dev.inmo.micro_utils.repos.ktor.common.valueParameterName +import dev.inmo.micro_utils.repos.ktor.common.reversedParameterName import io.ktor.application.call import io.ktor.routing.Route import io.ktor.routing.get @@ -47,14 +51,9 @@ fun Route.configureOneToManyReadKeyValueRepoRoutes( valueSealizer ) - value ?.also { - call.unianswer( - paginationKeyResult, - originalRepo.keys(value, pagination, reversed) - ) - } ?: call.unianswer( + call.unianswer( paginationKeyResult, - originalRepo.keys(pagination, reversed) + value ?.let { originalRepo.keys(value, pagination, reversed) } ?: originalRepo.keys(pagination, reversed) ) }