diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/SearchBuilder.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/SearchBuilder.java index 96613fbfd28..a3bbfa8e212 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/SearchBuilder.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/SearchBuilder.java @@ -452,66 +452,14 @@ public class SearchBuilder { List codePredicates = new ArrayList(); for (IQueryParameterType nextOr : theList) { - IQueryParameterType params = nextOr; - if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) { continue; } - String systemValue; - String unitsValue; - ParamPrefixEnum cmpValue; - BigDecimal valueValue; - String valueString; - - if (params instanceof BaseQuantityDt) { - BaseQuantityDt param = (BaseQuantityDt) params; - systemValue = param.getSystemElement().getValueAsString(); - unitsValue = param.getUnitsElement().getValueAsString(); - cmpValue = ParamPrefixEnum.forDstu1Value(param.getComparatorElement().getValueAsString()); - valueValue = param.getValueElement().getValue(); - valueString = param.getValueElement().getValueAsString(); - } else if (params instanceof QuantityParam) { - QuantityParam param = (QuantityParam) params; - systemValue = param.getSystem(); - unitsValue = param.getUnits(); - cmpValue = param.getPrefix(); - valueValue = param.getValue(); - valueString = param.getValueAsString(); - } else { - throw new IllegalArgumentException("Invalid quantity type: " + params.getClass()); - } - - Predicate system = null; - if (!isBlank(systemValue)) { - system = builder.equal(from.get("mySystem"), systemValue); - } - - Predicate code = null; - if (!isBlank(unitsValue)) { - code = builder.equal(from.get("myUnits"), unitsValue); - } - - cmpValue = ObjectUtils.defaultIfNull(cmpValue, ParamPrefixEnum.EQUAL); - final Expression path = from.get("myValue"); - String invalidMessageName = "invalidQuantityPrefix"; - - Predicate num = createPredicateNumeric(builder, params, cmpValue, valueValue, path, invalidMessageName, valueString); - - if (system == null && code == null) { - codePredicates.add(num); - } else if (system == null) { - Predicate singleCode = builder.and(code, num); - codePredicates.add(singleCode); - } else if (code == null) { - Predicate singleCode = builder.and(system, num); - codePredicates.add(singleCode); - } else { - Predicate singleCode = builder.and(system, code, num); - codePredicates.add(singleCode); - } + Predicate singleCode = createPredicateQuantity(builder, from, nextOr); + codePredicates.add(singleCode); } - + List predicates = new ArrayList(); predicates.add(builder.equal(from.get("myResourceType"), myResourceName)); predicates.add(builder.equal(from.get("myParamName"), theParamName)); @@ -1039,6 +987,11 @@ public class SearchBuilder { retVal = createPredicateDate(builder, dateJoin, leftValue); break; } + case QUANTITY: { + From dateJoin = from.join("myParamsQuantity", JoinType.INNER); + retVal = createPredicateQuantity(builder, dateJoin, leftValue); + break; + } } if (retVal == null) { @@ -1168,6 +1121,61 @@ public class SearchBuilder { return num; } + private Predicate createPredicateQuantity(CriteriaBuilder theBuilder, From theFrom, IQueryParameterType theParam) { + String systemValue; + String unitsValue; + ParamPrefixEnum cmpValue; + BigDecimal valueValue; + String valueString; + + if (theParam instanceof BaseQuantityDt) { + BaseQuantityDt param = (BaseQuantityDt) theParam; + systemValue = param.getSystemElement().getValueAsString(); + unitsValue = param.getUnitsElement().getValueAsString(); + cmpValue = ParamPrefixEnum.forDstu1Value(param.getComparatorElement().getValueAsString()); + valueValue = param.getValueElement().getValue(); + valueString = param.getValueElement().getValueAsString(); + } else if (theParam instanceof QuantityParam) { + QuantityParam param = (QuantityParam) theParam; + systemValue = param.getSystem(); + unitsValue = param.getUnits(); + cmpValue = param.getPrefix(); + valueValue = param.getValue(); + valueString = param.getValueAsString(); + } else { + throw new IllegalArgumentException("Invalid quantity type: " + theParam.getClass()); + } + + Predicate system = null; + if (!isBlank(systemValue)) { + system = theBuilder.equal(theFrom.get("mySystem"), systemValue); + } + + Predicate code = null; + if (!isBlank(unitsValue)) { + code = theBuilder.equal(theFrom.get("myUnits"), unitsValue); + } + + cmpValue = ObjectUtils.defaultIfNull(cmpValue, ParamPrefixEnum.EQUAL); + final Expression path = theFrom.get("myValue"); + String invalidMessageName = "invalidQuantityPrefix"; + + Predicate num = createPredicateNumeric(theBuilder, theParam, cmpValue, valueValue, path, invalidMessageName, valueString); + + Predicate singleCode; + if (system == null && code == null) { + singleCode = num; + } else if (system == null) { + singleCode = theBuilder.and(code, num); + } else if (code == null) { + singleCode = theBuilder.and(system, num); + } else { + singleCode = theBuilder.and(system, code, num); + } + + return singleCode; + } + private void createPredicateResourceId(CriteriaBuilder builder, CriteriaQuery cq, List thePredicates, Expression theExpression) { if (myParams.isPersistResults()) { if (mySearchEntity.getTotalCount() > -1) { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2SearchNoFtTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2SearchNoFtTest.java index e35b75549bd..fefea1ec264 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2SearchNoFtTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu2/FhirResourceDaoDstu2SearchNoFtTest.java @@ -47,6 +47,7 @@ import ca.uhn.fhir.model.api.TagList; import ca.uhn.fhir.model.api.TemporalPrecisionEnum; import ca.uhn.fhir.model.base.composite.BaseCodingDt; import ca.uhn.fhir.model.dstu.resource.BaseResource; +import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt; import ca.uhn.fhir.model.dstu2.composite.CodingDt; import ca.uhn.fhir.model.dstu2.composite.IdentifierDt; import ca.uhn.fhir.model.dstu2.composite.PeriodDt; @@ -98,7 +99,6 @@ import ca.uhn.fhir.rest.server.Constants; import ca.uhn.fhir.rest.server.IBundleProvider; import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException; import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException; -import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails; import ca.uhn.fhir.util.TestUtil; @SuppressWarnings("unchecked") @@ -518,6 +518,58 @@ public class FhirResourceDaoDstu2SearchNoFtTest extends BaseJpaDstu2Test { } + @Test + public void testSearchCompositeParamQuantity() { + //@formatter:off + Observation o1 = new Observation(); + o1.addComponent() + .setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code1"))) + .setValue(new QuantityDt().setSystem("http://bar").setCode("code1").setValue(100)); + o1.addComponent() + .setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code2"))) + .setValue(new QuantityDt().setSystem("http://bar").setCode("code2").setValue(100)); + IIdType id1 = myObservationDao.create(o1, mySrd).getId().toUnqualifiedVersionless(); + + Observation o2 = new Observation(); + o2.addComponent() + .setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code1"))) + .setValue(new QuantityDt().setSystem("http://bar").setCode("code1").setValue(200)); + o2.addComponent() + .setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code3"))) + .setValue(new QuantityDt().setSystem("http://bar").setCode("code2").setValue(200)); + IIdType id2 = myObservationDao.create(o2, mySrd).getId().toUnqualifiedVersionless(); + //@formatter:on + + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 150, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id2.getValue())); + } + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id1.getValue(), id2.getValue())); + } + { + TokenParam v0 = new TokenParam("http://foo", "code4"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), empty()); + } + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code4"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), empty()); + } + } + /** * #222 */ diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3SearchNoFtTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3SearchNoFtTest.java index d239587a093..9b348778f90 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3SearchNoFtTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/dstu3/FhirResourceDaoDstu3SearchNoFtTest.java @@ -25,6 +25,8 @@ import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.dstu3.model.Appointment; import org.hl7.fhir.dstu3.model.CodeType; +import org.hl7.fhir.dstu3.model.CodeableConcept; +import org.hl7.fhir.dstu3.model.Coding; import org.hl7.fhir.dstu3.model.ConceptMap; import org.hl7.fhir.dstu3.model.ContactPoint.ContactPointSystem; import org.hl7.fhir.dstu3.model.DateTimeType; @@ -99,12 +101,6 @@ import ca.uhn.fhir.util.TestUtil; public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchNoFtTest.class); - @AfterClass - public static void afterClassClearContext() { - TestUtil.clearAllStaticFieldsForUnitTest(); - } - - @Test public void testCodeSearch() { Subscription subs = new Subscription(); @@ -119,6 +115,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id)); } + @Test public void testEverythingTimings() throws Exception { String methodName = "testEverythingIncludesBackReferences"; @@ -175,7 +172,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); } - + @Test public void testIndexNoDuplicatesNumber() { Immunization res = new Immunization(); @@ -243,7 +240,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { List actual = toUnqualifiedVersionlessIds(myDiagnosticOrderDao.search(DiagnosticOrder.SP_ACTOR, new ReferenceParam("Practitioner/somepract"))); assertThat(actual, contains(id)); } - + @Test public void testIndexNoDuplicatesString() { Patient p = new Patient(); @@ -325,7 +322,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { List patients = toList(myPatientDao.search(params)); assertTrue(patients.size() >= 2); } - + @Test public void testSearchByIdParam() { IIdType id1; @@ -352,7 +349,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertEquals(0, toList(myPatientDao.search(params)).size()); } - + @Test public void testSearchByIdParamAnd() { IIdType id1; @@ -438,35 +435,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } - /** - * https://chat.fhir.org/#narrow/stream/implementers/topic/Understanding.20_include - */ - @Test - public void testSearchWithTypedInclude() { - IIdType patId; - { - Patient patient = new Patient(); - patient.addIdentifier().setSystem("urn:system").setValue("001"); - patId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); - } - IIdType practId; - { - Practitioner pract = new Practitioner(); - pract.addIdentifier().setSystem("urn:system").setValue("001"); - practId = myPractitionerDao.create(pract, mySrd).getId().toUnqualifiedVersionless(); - } - - Appointment appt = new Appointment(); - appt.addParticipant().getActor().setReference(patId.getValue()); - appt.addParticipant().getActor().setReference(practId.getValue()); - IIdType apptId = myAppointmentDao.create(appt, mySrd).getId().toUnqualifiedVersionless(); - - SearchParameterMap params = new SearchParameterMap(); - params.addInclude(Appointment.INCLUDE_PATIENT); - assertThat(toUnqualifiedVersionlessIds(myAppointmentDao.search(params)), containsInAnyOrder(patId, apptId)); - - } - @Test public void testSearchByIdParamWrongType() { IIdType id1; @@ -550,7 +518,58 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } - + @Test + public void testSearchCompositeParamQuantity() { + //@formatter:off + Observation o1 = new Observation(); + o1.addComponent() + .setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code1"))) + .setValue(new Quantity().setSystem("http://bar").setCode("code1").setValue(100)); + o1.addComponent() + .setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code2"))) + .setValue(new Quantity().setSystem("http://bar").setCode("code2").setValue(100)); + IIdType id1 = myObservationDao.create(o1, mySrd).getId().toUnqualifiedVersionless(); + + Observation o2 = new Observation(); + o2.addComponent() + .setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code1"))) + .setValue(new Quantity().setSystem("http://bar").setCode("code1").setValue(200)); + o2.addComponent() + .setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code3"))) + .setValue(new Quantity().setSystem("http://bar").setCode("code2").setValue(200)); + IIdType id2 = myObservationDao.create(o2, mySrd).getId().toUnqualifiedVersionless(); + //@formatter:on + + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 150, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id2.getValue())); + } + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id1.getValue(), id2.getValue())); + } + { + TokenParam v0 = new TokenParam("http://foo", "code4"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), empty()); + } + { + TokenParam v0 = new TokenParam("http://foo", "code1"); + QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code4"); + CompositeParam val = new CompositeParam(v0, v1); + IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val); + assertThat(toUnqualifiedVersionlessIdValues(result), empty()); + } + } + /** * #222 */ @@ -606,7 +625,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertEquals(0, retrieved.size()); } } - + @Test public void testSearchLanguageParam() { IIdType id1; @@ -646,7 +665,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertEquals(0, patients.size()); } } - + @Test public void testSearchLanguageParamAndOr() { IIdType id1; @@ -805,7 +824,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertThat(patients, not(hasItems(id2))); } } - + @Test public void testSearchLastUpdatedParamWithComparator() throws InterruptedException { IIdType id0; @@ -867,6 +886,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { ourLog.info("Searching: {}", map.getLastUpdated()); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(map)), containsInAnyOrder(id1a)); } + @Test public void testSearchNameParam() { IIdType id1; @@ -926,8 +946,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { myLocationDao.create(loc, mySrd); } } - - @Test public void testSearchNumberParam() { Encounter e1 = new Encounter(); @@ -955,7 +973,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } } - @Test public void testSearchParamChangesType() { String name = "testSearchParamChangesType"; @@ -983,6 +1000,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } + @Test public void testSearchPractitionerPhoneAndEmailParam() { String methodName = "testSearchPractitionerPhoneAndEmailParam"; @@ -1032,6 +1050,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } + @Test public void testSearchResourceLinkWithChain() { Patient patient = new Patient(); @@ -1084,7 +1103,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertEquals(0, result.size()); } - + @Test public void testSearchResourceLinkWithChainDouble() { String methodName = "testSearchResourceLinkWithChainDouble"; @@ -2127,7 +2146,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } } - + @Test public void testSearchWithTagParameterMissing() { String methodName = "testSearchWithTagParameterMissing"; @@ -2172,7 +2191,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertThat(patients, empty()); } } - + @Test public void testSearchWithToken() { IIdType notMissing; @@ -2208,6 +2227,57 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertThat(patients, not(containsInRelativeOrder(notMissing))); } } + + /** + * https://chat.fhir.org/#narrow/stream/implementers/topic/Understanding.20_include + */ + @Test + public void testSearchWithTypedInclude() { + IIdType patId; + { + Patient patient = new Patient(); + patient.addIdentifier().setSystem("urn:system").setValue("001"); + patId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); + } + IIdType practId; + { + Practitioner pract = new Practitioner(); + pract.addIdentifier().setSystem("urn:system").setValue("001"); + practId = myPractitionerDao.create(pract, mySrd).getId().toUnqualifiedVersionless(); + } + + Appointment appt = new Appointment(); + appt.addParticipant().getActor().setReference(patId.getValue()); + appt.addParticipant().getActor().setReference(practId.getValue()); + IIdType apptId = myAppointmentDao.create(appt, mySrd).getId().toUnqualifiedVersionless(); + + SearchParameterMap params = new SearchParameterMap(); + params.addInclude(Appointment.INCLUDE_PATIENT); + assertThat(toUnqualifiedVersionlessIds(myAppointmentDao.search(params)), containsInAnyOrder(patId, apptId)); + + } + + @Test + public void testSearchWithUriParam() throws Exception { + Class type = ValueSet.class; + String resourceName = "/valueset-dstu2.json"; + ValueSet vs = loadResourceFromClasspath(type, resourceName); + IIdType id1 = myValueSetDao.update(vs, mySrd).getId().toUnqualifiedVersionless(); + + ValueSet vs2 = new ValueSet(); + vs2.setUrl("http://hl7.org/foo/bar"); + IIdType id2 = myValueSetDao.create(vs2, mySrd).getId().toUnqualifiedVersionless(); + + IBundleProvider result; + result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type")); + assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); + + result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type").setQualifier(UriParamQualifierEnum.BELOW)); + assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); + + result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/").setQualifier(UriParamQualifierEnum.BELOW)); + assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); + } @Test public void testSearchWithUriParamAbove() throws Exception { @@ -2240,28 +2310,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { assertThat(toUnqualifiedVersionlessIds(result), empty()); } - @Test - public void testSearchWithUriParam() throws Exception { - Class type = ValueSet.class; - String resourceName = "/valueset-dstu2.json"; - ValueSet vs = loadResourceFromClasspath(type, resourceName); - IIdType id1 = myValueSetDao.update(vs, mySrd).getId().toUnqualifiedVersionless(); - - ValueSet vs2 = new ValueSet(); - vs2.setUrl("http://hl7.org/foo/bar"); - IIdType id2 = myValueSetDao.create(vs2, mySrd).getId().toUnqualifiedVersionless(); - - IBundleProvider result; - result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type")); - assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); - - result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type").setQualifier(UriParamQualifierEnum.BELOW)); - assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); - - result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/").setQualifier(UriParamQualifierEnum.BELOW)); - assertThat(toUnqualifiedVersionlessIds(result), contains(id1)); - } - @Test public void testSearchWithUriParamBelow() throws Exception { Class type = ValueSet.class; @@ -2287,7 +2335,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/foo/baz").setQualifier(UriParamQualifierEnum.BELOW)); assertThat(toUnqualifiedVersionlessIds(result), containsInAnyOrder()); } - + private String toStringMultiline(List theResults) { StringBuilder b = new StringBuilder(); for (Object next : theResults) { @@ -2296,6 +2344,11 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test { } return b.toString(); } + + @AfterClass + public static void afterClassClearContext() { + TestUtil.clearAllStaticFieldsForUnitTest(); + } } diff --git a/src/changes/changes.xml b/src/changes/changes.xml index ab6c75e624c..e276edc81b2 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -118,6 +118,11 @@ class, as it was accidentally commented out. Thanks to GitHub user @Virdulys for the pull request! + + JPA server now supports composite search parameters + where the type of the composite parameter is + a quantity (e.g. Observation:component-code-component-value-quantity) +