Merge pull request #1644 from jamesagnew/ks-20191220-inmemory-reference-host
improve in-memory reference matching
This commit is contained in:
commit
9d0194b0de
|
@ -282,9 +282,7 @@ public final class ResourceIndexedSearchParams {
|
|||
} else {
|
||||
ForcedId forcedId = target.getForcedId();
|
||||
if (forcedId != null) {
|
||||
// TODO KHS is forcedId.getForcedId().equals(theReference.getIdPart() also valid?
|
||||
return forcedId.getForcedId().equals(theReference.getValue()) ||
|
||||
forcedId.getForcedId().equals(theReference.getIdPart());
|
||||
return forcedId.getForcedId().equals(theReference.getValue());
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -23,12 +23,14 @@ package ca.uhn.fhir.jpa.searchparam.matcher;
|
|||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
||||
import ca.uhn.fhir.jpa.searchparam.SearchParameterMap;
|
||||
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceIndexedSearchParams;
|
||||
import ca.uhn.fhir.jpa.searchparam.registry.ISearchParamRegistry;
|
||||
import ca.uhn.fhir.jpa.searchparam.util.SourceParam;
|
||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||
import ca.uhn.fhir.model.primitive.IdDt;
|
||||
import ca.uhn.fhir.rest.api.Constants;
|
||||
import ca.uhn.fhir.rest.api.RestSearchParameterTypeEnum;
|
||||
import ca.uhn.fhir.rest.param.BaseParamWithPrefix;
|
||||
|
@ -56,6 +58,8 @@ public class InMemoryResourceMatcher {
|
|||
@Autowired
|
||||
ISearchParamRegistry mySearchParamRegistry;
|
||||
@Autowired
|
||||
ModelConfig myModelConfig;
|
||||
@Autowired
|
||||
FhirContext myFhirContext;
|
||||
|
||||
/**
|
||||
|
@ -212,9 +216,29 @@ public class InMemoryResourceMatcher {
|
|||
}
|
||||
|
||||
private boolean matchParams(String theResourceName, String theParamName, RuntimeSearchParam paramDef, List<? extends IQueryParameterType> theNextAnd, ResourceIndexedSearchParams theSearchParams) {
|
||||
if (paramDef.getParamType() == RestSearchParameterTypeEnum.REFERENCE) {
|
||||
stripBaseUrlsFromReferenceParams(theNextAnd);
|
||||
}
|
||||
return theNextAnd.stream().anyMatch(token -> theSearchParams.matchParam(theResourceName, theParamName, paramDef, token));
|
||||
}
|
||||
|
||||
private void stripBaseUrlsFromReferenceParams(List<? extends IQueryParameterType> theNextAnd) {
|
||||
if (myModelConfig.getTreatBaseUrlsAsLocal().isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (IQueryParameterType param : theNextAnd) {
|
||||
ReferenceParam ref = (ReferenceParam) param;
|
||||
IIdType dt = new IdDt(ref.getBaseUrl(), ref.getResourceType(), ref.getIdPart(), null);
|
||||
|
||||
if (dt.hasBaseUrl()) {
|
||||
if (myModelConfig.getTreatBaseUrlsAsLocal().contains(dt.getBaseUrl())) {
|
||||
ref.setValue(dt.toUnqualified().getValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private boolean hasChain(List<List<IQueryParameterType>> theAndOrParams) {
|
||||
return theAndOrParams.stream().flatMap(List::stream).anyMatch(param -> param instanceof ReferenceParam && ((ReferenceParam) param).getChain() != null);
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package ca.uhn.fhir.jpa.searchparam.matcher;
|
|||
|
||||
import ca.uhn.fhir.context.FhirContext;
|
||||
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||
import ca.uhn.fhir.jpa.model.entity.ResourceIndexedSearchParamDate;
|
||||
import ca.uhn.fhir.jpa.searchparam.MatchUrlService;
|
||||
import ca.uhn.fhir.jpa.searchparam.extractor.ResourceIndexedSearchParams;
|
||||
|
@ -67,6 +68,11 @@ public class InMemoryResourceMatcherR5Test {
|
|||
FhirContext fhirContext() {
|
||||
return FhirContext.forR5();
|
||||
}
|
||||
|
||||
@Bean
|
||||
ModelConfig modelConfig() {
|
||||
return new ModelConfig();
|
||||
}
|
||||
}
|
||||
|
||||
@Before
|
||||
|
|
|
@ -1,18 +1,23 @@
|
|||
package ca.uhn.fhir.jpa.subscription.module.matcher;
|
||||
|
||||
import ca.uhn.fhir.jpa.model.entity.ModelConfig;
|
||||
import ca.uhn.fhir.jpa.searchparam.matcher.InMemoryMatchResult;
|
||||
import ca.uhn.fhir.jpa.searchparam.matcher.SearchParamMatcher;
|
||||
import ca.uhn.fhir.jpa.subscription.module.BaseSubscriptionDstu3Test;
|
||||
import ca.uhn.fhir.rest.api.server.IBundleProvider;
|
||||
import ca.uhn.fhir.rest.server.SimpleBundleProvider;
|
||||
import ca.uhn.fhir.util.UrlUtil;
|
||||
import org.hl7.fhir.dstu3.model.*;
|
||||
import org.hl7.fhir.dstu3.model.codesystems.MedicationRequestCategory;
|
||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||
import org.hl7.fhir.instance.model.api.IIdType;
|
||||
import org.junit.After;
|
||||
import org.junit.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.junit.Assert.*;
|
||||
|
||||
|
@ -21,6 +26,8 @@ public class InMemorySubscriptionMatcherR3Test extends BaseSubscriptionDstu3Test
|
|||
SubscriptionStrategyEvaluator mySubscriptionStrategyEvaluator;
|
||||
@Autowired
|
||||
SearchParamMatcher mySearchParamMatcher;
|
||||
@Autowired
|
||||
ModelConfig myModelConfig;
|
||||
|
||||
private void assertUnsupported(IBaseResource resource, String criteria) {
|
||||
assertFalse(mySearchParamMatcher.match(criteria, resource, null).supported());
|
||||
|
@ -48,6 +55,10 @@ public class InMemorySubscriptionMatcherR3Test extends BaseSubscriptionDstu3Test
|
|||
assertEquals(theSubscriptionMatchingStrategy, mySubscriptionStrategyEvaluator.determineStrategy(criteria));
|
||||
}
|
||||
|
||||
@After
|
||||
public void after() {
|
||||
myModelConfig.setTreatBaseUrlsAsLocal(new ModelConfig().getTreatBaseUrlsAsLocal());
|
||||
}
|
||||
|
||||
/**
|
||||
* Technically this is an invalid reference in most cases, but this shouldn't choke
|
||||
|
@ -580,4 +591,35 @@ public class InMemorySubscriptionMatcherR3Test extends BaseSubscriptionDstu3Test
|
|||
|
||||
assertNotMatched(observation, criteria);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testExternalReferenceMatches() {
|
||||
String goodReference = "http://example.com/base/Organization/FOO";
|
||||
String goodCriteria = "Patient?organization=" + UrlUtil.escapeUrlParam(goodReference);
|
||||
|
||||
String badReference1 = "http://example.com/bad/Organization/FOO";
|
||||
String badCriteria1 = "Patient?organization=" + UrlUtil.escapeUrlParam(badReference1);
|
||||
|
||||
String badReference2 = "http://example.org/base/Organization/FOO";
|
||||
String badCriteria2 = "Patient?organization=" + UrlUtil.escapeUrlParam(badReference2);
|
||||
|
||||
String badReference3 = "https://example.com/base/Organization/FOO";
|
||||
String badCriteria3 = "Patient?organization=" + UrlUtil.escapeUrlParam(badReference3);
|
||||
|
||||
String badReference4 = "http://example.com/base/Organization/GOO";
|
||||
String badCriteria4 = "Patient?organization=" + UrlUtil.escapeUrlParam(badReference4);
|
||||
|
||||
Set<String> urls = new HashSet<>();
|
||||
urls.add("http://example.com/base/");
|
||||
myModelConfig.setTreatBaseUrlsAsLocal(urls);
|
||||
|
||||
Patient patient = new Patient();
|
||||
patient.getManagingOrganization().setReference("Organization/FOO");
|
||||
|
||||
assertMatched(patient, goodCriteria);
|
||||
assertNotMatched(patient, badCriteria1);
|
||||
assertNotMatched(patient, badCriteria2);
|
||||
assertNotMatched(patient, badCriteria3);
|
||||
assertNotMatched(patient, badCriteria4);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue