From 4d6188e7abff089ab4039343e010d4347a1aa3aa Mon Sep 17 00:00:00 2001 From: Adetunji Dahunsi Date: Tue, 21 Feb 2023 17:00:40 -0500 Subject: [PATCH] Batch sync news resources from remote Batch sync news resources from remote to reduce json payload size. --- .../repository/OfflineFirstNewsRepository.kt | 41 +++++++++++-------- 1 file changed, 23 insertions(+), 18 deletions(-) diff --git a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt index 9e419b485..ae3ad3b9c 100644 --- a/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt +++ b/core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt @@ -34,6 +34,8 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map import javax.inject.Inject +private const val SYNC_BATCH_SIZE = 40 + /** * Disk storage backed implementation of the [NewsRepository]. * Reads are exclusively from local storage to support offline access. @@ -65,26 +67,29 @@ class OfflineFirstNewsRepository @Inject constructor( }, modelDeleter = newsResourceDao::deleteNewsResources, modelUpdater = { changedIds -> - val networkNewsResources = network.getNewsResources(ids = changedIds) + changedIds.chunked(SYNC_BATCH_SIZE).forEach { chunkedIds + val networkNewsResources = network.getNewsResources(ids = chunkedIds) - // Order of invocation matters to satisfy id and foreign key constraints! + // Order of invocation matters to satisfy id and foreign key constraints! - topicDao.insertOrIgnoreTopics( - topicEntities = networkNewsResources - .map(NetworkNewsResource::topicEntityShells) - .flatten() - .distinctBy(TopicEntity::id), - ) - newsResourceDao.upsertNewsResources( - newsResourceEntities = networkNewsResources - .map(NetworkNewsResource::asEntity), - ) - newsResourceDao.insertOrIgnoreTopicCrossRefEntities( - newsResourceTopicCrossReferences = networkNewsResources - .map(NetworkNewsResource::topicCrossReferences) - .distinct() - .flatten(), - ) + topicDao.insertOrIgnoreTopics( + topicEntities = networkNewsResources + .map(NetworkNewsResource::topicEntityShells) + .flatten() + .distinctBy(TopicEntity::id), + ) + newsResourceDao.upsertNewsResources( + newsResourceEntities = networkNewsResources.map( + NetworkNewsResource::asEntity + ), + ) + newsResourceDao.insertOrIgnoreTopicCrossRefEntities( + newsResourceTopicCrossReferences = networkNewsResources + .map(NetworkNewsResource::topicCrossReferences) + .distinct() + .flatten(), + ) + } }, ) }