komikku/app/src/main/java/eu/kanade/data/manga/LibraryQuery.kt

98 lines
3.9 KiB
Kotlin
Raw Normal View History

Use SQLDelight on Library screen (#7432) - Uses the new `asObservable` function to change the database calls to use SQLDelight, which should make the impact minimal when it comes to bugs. - Use interactors where they already exist - The todos are for the Compose rewrite - Removed unused StorIO methods/queries - Tested loading library, move manga to new category, unfavorite multiple manga, move multiple manga from one category to another, change filter, sort and display settings (with and without per category settings), (un)mark chapters, start/delete downloads Thank Syer for asObservable Co-authored-by: jobobby04 <17078382+jobobby04@users.noreply.github.com> Co-authored-by: jobobby04 <17078382+jobobby04@users.noreply.github.com> (cherry picked from commit 05085fe57fe4c3ada497f93b8cd282a5009cdbbb) # Conflicts: # app/src/main/java/eu/kanade/data/manga/MangaRepositoryImpl.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/DatabaseHelper.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/queries/CategoryQueries.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt # app/src/main/java/eu/kanade/tachiyomi/data/database/queries/TrackQueries.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SearchPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryPresenter.kt # app/src/main/java/eu/kanade/tachiyomi/ui/library/LibrarySettingsSheet.kt # app/src/main/java/eu/kanade/tachiyomi/ui/manga/MangaPresenter.kt
2022-07-02 18:55:34 +02:00
package eu.kanade.data.manga
import com.squareup.sqldelight.Query
import com.squareup.sqldelight.db.SqlCursor
import com.squareup.sqldelight.db.SqlDriver
import com.squareup.sqldelight.internal.copyOnWriteList
import eu.kanade.tachiyomi.data.database.models.LibraryManga
import exh.source.MERGED_SOURCE_ID
private val mapper = { cursor: SqlCursor ->
LibraryManga().apply {
id = cursor.getLong(0)!!
source = cursor.getLong(1)!!
url = cursor.getString(2)!!
artist = cursor.getString(3)
author = cursor.getString(4)
description = cursor.getString(5)
genre = cursor.getString(6)
title = cursor.getString(7)!!
status = cursor.getLong(8)!!.toInt()
thumbnail_url = cursor.getString(9)
favorite = cursor.getLong(10)!! == 1L
last_update = cursor.getLong(11) ?: 0
initialized = cursor.getLong(13)!! == 1L
viewer_flags = cursor.getLong(14)!!.toInt()
chapter_flags = cursor.getLong(15)!!.toInt()
cover_last_modified = cursor.getLong(16)!!
date_added = cursor.getLong(17)!!
filtered_scanlators = cursor.getString(18)
unreadCount = cursor.getLong(19)!!.toInt()
readCount = cursor.getLong(20)!!.toInt()
category = cursor.getLong(21)!!.toInt()
}
}
class LibraryQuery(val driver: SqlDriver) : Query<LibraryManga>(copyOnWriteList(), mapper) {
override fun execute(): SqlCursor {
return driver.executeQuery(
null,
"""
SELECT M.*, COALESCE(MC.category_id, 0) AS category
FROM (
SELECT mangas.*, COALESCE(C.unreadCount, 0) AS unread_count, COALESCE(R.readCount, 0) AS read_count
FROM mangas
LEFT JOIN (
SELECT chapters.manga_id, COUNT(*) AS unreadCount
FROM chapters
WHERE chapters.read = 0
GROUP BY chapters.manga_id
) AS C
ON mangas._id = C.manga_id
LEFT JOIN (
SELECT chapters.manga_id, COUNT(*) AS readCount
FROM chapters
WHERE chapters.read = 1
GROUP BY chapters.manga_id
) AS R
ON mangas._id = R.manga_id
WHERE mangas.favorite = 1 AND mangas.source <> $MERGED_SOURCE_ID
GROUP BY mangas._id
UNION
SELECT mangas.*, COALESCE(C.unreadCount, 0) AS unread_count, COALESCE(R.readCount, 0) AS read_count
FROM mangas
LEFT JOIN (
SELECT merged.merge_id, COUNT(*) as unreadCount
FROM merged
JOIN chapters
ON chapters.manga_id = merged.manga_id
WHERE chapters.read = 0
GROUP BY merged.merge_id
) AS C
ON mangas._id = C.merge_id
LEFT JOIN (
SELECT merged.merge_id, COUNT(*) as readCount
FROM merged
JOIN chapters
ON chapters.manga_id = merged.manga_id
WHERE chapters.read = 1
GROUP BY merged.merge_id
) AS R
ON mangas._id = R.merge_id
WHERE mangas.favorite = 1 AND mangas.source = $MERGED_SOURCE_ID
GROUP BY mangas._id
ORDER BY mangas.title
) AS M
LEFT JOIN (
SELECT *
FROM mangas_categories
) AS MC
ON M._id = MC.manga_id;
""".trimIndent(),
1,
)
}
override fun toString(): String = "LibraryQuery.sq:get"
}