diff --git a/gradle.properties b/gradle.properties index 0176daf6..8e402073 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,3 +7,5 @@ klockVersion=1.10.3 uuidVersion=0.1.0 gradle_bintray_plugin_version=1.8.4 + +core_version=0.3.0 diff --git a/postssystem.core/build.gradle b/postssystem.core/build.gradle index c88caab3..18a32160 100644 --- a/postssystem.core/build.gradle +++ b/postssystem.core/build.gradle @@ -17,7 +17,7 @@ plugins { id "org.jetbrains.kotlin.plugin.serialization" version "$kotlin_version" } -project.version = "0.2.0" +project.version = "$core_version" project.group = "com.insanusmokrassar" apply from: "publish.gradle" diff --git a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt index c904b3ce..11a3401d 100644 --- a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt +++ b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/Pagination.kt @@ -36,6 +36,12 @@ val Pagination.firstIndex: Int val Pagination.lastIndex: Int get() = firstIndex + size - 1 +/** + * Calculates pages count for given [datasetSize] + */ +fun calculatePagesNumber(datasetSize: Long, pageSize: Int): Int { + return ceil(datasetSize.toDouble() / pageSize).toInt() +} /** * Calculates pages count for given [datasetSize] */ diff --git a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/PaginationResult.kt b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/PaginationResult.kt index 3386e629..846bf83e 100644 --- a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/PaginationResult.kt +++ b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/PaginationResult.kt @@ -10,12 +10,12 @@ data class PaginationResult( override val size: Int ) : Pagination -fun Pagination.createResult( - commonObjectsNumber: Int, - results: List +fun List.createPaginationResult( + pagination: Pagination, + commonObjectsNumber: Long ) = PaginationResult( - page, - calculatePagesNumber(commonObjectsNumber), - results, + pagination.page, + calculatePagesNumber(commonObjectsNumber, size), + this, size ) diff --git a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/SimplePagination.kt b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/SimplePagination.kt index cb649b92..e90f5612 100644 --- a/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/SimplePagination.kt +++ b/postssystem.core/src/commonMain/kotlin/com/insanusmokrassar/postssystem/core/utils/pagination/SimplePagination.kt @@ -7,11 +7,18 @@ const val defaultMediumPageSize = 5 const val defaultLargePageSize = 10 const val defaultExtraLargePageSize = 15 +@Suppress("NOTHING_TO_INLINE", "FunctionName") inline fun FirstPagePagination(size: Int = defaultMediumPageSize) = SimplePagination( page = 0, size = defaultMediumPageSize ) +@Suppress("NOTHING_TO_INLINE") +inline fun Pagination.nextPage() = SimplePagination( + page + 1, + size +) + @Serializable data class SimplePagination( override val page: Int, diff --git a/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryContentAPI.kt b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryContentAPI.kt index 235808da..9b135e41 100644 --- a/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryContentAPI.kt +++ b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryContentAPI.kt @@ -42,9 +42,9 @@ class InMemoryContentAPI( override suspend fun getContentById(id: ContentId): RegisteredContent? = contents[id] override suspend fun getContentByPagination(pagination: Pagination): PaginationResult { - return pagination.createResult( - commonObjectsNumber = contents.size, - results = contents.values.asSequence().drop(pagination.firstIndex).take(pagination.size).toList() + return contents.values.asSequence().drop(pagination.firstIndex).take(pagination.size).toList().createPaginationResult( + pagination, + commonObjectsNumber = contents.size.toLong() ) } diff --git a/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt index 9e9408de..4d8615f6 100644 --- a/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt +++ b/postssystem.core/src/commonTest/kotlin/com/insanusmokrassar/postssystem/core/api/InMemoryPostsAPI.kt @@ -76,11 +76,11 @@ class InMemoryPostsAPI( override suspend fun getPostsByPagination( pagination: Pagination - ): PaginationResult = pagination.createResult( - commonObjectsNumber = posts.size, - results = sortedByDatePosts.subList( - pagination.firstIndex, - pagination.lastIndex - ) + ): PaginationResult = sortedByDatePosts.subList( + pagination.firstIndex, + pagination.lastIndex + ).createPaginationResult( + pagination, + commonObjectsNumber = posts.size.toLong() ) } diff --git a/postssystem.exposed/build.gradle b/postssystem.exposed/build.gradle index 8dd38b67..211815eb 100644 --- a/postssystem.exposed/build.gradle +++ b/postssystem.exposed/build.gradle @@ -1,4 +1,4 @@ -project.version = "0.2.0" +project.version = "$core_version" project.group = "com.insanusmokrassar" buildscript { @@ -30,10 +30,16 @@ repositories { dependencies { implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" - api "com.insanusmokrassar:postssystem.core:$core_version" api "org.jetbrains.exposed:exposed-core:$exposed_version" api "com.soywiz.korlibs.klock:klock:$klockVersion" + if ((project.hasProperty('RELEASE_MODE') && project.property('RELEASE_MODE') == "true") || System.getenv('RELEASE_MODE') == "true") { + api "com.insanusmokrassar:postssystem.core:$core_version" + } else { + implementation project(":postssystem.core") + } + + testImplementation "org.xerial:sqlite-jdbc:$test_sqlite_version" testImplementation "org.junit.jupiter:junit-jupiter-api:$test_junit_version" } diff --git a/postssystem.exposed/gradle.properties b/postssystem.exposed/gradle.properties index 896e963d..4eb6426b 100644 --- a/postssystem.exposed/gradle.properties +++ b/postssystem.exposed/gradle.properties @@ -1,5 +1,3 @@ -exposed_version=0.20.3 +exposed_version=0.23.1 test_sqlite_version=3.30.1 test_junit_version=5.5.2 - -core_version=0.2.0 diff --git a/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedContentAPI.kt b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedContentAPI.kt index 5407213c..e3f5044d 100644 --- a/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedContentAPI.kt +++ b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedContentAPI.kt @@ -32,7 +32,7 @@ private class ContentAPIDatabaseTable( return transaction(database) { insert { it[idColumn] = generateContentId() - it[dataColumn] = Json.plain.stringify(Content.serializer(), content) + it[dataColumn] = Json.stringify(Content.serializer(), content) }.getOrNull(idColumn) ?.let { id -> RegisteredContent( id, @@ -58,7 +58,7 @@ private class ContentAPIDatabaseTable( private fun ResultRow.asRegisteredContent(): RegisteredContent = RegisteredContent( get(idColumn), - Json.plain.parse(Content.serializer(), get(dataColumn)) + Json.parse(Content.serializer(), get(dataColumn)) ) override suspend fun getContentsIds(): Set { @@ -73,9 +73,12 @@ private class ContentAPIDatabaseTable( } override suspend fun getContentByPagination(pagination: Pagination): PaginationResult { return transaction(database) { - selectAll().count() to selectAll().limit(n = pagination.size, offset = pagination.firstIndex).map { it.asRegisteredContent() } + selectAll().count() to selectAll().paginate(pagination).map { it.asRegisteredContent() } }.let { (count, results) -> - pagination.createResult(count, results) + results.createPaginationResult( + pagination, + count + ) } } } diff --git a/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPI.kt b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPI.kt index 1d769cd8..29931928 100644 --- a/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPI.kt +++ b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/ExposedPostsAPI.kt @@ -160,11 +160,11 @@ private class PostsAPIDatabaseTable( override suspend fun getPostsByPagination(pagination: Pagination): PaginationResult { return transaction(database) { - val posts = selectAll().limit(pagination.size, pagination.firstIndex).orderBy(creationDateColumn).map { + val posts = selectAll().paginate(pagination).orderBy(creationDateColumn).map { it.toRegisteredPost() } val postsNumber = selectAll().count() - pagination.createResult(postsNumber, posts) + posts.createPaginationResult(pagination, postsNumber) } } diff --git a/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/QueryExtensions.kt b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/QueryExtensions.kt new file mode 100644 index 00000000..dfc320c7 --- /dev/null +++ b/postssystem.exposed/src/main/kotlin/com/insanusmokrassar/postssystem/core/exposed/QueryExtensions.kt @@ -0,0 +1,7 @@ +package com.insanusmokrassar.postssystem.core.exposed + +import com.insanusmokrassar.postssystem.core.utils.pagination.Pagination +import com.insanusmokrassar.postssystem.core.utils.pagination.firstIndex +import org.jetbrains.exposed.sql.Query + +fun Query.paginate(pagination: Pagination) = limit(pagination.size, pagination.firstIndex.toLong())