From fed8ef09af50b16669e752f2132c7768b6692b5b Mon Sep 17 00:00:00 2001 From: Andreas Date: Tue, 18 Oct 2022 22:33:26 +0200 Subject: [PATCH] Tweak library view (#8240) - Move category join to improve performance - Move bookmark calculation into query - Move unread calculation into domain (cherry picked from commit 8d97b980e354d50a7682e87677ef336833b760fe) # Conflicts: # app/build.gradle.kts # app/src/main/java/eu/kanade/data/manga/MangaMapper.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt # app/src/main/sqldelight/migrations/22.sqm # app/src/main/sqldelight/view/libraryView.sq --- .../java/eu/kanade/data/manga/LibraryQuery.kt | 29 +++++++++++-------- .../java/eu/kanade/data/manga/MangaMapper.kt | 7 +++-- .../java/eu/kanade/domain/DomainModule.kt | 2 -- .../GetBookmarkedChaptersByMangaId.kt | 20 ------------- .../domain/library/model/LibraryManga.kt | 9 ++++-- .../tachiyomi/ui/library/LibraryPresenter.kt | 15 ++++------ 6 files changed, 34 insertions(+), 48 deletions(-) delete mode 100644 app/src/main/java/eu/kanade/domain/chapter/interactor/GetBookmarkedChaptersByMangaId.kt diff --git a/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt b/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt index 46e0d670a..ac6efeed4 100644 --- a/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt +++ b/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt @@ -34,12 +34,13 @@ private val mapper = { cursor: SqlCursor -> cursor.getString(18)?.let(listOfStringsAndAdapter::decode), updateStrategyAdapter.decode(cursor.getLong(19)!!), ), - unreadCount = cursor.getLong(20)!!, + totalChapters = cursor.getLong(20)!!, readCount = cursor.getLong(21)!!, latestUpload = cursor.getLong(22)!!, chapterFetchedAt = cursor.getLong(23)!!, lastRead = cursor.getLong(24)!!, - category = cursor.getLong(25)!!, + bookmarkCount = cursor.getLong(25)!!, + category = cursor.getLong(26)!!, ) } @@ -50,15 +51,14 @@ class LibraryQuery(val driver: SqlDriver) : Query(copyOnWriteList( """ SELECT M.*, - coalesce(C.total - C.readCount, 0) AS unreadCount, + coalesce(C.total, 0) AS totalCount, coalesce(C.readCount, 0) AS readCount, coalesce(C.latestUpload, 0) AS latestUpload, coalesce(C.fetchedAt, 0) AS chapterFetchedAt, coalesce(C.lastRead, 0) AS lastRead, - COALESCE(MC.category_id, 0) AS category + coalesce(C.bookmarkCount, 0) AS bookmarkCount, + coalesce(MC.category_id, 0) AS category FROM mangas M - LEFT JOIN mangas_categories AS MC - ON MC.manga_id = M._id LEFT JOIN( SELECT chapters.manga_id, @@ -66,23 +66,27 @@ class LibraryQuery(val driver: SqlDriver) : Query(copyOnWriteList( sum(read) AS readCount, coalesce(max(chapters.date_upload), 0) AS latestUpload, coalesce(max(history.last_read), 0) AS lastRead, - coalesce(max(chapters.date_fetch), 0) AS fetchedAt + coalesce(max(chapters.date_fetch), 0) AS fetchedAt, + sum(chapters.bookmark) AS bookmarkCount FROM chapters LEFT JOIN history ON chapters._id = history.chapter_id GROUP BY chapters.manga_id ) AS C ON M._id = C.manga_id + LEFT JOIN mangas_categories AS MC + ON MC.manga_id = M._id WHERE M.favorite = 1 AND M.source <> $MERGED_SOURCE_ID UNION SELECT M.*, - coalesce(C.total - C.readCount, 0) AS unreadCount, + coalesce(C.total, 0) AS totalCount, coalesce(C.readCount, 0) AS readCount, coalesce(C.latestUpload, 0) AS latestUpload, coalesce(C.fetchedAt, 0) AS chapterFetchedAt, coalesce(C.lastRead, 0) AS lastRead, - COALESCE(MC.category_id, 0) AS category + coalesce(C.bookmarkCount, 0) AS bookmarkCount, + coalesce(MC.category_id, 0) AS category FROM mangas M LEFT JOIN ( SELECT merged.manga_id,merged.merge_id @@ -90,8 +94,6 @@ class LibraryQuery(val driver: SqlDriver) : Query(copyOnWriteList( GROUP BY merged.merge_id ) as ME ON ME.merge_id = M._id - LEFT JOIN mangas_categories AS MC - ON MC.manga_id = M._id LEFT JOIN( SELECT ME.merge_id, @@ -99,7 +101,8 @@ class LibraryQuery(val driver: SqlDriver) : Query(copyOnWriteList( sum(read) AS readCount, coalesce(max(chapters.date_upload), 0) AS latestUpload, coalesce(max(history.last_read), 0) AS lastRead, - coalesce(max(chapters.date_fetch), 0) AS fetchedAt + coalesce(max(chapters.date_fetch), 0) AS fetchedAt, + sum(chapters.bookmark) AS bookmarkCount FROM chapters LEFT JOIN history ON chapters._id = history.chapter_id @@ -108,6 +111,8 @@ class LibraryQuery(val driver: SqlDriver) : Query(copyOnWriteList( GROUP BY ME.merge_id ) AS C ON ME.merge_id = C.merge_id + LEFT JOIN mangas_categories AS MC + ON MC.manga_id = M._id WHERE M.favorite = 1 AND M.source = $MERGED_SOURCE_ID; """.trimIndent(), 1, diff --git a/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt b/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt index a0a128eb6..9ecd6c90b 100644 --- a/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt +++ b/app/src/main/java/eu/kanade/data/manga/MangaMapper.kt @@ -33,8 +33,8 @@ val mangaMapper: (Long, Long, String, String?, String?, String?, List?, ) } -val libraryManga: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?, UpdateStrategy, Long, Long, Long, Long, Long, Long) -> LibraryManga = - { id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, nextUpdate, initialized, viewerFlags, chapterFlags, coverLastModified, dateAdded, filteredScanlators, updateStrategy, unreadCount, readCount, latestUpload, chapterFetchedAt, lastRead, category -> +val libraryManga: (Long, Long, String, String?, String?, String?, List?, String, Long, String?, Boolean, Long?, Long?, Boolean, Long, Long, Long, Long, List?, UpdateStrategy, Long, Long, Long, Long, Long, Long, Long) -> LibraryManga = + { id, source, url, artist, author, description, genre, title, status, thumbnailUrl, favorite, lastUpdate, nextUpdate, initialized, viewerFlags, chapterFlags, coverLastModified, dateAdded, filteredScanlators, updateStrategy, totalCount, readCount, latestUpload, chapterFetchedAt, lastRead, bookmarkCount, category -> LibraryManga( manga = mangaMapper( id, @@ -59,8 +59,9 @@ val libraryManga: (Long, Long, String, String?, String?, String?, List?, updateStrategy, ), category = category, - unreadCount = unreadCount, + totalChapters = totalCount, readCount = readCount, + bookmarkCount = bookmarkCount, latestUpload = latestUpload, chapterFetchedAt = chapterFetchedAt, lastRead = lastRead, diff --git a/app/src/main/java/eu/kanade/domain/DomainModule.kt b/app/src/main/java/eu/kanade/domain/DomainModule.kt index 0b21a5871..14d9c761d 100644 --- a/app/src/main/java/eu/kanade/domain/DomainModule.kt +++ b/app/src/main/java/eu/kanade/domain/DomainModule.kt @@ -19,7 +19,6 @@ import eu.kanade.domain.category.interactor.SetMangaCategories import eu.kanade.domain.category.interactor.SetSortModeForCategory import eu.kanade.domain.category.interactor.UpdateCategory import eu.kanade.domain.category.repository.CategoryRepository -import eu.kanade.domain.chapter.interactor.GetBookmarkedChaptersByMangaId import eu.kanade.domain.chapter.interactor.GetChapter import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.SetMangaDefaultChapterFlags @@ -111,7 +110,6 @@ class DomainModule : InjektModule { addSingletonFactory { ChapterRepositoryImpl(get()) } addFactory { GetChapter(get()) } addFactory { GetChapterByMangaId(get()) } - addFactory { GetBookmarkedChaptersByMangaId(get()) } addFactory { UpdateChapter(get()) } addFactory { SetReadStatus(get(), get(), get(), get(), get()) } addFactory { ShouldUpdateDbChapter() } diff --git a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetBookmarkedChaptersByMangaId.kt b/app/src/main/java/eu/kanade/domain/chapter/interactor/GetBookmarkedChaptersByMangaId.kt deleted file mode 100644 index 05e03a5be..000000000 --- a/app/src/main/java/eu/kanade/domain/chapter/interactor/GetBookmarkedChaptersByMangaId.kt +++ /dev/null @@ -1,20 +0,0 @@ -package eu.kanade.domain.chapter.interactor - -import eu.kanade.domain.chapter.model.Chapter -import eu.kanade.domain.chapter.repository.ChapterRepository -import eu.kanade.tachiyomi.util.system.logcat -import logcat.LogPriority - -class GetBookmarkedChaptersByMangaId( - private val chapterRepository: ChapterRepository, -) { - - suspend fun await(mangaId: Long): List { - return try { - chapterRepository.getBookmarkedChaptersByMangaId(mangaId) - } catch (e: Exception) { - logcat(LogPriority.ERROR, e) - emptyList() - } - } -} diff --git a/app/src/main/java/eu/kanade/domain/library/model/LibraryManga.kt b/app/src/main/java/eu/kanade/domain/library/model/LibraryManga.kt index 9b0cf1103..085e4096f 100644 --- a/app/src/main/java/eu/kanade/domain/library/model/LibraryManga.kt +++ b/app/src/main/java/eu/kanade/domain/library/model/LibraryManga.kt @@ -5,15 +5,20 @@ import eu.kanade.domain.manga.model.Manga data class LibraryManga( val manga: Manga, val category: Long, - val unreadCount: Long, + val totalChapters: Long, val readCount: Long, + val bookmarkCount: Long, val latestUpload: Long, val chapterFetchedAt: Long, val lastRead: Long, ) { val id: Long = manga.id - val totalChapters = readCount + unreadCount + val unreadCount + get() = totalChapters - readCount + + val hasBookmarks + get() = bookmarkCount > 0 val hasStarted = readCount > 0 } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt index 3d7175fa1..10117359e 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt @@ -22,7 +22,6 @@ import eu.kanade.domain.base.BasePreferences import eu.kanade.domain.category.interactor.GetCategories import eu.kanade.domain.category.interactor.SetMangaCategories import eu.kanade.domain.category.model.Category -import eu.kanade.domain.chapter.interactor.GetBookmarkedChaptersByMangaId import eu.kanade.domain.chapter.interactor.GetChapterByMangaId import eu.kanade.domain.chapter.interactor.GetMergedChapterByMangaId import eu.kanade.domain.chapter.interactor.SetReadStatus @@ -126,7 +125,6 @@ class LibraryPresenter( private val getLibraryManga: GetLibraryManga = Injekt.get(), private val getTracks: GetTracks = Injekt.get(), private val getCategories: GetCategories = Injekt.get(), - private val getBookmarkedChaptersByMangaId: GetBookmarkedChaptersByMangaId = Injekt.get(), private val getChapterByMangaId: GetChapterByMangaId = Injekt.get(), private val setReadStatus: SetReadStatus = Injekt.get(), private val updateManga: UpdateManga = Injekt.get(), @@ -315,14 +313,13 @@ class LibraryPresenter( val filterFnBookmarked: (LibraryItem) -> Boolean = bookmarked@{ item -> if (filterBookmarked == State.IGNORE.value) return@bookmarked true - return@bookmarked runBlocking { - val isBookmarked = getBookmarkedChaptersByMangaId.await(item.libraryManga.manga.id).isNotEmpty() - return@runBlocking if (filterBookmarked == State.INCLUDE.value) { - isBookmarked - } else { - !isBookmarked - } + val hasBookmarks = item.libraryManga.hasBookmarks + + return@bookmarked if (filterBookmarked == State.INCLUDE.value) { + hasBookmarks + } else { + !hasBookmarks } }