From 6cc8a5ce4dce108b238bc85baa2f22addbb8238a Mon Sep 17 00:00:00 2001 From: Diederik Muylwyk Date: Tue, 9 Mar 2021 06:28:40 -0500 Subject: [PATCH] Fix HasParam#doGetQueryParameterQualifier() (#2460) * Fix HasParam#doGetQueryParameterQualifier(); add changelog entry * Fix bad test in SearchParameterMapTest --- .../main/java/ca/uhn/fhir/rest/param/HasParam.java | 12 ++++++------ ...arameterqualifier-returns-malformed-modifier.yaml | 6 ++++++ .../uhn/fhir/jpa/dao/r4/SearchParameterMapTest.java | 3 +-- .../uhn/fhir/jpa/searchparam/SearchParameterMap.java | 4 ---- 4 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_4_0/2458-hasparam-dogetqueryparameterqualifier-returns-malformed-modifier.yaml diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/HasParam.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/HasParam.java index f85cb4e1ebf..3234103f141 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/HasParam.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/HasParam.java @@ -1,5 +1,10 @@ package ca.uhn.fhir.rest.param; +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.model.api.IQueryParameterType; +import ca.uhn.fhir.rest.api.Constants; +import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; + import static org.apache.commons.lang3.StringUtils.defaultString; /* @@ -22,11 +27,6 @@ import static org.apache.commons.lang3.StringUtils.defaultString; * #L% */ -import ca.uhn.fhir.context.FhirContext; -import ca.uhn.fhir.model.api.IQueryParameterType; -import ca.uhn.fhir.rest.api.Constants; -import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; - /** * Implementation of the _has method parameter */ @@ -55,7 +55,7 @@ public class HasParam extends BaseParam implements IQueryParameterType { @Override String doGetQueryParameterQualifier() { - return myTargetResourceType + ':' + myParameterName + ':' + myParameterValue; + return ':' + myTargetResourceType + ':' + myReferenceFieldName + ':' + myParameterName; } @Override diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_4_0/2458-hasparam-dogetqueryparameterqualifier-returns-malformed-modifier.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_4_0/2458-hasparam-dogetqueryparameterqualifier-returns-malformed-modifier.yaml new file mode 100644 index 00000000000..3512633c2e5 --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/5_4_0/2458-hasparam-dogetqueryparameterqualifier-returns-malformed-modifier.yaml @@ -0,0 +1,6 @@ +--- +type: fix +issue: 2458 +title: "`HasParam#doGetQueryParameterQualifier()` returned a malformed modifier. For example, the modifier for + `_has:Observation:patient:code=123` was returned as `Observation:code:123` when it should be + `:Observation:patient:code`. This has been corrected." diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/SearchParameterMapTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/SearchParameterMapTest.java index af4c2e9bfd6..fcb37e54fe9 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/SearchParameterMapTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/SearchParameterMapTest.java @@ -3,7 +3,6 @@ package ca.uhn.fhir.jpa.dao.r4; import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.jpa.searchparam.SearchParameterMap; -import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.rest.param.HasParam; import ca.uhn.fhir.test.BaseTest; import org.junit.jupiter.api.Test; @@ -19,6 +18,6 @@ public class SearchParameterMapTest extends BaseTest { SearchParameterMap params = new SearchParameterMap(); params.add("_has", new HasParam("Observation", "subject", "identifier", "urn:system|FOO")); String criteria = params.toNormalizedQueryString(myContext); - assertEquals(criteria, "?_has:Observation:identifier:urn:system|FOO=urn%3Asystem%7CFOO"); + assertEquals(criteria, "?_has:Observation:subject:identifier=urn%3Asystem%7CFOO"); } } diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchParameterMap.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchParameterMap.java index 6a2dbbc3ce0..4e6a31a8063 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchParameterMap.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/SearchParameterMap.java @@ -413,10 +413,6 @@ public class SearchParameterMap implements Serializable { IQueryParameterType firstValue = nextValuesAnd.get(0); b.append(UrlUtil.escapeUrlParam(nextKey)); - if (nextKey.equals(Constants.PARAM_HAS)) { - b.append(':'); - } - if (firstValue.getMissing() != null) { b.append(Constants.PARAMQUALIFIER_MISSING); b.append('=');