mirror of
https://gitlab.futo.org/videostreaming/grayjay.git
synced 2025-08-05 15:49:22 +00:00
QueryIn support, channel cache query grouped
This commit is contained in:
parent
cbf2712654
commit
06c39ce973
4 changed files with 87 additions and 11 deletions
|
@ -1,6 +1,7 @@
|
||||||
package com.futo.platformplayer
|
package com.futo.platformplayer
|
||||||
|
|
||||||
import androidx.test.platform.app.InstrumentationRegistry
|
import androidx.test.platform.app.InstrumentationRegistry
|
||||||
|
import com.futo.platformplayer.api.media.models.contents.IPlatformContent
|
||||||
import com.futo.platformplayer.stores.db.ManagedDBDescriptor
|
import com.futo.platformplayer.stores.db.ManagedDBDescriptor
|
||||||
import com.futo.platformplayer.stores.db.ManagedDBStore
|
import com.futo.platformplayer.stores.db.ManagedDBStore
|
||||||
import com.futo.platformplayer.testing.DBTOs
|
import com.futo.platformplayer.testing.DBTOs
|
||||||
|
@ -288,6 +289,24 @@ class ManagedDBStoreTests {
|
||||||
Assert.assertEquals(34, results.size);
|
Assert.assertEquals(34, results.size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@Test
|
||||||
|
fun queryIn() {
|
||||||
|
val ids = mutableListOf<String>()
|
||||||
|
testQuery(1100, { i, testObject ->
|
||||||
|
testObject.someNum = i;
|
||||||
|
ids.add(testObject.someStr);
|
||||||
|
}) {
|
||||||
|
val pager = it.queryInPager(DBTOs.TestIndex::someString, ids.take(1000), 65);
|
||||||
|
val list = mutableListOf<Any>();
|
||||||
|
list.addAll(pager.getResults());
|
||||||
|
while(pager.hasMorePages())
|
||||||
|
{
|
||||||
|
pager.nextPage();
|
||||||
|
list.addAll(pager.getResults());
|
||||||
|
}
|
||||||
|
Assert.assertEquals(1000, list.size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
private fun testQuery(items: Int, modifier: (Int, DBTOs.TestObject)->Unit, testing: (ManagedDBStore<DBTOs.TestIndex, DBTOs.TestObject, DBTOs.DB, DBTOs.DBDAO>)->Unit) {
|
private fun testQuery(items: Int, modifier: (Int, DBTOs.TestObject)->Unit, testing: (ManagedDBStore<DBTOs.TestIndex, DBTOs.TestObject, DBTOs.DB, DBTOs.DBDAO>)->Unit) {
|
||||||
|
|
|
@ -40,6 +40,8 @@ import kotlinx.serialization.Serializable
|
||||||
import kotlinx.serialization.encodeToString
|
import kotlinx.serialization.encodeToString
|
||||||
import kotlinx.serialization.json.Json
|
import kotlinx.serialization.json.Json
|
||||||
import java.time.OffsetDateTime
|
import java.time.OffsetDateTime
|
||||||
|
import kotlin.system.measureTimeMillis
|
||||||
|
import kotlin.time.measureTime
|
||||||
|
|
||||||
class SubscriptionsFeedFragment : MainFragment() {
|
class SubscriptionsFeedFragment : MainFragment() {
|
||||||
override val isMainView : Boolean = true;
|
override val isMainView : Boolean = true;
|
||||||
|
@ -309,9 +311,12 @@ class SubscriptionsFeedFragment : MainFragment() {
|
||||||
|
|
||||||
private fun loadCache() {
|
private fun loadCache() {
|
||||||
fragment.lifecycleScope.launch(Dispatchers.IO) {
|
fragment.lifecycleScope.launch(Dispatchers.IO) {
|
||||||
|
val cachePager: IPager<IPlatformContent>;
|
||||||
Logger.i(TAG, "Subscriptions retrieving cache");
|
Logger.i(TAG, "Subscriptions retrieving cache");
|
||||||
val cachePager = StateCache.instance.getSubscriptionCachePager();
|
val time = measureTimeMillis {
|
||||||
Logger.i(TAG, "Subscriptions retrieved cache");
|
cachePager = StateCache.instance.getSubscriptionCachePager();
|
||||||
|
}
|
||||||
|
Logger.i(TAG, "Subscriptions retrieved cache (${time}ms)");
|
||||||
|
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
val results = cachePager.getResults();
|
val results = cachePager.getResults();
|
||||||
|
|
|
@ -39,12 +39,23 @@ class StateCache {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getChannelCachePager(channelUrl: String): IPager<IPlatformContent> {
|
fun getChannelCachePager(channelUrl: String): IPager<IPlatformContent> {
|
||||||
return _subscriptionCache.queryPager(DBSubscriptionCache.Index::channelUrl, channelUrl, 20) {
|
val result: IPager<IPlatformContent>;
|
||||||
if(it.objOrNull?.contentType == ContentType.POST)
|
val time = measureTimeMillis {
|
||||||
Logger.i(TAG, "FOUND CACHED POST\n (${it.objOrNull?.name})");
|
result = _subscriptionCache.queryPager(DBSubscriptionCache.Index::channelUrl, channelUrl, 20) {
|
||||||
it.obj;
|
it.obj;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
fun getAllChannelCachePager(channelUrls: List<String>): IPager<IPlatformContent> {
|
||||||
|
val result: IPager<IPlatformContent>;
|
||||||
|
val time = measureTimeMillis {
|
||||||
|
result = _subscriptionCache.queryInPager(DBSubscriptionCache.Index::channelUrl, channelUrls, 20) {
|
||||||
|
it.obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
fun getChannelCachePager(channelUrls: List<String>): IPager<IPlatformContent> {
|
fun getChannelCachePager(channelUrls: List<String>): IPager<IPlatformContent> {
|
||||||
val pagers = MultiChronoContentPager(channelUrls.map { _subscriptionCache.queryPager(DBSubscriptionCache.Index::channelUrl, it, 20) {
|
val pagers = MultiChronoContentPager(channelUrls.map { _subscriptionCache.queryPager(DBSubscriptionCache.Index::channelUrl, it, 20) {
|
||||||
it.obj;
|
it.obj;
|
||||||
|
@ -64,12 +75,20 @@ class StateCache {
|
||||||
}.flatten().distinct();
|
}.flatten().distinct();
|
||||||
|
|
||||||
Logger.i(TAG, "Subscriptions CachePager get pagers");
|
Logger.i(TAG, "Subscriptions CachePager get pagers");
|
||||||
val pagers = allUrls.parallelStream()
|
val pagers: List<IPager<IPlatformContent>>;
|
||||||
.map { getChannelCachePager(it) }
|
|
||||||
.asSequence()
|
|
||||||
.toList();
|
|
||||||
|
|
||||||
Logger.i(TAG, "Subscriptions CachePager compiling");
|
val timeCacheRetrieving = measureTimeMillis {
|
||||||
|
pagers = listOf(getAllChannelCachePager(allUrls));
|
||||||
|
|
||||||
|
/*allUrls.parallelStream()
|
||||||
|
.map {
|
||||||
|
getChannelCachePager(it)
|
||||||
|
}
|
||||||
|
.asSequence()
|
||||||
|
.toList();*/
|
||||||
|
}
|
||||||
|
|
||||||
|
Logger.i(TAG, "Subscriptions CachePager compiling (retrieved in ${timeCacheRetrieving}ms)");
|
||||||
val pager = MultiChronoContentPager(pagers, false, 20);
|
val pager = MultiChronoContentPager(pagers, false, 20);
|
||||||
pager.initialize();
|
pager.initialize();
|
||||||
Logger.i(TAG, "Subscriptions CachePager compiled");
|
Logger.i(TAG, "Subscriptions CachePager compiled");
|
||||||
|
|
|
@ -265,6 +265,7 @@ class ManagedDBStore<I: ManagedDBIndex<T>, T, D: ManagedDBDatabase<T, I, DA>, DA
|
||||||
return deserializeIndexes(dbDaoBase.getMultiple(query));
|
return deserializeIndexes(dbDaoBase.getMultiple(query));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
fun queryLikePage(field: KProperty<*>, obj: String, page: Int, pageSize: Int): List<I> = queryLikePage(validateFieldName(field), obj, page, pageSize);
|
fun queryLikePage(field: KProperty<*>, obj: String, page: Int, pageSize: Int): List<I> = queryLikePage(validateFieldName(field), obj, page, pageSize);
|
||||||
fun queryLikePage(field: String, obj: String, page: Int, pageSize: Int): List<I> {
|
fun queryLikePage(field: String, obj: String, page: Int, pageSize: Int): List<I> {
|
||||||
val queryStr = "SELECT * FROM ${descriptor.table_name} WHERE ${field} LIKE ? ${_orderSQL} LIMIT ? OFFSET ?";
|
val queryStr = "SELECT * FROM ${descriptor.table_name} WHERE ${field} LIKE ? ${_orderSQL} LIMIT ? OFFSET ?";
|
||||||
|
@ -289,6 +290,38 @@ class ManagedDBStore<I: ManagedDBIndex<T>, T, D: ManagedDBDatabase<T, I, DA>, DA
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun queryInPage(field: KProperty<*>, obj: List<String>, page: Int, pageSize: Int): List<I> = queryInPage(validateFieldName(field), obj, page, pageSize);
|
||||||
|
fun queryInPage(field: String, obj: List<String>, page: Int, pageSize: Int): List<I> {
|
||||||
|
val queryStr = "SELECT * FROM ${descriptor.table_name} WHERE ${field} IN (${obj.joinToString(",") { "?" }}) ${_orderSQL} LIMIT ? OFFSET ?";
|
||||||
|
val query = SimpleSQLiteQuery(queryStr, (obj + arrayOf(pageSize, page * pageSize)).toTypedArray());
|
||||||
|
return deserializeIndexes(dbDaoBase.getMultiple(query));
|
||||||
|
}
|
||||||
|
fun queryInObjectPage(field: String, obj: List<String>, page: Int, pageSize: Int): List<T> {
|
||||||
|
return convertObjects(queryInPage(field, obj, page, pageSize));
|
||||||
|
}
|
||||||
|
fun queryInPager(field: KProperty<*>, obj: List<String>, pageSize: Int): IPager<I> = queryInPager(validateFieldName(field), obj, pageSize);
|
||||||
|
fun queryInPager(field: String, obj: List<String>, pageSize: Int): IPager<I> {
|
||||||
|
return AdhocPager({
|
||||||
|
Logger.i("ManagedDBStore", "Next Page [query: ${obj}](${it}) ${pageSize}");
|
||||||
|
queryInPage(field, obj, it - 1, pageSize);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
fun queryInObjectPager(field: KProperty<*>, obj: List<String>, pageSize: Int): IPager<T> = queryInObjectPager(validateFieldName(field), obj, pageSize);
|
||||||
|
fun queryInObjectPager(field: String, obj: List<String>, pageSize: Int): IPager<T> {
|
||||||
|
return AdhocPager({
|
||||||
|
Logger.i("ManagedDBStore", "Next Page [query: ${obj}](${it}) ${pageSize}");
|
||||||
|
queryInObjectPage(field, obj, it - 1, pageSize);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
fun <X> queryInPager(field: KProperty<*>, obj: List<String>, pageSize: Int, convert: (I)->X): IPager<X> = queryInPager(validateFieldName(field), obj, pageSize, convert);
|
||||||
|
fun <X> queryInPager(field: String, obj: List<String>, pageSize: Int, convert: (I)->X): IPager<X> {
|
||||||
|
return AdhocPager({
|
||||||
|
queryInPage(field, obj, it - 1, pageSize).map(convert);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
fun queryLikePager(field: KProperty<*>, obj: String, pageSize: Int): IPager<I> = queryLikePager(validateFieldName(field), obj, pageSize);
|
fun queryLikePager(field: KProperty<*>, obj: String, pageSize: Int): IPager<I> = queryLikePager(validateFieldName(field), obj, pageSize);
|
||||||
fun queryLikePager(field: String, obj: String, pageSize: Int): IPager<I> {
|
fun queryLikePager(field: String, obj: String, pageSize: Int): IPager<I> {
|
||||||
return AdhocPager({
|
return AdhocPager({
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue