From 0d3f7d4a03eaf4db483b5410ca7f6f0b0bd86d7d Mon Sep 17 00:00:00 2001 From: James Agnew Date: Wed, 23 Oct 2019 06:57:55 -0400 Subject: [PATCH] Correctly handle searching by source in JPA server --- .../dstu3/ResourceProviderDstu3Test.java | 32 ++++++++++++++++++- .../resources/vm/jpa_resource_provider.vm | 7 +++- src/changes/changes.xml | 3 +- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/provider/dstu3/ResourceProviderDstu3Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/provider/dstu3/ResourceProviderDstu3Test.java index 7ce8cd16bfe..bf371971207 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/provider/dstu3/ResourceProviderDstu3Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/provider/dstu3/ResourceProviderDstu3Test.java @@ -96,6 +96,36 @@ public class ResourceProviderDstu3Test extends BaseResourceProviderDstu3Test { } + @Test + public void testSearchBySourceTransactionId() { + + Patient p1 = new Patient(); + p1.setActive(true); + ourClient + .create() + .resource(p1) + .withAdditionalHeader(Constants.HEADER_REQUEST_ID, "11111") + .execute(); + + Patient p2 = new Patient(); + p2.setActive(true); + ourClient + .create() + .resource(p2) + .withAdditionalHeader(Constants.HEADER_REQUEST_ID, "22222") + .execute(); + + Bundle results = ourClient + .search() + .byUrl(ourServerBase + "/Patient?_source=%2311111") + .returnBundle(Bundle.class) + .execute(); + + assertEquals(1, results.getEntry().size()); + + } + + @Test public void testSearchByExternalReference() { myDaoConfig.setAllowExternalReferences(true); @@ -4063,7 +4093,7 @@ public class ResourceProviderDstu3Test extends BaseResourceProviderDstu3Test { ourLog.info(resp); assertEquals(412, response.getStatusLine().getStatusCode()); assertThat(resp, not(containsString("Resource has no id"))); - assertThat(resp, containsString("")); + assertThat(resp, containsString("")); } finally { IOUtils.closeQuietly(response.getEntity().getContent()); response.close(); diff --git a/hapi-tinder-plugin/src/main/resources/vm/jpa_resource_provider.vm b/hapi-tinder-plugin/src/main/resources/vm/jpa_resource_provider.vm index 9540cc488b2..77ffd948fbf 100644 --- a/hapi-tinder-plugin/src/main/resources/vm/jpa_resource_provider.vm +++ b/hapi-tinder-plugin/src/main/resources/vm/jpa_resource_provider.vm @@ -65,7 +65,11 @@ public class ${className}ResourceProvider extends @Description(shortDefinition="Search for resources which have the given profile") @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE) - UriAndListParam theSearchForProfile, + UriAndListParam theSearchForProfile, + + @Description(shortDefinition="Search for resources which have the given source value (Resource.meta.source)") + @OptionalParam(name=ca.uhn.fhir.rest.api.Constants.PARAM_SOURCE) + UriAndListParam theSearchForSource, @Description(shortDefinition="Return resources linked to by the given target") @OptionalParam(name="_has") @@ -143,6 +147,7 @@ public class ${className}ResourceProvider extends paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_TAG, theSearchForTag); paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SECURITY, theSearchForSecurity); paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_PROFILE, theSearchForProfile); + paramMap.add(ca.uhn.fhir.rest.api.Constants.PARAM_SOURCE, theSearchForSource); paramMap.add("_has", theHas); #foreach ( $param in $searchParams ) paramMap.add("${param.name}", the${param.nameCapitalized}); diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 9301026d616..6abe975bb21 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -31,7 +31,8 @@ New Feature: - The JPA server now saves and supports searching on Resource.meta.source. The server automatically + The JPA server now saves and supports searching on Resource.meta.source via the + _source search parameter. The server automatically appends the Request ID as a hash value on the URI as well in order to provide request level tracking. Searches can use either the source URI, the request ID, or both. ]]>