More optimizations to library search
This commit is contained in:
parent
6c4332f5c2
commit
c4df7b496b
@ -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()
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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 -->
|
||||
|
@ -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<EHentaiSearchMetadata>()
|
||||
}.toList()
|
||||
|
@ -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()
|
||||
|
Loading…
x
Reference in New Issue
Block a user