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