From a9e5bc0c953c083df979c382a8e2165155b2211d Mon Sep 17 00:00:00 2001 From: Valter Martinek Date: Sun, 30 Oct 2022 17:48:27 +0100 Subject: [PATCH] Pre-load meta entries for all chapters for optimization (#432) Load meta entries for all chapters in one query to prevent N+1 queries --- .../suwayomi/tachidesk/manga/impl/Chapter.kt | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt index a14b937d..b9976cc7 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/manga/impl/Chapter.kt @@ -132,6 +132,9 @@ object Chapter { .associateBy({ it[ChapterTable.url] }, { it }) } + val chapterIds = chapterList.map { dbChapterMap.getValue(it.url)[ChapterTable.id] } + val chapterMetas = getChaptersMetaMaps(chapterIds) + return chapterList.mapIndexed { index, it -> val dbChapter = dbChapterMap.getValue(it.url) @@ -156,7 +159,7 @@ object Chapter { dbChapter[ChapterTable.pageCount], chapterList.size, - meta = getChapterMetaMap(dbChapter[ChapterTable.id]) + meta = chapterMetas.getValue(dbChapter[ChapterTable.id]) ) } } @@ -193,6 +196,15 @@ object Chapter { } } + fun getChaptersMetaMaps(chapterIds: List>): Map, Map> { + return transaction { + ChapterMetaTable.select { ChapterMetaTable.ref inList chapterIds } + .groupBy { it[ChapterMetaTable.ref] } + .mapValues { it.value.associate { it[ChapterMetaTable.key] to it[ChapterMetaTable.value] } } + .withDefault { emptyMap() } + } + } + fun getChapterMetaMap(chapter: EntityID): Map { return transaction { ChapterMetaTable.select { ChapterMetaTable.ref eq chapter }