Skip to content

Commit

Permalink
Refactor toQueryString
Browse files Browse the repository at this point in the history
  • Loading branch information
LZRS committed Sep 11, 2024
1 parent a304c19 commit 112344f
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -87,27 +87,21 @@ internal sealed class FilterCriteria(
*/
private fun List<ConditionParam<*>>.toQueryString(operation: Operation): String {
if (this.size <= 1) {
return map {
val queryString =
firstOrNull()?.let {
if (it.params.size > 1) {
"(${it.condition})"
} else {
it.condition
}
}
.firstOrNull()
?: ""
return queryString ?: ""
}

val mid = this.size / 2
val left = this.subList(0, mid).toQueryString(operation)
val right = this.subList(mid, this.size).toQueryString(operation)

return listOf(left, right)
.filter { it.isNotBlank() }
.joinToString(
separator = " ${operation.logicalOperator} ",
prefix = "(",
postfix = ")",
)
return "($left ${operation.logicalOperator} $right)"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
package com.google.android.fhir.impl

import androidx.test.core.app.ApplicationProvider
import ca.uhn.fhir.rest.gclient.TokenClientParam
import ca.uhn.fhir.rest.param.ParamPrefixEnum
import com.google.android.fhir.FhirServices.Companion.builder
import com.google.android.fhir.LocalChange
Expand All @@ -26,6 +27,8 @@ import com.google.android.fhir.get
import com.google.android.fhir.lastUpdated
import com.google.android.fhir.logicalId
import com.google.android.fhir.search.LOCAL_LAST_UPDATED_PARAM
import com.google.android.fhir.search.filter.TokenParamFilterCriterion
import com.google.android.fhir.search.getQuery
import com.google.android.fhir.search.search
import com.google.android.fhir.sync.AcceptLocalConflictResolver
import com.google.android.fhir.sync.AcceptRemoteConflictResolver
Expand Down Expand Up @@ -723,6 +726,47 @@ class FhirEngineImplTest {
assertThat(result.map { it.resource.logicalId }).containsExactly("patient-id-create").inOrder()
}

@Test
fun `testing search many`() = runTest {
val patient1 = Patient().apply { id = "patient-1" }
val patient2 = Patient().apply { id = "patient-2" }
val patient3 = Patient().apply { id = "patient-45" }
val patient4 = Patient().apply { id = "patient-4355" }
val patient5 = Patient().apply { id = "patient-899" }
val patient6 = Patient().apply { id = "patient-883376" }
fhirEngine.create(patient1, patient2, patient3, patient4, patient5, patient6)

val result1 =
fhirEngine.search<Patient> {
filter(TokenClientParam("_id"), { value = of(patient3.logicalId) })
}
assertThat(result1).isNotEmpty()
assertThat(result1.size).isEqualTo(1)

val filterValues =
listOf(patient2, patient3, patient1, patient5, patient4, patient6).map<
Patient,
TokenParamFilterCriterion.() -> Unit,
> {
{ value = of(it.logicalId) }
}
val result2 =
fhirEngine.search<Patient> {
filter(TokenClientParam("_id"), *filterValues.toTypedArray())
println(getQuery().query)
println(getQuery().args)
}
assertThat(result2.map { it.resource.logicalId })
.containsExactly(
"patient-2",
"patient-45",
"patient-1",
"patient-4355",
"patient-899",
"patient-883376",
)
}

@Test
fun `update should allow patient search with LOCAL_LAST_UPDATED_PARAM and update local entity`() =
runBlocking {
Expand Down

0 comments on commit 112344f

Please sign in to comment.