|
|
|
@ -16,6 +16,7 @@
|
|
|
|
|
|
|
|
|
|
package com.google.samples.apps.nowinandroid.core.data.repository
|
|
|
|
|
|
|
|
|
|
import androidx.tracing.trace
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceDao
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.database.dao.NewsResourceFtsDao
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.database.dao.TopicDao
|
|
|
|
@ -25,6 +26,7 @@ import com.google.samples.apps.nowinandroid.core.database.model.asExternalModel
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.database.model.asFtsEntity
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.model.data.SearchResult
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.Dispatcher
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.Default
|
|
|
|
|
import com.google.samples.apps.nowinandroid.core.network.NiaDispatchers.IO
|
|
|
|
|
import kotlinx.coroutines.CoroutineDispatcher
|
|
|
|
|
import kotlinx.coroutines.flow.Flow
|
|
|
|
@ -32,6 +34,7 @@ import kotlinx.coroutines.flow.combine
|
|
|
|
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
|
|
|
|
import kotlinx.coroutines.flow.first
|
|
|
|
|
import kotlinx.coroutines.flow.flatMapLatest
|
|
|
|
|
import kotlinx.coroutines.flow.flowOn
|
|
|
|
|
import kotlinx.coroutines.flow.mapLatest
|
|
|
|
|
import kotlinx.coroutines.withContext
|
|
|
|
|
import javax.inject.Inject
|
|
|
|
@ -42,6 +45,7 @@ internal class DefaultSearchContentsRepository @Inject constructor(
|
|
|
|
|
private val topicDao: TopicDao,
|
|
|
|
|
private val topicFtsDao: TopicFtsDao,
|
|
|
|
|
@Dispatcher(IO) private val ioDispatcher: CoroutineDispatcher,
|
|
|
|
|
@Dispatcher(Default) private val defaultDispatcher: CoroutineDispatcher,
|
|
|
|
|
) : SearchContentsRepository {
|
|
|
|
|
|
|
|
|
|
override suspend fun populateFtsData() {
|
|
|
|
@ -75,11 +79,13 @@ internal class DefaultSearchContentsRepository @Inject constructor(
|
|
|
|
|
.distinctUntilChanged()
|
|
|
|
|
.flatMapLatest(topicDao::getTopicEntities)
|
|
|
|
|
return combine(newsResourcesFlow, topicsFlow) { newsResources, topics ->
|
|
|
|
|
trace("DefaultSearchContentsRepository.searchContents") {
|
|
|
|
|
SearchResult(
|
|
|
|
|
topics = topics.map { it.asExternalModel() },
|
|
|
|
|
newsResources = newsResources.map { it.asExternalModel() },
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}.flowOn(defaultDispatcher)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
override fun getSearchContentsCount(): Flow<Int> =
|
|
|
|
@ -87,6 +93,8 @@ internal class DefaultSearchContentsRepository @Inject constructor(
|
|
|
|
|
newsResourceFtsDao.getCount(),
|
|
|
|
|
topicFtsDao.getCount(),
|
|
|
|
|
) { newsResourceCount, topicsCount ->
|
|
|
|
|
trace("DefaultSearchContentsRepository.getSearchContentsCount") {
|
|
|
|
|
newsResourceCount + topicsCount
|
|
|
|
|
}
|
|
|
|
|
}.flowOn(defaultDispatcher)
|
|
|
|
|
}
|
|
|
|
|