From d871fa3c1ef1ecef17fa7c0871c80734c6abcf9f Mon Sep 17 00:00:00 2001 From: Martin Ndegwa Date: Wed, 4 Sep 2024 20:34:12 +0300 Subject: [PATCH] Parallelize DB resource deserialization to Optimize Database API --- .../google/android/fhir/db/impl/DatabaseImpl.kt | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/engine/src/main/java/com/google/android/fhir/db/impl/DatabaseImpl.kt b/engine/src/main/java/com/google/android/fhir/db/impl/DatabaseImpl.kt index cf8ab22c07..ef8156e790 100644 --- a/engine/src/main/java/com/google/android/fhir/db/impl/DatabaseImpl.kt +++ b/engine/src/main/java/com/google/android/fhir/db/impl/DatabaseImpl.kt @@ -40,6 +40,9 @@ import com.google.android.fhir.search.SearchQuery import com.google.android.fhir.toLocalChange import java.time.Instant import java.util.UUID +import kotlinx.coroutines.async +import kotlinx.coroutines.awaitAll +import kotlinx.coroutines.coroutineScope import org.hl7.fhir.r4.model.Resource import org.hl7.fhir.r4.model.ResourceType @@ -205,7 +208,7 @@ internal class DatabaseImpl( query: SearchQuery, ): List> { return db.withTransaction { - resourceDao.getResources(SimpleSQLiteQuery(query.query, query.args.toTypedArray())).map { + resourceDao.getResources(SimpleSQLiteQuery(query.query, query.args.toTypedArray())).pmap { ResourceWithUUID(it.uuid, iParser.parseResource(it.serializedResource) as R) } } @@ -217,7 +220,7 @@ internal class DatabaseImpl( return db.withTransaction { resourceDao .getForwardReferencedResources(SimpleSQLiteQuery(query.query, query.args.toTypedArray())) - .map { + .pmap { ForwardIncludeSearchResult( it.matchingIndex, it.baseResourceUUID, @@ -233,7 +236,7 @@ internal class DatabaseImpl( return db.withTransaction { resourceDao .getReverseReferencedResources(SimpleSQLiteQuery(query.query, query.args.toTypedArray())) - .map { + .pmap { ReverseIncludeSearchResult( it.matchingIndex, it.baseResourceTypeAndId, @@ -413,6 +416,11 @@ internal class DatabaseImpl( } } + /** Implementation of a parallelized map */ + suspend fun Iterable.pmap(f: suspend (A) -> B): List = coroutineScope { + map { async { f(it) } }.awaitAll() + } + companion object { /** * The name for unencrypted database.