Skip to content

Commit 805914d

Browse files
committed
Call getNewsResourceIds instead of getNewsResources
1 parent 7b6c3a1 commit 805914d

File tree

3 files changed

+55
-4
lines changed

3 files changed

+55
-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: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,33 @@ interface NewsResourceDao {
6565
filterNewsIds: Set<String> = emptySet(),
6666
): Flow<List<PopulatedNewsResource>>
6767

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

0 commit comments

Comments
 (0)