From 4e2445d60cdb4c03fcdd3e0916d008e582540304 Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Fri, 15 Aug 2025 16:15:59 +0700 Subject: [PATCH] feat(library): Optimize trackers filter speed --- .../ui/library/LibraryScreenModel.kt | 23 ++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt index df933794f..88aca4485 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt @@ -451,6 +451,15 @@ class LibraryScreenModel( val filterLewd = preferences.filterLewd // SY <-- + // KMK --> + // Pre-compute track mappings for better performance + val mangaTrackIds = if (!isNotLoggedInAnyTrack && !trackFiltersIsIgnored) { + trackMap.mapValues { entry -> entry.value.map { it.trackerId } } + } else { + emptyMap() + } + // KMK <-- + val filterFnDownloaded: (LibraryItem) -> Boolean = { applyFilter(filterDownloaded) { it.libraryManga.manga.isLocal() || @@ -492,9 +501,12 @@ class LibraryScreenModel( val filterFnTracking: (LibraryItem) -> Boolean = tracking@{ item -> if (isNotLoggedInAnyTrack || trackFiltersIsIgnored) return@tracking true - val mangaTracks = trackMap - .mapValues { entry -> entry.value.map { it.trackerId } }[item.id] - .orEmpty() + // KMK --> + val mangaTracks = mangaTrackIds[item.id].orEmpty() + + // Early return + if (mangaTracks.isEmpty() && includedTracks.isNotEmpty()) return@tracking false + // KMK <-- val isExcluded = excludedTracks.isNotEmpty() && mangaTracks.fastAny { it in excludedTracks } val isIncluded = includedTracks.isEmpty() || mangaTracks.fastAny { it in includedTracks } @@ -508,6 +520,11 @@ class LibraryScreenModel( val mangaCategories = item.libraryManga.categories.filterNot { it == 0L }.toSet() + // Early return + if (mangaCategories.isEmpty()) { + return@categories includedCategories.isEmpty() + } + val isExcluded = excludedCategories.any { it in mangaCategories } val isIncluded = includedCategories.isEmpty() || includedCategories.all { it in mangaCategories }