Work on custom params
This commit is contained in:
parent
3191c907a3
commit
97ff79d730
|
@ -0,0 +1,8 @@
|
||||||
|
# Help Wanted
|
||||||
|
|
||||||
|
This page is a work in progress!
|
||||||
|
|
||||||
|
It serves as a place to list potential help a new volunteer could offer.
|
||||||
|
|
||||||
|
* Investigate adding support for FHIR's RDF (Turtle) encoding to HAPI
|
||||||
|
|
|
@ -403,19 +403,26 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
retVal.setDotQualifier(theParamName.substring(dotIdx, colonIdx));
|
retVal.setDotQualifier(theParamName.substring(dotIdx, colonIdx));
|
||||||
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
||||||
retVal.setParamName(theParamName.substring(0, dotIdx));
|
retVal.setParamName(theParamName.substring(0, dotIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(dotIdx));
|
||||||
} else {
|
} else {
|
||||||
retVal.setColonQualifier(theParamName.substring(colonIdx, dotIdx));
|
retVal.setColonQualifier(theParamName.substring(colonIdx, dotIdx));
|
||||||
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
||||||
retVal.setParamName(theParamName.substring(0, colonIdx));
|
retVal.setParamName(theParamName.substring(0, colonIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(colonIdx));
|
||||||
}
|
}
|
||||||
} else if (dotIdx != -1) {
|
} else if (dotIdx != -1) {
|
||||||
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
retVal.setDotQualifier(theParamName.substring(dotIdx));
|
||||||
retVal.setParamName(theParamName.substring(0, dotIdx));
|
retVal.setParamName(theParamName.substring(0, dotIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(dotIdx));
|
||||||
} else if (colonIdx != -1) {
|
} else if (colonIdx != -1) {
|
||||||
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
retVal.setColonQualifier(theParamName.substring(colonIdx));
|
||||||
retVal.setParamName(theParamName.substring(0, colonIdx));
|
retVal.setParamName(theParamName.substring(0, colonIdx));
|
||||||
|
retVal.setWholeQualifier(theParamName.substring(colonIdx));
|
||||||
} else {
|
} else {
|
||||||
retVal.setParamName(theParamName);
|
retVal.setParamName(theParamName);
|
||||||
|
retVal.setColonQualifier(null);
|
||||||
|
retVal.setDotQualifier(null);
|
||||||
|
retVal.setWholeQualifier(null);
|
||||||
}
|
}
|
||||||
|
|
||||||
return retVal;
|
return retVal;
|
||||||
|
@ -426,6 +433,7 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
private String myColonQualifier;
|
private String myColonQualifier;
|
||||||
private String myDotQualifier;
|
private String myDotQualifier;
|
||||||
private String myParamName;
|
private String myParamName;
|
||||||
|
private String myWholeQualifier;
|
||||||
|
|
||||||
public boolean passes(Set<String> theQualifierWhitelist, Set<String> theQualifierBlacklist) {
|
public boolean passes(Set<String> theQualifierWhitelist, Set<String> theQualifierBlacklist) {
|
||||||
if (theQualifierWhitelist != null) {
|
if (theQualifierWhitelist != null) {
|
||||||
|
@ -487,6 +495,14 @@ public class SearchMethodBinding extends BaseResourceReturningMethodBinding {
|
||||||
myDotQualifier = theDotQualifier;
|
myDotQualifier = theDotQualifier;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getWholeQualifier() {
|
||||||
|
return myWholeQualifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWholeQualifier(String theWholeQualifier) {
|
||||||
|
myWholeQualifier = theWholeQualifier;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static BaseHttpClientInvocation createSearchInvocation(FhirContext theContext, String theSearchUrl, Map<String, List<String>> theParams) {
|
public static BaseHttpClientInvocation createSearchInvocation(FhirContext theContext, String theSearchUrl, Map<String, List<String>> theParams) {
|
||||||
|
|
|
@ -213,6 +213,9 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISearchParamExtractor mySearchParamExtractor;
|
private ISearchParamExtractor mySearchParamExtractor;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ISearchParamRegistry mySearchParamRegistry;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISearchResultDao mySearchResultDao;
|
private ISearchResultDao mySearchResultDao;
|
||||||
|
|
||||||
|
@ -943,7 +946,7 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
||||||
public <R extends IBaseResource> Set<Long> processMatchUrl(String theMatchUrl, Class<R> theResourceType) {
|
public <R extends IBaseResource> Set<Long> processMatchUrl(String theMatchUrl, Class<R> theResourceType) {
|
||||||
RuntimeResourceDefinition resourceDef = getContext().getResourceDefinition(theResourceType);
|
RuntimeResourceDefinition resourceDef = getContext().getResourceDefinition(theResourceType);
|
||||||
|
|
||||||
SearchParameterMap paramMap = translateMatchUrl(myContext, theMatchUrl, resourceDef);
|
SearchParameterMap paramMap = translateMatchUrl(this, myContext, theMatchUrl, resourceDef);
|
||||||
paramMap.setPersistResults(false);
|
paramMap.setPersistResults(false);
|
||||||
|
|
||||||
if (paramMap.isEmpty() && paramMap.getLastUpdated() == null) {
|
if (paramMap.isEmpty() && paramMap.getLastUpdated() == null) {
|
||||||
|
@ -956,30 +959,18 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
||||||
return ids;
|
return ids;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public RuntimeSearchParam getSearchParamByName(RuntimeResourceDefinition theResourceDef, String theParamName) {
|
||||||
|
Map<String, RuntimeSearchParam> params = mySearchParamRegistry.getActiveSearchParams(theResourceDef.getName());
|
||||||
|
return params.get(theParamName);
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
@CoverageIgnore
|
@CoverageIgnore
|
||||||
public BaseHasResource readEntity(IIdType theValueId) {
|
public BaseHasResource readEntity(IIdType theValueId) {
|
||||||
throw new NotImplementedException("");
|
throw new NotImplementedException("");
|
||||||
}
|
}
|
||||||
|
|
||||||
// protected MetaDt toMetaDt(Collection<TagDefinition> tagDefinitions) {
|
|
||||||
// MetaDt retVal = new MetaDt();
|
|
||||||
// for (TagDefinition next : tagDefinitions) {
|
|
||||||
// switch (next.getTagType()) {
|
|
||||||
// case PROFILE:
|
|
||||||
// retVal.addProfile(next.getCode());
|
|
||||||
// break;
|
|
||||||
// case SECURITY_LABEL:
|
|
||||||
// retVal.addSecurity().setSystem(next.getSystem()).setCode(next.getCode()).setDisplay(next.getDisplay());
|
|
||||||
// break;
|
|
||||||
// case TAG:
|
|
||||||
// retVal.addTag().setSystem(next.getSystem()).setCode(next.getCode()).setDisplay(next.getDisplay());
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// return retVal;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public void setConfig(DaoConfig theConfig) {
|
public void setConfig(DaoConfig theConfig) {
|
||||||
myConfig = theConfig;
|
myConfig = theConfig;
|
||||||
}
|
}
|
||||||
|
@ -1718,7 +1709,7 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SearchParameterMap translateMatchUrl(FhirContext theContext, String theMatchUrl, RuntimeResourceDefinition resourceDef) {
|
public static SearchParameterMap translateMatchUrl(IDao theCallingDao, FhirContext theContext, String theMatchUrl, RuntimeResourceDefinition resourceDef) {
|
||||||
SearchParameterMap paramMap = new SearchParameterMap();
|
SearchParameterMap paramMap = new SearchParameterMap();
|
||||||
List<NameValuePair> parameters = translateMatchUrl(theMatchUrl);
|
List<NameValuePair> parameters = translateMatchUrl(theMatchUrl);
|
||||||
|
|
||||||
|
@ -1788,7 +1779,7 @@ public abstract class BaseHapiFhirDao<T extends IBaseResource> implements IDao {
|
||||||
} else if (nextParamName.startsWith("_")) {
|
} else if (nextParamName.startsWith("_")) {
|
||||||
// ignore these since they aren't search params (e.g. _sort)
|
// ignore these since they aren't search params (e.g. _sort)
|
||||||
} else {
|
} else {
|
||||||
RuntimeSearchParam paramDef = resourceDef.getSearchParam(nextParamName);
|
RuntimeSearchParam paramDef = theCallingDao.getSearchParamByName(resourceDef, nextParamName);
|
||||||
if (paramDef == null) {
|
if (paramDef == null) {
|
||||||
throw new InvalidRequestException("Failed to parse match URL[" + theMatchUrl + "] - Resource type " + resourceDef.getName() + " does not have a parameter with name: " + nextParamName);
|
throw new InvalidRequestException("Failed to parse match URL[" + theMatchUrl + "] - Resource type " + resourceDef.getName() + " does not have a parameter with name: " + nextParamName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,15 +22,29 @@ package ca.uhn.fhir.jpa.dao;
|
||||||
|
|
||||||
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
import static org.apache.commons.lang3.StringUtils.isNotBlank;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.TreeSet;
|
||||||
|
|
||||||
import javax.annotation.PostConstruct;
|
import javax.annotation.PostConstruct;
|
||||||
import javax.persistence.NoResultException;
|
import javax.persistence.NoResultException;
|
||||||
import javax.persistence.TypedQuery;
|
import javax.persistence.TypedQuery;
|
||||||
|
|
||||||
import org.hl7.fhir.dstu3.model.IdType;
|
import org.hl7.fhir.dstu3.model.IdType;
|
||||||
import org.hl7.fhir.instance.model.api.*;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseCoding;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseMetaType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
|
||||||
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Required;
|
import org.springframework.beans.factory.annotation.Required;
|
||||||
import org.springframework.transaction.PlatformTransactionManager;
|
import org.springframework.transaction.PlatformTransactionManager;
|
||||||
|
@ -44,23 +58,42 @@ import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||||
import ca.uhn.fhir.jpa.dao.data.IResourceHistoryTableDao;
|
import ca.uhn.fhir.jpa.dao.data.IResourceHistoryTableDao;
|
||||||
import ca.uhn.fhir.jpa.dao.data.IResourceIndexedSearchParamUriDao;
|
import ca.uhn.fhir.jpa.dao.data.IResourceIndexedSearchParamUriDao;
|
||||||
import ca.uhn.fhir.jpa.dao.data.ISearchResultDao;
|
import ca.uhn.fhir.jpa.dao.data.ISearchResultDao;
|
||||||
import ca.uhn.fhir.jpa.entity.*;
|
import ca.uhn.fhir.jpa.entity.BaseHasResource;
|
||||||
|
import ca.uhn.fhir.jpa.entity.BaseTag;
|
||||||
|
import ca.uhn.fhir.jpa.entity.ResourceHistoryTable;
|
||||||
|
import ca.uhn.fhir.jpa.entity.ResourceLink;
|
||||||
|
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
||||||
|
import ca.uhn.fhir.jpa.entity.TagDefinition;
|
||||||
|
import ca.uhn.fhir.jpa.entity.TagTypeEnum;
|
||||||
import ca.uhn.fhir.jpa.interceptor.IJpaServerInterceptor;
|
import ca.uhn.fhir.jpa.interceptor.IJpaServerInterceptor;
|
||||||
import ca.uhn.fhir.jpa.term.IHapiTerminologySvc;
|
import ca.uhn.fhir.jpa.term.IHapiTerminologySvc;
|
||||||
import ca.uhn.fhir.jpa.util.DeleteConflict;
|
import ca.uhn.fhir.jpa.util.DeleteConflict;
|
||||||
import ca.uhn.fhir.jpa.util.StopWatch;
|
import ca.uhn.fhir.jpa.util.StopWatch;
|
||||||
import ca.uhn.fhir.jpa.util.jsonpatch.JsonPatchUtils;
|
import ca.uhn.fhir.jpa.util.jsonpatch.JsonPatchUtils;
|
||||||
import ca.uhn.fhir.jpa.util.xmlpatch.XmlPatchUtils;
|
import ca.uhn.fhir.jpa.util.xmlpatch.XmlPatchUtils;
|
||||||
import ca.uhn.fhir.model.api.*;
|
import ca.uhn.fhir.model.api.IQueryParameterAnd;
|
||||||
|
import ca.uhn.fhir.model.api.IQueryParameterType;
|
||||||
|
import ca.uhn.fhir.model.api.IResource;
|
||||||
|
import ca.uhn.fhir.model.api.Include;
|
||||||
|
import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
|
import ca.uhn.fhir.model.api.TagList;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
import ca.uhn.fhir.rest.api.PatchTypeEnum;
|
||||||
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
import ca.uhn.fhir.rest.api.RestOperationTypeEnum;
|
||||||
|
import ca.uhn.fhir.rest.method.MethodUtil;
|
||||||
|
import ca.uhn.fhir.rest.method.QualifiedParamList;
|
||||||
import ca.uhn.fhir.rest.method.RequestDetails;
|
import ca.uhn.fhir.rest.method.RequestDetails;
|
||||||
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
import ca.uhn.fhir.rest.method.RestSearchParameterTypeEnum;
|
||||||
import ca.uhn.fhir.rest.method.SearchMethodBinding;
|
import ca.uhn.fhir.rest.method.SearchMethodBinding;
|
||||||
import ca.uhn.fhir.rest.method.SearchMethodBinding.QualifierDetails;
|
import ca.uhn.fhir.rest.method.SearchMethodBinding.QualifierDetails;
|
||||||
import ca.uhn.fhir.rest.server.IBundleProvider;
|
import ca.uhn.fhir.rest.server.IBundleProvider;
|
||||||
import ca.uhn.fhir.rest.server.exceptions.*;
|
import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.InvalidRequestException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.PreconditionFailedException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceGoneException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.ResourceVersionConflictException;
|
||||||
|
import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor;
|
||||||
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
import ca.uhn.fhir.rest.server.interceptor.IServerInterceptor.ActionRequestDetails;
|
||||||
import ca.uhn.fhir.util.FhirTerser;
|
import ca.uhn.fhir.util.FhirTerser;
|
||||||
|
@ -697,7 +730,7 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
myResourceName = def.getName();
|
myResourceName = def.getName();
|
||||||
|
|
||||||
if (mySecondaryPrimaryKeyParamName != null) {
|
if (mySecondaryPrimaryKeyParamName != null) {
|
||||||
RuntimeSearchParam sp = def.getSearchParam(mySecondaryPrimaryKeyParamName);
|
RuntimeSearchParam sp = getSearchParamByName(def, mySecondaryPrimaryKeyParamName);
|
||||||
if (sp == null) {
|
if (sp == null) {
|
||||||
throw new ConfigurationException("Unknown search param on resource[" + myResourceName + "] for secondary key[" + mySecondaryPrimaryKeyParamName + "]");
|
throw new ConfigurationException("Unknown search param on resource[" + myResourceName + "] for secondary key[" + mySecondaryPrimaryKeyParamName + "]");
|
||||||
}
|
}
|
||||||
|
@ -1027,7 +1060,19 @@ public abstract class BaseHapiFhirResourceDao<T extends IBaseResource> extends B
|
||||||
throw new InvalidRequestException(msg);
|
throw new InvalidRequestException(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
aaaa
|
// Should not be null since the check above would have caught it
|
||||||
|
RuntimeResourceDefinition resourceDef = getContext().getResourceDefinition(myResourceName);
|
||||||
|
RuntimeSearchParam paramDef = getSearchParamByName(resourceDef, qualifiedParamName.getParamName());
|
||||||
|
|
||||||
|
for (String nextValue : theSource.get(nextParamName)) {
|
||||||
|
if (isNotBlank(nextValue)) {
|
||||||
|
QualifiedParamList qualifiedParam = QualifiedParamList.splitQueryStringByCommasIgnoreEscape(qualifiedParamName.getWholeQualifier(), nextValue);
|
||||||
|
List<QualifiedParamList> paramList = Collections.singletonList(qualifiedParam);
|
||||||
|
IQueryParameterAnd<?> parsedParam = MethodUtil.parseQueryParams(getContext(), paramDef, nextParamName, paramList);
|
||||||
|
theTarget.add(qualifiedParamName.getParamName(), parsedParam);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,7 +79,8 @@ public class FhirResourceDaoDstu2<T extends IResource> extends BaseHapiFhirResou
|
||||||
values.addAll(theTerser.getAllPopulatedChildElementsOfType(theResource, BaseResourceReferenceDt.class));
|
values.addAll(theTerser.getAllPopulatedChildElementsOfType(theResource, BaseResourceReferenceDt.class));
|
||||||
} else if (theInclude.getValue().startsWith(theResourceDef.getName() + ":")) {
|
} else if (theInclude.getValue().startsWith(theResourceDef.getName() + ":")) {
|
||||||
values = new ArrayList<Object>();
|
values = new ArrayList<Object>();
|
||||||
RuntimeSearchParam sp = theResourceDef.getSearchParam(theInclude.getValue().substring(theInclude.getValue().indexOf(':') + 1));
|
String paramName = theInclude.getValue().substring(theInclude.getValue().indexOf(':') + 1);
|
||||||
|
RuntimeSearchParam sp = getSearchParamByName(theResourceDef, paramName);
|
||||||
for (String nextPath : sp.getPathsSplit()) {
|
for (String nextPath : sp.getPathsSplit()) {
|
||||||
values.addAll(theTerser.getValues(theResource, nextPath));
|
values.addAll(theTerser.getValues(theResource, nextPath));
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,7 +152,7 @@ public class FhirResourceDaoSubscriptionDstu2 extends FhirResourceDaoDstu2<Subsc
|
||||||
private int pollForNewUndeliveredResources(SubscriptionTable theSubscriptionTable) {
|
private int pollForNewUndeliveredResources(SubscriptionTable theSubscriptionTable) {
|
||||||
Subscription subscription = toResource(Subscription.class, theSubscriptionTable.getSubscriptionResource(), false);
|
Subscription subscription = toResource(Subscription.class, theSubscriptionTable.getSubscriptionResource(), false);
|
||||||
RuntimeResourceDefinition resourceDef = validateCriteriaAndReturnResourceDefinition(subscription);
|
RuntimeResourceDefinition resourceDef = validateCriteriaAndReturnResourceDefinition(subscription);
|
||||||
SearchParameterMap criteriaUrl = translateMatchUrl(getContext(), subscription.getCriteria(), resourceDef);
|
SearchParameterMap criteriaUrl = translateMatchUrl(this, getContext(), subscription.getCriteria(), resourceDef);
|
||||||
|
|
||||||
criteriaUrl = new SearchParameterMap();
|
criteriaUrl = new SearchParameterMap();
|
||||||
long start = theSubscriptionTable.getMostRecentMatch().getTime();
|
long start = theSubscriptionTable.getMostRecentMatch().getTime();
|
||||||
|
|
|
@ -6,6 +6,8 @@ import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
import org.hl7.fhir.instance.model.api.IBaseResource;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||||
|
import ca.uhn.fhir.context.RuntimeSearchParam;
|
||||||
import ca.uhn.fhir.jpa.entity.BaseHasResource;
|
import ca.uhn.fhir.jpa.entity.BaseHasResource;
|
||||||
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
import ca.uhn.fhir.jpa.entity.ResourceTable;
|
||||||
import ca.uhn.fhir.jpa.search.PersistedJpaBundleProvider;
|
import ca.uhn.fhir.jpa.search.PersistedJpaBundleProvider;
|
||||||
|
@ -73,4 +75,6 @@ public interface IDao {
|
||||||
<R extends IBaseResource> R toResource(Class<R> theResourceType, BaseHasResource theEntity, boolean theForHistoryOperation);
|
<R extends IBaseResource> R toResource(Class<R> theResourceType, BaseHasResource theEntity, boolean theForHistoryOperation);
|
||||||
|
|
||||||
void populateFullTextFields(IBaseResource theResource, ResourceTable theEntity);
|
void populateFullTextFields(IBaseResource theResource, ResourceTable theEntity);
|
||||||
|
|
||||||
|
RuntimeSearchParam getSearchParamByName(RuntimeResourceDefinition theResourceDef, String theParamName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -216,12 +216,13 @@ public class SearchBuilder {
|
||||||
throw new InvalidRequestException("Invalid resource type: " + targetResourceType);
|
throw new InvalidRequestException("Invalid resource type: " + targetResourceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
RuntimeSearchParam owningParameterDef = targetResourceDefinition.getSearchParam(parameterName.replaceAll("\\..*", ""));
|
String paramName = parameterName.replaceAll("\\..*", "");
|
||||||
|
RuntimeSearchParam owningParameterDef = myCallingDao.getSearchParamByName(targetResourceDefinition, paramName);
|
||||||
if (owningParameterDef == null) {
|
if (owningParameterDef == null) {
|
||||||
throw new InvalidRequestException("Unknown parameter name: " + targetResourceType + ':' + parameterName);
|
throw new InvalidRequestException("Unknown parameter name: " + targetResourceType + ':' + parameterName);
|
||||||
}
|
}
|
||||||
|
|
||||||
owningParameterDef = targetResourceDefinition.getSearchParam(owningParameter);
|
owningParameterDef = myCallingDao.getSearchParamByName(targetResourceDefinition, owningParameter);
|
||||||
if (owningParameterDef == null) {
|
if (owningParameterDef == null) {
|
||||||
throw new InvalidRequestException("Unknown parameter name: " + targetResourceType + ':' + owningParameter);
|
throw new InvalidRequestException("Unknown parameter name: " + targetResourceType + ':' + owningParameter);
|
||||||
}
|
}
|
||||||
|
@ -241,7 +242,7 @@ public class SearchBuilder {
|
||||||
List<Predicate> predicates = new ArrayList<Predicate>();
|
List<Predicate> predicates = new ArrayList<Predicate>();
|
||||||
predicates.add(builder.equal(from.get("mySourceResourceType"), targetResourceType));
|
predicates.add(builder.equal(from.get("mySourceResourceType"), targetResourceType));
|
||||||
predicates.add(from.get("mySourceResourcePid").in(match));
|
predicates.add(from.get("mySourceResourcePid").in(match));
|
||||||
predicates.add(createResourceLinkPathPredicate(myContext, owningParameter, from, resourceType));
|
predicates.add(createResourceLinkPathPredicate(myCallingDao, myContext, owningParameter, from, resourceType));
|
||||||
predicates.add(builder.equal(from.get("myTargetResourceType"), myResourceName));
|
predicates.add(builder.equal(from.get("myTargetResourceType"), myResourceName));
|
||||||
createPredicateResourceId(builder, cq, predicates, from.get("myId").as(Long.class));
|
createPredicateResourceId(builder, cq, predicates, from.get("myId").as(Long.class));
|
||||||
createPredicateLastUpdatedForResourceLink(builder, from, predicates);
|
createPredicateLastUpdatedForResourceLink(builder, from, predicates);
|
||||||
|
@ -552,7 +553,8 @@ public class SearchBuilder {
|
||||||
String resourceId;
|
String resourceId;
|
||||||
if (!ref.getValue().matches("[a-zA-Z]+\\/.*")) {
|
if (!ref.getValue().matches("[a-zA-Z]+\\/.*")) {
|
||||||
|
|
||||||
String paramPath = myContext.getResourceDefinition(myResourceType).getSearchParam(theParamName).getPath();
|
RuntimeResourceDefinition resourceDef = myContext.getResourceDefinition(myResourceType);
|
||||||
|
String paramPath = myCallingDao.getSearchParamByName(resourceDef, theParamName).getPath();
|
||||||
if (paramPath.endsWith(".as(Reference)")) {
|
if (paramPath.endsWith(".as(Reference)")) {
|
||||||
paramPath = paramPath.substring(0, paramPath.length() - ".as(Reference)".length()) + "Reference";
|
paramPath = paramPath.substring(0, paramPath.length() - ".as(Reference)".length()) + "Reference";
|
||||||
}
|
}
|
||||||
|
@ -606,7 +608,7 @@ public class SearchBuilder {
|
||||||
boolean isMeta = BaseHapiFhirDao.RESOURCE_META_PARAMS.containsKey(chain);
|
boolean isMeta = BaseHapiFhirDao.RESOURCE_META_PARAMS.containsKey(chain);
|
||||||
RuntimeSearchParam param = null;
|
RuntimeSearchParam param = null;
|
||||||
if (!isMeta) {
|
if (!isMeta) {
|
||||||
param = typeDef.getSearchParam(chain);
|
param = myCallingDao.getSearchParamByName(typeDef, chain);
|
||||||
if (param == null) {
|
if (param == null) {
|
||||||
ourLog.debug("Type {} doesn't have search param {}", nextType.getSimpleName(), param);
|
ourLog.debug("Type {} doesn't have search param {}", nextType.getSimpleName(), param);
|
||||||
continue;
|
continue;
|
||||||
|
@ -1385,7 +1387,7 @@ public class SearchBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
private Predicate createResourceLinkPathPredicate(String theParamName, Root<? extends ResourceLink> from) {
|
private Predicate createResourceLinkPathPredicate(String theParamName, Root<? extends ResourceLink> from) {
|
||||||
return createResourceLinkPathPredicate(myContext, theParamName, from, myResourceType);
|
return createResourceLinkPathPredicate(myCallingDao, myContext, theParamName, from, myResourceType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private TypedQuery<Long> createSearchAllByTypeQuery(DateRangeParam theLastUpdated) {
|
private TypedQuery<Long> createSearchAllByTypeQuery(DateRangeParam theLastUpdated) {
|
||||||
|
@ -1437,7 +1439,8 @@ public class SearchBuilder {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
RuntimeSearchParam param = getSearchParam(theSort.getParamName());
|
RuntimeResourceDefinition resourceDef = myContext.getResourceDefinition(myResourceName);
|
||||||
|
RuntimeSearchParam param = myCallingDao.getSearchParamByName(resourceDef, theSort.getParamName());
|
||||||
if (param == null) {
|
if (param == null) {
|
||||||
throw new InvalidRequestException("Unknown sort parameter '" + theSort.getParamName() + "'");
|
throw new InvalidRequestException("Unknown sort parameter '" + theSort.getParamName() + "'");
|
||||||
}
|
}
|
||||||
|
@ -1503,7 +1506,8 @@ public class SearchBuilder {
|
||||||
|
|
||||||
private String determineSystemIfMissing(String theParamName, String code, String system) {
|
private String determineSystemIfMissing(String theParamName, String code, String system) {
|
||||||
if (system == null) {
|
if (system == null) {
|
||||||
RuntimeSearchParam param = getSearchParam(theParamName);
|
RuntimeResourceDefinition resourceDef = myContext.getResourceDefinition(myResourceName);
|
||||||
|
RuntimeSearchParam param = myCallingDao.getSearchParamByName(resourceDef, theParamName);
|
||||||
if (param != null) {
|
if (param != null) {
|
||||||
Set<String> valueSetUris = Sets.newHashSet();
|
Set<String> valueSetUris = Sets.newHashSet();
|
||||||
for (String nextPath : param.getPathsSplit()) {
|
for (String nextPath : param.getPathsSplit()) {
|
||||||
|
@ -1612,12 +1616,6 @@ public class SearchBuilder {
|
||||||
doSetPids(resultList);
|
doSetPids(resultList);
|
||||||
}
|
}
|
||||||
|
|
||||||
private RuntimeSearchParam getSearchParam(String theParamName) {
|
|
||||||
RuntimeResourceDefinition resourceDef = myContext.getResourceDefinition(myResourceType);
|
|
||||||
RuntimeSearchParam param = resourceDef.getSearchParam(theParamName);
|
|
||||||
return param;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadResourcesByPid(Collection<Long> theIncludePids, List<IBaseResource> theResourceListToPopulate, Set<Long> theRevIncludedPids, boolean theForHistoryOperation) {
|
private void loadResourcesByPid(Collection<Long> theIncludePids, List<IBaseResource> theResourceListToPopulate, Set<Long> theRevIncludedPids, boolean theForHistoryOperation) {
|
||||||
EntityManager entityManager = myEntityManager;
|
EntityManager entityManager = myEntityManager;
|
||||||
FhirContext context = myContext;
|
FhirContext context = myContext;
|
||||||
|
@ -2042,8 +2040,9 @@ public class SearchBuilder {
|
||||||
return likeExpression.replace("%", "[%]") + "%";
|
return likeExpression.replace("%", "[%]") + "%";
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Predicate createResourceLinkPathPredicate(FhirContext theContext, String theParamName, Root<? extends ResourceLink> from, Class<? extends IBaseResource> resourceType) {
|
private static Predicate createResourceLinkPathPredicate(IDao theCallingDao, FhirContext theContext, String theParamName, Root<? extends ResourceLink> from, Class<? extends IBaseResource> resourceType) {
|
||||||
RuntimeSearchParam param = theContext.getResourceDefinition(resourceType).getSearchParam(theParamName);
|
RuntimeResourceDefinition resourceDef = theContext.getResourceDefinition(resourceType);
|
||||||
|
RuntimeSearchParam param = theCallingDao.getSearchParamByName(resourceDef, theParamName);
|
||||||
List<String> path = param.getPathsSplit();
|
List<String> path = param.getPathsSplit();
|
||||||
Predicate type = from.get("mySourcePath").in(path);
|
Predicate type = from.get("mySourcePath").in(path);
|
||||||
return type;
|
return type;
|
||||||
|
@ -2114,7 +2113,7 @@ public class SearchBuilder {
|
||||||
*
|
*
|
||||||
* @param theLastUpdated
|
* @param theLastUpdated
|
||||||
*/
|
*/
|
||||||
public static HashSet<Long> loadReverseIncludes(FhirContext theContext, EntityManager theEntityManager, Collection<Long> theMatches, Set<Include> theRevIncludes, boolean theReverseMode, DateRangeParam theLastUpdated) {
|
public static HashSet<Long> loadReverseIncludes(IDao theCallingDao, FhirContext theContext, EntityManager theEntityManager, Collection<Long> theMatches, Set<Include> theRevIncludes, boolean theReverseMode, DateRangeParam theLastUpdated) {
|
||||||
if (theMatches.size() == 0) {
|
if (theMatches.size() == 0) {
|
||||||
return new HashSet<Long>();
|
return new HashSet<Long>();
|
||||||
}
|
}
|
||||||
|
@ -2182,7 +2181,11 @@ public class SearchBuilder {
|
||||||
}
|
}
|
||||||
|
|
||||||
String paramName = nextInclude.getParamName();
|
String paramName = nextInclude.getParamName();
|
||||||
param = isNotBlank(paramName) ? def.getSearchParam(paramName) : null;
|
if (isNotBlank(paramName)) {
|
||||||
|
param = theCallingDao.getSearchParamByName(def, paramName);
|
||||||
|
} else {
|
||||||
|
param = null;
|
||||||
|
}
|
||||||
if (param == null) {
|
if (param == null) {
|
||||||
ourLog.warn("Unknown param name in include/revinclude=" + nextInclude.getValue());
|
ourLog.warn("Unknown param name in include/revinclude=" + nextInclude.getValue());
|
||||||
continue;
|
continue;
|
||||||
|
@ -2283,9 +2286,9 @@ public class SearchBuilder {
|
||||||
|
|
||||||
Set<Long> revIncludedPids = new HashSet<Long>();
|
Set<Long> revIncludedPids = new HashSet<Long>();
|
||||||
if (myParams.getEverythingMode() == null) {
|
if (myParams.getEverythingMode() == null) {
|
||||||
revIncludedPids.addAll(loadReverseIncludes(myContext, myEntityManager, pidsSubList, myParams.getRevIncludes(), true, myParams.getLastUpdated()));
|
revIncludedPids.addAll(loadReverseIncludes(myCallingDao, myContext, myEntityManager, pidsSubList, myParams.getRevIncludes(), true, myParams.getLastUpdated()));
|
||||||
}
|
}
|
||||||
revIncludedPids.addAll(loadReverseIncludes(myContext, myEntityManager, pidsSubList, myParams.getIncludes(), false, myParams.getLastUpdated()));
|
revIncludedPids.addAll(loadReverseIncludes(myCallingDao, myContext, myEntityManager, pidsSubList, myParams.getIncludes(), false, myParams.getLastUpdated()));
|
||||||
|
|
||||||
// Execute the query and make sure we return distinct results
|
// Execute the query and make sure we return distinct results
|
||||||
List<IBaseResource> resources = new ArrayList<IBaseResource>();
|
List<IBaseResource> resources = new ArrayList<IBaseResource>();
|
||||||
|
|
|
@ -92,7 +92,8 @@ public class FhirResourceDaoDstu3<T extends IAnyResource> extends BaseHapiFhirRe
|
||||||
values.addAll(theTerser.getAllPopulatedChildElementsOfType(theResource, BaseResourceReferenceDt.class));
|
values.addAll(theTerser.getAllPopulatedChildElementsOfType(theResource, BaseResourceReferenceDt.class));
|
||||||
} else if (theInclude.getValue().startsWith(theResourceDef.getName() + ":")) {
|
} else if (theInclude.getValue().startsWith(theResourceDef.getName() + ":")) {
|
||||||
values = new ArrayList<Object>();
|
values = new ArrayList<Object>();
|
||||||
RuntimeSearchParam sp = theResourceDef.getSearchParam(theInclude.getValue().substring(theInclude.getValue().indexOf(':') + 1));
|
String paramName = theInclude.getValue().substring(theInclude.getValue().indexOf(':') + 1);
|
||||||
|
RuntimeSearchParam sp = getSearchParamByName(theResourceDef, paramName);
|
||||||
for (String nextPath : sp.getPathsSplit()) {
|
for (String nextPath : sp.getPathsSplit()) {
|
||||||
values.addAll(theTerser.getValues(theResource, nextPath));
|
values.addAll(theTerser.getValues(theResource, nextPath));
|
||||||
}
|
}
|
||||||
|
|
|
@ -157,7 +157,7 @@ public class FhirResourceDaoSubscriptionDstu3 extends FhirResourceDaoDstu3<Subsc
|
||||||
private int pollForNewUndeliveredResources(SubscriptionTable theSubscriptionTable) {
|
private int pollForNewUndeliveredResources(SubscriptionTable theSubscriptionTable) {
|
||||||
Subscription subscription = toResource(Subscription.class, theSubscriptionTable.getSubscriptionResource(), false);
|
Subscription subscription = toResource(Subscription.class, theSubscriptionTable.getSubscriptionResource(), false);
|
||||||
RuntimeResourceDefinition resourceDef = validateCriteriaAndReturnResourceDefinition(subscription);
|
RuntimeResourceDefinition resourceDef = validateCriteriaAndReturnResourceDefinition(subscription);
|
||||||
SearchParameterMap criteriaUrl = translateMatchUrl(getContext(), subscription.getCriteria(), resourceDef);
|
SearchParameterMap criteriaUrl = translateMatchUrl(this, getContext(), subscription.getCriteria(), resourceDef);
|
||||||
|
|
||||||
criteriaUrl = new SearchParameterMap();
|
criteriaUrl = new SearchParameterMap();
|
||||||
long start = theSubscriptionTable.getMostRecentMatch().getTime();
|
long start = theSubscriptionTable.getMostRecentMatch().getTime();
|
||||||
|
|
|
@ -141,9 +141,9 @@ public final class PersistedJpaBundleProvider implements IBundleProvider {
|
||||||
|
|
||||||
Set<Long> revIncludedPids = new HashSet<Long>();
|
Set<Long> revIncludedPids = new HashSet<Long>();
|
||||||
if (mySearchEntity.getSearchType() == SearchTypeEnum.SEARCH) {
|
if (mySearchEntity.getSearchType() == SearchTypeEnum.SEARCH) {
|
||||||
revIncludedPids.addAll(SearchBuilder.loadReverseIncludes(myContext, myEntityManager, pidsSubList, mySearchEntity.toRevIncludesList(), true, mySearchEntity.getLastUpdated()));
|
revIncludedPids.addAll(SearchBuilder.loadReverseIncludes(myDao, myContext, myEntityManager, pidsSubList, mySearchEntity.toRevIncludesList(), true, mySearchEntity.getLastUpdated()));
|
||||||
}
|
}
|
||||||
revIncludedPids.addAll(SearchBuilder.loadReverseIncludes(myContext, myEntityManager, pidsSubList, mySearchEntity.toIncludesList(), false, mySearchEntity.getLastUpdated()));
|
revIncludedPids.addAll(SearchBuilder.loadReverseIncludes(myDao, myContext, myEntityManager, pidsSubList, mySearchEntity.toIncludesList(), false, mySearchEntity.getLastUpdated()));
|
||||||
|
|
||||||
// Execute the query and make sure we return distinct results
|
// Execute the query and make sure we return distinct results
|
||||||
List<IBaseResource> resources = new ArrayList<IBaseResource>();
|
List<IBaseResource> resources = new ArrayList<IBaseResource>();
|
||||||
|
|
|
@ -1,11 +1,16 @@
|
||||||
package ca.uhn.fhir.jpa.dao;
|
package ca.uhn.fhir.jpa.dao;
|
||||||
|
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Matchers.eq;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import ca.uhn.fhir.context.FhirContext;
|
import ca.uhn.fhir.context.FhirContext;
|
||||||
|
import ca.uhn.fhir.context.RuntimeResourceDefinition;
|
||||||
import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
|
import ca.uhn.fhir.model.dstu2.composite.PeriodDt;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Condition;
|
import ca.uhn.fhir.model.dstu2.resource.Condition;
|
||||||
import ca.uhn.fhir.model.dstu2.resource.Observation;
|
import ca.uhn.fhir.model.dstu2.resource.Observation;
|
||||||
|
@ -25,7 +30,12 @@ public class BaseHapiFhirDaoTest extends BaseJpaTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testTranslateMatchUrl() {
|
public void testTranslateMatchUrl() {
|
||||||
SearchParameterMap match = BaseHapiFhirDao.translateMatchUrl(ourCtx, "Condition?patient=304&_lastUpdated=>2011-01-01T11:12:21.0000Z", ourCtx.getResourceDefinition(Condition.class));
|
RuntimeResourceDefinition resourceDef = ourCtx.getResourceDefinition(Condition.class);
|
||||||
|
|
||||||
|
IDao dao = mock(IDao.class);
|
||||||
|
when(dao.getSearchParamByName(any(RuntimeResourceDefinition.class), eq("patient"))).thenReturn(resourceDef.getSearchParam("patient"));
|
||||||
|
|
||||||
|
SearchParameterMap match = BaseHapiFhirDao.translateMatchUrl(dao, ourCtx, "Condition?patient=304&_lastUpdated=>2011-01-01T11:12:21.0000Z", resourceDef);
|
||||||
assertEquals("2011-01-01T11:12:21.0000Z", match.getLastUpdated().getLowerBound().getValueAsString());
|
assertEquals("2011-01-01T11:12:21.0000Z", match.getLastUpdated().getLowerBound().getValueAsString());
|
||||||
assertEquals(ReferenceParam.class, match.get("patient").get(0).get(0).getClass());
|
assertEquals(ReferenceParam.class, match.get("patient").get(0).get(0).getClass());
|
||||||
assertEquals("304", ((ReferenceParam)match.get("patient").get(0).get(0)).getIdPart());
|
assertEquals("304", ((ReferenceParam)match.get("patient").get(0).get(0)).getIdPart());
|
||||||
|
|
|
@ -1,70 +1,23 @@
|
||||||
package ca.uhn.fhir.jpa.dao.dstu3;
|
package ca.uhn.fhir.jpa.dao.dstu3;
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.contains;
|
import static org.hamcrest.Matchers.contains;
|
||||||
import static org.hamcrest.Matchers.containsInAnyOrder;
|
|
||||||
import static org.hamcrest.Matchers.containsInRelativeOrder;
|
|
||||||
import static org.hamcrest.Matchers.empty;
|
import static org.hamcrest.Matchers.empty;
|
||||||
import static org.hamcrest.Matchers.endsWith;
|
|
||||||
import static org.hamcrest.Matchers.hasItem;
|
|
||||||
import static org.hamcrest.Matchers.hasItems;
|
|
||||||
import static org.hamcrest.Matchers.not;
|
|
||||||
import static org.junit.Assert.assertEquals;
|
|
||||||
import static org.junit.Assert.assertThat;
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.assertTrue;
|
|
||||||
import static org.junit.Assert.fail;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.util.List;
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.nio.charset.StandardCharsets;
|
|
||||||
import java.util.*;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
import org.hl7.fhir.dstu3.model.*;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleEntryComponent;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.BundleType;
|
|
||||||
import org.hl7.fhir.dstu3.model.Bundle.HTTPVerb;
|
|
||||||
import org.hl7.fhir.dstu3.model.ContactPoint.ContactPointSystem;
|
|
||||||
import org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender;
|
import org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender;
|
||||||
import org.hl7.fhir.dstu3.model.Subscription.SubscriptionChannelType;
|
import org.hl7.fhir.dstu3.model.Patient;
|
||||||
import org.hl7.fhir.dstu3.model.Subscription.SubscriptionStatus;
|
import org.hl7.fhir.dstu3.model.SearchParameter;
|
||||||
import org.hl7.fhir.dstu3.model.codesystems.PublicationStatus;
|
|
||||||
import org.hl7.fhir.dstu3.model.codesystems.SearchParamType;
|
|
||||||
import org.hl7.fhir.instance.model.SearchParameter.XPathUsageType;
|
|
||||||
import org.hl7.fhir.instance.model.api.IAnyResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IBaseResource;
|
|
||||||
import org.hl7.fhir.instance.model.api.IIdType;
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.hl7.fhir.instance.model.api.IPrimitiveType;
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Ignore;
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.transaction.TransactionStatus;
|
|
||||||
import org.springframework.transaction.support.TransactionCallback;
|
|
||||||
import org.springframework.transaction.support.TransactionTemplate;
|
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.BaseHapiFhirDao;
|
|
||||||
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
|
||||||
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
|
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
|
||||||
import ca.uhn.fhir.jpa.dao.SearchParameterMap.EverythingModeEnum;
|
import ca.uhn.fhir.rest.param.TokenParam;
|
||||||
import ca.uhn.fhir.jpa.entity.*;
|
|
||||||
import ca.uhn.fhir.jpa.search.StaleSearchDeletingSvc;
|
|
||||||
import ca.uhn.fhir.model.api.IQueryParameterType;
|
|
||||||
import ca.uhn.fhir.model.api.Include;
|
|
||||||
import ca.uhn.fhir.model.dstu.valueset.QuantityCompararatorEnum;
|
|
||||||
import ca.uhn.fhir.rest.api.SortOrderEnum;
|
|
||||||
import ca.uhn.fhir.rest.api.SortSpec;
|
|
||||||
import ca.uhn.fhir.rest.param.*;
|
|
||||||
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.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class FhirResourceDaoDstu3SearchCustomParamTest extends BaseJpaDstu3Test {
|
public class FhirResourceDaoDstu3SearchCustomParamTest extends BaseJpaDstu3Test {
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchCustomParamTest.class);
|
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(FhirResourceDaoDstu3SearchCustomParamTest.class);
|
||||||
|
|
||||||
|
|
|
@ -1,24 +1,34 @@
|
||||||
package ca.uhn.fhir.jpa.provider.dstu3;
|
package ca.uhn.fhir.jpa.provider.dstu3;
|
||||||
|
|
||||||
|
import static org.hamcrest.Matchers.contains;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
import static org.junit.Assert.fail;
|
import static org.junit.Assert.fail;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.hl7.fhir.dstu3.model.Bundle;
|
||||||
|
import org.hl7.fhir.dstu3.model.Enumerations.AdministrativeGender;
|
||||||
|
import org.hl7.fhir.dstu3.model.Observation;
|
||||||
|
import org.hl7.fhir.dstu3.model.Patient;
|
||||||
import org.hl7.fhir.dstu3.model.SearchParameter;
|
import org.hl7.fhir.dstu3.model.SearchParameter;
|
||||||
import org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType;
|
import org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType;
|
||||||
|
import org.hl7.fhir.instance.model.api.IIdType;
|
||||||
import org.junit.After;
|
import org.junit.After;
|
||||||
import org.junit.AfterClass;
|
import org.junit.AfterClass;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
import ca.uhn.fhir.jpa.dao.DaoConfig;
|
||||||
|
import ca.uhn.fhir.jpa.dao.SearchParameterMap;
|
||||||
|
import ca.uhn.fhir.rest.gclient.ReferenceClientParam;
|
||||||
|
import ca.uhn.fhir.rest.gclient.TokenClientParam;
|
||||||
|
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.util.TestUtil;
|
import ca.uhn.fhir.util.TestUtil;
|
||||||
|
|
||||||
public class ResourceProviderCustomSearchParamDstu3Test extends BaseResourceProviderDstu3Test {
|
public class ResourceProviderCustomSearchParamDstu3Test extends BaseResourceProviderDstu3Test {
|
||||||
|
|
||||||
private static final org.slf4j.Logger ourLog = org.slf4j.LoggerFactory.getLogger(ResourceProviderCustomSearchParamDstu3Test.class);
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@After
|
@After
|
||||||
public void after() throws Exception {
|
public void after() throws Exception {
|
||||||
|
@ -44,10 +54,92 @@ public class ResourceProviderCustomSearchParamDstu3Test extends BaseResourceProv
|
||||||
ourClient.create().resource(sp).execute();
|
ourClient.create().resource(sp).execute();
|
||||||
fail();
|
fail();
|
||||||
} catch (InvalidRequestException e) {
|
} catch (InvalidRequestException e) {
|
||||||
assertEquals("", e.getMessage());
|
assertEquals("HTTP 400 Bad Request: Resource.status is missing or invalid: null", e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@Test
|
||||||
|
public void testSearchWithCustomParam() {
|
||||||
|
|
||||||
|
SearchParameter fooSp = new SearchParameter();
|
||||||
|
fooSp.setCode("foo");
|
||||||
|
fooSp.setType(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.TOKEN);
|
||||||
|
fooSp.setTitle("FOO SP");
|
||||||
|
fooSp.setXpath("Patient.gender");
|
||||||
|
fooSp.setXpathUsage(org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType.NORMAL);
|
||||||
|
fooSp.setStatus(org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus.ACTIVE);
|
||||||
|
mySearchParameterDao.create(fooSp, mySrd);
|
||||||
|
|
||||||
|
mySearchParamRegsitry.forceRefresh();
|
||||||
|
|
||||||
|
Patient pat = new Patient();
|
||||||
|
pat.setGender(AdministrativeGender.MALE);
|
||||||
|
IIdType patId = myPatientDao.create(pat, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Patient pat2 = new Patient();
|
||||||
|
pat.setGender(AdministrativeGender.FEMALE);
|
||||||
|
IIdType patId2 = myPatientDao.create(pat2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
SearchParameterMap map;
|
||||||
|
IBundleProvider results;
|
||||||
|
List<String> foundResources;
|
||||||
|
Bundle result;
|
||||||
|
|
||||||
|
result = ourClient
|
||||||
|
.search()
|
||||||
|
.forResource(Patient.class)
|
||||||
|
.where(new TokenClientParam("foo").exactly().code("male"))
|
||||||
|
.returnBundle(Bundle.class)
|
||||||
|
.execute();
|
||||||
|
foundResources = toUnqualifiedVersionlessIdValues(result);
|
||||||
|
assertThat(foundResources, contains(patId.getValue()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unused")
|
||||||
|
@Test
|
||||||
|
public void testSearchQualifiedWithCustomReferenceParam() {
|
||||||
|
|
||||||
|
SearchParameter fooSp = new SearchParameter();
|
||||||
|
fooSp.setCode("foo");
|
||||||
|
fooSp.setType(org.hl7.fhir.dstu3.model.Enumerations.SearchParamType.REFERENCE);
|
||||||
|
fooSp.setTitle("FOO SP");
|
||||||
|
fooSp.setXpath("Observation.subject");
|
||||||
|
fooSp.setXpathUsage(org.hl7.fhir.dstu3.model.SearchParameter.XPathUsageType.NORMAL);
|
||||||
|
fooSp.setStatus(org.hl7.fhir.dstu3.model.Enumerations.PublicationStatus.ACTIVE);
|
||||||
|
mySearchParameterDao.create(fooSp, mySrd);
|
||||||
|
|
||||||
|
mySearchParamRegsitry.forceRefresh();
|
||||||
|
|
||||||
|
Patient pat = new Patient();
|
||||||
|
pat.setGender(AdministrativeGender.MALE);
|
||||||
|
IIdType patId = myPatientDao.create(pat, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Observation obs1 = new Observation();
|
||||||
|
obs1.getSubject().setReferenceElement(patId);
|
||||||
|
IIdType obsId1 = myObservationDao.create(obs1, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
Observation obs2 = new Observation();
|
||||||
|
obs2.setStatus(org.hl7.fhir.dstu3.model.Observation.ObservationStatus.FINAL);
|
||||||
|
IIdType obsId2 = myObservationDao.create(obs2, mySrd).getId().toUnqualifiedVersionless();
|
||||||
|
|
||||||
|
SearchParameterMap map;
|
||||||
|
IBundleProvider results;
|
||||||
|
List<String> foundResources;
|
||||||
|
Bundle result;
|
||||||
|
|
||||||
|
result = ourClient
|
||||||
|
.search()
|
||||||
|
.forResource(Observation.class)
|
||||||
|
.where(new ReferenceClientParam("foo").hasChainedProperty(Patient.GENDER.exactly().code("male")))
|
||||||
|
.returnBundle(Bundle.class)
|
||||||
|
.execute();
|
||||||
|
foundResources = toUnqualifiedVersionlessIdValues(result);
|
||||||
|
assertThat(foundResources, contains(obsId1.getValue()));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
public static void afterClassClearContext() {
|
public static void afterClassClearContext() {
|
||||||
TestUtil.clearAllStaticFieldsForUnitTest();
|
TestUtil.clearAllStaticFieldsForUnitTest();
|
||||||
|
|
|
@ -39,7 +39,7 @@ public class ${className}ResourceProvider extends
|
||||||
return ${className}.class;
|
return ${className}.class;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Search()
|
@Search(allowUnknownParams=true)
|
||||||
public ca.uhn.fhir.rest.server.IBundleProvider search(
|
public ca.uhn.fhir.rest.server.IBundleProvider search(
|
||||||
javax.servlet.http.HttpServletRequest theServletRequest,
|
javax.servlet.http.HttpServletRequest theServletRequest,
|
||||||
|
|
||||||
|
@ -154,6 +154,8 @@ public class ${className}ResourceProvider extends
|
||||||
paramMap.setCount(theCount);
|
paramMap.setCount(theCount);
|
||||||
paramMap.setRequestDetails(theRequestDetails);
|
paramMap.setRequestDetails(theRequestDetails);
|
||||||
|
|
||||||
|
getDao().translateRawParameters(theAdditionalRawParams, paramMap);
|
||||||
|
|
||||||
ca.uhn.fhir.rest.server.IBundleProvider retVal = getDao().search(paramMap);
|
ca.uhn.fhir.rest.server.IBundleProvider retVal = getDao().search(paramMap);
|
||||||
return retVal;
|
return retVal;
|
||||||
} finally {
|
} finally {
|
||||||
|
|
Loading…
Reference in New Issue