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 4645c149bc..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 @@ -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,44 @@ 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 {