From b6f2647728f7eaa64a17e0e9e0797224b0175591 Mon Sep 17 00:00:00 2001 From: Jaehwa Noh Date: Thu, 1 Jan 2026 18:08:39 +0900 Subject: [PATCH] Change an insert logic of newsResourceFts. Change-Id: I09fa6c445b142072e9fba6923fbd51fbe372cacf --- .../DefaultSearchContentsRepository.kt | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt index 7cd3a6130..b1b3634be 100644 --- a/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt +++ b/core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/repository/DefaultSearchContentsRepository.kt @@ -20,7 +20,6 @@ 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 import com.google.samples.apps.nowinandroid.core.database.dao.TopicFtsDao -import com.google.samples.apps.nowinandroid.core.database.model.PopulatedNewsResource 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 @@ -46,14 +45,36 @@ internal class DefaultSearchContentsRepository @Inject constructor( override suspend fun populateFtsData() { withContext(ioDispatcher) { - newsResourceFtsDao.insertAll( - newsResourceDao.getNewsResources( - useFilterTopicIds = false, - useFilterNewsIds = false, - ) - .first() - .map(PopulatedNewsResource::asFtsEntity), + newsResourceDao.getNewsResources( + useFilterTopicIds = false, + useFilterNewsIds = false, ) + .first() + .forEach { populatedNewsResource -> + val oldNewsResourceFtsEntities = + newsResourceFtsDao.getFtsEntitiesById(populatedNewsResource.entity.id) + val size = oldNewsResourceFtsEntities.size + + val newsResourceFtsEntity = populatedNewsResource.asFtsEntity() + + if (size == 0) { + newsResourceFtsDao.insert(newsResourceFtsEntity) + return@forEach + } + + // Do it for migration, multiple same id entity exists in the fts database. + if (size > 1) { + newsResourceFtsDao.deleteById(newsResourceFtsEntity.newsResourceId) + newsResourceFtsDao.insert(newsResourceFtsEntity) + return@forEach + } + + newsResourceFtsDao.update( + title = newsResourceFtsEntity.title, + content = newsResourceFtsEntity.content, + newsResourceId = newsResourceFtsEntity.newsResourceId, + ) + } topicDao.getOneOffTopicEntities().forEach { topicEntity -> @@ -65,6 +86,7 @@ internal class DefaultSearchContentsRepository @Inject constructor( return@forEach } + // Do it for migration, multiple same id entity exists in the fts database. if (size > 1) { topicFtsDao.deleteById(topicEntity.id) topicFtsDao.insert(topicEntity.asFtsEntity())