Merge query for UpdateView & LibraryView (#741)
Remove the inline-code and move it to database * merge queries for Updates view * merge queries for Library view * add comment * fix spotless * also migrate database
This commit is contained in:
parent
778d901822
commit
d4c4686ad1
10 changed files with 218 additions and 324 deletions
|
|
@ -110,10 +110,4 @@ class AndroidDatabaseHandler(
|
||||||
val context = getCurrentDatabaseContext()
|
val context = getCurrentDatabaseContext()
|
||||||
return withContext(context) { block(db) }
|
return withContext(context) { block(db) }
|
||||||
}
|
}
|
||||||
|
|
||||||
// SY -->
|
|
||||||
fun getLibraryQuery(condition: String = "M.favorite = 1") = LibraryQuery(driver, condition)
|
|
||||||
|
|
||||||
fun getUpdatesQuery(after: Long, limit: Long) = UpdatesQuery(driver, after, limit)
|
|
||||||
// SY <--
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,136 +0,0 @@
|
||||||
package tachiyomi.data
|
|
||||||
|
|
||||||
import app.cash.sqldelight.ExecutableQuery
|
|
||||||
import app.cash.sqldelight.db.QueryResult
|
|
||||||
import app.cash.sqldelight.db.SqlCursor
|
|
||||||
import app.cash.sqldelight.db.SqlDriver
|
|
||||||
import exh.source.MERGED_SOURCE_ID
|
|
||||||
import tachiyomi.view.LibraryView
|
|
||||||
|
|
||||||
private val mapper = { cursor: SqlCursor ->
|
|
||||||
LibraryView(
|
|
||||||
_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)?.let(StringListColumnAdapter::decode),
|
|
||||||
title = cursor.getString(7)!!,
|
|
||||||
status = cursor.getLong(8)!!,
|
|
||||||
thumbnail_url = cursor.getString(9),
|
|
||||||
favorite = cursor.getLong(10)!! == 1L,
|
|
||||||
last_update = cursor.getLong(11),
|
|
||||||
next_update = cursor.getLong(12),
|
|
||||||
initialized = cursor.getLong(13)!! == 1L,
|
|
||||||
viewer = cursor.getLong(14)!!,
|
|
||||||
chapter_flags = cursor.getLong(15)!!,
|
|
||||||
cover_last_modified = cursor.getLong(16)!!,
|
|
||||||
date_added = cursor.getLong(17)!!,
|
|
||||||
filtered_scanlators = null,
|
|
||||||
update_strategy = UpdateStrategyColumnAdapter.decode(cursor.getLong(19)!!),
|
|
||||||
calculate_interval = cursor.getLong(20)!!,
|
|
||||||
last_modified_at = cursor.getLong(21)!!,
|
|
||||||
favorite_modified_at = cursor.getLong(22),
|
|
||||||
version = cursor.getLong(23)!!,
|
|
||||||
is_syncing = cursor.getLong(24)!!,
|
|
||||||
totalCount = cursor.getLong(25)!!,
|
|
||||||
readCount = cursor.getDouble(26)!!,
|
|
||||||
latestUpload = cursor.getLong(27)!!,
|
|
||||||
chapterFetchedAt = cursor.getLong(28)!!,
|
|
||||||
lastRead = cursor.getLong(29)!!,
|
|
||||||
bookmarkCount = cursor.getDouble(30)!!,
|
|
||||||
category = cursor.getLong(31)!!,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class LibraryQuery(
|
|
||||||
val driver: SqlDriver,
|
|
||||||
val condition: String = "M.favorite = 1",
|
|
||||||
) : ExecutableQuery<LibraryView>(mapper) {
|
|
||||||
|
|
||||||
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> {
|
|
||||||
return driver.executeQuery(
|
|
||||||
null,
|
|
||||||
"""
|
|
||||||
SELECT
|
|
||||||
M.*,
|
|
||||||
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(C.bookmarkCount, 0) AS bookmarkCount,
|
|
||||||
coalesce(MC.category_id, 0) AS category
|
|
||||||
FROM mangas M
|
|
||||||
LEFT JOIN(
|
|
||||||
SELECT
|
|
||||||
chapters.manga_id,
|
|
||||||
count(*) AS total,
|
|
||||||
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,
|
|
||||||
sum(chapters.bookmark) AS bookmarkCount
|
|
||||||
FROM chapters
|
|
||||||
LEFT JOIN excluded_scanlators
|
|
||||||
ON chapters.manga_id = excluded_scanlators.manga_id
|
|
||||||
AND chapters.scanlator = excluded_scanlators.scanlator
|
|
||||||
LEFT JOIN history
|
|
||||||
ON chapters._id = history.chapter_id
|
|
||||||
WHERE excluded_scanlators.scanlator IS NULL
|
|
||||||
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 $condition AND M.source <> $MERGED_SOURCE_ID
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
M.*,
|
|
||||||
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(C.bookmarkCount, 0) AS bookmarkCount,
|
|
||||||
coalesce(MC.category_id, 0) AS category
|
|
||||||
FROM mangas M
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT merged.manga_id,merged.merge_id
|
|
||||||
FROM merged
|
|
||||||
GROUP BY merged.merge_id
|
|
||||||
) as ME
|
|
||||||
ON ME.merge_id = M._id
|
|
||||||
LEFT JOIN(
|
|
||||||
SELECT
|
|
||||||
ME.merge_id,
|
|
||||||
count(*) AS total,
|
|
||||||
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,
|
|
||||||
sum(chapters.bookmark) AS bookmarkCount
|
|
||||||
FROM chapters
|
|
||||||
LEFT JOIN excluded_scanlators
|
|
||||||
ON chapters.manga_id = excluded_scanlators.manga_id
|
|
||||||
AND chapters.scanlator = excluded_scanlators.scanlator
|
|
||||||
LEFT JOIN history
|
|
||||||
ON chapters._id = history.chapter_id
|
|
||||||
LEFT JOIN merged as ME
|
|
||||||
ON ME.manga_id = chapters.manga_id
|
|
||||||
WHERE excluded_scanlators.scanlator IS NULL
|
|
||||||
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 $condition AND M.source = $MERGED_SOURCE_ID;
|
|
||||||
""".trimIndent(),
|
|
||||||
mapper,
|
|
||||||
parameters = 0,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = "LibraryQuery.sq:get"
|
|
||||||
}
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
package tachiyomi.data
|
|
||||||
|
|
||||||
import app.cash.sqldelight.ExecutableQuery
|
|
||||||
import app.cash.sqldelight.db.QueryResult
|
|
||||||
import app.cash.sqldelight.db.SqlCursor
|
|
||||||
import app.cash.sqldelight.db.SqlDriver
|
|
||||||
import exh.source.MERGED_SOURCE_ID
|
|
||||||
import tachiyomi.view.UpdatesView
|
|
||||||
|
|
||||||
private val mapper = { cursor: SqlCursor ->
|
|
||||||
UpdatesView(
|
|
||||||
cursor.getLong(0)!!,
|
|
||||||
cursor.getString(1)!!,
|
|
||||||
cursor.getLong(2)!!,
|
|
||||||
cursor.getString(3)!!,
|
|
||||||
cursor.getString(4),
|
|
||||||
cursor.getLong(5)!! == 1L,
|
|
||||||
cursor.getLong(6)!! == 1L,
|
|
||||||
cursor.getLong(7)!!,
|
|
||||||
cursor.getLong(8)!!,
|
|
||||||
cursor.getLong(9)!! == 1L,
|
|
||||||
cursor.getString(10),
|
|
||||||
cursor.getLong(11)!!,
|
|
||||||
cursor.getLong(12)!!,
|
|
||||||
cursor.getLong(13)!!,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class UpdatesQuery(val driver: SqlDriver, val after: Long, val limit: Long) : ExecutableQuery<UpdatesView>(mapper) {
|
|
||||||
override fun <R> execute(mapper: (SqlCursor) -> QueryResult<R>): QueryResult<R> {
|
|
||||||
return driver.executeQuery(
|
|
||||||
null,
|
|
||||||
"""
|
|
||||||
SELECT
|
|
||||||
mangas._id AS mangaId,
|
|
||||||
mangas.title AS mangaTitle,
|
|
||||||
chapters._id AS chapterId,
|
|
||||||
chapters.name AS chapterName,
|
|
||||||
chapters.scanlator,
|
|
||||||
chapters.read,
|
|
||||||
chapters.bookmark,
|
|
||||||
chapters.last_page_read,
|
|
||||||
mangas.source,
|
|
||||||
mangas.favorite,
|
|
||||||
mangas.thumbnail_url AS thumbnailUrl,
|
|
||||||
mangas.cover_last_modified AS coverLastModified,
|
|
||||||
chapters.date_upload AS dateUpload,
|
|
||||||
chapters.date_fetch AS datefetch
|
|
||||||
FROM mangas JOIN chapters
|
|
||||||
ON mangas._id = chapters.manga_id
|
|
||||||
WHERE favorite = 1 AND source <> $MERGED_SOURCE_ID
|
|
||||||
AND date_fetch > date_added
|
|
||||||
AND dateUpload > :after
|
|
||||||
UNION
|
|
||||||
SELECT
|
|
||||||
mangas._id AS mangaId,
|
|
||||||
mangas.title AS mangaTitle,
|
|
||||||
chapters._id AS chapterId,
|
|
||||||
chapters.name AS chapterName,
|
|
||||||
chapters.scanlator,
|
|
||||||
chapters.read,
|
|
||||||
chapters.bookmark,
|
|
||||||
chapters.last_page_read,
|
|
||||||
mangas.source,
|
|
||||||
mangas.favorite,
|
|
||||||
mangas.thumbnail_url AS thumbnailUrl,
|
|
||||||
mangas.cover_last_modified AS coverLastModified,
|
|
||||||
chapters.date_upload AS dateUpload,
|
|
||||||
chapters.date_fetch AS datefetch
|
|
||||||
FROM mangas
|
|
||||||
LEFT JOIN (
|
|
||||||
SELECT merged.manga_id,merged.merge_id
|
|
||||||
FROM merged
|
|
||||||
GROUP BY merged.merge_id
|
|
||||||
) as ME
|
|
||||||
ON ME.merge_id = mangas._id
|
|
||||||
JOIN chapters
|
|
||||||
ON ME.manga_id = chapters.manga_id
|
|
||||||
WHERE favorite = 1 AND source = $MERGED_SOURCE_ID
|
|
||||||
AND date_fetch > date_added
|
|
||||||
AND dateUpload > :after
|
|
||||||
ORDER BY datefetch DESC
|
|
||||||
LIMIT :limit;
|
|
||||||
""".trimIndent(),
|
|
||||||
mapper,
|
|
||||||
2,
|
|
||||||
binders = {
|
|
||||||
bindLong(0, after)
|
|
||||||
bindLong(1, limit)
|
|
||||||
},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = "LibraryQuery.sq:get"
|
|
||||||
}
|
|
||||||
|
|
@ -3,7 +3,6 @@ package tachiyomi.data.manga
|
||||||
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
import eu.kanade.tachiyomi.source.model.UpdateStrategy
|
||||||
import tachiyomi.domain.library.model.LibraryManga
|
import tachiyomi.domain.library.model.LibraryManga
|
||||||
import tachiyomi.domain.manga.model.Manga
|
import tachiyomi.domain.manga.model.Manga
|
||||||
import tachiyomi.view.LibraryView
|
|
||||||
|
|
||||||
object MangaMapper {
|
object MangaMapper {
|
||||||
fun mapManga(
|
fun mapManga(
|
||||||
|
|
@ -138,41 +137,4 @@ object MangaMapper {
|
||||||
chapterFetchedAt = chapterFetchedAt,
|
chapterFetchedAt = chapterFetchedAt,
|
||||||
lastRead = lastRead,
|
lastRead = lastRead,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun mapLibraryView(libraryView: LibraryView): LibraryManga {
|
|
||||||
return LibraryManga(
|
|
||||||
manga = Manga(
|
|
||||||
id = libraryView._id,
|
|
||||||
source = libraryView.source,
|
|
||||||
favorite = libraryView.favorite,
|
|
||||||
lastUpdate = libraryView.last_update ?: 0,
|
|
||||||
nextUpdate = libraryView.next_update ?: 0,
|
|
||||||
dateAdded = libraryView.date_added,
|
|
||||||
viewerFlags = libraryView.viewer,
|
|
||||||
chapterFlags = libraryView.chapter_flags,
|
|
||||||
coverLastModified = libraryView.cover_last_modified,
|
|
||||||
url = libraryView.url,
|
|
||||||
ogTitle = libraryView.title,
|
|
||||||
ogArtist = libraryView.artist,
|
|
||||||
ogAuthor = libraryView.author,
|
|
||||||
ogDescription = libraryView.description,
|
|
||||||
ogGenre = libraryView.genre,
|
|
||||||
ogStatus = libraryView.status,
|
|
||||||
ogThumbnailUrl = libraryView.thumbnail_url,
|
|
||||||
updateStrategy = libraryView.update_strategy,
|
|
||||||
initialized = libraryView.initialized,
|
|
||||||
fetchInterval = libraryView.calculate_interval.toInt(),
|
|
||||||
lastModifiedAt = libraryView.last_modified_at,
|
|
||||||
favoriteModifiedAt = libraryView.favorite_modified_at,
|
|
||||||
version = libraryView.version,
|
|
||||||
),
|
|
||||||
category = libraryView.category,
|
|
||||||
totalChapters = libraryView.totalCount,
|
|
||||||
readCount = libraryView.readCount.toLong(),
|
|
||||||
bookmarkCount = libraryView.bookmarkCount.toLong(),
|
|
||||||
latestUpload = libraryView.latestUpload,
|
|
||||||
chapterFetchedAt = libraryView.chapterFetchedAt,
|
|
||||||
lastRead = libraryView.lastRead,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
package tachiyomi.data.manga
|
package tachiyomi.data.manga
|
||||||
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
|
||||||
import logcat.LogPriority
|
import logcat.LogPriority
|
||||||
import tachiyomi.core.common.util.system.logcat
|
import tachiyomi.core.common.util.system.logcat
|
||||||
import tachiyomi.data.AndroidDatabaseHandler
|
|
||||||
import tachiyomi.data.DatabaseHandler
|
import tachiyomi.data.DatabaseHandler
|
||||||
import tachiyomi.data.StringListColumnAdapter
|
import tachiyomi.data.StringListColumnAdapter
|
||||||
import tachiyomi.data.UpdateStrategyColumnAdapter
|
import tachiyomi.data.UpdateStrategyColumnAdapter
|
||||||
|
|
@ -56,17 +54,11 @@ class MangaRepositoryImpl(
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getLibraryManga(): List<LibraryManga> {
|
override suspend fun getLibraryManga(): List<LibraryManga> {
|
||||||
return handler.awaitListExecutable {
|
return handler.awaitList { libraryViewQueries.library(MangaMapper::mapLibraryManga) }
|
||||||
(handler as AndroidDatabaseHandler).getLibraryQuery()
|
|
||||||
}.map(MangaMapper::mapLibraryView)
|
|
||||||
// return handler.awaitList { libraryViewQueries.library(MangaMapper::mapLibraryManga) }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>> {
|
override fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>> {
|
||||||
return handler.subscribeToList { libraryViewQueries.library(MangaMapper::mapLibraryManga) }
|
return handler.subscribeToList { libraryViewQueries.library(MangaMapper::mapLibraryManga) }
|
||||||
// SY -->
|
|
||||||
.map { getLibraryManga() }
|
|
||||||
// SY <--
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getFavoritesBySourceId(sourceId: Long): Flow<List<Manga>> {
|
override fun getFavoritesBySourceId(sourceId: Long): Flow<List<Manga>> {
|
||||||
|
|
@ -203,9 +195,7 @@ class MangaRepositoryImpl(
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun getReadMangaNotInLibraryView(): List<LibraryManga> {
|
override suspend fun getReadMangaNotInLibraryView(): List<LibraryManga> {
|
||||||
return handler.awaitListExecutable {
|
return handler.awaitList { libraryViewQueries.readMangaNonLibrary(MangaMapper::mapLibraryManga) }
|
||||||
(handler as AndroidDatabaseHandler).getLibraryQuery("M.favorite = 0 AND C.readCount != 0")
|
|
||||||
}.map(MangaMapper::mapLibraryView)
|
|
||||||
}
|
}
|
||||||
// SY <--
|
// SY <--
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,10 @@
|
||||||
package tachiyomi.data.updates
|
package tachiyomi.data.updates
|
||||||
|
|
||||||
import kotlinx.coroutines.flow.Flow
|
import kotlinx.coroutines.flow.Flow
|
||||||
import kotlinx.coroutines.flow.map
|
|
||||||
import tachiyomi.data.AndroidDatabaseHandler
|
|
||||||
import tachiyomi.data.DatabaseHandler
|
import tachiyomi.data.DatabaseHandler
|
||||||
import tachiyomi.domain.manga.model.MangaCover
|
import tachiyomi.domain.manga.model.MangaCover
|
||||||
import tachiyomi.domain.updates.model.UpdatesWithRelations
|
import tachiyomi.domain.updates.model.UpdatesWithRelations
|
||||||
import tachiyomi.domain.updates.repository.UpdatesRepository
|
import tachiyomi.domain.updates.repository.UpdatesRepository
|
||||||
import tachiyomi.view.UpdatesView
|
|
||||||
|
|
||||||
class UpdatesRepositoryImpl(
|
class UpdatesRepositoryImpl(
|
||||||
private val databaseHandler: DatabaseHandler,
|
private val databaseHandler: DatabaseHandler,
|
||||||
|
|
@ -31,11 +28,6 @@ class UpdatesRepositoryImpl(
|
||||||
override fun subscribeAll(after: Long, limit: Long): Flow<List<UpdatesWithRelations>> {
|
override fun subscribeAll(after: Long, limit: Long): Flow<List<UpdatesWithRelations>> {
|
||||||
return databaseHandler.subscribeToList {
|
return databaseHandler.subscribeToList {
|
||||||
updatesViewQueries.getRecentUpdates(after, limit, ::mapUpdatesWithRelations)
|
updatesViewQueries.getRecentUpdates(after, limit, ::mapUpdatesWithRelations)
|
||||||
}.map {
|
|
||||||
databaseHandler.awaitListExecutable {
|
|
||||||
(databaseHandler as AndroidDatabaseHandler).getUpdatesQuery(after, limit)
|
|
||||||
}
|
|
||||||
.map(::mapUpdatesView)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -67,7 +59,7 @@ class UpdatesRepositoryImpl(
|
||||||
favorite: Boolean,
|
favorite: Boolean,
|
||||||
thumbnailUrl: String?,
|
thumbnailUrl: String?,
|
||||||
coverLastModified: Long,
|
coverLastModified: Long,
|
||||||
dateUpload: Long,
|
@Suppress("UNUSED_PARAMETER") dateUpload: Long,
|
||||||
dateFetch: Long,
|
dateFetch: Long,
|
||||||
): UpdatesWithRelations = UpdatesWithRelations(
|
): UpdatesWithRelations = UpdatesWithRelations(
|
||||||
mangaId = mangaId,
|
mangaId = mangaId,
|
||||||
|
|
@ -90,26 +82,4 @@ class UpdatesRepositoryImpl(
|
||||||
lastModified = coverLastModified,
|
lastModified = coverLastModified,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun mapUpdatesView(updatesView: UpdatesView): UpdatesWithRelations {
|
|
||||||
return UpdatesWithRelations(
|
|
||||||
mangaId = updatesView.mangaId,
|
|
||||||
ogMangaTitle = updatesView.mangaTitle,
|
|
||||||
chapterId = updatesView.chapterId,
|
|
||||||
chapterName = updatesView.chapterName,
|
|
||||||
scanlator = updatesView.scanlator,
|
|
||||||
read = updatesView.read,
|
|
||||||
bookmark = updatesView.bookmark,
|
|
||||||
lastPageRead = updatesView.last_page_read,
|
|
||||||
sourceId = updatesView.source,
|
|
||||||
dateFetch = updatesView.datefetch,
|
|
||||||
coverData = MangaCover(
|
|
||||||
mangaId = updatesView.mangaId,
|
|
||||||
sourceId = updatesView.source,
|
|
||||||
isMangaFavorite = updatesView.favorite,
|
|
||||||
ogUrl = updatesView.thumbnailUrl,
|
|
||||||
lastModified = updatesView.coverLastModified,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
129
data/src/main/sqldelight/tachiyomi/migrations/37.sqm
Normal file
129
data/src/main/sqldelight/tachiyomi/migrations/37.sqm
Normal file
|
|
@ -0,0 +1,129 @@
|
||||||
|
-- NOTE: must update MERGED_SOURCE_ID (6969) here
|
||||||
|
DROP VIEW IF EXISTS libraryView;
|
||||||
|
DROP VIEW IF EXISTS updatesView;
|
||||||
|
|
||||||
|
CREATE VIEW libraryView AS
|
||||||
|
SELECT
|
||||||
|
M.*,
|
||||||
|
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(C.bookmarkCount, 0) AS bookmarkCount,
|
||||||
|
coalesce(MC.category_id, 0) AS category
|
||||||
|
FROM mangas M
|
||||||
|
LEFT JOIN(
|
||||||
|
SELECT
|
||||||
|
chapters.manga_id,
|
||||||
|
count(*) AS total,
|
||||||
|
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,
|
||||||
|
sum(chapters.bookmark) AS bookmarkCount,
|
||||||
|
excluded_scanlators.scanlator AS ex_scanlator
|
||||||
|
FROM chapters
|
||||||
|
LEFT JOIN excluded_scanlators
|
||||||
|
ON chapters.manga_id = excluded_scanlators.manga_id
|
||||||
|
AND chapters.scanlator = excluded_scanlators.scanlator
|
||||||
|
LEFT JOIN history
|
||||||
|
ON chapters._id = history.chapter_id
|
||||||
|
WHERE ex_scanlator IS NULL
|
||||||
|
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.source <> 6969
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
M.*,
|
||||||
|
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(C.bookmarkCount, 0) AS bookmarkCount,
|
||||||
|
coalesce(MC.category_id, 0) AS category
|
||||||
|
FROM mangas M
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT merged.manga_id,merged.merge_id
|
||||||
|
FROM merged
|
||||||
|
GROUP BY merged.merge_id
|
||||||
|
) AS ME
|
||||||
|
ON ME.merge_id = M._id
|
||||||
|
LEFT JOIN(
|
||||||
|
SELECT
|
||||||
|
ME.merge_id,
|
||||||
|
count(*) AS total,
|
||||||
|
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,
|
||||||
|
sum(chapters.bookmark) AS bookmarkCount,
|
||||||
|
excluded_scanlators.scanlator AS ex_scanlator
|
||||||
|
FROM chapters
|
||||||
|
LEFT JOIN excluded_scanlators
|
||||||
|
ON chapters.manga_id = excluded_scanlators.manga_id
|
||||||
|
AND chapters.scanlator = excluded_scanlators.scanlator
|
||||||
|
LEFT JOIN history
|
||||||
|
ON chapters._id = history.chapter_id
|
||||||
|
LEFT JOIN merged ME
|
||||||
|
ON ME.manga_id = chapters.manga_id
|
||||||
|
WHERE ex_scanlator IS NULL
|
||||||
|
GROUP BY ME.merge_id
|
||||||
|
) AS C
|
||||||
|
ON M._id = C.merge_id -- ON ME.merge_id = C.merge_id
|
||||||
|
LEFT JOIN mangas_categories AS MC
|
||||||
|
ON MC.manga_id = M._id
|
||||||
|
WHERE M.source = 6969;
|
||||||
|
|
||||||
|
CREATE VIEW updatesView AS
|
||||||
|
SELECT
|
||||||
|
mangas._id AS mangaId,
|
||||||
|
mangas.title AS mangaTitle,
|
||||||
|
chapters._id AS chapterId,
|
||||||
|
chapters.name AS chapterName,
|
||||||
|
chapters.scanlator,
|
||||||
|
chapters.read,
|
||||||
|
chapters.bookmark,
|
||||||
|
chapters.last_page_read,
|
||||||
|
mangas.source,
|
||||||
|
mangas.favorite,
|
||||||
|
mangas.thumbnail_url AS thumbnailUrl,
|
||||||
|
mangas.cover_last_modified AS coverLastModified,
|
||||||
|
chapters.date_upload AS dateUpload,
|
||||||
|
chapters.date_fetch AS datefetch
|
||||||
|
FROM mangas JOIN chapters
|
||||||
|
ON mangas._id = chapters.manga_id
|
||||||
|
WHERE favorite = 1 AND source <> 6969
|
||||||
|
AND date_fetch > date_added
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
mangas._id AS mangaId,
|
||||||
|
mangas.title AS mangaTitle,
|
||||||
|
chapters._id AS chapterId,
|
||||||
|
chapters.name AS chapterName,
|
||||||
|
chapters.scanlator,
|
||||||
|
chapters.read,
|
||||||
|
chapters.bookmark,
|
||||||
|
chapters.last_page_read,
|
||||||
|
mangas.source,
|
||||||
|
mangas.favorite,
|
||||||
|
mangas.thumbnail_url AS thumbnailUrl,
|
||||||
|
mangas.cover_last_modified AS coverLastModified,
|
||||||
|
chapters.date_upload AS dateUpload,
|
||||||
|
chapters.date_fetch AS datefetch
|
||||||
|
FROM mangas
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT merged.manga_id,merged.merge_id
|
||||||
|
FROM merged
|
||||||
|
GROUP BY merged.merge_id
|
||||||
|
) AS ME
|
||||||
|
ON ME.merge_id = mangas._id
|
||||||
|
JOIN chapters
|
||||||
|
ON ME.manga_id = chapters.manga_id
|
||||||
|
WHERE favorite = 1 AND source = 6969
|
||||||
|
AND date_fetch > date_added
|
||||||
|
ORDER BY datefetch DESC;
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
-- NOTE: must update MERGED_SOURCE_ID (6969) here
|
||||||
CREATE VIEW libraryView AS
|
CREATE VIEW libraryView AS
|
||||||
SELECT
|
SELECT
|
||||||
M.*,
|
M.*,
|
||||||
|
|
@ -17,21 +18,70 @@ LEFT JOIN(
|
||||||
coalesce(max(chapters.date_upload), 0) AS latestUpload,
|
coalesce(max(chapters.date_upload), 0) AS latestUpload,
|
||||||
coalesce(max(history.last_read), 0) AS lastRead,
|
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
|
sum(chapters.bookmark) AS bookmarkCount,
|
||||||
|
excluded_scanlators.scanlator AS ex_scanlator
|
||||||
FROM chapters
|
FROM chapters
|
||||||
LEFT JOIN excluded_scanlators
|
LEFT JOIN excluded_scanlators
|
||||||
ON chapters.manga_id = excluded_scanlators.manga_id
|
ON chapters.manga_id = excluded_scanlators.manga_id
|
||||||
AND chapters.scanlator = excluded_scanlators.scanlator
|
AND chapters.scanlator = excluded_scanlators.scanlator
|
||||||
LEFT JOIN history
|
LEFT JOIN history
|
||||||
ON chapters._id = history.chapter_id
|
ON chapters._id = history.chapter_id
|
||||||
WHERE excluded_scanlators.scanlator IS NULL
|
WHERE ex_scanlator IS NULL
|
||||||
GROUP BY chapters.manga_id
|
GROUP BY chapters.manga_id
|
||||||
) AS C
|
) AS C
|
||||||
ON M._id = C.manga_id
|
ON M._id = C.manga_id
|
||||||
LEFT JOIN mangas_categories AS MC
|
LEFT JOIN mangas_categories AS MC
|
||||||
ON MC.manga_id = M._id
|
ON MC.manga_id = M._id
|
||||||
WHERE M.favorite = 1;
|
WHERE M.source <> 6969
|
||||||
|
UNION
|
||||||
|
SELECT
|
||||||
|
M.*,
|
||||||
|
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(C.bookmarkCount, 0) AS bookmarkCount,
|
||||||
|
coalesce(MC.category_id, 0) AS category
|
||||||
|
FROM mangas M
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT merged.manga_id,merged.merge_id
|
||||||
|
FROM merged
|
||||||
|
GROUP BY merged.merge_id
|
||||||
|
) AS ME
|
||||||
|
ON ME.merge_id = M._id
|
||||||
|
LEFT JOIN(
|
||||||
|
SELECT
|
||||||
|
ME.merge_id,
|
||||||
|
count(*) AS total,
|
||||||
|
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,
|
||||||
|
sum(chapters.bookmark) AS bookmarkCount,
|
||||||
|
excluded_scanlators.scanlator AS ex_scanlator
|
||||||
|
FROM chapters
|
||||||
|
LEFT JOIN excluded_scanlators
|
||||||
|
ON chapters.manga_id = excluded_scanlators.manga_id
|
||||||
|
AND chapters.scanlator = excluded_scanlators.scanlator
|
||||||
|
LEFT JOIN history
|
||||||
|
ON chapters._id = history.chapter_id
|
||||||
|
LEFT JOIN merged ME
|
||||||
|
ON ME.manga_id = chapters.manga_id
|
||||||
|
WHERE ex_scanlator IS NULL
|
||||||
|
GROUP BY ME.merge_id
|
||||||
|
) AS C
|
||||||
|
ON M._id = C.merge_id -- ON ME.merge_id = C.merge_id
|
||||||
|
LEFT JOIN mangas_categories AS MC
|
||||||
|
ON MC.manga_id = M._id
|
||||||
|
WHERE M.source = 6969;
|
||||||
|
|
||||||
library:
|
library:
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM libraryView;
|
FROM libraryView
|
||||||
|
WHERE libraryView.favorite = 1;
|
||||||
|
|
||||||
|
readMangaNonLibrary:
|
||||||
|
SELECT *
|
||||||
|
FROM libraryView
|
||||||
|
WHERE libraryView.favorite = 0 AND libraryView.readCount != 0;
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
-- NOTE: must update MERGED_SOURCE_ID (6969) here
|
||||||
CREATE VIEW updatesView AS
|
CREATE VIEW updatesView AS
|
||||||
SELECT
|
SELECT
|
||||||
mangas._id AS mangaId,
|
mangas._id AS mangaId,
|
||||||
|
|
@ -16,9 +17,36 @@ SELECT
|
||||||
chapters.date_fetch AS datefetch
|
chapters.date_fetch AS datefetch
|
||||||
FROM mangas JOIN chapters
|
FROM mangas JOIN chapters
|
||||||
ON mangas._id = chapters.manga_id
|
ON mangas._id = chapters.manga_id
|
||||||
WHERE favorite = 1
|
WHERE favorite = 1 AND source <> 6969
|
||||||
AND date_fetch > date_added
|
AND date_fetch > date_added
|
||||||
ORDER BY date_fetch DESC;
|
UNION
|
||||||
|
SELECT
|
||||||
|
mangas._id AS mangaId,
|
||||||
|
mangas.title AS mangaTitle,
|
||||||
|
chapters._id AS chapterId,
|
||||||
|
chapters.name AS chapterName,
|
||||||
|
chapters.scanlator,
|
||||||
|
chapters.read,
|
||||||
|
chapters.bookmark,
|
||||||
|
chapters.last_page_read,
|
||||||
|
mangas.source,
|
||||||
|
mangas.favorite,
|
||||||
|
mangas.thumbnail_url AS thumbnailUrl,
|
||||||
|
mangas.cover_last_modified AS coverLastModified,
|
||||||
|
chapters.date_upload AS dateUpload,
|
||||||
|
chapters.date_fetch AS datefetch
|
||||||
|
FROM mangas
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT merged.manga_id,merged.merge_id
|
||||||
|
FROM merged
|
||||||
|
GROUP BY merged.merge_id
|
||||||
|
) AS ME
|
||||||
|
ON ME.merge_id = mangas._id
|
||||||
|
JOIN chapters
|
||||||
|
ON ME.manga_id = chapters.manga_id
|
||||||
|
WHERE favorite = 1 AND source = 6969
|
||||||
|
AND date_fetch > date_added
|
||||||
|
ORDER BY datefetch DESC;
|
||||||
|
|
||||||
getRecentUpdates:
|
getRecentUpdates:
|
||||||
SELECT *
|
SELECT *
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,8 @@ const val PURURIN_SOURCE_ID = 2221515250486218861L
|
||||||
const val TSUMINO_SOURCE_ID = 6707338697138388238L
|
const val TSUMINO_SOURCE_ID = 6707338697138388238L
|
||||||
const val EIGHTMUSES_SOURCE_ID = 1802675169972965535L
|
const val EIGHTMUSES_SOURCE_ID = 1802675169972965535L
|
||||||
const val HBROWSE_SOURCE_ID = 1401584337232758222L
|
const val HBROWSE_SOURCE_ID = 1401584337232758222L
|
||||||
|
|
||||||
|
// If MERGED_SOURCE_ID is to update, remember to update updatesView.sq and libraryView.sq too
|
||||||
const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69
|
const val MERGED_SOURCE_ID = LEWD_SOURCE_SERIES + 69
|
||||||
|
|
||||||
// KMK -->
|
// KMK -->
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue