From 5849301ac108ef0e7258297c6a47d4ec17ff12a6 Mon Sep 17 00:00:00 2001 From: Tanany Date: Mon, 13 May 2024 01:37:43 +0300 Subject: [PATCH 1/2] ref/#2540-Move Search Logic from Search.execute() to FhirEngine.search() --- .../android/fhir/impl/FhirEngineImpl.kt | 42 ++++++++++++++++++- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt b/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt index 4645c149bc..3f58366c5b 100644 --- a/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt +++ b/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt @@ -25,7 +25,9 @@ import com.google.android.fhir.db.Database import com.google.android.fhir.logicalId import com.google.android.fhir.search.Search import com.google.android.fhir.search.count -import com.google.android.fhir.search.execute +import com.google.android.fhir.search.getIncludeQuery +import com.google.android.fhir.search.getQuery +import com.google.android.fhir.search.getRevIncludeQuery import com.google.android.fhir.sync.ConflictResolver import com.google.android.fhir.sync.Resolved import com.google.android.fhir.sync.upload.DefaultResourceConsolidator @@ -61,7 +63,43 @@ internal class FhirEngineImpl(private val database: Database, private val contex } override suspend fun search(search: Search): List> { - return search.execute(database) + val baseResources = database.search(search.getQuery()) + val includedResources = + if (search.forwardIncludes.isEmpty() || baseResources.isEmpty()) { + null + } else { + database.searchForwardReferencedResources( + search.getIncludeQuery(includeIds = baseResources.map { it.uuid }), + ) + } + val revIncludedResources = + if (search.revIncludes.isEmpty() || baseResources.isEmpty()) { + null + } else { + database.searchReverseReferencedResources( + search.getRevIncludeQuery( + includeIds = baseResources.map { "${it.resource.resourceType}/${it.resource.logicalId}" }, + ), + ) + } + + return baseResources.map { (uuid, baseResource) -> + SearchResult( + baseResource, + included = + includedResources + ?.asSequence() + ?.filter { it.baseResourceUUID == uuid } + ?.groupBy({ it.searchIndex }, { it.resource }), + revIncluded = + revIncludedResources + ?.asSequence() + ?.filter { + it.baseResourceTypeWithId == "${baseResource.fhirType()}/${baseResource.logicalId}" + } + ?.groupBy({ it.resource.resourceType to it.searchIndex }, { it.resource }), + ) + } } override suspend fun count(search: Search): Long { From 753dbca3321dc3c742851e054f0cc38d4e970f28 Mon Sep 17 00:00:00 2001 From: Tanany Date: Mon, 13 May 2024 01:44:27 +0300 Subject: [PATCH 2/2] spotless apply --- .../android/fhir/demo/PatientListViewModel.kt | 2 +- .../android/fhir/impl/FhirEngineImpl.kt | 23 ++++++++++--------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/demo/src/main/java/com/google/android/fhir/demo/PatientListViewModel.kt b/demo/src/main/java/com/google/android/fhir/demo/PatientListViewModel.kt index 55c85a4d33..7d0da9092d 100644 --- a/demo/src/main/java/com/google/android/fhir/demo/PatientListViewModel.kt +++ b/demo/src/main/java/com/google/android/fhir/demo/PatientListViewModel.kt @@ -1,5 +1,5 @@ /* - * Copyright 2023 Google LLC + * Copyright 2023-2024 Google LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt b/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt index 3f58366c5b..c517e0cf62 100644 --- a/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt +++ b/engine/src/main/java/com/google/android/fhir/impl/FhirEngineImpl.kt @@ -78,7 +78,8 @@ internal class FhirEngineImpl(private val database: Database, private val contex } else { database.searchReverseReferencedResources( search.getRevIncludeQuery( - includeIds = baseResources.map { "${it.resource.resourceType}/${it.resource.logicalId}" }, + includeIds = + baseResources.map { "${it.resource.resourceType}/${it.resource.logicalId}" }, ), ) } @@ -87,17 +88,17 @@ internal class FhirEngineImpl(private val database: Database, private val contex SearchResult( baseResource, included = - includedResources - ?.asSequence() - ?.filter { it.baseResourceUUID == uuid } - ?.groupBy({ it.searchIndex }, { it.resource }), + includedResources + ?.asSequence() + ?.filter { it.baseResourceUUID == uuid } + ?.groupBy({ it.searchIndex }, { it.resource }), revIncluded = - revIncludedResources - ?.asSequence() - ?.filter { - it.baseResourceTypeWithId == "${baseResource.fhirType()}/${baseResource.logicalId}" - } - ?.groupBy({ it.resource.resourceType to it.searchIndex }, { it.resource }), + revIncludedResources + ?.asSequence() + ?.filter { + it.baseResourceTypeWithId == "${baseResource.fhirType()}/${baseResource.logicalId}" + } + ?.groupBy({ it.resource.resourceType to it.searchIndex }, { it.resource }), ) } }