Skip to content

Commit

Permalink
Refactor FhirResourceUtils for Optimization
Browse files Browse the repository at this point in the history
- Add optional resources filter parameter to further reduct search results
  • Loading branch information
ndegwamartin committed Aug 24, 2023
1 parent ae1f8bb commit 53f7a8f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,14 @@ constructor(
}
}

val carePlanTasks = output.contained.filterIsInstance<Task>()

if (carePlanModified) saveCarePlan(output)

fhirTaskUtil.updateUpcomingTasksToDue(subject = subject.asReference())
fhirTaskUtil.updateUpcomingTasksToDue(
subject = subject.asReference(),
taskResourcesToFilterBy = carePlanTasks,
)

return if (output.hasActivity()) output else null
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import android.content.Context
import ca.uhn.fhir.rest.param.ParamPrefixEnum
import com.google.android.fhir.get
import com.google.android.fhir.logicalId
import com.google.android.fhir.search.filter.TokenParamFilterCriterion
import com.google.android.fhir.search.search
import dagger.hilt.android.qualifiers.ApplicationContext
import java.util.Date
Expand Down Expand Up @@ -130,8 +131,15 @@ constructor(
* [TaskStatus.READY]. A [Task] should only be due when the start date of the Tasks
* [Task.executionPeriod] is before today and the status is [TaskStatus.REQUESTED] and the
* pre-requisite [Task] s are completed.
*
* @param subject optional subject resources to use as an additional filter to tasks processed
* @param taskResourcesToFilterBy optional set of Task resources whose resource ids will be used
* to filter tasks processed
*/
suspend fun updateUpcomingTasksToDue(subject: Reference? = null) {
suspend fun updateUpcomingTasksToDue(
subject: Reference? = null,
taskResourcesToFilterBy: List<Task>? = null,
) {
Timber.i("Update upcoming Tasks to due...")

val tasks =
Expand All @@ -152,6 +160,14 @@ constructor(
if (!subject?.reference.isNullOrEmpty()) {
filter(Task.SUBJECT, { value = subject?.reference })
}
taskResourcesToFilterBy?.let {
val filters =
it.map {
val apply: TokenParamFilterCriterion.() -> Unit = { value = of(it.logicalId) }
apply
}
filter(Resource.RES_ID, *filters.toTypedArray())
}
}

Timber.i(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -222,4 +222,48 @@ class FhirResourceUtilTest : RobolectricTest() {

assertEquals(TaskStatus.READY, task.status)
}

@Test
fun testUpdateTaskStatusesGivenTasks() {
val task =
Task().apply {
id = "test-task-id"
partOf = listOf(Reference("Task/parent-test-task-id"))
executionPeriod =
Period().apply {
start = Date().plusDays(-5)
status = TaskStatus.REQUESTED
}
}

coEvery {
fhirEngine.search<Task> {
filter(
Task.STATUS,
{ value = of(TaskStatus.REQUESTED.toCoding()) },
{ value = of(TaskStatus.ACCEPTED.toCoding()) },
{ value = of(TaskStatus.RECEIVED.toCoding()) },
)
filter(
Task.PERIOD,
{
prefix = ParamPrefixEnum.LESSTHAN_OR_EQUALS
value = of(DateTimeType(Date().plusDays(-1)))
},
)
}
} returns listOf(task)

coEvery { fhirEngine.get<Task>(any()).status.isIn(TaskStatus.COMPLETED) } returns true

coEvery { defaultRepository.update(any()) } just runs

assertEquals(TaskStatus.REQUESTED, task.status)

runBlocking { fhirTaskUtil.updateUpcomingTasksToDue(taskResourcesToFilterBy = listOf(task)) }

coVerify { defaultRepository.update(task) }

assertEquals(TaskStatus.READY, task.status)
}
}

0 comments on commit 53f7a8f

Please sign in to comment.