From 544c8731416276cc97125851e503008be3ea8769 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Wed, 3 Jun 2020 21:34:59 +0800 Subject: [PATCH] fix(api): incorrect number of books returned when books have authors set in metadata, the query would return an incorrect number of books closes #177 --- .../komga/infrastructure/jooq/BookDtoDao.kt | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt index 44000ed0..995c59f2 100644 --- a/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt +++ b/komga/src/main/kotlin/org/gotson/komga/infrastructure/jooq/BookDtoDao.kt @@ -8,7 +8,6 @@ import org.gotson.komga.interfaces.rest.dto.MediaDto import org.gotson.komga.interfaces.rest.dto.ReadProgressDto import org.gotson.komga.interfaces.rest.persistence.BookDtoRepository import org.gotson.komga.jooq.Tables -import org.gotson.komga.jooq.tables.records.BookMetadataAuthorRecord import org.gotson.komga.jooq.tables.records.BookMetadataRecord import org.gotson.komga.jooq.tables.records.BookRecord import org.gotson.komga.jooq.tables.records.MediaRecord @@ -109,24 +108,28 @@ class BookDtoDao( *b.fields(), *mediaFields, *d.fields(), - *a.fields(), *r.fields() ).from(b) .leftJoin(m).on(b.ID.eq(m.BOOK_ID)) .leftJoin(d).on(b.ID.eq(d.BOOK_ID)) - .leftJoin(a).on(d.BOOK_ID.eq(a.BOOK_ID)) .leftJoin(r).on(b.ID.eq(r.BOOK_ID)) private fun ResultQuery.fetchAndMap() = - fetchGroups( - { it.into(*b.fields(), *mediaFields, *d.fields(), *r.fields()) }, { it.into(a) } - ).map { (rec, ar) -> - val br = rec.into(b) - val mr = rec.into(m) - val dr = rec.into(d) - val rr = rec.into(r) - br.toDto(mr.toDto(), dr.toDto(ar), if (rr.userId != null) rr.toDto() else null) - } + fetch() + .map { rec -> + val br = rec.into(b) + val mr = rec.into(m) + val dr = rec.into(d) + val rr = rec.into(r) + + val authors = dsl.selectFrom(a) + .where(a.BOOK_ID.eq(br.id)) + .fetchInto(a) + .filter { it.name != null } + .map { AuthorDto(it.name, it.role) } + + br.toDto(mr.toDto(), dr.toDto(authors), if (rr.userId != null) rr.toDto() else null) + } private fun BookSearch.toCondition(): Condition { var c: Condition = DSL.trueCondition() @@ -164,7 +167,7 @@ class BookDtoDao( comment = comment ?: "" ) - private fun BookMetadataRecord.toDto(ar: Collection) = + private fun BookMetadataRecord.toDto(authors: List) = BookMetadataDto( title = title, titleLock = titleLock, @@ -182,7 +185,7 @@ class BookDtoDao( ageRatingLock = ageRatingLock, releaseDate = releaseDate, releaseDateLock = releaseDateLock, - authors = ar.filter { it.name != null }.map { AuthorDto(it.name, it.role) }, + authors = authors, authorsLock = authorsLock )