Load all tracks in one query for statistics

This commit is contained in:
AntsyLich
2026-10-07 19:59:52 +06:00
parent 5df78e305e
commit 179bfaca72
4 changed files with 18 additions and 3 deletions
@@ -26,7 +26,7 @@ import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_HAS_U
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_COMPLETED
import tachiyomi.domain.library.service.LibraryPreferences.Companion.MANGA_NON_READ
import tachiyomi.domain.manga.interactor.GetLibraryManga
import tachiyomi.domain.track.interactor.GetTracks
import tachiyomi.domain.track.interactor.GetTracksPerManga
import tachiyomi.domain.track.model.Track
import tachiyomi.source.local.isLocal
@@ -37,7 +37,7 @@ class StatsViewModel(
private val downloadManager: DownloadManager,
private val getLibraryManga: GetLibraryManga,
private val getTotalReadDuration: GetTotalReadDuration,
private val getTracks: GetTracks,
private val getTracksPerManga: GetTracksPerManga,
private val preferences: LibraryPreferences,
private val trackerManager: TrackerManager,
) : ViewModel() {
@@ -114,8 +114,11 @@ class StatsViewModel(
private suspend fun getMangaTrackMap(libraryManga: List<LibraryManga>): Map<Long, List<Track>> {
val loggedInTrackerIds = loggedInTrackers.map { it.id }.toHashSet()
if (loggedInTrackerIds.isEmpty()) return emptyMap()
val tracksPerManga = getTracksPerManga.await()
return libraryManga.associate { manga ->
val tracks = getTracks.await(manga.id)
val tracks = tracksPerManga[manga.id].orEmpty()
.fastFilter { it.trackerId in loggedInTrackerIds }
manga.id to tracks
@@ -31,6 +31,12 @@ class TrackRepositoryImpl(
.awaitAsList()
}
override suspend fun getTracks(): List<Track> {
return database.manga_trackQueries
.getTracks(TrackMapper::mapTrack)
.awaitAsList()
}
override fun getTracksAsFlow(): Flow<List<Track>> {
return database.manga_trackQueries
.getTracks(TrackMapper::mapTrack)
@@ -11,6 +11,10 @@ class GetTracksPerManga(
private val trackRepository: TrackRepository,
) {
suspend fun await(): Map<Long, List<Track>> {
return trackRepository.getTracks().groupBy { it.mangaId }
}
fun subscribe(): Flow<Map<Long, List<Track>>> {
return trackRepository.getTracksAsFlow().map { tracks -> tracks.groupBy { it.mangaId } }
}
@@ -9,6 +9,8 @@ interface TrackRepository {
suspend fun getTracksByMangaId(mangaId: Long): List<Track>
suspend fun getTracks(): List<Track>
fun getTracksAsFlow(): Flow<List<Track>>
fun getTracksByMangaIdAsFlow(mangaId: Long): Flow<List<Track>>