Work on perf
This commit is contained in:
parent
233eb54710
commit
1581cdf9a8
|
@ -100,6 +100,12 @@ public class SearchBuilder {
|
|||
|
||||
private IHapiTerminologySvc myTerminologySvc;
|
||||
|
||||
private Root<ResourceTable> myResourceTableRoot;
|
||||
|
||||
private ArrayList<Predicate> myPredicates;
|
||||
|
||||
private CriteriaBuilder myBuilder;
|
||||
|
||||
public SearchBuilder(FhirContext theFhirContext, EntityManager theEntityManager, PlatformTransactionManager thePlatformTransactionManager, IFulltextSearchSvc theFulltextSearchSvc,
|
||||
ISearchResultDao theSearchResultDao, BaseHapiFhirDao<?> theDao,
|
||||
IResourceIndexedSearchParamUriDao theResourceIndexedSearchParamUriDao, IForcedIdDao theForcedIdDao, IHapiTerminologySvc theTerminologySvc, ISearchParamRegistry theSearchParamRegistry) {
|
||||
|
@ -155,35 +161,22 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> cq = builder.createQuery(Long.class);
|
||||
Root<ResourceIndexedSearchParamDate> from = cq.from(ResourceIndexedSearchParamDate.class);
|
||||
cq.select(from.get("myResourcePid").as(Long.class));
|
||||
Join<ResourceTable, ResourceIndexedSearchParamDate> join = myResourceTableRoot.join("myParamsDate", JoinType.LEFT);
|
||||
|
||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||
for (IQueryParameterType nextOr : theList) {
|
||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||
if (addPredicateMissingFalseIfPresent(myBuilder, theParamName, join, codePredicates, nextOr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
IQueryParameterType params = nextOr;
|
||||
Predicate p = createPredicateDate(builder, from, params);
|
||||
Predicate p = createPredicateDate(myBuilder, join, params);
|
||||
codePredicates.add(p);
|
||||
}
|
||||
|
||||
Predicate masterCodePredicate = builder.or(toArray(codePredicates));
|
||||
Predicate orPredicates = myBuilder.or(toArray(codePredicates));
|
||||
myPredicates.add(orPredicates);
|
||||
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.equal(from.get("myParamName"), theParamName));
|
||||
createPredicateResourceId(builder, cq, predicates, from.get("myResourcePid").as(Long.class));
|
||||
createPredicateLastUpdatedForIndexedSearchParam(builder, from, predicates);
|
||||
predicates.add(masterCodePredicate);
|
||||
|
||||
cq.where(builder.and(toArray(predicates)));
|
||||
|
||||
TypedQuery<Long> q = myEntityManager.createQuery(cq);
|
||||
doSetPids(q.getResultList());
|
||||
}
|
||||
|
||||
private void addPredicateHas(List<List<? extends IQueryParameterType>> theHasParameters, DateRangeParam theLastUpdated) {
|
||||
|
@ -282,7 +275,7 @@ public class SearchBuilder {
|
|||
doSetPids(q.getResultList());
|
||||
}
|
||||
|
||||
private void addPredicateLanguage(List<Predicate> thePredicates, Root<ResourceTable> theResourceTableRoot, List<List<? extends IQueryParameterType>> theList) {
|
||||
private void addPredicateLanguage(List<List<? extends IQueryParameterType>> theList) {
|
||||
for (List<? extends IQueryParameterType> nextList : theList) {
|
||||
|
||||
Set<String> values = new HashSet<String>();
|
||||
|
@ -302,14 +295,14 @@ public class SearchBuilder {
|
|||
continue;
|
||||
}
|
||||
|
||||
Predicate predicate = theResourceTableRoot.get("myLanguage").as(String.class).in(values);
|
||||
thePredicates.add(predicate);
|
||||
Predicate predicate = myResourceTableRoot.get("myLanguage").as(String.class).in(values);
|
||||
myPredicates.add(predicate);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
private boolean addPredicateMissingFalseIfPresent(CriteriaBuilder theBuilder, String theParamName, Root<? extends BaseResourceIndexedSearchParam> from, List<Predicate> codePredicates,
|
||||
private boolean addPredicateMissingFalseIfPresent(CriteriaBuilder theBuilder, String theParamName, From<?, ? extends BaseResourceIndexedSearchParam> from, List<Predicate> codePredicates,
|
||||
IQueryParameterType nextOr) {
|
||||
boolean missingFalse = false;
|
||||
if (nextOr.getMissing() != null) {
|
||||
|
@ -346,16 +339,13 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> cq = builder.createQuery(Long.class);
|
||||
Root<ResourceIndexedSearchParamNumber> from = cq.from(ResourceIndexedSearchParamNumber.class);
|
||||
cq.select(from.get("myResourcePid").as(Long.class));
|
||||
Join<ResourceTable, ResourceIndexedSearchParamNumber> join = myResourceTableRoot.join("myParamsNumber", JoinType.LEFT);
|
||||
|
||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||
for (IQueryParameterType nextOr : theList) {
|
||||
IQueryParameterType params = nextOr;
|
||||
|
||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||
if (addPredicateMissingFalseIfPresent(myBuilder, theParamName, join, codePredicates, nextOr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -367,12 +357,12 @@ public class SearchBuilder {
|
|||
continue;
|
||||
}
|
||||
|
||||
final Expression<BigDecimal> fromObj = from.get("myValue");
|
||||
final Expression<BigDecimal> fromObj = join.get("myValue");
|
||||
ParamPrefixEnum prefix = ObjectUtils.defaultIfNull(param.getPrefix(), ParamPrefixEnum.EQUAL);
|
||||
String invalidMessageName = "invalidNumberPrefix";
|
||||
String valueAsString = param.getValue().toPlainString();
|
||||
|
||||
Predicate num = createPredicateNumeric(builder, params, prefix, value, fromObj, invalidMessageName, valueAsString);
|
||||
Predicate num = createPredicateNumeric(myBuilder, params, prefix, value, fromObj, invalidMessageName, valueAsString);
|
||||
codePredicates.add(num);
|
||||
|
||||
} else {
|
||||
|
@ -381,17 +371,7 @@ public class SearchBuilder {
|
|||
|
||||
}
|
||||
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.equal(from.get("myParamName"), theParamName));
|
||||
predicates.add(builder.or(toArray(codePredicates)));
|
||||
createPredicateResourceId(builder, cq, predicates, from.get("myResourcePid").as(Long.class));
|
||||
createPredicateLastUpdatedForIndexedSearchParam(builder, from, predicates);
|
||||
|
||||
cq.where(builder.and(toArray(predicates)));
|
||||
|
||||
TypedQuery<Long> q = myEntityManager.createQuery(cq);
|
||||
doSetPids(q.getResultList());
|
||||
myPredicates.add(myBuilder.or(toArray(codePredicates)));
|
||||
}
|
||||
|
||||
private void addPredicateParamMissing(String joinName, String theParamName, Class<? extends BaseResourceIndexedSearchParam> theParamTable) {
|
||||
|
@ -453,32 +433,19 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> cq = builder.createQuery(Long.class);
|
||||
Root<ResourceIndexedSearchParamQuantity> from = cq.from(ResourceIndexedSearchParamQuantity.class);
|
||||
cq.select(from.get("myResourcePid").as(Long.class));
|
||||
Join<ResourceTable, ResourceIndexedSearchParamQuantity> join = myResourceTableRoot.join("myParamsQuantity", JoinType.LEFT);
|
||||
|
||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||
for (IQueryParameterType nextOr : theList) {
|
||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||
if (addPredicateMissingFalseIfPresent(myBuilder, theParamName, join, codePredicates, nextOr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Predicate singleCode = createPredicateQuantity(builder, from, nextOr);
|
||||
Predicate singleCode = createPredicateQuantity(myBuilder, join, nextOr);
|
||||
codePredicates.add(singleCode);
|
||||
}
|
||||
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.equal(from.get("myParamName"), theParamName));
|
||||
predicates.add(builder.or(toArray(codePredicates)));
|
||||
createPredicateResourceId(builder, cq, predicates, from.get("myResourcePid").as(Long.class));
|
||||
createPredicateLastUpdatedForIndexedSearchParam(builder, from, predicates);
|
||||
|
||||
cq.where(builder.and(toArray(predicates)));
|
||||
|
||||
TypedQuery<Long> q = myEntityManager.createQuery(cq);
|
||||
doSetPids(new HashSet<Long>(q.getResultList()));
|
||||
myPredicates.add(myBuilder.or(toArray(codePredicates)));
|
||||
}
|
||||
|
||||
private void addPredicateReference(String theParamName, List<? extends IQueryParameterType> theList) {
|
||||
|
@ -659,34 +626,21 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> cq = builder.createQuery(Long.class);
|
||||
Root<ResourceIndexedSearchParamString> from = cq.from(ResourceIndexedSearchParamString.class);
|
||||
cq.select(from.get("myResourcePid").as(Long.class));
|
||||
Join<ResourceTable, ResourceIndexedSearchParamString> join = myResourceTableRoot.join("myParamsString", JoinType.LEFT);
|
||||
|
||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||
for (IQueryParameterType nextOr : theList) {
|
||||
IQueryParameterType theParameter = nextOr;
|
||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||
if (addPredicateMissingFalseIfPresent(myBuilder, theParamName, join, codePredicates, nextOr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
Predicate singleCode = createPredicateString(theParameter, theParamName, builder, from);
|
||||
Predicate singleCode = createPredicateString(theParameter, theParamName, myBuilder, join);
|
||||
codePredicates.add(singleCode);
|
||||
}
|
||||
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.equal(from.get("myParamName"), theParamName));
|
||||
predicates.add(builder.or(toArray(codePredicates)));
|
||||
myPredicates.add(myBuilder.or(toArray(codePredicates)));
|
||||
|
||||
createPredicateResourceId(builder, cq, predicates, from.get("myResourcePid").as(Long.class));
|
||||
createPredicateLastUpdatedForIndexedSearchParam(builder, from, predicates);
|
||||
|
||||
cq.where(builder.and(toArray(predicates)));
|
||||
|
||||
TypedQuery<Long> q = myEntityManager.createQuery(cq);
|
||||
doSetPids(new HashSet<Long>(q.getResultList()));
|
||||
}
|
||||
|
||||
private void addPredicateTag(List<List<? extends IQueryParameterType>> theList, String theParamName, DateRangeParam theLastUpdated) {
|
||||
|
@ -860,14 +814,11 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Long> cq = builder.createQuery(Long.class);
|
||||
Root<ResourceIndexedSearchParamToken> from = cq.from(ResourceIndexedSearchParamToken.class);
|
||||
cq.select(from.get("myResourcePid").as(Long.class));
|
||||
Join<ResourceTable, ResourceIndexedSearchParamToken> join = myResourceTableRoot.join("myParamsToken", JoinType.LEFT);
|
||||
|
||||
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||
for (IQueryParameterType nextOr : theList) {
|
||||
if (addPredicateMissingFalseIfPresent(builder, theParamName, from, codePredicates, nextOr)) {
|
||||
if (addPredicateMissingFalseIfPresent(myBuilder, theParamName, join, codePredicates, nextOr)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -879,7 +830,7 @@ public class SearchBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
Predicate singleCode = createPredicateToken(nextOr, theParamName, builder, from);
|
||||
Predicate singleCode = createPredicateToken(nextOr, theParamName, myBuilder, join);
|
||||
if (singleCode == null) {
|
||||
doSetPids(new ArrayList<Long>());
|
||||
return;
|
||||
|
@ -891,16 +842,7 @@ public class SearchBuilder {
|
|||
return;
|
||||
}
|
||||
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.equal(from.get("myParamName"), theParamName));
|
||||
predicates.add(builder.or(toArray(codePredicates)));
|
||||
createPredicateResourceId(builder, cq, predicates, from.get("myResourcePid").as(Long.class));
|
||||
|
||||
cq.where(builder.and(toArray(predicates)));
|
||||
|
||||
TypedQuery<Long> q = myEntityManager.createQuery(cq);
|
||||
doSetPids(new HashSet<Long>(q.getResultList()));
|
||||
myPredicates.add(myBuilder.or(toArray(codePredicates)));
|
||||
}
|
||||
|
||||
private void addPredicateUri(String theParamName, List<? extends IQueryParameterType> theList) {
|
||||
|
@ -1029,7 +971,7 @@ public class SearchBuilder {
|
|||
return retVal;
|
||||
}
|
||||
|
||||
private Predicate createPredicateDate(CriteriaBuilder theBuilder, From<ResourceIndexedSearchParamDate, ResourceIndexedSearchParamDate> theFrom, IQueryParameterType theParam) {
|
||||
private Predicate createPredicateDate(CriteriaBuilder theBuilder, From<?, ResourceIndexedSearchParamDate> theFrom, IQueryParameterType theParam) {
|
||||
Predicate p;
|
||||
if (theParam instanceof DateParam) {
|
||||
DateParam date = (DateParam) theParam;
|
||||
|
@ -1049,7 +991,7 @@ public class SearchBuilder {
|
|||
return p;
|
||||
}
|
||||
|
||||
private Predicate createPredicateDateFromRange(CriteriaBuilder theBuilder, From<ResourceIndexedSearchParamDate, ResourceIndexedSearchParamDate> theFrom, DateRangeParam theRange) {
|
||||
private Predicate createPredicateDateFromRange(CriteriaBuilder theBuilder, From<?, ResourceIndexedSearchParamDate> theFrom, DateRangeParam theRange) {
|
||||
Date lowerBound = theRange.getLowerBoundAsInstant();
|
||||
Date upperBound = theRange.getUpperBoundAsInstant();
|
||||
|
||||
|
@ -1149,7 +1091,7 @@ public class SearchBuilder {
|
|||
return num;
|
||||
}
|
||||
|
||||
private Predicate createPredicateQuantity(CriteriaBuilder theBuilder, From<ResourceIndexedSearchParamQuantity, ResourceIndexedSearchParamQuantity> theFrom, IQueryParameterType theParam) {
|
||||
private Predicate createPredicateQuantity(CriteriaBuilder theBuilder, From<?, ResourceIndexedSearchParamQuantity> theFrom, IQueryParameterType theParam) {
|
||||
String systemValue;
|
||||
String unitsValue;
|
||||
ParamPrefixEnum cmpValue;
|
||||
|
@ -1217,7 +1159,7 @@ public class SearchBuilder {
|
|||
}
|
||||
|
||||
private Predicate createPredicateString(IQueryParameterType theParameter, String theParamName, CriteriaBuilder theBuilder,
|
||||
From<ResourceIndexedSearchParamString, ResourceIndexedSearchParamString> theFrom) {
|
||||
From<?, ResourceIndexedSearchParamString> theFrom) {
|
||||
String rawSearchTerm;
|
||||
if (theParameter instanceof TokenParam) {
|
||||
TokenParam id = (TokenParam) theParameter;
|
||||
|
@ -1268,7 +1210,7 @@ public class SearchBuilder {
|
|||
}
|
||||
|
||||
private Predicate createPredicateToken(IQueryParameterType theParameter, String theParamName, CriteriaBuilder theBuilder,
|
||||
From<ResourceIndexedSearchParamToken, ResourceIndexedSearchParamToken> theFrom) {
|
||||
From<?, ResourceIndexedSearchParamToken> theFrom) {
|
||||
String code;
|
||||
String system;
|
||||
TokenParamModifier modifier = null;
|
||||
|
@ -1630,6 +1572,7 @@ public class SearchBuilder {
|
|||
mySearchEntity.setPreferredPageSize(myParams.getCount());
|
||||
mySearchEntity.setSearchType(myParams.getEverythingMode() != null ? SearchTypeEnum.EVERYTHING : SearchTypeEnum.SEARCH);
|
||||
mySearchEntity.setLastUpdated(myParams.getLastUpdated());
|
||||
mySearchEntity.setResourceType(myResourceName);
|
||||
|
||||
for (Include next : myParams.getIncludes()) {
|
||||
mySearchEntity.getIncludes().add(new SearchInclude(mySearchEntity, next.getValue(), false, next.isRecurse()));
|
||||
|
@ -1656,6 +1599,7 @@ public class SearchBuilder {
|
|||
mySearchEntity.setPreferredPageSize(myParams.getCount());
|
||||
mySearchEntity.setSearchType(myParams.getEverythingMode() != null ? SearchTypeEnum.EVERYTHING : SearchTypeEnum.SEARCH);
|
||||
mySearchEntity.setLastUpdated(myParams.getLastUpdated());
|
||||
mySearchEntity.setResourceType(myResourceName);
|
||||
|
||||
for (Include next : myParams.getIncludes()) {
|
||||
mySearchEntity.getIncludes().add(new SearchInclude(mySearchEntity, next.getValue(), false, next.isRecurse()));
|
||||
|
@ -1697,18 +1641,23 @@ public class SearchBuilder {
|
|||
}
|
||||
}
|
||||
|
||||
CriteriaBuilder builder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Tuple> cq = builder.createTupleQuery();
|
||||
Root<ResourceTable> from = cq.from(ResourceTable.class);
|
||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||
predicates.add(builder.equal(from.get("myResourceType"), myResourceName));
|
||||
predicates.add(builder.isNull(from.get("myDeleted")));
|
||||
myBuilder = myEntityManager.getCriteriaBuilder();
|
||||
CriteriaQuery<Tuple> cq = myBuilder.createTupleQuery();
|
||||
cq.distinct(true);
|
||||
myResourceTableRoot = cq.from(ResourceTable.class);
|
||||
myPredicates = new ArrayList<Predicate>();
|
||||
myPredicates.add(myBuilder.equal(myResourceTableRoot.get("myResourceType"), myResourceName));
|
||||
myPredicates.add(myBuilder.isNull(myResourceTableRoot.get("myDeleted")));
|
||||
|
||||
searchForIdsWithAndOr(theParams, predicates, from);
|
||||
DateRangeParam lu = theParams.getLastUpdated();
|
||||
List<Predicate> lastUpdatedPredicates = createLastUpdatedPredicates(lu, myBuilder, myResourceTableRoot);
|
||||
myPredicates.addAll(lastUpdatedPredicates);
|
||||
|
||||
cq.where(builder.and(SearchBuilder.toArray(predicates)));
|
||||
searchForIdsWithAndOr(theParams);
|
||||
|
||||
cq.multiselect(from.get("myId").as(Long.class));
|
||||
cq.where(myBuilder.and(SearchBuilder.toArray(myPredicates)));
|
||||
|
||||
cq.multiselect(myResourceTableRoot.get("myId").as(Long.class));
|
||||
TypedQuery<Tuple> query = myEntityManager.createQuery(cq);
|
||||
query.setFirstResult(theFromIndex);
|
||||
query.setMaxResults(theToIndex - theFromIndex);
|
||||
|
@ -1816,7 +1765,7 @@ public class SearchBuilder {
|
|||
|
||||
}
|
||||
|
||||
private void searchForIdsWithAndOr(SearchParameterMap theParams, List<Predicate> thePredicates, Root<ResourceTable> theResourceTableRoot) {
|
||||
private void searchForIdsWithAndOr(SearchParameterMap theParams) {
|
||||
SearchParameterMap params = theParams;
|
||||
if (params == null) {
|
||||
params = new SearchParameterMap();
|
||||
|
@ -1827,11 +1776,11 @@ public class SearchBuilder {
|
|||
String nextParamName = nextParamEntry.getKey();
|
||||
if (nextParamName.equals(BaseResource.SP_RES_ID)) {
|
||||
|
||||
addPredicateResourceId(thePredicates, theResourceTableRoot, nextParamEntry.getValue());
|
||||
addPredicateResourceId(nextParamEntry.getValue());
|
||||
|
||||
} else if (nextParamName.equals(BaseResource.SP_RES_LANGUAGE)) {
|
||||
|
||||
addPredicateLanguage(thePredicates, theResourceTableRoot, nextParamEntry.getValue());
|
||||
addPredicateLanguage(nextParamEntry.getValue());
|
||||
|
||||
} else if (nextParamName.equals(Constants.PARAM_HAS)) {
|
||||
|
||||
|
@ -1851,65 +1800,41 @@ public class SearchBuilder {
|
|||
case DATE:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateDate(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case QUANTITY:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateQuantity(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case REFERENCE:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateReference(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case STRING:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateString(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TOKEN:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateToken(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case NUMBER:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateNumber(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case COMPOSITE:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateComposite(nextParamDef, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case URI:
|
||||
for (List<? extends IQueryParameterType> nextAnd : nextParamEntry.getValue()) {
|
||||
addPredicateUri(nextParamName, nextAnd);
|
||||
if (doHaveNoResults()) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case HAS:
|
||||
|
@ -1923,7 +1848,7 @@ public class SearchBuilder {
|
|||
|
||||
}
|
||||
|
||||
private void addPredicateResourceId(List<Predicate> thePredicates, Root<ResourceTable> theResourceTableRoot, List<List<? extends IQueryParameterType>> theValues) {
|
||||
private void addPredicateResourceId(List<List<? extends IQueryParameterType>> theValues) {
|
||||
for (List<? extends IQueryParameterType> nextValue : theValues) {
|
||||
Set<Long> orPids = new HashSet<Long>();
|
||||
for (IQueryParameterType next : nextValue) {
|
||||
|
@ -1934,10 +1859,10 @@ public class SearchBuilder {
|
|||
orPids.add(valueAsId.getIdPartAsLong());
|
||||
} else {
|
||||
try {
|
||||
// BaseHasResource entity = myCallingDao.readEntity(valueId);
|
||||
// if (entity.getDeleted() == null) {
|
||||
// orPids.add(entity.getId());
|
||||
// }
|
||||
BaseHasResource entity = myCallingDao.readEntity(valueAsId);
|
||||
if (entity.getDeleted() == null) {
|
||||
orPids.add(entity.getId());
|
||||
}
|
||||
} catch (ResourceNotFoundException e) {
|
||||
/*
|
||||
* This isn't an error, just means no result found
|
||||
|
@ -1948,8 +1873,8 @@ public class SearchBuilder {
|
|||
}
|
||||
|
||||
if (orPids.size() > 0) {
|
||||
Predicate nextPredicate = theResourceTableRoot.get("myId").as(Long.class).in(orPids);
|
||||
thePredicates.add(nextPredicate);
|
||||
Predicate nextPredicate = myResourceTableRoot.get("myId").as(Long.class).in(orPids);
|
||||
myPredicates.add(nextPredicate);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -117,6 +117,10 @@ public final class PersistedJpaBundleProvider implements IBundleProvider {
|
|||
protected List<IBaseResource> doSearchOrEverythingInTransaction(final int theFromIndex, final int theToIndex) {
|
||||
SearchBuilder sb = myDao.newSearchBuilder();
|
||||
|
||||
String resourceName = mySearchEntity.getResourceType();
|
||||
Class<? extends IBaseResource> resourceType = myContext.getResourceDefinition(resourceName).getImplementingClass();
|
||||
sb.setType(resourceType, resourceName);
|
||||
|
||||
SearchParameterMap parameterMap = SerializationUtils.deserialize(mySearchEntity.getSearchParamMap());
|
||||
List<Long> pidsSubList = sb.loadSearchPage(parameterMap, theFromIndex, theToIndex);
|
||||
|
||||
|
|
|
@ -66,45 +66,13 @@ import ca.uhn.fhir.util.TestUtil;
|
|||
public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchNoFtTest.class);
|
||||
|
||||
@Test
|
||||
public void testSearchWithRevIncludes() {
|
||||
final String methodName = "testSearchWithRevIncludes";
|
||||
TransactionTemplate txTemplate = new TransactionTemplate(myTransactionMgr);
|
||||
txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW);
|
||||
IIdType pid = txTemplate.execute(new TransactionCallback<IIdType>() {
|
||||
@Autowired
|
||||
protected IStaleSearchDeletingSvc myStaleSearchDeletingSvc;
|
||||
|
||||
@Override
|
||||
public IIdType doInTransaction(TransactionStatus theStatus) {
|
||||
org.hl7.fhir.dstu3.model.Patient p = new org.hl7.fhir.dstu3.model.Patient();
|
||||
p.addName().setFamily(methodName);
|
||||
IIdType pid = myPatientDao.create(p).getId().toUnqualifiedVersionless();
|
||||
|
||||
org.hl7.fhir.dstu3.model.Condition c = new org.hl7.fhir.dstu3.model.Condition();
|
||||
c.getSubject().setReferenceElement(pid);
|
||||
myConditionDao.create(c);
|
||||
|
||||
return pid;
|
||||
}
|
||||
});
|
||||
|
||||
SearchParameterMap map = new SearchParameterMap();
|
||||
map.add(Patient.SP_RES_ID, new StringParam(pid.getIdPart()));
|
||||
map.addRevInclude(Condition.INCLUDE_PATIENT);
|
||||
IBundleProvider results = myPatientDao.search(map);
|
||||
List<IBaseResource> foundResources = results.getResources(0, results.size());
|
||||
assertEquals(Patient.class, foundResources.get(0).getClass());
|
||||
assertEquals(Condition.class, foundResources.get(1).getClass());
|
||||
}
|
||||
|
||||
/**
|
||||
* #454
|
||||
*/
|
||||
@Test
|
||||
public void testIndexWithUtf8Chars() throws IOException {
|
||||
String input = IOUtils.toString(getClass().getResourceAsStream("/bug454_utf8.json"), StandardCharsets.UTF_8);
|
||||
|
||||
CodeSystem cs = (CodeSystem) myFhirCtx.newJsonParser().parseResource(input);
|
||||
myCodeSystemDao.create(cs);
|
||||
@After
|
||||
public final void after() {
|
||||
myDaoConfig.setExpireSearchResults(new DaoConfig().isExpireSearchResults());
|
||||
myDaoConfig.setExpireSearchResultsAfterMillis(new DaoConfig().getExpireSearchResultsAfterMillis());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -128,6 +96,42 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
assertThat(ids, contains(moId.getValue()));
|
||||
}
|
||||
|
||||
@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().setReferenceElement(orgId);
|
||||
IIdType patId = myPatientDao.create(pat, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Patient pat2 = new Patient();
|
||||
pat2.addAddress().addLine(methodName);
|
||||
pat2.getManagingOrganization().setReferenceElement(orgId);
|
||||
IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
MedicationRequest mo = new MedicationRequest();
|
||||
mo.getSubject().setReferenceElement(patId);
|
||||
mo.setMedication(new Reference(medId));
|
||||
IIdType moId = myMedicationRequestDao.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));
|
||||
}
|
||||
|
||||
/**
|
||||
* Per message from David Hay on Skype
|
||||
*/
|
||||
|
@ -164,7 +168,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
ids = new TreeSet<String>();
|
||||
for (int i = 0; i < everything.size(); i++) {
|
||||
for (IBaseResource next : everything.getResources(i, i+1)) {
|
||||
for (IBaseResource next : everything.getResources(i, i + 1)) {
|
||||
ids.add(next.getIdElement().toUnqualifiedVersionless().getValue());
|
||||
}
|
||||
}
|
||||
|
@ -178,231 +182,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCodeSearch() {
|
||||
Subscription subs = new Subscription();
|
||||
subs.setStatus(SubscriptionStatus.ACTIVE);
|
||||
subs.getChannel().setType(SubscriptionChannelType.WEBSOCKET);
|
||||
subs.setCriteria("Observation?");
|
||||
IIdType id = mySubscriptionDao.create(subs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
SearchParameterMap map = new SearchParameterMap();
|
||||
map.add(Subscription.SP_TYPE, new TokenParam(null, SubscriptionChannelType.WEBSOCKET.toCode()));
|
||||
map.add(Subscription.SP_STATUS, new TokenParam(null, SubscriptionStatus.ACTIVE.toCode()));
|
||||
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().setReferenceElement(orgId);
|
||||
IIdType patId = myPatientDao.create(pat, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Patient pat2 = new Patient();
|
||||
pat2.addAddress().addLine(methodName);
|
||||
pat2.getManagingOrganization().setReferenceElement(orgId);
|
||||
IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
MedicationRequest mo = new MedicationRequest();
|
||||
mo.getSubject().setReferenceElement(patId);
|
||||
mo.setMedication(new Reference(medId));
|
||||
IIdType moId = myMedicationRequestDao.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() {
|
||||
Encounter order = new Encounter();
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
|
||||
IIdType id = myEncounterDao.create(order, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myEncounterDao.search(Encounter.SP_LOCATION_PERIOD, new DateParam("2011-12-12T11:12:12Z")));
|
||||
assertThat(actual, contains(id));
|
||||
|
||||
Class<ResourceIndexedSearchParamDate> type = ResourceIndexedSearchParamDate.class;
|
||||
List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i", 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(Immunization.SP_DOSE_SEQUENCE, new NumberParam("1")));
|
||||
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(Substance.SP_QUANTITY, new QuantityParam((ParamPrefixEnum)null, 123, "http://foo", "UNIT")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIndexNoDuplicatesReference() {
|
||||
Practitioner pract =new Practitioner();
|
||||
pract.setId("Practitioner/somepract");
|
||||
pract.addName().setFamily("SOME PRACT");
|
||||
myPractitionerDao.update(pract, mySrd);
|
||||
Practitioner pract2 =new Practitioner();
|
||||
pract2.setId("Practitioner/somepract2");
|
||||
pract2.addName().setFamily("SOME PRACT2");
|
||||
myPractitionerDao.update(pract2, mySrd);
|
||||
|
||||
ProcedureRequest res = new ProcedureRequest();
|
||||
res.addReplaces(new Reference("Practitioner/somepract"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract2"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract2"));
|
||||
|
||||
IIdType id = myProcedureRequestDao.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(myProcedureRequestDao.search(ProcedureRequest.SP_REPLACES, new ReferenceParam("Practitioner/somepract")));
|
||||
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", type).getResultList();
|
||||
ourLog.info(toStringMultiline(results));
|
||||
assertEquals(2, results.size());
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(Patient.SP_ADDRESS, new StringParam("123 Fake Street")));
|
||||
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", type).getResultList();
|
||||
ourLog.info(toStringMultiline(results));
|
||||
|
||||
// This is 3 for now because the FluentPath for Patient:deceased adds a value.. this should
|
||||
// be corrected at some point, and we'll then drop back down to 2
|
||||
assertEquals(3, results.size());
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(Patient.SP_IDENTIFIER, new TokenParam("http://foo1", "123")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIndexNoDuplicatesUri() {
|
||||
ValueSet res = new ValueSet();
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
|
||||
IIdType id = myValueSetDao.create(res, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Class<ResourceIndexedSearchParamUri> type = ResourceIndexedSearchParamUri.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(myValueSetDao.search(ValueSet.SP_REFERENCE, new UriParam("http://foo")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchAll() {
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
patient.addName().setFamily("Tester").addGiven("Joe");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
}
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("002");
|
||||
patient.addName().setFamily("Tester").addGiven("John");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
}
|
||||
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
List<IBaseResource> patients = toList(myPatientDao.search(params));
|
||||
assertTrue(patients.size() >= 2);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testHasParameter() {
|
||||
IIdType pid0;
|
||||
|
@ -496,18 +275,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHasParameterInvalidTargetPath() {
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put("_has", new HasParam("Observation", "soooooobject", "identifier", "urn:system|FOO"));
|
||||
try {
|
||||
myPatientDao.search(params);
|
||||
fail();
|
||||
} catch (InvalidRequestException e) {
|
||||
assertEquals("Unknown parameter name: Observation:soooooobject", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHasParameterInvalidSearchParam() {
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
|
@ -520,19 +287,215 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testHasParameterInvalidTargetPath() {
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put("_has", new HasParam("Observation", "soooooobject", "identifier", "urn:system|FOO"));
|
||||
try {
|
||||
myPatientDao.search(params);
|
||||
fail();
|
||||
} catch (InvalidRequestException e) {
|
||||
assertEquals("Unknown parameter name: Observation:soooooobject", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIndexNoDuplicatesDate() {
|
||||
Encounter order = new Encounter();
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-12T11:12:12Z")).setEndElement(new DateTimeType("2011-12-12T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
order.addLocation().getPeriod().setStartElement(new DateTimeType("2011-12-11T11:12:12Z")).setEndElement(new DateTimeType("2011-12-11T11:12:12Z"));
|
||||
|
||||
IIdType id = myEncounterDao.create(order, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myEncounterDao.search(Encounter.SP_LOCATION_PERIOD, new DateParam("2011-12-12T11:12:12Z")));
|
||||
assertThat(actual, contains(id));
|
||||
|
||||
Class<ResourceIndexedSearchParamDate> type = ResourceIndexedSearchParamDate.class;
|
||||
List<?> results = myEntityManager.createQuery("SELECT i FROM " + type.getSimpleName() + " i", 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(Immunization.SP_DOSE_SEQUENCE, new NumberParam("1")));
|
||||
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(Substance.SP_QUANTITY, new QuantityParam((ParamPrefixEnum) null, 123, "http://foo", "UNIT")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIndexNoDuplicatesReference() {
|
||||
Practitioner pract = new Practitioner();
|
||||
pract.setId("Practitioner/somepract");
|
||||
pract.addName().setFamily("SOME PRACT");
|
||||
myPractitionerDao.update(pract, mySrd);
|
||||
Practitioner pract2 = new Practitioner();
|
||||
pract2.setId("Practitioner/somepract2");
|
||||
pract2.addName().setFamily("SOME PRACT2");
|
||||
myPractitionerDao.update(pract2, mySrd);
|
||||
|
||||
ProcedureRequest res = new ProcedureRequest();
|
||||
res.addReplaces(new Reference("Practitioner/somepract"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract2"));
|
||||
res.addReplaces(new Reference("Practitioner/somepract2"));
|
||||
|
||||
IIdType id = myProcedureRequestDao.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(myProcedureRequestDao.search(ProcedureRequest.SP_REPLACES, new ReferenceParam("Practitioner/somepract")));
|
||||
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", type).getResultList();
|
||||
ourLog.info(toStringMultiline(results));
|
||||
assertEquals(2, results.size());
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(Patient.SP_ADDRESS, new StringParam("123 Fake Street")));
|
||||
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", type).getResultList();
|
||||
ourLog.info(toStringMultiline(results));
|
||||
|
||||
// This is 3 for now because the FluentPath for Patient:deceased adds a value.. this should
|
||||
// be corrected at some point, and we'll then drop back down to 2
|
||||
assertEquals(3, results.size());
|
||||
|
||||
List<IIdType> actual = toUnqualifiedVersionlessIds(myPatientDao.search(Patient.SP_IDENTIFIER, new TokenParam("http://foo1", "123")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testIndexNoDuplicatesUri() {
|
||||
ValueSet res = new ValueSet();
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
res.getCompose().addInclude().setSystem("http://foo");
|
||||
res.getCompose().addInclude().setSystem("http://bar");
|
||||
|
||||
IIdType id = myValueSetDao.create(res, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Class<ResourceIndexedSearchParamUri> type = ResourceIndexedSearchParamUri.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(myValueSetDao.search(ValueSet.SP_REFERENCE, new UriParam("http://foo")));
|
||||
assertThat(actual, contains(id));
|
||||
}
|
||||
|
||||
/**
|
||||
* #454
|
||||
*/
|
||||
@Test
|
||||
public void testIndexWithUtf8Chars() throws IOException {
|
||||
String input = IOUtils.toString(getClass().getResourceAsStream("/bug454_utf8.json"), StandardCharsets.UTF_8);
|
||||
|
||||
CodeSystem cs = (CodeSystem) myFhirCtx.newJsonParser().parseResource(input);
|
||||
myCodeSystemDao.create(cs);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchAll() {
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
patient.addName().setFamily("Tester").addGiven("Joe");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
}
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("002");
|
||||
patient.addName().setFamily("Tester").addGiven("John");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
}
|
||||
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
List<IBaseResource> patients = toList(myPatientDao.search(params));
|
||||
assertTrue(patients.size() >= 2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchByIdParam() {
|
||||
String id1;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
id1 = myPatientDao.create(patient, mySrd).getId().getValue();
|
||||
id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
}
|
||||
String id2;
|
||||
{
|
||||
Organization patient = new Organization();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
id2 = myOrganizationDao.create(patient, mySrd).getId().getValue();
|
||||
id2 = myOrganizationDao.create(patient, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
}
|
||||
|
||||
Map<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
|
@ -655,6 +618,26 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchCode() {
|
||||
Subscription subs = new Subscription();
|
||||
subs.setStatus(SubscriptionStatus.ACTIVE);
|
||||
subs.getChannel().setType(SubscriptionChannelType.WEBSOCKET);
|
||||
subs.setCriteria("Observation?");
|
||||
IIdType id = mySubscriptionDao.create(subs, mySrd).getId().toUnqualifiedVersionless();
|
||||
|
||||
Map<String, IQueryParameterType> map = new HashMap<String, IQueryParameterType>();
|
||||
assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id));
|
||||
|
||||
map.put(Subscription.SP_TYPE, new TokenParam(null, SubscriptionChannelType.WEBSOCKET.toCode()));
|
||||
map.put(Subscription.SP_STATUS, new TokenParam(null, SubscriptionStatus.ACTIVE.toCode()));
|
||||
assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), contains(id));
|
||||
|
||||
map.put(Subscription.SP_TYPE, new TokenParam(null, SubscriptionChannelType.WEBSOCKET.toCode()));
|
||||
map.put(Subscription.SP_STATUS, new TokenParam(null, SubscriptionStatus.ACTIVE.toCode() + "2"));
|
||||
assertThat(toUnqualifiedVersionlessIds(mySubscriptionDao.search(map)), empty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchCompositeParam() {
|
||||
Observation o1 = new Observation();
|
||||
|
@ -826,7 +809,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
params.put(Patient.SP_NAME, new StringParam("TEST"));
|
||||
assertEquals(0, toList(myPatientDao.search(params)).size());
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
|
@ -1070,7 +1052,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
ourLog.info("Res 2: {}", myPatientDao.read(id1a, mySrd).getMeta().getLastUpdatedElement().getValueAsString());
|
||||
ourLog.info("Res 3: {}", myPatientDao.read(id1b, mySrd).getMeta().getLastUpdatedElement().getValueAsString());
|
||||
|
||||
|
||||
Thread.sleep(sleep);
|
||||
long end = System.currentTimeMillis();
|
||||
|
||||
|
@ -1096,7 +1077,8 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(map)), containsInAnyOrder(id1a, id1b));
|
||||
|
||||
map = new SearchParameterMap();
|
||||
map.setLastUpdated(new DateRangeParam(new DateParam(QuantityCompararatorEnum.GREATERTHAN, startDateTime.getValue()), new DateParam(QuantityCompararatorEnum.LESSTHAN, myPatientDao.read(id1b, mySrd).getMeta().getLastUpdatedElement().getValue())));
|
||||
map.setLastUpdated(new DateRangeParam(new DateParam(QuantityCompararatorEnum.GREATERTHAN, startDateTime.getValue()),
|
||||
new DateParam(QuantityCompararatorEnum.LESSTHAN, myPatientDao.read(id1b, mySrd).getMeta().getLastUpdatedElement().getValue())));
|
||||
ourLog.info("Searching: {}", map.getLastUpdated());
|
||||
assertThat(toUnqualifiedVersionlessIds(myPatientDao.search(map)), containsInAnyOrder(id1a));
|
||||
}
|
||||
|
@ -1160,6 +1142,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
myLocationDao.create(loc, mySrd);
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchNumberParam() {
|
||||
Encounter e1 = new Encounter();
|
||||
|
@ -1187,6 +1170,70 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPagesExpiry() throws Exception {
|
||||
IIdType pid1;
|
||||
IIdType pid2;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
|
||||
SearchParameterMap params;
|
||||
params = new SearchParameterMap();
|
||||
params.add(Patient.SP_FAMILY, new StringParam("EXPIRE"));
|
||||
IBundleProvider bundleProvider = myPatientDao.search(params);
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
|
||||
Thread.sleep(1500);
|
||||
|
||||
myDaoConfig.setExpireSearchResultsAfterMillis(500);
|
||||
myStaleSearchDeletingSvc.pollForStaleSearchesAndDeleteThem();
|
||||
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), not(containsInAnyOrder(pid1, pid2)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPagesExpiryDisabled() throws Exception {
|
||||
IIdType pid1;
|
||||
IIdType pid2;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Date between = new Date();
|
||||
Thread.sleep(10);
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
|
||||
SearchParameterMap params;
|
||||
params = new SearchParameterMap();
|
||||
params.add(Patient.SP_FAMILY, new StringParam("EXPIRE"));
|
||||
IBundleProvider bundleProvider = myPatientDao.search(params);
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
|
||||
myDaoConfig.setExpireSearchResults(false);
|
||||
myStaleSearchDeletingSvc.pollForStaleSearchesAndDeleteThem();
|
||||
Thread.sleep(1500);
|
||||
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), (containsInAnyOrder(pid1, pid2)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchParamChangesType() {
|
||||
String name = "testSearchParamChangesType";
|
||||
|
@ -1214,7 +1261,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testSearchPractitionerPhoneAndEmailParam() {
|
||||
String methodName = "testSearchPractitionerPhoneAndEmailParam";
|
||||
|
@ -1264,7 +1310,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testSearchResourceLinkWithChain() {
|
||||
Patient patient = new Patient();
|
||||
|
@ -1406,7 +1451,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
assertEquals(2, result.size());
|
||||
assertThat(result, containsInAnyOrder(obsId01, obsId02));
|
||||
|
||||
|
||||
params = new SearchParameterMap();
|
||||
params.add(Observation.SP_SUBJECT, new ReferenceParam(Patient.SP_NAME, "testSearchResourceLinkWithChainWithMultipleTypes01"));
|
||||
params.setLastUpdated(new DateRangeParam(between, after));
|
||||
|
@ -1508,80 +1552,6 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
@After
|
||||
public final void after() {
|
||||
myDaoConfig.setExpireSearchResults(new DaoConfig().isExpireSearchResults());
|
||||
myDaoConfig.setExpireSearchResultsAfterMillis(new DaoConfig().getExpireSearchResultsAfterMillis());
|
||||
}
|
||||
|
||||
@Autowired
|
||||
protected IStaleSearchDeletingSvc myStaleSearchDeletingSvc;
|
||||
|
||||
|
||||
@Test
|
||||
public void testSearchPagesExpiryDisabled() throws Exception {
|
||||
IIdType pid1;
|
||||
IIdType pid2;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Date between = new Date();
|
||||
Thread.sleep(10);
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
|
||||
SearchParameterMap params;
|
||||
params = new SearchParameterMap();
|
||||
params.add(Patient.SP_FAMILY, new StringParam("EXPIRE"));
|
||||
IBundleProvider bundleProvider = myPatientDao.search(params);
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
|
||||
myDaoConfig.setExpireSearchResults(false);
|
||||
myStaleSearchDeletingSvc.pollForStaleSearchesAndDeleteThem();
|
||||
Thread.sleep(1500);
|
||||
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), (containsInAnyOrder(pid1, pid2)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchPagesExpiry() throws Exception {
|
||||
IIdType pid1;
|
||||
IIdType pid2;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addName().setFamily("EXPIRE");
|
||||
pid2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
Thread.sleep(10);
|
||||
|
||||
SearchParameterMap params;
|
||||
params = new SearchParameterMap();
|
||||
params.add(Patient.SP_FAMILY, new StringParam("EXPIRE"));
|
||||
IBundleProvider bundleProvider = myPatientDao.search(params);
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), containsInAnyOrder(pid1, pid2));
|
||||
|
||||
Thread.sleep(1500);
|
||||
|
||||
myDaoConfig.setExpireSearchResultsAfterMillis(500);
|
||||
myStaleSearchDeletingSvc.pollForStaleSearchesAndDeleteThem();
|
||||
|
||||
assertThat(toUnqualifiedVersionlessIds(bundleProvider), not(containsInAnyOrder(pid1, pid2)));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchStringParamReallyLong() {
|
||||
String methodName = "testSearchStringParamReallyLong";
|
||||
|
@ -1644,7 +1614,8 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("testSearchTokenParam001");
|
||||
patient.addName().setFamily("Tester").addGiven("testSearchTokenParam1");
|
||||
patient.addCommunication().getLanguage().setText("testSearchTokenParamComText").addCoding().setCode("testSearchTokenParamCode").setSystem("testSearchTokenParamSystem").setDisplay("testSearchTokenParamDisplay");
|
||||
patient.addCommunication().getLanguage().setText("testSearchTokenParamComText").addCoding().setCode("testSearchTokenParamCode").setSystem("testSearchTokenParamSystem")
|
||||
.setDisplay("testSearchTokenParamDisplay");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
|
||||
patient = new Patient();
|
||||
|
@ -1717,7 +1688,8 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("testSearchTokenParam001");
|
||||
patient.addName().setFamily("Tester").addGiven("testSearchTokenParam1");
|
||||
patient.addCommunication().getLanguage().setText("testSearchTokenParamComText").addCoding().setCode("testSearchTokenParamCode").setSystem("testSearchTokenParamSystem").setDisplay("testSearchTokenParamDisplay");
|
||||
patient.addCommunication().getLanguage().setText("testSearchTokenParamComText").addCoding().setCode("testSearchTokenParamCode").setSystem("testSearchTokenParamSystem")
|
||||
.setDisplay("testSearchTokenParamDisplay");
|
||||
myPatientDao.create(patient, mySrd);
|
||||
|
||||
patient = new Patient();
|
||||
|
@ -1774,34 +1746,52 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
public void testSearchValueQuantity() {
|
||||
String methodName = "testSearchValueQuantity";
|
||||
|
||||
String id1;
|
||||
{
|
||||
Observation o = new Observation();
|
||||
o.getCode().addCoding().setSystem("urn:foo").setCode(methodName + "code");
|
||||
Quantity q = new Quantity().setSystem("urn:bar:" + methodName).setCode(methodName + "units").setValue(100);
|
||||
o.setValue(q);
|
||||
id1 = myObservationDao.create(o, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
}
|
||||
|
||||
String id2;
|
||||
{
|
||||
Observation o = new Observation();
|
||||
o.getCode().addCoding().setSystem("urn:foo").setCode(methodName + "code");
|
||||
Quantity q = new Quantity().setSystem("urn:bar:" + methodName).setCode(methodName + "units").setValue(5);
|
||||
o.setValue(q);
|
||||
id2 = myObservationDao.create(o, mySrd).getId().toUnqualifiedVersionless().getValue();
|
||||
}
|
||||
|
||||
Map<String, IQueryParameterType> map = new HashMap<String, IQueryParameterType>();
|
||||
IBundleProvider found;
|
||||
QuantityParam param;
|
||||
Set<Long> found;
|
||||
param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), null, null);
|
||||
found = myObservationDao.searchForIds("value-quantity", param);
|
||||
int initialSize = found.size();
|
||||
|
||||
Observation o = new Observation();
|
||||
o.getCode().addCoding().setSystem("urn:foo").setCode(methodName + "code");
|
||||
Quantity q = new Quantity().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("value-quantity", param);
|
||||
assertEquals(1 + initialSize, found.size());
|
||||
map.put(Observation.SP_VALUE_QUANTITY, param);
|
||||
found = myObservationDao.search(map);
|
||||
assertThat(toUnqualifiedVersionlessIdValues(found), contains(id1));
|
||||
|
||||
param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), null, methodName + "units");
|
||||
found = myObservationDao.searchForIds("value-quantity", param);
|
||||
assertEquals(1, found.size());
|
||||
map.put(Observation.SP_VALUE_QUANTITY, param);
|
||||
found = myObservationDao.search(map);
|
||||
assertThat(toUnqualifiedVersionlessIdValues(found), contains(id1));
|
||||
|
||||
param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), "urn:bar:" + methodName, null);
|
||||
found = myObservationDao.searchForIds("value-quantity", param);
|
||||
assertEquals(1, found.size());
|
||||
map.put(Observation.SP_VALUE_QUANTITY, param);
|
||||
found = myObservationDao.search(map);
|
||||
assertThat(toUnqualifiedVersionlessIdValues(found), contains(id1));
|
||||
|
||||
param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("10"), "urn:bar:" + methodName, methodName + "units");
|
||||
found = myObservationDao.searchForIds("value-quantity", param);
|
||||
assertEquals(1, found.size());
|
||||
map.put(Observation.SP_VALUE_QUANTITY, param);
|
||||
found = myObservationDao.search(map);
|
||||
assertThat(toUnqualifiedVersionlessIdValues(found), contains(id1));
|
||||
|
||||
param = new QuantityParam(ParamPrefixEnum.GREATERTHAN_OR_EQUALS, new BigDecimal("1000"), "urn:bar:" + methodName, methodName + "units");
|
||||
map.put(Observation.SP_VALUE_QUANTITY, param);
|
||||
found = myObservationDao.search(map);
|
||||
assertThat(toUnqualifiedVersionlessIdValues(found), empty());
|
||||
|
||||
}
|
||||
|
||||
|
@ -2170,6 +2160,50 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchWithDate() {
|
||||
IIdType orgId = myOrganizationDao.create(new Organization(), mySrd).getId();
|
||||
IIdType id2;
|
||||
IIdType id1;
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("001");
|
||||
id1 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
{
|
||||
Patient patient = new Patient();
|
||||
patient.addIdentifier().setSystem("urn:system").setValue("002");
|
||||
patient.addName().setFamily("Tester_testSearchStringParam").addGiven("John");
|
||||
patient.setBirthDateElement(new DateType("2011-01-01"));
|
||||
patient.getManagingOrganization().setReferenceElement(orgId);
|
||||
id2 = myPatientDao.create(patient, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
{
|
||||
HashMap<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put(Patient.SP_BIRTHDATE, new DateParam("2011-01-01"));
|
||||
List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params));
|
||||
assertThat(patients, contains(id2));
|
||||
}
|
||||
{
|
||||
HashMap<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put(Patient.SP_BIRTHDATE, new DateParam("2011-01-03"));
|
||||
List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params));
|
||||
assertThat(patients, empty());
|
||||
}
|
||||
{
|
||||
HashMap<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put(Patient.SP_BIRTHDATE, new DateParam("2011-01-03").setPrefix(ParamPrefixEnum.LESSTHAN));
|
||||
List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params));
|
||||
assertThat(patients, contains(id2));
|
||||
}
|
||||
{
|
||||
HashMap<String, IQueryParameterType> params = new HashMap<String, IQueryParameterType>();
|
||||
params.put(Patient.SP_BIRTHDATE, new DateParam("2010-01-01").setPrefix(ParamPrefixEnum.LESSTHAN));
|
||||
List<IIdType> patients = toUnqualifiedVersionlessIds(myPatientDao.search(params));
|
||||
assertThat(patients, empty());
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchWithMissingQuantity() {
|
||||
IIdType notMissing;
|
||||
|
@ -2310,6 +2344,36 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchWithRevIncludes() {
|
||||
final String methodName = "testSearchWithRevIncludes";
|
||||
TransactionTemplate txTemplate = new TransactionTemplate(myTransactionMgr);
|
||||
txTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRES_NEW);
|
||||
IIdType pid = txTemplate.execute(new TransactionCallback<IIdType>() {
|
||||
|
||||
@Override
|
||||
public IIdType doInTransaction(TransactionStatus theStatus) {
|
||||
org.hl7.fhir.dstu3.model.Patient p = new org.hl7.fhir.dstu3.model.Patient();
|
||||
p.addName().setFamily(methodName);
|
||||
IIdType pid = myPatientDao.create(p).getId().toUnqualifiedVersionless();
|
||||
|
||||
org.hl7.fhir.dstu3.model.Condition c = new org.hl7.fhir.dstu3.model.Condition();
|
||||
c.getSubject().setReferenceElement(pid);
|
||||
myConditionDao.create(c);
|
||||
|
||||
return pid;
|
||||
}
|
||||
});
|
||||
|
||||
SearchParameterMap map = new SearchParameterMap();
|
||||
map.add(Patient.SP_RES_ID, new StringParam(pid.getIdPart()));
|
||||
map.addRevInclude(Condition.INCLUDE_PATIENT);
|
||||
IBundleProvider results = myPatientDao.search(map);
|
||||
List<IBaseResource> foundResources = results.getResources(0, results.size());
|
||||
assertEquals(Patient.class, foundResources.get(0).getClass());
|
||||
assertEquals(Condition.class, foundResources.get(1).getClass());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSearchWithSecurityAndProfileParams() {
|
||||
String methodName = "testSearchWithSecurityAndProfileParams";
|
||||
|
@ -2361,8 +2425,8 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
{
|
||||
Organization org = new Organization();
|
||||
org.getNameElement().setValue("FOO");
|
||||
org.getMeta().addTag("urn:taglist", methodName + "2a",null);
|
||||
org.getMeta().addTag("urn:taglist", methodName + "2b",null);
|
||||
org.getMeta().addTag("urn:taglist", methodName + "2a", null);
|
||||
org.getMeta().addTag("urn:taglist", methodName + "2b", null);
|
||||
tag2id = myOrganizationDao.create(org, mySrd).getId().toUnqualifiedVersionless();
|
||||
}
|
||||
|
||||
|
@ -2631,5 +2695,4 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
|||
TestUtil.clearAllStaticFieldsForUnitTest();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue