mirror of
https://github.com/null2264/yokai.git
synced 2025-06-21 10:44:42 +00:00
chore: Preparing to migrate History to SQLDelight
This commit is contained in:
parent
10b9fa53a6
commit
61e43e047f
5 changed files with 82 additions and 67 deletions
|
@ -10,7 +10,6 @@ import com.pushtorefresh.storio.sqlite.queries.DeleteQuery
|
||||||
import com.pushtorefresh.storio.sqlite.queries.InsertQuery
|
import com.pushtorefresh.storio.sqlite.queries.InsertQuery
|
||||||
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
|
import com.pushtorefresh.storio.sqlite.queries.UpdateQuery
|
||||||
import eu.kanade.tachiyomi.data.database.models.History
|
import eu.kanade.tachiyomi.data.database.models.History
|
||||||
import eu.kanade.tachiyomi.data.database.models.HistoryImpl
|
|
||||||
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_CHAPTER_ID
|
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_CHAPTER_ID
|
||||||
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_ID
|
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_ID
|
||||||
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_LAST_READ
|
import eu.kanade.tachiyomi.data.database.tables.HistoryTable.COL_LAST_READ
|
||||||
|
@ -45,12 +44,12 @@ open class HistoryPutResolver : DefaultPutResolver<History>() {
|
||||||
|
|
||||||
class HistoryGetResolver : DefaultGetResolver<History>() {
|
class HistoryGetResolver : DefaultGetResolver<History>() {
|
||||||
|
|
||||||
override fun mapFromCursor(cursor: Cursor): History = HistoryImpl().apply {
|
override fun mapFromCursor(cursor: Cursor): History = History.mapper(
|
||||||
id = cursor.getLong(cursor.getColumnIndex(COL_ID))
|
id = cursor.getLong(cursor.getColumnIndex(COL_ID)),
|
||||||
chapter_id = cursor.getLong(cursor.getColumnIndex(COL_CHAPTER_ID))
|
chapterId = cursor.getLong(cursor.getColumnIndex(COL_CHAPTER_ID)),
|
||||||
last_read = cursor.getLong(cursor.getColumnIndex(COL_LAST_READ))
|
lastRead = cursor.getLong(cursor.getColumnIndex(COL_LAST_READ)),
|
||||||
time_read = cursor.getLong(cursor.getColumnIndex(COL_TIME_READ))
|
timeRead = cursor.getLong(cursor.getColumnIndex(COL_TIME_READ)),
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
class HistoryDeleteResolver : DefaultDeleteResolver<History>() {
|
class HistoryDeleteResolver : DefaultDeleteResolver<History>() {
|
||||||
|
|
|
@ -38,5 +38,17 @@ interface History : Serializable {
|
||||||
fun create(chapter: Chapter): History = HistoryImpl().apply {
|
fun create(chapter: Chapter): History = HistoryImpl().apply {
|
||||||
this.chapter_id = chapter.id!!
|
this.chapter_id = chapter.id!!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun mapper(
|
||||||
|
id: Long,
|
||||||
|
chapterId: Long,
|
||||||
|
lastRead: Long,
|
||||||
|
timeRead: Long
|
||||||
|
) = HistoryImpl().apply {
|
||||||
|
this.id = id
|
||||||
|
this.chapter_id = chapterId
|
||||||
|
this.last_read = lastRead
|
||||||
|
this.time_read = timeRead
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,8 +221,10 @@ class ReaderViewModel(
|
||||||
*/
|
*/
|
||||||
fun onSaveInstanceState() {
|
fun onSaveInstanceState() {
|
||||||
val currentChapter = getCurrentChapter() ?: return
|
val currentChapter = getCurrentChapter() ?: return
|
||||||
|
viewModelScope.launchNonCancellableIO {
|
||||||
saveChapterProgress(currentChapter)
|
saveChapterProgress(currentChapter)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether this presenter is initialized yet.
|
* Whether this presenter is initialized yet.
|
||||||
|
@ -618,11 +620,13 @@ class ReaderViewModel(
|
||||||
* Called when reader chapter is changed in reader or when activity is paused.
|
* Called when reader chapter is changed in reader or when activity is paused.
|
||||||
*/
|
*/
|
||||||
private fun saveReadingProgress(readerChapter: ReaderChapter) {
|
private fun saveReadingProgress(readerChapter: ReaderChapter) {
|
||||||
|
viewModelScope.launchNonCancellableIO {
|
||||||
db.inTransaction {
|
db.inTransaction {
|
||||||
saveChapterProgress(readerChapter)
|
saveChapterProgress(readerChapter)
|
||||||
saveChapterHistory(readerChapter)
|
saveChapterHistory(readerChapter)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun saveCurrentChapterReadingProgress() = getCurrentChapter()?.let { saveReadingProgress(it) }
|
fun saveCurrentChapterReadingProgress() = getCurrentChapter()?.let { saveReadingProgress(it) }
|
||||||
|
|
||||||
|
@ -631,7 +635,7 @@ class ReaderViewModel(
|
||||||
* If incognito mode isn't on or has at least 1 tracker
|
* If incognito mode isn't on or has at least 1 tracker
|
||||||
*/
|
*/
|
||||||
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
|
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
|
||||||
private fun saveChapterProgress(readerChapter: ReaderChapter) {
|
private suspend fun saveChapterProgress(readerChapter: ReaderChapter) {
|
||||||
readerChapter.requestedPage = readerChapter.chapter.last_page_read
|
readerChapter.requestedPage = readerChapter.chapter.last_page_read
|
||||||
db.getChapter(readerChapter.chapter.id!!).executeAsBlocking()?.let { dbChapter ->
|
db.getChapter(readerChapter.chapter.id!!).executeAsBlocking()?.let { dbChapter ->
|
||||||
readerChapter.chapter.bookmark = dbChapter.bookmark
|
readerChapter.chapter.bookmark = dbChapter.bookmark
|
||||||
|
@ -645,7 +649,7 @@ class ReaderViewModel(
|
||||||
* Saves this [readerChapter] last read history.
|
* Saves this [readerChapter] last read history.
|
||||||
*/
|
*/
|
||||||
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
|
// FIXME: Migrate to SQLDelight, on halt: in StorIO transaction
|
||||||
private fun saveChapterHistory(readerChapter: ReaderChapter) {
|
private suspend fun saveChapterHistory(readerChapter: ReaderChapter) {
|
||||||
if (!preferences.incognitoMode().get()) {
|
if (!preferences.incognitoMode().get()) {
|
||||||
val readAt = Date().time
|
val readAt = Date().time
|
||||||
val sessionReadDuration = chapterReadStartTime?.let { readAt - it } ?: 0
|
val sessionReadDuration = chapterReadStartTime?.let { readAt - it } ?: 0
|
||||||
|
|
|
@ -77,60 +77,6 @@ AND (
|
||||||
ORDER BY C.date_fetch DESC
|
ORDER BY C.date_fetch DESC
|
||||||
LIMIT :limit OFFSET :offset;
|
LIMIT :limit OFFSET :offset;
|
||||||
|
|
||||||
getRecentsUngrouped:
|
|
||||||
SELECT
|
|
||||||
M.*,
|
|
||||||
C.*,
|
|
||||||
H.*
|
|
||||||
FROM mangas AS M
|
|
||||||
JOIN chapters AS C
|
|
||||||
ON M._id = C.manga_id
|
|
||||||
JOIN history AS H
|
|
||||||
ON C._id = H.history_chapter_id
|
|
||||||
AND H.history_last_read > 0
|
|
||||||
LEFT JOIN scanlators_view AS S
|
|
||||||
ON C.manga_id = S.manga_id
|
|
||||||
AND ifnull(C.scanlator, 'N/A') = ifnull(S.name, '/<INVALID>/') -- I assume if it's N/A it shouldn't be filtered
|
|
||||||
WHERE lower(M.title) LIKE '%' || :search || '%'
|
|
||||||
AND (
|
|
||||||
:apply_filter = 0 OR S.name IS NULL
|
|
||||||
)
|
|
||||||
ORDER BY H.history_last_read DESC
|
|
||||||
LIMIT :limit OFFSET :offset;
|
|
||||||
|
|
||||||
getRecentsBySeries:
|
|
||||||
SELECT
|
|
||||||
M.url AS mangaUrl,
|
|
||||||
M.*,
|
|
||||||
C.*,
|
|
||||||
H.*
|
|
||||||
FROM mangas AS M
|
|
||||||
JOIN chapters AS C
|
|
||||||
ON M._id = C.manga_id
|
|
||||||
JOIN history AS H
|
|
||||||
ON C._id = H.history_chapter_id
|
|
||||||
JOIN (
|
|
||||||
SELECT
|
|
||||||
C2.manga_id AS manga_id,
|
|
||||||
C2._id AS history_chapter_id,
|
|
||||||
MAX(H2.history_last_read) AS history_last_read
|
|
||||||
FROM chapters AS C2 JOIN history AS H2
|
|
||||||
ON C2._id = H2.history_chapter_id
|
|
||||||
GROUP BY C2.manga_id
|
|
||||||
) AS max_last_read
|
|
||||||
ON C.manga_id = max_last_read.manga_id
|
|
||||||
AND max_last_read.history_chapter_id = H.history_chapter_id
|
|
||||||
AND max_last_read.history_last_read > 0
|
|
||||||
LEFT JOIN scanlators_view AS S
|
|
||||||
ON C.manga_id = S.manga_id
|
|
||||||
AND ifnull(C.scanlator, 'N/A') = ifnull(S.name, '/<INVALID>/') -- I assume if it's N/A it shouldn't be filtered
|
|
||||||
WHERE lower(M.title) LIKE '%' || :search || '%'
|
|
||||||
AND (
|
|
||||||
:apply_filter = 0 OR S.name IS NULL
|
|
||||||
)
|
|
||||||
ORDER BY max_last_read.history_last_read DESC
|
|
||||||
LIMIT :limit OFFSET :offset;
|
|
||||||
|
|
||||||
getScanlatorsByMangaId:
|
getScanlatorsByMangaId:
|
||||||
SELECT scanlator
|
SELECT scanlator
|
||||||
FROM chapters
|
FROM chapters
|
||||||
|
|
|
@ -8,3 +8,57 @@ CREATE TABLE history(
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE INDEX history_history_chapter_id_index ON history(history_chapter_id);
|
CREATE INDEX history_history_chapter_id_index ON history(history_chapter_id);
|
||||||
|
|
||||||
|
getRecentsUngrouped:
|
||||||
|
SELECT
|
||||||
|
M.*,
|
||||||
|
C.*,
|
||||||
|
H.*
|
||||||
|
FROM mangas AS M
|
||||||
|
JOIN chapters AS C
|
||||||
|
ON M._id = C.manga_id
|
||||||
|
JOIN history AS H
|
||||||
|
ON C._id = H.history_chapter_id
|
||||||
|
AND H.history_last_read > 0
|
||||||
|
LEFT JOIN scanlators_view AS S
|
||||||
|
ON C.manga_id = S.manga_id
|
||||||
|
AND ifnull(C.scanlator, 'N/A') = ifnull(S.name, '/<INVALID>/') -- I assume if it's N/A it shouldn't be filtered
|
||||||
|
WHERE lower(M.title) LIKE '%' || :search || '%'
|
||||||
|
AND (
|
||||||
|
:apply_filter = 0 OR S.name IS NULL
|
||||||
|
)
|
||||||
|
ORDER BY H.history_last_read DESC
|
||||||
|
LIMIT :limit OFFSET :offset;
|
||||||
|
|
||||||
|
getRecentsBySeries:
|
||||||
|
SELECT
|
||||||
|
M.url AS mangaUrl,
|
||||||
|
M.*,
|
||||||
|
C.*,
|
||||||
|
H.*
|
||||||
|
FROM mangas AS M
|
||||||
|
JOIN chapters AS C
|
||||||
|
ON M._id = C.manga_id
|
||||||
|
JOIN history AS H
|
||||||
|
ON C._id = H.history_chapter_id
|
||||||
|
JOIN (
|
||||||
|
SELECT
|
||||||
|
C2.manga_id AS manga_id,
|
||||||
|
C2._id AS history_chapter_id,
|
||||||
|
MAX(H2.history_last_read) AS history_last_read
|
||||||
|
FROM chapters AS C2 JOIN history AS H2
|
||||||
|
ON C2._id = H2.history_chapter_id
|
||||||
|
GROUP BY C2.manga_id
|
||||||
|
) AS max_last_read
|
||||||
|
ON C.manga_id = max_last_read.manga_id
|
||||||
|
AND max_last_read.history_chapter_id = H.history_chapter_id
|
||||||
|
AND max_last_read.history_last_read > 0
|
||||||
|
LEFT JOIN scanlators_view AS S
|
||||||
|
ON C.manga_id = S.manga_id
|
||||||
|
AND ifnull(C.scanlator, 'N/A') = ifnull(S.name, '/<INVALID>/') -- I assume if it's N/A it shouldn't be filtered
|
||||||
|
WHERE lower(M.title) LIKE '%' || :search || '%'
|
||||||
|
AND (
|
||||||
|
:apply_filter = 0 OR S.name IS NULL
|
||||||
|
)
|
||||||
|
ORDER BY max_last_read.history_last_read DESC
|
||||||
|
LIMIT :limit OFFSET :offset;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue