Skip to content

Commit

Permalink
Merge 1bb2f5f into f53130c
Browse files Browse the repository at this point in the history
  • Loading branch information
fil512 committed Jan 23, 2019
2 parents f53130c + 1bb2f5f commit c79983d
Show file tree
Hide file tree
Showing 6 changed files with 56 additions and 35 deletions.
Expand Up @@ -63,7 +63,7 @@ public CanonicalSubscription canonicalize(S theSubscription) {
}
}

protected CanonicalSubscription canonicalizeDstu2(IBaseResource theSubscription) {
private CanonicalSubscription canonicalizeDstu2(IBaseResource theSubscription) {
ca.uhn.fhir.model.dstu2.resource.Subscription subscription = (ca.uhn.fhir.model.dstu2.resource.Subscription) theSubscription;

CanonicalSubscription retVal = new CanonicalSubscription();
Expand All @@ -82,7 +82,7 @@ protected CanonicalSubscription canonicalizeDstu2(IBaseResource theSubscription)
return retVal;
}

protected CanonicalSubscription canonicalizeDstu3(IBaseResource theSubscription) {
private CanonicalSubscription canonicalizeDstu3(IBaseResource theSubscription) {
org.hl7.fhir.dstu3.model.Subscription subscription = (org.hl7.fhir.dstu3.model.Subscription) theSubscription;

CanonicalSubscription retVal = new CanonicalSubscription();
Expand Down Expand Up @@ -210,7 +210,7 @@ private String extractExtension(IBaseResource theSubscription, String theUrl) {
return null;
}

protected CanonicalSubscription canonicalizeR4(IBaseResource theSubscription) {
private CanonicalSubscription canonicalizeR4(IBaseResource theSubscription) {
org.hl7.fhir.r4.model.Subscription subscription = (org.hl7.fhir.r4.model.Subscription) theSubscription;

CanonicalSubscription retVal = new CanonicalSubscription();
Expand Down
Expand Up @@ -20,6 +20,7 @@
* #L%
*/

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.context.RuntimeSearchParam;
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
Expand All @@ -30,8 +31,11 @@
import ca.uhn.fhir.rest.api.Constants;
import ca.uhn.fhir.rest.param.BaseParamWithPrefix;
import ca.uhn.fhir.rest.param.ReferenceParam;
import ca.uhn.fhir.rest.param.StringParam;
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
import org.hl7.fhir.instance.model.api.IAnyResource;
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

Expand All @@ -42,16 +46,18 @@
@Service
public class CriteriaResourceMatcher {

public static final String CRITERIA = "CRITERIA";
private static final String CRITERIA = "CRITERIA";
@Autowired
private MatchUrlService myMatchUrlService;
@Autowired
ISearchParamRegistry mySearchParamRegistry;
@Autowired
FhirContext myFhirContext;

public SubscriptionMatchResult match(String theCriteria, RuntimeResourceDefinition theResourceDefinition, ResourceIndexedSearchParams theSearchParams) {
public SubscriptionMatchResult match(String theCriteria, IBaseResource theResource, ResourceIndexedSearchParams theSearchParams) {
SearchParameterMap searchParameterMap;
try {
searchParameterMap = myMatchUrlService.translateMatchUrl(theCriteria, theResourceDefinition);
searchParameterMap = myMatchUrlService.translateMatchUrl(theCriteria, myFhirContext.getResourceDefinition(theResource));
} catch (UnsupportedOperationException e) {
return new SubscriptionMatchResult(theCriteria, CRITERIA);
}
Expand All @@ -63,7 +69,7 @@ public SubscriptionMatchResult match(String theCriteria, RuntimeResourceDefiniti
for (Map.Entry<String, List<List<? extends IQueryParameterType>>> entry : searchParameterMap.entrySet()) {
String theParamName = entry.getKey();
List<List<? extends IQueryParameterType>> theAndOrParams = entry.getValue();
SubscriptionMatchResult result = matchIdsWithAndOr(theParamName, theAndOrParams, theResourceDefinition, theSearchParams);
SubscriptionMatchResult result = matchIdsWithAndOr(theParamName, theAndOrParams, theResource, theSearchParams);
if (!result.matched()){
return result;
}
Expand All @@ -72,7 +78,7 @@ public SubscriptionMatchResult match(String theCriteria, RuntimeResourceDefiniti
}

// This method is modelled from SearchBuilder.searchForIdsWithAndOr()
private SubscriptionMatchResult matchIdsWithAndOr(String theParamName, List<List<? extends IQueryParameterType>> theAndOrParams, RuntimeResourceDefinition theResourceDefinition, ResourceIndexedSearchParams theSearchParams) {
private SubscriptionMatchResult matchIdsWithAndOr(String theParamName, List<List<? extends IQueryParameterType>> theAndOrParams, IBaseResource theResource, ResourceIndexedSearchParams theSearchParams) {
if (theAndOrParams.isEmpty()) {
return new SubscriptionMatchResult(true, CRITERIA);
}
Expand All @@ -90,30 +96,44 @@ private SubscriptionMatchResult matchIdsWithAndOr(String theParamName, List<List
if (hasChain(theAndOrParams)) {
return new SubscriptionMatchResult(theParamName, "Chained references are not supported");
}
if (theParamName.equals(IAnyResource.SP_RES_ID)) {
switch (theParamName) {
case IAnyResource.SP_RES_ID:

return new SubscriptionMatchResult(theParamName, CRITERIA);
return new SubscriptionMatchResult(matchIdsAndOr(theAndOrParams, theResource), CRITERIA);

} else if (theParamName.equals(IAnyResource.SP_RES_LANGUAGE)) {
case IAnyResource.SP_RES_LANGUAGE:

return new SubscriptionMatchResult(theParamName, CRITERIA);
return new SubscriptionMatchResult(theParamName, CRITERIA);

} else if (theParamName.equals(Constants.PARAM_HAS)) {
case Constants.PARAM_HAS:

return new SubscriptionMatchResult(theParamName, CRITERIA);
return new SubscriptionMatchResult(theParamName, CRITERIA);

} else if (theParamName.equals(Constants.PARAM_TAG) || theParamName.equals(Constants.PARAM_PROFILE) || theParamName.equals(Constants.PARAM_SECURITY)) {
case Constants.PARAM_TAG:
case Constants.PARAM_PROFILE:
case Constants.PARAM_SECURITY:

return new SubscriptionMatchResult(theParamName, CRITERIA);
return new SubscriptionMatchResult(theParamName, CRITERIA);

} else {
default:

String resourceName = theResourceDefinition.getName();
RuntimeSearchParam paramDef = mySearchParamRegistry.getActiveSearchParam(resourceName, theParamName);
return matchResourceParam(theParamName, theAndOrParams, theSearchParams, resourceName, paramDef);
String resourceName = myFhirContext.getResourceDefinition(theResource).getName();
RuntimeSearchParam paramDef = mySearchParamRegistry.getActiveSearchParam(resourceName, theParamName);
return matchResourceParam(theParamName, theAndOrParams, theSearchParams, resourceName, paramDef);
}
}

private boolean matchIdsAndOr(List<List<? extends IQueryParameterType>> theAndOrParams, IBaseResource theResource) {
return theAndOrParams.stream().allMatch(nextAnd -> matchIdsOr(nextAnd, theResource));
}
private boolean matchIdsOr(List<? extends IQueryParameterType> theOrParams, IBaseResource theResource) {
return theOrParams.stream().anyMatch(param -> param instanceof StringParam && matchId(((StringParam)param).getValue(), theResource.getIdElement()));
}

private boolean matchId(String theValue, IIdType theId) {
return theValue.equals(theId.getValue()) || theValue.equals(theId.getIdPart());
}

private SubscriptionMatchResult matchResourceParam(String theParamName, List<List<? extends IQueryParameterType>> theAndOrParams, ResourceIndexedSearchParams theSearchParams, String theResourceName, RuntimeSearchParam theParamDef) {
if (theParamDef != null) {
switch (theParamDef.getParamType()) {
Expand Down
Expand Up @@ -21,7 +21,6 @@
*/

import ca.uhn.fhir.context.FhirContext;
import ca.uhn.fhir.context.RuntimeResourceDefinition;
import ca.uhn.fhir.jpa.model.entity.ResourceTable;
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceIndexedSearchParams;
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceLinkExtractor;
Expand Down Expand Up @@ -61,7 +60,6 @@ SubscriptionMatchResult match(String criteria, IBaseResource resource) {
ResourceIndexedSearchParams searchParams = new ResourceIndexedSearchParams();
mySearchParamExtractorService.extractFromResource(searchParams, entity, resource);
myResourceLinkExtractor.extractResourceLinks(searchParams, entity, resource, resource.getMeta().getLastUpdated(), myInlineResourceLinkResolver);
RuntimeResourceDefinition resourceDefinition = myContext.getResourceDefinition(resource);
return myCriteriaResourceMatcher.match(criteria, resourceDefinition, searchParams);
return myCriteriaResourceMatcher.match(criteria, resource, searchParams);
}
}
Expand Up @@ -101,8 +101,8 @@ protected void doDelivery(ResourceDeliveryMessage theMsg, CanonicalSubscription
try {
operation.execute();
} catch (ResourceNotFoundException e) {
ourLog.error("Cannot reach " + theMsg.getSubscription().getEndpointUrl());
e.printStackTrace();
ourLog.error("Cannot reach {} ", theMsg.getSubscription().getEndpointUrl());
ourLog.error("Exception: ", e);
throw e;
}
}
Expand Down
Expand Up @@ -12,6 +12,7 @@
import org.springframework.beans.factory.annotation.Autowired;

import java.util.Arrays;
import java.util.Collections;

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
Expand Down Expand Up @@ -39,20 +40,19 @@ private void assertNotMatched(IBaseResource resource, String criteria) {
}

@Test
@Ignore
public void testResourceById() {

ProcedureRequest pr = new ProcedureRequest();
pr.setId("ProcedureRequest/123");
pr.setIntent(ProcedureRequest.ProcedureRequestIntent.ORIGINALORDER);

assertMatched(pr, "ProcedureRequest?_id=123");
assertMatched(pr, "ProcedureRequest?_id=Patient/123");
assertMatched(pr, "ProcedureRequest?_id=Patient/123,Patient/999");
assertMatched(pr, "ProcedureRequest?_id=Patient/123&_id=Patient/123");
assertNotMatched(pr, "ProcedureRequest?_id=Patient/888");
assertNotMatched(pr, "ProcedureRequest?_id=Patient/888,Patient/999");
assertNotMatched(pr, "ProcedureRequest?_id=Patient/123&_id=Patient/888");
assertMatched(pr, "ProcedureRequest?_id=ProcedureRequest/123");
assertMatched(pr, "ProcedureRequest?_id=ProcedureRequest/123,ProcedureRequest/999");
assertMatched(pr, "ProcedureRequest?_id=ProcedureRequest/123&_id=ProcedureRequest/123");
assertNotMatched(pr, "ProcedureRequest?_id=ProcedureRequest/888");
assertNotMatched(pr, "ProcedureRequest?_id=ProcedureRequest/888,ProcedureRequest/999");
assertNotMatched(pr, "ProcedureRequest?_id=ProcedureRequest/123&_id=ProcedureRequest/888");

}

Expand Down Expand Up @@ -301,7 +301,7 @@ public void testProvenance() {
sp.setXpathUsage(SearchParameter.XPathUsageType.NORMAL);
sp.setStatus(Enumerations.PublicationStatus.ACTIVE);

IBundleProvider bundle = new SimpleBundleProvider(Arrays.asList(sp), "uuid");
IBundleProvider bundle = new SimpleBundleProvider(Collections.singletonList(sp), "uuid");
initSearchParamRegistry(bundle);

{
Expand Down Expand Up @@ -333,7 +333,7 @@ public void testBodySite() {
sp.setXpathUsage(SearchParameter.XPathUsageType.NORMAL);
sp.setStatus(Enumerations.PublicationStatus.ACTIVE);

IBundleProvider bundle = new SimpleBundleProvider(Arrays.asList(sp), "uuid");
IBundleProvider bundle = new SimpleBundleProvider(Collections.singletonList(sp), "uuid");
initSearchParamRegistry(bundle);

{
Expand Down Expand Up @@ -425,7 +425,7 @@ public void testProcedureRequestCategory() {
sp.setXpathUsage(SearchParameter.XPathUsageType.NORMAL);
sp.setStatus(Enumerations.PublicationStatus.ACTIVE);

IBundleProvider bundle = new SimpleBundleProvider(Arrays.asList(sp), "uuid");
IBundleProvider bundle = new SimpleBundleProvider(Collections.singletonList(sp), "uuid");
initSearchParamRegistry(bundle);

{
Expand Down
3 changes: 3 additions & 0 deletions src/changes/changes.xml
Expand Up @@ -320,6 +320,9 @@
result in the 10th result being returned). This will now result in an empty
response Bundle as would be expected.
</action>
<action type="add">
Added support for _id in in-memory matcher
</action>
<action type="fix">
The casing of the base64Binary datatype was incorrect in the DSTU3 and R4 model classes.
This has been corrected.
Expand Down

0 comments on commit c79983d

Please sign in to comment.