From ce24e83c469ebce32a97422454137cb6ebae8fb9 Mon Sep 17 00:00:00 2001 From: Sergey Prytkov Date: Mon, 15 Jan 2024 12:19:35 +0000 Subject: [PATCH] EVA-PIMP provide jooq context for too many rows exception --- buildSrc/src/main/kotlin/CI.kt | 2 +- .../eva/repository/JooqBaseModelRepository.kt | 31 ++++++++++--------- .../razz/eva/repository/JooqQueryException.kt | 11 +++++++ 3 files changed, 29 insertions(+), 15 deletions(-) create mode 100644 eva-repository/src/main/kotlin/com/razz/eva/repository/JooqQueryException.kt diff --git a/buildSrc/src/main/kotlin/CI.kt b/buildSrc/src/main/kotlin/CI.kt index 9c06250..be74ea8 100644 --- a/buildSrc/src/main/kotlin/CI.kt +++ b/buildSrc/src/main/kotlin/CI.kt @@ -3,7 +3,7 @@ import java.lang.Boolean.parseBoolean object Ci { private const val SNAPSHOT_BASE = "0.6.0" - private const val RELEASE_VERSION = "0.5.4" + private const val RELEASE_VERSION = "0.5.5" private val githubSha = System.getenv("GITHUB_SHA") ?: "latest" val publishRelease = System.getProperty("release", "true").let(::parseBoolean) diff --git a/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqBaseModelRepository.kt b/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqBaseModelRepository.kt index a4e03c4..3c8ca6d 100644 --- a/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqBaseModelRepository.kt +++ b/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqBaseModelRepository.kt @@ -171,7 +171,9 @@ abstract class JooqBaseModelRepository( jooqQuery = updateQuery, table = table ) - }.getSingle(this::fromRecord) { throw IllegalStateException("Too many rows updated") }.second + }.getSingleOrNull(this::fromRecord) { + JooqQueryException(updateQuery, it, "Too many rows updated") + } @Suppress("UNCHECKED_CAST") when (updated) { @@ -270,7 +272,7 @@ abstract class JooqBaseModelRepository( } private suspend fun exists(select: Select): Boolean { - return oneRecord(dslContext.selectOne().whereExists(select)) != null + return atMostOneRecord(dslContext.selectOne().whereExists(select)) != null } protected suspend fun findOneWhere(condition: Condition): M? { @@ -280,7 +282,7 @@ abstract class JooqBaseModelRepository( } private suspend fun findOne(select: Select): M? { - return oneRecord(select)?.let { fromRecord(it) } + return atMostOneRecord(select)?.let { fromRecord(it) } } protected suspend fun findLast( @@ -343,11 +345,11 @@ abstract class JooqBaseModelRepository( } protected suspend fun count(condition: Condition): Long { - return oneRecord(dslContext.select(LONG_COUNT).from(table).where(condition))?.value1() ?: 0 + return atMostOneRecord(dslContext.select(LONG_COUNT).from(table).where(condition))?.value1() ?: 0 } protected suspend fun countGrouped(condition: Condition, groupFields: Set>): Long { - return oneRecord( + return atMostOneRecord( dslContext .select(LONG_COUNT) .from( @@ -359,10 +361,11 @@ abstract class JooqBaseModelRepository( )?.value1() ?: 0 } - protected suspend fun oneRecord(select: Select): R? { + protected suspend fun atMostOneRecord(select: Select): R? { return allRecords(select) - .getSingle({ it }) { throw IllegalStateException("Found more than one record") } - .second + .getSingleOrNull({ it }) { + JooqQueryException(select, it, "Found more than one record") + } } protected suspend fun allRecords(select: Select): List { @@ -373,12 +376,12 @@ abstract class JooqBaseModelRepository( ) } - private fun List.getSingle(mapper: (T) -> K, ex: () -> Exception): Pair { - return this.fold(Pair(0, null)) { (i, _), v -> - when (i) { - 0 -> i.inc() to mapper(v) - else -> throw ex() - } + @Throws(JooqQueryException::class) + private fun List.getSingleOrNull(mapper: (T) -> K, ex: (List) -> JooqQueryException): K? { + return when (size) { + 0 -> null + 1 -> mapper(first()) + else -> throw ex(this) } } diff --git a/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqQueryException.kt b/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqQueryException.kt new file mode 100644 index 0000000..9926ecf --- /dev/null +++ b/eva-repository/src/main/kotlin/com/razz/eva/repository/JooqQueryException.kt @@ -0,0 +1,11 @@ +package com.razz.eva.repository + +import org.jooq.Query +import org.jooq.Record +import java.lang.IllegalStateException + +class JooqQueryException( + val query: Query, + val records: List, + message: String, +) : IllegalStateException(message)