mirror of
https://github.com/hapifhir/hapi-fhir.git
synced 2025-02-08 14:05:02 +00:00
Support composite parametrs with quantity type in JPA
This commit is contained in:
parent
8c8434943c
commit
4ae4b1a8d8
@ -452,64 +452,12 @@ public class SearchBuilder {
|
|||||||
|
|
||||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||||
for (IQueryParameterType nextOr : theList) {
|
for (IQueryParameterType nextOr : theList) {
|
||||||
IQueryParameterType params = nextOr;
|
|
||||||
|
|
||||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
String systemValue;
|
Predicate singleCode = createPredicateQuantity(builder, from, nextOr);
|
||||||
String unitsValue;
|
|
||||||
ParamPrefixEnum cmpValue;
|
|
||||||
BigDecimal valueValue;
|
|
||||||
String valueString;
|
|
||||||
|
|
||||||
if (params instanceof BaseQuantityDt) {
|
|
||||||
BaseQuantityDt param = (BaseQuantityDt) params;
|
|
||||||
systemValue = param.getSystemElement().getValueAsString();
|
|
||||||
unitsValue = param.getUnitsElement().getValueAsString();
|
|
||||||
cmpValue = ParamPrefixEnum.forDstu1Value(param.getComparatorElement().getValueAsString());
|
|
||||||
valueValue = param.getValueElement().getValue();
|
|
||||||
valueString = param.getValueElement().getValueAsString();
|
|
||||||
} else if (params instanceof QuantityParam) {
|
|
||||||
QuantityParam param = (QuantityParam) params;
|
|
||||||
systemValue = param.getSystem();
|
|
||||||
unitsValue = param.getUnits();
|
|
||||||
cmpValue = param.getPrefix();
|
|
||||||
valueValue = param.getValue();
|
|
||||||
valueString = param.getValueAsString();
|
|
||||||
} else {
|
|
||||||
throw new IllegalArgumentException("Invalid quantity type: " + params.getClass());
|
|
||||||
}
|
|
||||||
|
|
||||||
Predicate system = null;
|
|
||||||
if (!isBlank(systemValue)) {
|
|
||||||
system = builder.equal(from.get("mySystem"), systemValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
Predicate code = null;
|
|
||||||
if (!isBlank(unitsValue)) {
|
|
||||||
code = builder.equal(from.get("myUnits"), unitsValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
cmpValue = ObjectUtils.defaultIfNull(cmpValue, ParamPrefixEnum.EQUAL);
|
|
||||||
final Expression<BigDecimal> path = from.get("myValue");
|
|
||||||
String invalidMessageName = "invalidQuantityPrefix";
|
|
||||||
|
|
||||||
Predicate num = createPredicateNumeric(builder, params, cmpValue, valueValue, path, invalidMessageName, valueString);
|
|
||||||
|
|
||||||
if (system == null && code == null) {
|
|
||||||
codePredicates.add(num);
|
|
||||||
} else if (system == null) {
|
|
||||||
Predicate singleCode = builder.and(code, num);
|
|
||||||
codePredicates.add(singleCode);
|
codePredicates.add(singleCode);
|
||||||
} else if (code == null) {
|
|
||||||
Predicate singleCode = builder.and(system, num);
|
|
||||||
codePredicates.add(singleCode);
|
|
||||||
} else {
|
|
||||||
Predicate singleCode = builder.and(system, code, num);
|
|
||||||
codePredicates.add(singleCode);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||||
@ -1039,6 +987,11 @@ public class SearchBuilder {
|
|||||||
retVal = createPredicateDate(builder, dateJoin, leftValue);
|
retVal = createPredicateDate(builder, dateJoin, leftValue);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case QUANTITY: {
|
||||||
|
From<ResourceIndexedSearchParamQuantity, ResourceIndexedSearchParamQuantity> dateJoin = from.join("myParamsQuantity", JoinType.INNER);
|
||||||
|
retVal = createPredicateQuantity(builder, dateJoin, leftValue);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retVal == null) {
|
if (retVal == null) {
|
||||||
@ -1168,6 +1121,61 @@ public class SearchBuilder {
|
|||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Predicate createPredicateQuantity(CriteriaBuilder theBuilder, From<ResourceIndexedSearchParamQuantity, ResourceIndexedSearchParamQuantity> theFrom, IQueryParameterType theParam) {
|
||||||
|
String systemValue;
|
||||||
|
String unitsValue;
|
||||||
|
ParamPrefixEnum cmpValue;
|
||||||
|
BigDecimal valueValue;
|
||||||
|
String valueString;
|
||||||
|
|
||||||
|
if (theParam instanceof BaseQuantityDt) {
|
||||||
|
BaseQuantityDt param = (BaseQuantityDt) theParam;
|
||||||
|
systemValue = param.getSystemElement().getValueAsString();
|
||||||
|
unitsValue = param.getUnitsElement().getValueAsString();
|
||||||
|
cmpValue = ParamPrefixEnum.forDstu1Value(param.getComparatorElement().getValueAsString());
|
||||||
|
valueValue = param.getValueElement().getValue();
|
||||||
|
valueString = param.getValueElement().getValueAsString();
|
||||||
|
} else if (theParam instanceof QuantityParam) {
|
||||||
|
QuantityParam param = (QuantityParam) theParam;
|
||||||
|
systemValue = param.getSystem();
|
||||||
|
unitsValue = param.getUnits();
|
||||||
|
cmpValue = param.getPrefix();
|
||||||
|
valueValue = param.getValue();
|
||||||
|
valueString = param.getValueAsString();
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Invalid quantity type: " + theParam.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate system = null;
|
||||||
|
if (!isBlank(systemValue)) {
|
||||||
|
system = theBuilder.equal(theFrom.get("mySystem"), systemValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate code = null;
|
||||||
|
if (!isBlank(unitsValue)) {
|
||||||
|
code = theBuilder.equal(theFrom.get("myUnits"), unitsValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmpValue = ObjectUtils.defaultIfNull(cmpValue, ParamPrefixEnum.EQUAL);
|
||||||
|
final Expression<BigDecimal> path = theFrom.get("myValue");
|
||||||
|
String invalidMessageName = "invalidQuantityPrefix";
|
||||||
|
|
||||||
|
Predicate num = createPredicateNumeric(theBuilder, theParam, cmpValue, valueValue, path, invalidMessageName, valueString);
|
||||||
|
|
||||||
|
Predicate singleCode;
|
||||||
|
if (system == null && code == null) {
|
||||||
|
singleCode = num;
|
||||||
|
} else if (system == null) {
|
||||||
|
singleCode = theBuilder.and(code, num);
|
||||||
|
} else if (code == null) {
|
||||||
|
singleCode = theBuilder.and(system, num);
|
||||||
|
} else {
|
||||||
|
singleCode = theBuilder.and(system, code, num);
|
||||||
|
}
|
||||||
|
|
||||||
|
return singleCode;
|
||||||
|
}
|
||||||
|
|
||||||
private void createPredicateResourceId(CriteriaBuilder builder, CriteriaQuery<?> cq, List<Predicate> thePredicates, Expression<Long> theExpression) {
|
private void createPredicateResourceId(CriteriaBuilder builder, CriteriaQuery<?> cq, List<Predicate> thePredicates, Expression<Long> theExpression) {
|
||||||
if (myParams.isPersistResults()) {
|
if (myParams.isPersistResults()) {
|
||||||
if (mySearchEntity.getTotalCount() > -1) {
|
if (mySearchEntity.getTotalCount() > -1) {
|
||||||
|
@ -47,6 +47,7 @@ import ca.uhn.fhir.model.api.TagList;
|
|||||||
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
import ca.uhn.fhir.model.api.TemporalPrecisionEnum;
|
||||||
import ca.uhn.fhir.model.base.composite.BaseCodingDt;
|
import ca.uhn.fhir.model.base.composite.BaseCodingDt;
|
||||||
import ca.uhn.fhir.model.dstu.resource.BaseResource;
|
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.CodingDt;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.IdentifierDt;
|
import ca.uhn.fhir.model.dstu2.composite.IdentifierDt;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
|
import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
|
||||||
@ -98,7 +99,6 @@ import ca.uhn.fhir.rest.server.Constants;
|
|||||||
import ca.uhn.fhir.rest.server.IBundleProvider;
|
import ca.uhn.fhir.rest.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
import ca.uhn.fhir.rest.server.servlet.ServletRequestDetails;
|
|
||||||
import ca.uhn.fhir.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
@ -518,6 +518,58 @@ public class FhirResourceDaoDstu2SearchNoFtTest extends BaseJpaDstu2Test {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchCompositeParamQuantity() {
|
||||||
|
//@formatter:off
|
||||||
|
Observation o1 = new Observation();
|
||||||
|
o1.addComponent()
|
||||||
|
.setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code1")))
|
||||||
|
.setValue(new QuantityDt().setSystem("http://bar").setCode("code1").setValue(100));
|
||||||
|
o1.addComponent()
|
||||||
|
.setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code2")))
|
||||||
|
.setValue(new QuantityDt().setSystem("http://bar").setCode("code2").setValue(100));
|
||||||
|
IIdType id1 = myObservationDao.create(o1, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Observation o2 = new Observation();
|
||||||
|
o2.addComponent()
|
||||||
|
.setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code1")))
|
||||||
|
.setValue(new QuantityDt().setSystem("http://bar").setCode("code1").setValue(200));
|
||||||
|
o2.addComponent()
|
||||||
|
.setCode(new CodeableConceptDt().addCoding(new CodingDt().setSystem("http://foo").setCode("code3")))
|
||||||
|
.setValue(new QuantityDt().setSystem("http://bar").setCode("code2").setValue(200));
|
||||||
|
IIdType id2 = myObservationDao.create(o2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 150, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id2.getValue()));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id1.getValue(), id2.getValue()));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code4");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), empty());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code4");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_COMPONENT_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* #222
|
* #222
|
||||||
*/
|
*/
|
||||||
|
@ -25,6 +25,8 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.hl7.fhir.dstu3.model.Appointment;
|
import org.hl7.fhir.dstu3.model.Appointment;
|
||||||
import org.hl7.fhir.dstu3.model.CodeType;
|
import org.hl7.fhir.dstu3.model.CodeType;
|
||||||
|
import org.hl7.fhir.dstu3.model.CodeableConcept;
|
||||||
|
import org.hl7.fhir.dstu3.model.Coding;
|
||||||
import org.hl7.fhir.dstu3.model.ConceptMap;
|
import org.hl7.fhir.dstu3.model.ConceptMap;
|
||||||
import org.hl7.fhir.dstu3.model.ContactPoint.ContactPointSystem;
|
import org.hl7.fhir.dstu3.model.ContactPoint.ContactPointSystem;
|
||||||
import org.hl7.fhir.dstu3.model.DateTimeType;
|
import org.hl7.fhir.dstu3.model.DateTimeType;
|
||||||
@ -99,12 +101,6 @@ import ca.uhn.fhir.util.TestUtil;
|
|||||||
public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchNoFtTest.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchNoFtTest.class);
|
||||||
|
|
||||||
@AfterClass
|
|
||||||
public static void afterClassClearContext() {
|
|
||||||
TestUtil.clearAllStaticFieldsForUnitTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCodeSearch() {
|
public void testCodeSearch() {
|
||||||
Subscription subs = new Subscription();
|
Subscription subs = new Subscription();
|
||||||
@ -119,6 +115,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id));
|
assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEverythingTimings() throws Exception {
|
public void testEverythingTimings() throws Exception {
|
||||||
String methodName = "testEverythingIncludesBackReferences";
|
String methodName = "testEverythingIncludesBackReferences";
|
||||||
@ -438,35 +435,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* https://chat.fhir.org/#narrow/stream/implementers/topic/Understanding.20_include
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSearchWithTypedInclude() {
|
|
||||||
IIdType patId;
|
|
||||||
{
|
|
||||||
Patient patient = new Patient();
|
|
||||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
|
||||||
patId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
|
||||||
}
|
|
||||||
IIdType practId;
|
|
||||||
{
|
|
||||||
Practitioner pract = new Practitioner();
|
|
||||||
pract.addIdentifier().setSystem("urn:system").setValue("001");
|
|
||||||
practId = myPractitionerDao.create(pract, mySrd).getId().toUnqualifiedVersionless();
|
|
||||||
}
|
|
||||||
|
|
||||||
Appointment appt = new Appointment();
|
|
||||||
appt.addParticipant().getActor().setReference(patId.getValue());
|
|
||||||
appt.addParticipant().getActor().setReference(practId.getValue());
|
|
||||||
IIdType apptId = myAppointmentDao.create(appt, mySrd).getId().toUnqualifiedVersionless();
|
|
||||||
|
|
||||||
SearchParameterMap params = new SearchParameterMap();
|
|
||||||
params.addInclude(Appointment.INCLUDE_PATIENT);
|
|
||||||
assertThat(toUnqualifiedVersionlessIds(myAppointmentDao.search(params)), containsInAnyOrder(patId, apptId));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchByIdParamWrongType() {
|
public void testSearchByIdParamWrongType() {
|
||||||
IIdType id1;
|
IIdType id1;
|
||||||
@ -550,6 +518,57 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchCompositeParamQuantity() {
|
||||||
|
//@formatter:off
|
||||||
|
Observation o1 = new Observation();
|
||||||
|
o1.addComponent()
|
||||||
|
.setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code1")))
|
||||||
|
.setValue(new Quantity().setSystem("http://bar").setCode("code1").setValue(100));
|
||||||
|
o1.addComponent()
|
||||||
|
.setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code2")))
|
||||||
|
.setValue(new Quantity().setSystem("http://bar").setCode("code2").setValue(100));
|
||||||
|
IIdType id1 = myObservationDao.create(o1, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Observation o2 = new Observation();
|
||||||
|
o2.addComponent()
|
||||||
|
.setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code1")))
|
||||||
|
.setValue(new Quantity().setSystem("http://bar").setCode("code1").setValue(200));
|
||||||
|
o2.addComponent()
|
||||||
|
.setCode(new CodeableConcept().addCoding(new Coding().setSystem("http://foo").setCode("code3")))
|
||||||
|
.setValue(new Quantity().setSystem("http://bar").setCode("code2").setValue(200));
|
||||||
|
IIdType id2 = myObservationDao.create(o2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
//@formatter:on
|
||||||
|
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 150, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id2.getValue()));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), containsInAnyOrder(id1.getValue(), id2.getValue()));
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code4");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code1");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), empty());
|
||||||
|
}
|
||||||
|
{
|
||||||
|
TokenParam v0 = new TokenParam("http://foo", "code1");
|
||||||
|
QuantityParam v1 = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, 50, "http://bar", "code4");
|
||||||
|
CompositeParam<TokenParam, QuantityParam> val = new CompositeParam<TokenParam, QuantityParam>(v0, v1);
|
||||||
|
IBundleProvider result = myObservationDao.search(Observation.SP_COMPONENT_CODE_VALUE_QUANTITY, val);
|
||||||
|
assertThat(toUnqualifiedVersionlessIdValues(result), empty());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* #222
|
* #222
|
||||||
@ -867,6 +886,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
ourLog.info("Searching: {}", map.getLastUpdated());
|
ourLog.info("Searching: {}", map.getLastUpdated());
|
||||||
assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(map)), containsInAnyOrder(id1a));
|
assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(map)), containsInAnyOrder(id1a));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchNameParam() {
|
public void testSearchNameParam() {
|
||||||
IIdType id1;
|
IIdType id1;
|
||||||
@ -926,8 +946,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
myLocationDao.create(loc, mySrd);
|
myLocationDao.create(loc, mySrd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchNumberParam() {
|
public void testSearchNumberParam() {
|
||||||
Encounter e1 = new Encounter();
|
Encounter e1 = new Encounter();
|
||||||
@ -955,7 +973,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchParamChangesType() {
|
public void testSearchParamChangesType() {
|
||||||
String name = "testSearchParamChangesType";
|
String name = "testSearchParamChangesType";
|
||||||
@ -983,6 +1000,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchPractitionerPhoneAndEmailParam() {
|
public void testSearchPractitionerPhoneAndEmailParam() {
|
||||||
String methodName = "testSearchPractitionerPhoneAndEmailParam";
|
String methodName = "testSearchPractitionerPhoneAndEmailParam";
|
||||||
@ -1032,6 +1050,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchResourceLinkWithChain() {
|
public void testSearchResourceLinkWithChain() {
|
||||||
Patient patient = new Patient();
|
Patient patient = new Patient();
|
||||||
@ -2209,6 +2228,57 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* https://chat.fhir.org/#narrow/stream/implementers/topic/Understanding.20_include
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testSearchWithTypedInclude() {
|
||||||
|
IIdType patId;
|
||||||
|
{
|
||||||
|
Patient patient = new Patient();
|
||||||
|
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||||
|
patId = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
}
|
||||||
|
IIdType practId;
|
||||||
|
{
|
||||||
|
Practitioner pract = new Practitioner();
|
||||||
|
pract.addIdentifier().setSystem("urn:system").setValue("001");
|
||||||
|
practId = myPractitionerDao.create(pract, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
}
|
||||||
|
|
||||||
|
Appointment appt = new Appointment();
|
||||||
|
appt.addParticipant().getActor().setReference(patId.getValue());
|
||||||
|
appt.addParticipant().getActor().setReference(practId.getValue());
|
||||||
|
IIdType apptId = myAppointmentDao.create(appt, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
SearchParameterMap params = new SearchParameterMap();
|
||||||
|
params.addInclude(Appointment.INCLUDE_PATIENT);
|
||||||
|
assertThat(toUnqualifiedVersionlessIds(myAppointmentDao.search(params)), containsInAnyOrder(patId, apptId));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchWithUriParam() throws Exception {
|
||||||
|
Class<ValueSet> type = ValueSet.class;
|
||||||
|
String resourceName = "/valueset-dstu2.json";
|
||||||
|
ValueSet vs = loadResourceFromClasspath(type, resourceName);
|
||||||
|
IIdType id1 = myValueSetDao.update(vs, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
ValueSet vs2 = new ValueSet();
|
||||||
|
vs2.setUrl("http://hl7.org/foo/bar");
|
||||||
|
IIdType id2 = myValueSetDao.create(vs2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
IBundleProvider result;
|
||||||
|
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type"));
|
||||||
|
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
||||||
|
|
||||||
|
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type").setQualifier(UriParamQualifierEnum.BELOW));
|
||||||
|
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
||||||
|
|
||||||
|
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/").setQualifier(UriParamQualifierEnum.BELOW));
|
||||||
|
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchWithUriParamAbove() throws Exception {
|
public void testSearchWithUriParamAbove() throws Exception {
|
||||||
ValueSet vs1 = new ValueSet();
|
ValueSet vs1 = new ValueSet();
|
||||||
@ -2240,28 +2310,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
assertThat(toUnqualifiedVersionlessIds(result), empty());
|
assertThat(toUnqualifiedVersionlessIds(result), empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testSearchWithUriParam() throws Exception {
|
|
||||||
Class<ValueSet> type = ValueSet.class;
|
|
||||||
String resourceName = "/valueset-dstu2.json";
|
|
||||||
ValueSet vs = loadResourceFromClasspath(type, resourceName);
|
|
||||||
IIdType id1 = myValueSetDao.update(vs, mySrd).getId().toUnqualifiedVersionless();
|
|
||||||
|
|
||||||
ValueSet vs2 = new ValueSet();
|
|
||||||
vs2.setUrl("http://hl7.org/foo/bar");
|
|
||||||
IIdType id2 = myValueSetDao.create(vs2, mySrd).getId().toUnqualifiedVersionless();
|
|
||||||
|
|
||||||
IBundleProvider result;
|
|
||||||
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type"));
|
|
||||||
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
|
||||||
|
|
||||||
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/basic-resource-type").setQualifier(UriParamQualifierEnum.BELOW));
|
|
||||||
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
|
||||||
|
|
||||||
result = myValueSetDao.search(ValueSet.SP_URL, new UriParam("http://hl7.org/fhir/ValueSet/").setQualifier(UriParamQualifierEnum.BELOW));
|
|
||||||
assertThat(toUnqualifiedVersionlessIds(result), contains(id1));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSearchWithUriParamBelow() throws Exception {
|
public void testSearchWithUriParamBelow() throws Exception {
|
||||||
Class<ValueSet> type = ValueSet.class;
|
Class<ValueSet> type = ValueSet.class;
|
||||||
@ -2297,5 +2345,10 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||||||
return b.toString();
|
return b.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void afterClassClearContext() {
|
||||||
|
TestUtil.clearAllStaticFieldsForUnitTest();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -118,6 +118,11 @@
|
|||||||
class, as it was accidentally commented out. Thanks
|
class, as it was accidentally commented out. Thanks
|
||||||
to GitHub user @Virdulys for the pull request!
|
to GitHub user @Virdulys for the pull request!
|
||||||
</action>
|
</action>
|
||||||
|
<action type="add">
|
||||||
|
JPA server now supports composite search parameters
|
||||||
|
where the type of the composite parameter is
|
||||||
|
a quantity (e.g. Observation:component-code-component-value-quantity)
|
||||||
|
</action>
|
||||||
</release>
|
</release>
|
||||||
<release version="1.5" date="2016-04-20">
|
<release version="1.5" date="2016-04-20">
|
||||||
<action type="fix" issue="339">
|
<action type="fix" issue="339">
|
||||||
|
Loading…
x
Reference in New Issue
Block a user