Skip to content

Commit 48041fc

Browse files
authored
Merge pull request #835 from blackbracken/avoid_retrieving_unnecessary_entity
Call getNewsResourceIds instead of getNewsResources
2 parents 0c542b4 + b570be2 commit 48041fc

File tree

3 files changed

+59
-4
lines changed

3 files changed

+59
-4
lines changed

core/data/src/main/java/com/google/samples/apps/nowinandroid/core/data/repository/OfflineFirstNewsRepository.kt

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,14 @@ class OfflineFirstNewsRepository @Inject constructor(
8080
val hasOnboarded = userData.shouldHideOnboarding
8181
val followedTopicIds = userData.followedTopics
8282

83-
// TODO: Make this more efficient, there is no need to retrieve populated
84-
// news resources when all that's needed are the ids
8583
val existingNewsResourceIdsThatHaveChanged = when {
86-
hasOnboarded -> newsResourceDao.getNewsResources(
84+
hasOnboarded -> newsResourceDao.getNewsResourceIds(
8785
useFilterTopicIds = true,
8886
filterTopicIds = followedTopicIds,
8987
useFilterNewsIds = true,
9088
filterNewsIds = changedIds.toSet(),
9189
)
9290
.first()
93-
.map { it.entity.id }
9491
.toSet()
9592
// No need to retrieve anything if notifications won't be sent
9693
else -> emptySet()

core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,33 @@ class TestNewsResourceDao : NewsResourceDao {
6767
result
6868
}
6969

70+
override fun getNewsResourceIds(
71+
useFilterTopicIds: Boolean,
72+
filterTopicIds: Set<String>,
73+
useFilterNewsIds: Boolean,
74+
filterNewsIds: Set<String>,
75+
): Flow<List<String>> =
76+
entitiesStateFlow
77+
.map { newsResourceEntities ->
78+
newsResourceEntities.map { entity ->
79+
entity.asPopulatedNewsResource(topicCrossReferences)
80+
}
81+
}
82+
.map { resources ->
83+
var result = resources
84+
if (useFilterTopicIds) {
85+
result = result.filter { resource ->
86+
resource.topics.any { it.id in filterTopicIds }
87+
}
88+
}
89+
if (useFilterNewsIds) {
90+
result = result.filter { resource ->
91+
resource.entity.id in filterNewsIds
92+
}
93+
}
94+
result.map { it.entity.id }
95+
}
96+
7097
override suspend fun insertOrIgnoreNewsResources(
7198
entities: List<NewsResourceEntity>,
7299
): List<Long> {

core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,37 @@ interface NewsResourceDao {
6565
filterNewsIds: Set<String> = emptySet(),
6666
): Flow<List<PopulatedNewsResource>>
6767

68+
/**
69+
* Fetches ids of news resources that match the query parameters
70+
*/
71+
@Transaction
72+
@Query(
73+
value = """
74+
SELECT id FROM news_resources
75+
WHERE
76+
CASE WHEN :useFilterNewsIds
77+
THEN id IN (:filterNewsIds)
78+
ELSE 1
79+
END
80+
AND
81+
CASE WHEN :useFilterTopicIds
82+
THEN id IN
83+
(
84+
SELECT news_resource_id FROM news_resources_topics
85+
WHERE topic_id IN (:filterTopicIds)
86+
)
87+
ELSE 1
88+
END
89+
ORDER BY publish_date DESC
90+
""",
91+
)
92+
fun getNewsResourceIds(
93+
useFilterTopicIds: Boolean = false,
94+
filterTopicIds: Set<String> = emptySet(),
95+
useFilterNewsIds: Boolean = false,
96+
filterNewsIds: Set<String> = emptySet(),
97+
): Flow<List<String>>
98+
6899
/**
69100
* Inserts [entities] into the db if they don't exist, and ignores those that do
70101
*/

0 commit comments

Comments
 (0)