Refresh News-Topics cross references according to the data loaded from network

Change-Id: Ic0fa18ccf53828d6333dc8d4d797ad9f2770fb5e
update-upsert-query
Neelansh Sahai 11 months ago
parent 0a20cb729b
commit f4b25d495e

@ -99,6 +99,9 @@ class OfflineFirstNewsRepository @Inject constructor(
niaPreferencesDataSource.setNewsResourcesViewed(changedIds, true)
}
// Fetch all the cross references
val allCrossReferences = newsResourceDao.fetchAllCrossReferences()
// Obtain the news resources which have changed from the network and upsert them locally
changedIds.chunked(SYNC_BATCH_SIZE).forEach { chunkedIds ->
val networkNewsResources = network.getNewsResources(ids = chunkedIds)
@ -116,12 +119,22 @@ class OfflineFirstNewsRepository @Inject constructor(
NetworkNewsResource::asEntity,
),
)
val dataDiff = allCrossReferences.subtract(
networkNewsResources.map(NetworkNewsResource::topicCrossReferences)
.distinct()
.flatten()
.toSet()
)
newsResourceDao.insertOrIgnoreTopicCrossRefEntities(
newsResourceTopicCrossReferences = networkNewsResources
.map(NetworkNewsResource::topicCrossReferences)
.distinct()
.flatten(),
)
newsResourceDao.deleteCrossReferences(dataDiff.toList())
}
if (hasOnboarded) {

@ -17,6 +17,7 @@
package com.google.samples.apps.nowinandroid.core.database.dao
import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
@ -113,6 +114,12 @@ interface NewsResourceDao {
newsResourceTopicCrossReferences: List<NewsResourceTopicCrossRef>,
)
@Query("SELECT * from news_resources_topics")
suspend fun fetchAllCrossReferences(): List<NewsResourceTopicCrossRef>
@Delete
suspend fun deleteCrossReferences(list: List<NewsResourceTopicCrossRef>)
/**
* Deletes rows in the db matching the specified [ids]
*/

Loading…
Cancel
Save