package ca.uhn.fhir.jpa.dao.dstu2; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.hamcrest.Matchers.containsInRelativeOrder; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.hasItems; import static org.hamcrest.Matchers.not; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; import org.hl7.fhir.dstu3.model.Task; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.instance.model.api.IIdType; import org.junit.AfterClass; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import ca.uhn.fhir.jpa.dao.BaseHapiFhirDao; import ca.uhn.fhir.jpa.dao.SearchParameterMap; import ca.uhn.fhir.jpa.dao.data.ISearchParamPresentDao; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamDate; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamNumber; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamQuantity; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamString; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamToken; import ca.uhn.fhir.jpa.entity.ResourceIndexedSearchParamUri; import ca.uhn.fhir.jpa.entity.ResourceLink; import ca.uhn.fhir.model.api.IQueryParameterType; import ca.uhn.fhir.model.api.IResource; import ca.uhn.fhir.model.api.Include; import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum; 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; import ca.uhn.fhir.model.dstu2.composite.QuantityDt; import ca.uhn.fhir.model.dstu2.composite.ResourceReferenceDt; import ca.uhn.fhir.model.dstu2.resource.Appointment; import ca.uhn.fhir.model.dstu2.resource.ConceptMap; import ca.uhn.fhir.model.dstu2.resource.Device; import ca.uhn.fhir.model.dstu2.resource.DiagnosticOrder; import ca.uhn.fhir.model.dstu2.resource.DiagnosticReport; import ca.uhn.fhir.model.dstu2.resource.Encounter; import ca.uhn.fhir.model.dstu2.resource.Immunization; import ca.uhn.fhir.model.dstu2.resource.Location; import ca.uhn.fhir.model.dstu2.resource.Medication; import ca.uhn.fhir.model.dstu2.resource.MedicationOrder; import ca.uhn.fhir.model.dstu2.resource.Observation; import ca.uhn.fhir.model.dstu2.resource.Organization; import ca.uhn.fhir.model.dstu2.resource.Patient; import ca.uhn.fhir.model.dstu2.resource.Practitioner; import ca.uhn.fhir.model.dstu2.resource.Subscription; import ca.uhn.fhir.model.dstu2.resource.Substance; import ca.uhn.fhir.model.dstu2.resource.ValueSet; import ca.uhn.fhir.model.dstu2.valueset.ContactPointSystemEnum; import ca.uhn.fhir.model.dstu2.valueset.SubscriptionChannelTypeEnum; import ca.uhn.fhir.model.dstu2.valueset.SubscriptionStatusEnum; import ca.uhn.fhir.model.primitive.CodeDt; import ca.uhn.fhir.model.primitive.DateDt; import ca.uhn.fhir.model.primitive.DateTimeDt; import ca.uhn.fhir.model.primitive.IdDt; import ca.uhn.fhir.model.primitive.InstantDt; import ca.uhn.fhir.model.primitive.StringDt; import ca.uhn.fhir.rest.api.SortOrderEnum; import ca.uhn.fhir.rest.api.SortSpec; import ca.uhn.fhir.rest.param.CompositeParam; import ca.uhn.fhir.rest.param.DateParam; import ca.uhn.fhir.rest.param.DateRangeParam; import ca.uhn.fhir.rest.param.NumberParam; import ca.uhn.fhir.rest.param.ParamPrefixEnum; import ca.uhn.fhir.rest.param.QuantityParam; import ca.uhn.fhir.rest.param.ReferenceParam; import ca.uhn.fhir.rest.param.StringAndListParam; import ca.uhn.fhir.rest.param.StringOrListParam; import ca.uhn.fhir.rest.param.StringParam; import ca.uhn.fhir.rest.param.TokenAndListParam; import ca.uhn.fhir.rest.param.TokenOrListParam; import ca.uhn.fhir.rest.param.TokenParam; import ca.uhn.fhir.rest.param.UriParam; 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.util.TestUtil; @SuppressWarnings("unchecked") public class FhirResourceDaoDstu2SearchNoFtTest extends BaseJpaDstu2Test { private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu2SearchNoFtTest.class); @Before public void beforeDisableResultReuse() { myDaoConfig.setReuseCachedSearchResultsForMillis(null); } @Autowired private ISearchParamPresentDao mySearchParamPresentDao; @Test public void testCodeSearch() { Subscription subs = new Subscription(); subs.setStatus(SubscriptionStatusEnum.ACTIVE); subs.getChannel().setType(SubscriptionChannelTypeEnum.WEBSOCKET); subs.setCriteria("Observation?"); IIdType id = mySubscriptionDao.create(subs, mySrd).getId().toUnqualifiedVersionless(); SearchParameterMap map = new SearchParameterMap(); map.add(Subscription.SP_TYPE, new TokenParam(null, SubscriptionChannelTypeEnum.WEBSOCKET.getCode())); map.add(Subscription.SP_STATUS, new TokenParam(null, SubscriptionStatusEnum.ACTIVE.getCode())); assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id)); } @Test public void testEverythingTimings() throws Exception { String methodName = "testEverythingIncludesBackReferences"; Organization org = new Organization(); org.setName(methodName); IIdType orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); Medication med = new Medication(); med.getCode().setText(methodName); IIdType medId = myMedicationDao.create(med, mySrd).getId().toUnqualifiedVersionless(); Patient pat = new Patient(); pat.addAddress().addLine(methodName); pat.getManagingOrganization().setReference(orgId); IIdType patId = myPatientDao.create(pat, mySrd).getId().toUnqualifiedVersionless(); Patient pat2 = new Patient(); pat2.addAddress().addLine(methodName); pat2.getManagingOrganization().setReference(orgId); IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless(); MedicationOrder mo = new MedicationOrder(); mo.getPatient().setReference(patId); mo.setMedication(new ResourceReferenceDt(medId)); IIdType moId = myMedicationOrderDao.create(mo, mySrd).getId().toUnqualifiedVersionless(); HttpServletRequest request = mock(HttpServletRequest.class); IBundleProvider resp = myPatientDao.patientTypeEverything(request, null, null, null, null, null, mySrd); assertThat(toUnqualifiedVersionlessIds(resp), containsInAnyOrder(orgId, medId, patId, moId, patId2)); request = mock(HttpServletRequest.class); resp = myPatientDao.patientInstanceEverything(request, patId, null, null, null, null, null, mySrd); assertThat(toUnqualifiedVersionlessIds(resp), containsInAnyOrder(orgId, medId, patId, moId)); } @Test public void testIndexNoDuplicatesDate() { DiagnosticOrder order = new DiagnosticOrder(); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-11T11:12:12Z")); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-11T11:12:12Z")); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-11T11:12:12Z")); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-12T11:12:12Z")); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-12T11:12:12Z")); order.addItem().addEvent().setDateTime(new DateTimeDt("2011-12-12T11:12:12Z")); IIdType id = myDiagnosticOrderDao.create(order, mySrd).getId().toUnqualifiedVersionless(); List<IIdType> actual = toUnqualifiedVersionlessIds(myDiagnosticOrderDao.search(new SearchParameterMap(DiagnosticOrder.SP_ITEM_DATE, new DateParam("2011-12-12T11:12:12Z")).setLoadSynchronous(true))); assertThat(actual, contains(id)); Class<ResourceIndexedSearchParamDate> type = ResourceIndexedSearchParamDate.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i WHERE i.myMissing = false", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); } @Test public void testIndexNoDuplicatesNumber() { Immunization res = new Immunization(); res.addVaccinationProtocol().setDoseSequence(1); res.addVaccinationProtocol().setDoseSequence(1); res.addVaccinationProtocol().setDoseSequence(1); res.addVaccinationProtocol().setDoseSequence(2); res.addVaccinationProtocol().setDoseSequence(2); res.addVaccinationProtocol().setDoseSequence(2); IIdType id = myImmunizationDao.create(res, mySrd).getId().toUnqualifiedVersionless(); List<IIdType> actual = toUnqualifiedVersionlessIds(myImmunizationDao.search(new SearchParameterMap(Immunization.SP_DOSE_SEQUENCE, new NumberParam("1")).setLoadSynchronous(true))); assertThat(actual, contains(id)); Class<ResourceIndexedSearchParamNumber> type = ResourceIndexedSearchParamNumber.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); } @Test public void testIndexNoDuplicatesQuantity() { Substance res = new Substance(); res.addInstance().getQuantity().setSystem("http://foo").setCode("UNIT").setValue(123); res.addInstance().getQuantity().setSystem("http://foo").setCode("UNIT").setValue(123); res.addInstance().getQuantity().setSystem("http://foo2").setCode("UNIT2").setValue(1232); res.addInstance().getQuantity().setSystem("http://foo2").setCode("UNIT2").setValue(1232); IIdType id = mySubstanceDao.create(res, mySrd).getId().toUnqualifiedVersionless(); Class<ResourceIndexedSearchParamQuantity> type = ResourceIndexedSearchParamQuantity.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); List<IIdType> actual = toUnqualifiedVersionlessIds(mySubstanceDao.search(new SearchParameterMap(Substance.SP_QUANTITY, new QuantityParam((ParamPrefixEnum) null, 123, "http://foo", "UNIT")).setLoadSynchronous(true))); assertThat(actual, contains(id)); } @Test public void testIndexNoDuplicatesReference() { Practitioner pract = new Practitioner(); pract.setId("Practitioner/somepract"); pract.getName().addFamily("SOME PRACT"); myPractitionerDao.update(pract, mySrd); Practitioner pract2 = new Practitioner(); pract2.setId("Practitioner/somepract2"); pract2.getName().addFamily("SOME PRACT2"); myPractitionerDao.update(pract2, mySrd); DiagnosticOrder res = new DiagnosticOrder(); res.addEvent().setActor(new ResourceReferenceDt("Practitioner/somepract")); res.addEvent().setActor(new ResourceReferenceDt("Practitioner/somepract")); res.addEvent().setActor(new ResourceReferenceDt("Practitioner/somepract2")); res.addEvent().setActor(new ResourceReferenceDt("Practitioner/somepract2")); IIdType id = myDiagnosticOrderDao.create(res, mySrd).getId().toUnqualifiedVersionless(); Class<ResourceLink> type = ResourceLink.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); List<IIdType> actual = toUnqualifiedVersionlessIds(myDiagnosticOrderDao.search(new SearchParameterMap(DiagnosticOrder.SP_ACTOR, new ReferenceParam("Practitioner/somepract")).setLoadSynchronous(true))); assertThat(actual, contains(id)); } @Test public void testIndexNoDuplicatesString() { Patient p = new Patient(); p.addAddress().addLine("123 Fake Street"); p.addAddress().addLine("123 Fake Street"); p.addAddress().addLine("123 Fake Street"); p.addAddress().addLine("456 Fake Street"); p.addAddress().addLine("456 Fake Street"); p.addAddress().addLine("456 Fake Street"); IIdType id = myPatientDao.create(p, mySrd).getId().toUnqualifiedVersionless(); Class<ResourceIndexedSearchParamString> type = ResourceIndexedSearchParamString.class; List<ResourceIndexedSearchParamString> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i WHERE i.myMissing = false", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(new SearchParameterMap(Patient.SP_ADDRESS, new StringParam("123 Fake Street")).setLoadSynchronous(true))); assertThat(actual, contains(id)); } @Test public void testIndexNoDuplicatesToken() { Patient res = new Patient(); res.addIdentifier().setSystem("http://foo1").setValue("123"); res.addIdentifier().setSystem("http://foo1").setValue("123"); res.addIdentifier().setSystem("http://foo2").setValue("1234"); res.addIdentifier().setSystem("http://foo2").setValue("1234"); IIdType id = myPatientDao.create(res, mySrd).getId().toUnqualifiedVersionless(); Class<ResourceIndexedSearchParamToken> type = ResourceIndexedSearchParamToken.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i WHERE i.myMissing = false", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(new SearchParameterMap(Patient.SP_IDENTIFIER, new TokenParam("http://foo1", "123")).setLoadSynchronous(true))); assertThat(actual, contains(id)); } @Test public void testIndexNoDuplicatesUri() { ConceptMap res = new ConceptMap(); res.addElement().addTarget().addDependsOn().setElement("http://foo"); res.addElement().addTarget().addDependsOn().setElement("http://foo"); res.addElement().addTarget().addDependsOn().setElement("http://bar"); res.addElement().addTarget().addDependsOn().setElement("http://bar"); IIdType id = myConceptMapDao.create(res, mySrd).getId().toUnqualifiedVersionless(); Class<ResourceIndexedSearchParamUri> type = ResourceIndexedSearchParamUri.class; List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i WHERE i.myMissing = false", type).getResultList(); ourLog.info(toStringMultiline(results)); assertEquals(2, results.size()); List<IIdType> actual = toUnqualifiedVersionlessIds(myConceptMapDao.search(new SearchParameterMap(ConceptMap.SP_DEPENDSON, new UriParam("http://foo")).setLoadSynchronous(true))); assertThat(actual, contains(id)); } @Test public void testSearchAll() { { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester").addGiven("Joe"); myPatientDao.create(patient, mySrd); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester").addGiven("John"); myPatientDao.create(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); List<IBaseResource> patients = toList(myPatientDao.search(params)); assertTrue(patients.size() >= 2); } @Test public void testSearchByIdParam() { IIdType id1; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1 = myPatientDao.create(patient, mySrd).getId(); } IIdType id2; { Organization patient = new Organization(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id2 = myOrganizationDao.create(patient, mySrd).getId(); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringDt(id1.getIdPart())); assertEquals(1, toList(myPatientDao.search(params)).size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringDt("9999999999999999")); assertEquals(0, toList(myPatientDao.search(params)).size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringDt(id2.getIdPart())); assertEquals(0, toList(myPatientDao.search(params)).size()); } @Test public void testSearchByIdParamAnd() { IIdType id1; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType id2; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params; StringAndListParam param; params = new SearchParameterMap(); params.setLoadSynchronous(true); param = new StringAndListParam(); param.addAnd(new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam(id2.getIdPart()))); param.addAnd(new StringOrListParam().addOr(new StringParam(id1.getIdPart()))); params.add("_id", param); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); params = new SearchParameterMap(); params.setLoadSynchronous(true); param = new StringAndListParam(); param.addAnd(new StringOrListParam().addOr(new StringParam(id2.getIdPart()))); param.addAnd(new StringOrListParam().addOr(new StringParam(id1.getIdPart()))); params.add("_id", param); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); params = new SearchParameterMap(); params.setLoadSynchronous(true); param = new StringAndListParam(); param.addAnd(new StringOrListParam().addOr(new StringParam(id2.getIdPart()))); param.addAnd(new StringOrListParam().addOr(new StringParam("9999999999999"))); params.add("_id", param); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); params = new SearchParameterMap(); params.setLoadSynchronous(true); param = new StringAndListParam(); param.addAnd(new StringOrListParam().addOr(new StringParam("9999999999999"))); param.addAnd(new StringOrListParam().addOr(new StringParam(id2.getIdPart()))); params.add("_id", param); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); } @Test public void testSearchByIdParamOr() { IIdType id1; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } long betweenTime = System.currentTimeMillis(); IIdType id2; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam(id2.getIdPart()))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1, id2)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam(id1.getIdPart()))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam("999999999999"))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); // With lastupdated params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam(id2.getIdPart()))); params.setLastUpdated(new DateRangeParam(new Date(betweenTime), null)); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id2)); } @Test public void testSearchByIdParamWrongType() { IIdType id1; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType id2; { Organization patient = new Organization(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id2 = myOrganizationDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringOrListParam().addOr(new StringParam(id1.getIdPart())).addOr(new StringParam(id2.getIdPart()))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } @Test public void testSearchCompositeParam() { Observation o1 = new Observation(); o1.getCode().addCoding().setSystem("foo").setCode("testSearchCompositeParamN01"); o1.setValue(new StringDt("testSearchCompositeParamS01")); IIdType id1 = myObservationDao.create(o1, mySrd).getId(); Observation o2 = new Observation(); o2.getCode().addCoding().setSystem("foo").setCode("testSearchCompositeParamN01"); o2.setValue(new StringDt("testSearchCompositeParamS02")); IIdType id2 = myObservationDao.create(o2, mySrd).getId(); { TokenParam v0 = new TokenParam("foo", "testSearchCompositeParamN01"); StringParam v1 = new StringParam("testSearchCompositeParamS01"); CompositeParam<TokenParam, StringParam> val = new CompositeParam<TokenParam, StringParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_CODE_VALUE_STRING, val).setLoadSynchronous(true)); assertEquals(1, result.size().intValue()); assertEquals(id1.toUnqualifiedVersionless(), result.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); } { TokenParam v0 = new TokenParam("foo", "testSearchCompositeParamN01"); StringParam v1 = new StringParam("testSearchCompositeParamS02"); CompositeParam<TokenParam, StringParam> val = new CompositeParam<TokenParam, StringParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_CODE_VALUE_STRING, val).setLoadSynchronous(true)); assertEquals(1, result.size().intValue()); assertEquals(id2.toUnqualifiedVersionless(), result.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); } } @Test public void testSearchCompositeParamDate() { Observation o1 = new Observation(); o1.getCode().addCoding().setSystem("foo").setCode("testSearchCompositeParamDateN01"); o1.setValue(new PeriodDt().setStart(new DateTimeDt("2001-01-01T11:11:11")).setEnd(new DateTimeDt("2001-01-01T12:11:11"))); IIdType id1 = myObservationDao.create(o1, mySrd).getId().toUnqualifiedVersionless(); Observation o2 = new Observation(); o2.getCode().addCoding().setSystem("foo").setCode("testSearchCompositeParamDateN01"); o2.setValue(new PeriodDt().setStart(new DateTimeDt("2001-01-02T12:12:12")).setEnd(new DateTimeDt("2001-01-02T12:11:11"))); IIdType id2 = myObservationDao.create(o2, mySrd).getId().toUnqualifiedVersionless(); { TokenParam v0 = new TokenParam("foo", "testSearchCompositeParamDateN01"); DateParam v1 = new DateParam("2001-01-01"); CompositeParam<TokenParam, DateParam> val = new CompositeParam<TokenParam, DateParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_CODE_VALUE_DATE, val).setLoadSynchronous(true)); assertEquals(1, result.size().intValue()); assertEquals(id1.toUnqualifiedVersionless(), result.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); } { TokenParam v0 = new TokenParam("foo", "testSearchCompositeParamDateN01"); // TODO: this should also work with ">2001-01-01T15:12:12" since the two times only have a lower bound DateParam v1 = new DateParam(">2001-01-01T10:12:12"); CompositeParam<TokenParam, DateParam> val = new CompositeParam<TokenParam, DateParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_CODE_VALUE_DATE, val).setLoadSynchronous(true)); assertEquals(2, result.size().intValue()); assertThat(toUnqualifiedVersionlessIds(result), containsInAnyOrder(id1, id2)); } } @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<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val).setLoadSynchronous(true)); 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<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val).setLoadSynchronous(true)); 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<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val).setLoadSynchronous(true)); assertThat(toUnqualifiedVersionlessIdValues(result), empty()); } { TokenParam v0 = new TokenParam("http://foo", "code1"); QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code4"); CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1); IBundleProvider result = myObservationDao.search(new SearchParameterMap(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val).setLoadSynchronous(true)); assertThat(toUnqualifiedVersionlessIdValues(result), empty()); } } /** * #222 */ @Test public void testSearchForDeleted() { { Patient patient = new Patient(); patient.setId("TEST"); patient.setLanguage(new CodeDt("TEST")); patient.addName().addFamily("TEST"); patient.addIdentifier().setSystem("TEST").setValue("TEST"); myPatientDao.update(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringDt("TEST")); assertEquals(1, toList(myPatientDao.search(params)).size()); params.add("_language", new StringParam("TEST")); assertEquals(1, toList(myPatientDao.search(params)).size()); params.add(Patient.SP_IDENTIFIER, new TokenParam("TEST", "TEST")); assertEquals(1, toList(myPatientDao.search(params)).size()); params.add(Patient.SP_NAME, new StringParam("TEST")); assertEquals(1, toList(myPatientDao.search(params)).size()); myPatientDao.delete(new IdDt("Patient/TEST"), mySrd); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringDt("TEST")); assertEquals(0, toList(myPatientDao.search(params)).size()); params.add("_language", new StringParam("TEST")); assertEquals(0, toList(myPatientDao.search(params)).size()); params.add(Patient.SP_IDENTIFIER, new TokenParam("TEST", "TEST")); assertEquals(0, toList(myPatientDao.search(params)).size()); params.add(Patient.SP_NAME, new StringParam("TEST")); assertEquals(0, toList(myPatientDao.search(params)).size()); } @Test public void testSearchForUnknownAlphanumericId() { { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringParam("testSearchForUnknownAlphanumericId")); IBundleProvider retrieved = myPatientDao.search(params); assertEquals(0, retrieved.size().intValue()); } } @Test public void testSearchLanguageParam() { IIdType id1; { Patient patient = new Patient(); patient.getLanguage().setValue("en_CA"); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("testSearchLanguageParam").addGiven("Joe"); id1 = myPatientDao.create(patient, mySrd).getId(); } IIdType id2; { Patient patient = new Patient(); patient.getLanguage().setValue("en_US"); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("testSearchLanguageParam").addGiven("John"); id2 = myPatientDao.create(patient, mySrd).getId(); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringParam("en_CA")); List<IResource> patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); assertEquals(id1.toUnqualifiedVersionless(), patients.get(0).getId().toUnqualifiedVersionless()); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringParam("en_US")); List<Patient> patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); assertEquals(id2.toUnqualifiedVersionless(), patients.get(0).getId().toUnqualifiedVersionless()); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringParam("en_GB")); List<Patient> patients = toList(myPatientDao.search(params)); assertEquals(0, patients.size()); } } @Test public void testSearchLanguageParamAndOr() { IIdType id1; { Patient patient = new Patient(); patient.getLanguage().setValue("en_CA"); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("testSearchLanguageParam").addGiven("Joe"); id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } Date betweenTime = new Date(); IIdType id2; { Patient patient = new Patient(); patient.getLanguage().setValue("en_US"); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("testSearchLanguageParam").addGiven("John"); id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("en_US"))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1, id2)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("en_US"))); params.setLastUpdated(new DateRangeParam(betweenTime, null)); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id2)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(BaseResource.SP_RES_LANGUAGE, new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA"))); params.add(BaseResource.SP_RES_LANGUAGE, and); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("ZZZZZ"))); params.add(BaseResource.SP_RES_LANGUAGE, and); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("ZZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); params.add(BaseResource.SP_RES_LANGUAGE, and); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("")).addOr(new StringParam(null))); params.add(BaseResource.SP_RES_LANGUAGE, and); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add("_id", new StringParam(id1.getIdPart())); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("")).addOr(new StringParam(null))); params.add(BaseResource.SP_RES_LANGUAGE, and); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringAndListParam and = new StringAndListParam(); and.addAnd(new StringOrListParam().addOr(new StringParam("en_CA")).addOr(new StringParam("ZZZZ"))); and.addAnd(new StringOrListParam().addOr(new StringParam("")).addOr(new StringParam(null))); params.add(BaseResource.SP_RES_LANGUAGE, and); params.add("_id", new StringParam(id1.getIdPart())); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1)); } } @Test public void testSearchLastUpdatedParam() throws InterruptedException { String methodName = "testSearchLastUpdatedParam"; int sleep = 100; Thread.sleep(sleep); DateTimeDt beforeAny = new DateTimeDt(new Date(), TemporalPrecisionEnum.MILLI); IIdType id1a; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily(methodName).addGiven("Joe"); id1a = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType id1b; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily(methodName + "XXXX").addGiven("Joe"); id1b = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } Thread.sleep(1100); DateTimeDt beforeR2 = new DateTimeDt(new Date(), TemporalPrecisionEnum.MILLI); Thread.sleep(1100); IIdType id2; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily(methodName).addGiven("John"); id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInAnyOrder(id1a, id1b, id2)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(beforeAny, null)); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInAnyOrder(id1a, id1b, id2)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(beforeR2, null)); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInAnyOrder(id2)); assertThat(patients, not(hasItems(id1a, id1b))); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(beforeAny, beforeR2)); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients.toString(), patients, not(hasItems(id2))); assertThat(patients.toString(), patients, (containsInAnyOrder(id1a, id1b))); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(null, beforeR2)); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, (containsInAnyOrder(id1a, id1b))); assertThat(patients, not(hasItems(id2))); } } @Test public void testSearchLastUpdatedParamWithComparator() throws InterruptedException { String methodName = "testSearchLastUpdatedParamWithComparator"; IIdType id0; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id0 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } int sleep = 100; long start = System.currentTimeMillis(); Thread.sleep(sleep); DateTimeDt beforeAny = new DateTimeDt(new Date(), TemporalPrecisionEnum.MILLI); IIdType id1a; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1a = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType id1b; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); id1b = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } ourLog.info("Res 1: {}", ResourceMetadataKeyEnum.PUBLISHED.get(myPatientDao.read(id0, mySrd)).getValueAsString()); ourLog.info("Res 2: {}", ResourceMetadataKeyEnum.PUBLISHED.get(myPatientDao.read(id1a, mySrd)).getValueAsString()); InstantDt id1bpublished = ResourceMetadataKeyEnum.PUBLISHED.get(myPatientDao.read(id1b, mySrd)); ourLog.info("Res 3: {}", id1bpublished.getValueAsString()); Thread.sleep(sleep); long end = System.currentTimeMillis(); SearchParameterMap params; Date startDate = new Date(start); Date endDate = new Date(end); DateTimeDt startDateTime = new DateTimeDt(startDate, TemporalPrecisionEnum.MILLI); DateTimeDt endDateTime = new DateTimeDt(endDate, TemporalPrecisionEnum.MILLI); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(startDateTime, endDateTime)); ourLog.info("Searching: {}", params.getLastUpdated()); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1a, id1b)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(new DateParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, startDateTime), new DateParam(ParamPrefixEnum.LESSTHAN_OR_EQUALS, endDateTime))); ourLog.info("Searching: {}", params.getLastUpdated()); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1a, id1b)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(new DateParam(ParamPrefixEnum.GREATERTHAN, startDateTime), new DateParam(ParamPrefixEnum.LESSTHAN, endDateTime))); ourLog.info("Searching: {}", params.getLastUpdated()); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1a, id1b)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.setLastUpdated(new DateRangeParam(new DateParam(ParamPrefixEnum.GREATERTHAN, startDateTime.getValue()), new DateParam(ParamPrefixEnum.LESSTHAN, id1bpublished.getValue()))); ourLog.info("Searching: {}", params.getLastUpdated()); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(id1a)); } /** * See #310 */ @Test @Ignore public void testSearchMultiMatches() { for (int i = 0; i < 100; i++) { Practitioner p = new Practitioner(); p.addAddress().addLine("FOO"); IIdType pid = myPractitionerDao.create(p, mySrd).getId().toUnqualifiedVersionless(); Patient pt = new Patient(); pt.addCareProvider().setReference(pid); IIdType ptid = myPatientDao.create(pt, mySrd).getId().toUnqualifiedVersionless(); Observation obs = new Observation(); obs.setSubject(new ResourceReferenceDt(ptid)); myObservationDao.create(obs, mySrd); } SearchParameterMap map = new SearchParameterMap(); map.addInclude(new Include("Patient:careprovider")); map.addRevInclude(new Include("Observation:patient")); myPatientDao.search(map); } @Test public void testSearchNameParam() { IIdType id1; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("testSearchNameParam01Fam").addGiven("testSearchNameParam01Giv"); ResourceMetadataKeyEnum.TITLE.put(patient, "P1TITLE"); id1 = myPatientDao.create(patient, mySrd).getId(); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("testSearchNameParam02Fam").addGiven("testSearchNameParam02Giv"); myPatientDao.create(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt("testSearchNameParam01Fam")); List<Patient> patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); assertEquals(id1.getIdPart(), patients.get(0).getId().getIdPart()); assertEquals("P1TITLE", ResourceMetadataKeyEnum.TITLE.get(patients.get(0))); // Given name shouldn't return for family param params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt("testSearchNameParam01Giv")); patients = toList(myPatientDao.search(params)); assertEquals(0, patients.size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_NAME, new StringDt("testSearchNameParam01Fam")); patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); assertEquals(id1.getIdPart(), patients.get(0).getId().getIdPart()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_NAME, new StringDt("testSearchNameParam01Giv")); patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); assertEquals(id1.getIdPart(), patients.get(0).getId().getIdPart()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt("testSearchNameParam01Foo")); patients = toList(myPatientDao.search(params)); assertEquals(0, patients.size()); } /** * TODO: currently this doesn't index, we should get it working */ @Test public void testSearchNearParam() { { Location loc = new Location(); loc.getPosition().setLatitude(43.7); loc.getPosition().setLatitude(79.4); myLocationDao.create(loc, mySrd); } } @Test public void testSearchNumberParam() { Encounter e1 = new Encounter(); e1.addIdentifier().setSystem("foo").setValue("testSearchNumberParam01"); e1.getLength().setSystem(BaseHapiFhirDao.UCUM_NS).setCode("min").setValue(4.0 * 24 * 60); IIdType id1 = myEncounterDao.create(e1, mySrd).getId(); Encounter e2 = new Encounter(); e2.addIdentifier().setSystem("foo").setValue("testSearchNumberParam02"); e2.getLength().setSystem(BaseHapiFhirDao.UCUM_NS).setCode("year").setValue(2.0); IIdType id2 = myEncounterDao.create(e2, mySrd).getId(); { IBundleProvider found = myEncounterDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Encounter.SP_LENGTH, new NumberParam(">2"))); assertEquals(2, found.size().intValue()); assertThat(toUnqualifiedVersionlessIds(found), containsInAnyOrder(id1.toUnqualifiedVersionless(), id2.toUnqualifiedVersionless())); } { IBundleProvider found = myEncounterDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Encounter.SP_LENGTH, new NumberParam("<1"))); assertEquals(0, found.size().intValue()); } { IBundleProvider found = myEncounterDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Encounter.SP_LENGTH, new NumberParam("4"))); assertEquals(1, found.size().intValue()); assertThat(toUnqualifiedVersionlessIds(found), containsInAnyOrder(id1.toUnqualifiedVersionless())); } { IBundleProvider found = myEncounterDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Encounter.SP_LENGTH, new NumberParam("2"))); assertEquals(0, found.size().intValue()); } } @Test public void testSearchParamChangesType() { String name = "testSearchParamChangesType"; IIdType id; { Patient patient = new Patient(); patient.addName().addFamily(name); id = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt(name)); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, contains(id)); Patient patient = new Patient(); patient.addIdentifier().setSystem(name).setValue(name); patient.setId(id); myPatientDao.update(patient, mySrd); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt(name)); patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, not(contains(id))); } @Test public void testSearchPractitionerPhoneAndEmailParam() { String methodName = "testSearchPractitionerPhoneAndEmailParam"; IIdType id1; { Practitioner patient = new Practitioner(); patient.getName().addFamily(methodName); patient.addTelecom().setSystem(ContactPointSystemEnum.PHONE).setValue("123"); id1 = myPractitionerDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType id2; { Practitioner patient = new Practitioner(); patient.getName().addFamily(methodName); patient.addTelecom().setSystem(ContactPointSystemEnum.EMAIL).setValue("abc"); id2 = myPractitionerDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params; List<IIdType> patients; params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Practitioner.SP_FAMILY, new StringDt(methodName)); patients = toUnqualifiedVersionlessIds(myPractitionerDao.search(params)); assertEquals(2, patients.size()); assertThat(patients, containsInAnyOrder(id1, id2)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Practitioner.SP_FAMILY, new StringParam(methodName)); params.add(Practitioner.SP_EMAIL, new TokenParam(null, "abc")); patients = toUnqualifiedVersionlessIds(myPractitionerDao.search(params)); assertEquals(1, patients.size()); assertThat(patients, containsInAnyOrder(id2)); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Practitioner.SP_FAMILY, new StringParam(methodName)); params.add(Practitioner.SP_EMAIL, new TokenParam(null, "123")); patients = toUnqualifiedVersionlessIds(myPractitionerDao.search(params)); assertEquals(0, patients.size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Practitioner.SP_FAMILY, new StringParam(methodName)); params.add(Practitioner.SP_PHONE, new TokenParam(null, "123")); patients = toUnqualifiedVersionlessIds(myPractitionerDao.search(params)); assertEquals(1, patients.size()); assertThat(patients, containsInAnyOrder(id1)); } @Test public void testSearchResourceLinkWithChain() { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithChainXX"); patient.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithChain01"); IIdType patientId01 = myPatientDao.create(patient, mySrd).getId(); Patient patient02 = new Patient(); patient02.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithChainXX"); patient02.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithChain02"); IIdType patientId02 = myPatientDao.create(patient02, mySrd).getId(); Observation obs01 = new Observation(); obs01.setEffective(new DateTimeDt(new Date())); obs01.setSubject(new ResourceReferenceDt(patientId01)); IIdType obsId01 = myObservationDao.create(obs01, mySrd).getId(); Observation obs02 = new Observation(); obs02.setEffective(new DateTimeDt(new Date())); obs02.setSubject(new ResourceReferenceDt(patientId02)); IIdType obsId02 = myObservationDao.create(obs02, mySrd).getId(); // Create another type, that shouldn't be returned DiagnosticReport dr01 = new DiagnosticReport(); dr01.setSubject(new ResourceReferenceDt(patientId01)); IIdType drId01 = myDiagnosticReportDao.create(dr01, mySrd).getId(); ourLog.info("P1[{}] P2[{}] O1[{}] O2[{}] D1[{}]", new Object[] { patientId01, patientId02, obsId01, obsId02, drId01 }); List<Observation> result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_IDENTIFIER, "urn:system|testSearchResourceLinkWithChain01")))); assertEquals(1, result.size()); assertEquals(obsId01.getIdPart(), result.get(0).getId().getIdPart()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_PATIENT, new ReferenceParam(patientId01.getIdPart())))); assertEquals(1, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_PATIENT, new ReferenceParam(patientId01.getIdPart())))); assertEquals(1, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_IDENTIFIER, "999999999999")))); assertEquals(0, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_IDENTIFIER, "urn:system|testSearchResourceLinkWithChainXX")))); assertEquals(2, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_IDENTIFIER, "testSearchResourceLinkWithChainXX")))); assertEquals(2, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_IDENTIFIER, "|testSearchResourceLinkWithChainXX")))); assertEquals(0, result.size()); } @Test public void testSearchResourceLinkWithChainDouble() { String methodName = "testSearchResourceLinkWithChainDouble"; Organization org = new Organization(); org.setName(methodName); IIdType orgId01 = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); Location locParent = new Location(); locParent.setManagingOrganization(new ResourceReferenceDt(orgId01)); IIdType locParentId = myLocationDao.create(locParent, mySrd).getId().toUnqualifiedVersionless(); Location locChild = new Location(); locChild.setPartOf(new ResourceReferenceDt(locParentId)); IIdType locChildId = myLocationDao.create(locChild, mySrd).getId().toUnqualifiedVersionless(); Location locGrandchild = new Location(); locGrandchild.setPartOf(new ResourceReferenceDt(locChildId)); IIdType locGrandchildId = myLocationDao.create(locGrandchild, mySrd).getId().toUnqualifiedVersionless(); IBundleProvider found; ReferenceParam param; found = myLocationDao.search(new SearchParameterMap().setLoadSynchronous(true).add("organization", new ReferenceParam(orgId01.getIdPart()))); assertEquals(1, found.size().intValue()); assertEquals(locParentId, found.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); param = new ReferenceParam(orgId01.getIdPart()); param.setChain("organization"); found = myLocationDao.search(new SearchParameterMap().setLoadSynchronous(true).add("partof", param)); assertEquals(1, found.size().intValue()); assertEquals(locChildId, found.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); param = new ReferenceParam(orgId01.getIdPart()); param.setChain("partof.organization"); found = myLocationDao.search(new SearchParameterMap().setLoadSynchronous(true).add("partof", param)); assertEquals(1, found.size().intValue()); assertEquals(locGrandchildId, found.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); param = new ReferenceParam(methodName); param.setChain("partof.organization.name"); found = myLocationDao.search(new SearchParameterMap().setLoadSynchronous(true).add("partof", param)); assertEquals(1, found.size().intValue()); assertEquals(locGrandchildId, found.getResources(0, 1).get(0).getIdElement().toUnqualifiedVersionless()); } @Test public void testSearchResourceLinkWithChainWithMultipleTypes() { Patient patient = new Patient(); patient.addName().addFamily("testSearchResourceLinkWithChainWithMultipleTypes01"); patient.addName().addFamily("testSearchResourceLinkWithChainWithMultipleTypesXX"); IIdType patientId01 = myPatientDao.create(patient, mySrd).getId(); Location loc01 = new Location(); loc01.getNameElement().setValue("testSearchResourceLinkWithChainWithMultipleTypes01"); IIdType locId01 = myLocationDao.create(loc01, mySrd).getId(); Observation obs01 = new Observation(); obs01.setEffective(new DateTimeDt(new Date())); obs01.setSubject(new ResourceReferenceDt(patientId01)); IIdType obsId01 = myObservationDao.create(obs01, mySrd).getId(); Observation obs02 = new Observation(); obs02.setEffective(new DateTimeDt(new Date())); obs02.setSubject(new ResourceReferenceDt(locId01)); IIdType obsId02 = myObservationDao.create(obs02, mySrd).getId(); ourLog.info("P1[{}] L1[{}] Obs1[{}] Obs2[{}]", new Object[] { patientId01, locId01, obsId01, obsId02 }); List<Observation> result; result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam("Patient", Patient.SP_NAME, "testSearchResourceLinkWithChainWithMultipleTypes01")))); assertEquals(1, result.size()); assertEquals(obsId01.getIdPart(), result.get(0).getId().getIdPart()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_NAME, "testSearchResourceLinkWithChainWithMultipleTypes01")))); assertEquals(2, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_NAME, "testSearchResourceLinkWithChainWithMultipleTypesXX")))); assertEquals(1, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_NAME, "testSearchResourceLinkWithChainWithMultipleTypesYY")))); assertEquals(0, result.size()); } @Test public void testSearchResourceLinkWithTextLogicalId() { Patient patient = new Patient(); patient.setId("testSearchResourceLinkWithTextLogicalId01"); patient.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithTextLogicalIdXX"); patient.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithTextLogicalId01"); IIdType patientId01 = myPatientDao.update(patient, mySrd).getId(); Patient patient02 = new Patient(); patient02.setId("testSearchResourceLinkWithTextLogicalId02"); patient02.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithTextLogicalIdXX"); patient02.addIdentifier().setSystem("urn:system").setValue("testSearchResourceLinkWithTextLogicalId02"); IIdType patientId02 = myPatientDao.update(patient02, mySrd).getId(); Observation obs01 = new Observation(); obs01.setEffective(new DateTimeDt(new Date())); obs01.setSubject(new ResourceReferenceDt(patientId01)); IIdType obsId01 = myObservationDao.create(obs01, mySrd).getId(); Observation obs02 = new Observation(); obs02.setEffective(new DateTimeDt(new Date())); obs02.setSubject(new ResourceReferenceDt(patientId02)); IIdType obsId02 = myObservationDao.create(obs02, mySrd).getId(); // Create another type, that shouldn't be returned DiagnosticReport dr01 = new DiagnosticReport(); dr01.setSubject(new ResourceReferenceDt(patientId01)); IIdType drId01 = myDiagnosticReportDao.create(dr01, mySrd).getId(); ourLog.info("P1[{}] P2[{}] O1[{}] O2[{}] D1[{}]", new Object[] { patientId01, patientId02, obsId01, obsId02, drId01 }); List<Observation> result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam("testSearchResourceLinkWithTextLogicalId01")))); assertEquals(1, result.size()); assertEquals(obsId01.getIdPart(), result.get(0).getId().getIdPart()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam("testSearchResourceLinkWithTextLogicalId99")))); assertEquals(0, result.size()); result = toList(myObservationDao.search(new SearchParameterMap().setLoadSynchronous(true).add(Observation.SP_SUBJECT, new ReferenceParam("999999999999999")))); assertEquals(0, result.size()); } @SuppressWarnings("unused") @Test public void testSearchResourceReferenceMissing() { IIdType oid1; { Organization org = new Organization(); org.setName("ORG1"); oid1 = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType pid1; { Patient patient = new Patient(); patient.addName().addFamily("FAMILY1"); pid1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType pid2; { Patient patient = new Patient(); patient.addName().addFamily("FAMILY1"); patient.getManagingOrganization().setReference(oid1); pid2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType pid3; { Patient patient = new Patient(); patient.addName().addFamily("FAMILY2"); pid3 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType pid4; { Patient patient = new Patient(); patient.addName().addFamily("FAMILY2"); patient.getManagingOrganization().setReference(oid1); pid4 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } ourLog.info("" + mySearchParamPresentDao.findAll()); SearchParameterMap params; params = new SearchParameterMap(); params.add(Patient.SP_ORGANIZATION, new ReferenceParam().setMissing(true)); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(pid1, pid3)); params = new SearchParameterMap(); params.add(Patient.SP_NAME, new StringParam("FAMILY1")); params.add(Patient.SP_ORGANIZATION, new ReferenceParam().setMissing(true)); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), containsInAnyOrder(pid1)); params = new SearchParameterMap(); params.add(Patient.SP_NAME, new StringParam("FAMILY9999")); params.add(Patient.SP_ORGANIZATION, new ReferenceParam().setMissing(true)); assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(params)), empty()); } @Test public void testSearchStringParam() { { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("Joe"); myPatientDao.create(patient, mySrd); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John"); myPatientDao.create(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt("Tester_testSearchStringParam")); List<Patient> patients = toList(myPatientDao.search(params)); assertEquals(2, patients.size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_FAMILY, new StringDt("FOO_testSearchStringParam")); patients = toList(myPatientDao.search(params)); assertEquals(0, patients.size()); } @Test public void testSearchStringParamReallyLong() { String methodName = "testSearchStringParamReallyLong"; String value = StringUtils.rightPad(methodName, 200, 'a'); IIdType longId; IIdType shortId; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily(value); longId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); shortId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); String substring = value.substring(0, ResourceIndexedSearchParamString.MAX_LENGTH); params.add(Patient.SP_FAMILY, new StringParam(substring)); IBundleProvider found = myPatientDao.search(params); assertEquals(1, toList(found).size()); assertThat(toUnqualifiedVersionlessIds(found), contains(longId)); assertThat(toUnqualifiedVersionlessIds(found), not(contains(shortId))); } @Test public void testSearchStringParamWithNonNormalized() { { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addGiven("testSearchStringParamWithNonNormalized_h\u00F6ra"); myPatientDao.create(patient, mySrd); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addGiven("testSearchStringParamWithNonNormalized_HORA"); myPatientDao.create(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); params.add(Patient.SP_GIVEN, new StringDt("testSearchStringParamWithNonNormalized_hora")); List<Patient> patients = toList(myPatientDao.search(params)); assertEquals(2, patients.size()); params = new SearchParameterMap(); params.setLoadSynchronous(true); StringParam parameter = new StringParam("testSearchStringParamWithNonNormalized_hora"); parameter.setExact(true); params.add(Patient.SP_GIVEN, parameter); patients = toList(myPatientDao.search(params)); assertEquals(0, patients.size()); } @Test public void testSearchTokenParam() { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("testSearchTokenParam001"); patient.addName().addFamily("Tester").addGiven("testSearchTokenParam1"); patient.addCommunication().getLanguage().setText("testSearchTokenParamComText").addCoding().setCode("testSearchTokenParamCode").setSystem("testSearchTokenParamSystem") .setDisplay("testSearchTokenParamDisplay"); myPatientDao.create(patient, mySrd); patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("testSearchTokenParam002"); patient.addName().addFamily("Tester").addGiven("testSearchTokenParam2"); myPatientDao.create(patient, mySrd); { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamComText", true)); map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "testSearchTokenParam001")); assertEquals(1, myPatientDao.search(map).size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamCode", true)); assertEquals(0, myPatientDao.search(map).size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamCode", true)); map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "testSearchTokenParam001")); assertEquals(0, myPatientDao.search(map).size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_IDENTIFIER, new IdentifierDt("urn:system", "testSearchTokenParam001")); IBundleProvider retrieved = myPatientDao.search(map); assertEquals(1, retrieved.size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_IDENTIFIER, new IdentifierDt(null, "testSearchTokenParam001")); IBundleProvider retrieved = myPatientDao.search(map); assertEquals(1, retrieved.size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new IdentifierDt("testSearchTokenParamSystem", "testSearchTokenParamCode")); assertEquals(1, myPatientDao.search(map).size().intValue()); } { // Complete match SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamComText", true)); assertEquals(1, myPatientDao.search(map).size().intValue()); } { // Left match SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamcomtex", true)); assertEquals(1, myPatientDao.search(map).size().intValue()); } { // Right match SearchParameterMap map = new SearchParameterMap(); map.add(Patient.SP_LANGUAGE, new TokenParam(null, "testSearchTokenParamComTex", true)); assertEquals(1, myPatientDao.search(map).size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); TokenOrListParam listParam = new TokenOrListParam(); listParam.add(new IdentifierDt("urn:system", "testSearchTokenParam001")); listParam.add(new IdentifierDt("urn:system", "testSearchTokenParam002")); map.add(Patient.SP_IDENTIFIER, listParam); IBundleProvider retrieved = myPatientDao.search(map); assertEquals(2, retrieved.size().intValue()); } { SearchParameterMap map = new SearchParameterMap(); TokenOrListParam listParam = new TokenOrListParam(); listParam.add(new IdentifierDt(null, "testSearchTokenParam001")); listParam.add(new IdentifierDt("urn:system", "testSearchTokenParam002")); map.add(Patient.SP_IDENTIFIER, listParam); IBundleProvider retrieved = myPatientDao.search(map); assertEquals(2, retrieved.size().intValue()); } } @Test @Ignore public void testSearchUnknownContentParam() { SearchParameterMap params = new SearchParameterMap(); params.add(Constants.PARAM_CONTENT, new StringDt("fulltext")); try { myPatientDao.search(params); fail(); } catch (InvalidRequestException e) { assertEquals("Fulltext search is not enabled on this service, can not process parameter: _content", e.getMessage()); } } @Test @Ignore public void testSearchUnknownTextParam() { SearchParameterMap params = new SearchParameterMap(); params.add(Constants.PARAM_TEXT, new StringDt("fulltext")); try { myPatientDao.search(params); fail(); } catch (InvalidRequestException e) { assertEquals("Fulltext search is not enabled on this service, can not process parameter: _text", e.getMessage()); } } @Test public void testSearchValueQuantity() { String methodName = "testSearchValueQuantity"; QuantityParam param; Set<Long> found; param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), null, null); found = myObservationDao.searchForIds(new SearchParameterMap("value-quantity", param)); int initialSize = found.size(); Observation o = new Observation(); o.getCode().addCoding().setSystem("urn:foo").setCode(methodName + "code"); QuantityDt q = new QuantityDt().setSystem("urn:bar:" + methodName).setCode(methodName + "units").setValue(100); o.setValue(q); myObservationDao.create(o, mySrd); param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), null, null); found = myObservationDao.searchForIds(new SearchParameterMap("value-quantity", param)); assertEquals(1 + initialSize, found.size()); param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), null, methodName + "units"); found = myObservationDao.searchForIds(new SearchParameterMap("value-quantity", param)); assertEquals(1, found.size()); param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), "urn:bar:" + methodName, null); found = myObservationDao.searchForIds(new SearchParameterMap("value-quantity", param)); assertEquals(1, found.size()); param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), "urn:bar:" + methodName, methodName + "units"); found = myObservationDao.searchForIds(new SearchParameterMap("value-quantity", param)); assertEquals(1, found.size()); } @Test public void testSearchWithEmptySort() { SearchParameterMap criteriaUrl = new SearchParameterMap(); DateRangeParam range = new DateRangeParam(); range.setLowerBound(new DateParam(ParamPrefixEnum.GREATERTHAN, 1000000)); range.setUpperBound(new DateParam(ParamPrefixEnum.LESSTHAN, 2000000)); criteriaUrl.setLastUpdated(range); criteriaUrl.setSort(new SortSpec(Constants.PARAM_LASTUPDATED, SortOrderEnum.ASC)); IBundleProvider results = myObservationDao.search(criteriaUrl); assertEquals(0, results.size().intValue()); } @Test public void testSearchWithIncludes() { String methodName = "testSearchWithIncludes"; IIdType parentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); parentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType orgId; IIdType patientId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1"); org.setPartOf(new ResourceReferenceDt(parentOrgId)); orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_" + methodName + "_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); patient.addCareProvider().setReference(orgId); patientId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } IIdType practId2; { Practitioner pract = new Practitioner(); pract.getName().addFamily(methodName + "_PRACT1"); practId2 = myPractitionerDao.create(pract, mySrd).getId().toUnqualifiedVersionless(); } IIdType patientId2; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_" + methodName + "_P2").addGiven("John"); patient.addCareProvider().setReference(practId2); patientId2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { // Typed include SearchParameterMap params = new SearchParameterMap(); params.addInclude(Patient.INCLUDE_CAREPROVIDER.withType("Practitioner")); List<IIdType> ids = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(ids, containsInAnyOrder(patientId, patientId2, practId2)); } { // No includes SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); List<IBaseResource> patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); } { // Named include SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(Patient.INCLUDE_ORGANIZATION.asNonRecursive()); IBundleProvider search = myPatientDao.search(params); List<IBaseResource> patients = toList(search); assertEquals(2, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); } { // Named include with parent non-recursive SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(Patient.INCLUDE_ORGANIZATION); params.addInclude(Organization.INCLUDE_PARTOF.asNonRecursive()); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(2, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); } { // Named include with parent recursive SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(Patient.INCLUDE_ORGANIZATION); params.addInclude(Organization.INCLUDE_PARTOF.asRecursive()); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(3, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); assertEquals(Organization.class, patients.get(2).getClass()); } { // * include non recursive SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(IResource.INCLUDE_ALL.asNonRecursive()); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(2, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); } { // * include recursive SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(IResource.INCLUDE_ALL.asRecursive()); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(3, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); assertEquals(Organization.class, patients.get(2).getClass()); } { // Irrelevant include SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(Encounter.INCLUDE_INDICATION); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(1, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); } { // Untyped include SearchParameterMap params = new SearchParameterMap(); params.addInclude(Patient.INCLUDE_CAREPROVIDER); List<IIdType> ids = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(ids, containsInAnyOrder(orgId, patientId, patientId2, practId2)); } } @SuppressWarnings("unused") @Test public void testSearchWithIncludesParameterNoRecurse() { String methodName = "testSearchWithIncludes"; IIdType parentParentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); parentParentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType parentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); org.setPartOf(new ResourceReferenceDt(parentParentOrgId)); parentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType orgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1"); org.setPartOf(new ResourceReferenceDt(parentOrgId)); orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType patientId; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_" + methodName + "_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); patientId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.add(ca.uhn.fhir.model.dstu2.resource.BaseResource.SP_RES_ID, new StringDt(orgId.getIdPart())); params.addInclude(Organization.INCLUDE_PARTOF.asNonRecursive()); List<IIdType> resources = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(resources, contains(orgId, parentOrgId)); } } @SuppressWarnings("unused") @Test public void testSearchWithIncludesParameterRecurse() { String methodName = "testSearchWithIncludes"; IIdType parentParentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); parentParentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType parentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); org.setPartOf(new ResourceReferenceDt(parentParentOrgId)); parentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType orgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1"); org.setPartOf(new ResourceReferenceDt(parentOrgId)); orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType patientId; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_" + methodName + "_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); patientId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.add(Organization.SP_RES_ID, new StringDt(orgId.getIdPart())); params.addInclude(Organization.INCLUDE_PARTOF.asRecursive()); List<IIdType> resources = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); ourLog.info(resources.toString()); assertThat(resources, contains(orgId, parentOrgId, parentParentOrgId)); } } @Test public void testSearchWithIncludesStarNoRecurse() { String methodName = "testSearchWithIncludes"; IIdType parentParentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); parentParentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType parentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); org.setPartOf(new ResourceReferenceDt(parentParentOrgId)); parentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType orgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1"); org.setPartOf(new ResourceReferenceDt(parentOrgId)); orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType patientId; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_" + methodName + "_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); patientId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(new Include("*").asNonRecursive()); List<IIdType> resources = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(resources, contains(patientId, orgId)); } } @Test public void testSearchWithIncludesStarRecurse() { String methodName = "testSearchWithIncludes"; IIdType parentParentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); parentParentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType parentOrgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1Parent"); org.setPartOf(new ResourceReferenceDt(parentParentOrgId)); parentOrgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType orgId; { Organization org = new Organization(); org.getNameElement().setValue(methodName + "_O1"); org.setPartOf(new ResourceReferenceDt(parentOrgId)); orgId = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType patientId; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_" + methodName + "_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); patientId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_" + methodName + "_P1")); params.addInclude(new Include("*").asRecursive()); List<IIdType> resources = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(resources, contains(patientId, orgId, parentOrgId, parentParentOrgId)); } } /** * Test for #62 */ @Test public void testSearchWithIncludesThatHaveTextId() { { Organization org = new Organization(); org.setId("testSearchWithIncludesThatHaveTextIdid1"); org.getNameElement().setValue("testSearchWithIncludesThatHaveTextId_O1"); IIdType orgId = myOrganizationDao.update(org, mySrd).getId(); assertThat(orgId.getValue(), endsWith("Organization/testSearchWithIncludesThatHaveTextIdid1/_history/1")); Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P1").addGiven("Joe"); patient.getManagingOrganization().setReference(orgId); myPatientDao.create(patient, mySrd); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_testSearchWithIncludesThatHaveTextId_P2").addGiven("John"); myPatientDao.create(patient, mySrd); } SearchParameterMap params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_testSearchWithIncludesThatHaveTextId_P1")); params.addInclude(Patient.INCLUDE_ORGANIZATION); IBundleProvider search = myPatientDao.search(params); List<IResource> patients = toList(search); assertEquals(2, patients.size()); assertEquals(Patient.class, patients.get(0).getClass()); assertEquals(Organization.class, patients.get(1).getClass()); params = new SearchParameterMap(); params.add(Patient.SP_FAMILY, new StringDt("Tester_testSearchWithIncludesThatHaveTextId_P1")); patients = toList(myPatientDao.search(params)); assertEquals(1, patients.size()); } @Test public void testSearchWithMissingDate() { IIdType orgId = myOrganizationDao.create(new Organization(), mySrd).getId(); IIdType notMissing; IIdType missing; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); missing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John"); patient.setBirthDate(new DateDt("2011-01-01")); patient.getManagingOrganization().setReference(orgId); notMissing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } // Date Param { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); DateParam param = new DateParam(); param.setMissing(false); params.add(Patient.SP_BIRTHDATE, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, not(containsInRelativeOrder(missing))); assertThat(patients, containsInRelativeOrder(notMissing)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); DateParam param = new DateParam(); param.setMissing(true); params.add(Patient.SP_BIRTHDATE, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInRelativeOrder(missing)); assertThat(patients, not(containsInRelativeOrder(notMissing))); } } @Test public void testSearchWithMissingQuantity() { IIdType notMissing; IIdType missing; { Observation obs = new Observation(); obs.addIdentifier().setSystem("urn:system").setValue("001"); missing = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless(); } { Observation obs = new Observation(); obs.addIdentifier().setSystem("urn:system").setValue("002"); obs.setValue(new QuantityDt(123)); notMissing = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless(); } // Quantity Param { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); QuantityParam param = new QuantityParam(); param.setMissing(false); params.add(Observation.SP_VALUE_QUANTITY, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myObservationDao.search(params)); assertThat(patients, not(containsInRelativeOrder(missing))); assertThat(patients, containsInRelativeOrder(notMissing)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); QuantityParam param = new QuantityParam(); param.setMissing(true); params.add(Observation.SP_VALUE_QUANTITY, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myObservationDao.search(params)); assertThat(patients, containsInRelativeOrder(missing)); assertThat(patients, not(containsInRelativeOrder(notMissing))); } } @Test public void testSearchWithMissingReference() { IIdType orgId = myOrganizationDao.create(new Organization(), mySrd).getId().toUnqualifiedVersionless(); IIdType notMissing; IIdType missing; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); missing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John"); patient.setBirthDate(new DateDt("2011-01-01")); patient.getManagingOrganization().setReference(orgId); notMissing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } // Reference Param { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); ReferenceParam param = new ReferenceParam(); param.setMissing(false); params.add(Patient.SP_ORGANIZATION, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, not(containsInRelativeOrder(missing))); assertThat(patients, containsInRelativeOrder(notMissing)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); ReferenceParam param = new ReferenceParam(); param.setMissing(true); params.add(Patient.SP_ORGANIZATION, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInRelativeOrder(missing)); assertThat(patients, not(containsInRelativeOrder(notMissing))); assertThat(patients, not(containsInRelativeOrder(orgId))); } } @Test public void testSearchWithMissingString() { IIdType orgId = myOrganizationDao.create(new Organization(), mySrd).getId(); IIdType notMissing; IIdType missing; { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("001"); missing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } { Patient patient = new Patient(); patient.addIdentifier().setSystem("urn:system").setValue("002"); patient.addName().addFamily("Tester_testSearchStringParam").addGiven("John"); patient.setBirthDate(new DateDt("2011-01-01")); patient.getManagingOrganization().setReference(orgId); notMissing = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless(); } // String Param { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringParam param = new StringParam(); param.setMissing(true); params.add(Patient.SP_FAMILY, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, containsInRelativeOrder(missing)); assertThat(patients, not(containsInRelativeOrder(notMissing))); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); StringParam param = new StringParam(); param.setMissing(false); params.add(Patient.SP_FAMILY, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params)); assertThat(patients, not(containsInRelativeOrder(missing))); assertThat(patients, containsInRelativeOrder(notMissing)); } } @Test public void testSearchWithNoResults() { Device dev = new Device(); dev.addIdentifier().setSystem("Foo"); myDeviceDao.create(dev, mySrd); IBundleProvider value = myDeviceDao.search(new SearchParameterMap()); ourLog.info("Initial size: " + value.size()); for (IBaseResource next : value.getResources(0, value.size())) { ourLog.info("Deleting: {}", next.getIdElement()); myDeviceDao.delete((IIdType) next.getIdElement(), mySrd); } value = myDeviceDao.search(new SearchParameterMap()); if (value.size() > 0) { ourLog.info("Found: " + (value.getResources(0, 1).get(0).getIdElement())); fail(myFhirCtx.newXmlParser().setPrettyPrint(true).encodeResourceToString(value.getResources(0, 1).get(0))); } assertEquals(0, value.size().intValue()); List<IBaseResource> res = value.getResources(0, 0); assertTrue(res.isEmpty()); } @Test public void testSearchWithSecurityAndProfileParams() { String methodName = "testSearchWithSecurityAndProfileParams"; IIdType tag1id; { Organization org = new Organization(); org.getNameElement().setValue("FOO"); List<BaseCodingDt> security = new ArrayList<BaseCodingDt>(); security.add(new CodingDt("urn:taglist", methodName + "1a")); ResourceMetadataKeyEnum.SECURITY_LABELS.put(org, security); tag1id = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } IIdType tag2id; { Organization org = new Organization(); org.getNameElement().setValue("FOO"); List<IdDt> security = new ArrayList<IdDt>(); security.add(new IdDt("http://" + methodName)); ResourceMetadataKeyEnum.PROFILES.put(org, security); tag2id = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } { SearchParameterMap params = new SearchParameterMap(); params.add("_security", new TokenParam("urn:taglist", methodName + "1a")); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag1id)); } { SearchParameterMap params = new SearchParameterMap(); params.add("_profile", new UriParam("http://" + methodName)); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag2id)); } } @Test public void testSearchWithTagParameter() { String methodName = "testSearchWithTagParameter"; IIdType tag1id; { Organization org = new Organization(); org.getNameElement().setValue("FOO"); TagList tagList = new TagList(); tagList.addTag("urn:taglist", methodName + "1a"); tagList.addTag("urn:taglist", methodName + "1b"); ResourceMetadataKeyEnum.TAG_LIST.put(org, tagList); tag1id = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } Date betweenDate = new Date(); IIdType tag2id; { Organization org = new Organization(); org.getNameElement().setValue("FOO"); TagList tagList = new TagList(); tagList.addTag("urn:taglist", methodName + "2a"); tagList.addTag("urn:taglist", methodName + "2b"); ResourceMetadataKeyEnum.TAG_LIST.put(org, tagList); tag2id = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless(); } { // One tag SearchParameterMap params = new SearchParameterMap(); params.add("_tag", new TokenParam("urn:taglist", methodName + "1a")); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag1id)); } { // Code only SearchParameterMap params = new SearchParameterMap(); params.add("_tag", new TokenParam(null, methodName + "1a")); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag1id)); } { // Or tags SearchParameterMap params = new SearchParameterMap(); TokenOrListParam orListParam = new TokenOrListParam(); orListParam.add(new TokenParam("urn:taglist", methodName + "1a")); orListParam.add(new TokenParam("urn:taglist", methodName + "2a")); params.add("_tag", orListParam); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag1id, tag2id)); } { // Or tags with lastupdated SearchParameterMap params = new SearchParameterMap(); TokenOrListParam orListParam = new TokenOrListParam(); orListParam.add(new TokenParam("urn:taglist", methodName + "1a")); orListParam.add(new TokenParam("urn:taglist", methodName + "2a")); params.add("_tag", orListParam); params.setLastUpdated(new DateRangeParam(betweenDate, null)); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag2id)); } // TODO: get multiple/AND working { // And tags SearchParameterMap params = new SearchParameterMap(); TokenAndListParam andListParam = new TokenAndListParam(); andListParam.addValue(new TokenOrListParam("urn:taglist", methodName + "1a")); andListParam.addValue(new TokenOrListParam("urn:taglist", methodName + "2a")); params.add("_tag", andListParam); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertEquals(0, patients.size()); } { // And tags SearchParameterMap params = new SearchParameterMap(); TokenAndListParam andListParam = new TokenAndListParam(); andListParam.addValue(new TokenOrListParam("urn:taglist", methodName + "1a")); andListParam.addValue(new TokenOrListParam("urn:taglist", methodName + "1b")); params.add("_tag", andListParam); List<IIdType> patients = toUnqualifiedVersionlessIds(myOrganizationDao.search(params)); assertThat(patients, containsInAnyOrder(tag1id)); } } @Test public void testSearchWithToken() { IIdType notMissing; IIdType missing; { Observation obs = new Observation(); obs.addIdentifier().setSystem("urn:system").setValue("001"); missing = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless(); } { Observation obs = new Observation(); obs.addIdentifier().setSystem("urn:system").setValue("002"); obs.getCode().addCoding().setSystem("urn:system").setCode("002"); notMissing = myObservationDao.create(obs, mySrd).getId().toUnqualifiedVersionless(); } // Token Param { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); TokenParam param = new TokenParam(); param.setMissing(false); params.add(Observation.SP_CODE, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myObservationDao.search(params)); assertThat(patients, not(containsInRelativeOrder(missing))); assertThat(patients, containsInRelativeOrder(notMissing)); } { SearchParameterMap params = new SearchParameterMap(); params.setLoadSynchronous(true); TokenParam param = new TokenParam(); param.setMissing(true); params.add(Observation.SP_CODE, param); List<IIdType> patients = toUnqualifiedVersionlessIds(myObservationDao.search(params)); assertThat(patients, containsInRelativeOrder(missing)); 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<ValueSet> type = ValueSet.class; String resourceName = "/valueset-dstu2.json"; ValueSet vs = loadResourceFromClasspath(type, resourceName); myValueSetDao.update(vs, mySrd); IBundleProvider result = myValueSetDao.search(new SearchParameterMap().setLoadSynchronous(true).add(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type"))); assertThat(toUnqualifiedVersionlessIds(result), contains((IIdType) new IdDt("ValueSet/testSearchWithUriParam"))); } private String toStringMultiline(List<?> theResults) { StringBuilder b = new StringBuilder(); for (Object next : theResults) { b.append('\n'); b.append(" * ").append(next.toString()); } return b.toString(); } @AfterClass public static void afterClassClearContext() { TestUtil.clearAllStaticFieldsForUnitTest(); } }