From c4df7b496b0db87b17564a2ab5dc449f271d58bf Mon Sep 17 00:00:00 2001 From: NerdNumber9 Date: Fri, 19 Apr 2019 04:19:07 -0400 Subject: [PATCH] More optimizations to library search --- .../data/database/queries/MangaQueries.kt | 26 +++++++++++++++++++ .../ui/library/LibraryCategoryAdapter.kt | 19 ++++++++++++-- .../ui/library/LibraryCategoryView.kt | 2 +- .../ui/setting/SettingsEhController.kt | 4 +-- .../main/java/exh/eh/EHentaiUpdateWorker.kt | 11 ++------ 5 files changed, 48 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt index 2066cbbcb..e1ca459f2 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/database/queries/MangaQueries.kt @@ -123,4 +123,30 @@ interface MangaQueries : DbProvider { """.trimIndent()) .build()) .prepare() + + fun getFavoriteMangaWithMetadata() = db.get() + .listOfObjects(Manga::class.java) + .withQuery(RawQuery.builder() + .query(""" + SELECT ${MangaTable.TABLE}.* FROM ${MangaTable.TABLE} + INNER JOIN ${SearchMetadataTable.TABLE} + ON ${MangaTable.TABLE}.${MangaTable.COL_ID} = ${SearchMetadataTable.TABLE}.${SearchMetadataTable.COL_MANGA_ID} + WHERE ${MangaTable.TABLE}.${MangaTable.COL_FAVORITE} = 1 + ORDER BY ${MangaTable.TABLE}.${MangaTable.COL_ID} + """.trimIndent()) + .build()) + .prepare() + + fun getIdsOfFavoriteMangaWithMetadata() = db.get() + .cursor() + .withQuery(RawQuery.builder() + .query(""" + SELECT ${MangaTable.TABLE}.${MangaTable.COL_ID} FROM ${MangaTable.TABLE} + INNER JOIN ${SearchMetadataTable.TABLE} + ON ${MangaTable.TABLE}.${MangaTable.COL_ID} = ${SearchMetadataTable.TABLE}.${SearchMetadataTable.COL_MANGA_ID} + WHERE ${MangaTable.TABLE}.${MangaTable.COL_FAVORITE} = 1 + ORDER BY ${MangaTable.TABLE}.${MangaTable.COL_ID} + """.trimIndent()) + .build()) + .prepare() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt index 8ed14accc..e982c3c87 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryAdapter.kt @@ -4,9 +4,11 @@ import com.pushtorefresh.storio.sqlite.queries.RawQuery import eu.davidea.flexibleadapter.FlexibleAdapter import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Manga +import eu.kanade.tachiyomi.data.database.tables.MangaTable import exh.isLewdSource import exh.metadata.sql.tables.SearchMetadataTable import exh.search.SearchEngine +import exh.util.await import exh.util.cancellable import kotlinx.coroutines.* import kotlinx.coroutines.flow.asFlow @@ -78,7 +80,20 @@ class LibraryCategoryAdapter(val view: LibraryCategoryView) : .args(*sqlQuery.second.toTypedArray()) .build()) - val mangaWithMetadata = db.getMangaWithMetadata().executeAsBlocking() + ensureActive() // Fail early when cancelled + + val mangaWithMetaIdsQuery = db.getIdsOfFavoriteMangaWithMetadata().await() + val mangaWithMetaIds = LongArray(mangaWithMetaIdsQuery.count) + if(mangaWithMetaIds.isNotEmpty()) { + val mangaIdCol = mangaWithMetaIdsQuery.getColumnIndex(MangaTable.COL_ID) + mangaWithMetaIdsQuery.moveToFirst() + while (!mangaWithMetaIdsQuery.isAfterLast) { + ensureActive() // Fail early when cancelled + + mangaWithMetaIds[mangaWithMetaIdsQuery.position] = mangaWithMetaIdsQuery.getLong(mangaIdCol) + mangaWithMetaIdsQuery.moveToNext() + } + } ensureActive() // Fail early when cancelled @@ -102,7 +117,7 @@ class LibraryCategoryAdapter(val view: LibraryCategoryView) : val mangaId = item.manga.id ?: -1 if(convertedResult.binarySearch(mangaId) < 0) { // Check if this manga even has metadata - if(mangaWithMetadata.binarySearchBy(mangaId) { it.id } < 0) { + if(mangaWithMetaIds.binarySearch(mangaId) < 0) { // No meta? Filter using title item.filter(savedSearchText) } else false diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt index 7e59afcfe..f9a821c04 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryCategoryView.kt @@ -131,7 +131,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att subscriptions += controller.searchRelay .doOnNext { adapter.searchText = it } .skip(1) - .debounce(250, TimeUnit.MILLISECONDS) + .debounce(500, TimeUnit.MILLISECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe { // EXH --> diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt index 29b7c6948..9c0762979 100755 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsEhController.kt @@ -277,8 +277,8 @@ class SettingsEhController : SettingsController() { "The updater last ran ${Humanize.naturalTime(Date(stats.startTime))}, and checked ${stats.updateCount} out of the ${stats.possibleUpdates} galleries that were ready for checking." } else "The updater has not ran yet." - val allMeta = db.getMangaWithMetadata().await().filter { - it.favorite && (it.source == EH_SOURCE_ID || it.source == EXH_SOURCE_ID) + val allMeta = db.getFavoriteMangaWithMetadata().await().filter { + it.source == EH_SOURCE_ID || it.source == EXH_SOURCE_ID }.mapNotNull { db.getFlatMetadataForManga(it.id!!).await()?.raise() }.toList() diff --git a/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt b/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt index 01b58d052..b785b4e93 100644 --- a/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt +++ b/app/src/main/java/exh/eh/EHentaiUpdateWorker.kt @@ -9,19 +9,15 @@ import android.content.Context import android.os.Build import android.support.annotation.RequiresApi import com.elvishew.xlog.XLog -import com.evernote.android.job.JobRequest import com.google.gson.Gson import com.kizitonwose.time.days import com.kizitonwose.time.hours -import com.kizitonwose.time.minutes import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.models.Chapter -import eu.kanade.tachiyomi.data.database.models.ChapterImpl import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.source.SourceManager -import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.online.all.EHentai import eu.kanade.tachiyomi.util.jobScheduler import eu.kanade.tachiyomi.util.syncChaptersWithSource @@ -29,9 +25,7 @@ import exh.EH_SOURCE_ID import exh.EXH_SOURCE_ID import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.base.* -import exh.metadata.sql.models.SearchMetadata import exh.util.await -import exh.util.awaitSuspending import exh.util.cancellable import kotlinx.coroutines.* import kotlinx.coroutines.flow.* @@ -39,7 +33,6 @@ import rx.schedulers.Schedulers import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import uy.kohesive.injekt.injectLazy -import java.io.IOException import kotlin.coroutines.CoroutineContext @RequiresApi(Build.VERSION_CODES.LOLLIPOP) @@ -128,12 +121,12 @@ class EHentaiUpdateWorker: JobService(), CoroutineScope { val startTime = System.currentTimeMillis() logger.d("Finding manga with metadata...") - val metadataManga = db.getMangaWithMetadata().await() + val metadataManga = db.getFavoriteMangaWithMetadata().await() logger.d("Filtering manga and raising metadata...") val curTime = System.currentTimeMillis() val allMeta = metadataManga.asFlow().cancellable().mapNotNull { manga -> - if (!manga.favorite || (manga.source != EH_SOURCE_ID && manga.source != EXH_SOURCE_ID)) + if (manga.source != EH_SOURCE_ID && manga.source != EXH_SOURCE_ID) return@mapNotNull null val meta = db.getFlatMetadataForManga(manga.id!!).asRxSingle().await()