exact coord matching works now
This commit is contained in:
parent
299e1e35e1
commit
eca21bec3e
|
@ -66,6 +66,7 @@ import ca.uhn.fhir.model.api.ResourceMetadataKeyEnum;
|
||||||
import ca.uhn.fhir.model.base.composite.BaseCodingDt;
|
import ca.uhn.fhir.model.base.composite.BaseCodingDt;
|
||||||
import ca.uhn.fhir.model.base.composite.BaseIdentifierDt;
|
import ca.uhn.fhir.model.base.composite.BaseIdentifierDt;
|
||||||
import ca.uhn.fhir.model.base.composite.BaseQuantityDt;
|
import ca.uhn.fhir.model.base.composite.BaseQuantityDt;
|
||||||
|
import ca.uhn.fhir.model.dstu2.resource.Location;
|
||||||
import ca.uhn.fhir.model.primitive.IdDt;
|
import ca.uhn.fhir.model.primitive.IdDt;
|
||||||
import ca.uhn.fhir.model.primitive.InstantDt;
|
import ca.uhn.fhir.model.primitive.InstantDt;
|
||||||
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
|
import ca.uhn.fhir.model.valueset.BundleEntrySearchModeEnum;
|
||||||
|
@ -467,6 +468,12 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
String theParamName,
|
String theParamName,
|
||||||
List<? extends IQueryParameterType> theList,
|
List<? extends IQueryParameterType> theList,
|
||||||
SearchFilterParser.CompareOperation operation) {
|
SearchFilterParser.CompareOperation operation) {
|
||||||
|
|
||||||
|
// FIXME KHS
|
||||||
|
if ("Location".equals(theResourceName) && Location.SP_NEAR_DISTANCE.equals(theParamName)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
Join<ResourceTable, ResourceIndexedSearchParamQuantity> join = createJoin(JoinEnum.QUANTITY, theParamName);
|
Join<ResourceTable, ResourceIndexedSearchParamQuantity> join = createJoin(JoinEnum.QUANTITY, theParamName);
|
||||||
|
|
||||||
if (theList.get(0).getMissing() != null) {
|
if (theList.get(0).getMissing() != null) {
|
||||||
|
@ -1288,6 +1295,43 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
return outerPredicate;
|
return outerPredicate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Predicate addPredicateCoords(String theResourceName,
|
||||||
|
String theParamName,
|
||||||
|
List<? extends IQueryParameterType> theList) {
|
||||||
|
return addPredicateCoords(theResourceName,
|
||||||
|
theParamName,
|
||||||
|
theList,
|
||||||
|
null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Predicate addPredicateCoords(String theResourceName,
|
||||||
|
String theParamName,
|
||||||
|
List<? extends IQueryParameterType> theList,
|
||||||
|
SearchFilterParser.CompareOperation operation) {
|
||||||
|
Join<ResourceTable, ResourceIndexedSearchParamCoords> join = createJoin(JoinEnum.COORDS, theParamName);
|
||||||
|
|
||||||
|
if (theList.get(0).getMissing() != null) {
|
||||||
|
addPredicateParamMissing(theResourceName, theParamName, theList.get(0).getMissing(), join);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Predicate> codePredicates = new ArrayList<Predicate>();
|
||||||
|
for (IQueryParameterType nextOr : theList) {
|
||||||
|
|
||||||
|
Predicate singleCode = createPredicateCoords(nextOr,
|
||||||
|
theResourceName,
|
||||||
|
theParamName,
|
||||||
|
myBuilder,
|
||||||
|
join,
|
||||||
|
operation);
|
||||||
|
codePredicates.add(singleCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate retVal = myBuilder.or(toArray(codePredicates));
|
||||||
|
myPredicates.add(retVal);
|
||||||
|
return retVal;
|
||||||
|
}
|
||||||
|
|
||||||
private Predicate combineParamIndexPredicateWithParamNamePredicate(String theResourceName, String theParamName, From<?, ? extends BaseResourceIndexedSearchParam> theFrom, Predicate thePredicate) {
|
private Predicate combineParamIndexPredicateWithParamNamePredicate(String theResourceName, String theParamName, From<?, ? extends BaseResourceIndexedSearchParam> theFrom, Predicate thePredicate) {
|
||||||
if (myDontUseHashesForSearch) {
|
if (myDontUseHashesForSearch) {
|
||||||
Predicate resourceTypePredicate = myBuilder.equal(theFrom.get("myResourceType"), theResourceName);
|
Predicate resourceTypePredicate = myBuilder.equal(theFrom.get("myResourceType"), theResourceName);
|
||||||
|
@ -1367,6 +1411,9 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
case TOKEN:
|
case TOKEN:
|
||||||
join = myResourceTableRoot.join("myParamsToken", JoinType.LEFT);
|
join = myResourceTableRoot.join("myParamsToken", JoinType.LEFT);
|
||||||
break;
|
break;
|
||||||
|
case COORDS:
|
||||||
|
join = myResourceTableRoot.join("myParamsCoords", JoinType.LEFT);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
JoinKey key = new JoinKey(theSearchParameterName, theType);
|
JoinKey key = new JoinKey(theSearchParameterName, theType);
|
||||||
|
@ -2037,6 +2084,52 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
return myBuilder.equal(theExpression, theCode);
|
return myBuilder.equal(theExpression, theCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Predicate createPredicateCoords(IQueryParameterType theParam,
|
||||||
|
String theResourceName,
|
||||||
|
String theParamName,
|
||||||
|
CriteriaBuilder theBuilder,
|
||||||
|
From<?, ResourceIndexedSearchParamCoords> theFrom,
|
||||||
|
SearchFilterParser.CompareOperation operation) {
|
||||||
|
// FIXME KHS
|
||||||
|
|
||||||
|
String latitudeValue;
|
||||||
|
String longitudeValue;
|
||||||
|
BigDecimal valueValue;
|
||||||
|
|
||||||
|
// FIXME KHS test
|
||||||
|
if (operation != null) {
|
||||||
|
throw new IllegalArgumentException("Operators not supported for Coordinate searches: " + operation.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (theParam instanceof TokenParam) {
|
||||||
|
TokenParam param = (TokenParam) theParam;
|
||||||
|
String value = param.getValue();
|
||||||
|
String[] parts = value.split(":");
|
||||||
|
// FIXME KHS test
|
||||||
|
if (parts.length != 2) {
|
||||||
|
throw new IllegalArgumentException("Invalid position format '" + value + "'. Required format is 'latitude:longitude'");
|
||||||
|
}
|
||||||
|
latitudeValue = parts[0];
|
||||||
|
longitudeValue = parts[1];
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException("Invalid position type: " + theParam.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate latitude = null;
|
||||||
|
if (!isBlank(latitudeValue)) {
|
||||||
|
latitude = theBuilder.equal(theFrom.get("myLatitude"), latitudeValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate longitude = null;
|
||||||
|
if (!isBlank(longitudeValue)) {
|
||||||
|
longitude = theBuilder.equal(theFrom.get("myLongitude"), longitudeValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
Predicate singleCode = theBuilder.and(latitude, longitude);
|
||||||
|
|
||||||
|
return combineParamIndexPredicateWithParamNamePredicate(theResourceName, theParamName, theFrom, singleCode);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<Long> createCountQuery(SearchParameterMap theParams, String theSearchUuid, RequestDetails theRequest) {
|
public Iterator<Long> createCountQuery(SearchParameterMap theParams, String theSearchUuid, RequestDetails theRequest) {
|
||||||
myParams = theParams;
|
myParams = theParams;
|
||||||
|
@ -2186,6 +2279,8 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
*/
|
*/
|
||||||
final TypedQuery<Long> query = myEntityManager.createQuery(outerQuery);
|
final TypedQuery<Long> query = myEntityManager.createQuery(outerQuery);
|
||||||
|
|
||||||
|
// FIXME KHS query
|
||||||
|
|
||||||
if (theMaximumResults != null) {
|
if (theMaximumResults != null) {
|
||||||
query.setMaxResults(theMaximumResults);
|
query.setMaxResults(theMaximumResults);
|
||||||
}
|
}
|
||||||
|
@ -2197,6 +2292,7 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
return createResourceLinkPathPredicate(myContext, theParamName, from, theResourceName);
|
return createResourceLinkPathPredicate(myContext, theParamName, from, theResourceName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return Returns {@literal true} if any search parameter sorts were found, or false if
|
* @return Returns {@literal true} if any search parameter sorts were found, or false if
|
||||||
* no sorts were found, or only non-search parameters ones (e.g. _id, _lastUpdated)
|
* no sorts were found, or only non-search parameters ones (e.g. _id, _lastUpdated)
|
||||||
|
@ -2955,7 +3051,11 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
break;
|
break;
|
||||||
case TOKEN:
|
case TOKEN:
|
||||||
for (List<? extends IQueryParameterType> nextAnd : theAndOrParams) {
|
for (List<? extends IQueryParameterType> nextAnd : theAndOrParams) {
|
||||||
addPredicateToken(theResourceName, theParamName, nextAnd);
|
if ("Location.position".equals(nextParamDef.getPath())) {
|
||||||
|
addPredicateCoords(theResourceName, theParamName, nextAnd);
|
||||||
|
} else {
|
||||||
|
addPredicateToken(theResourceName, theParamName, nextAnd);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case NUMBER:
|
case NUMBER:
|
||||||
|
@ -3129,7 +3229,8 @@ public class SearchBuilder implements ISearchBuilder {
|
||||||
REFERENCE,
|
REFERENCE,
|
||||||
STRING,
|
STRING,
|
||||||
TOKEN,
|
TOKEN,
|
||||||
URI
|
URI,
|
||||||
|
COORDS
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -83,7 +83,8 @@ public class TestDstu3Config extends BaseJavaConfigDstu3 {
|
||||||
|
|
||||||
};
|
};
|
||||||
retVal.setDriver(new org.h2.Driver());
|
retVal.setDriver(new org.h2.Driver());
|
||||||
retVal.setUrl("jdbc:h2:mem:testdb_dstu3");
|
// FIXME KHS
|
||||||
|
retVal.setUrl("jdbc:h2:file:./target/testdb_dstu3");
|
||||||
retVal.setMaxWaitMillis(10000);
|
retVal.setMaxWaitMillis(10000);
|
||||||
retVal.setUsername("");
|
retVal.setUsername("");
|
||||||
retVal.setPassword("");
|
retVal.setPassword("");
|
||||||
|
|
|
@ -3474,7 +3474,7 @@ public class FhirResourceDaoDstu3SearchNoFtTest extends BaseJpaDstu3Test {
|
||||||
double longitude = 2000.0;
|
double longitude = 2000.0;
|
||||||
Location.LocationPositionComponent position = new Location.LocationPositionComponent().setLatitude(latitude).setLongitude(longitude);
|
Location.LocationPositionComponent position = new Location.LocationPositionComponent().setLatitude(latitude).setLongitude(longitude);
|
||||||
loc.setPosition(position);
|
loc.setPosition(position);
|
||||||
IIdType locId = myLocationDao.create(loc).getId().toUnqualifiedVersionless();
|
String locId = myLocationDao.create(loc).getId().toUnqualifiedVersionless().getValue();
|
||||||
|
|
||||||
SearchParameterMap map = new SearchParameterMap();
|
SearchParameterMap map = new SearchParameterMap();
|
||||||
map.add(Location.SP_NEAR, new TokenParam(latitude + ":" + longitude));
|
map.add(Location.SP_NEAR, new TokenParam(latitude + ":" + longitude));
|
||||||
|
|
Loading…
Reference in New Issue