diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt index 16482521..230772d2 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/dataLoaders/ChapterDataLoader.kt @@ -119,6 +119,27 @@ class BookmarkedChapterCountForMangaDataLoader : KotlinDataLoader { } } +class HasDuplicateChaptersForMangaDataLoader : KotlinDataLoader { + override val dataLoaderName = "HasDuplicateChaptersForMangaDataLoader" + + override fun getDataLoader(): DataLoader = + DataLoaderFactory.newDataLoader { ids -> + future { + transaction { + addLogger(Slf4jSqlDebugLogger) + val duplicatedChapterCountByMangaId = + ChapterTable.slice(ChapterTable.manga, ChapterTable.chapter_number, ChapterTable.chapter_number.count()) + .select { (ChapterTable.manga inList ids) and (ChapterTable.chapter_number greaterEq 0f) } + .groupBy(ChapterTable.manga, ChapterTable.chapter_number) + .having { ChapterTable.chapter_number.count() greater 1 } + .associate { it[ChapterTable.manga].value to it[ChapterTable.chapter_number.count()] } + + ids.map { duplicatedChapterCountByMangaId.contains(it) } + } + } + } +} + class LastReadChapterForMangaDataLoader : KotlinDataLoader { override val dataLoaderName = "LastReadChapterForMangaDataLoader" diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt index 46c1aa85..51375020 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/server/TachideskDataLoaderRegistryFactory.kt @@ -22,6 +22,7 @@ import suwayomi.tachidesk.graphql.dataLoaders.ExtensionDataLoader import suwayomi.tachidesk.graphql.dataLoaders.ExtensionForSourceDataLoader import suwayomi.tachidesk.graphql.dataLoaders.FirstUnreadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.GlobalMetaDataLoader +import suwayomi.tachidesk.graphql.dataLoaders.HasDuplicateChaptersForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LastReadChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LatestFetchedChapterForMangaDataLoader import suwayomi.tachidesk.graphql.dataLoaders.LatestReadChapterForMangaDataLoader @@ -53,6 +54,7 @@ class TachideskDataLoaderRegistryFactory { DownloadedChapterCountForMangaDataLoader(), UnreadChapterCountForMangaDataLoader(), BookmarkedChapterCountForMangaDataLoader(), + HasDuplicateChaptersForMangaDataLoader(), LastReadChapterForMangaDataLoader(), LatestReadChapterForMangaDataLoader(), LatestFetchedChapterForMangaDataLoader(), diff --git a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt index 16f25815..8cd4dfa0 100644 --- a/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt +++ b/server/src/main/kotlin/suwayomi/tachidesk/graphql/types/MangaType.kt @@ -68,6 +68,7 @@ class MangaType( dataFetchingEnvironment.getDataLoader("DownloadedChapterCountForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("UnreadChapterCountForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("BookmarkedChapterCountForMangaDataLoader").clear(mangaId) + dataFetchingEnvironment.getDataLoader("HasDuplicateChaptersForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LastReadChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LatestReadChapterForMangaDataLoader").clear(mangaId) dataFetchingEnvironment.getDataLoader("LatestFetchedChapterForMangaDataLoader").clear(mangaId) @@ -135,6 +136,10 @@ class MangaType( return dataFetchingEnvironment.getValueFromDataLoader("BookmarkedChapterCountForMangaDataLoader", id) } + fun hasDuplicateChapters(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { + return dataFetchingEnvironment.getValueFromDataLoader("HasDuplicateChaptersForMangaDataLoader", id) + } + fun lastReadChapter(dataFetchingEnvironment: DataFetchingEnvironment): CompletableFuture { return dataFetchingEnvironment.getValueFromDataLoader("LastReadChapterForMangaDataLoader", id) }