diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestAuthorDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestAuthorDao.kt index 84a27fd28..a740f4a4e 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestAuthorDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestAuthorDao.kt @@ -57,6 +57,10 @@ class TestAuthorDao : AuthorDao { throw NotImplementedError("Unused in tests") } + override suspend fun upsertAuthors(entities: List) { + entitiesStateFlow.value = entities + } + override suspend fun deleteAuthors(ids: List) { val idSet = ids.toSet() entitiesStateFlow.update { entities -> diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt index c5e24419d..a91c0fc87 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestNewsResourceDao.kt @@ -85,6 +85,10 @@ class TestNewsResourceDao : NewsResourceDao { throw NotImplementedError("Unused in tests") } + override suspend fun upsertNewsResources(newsResourceEntities: List) { + entitiesStateFlow.value = newsResourceEntities + } + override suspend fun insertOrIgnoreTopicCrossRefEntities( newsResourceTopicCrossReferences: List ) { diff --git a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt index 20eb00645..50910ddd2 100644 --- a/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt +++ b/core/data/src/test/java/com/google/samples/apps/nowinandroid/core/data/testdoubles/TestTopicDao.kt @@ -62,6 +62,10 @@ class TestTopicDao : TopicDao { throw NotImplementedError("Unused in tests") } + override suspend fun upsertTopics(entities: List) { + entitiesStateFlow.value = entities + } + override suspend fun deleteTopics(ids: List) { val idSet = ids.toSet() entitiesStateFlow.update { entities -> diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/AuthorDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/AuthorDao.kt index 8c3726ed1..9790040f7 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/AuthorDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/AuthorDao.kt @@ -20,8 +20,8 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import androidx.room.Transaction import androidx.room.Update +import androidx.room.Upsert import com.google.samples.apps.nowinandroid.core.database.model.AuthorEntity import kotlinx.coroutines.flow.Flow @@ -56,12 +56,8 @@ interface AuthorDao { /** * Inserts or updates [entities] in the db under the specified primary keys */ - @Transaction - suspend fun upsertAuthors(entities: List) = upsert( - items = entities, - insertMany = ::insertOrIgnoreAuthors, - updateMany = ::updateAuthors - ) + @Upsert + suspend fun upsertAuthors(entities: List) /** * Deletes rows in the db matching the specified [ids] diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt index 8200712bc..46f6b62f9 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/NewsResourceDao.kt @@ -22,6 +22,7 @@ import androidx.room.OnConflictStrategy import androidx.room.Query import androidx.room.Transaction import androidx.room.Update +import androidx.room.Upsert import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceAuthorCrossRef import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceEntity import com.google.samples.apps.nowinandroid.core.database.model.NewsResourceTopicCrossRef @@ -80,12 +81,8 @@ interface NewsResourceDao { /** * Inserts or updates [newsResourceEntities] in the db under the specified primary keys */ - @Transaction - suspend fun upsertNewsResources(newsResourceEntities: List) = upsert( - items = newsResourceEntities, - insertMany = ::insertOrIgnoreNewsResources, - updateMany = ::updateNewsResources - ) + @Upsert + suspend fun upsertNewsResources(newsResourceEntities: List) @Insert(onConflict = OnConflictStrategy.IGNORE) suspend fun insertOrIgnoreTopicCrossRefEntities( diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt index d03fd6a30..2728d5591 100644 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt +++ b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/TopicDao.kt @@ -20,8 +20,8 @@ import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import androidx.room.Transaction import androidx.room.Update +import androidx.room.Upsert import com.google.samples.apps.nowinandroid.core.database.model.TopicEntity import kotlinx.coroutines.flow.Flow @@ -64,12 +64,8 @@ interface TopicDao { /** * Inserts or updates [entities] in the db under the specified primary keys */ - @Transaction - suspend fun upsertTopics(entities: List) = upsert( - items = entities, - insertMany = ::insertOrIgnoreTopics, - updateMany = ::updateTopics - ) + @Upsert + suspend fun upsertTopics(entities: List) /** * Deletes rows in the db matching the specified [ids] diff --git a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/UpsertHelper.kt b/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/UpsertHelper.kt deleted file mode 100644 index acf076434..000000000 --- a/core/database/src/main/java/com/google/samples/apps/nowinandroid/core/database/dao/UpsertHelper.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.google.samples.apps.nowinandroid.core.database.dao - -/** - * Performs an upsert by first attempting to insert [items] using [insertMany] with the the result - * of the inserts returned. - * - * Items that were not inserted due to conflicts are then updated using [updateMany] - */ -suspend fun upsert( - items: List, - insertMany: suspend (List) -> List, - updateMany: suspend (List) -> Unit, -) { - val insertResults = insertMany(items) - - val updateList = items.zip(insertResults) - .mapNotNull { (item, insertResult) -> - if (insertResult == -1L) item else null - } - if (updateList.isNotEmpty()) updateMany(updateList) -} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 692a84c66..fe34f3da8 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -46,7 +46,7 @@ protobuf = "3.21.5" protobufPlugin = "0.8.19" retrofit = "2.9.0" retrofitKotlinxSerializationJson = "0.8.0" -room = "2.4.3" +room = "2.5.0-alpha03" secrets = "2.0.1" turbine = "0.8.0"