More optimizations to library search

This commit is contained in:
NerdNumber9 2019-04-19 04:19:07 -04:00
parent 6c4332f5c2
commit c4df7b496b
5 changed files with 48 additions and 14 deletions

View File

@ -123,4 +123,30 @@ interface MangaQueries : DbProvider {
""".trimIndent()) """.trimIndent())
.build()) .build())
.prepare() .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()
} }

View File

@ -4,9 +4,11 @@ import com.pushtorefresh.storio.sqlite.queries.RawQuery
import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.FlexibleAdapter
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Manga import eu.kanade.tachiyomi.data.database.models.Manga
import eu.kanade.tachiyomi.data.database.tables.MangaTable
import exh.isLewdSource import exh.isLewdSource
import exh.metadata.sql.tables.SearchMetadataTable import exh.metadata.sql.tables.SearchMetadataTable
import exh.search.SearchEngine import exh.search.SearchEngine
import exh.util.await
import exh.util.cancellable import exh.util.cancellable
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.asFlow import kotlinx.coroutines.flow.asFlow
@ -78,7 +80,20 @@ class LibraryCategoryAdapter(val view: LibraryCategoryView) :
.args(*sqlQuery.second.toTypedArray()) .args(*sqlQuery.second.toTypedArray())
.build()) .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 ensureActive() // Fail early when cancelled
@ -102,7 +117,7 @@ class LibraryCategoryAdapter(val view: LibraryCategoryView) :
val mangaId = item.manga.id ?: -1 val mangaId = item.manga.id ?: -1
if(convertedResult.binarySearch(mangaId) < 0) { if(convertedResult.binarySearch(mangaId) < 0) {
// Check if this manga even has metadata // Check if this manga even has metadata
if(mangaWithMetadata.binarySearchBy(mangaId) { it.id } < 0) { if(mangaWithMetaIds.binarySearch(mangaId) < 0) {
// No meta? Filter using title // No meta? Filter using title
item.filter(savedSearchText) item.filter(savedSearchText)
} else false } else false

View File

@ -131,7 +131,7 @@ class LibraryCategoryView @JvmOverloads constructor(context: Context, attrs: Att
subscriptions += controller.searchRelay subscriptions += controller.searchRelay
.doOnNext { adapter.searchText = it } .doOnNext { adapter.searchText = it }
.skip(1) .skip(1)
.debounce(250, TimeUnit.MILLISECONDS) .debounce(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe { .subscribe {
// EXH --> // EXH -->

View File

@ -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." "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." } else "The updater has not ran yet."
val allMeta = db.getMangaWithMetadata().await().filter { val allMeta = db.getFavoriteMangaWithMetadata().await().filter {
it.favorite && (it.source == EH_SOURCE_ID || it.source == EXH_SOURCE_ID) it.source == EH_SOURCE_ID || it.source == EXH_SOURCE_ID
}.mapNotNull { }.mapNotNull {
db.getFlatMetadataForManga(it.id!!).await()?.raise<EHentaiSearchMetadata>() db.getFlatMetadataForManga(it.id!!).await()?.raise<EHentaiSearchMetadata>()
}.toList() }.toList()

View File

@ -9,19 +9,15 @@ import android.content.Context
import android.os.Build import android.os.Build
import android.support.annotation.RequiresApi import android.support.annotation.RequiresApi
import com.elvishew.xlog.XLog import com.elvishew.xlog.XLog
import com.evernote.android.job.JobRequest
import com.google.gson.Gson import com.google.gson.Gson
import com.kizitonwose.time.days import com.kizitonwose.time.days
import com.kizitonwose.time.hours import com.kizitonwose.time.hours
import com.kizitonwose.time.minutes
import eu.kanade.tachiyomi.data.database.DatabaseHelper import eu.kanade.tachiyomi.data.database.DatabaseHelper
import eu.kanade.tachiyomi.data.database.models.Chapter 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.database.models.Manga
import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.preference.getOrDefault
import eu.kanade.tachiyomi.source.SourceManager 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.source.online.all.EHentai
import eu.kanade.tachiyomi.util.jobScheduler import eu.kanade.tachiyomi.util.jobScheduler
import eu.kanade.tachiyomi.util.syncChaptersWithSource import eu.kanade.tachiyomi.util.syncChaptersWithSource
@ -29,9 +25,7 @@ import exh.EH_SOURCE_ID
import exh.EXH_SOURCE_ID import exh.EXH_SOURCE_ID
import exh.metadata.metadata.EHentaiSearchMetadata import exh.metadata.metadata.EHentaiSearchMetadata
import exh.metadata.metadata.base.* import exh.metadata.metadata.base.*
import exh.metadata.sql.models.SearchMetadata
import exh.util.await import exh.util.await
import exh.util.awaitSuspending
import exh.util.cancellable import exh.util.cancellable
import kotlinx.coroutines.* import kotlinx.coroutines.*
import kotlinx.coroutines.flow.* import kotlinx.coroutines.flow.*
@ -39,7 +33,6 @@ import rx.schedulers.Schedulers
import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get import uy.kohesive.injekt.api.get
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.io.IOException
import kotlin.coroutines.CoroutineContext import kotlin.coroutines.CoroutineContext
@RequiresApi(Build.VERSION_CODES.LOLLIPOP) @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
@ -128,12 +121,12 @@ class EHentaiUpdateWorker: JobService(), CoroutineScope {
val startTime = System.currentTimeMillis() val startTime = System.currentTimeMillis()
logger.d("Finding manga with metadata...") logger.d("Finding manga with metadata...")
val metadataManga = db.getMangaWithMetadata().await() val metadataManga = db.getFavoriteMangaWithMetadata().await()
logger.d("Filtering manga and raising metadata...") logger.d("Filtering manga and raising metadata...")
val curTime = System.currentTimeMillis() val curTime = System.currentTimeMillis()
val allMeta = metadataManga.asFlow().cancellable().mapNotNull { manga -> 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 return@mapNotNull null
val meta = db.getFlatMetadataForManga(manga.id!!).asRxSingle().await() val meta = db.getFlatMetadataForManga(manga.id!!).asRxSingle().await()