From c11d719957fdb49a8f58b5646f166bb2340ab7a1 Mon Sep 17 00:00:00 2001 From: Ken Stevens Date: Tue, 6 Aug 2019 15:17:09 -0400 Subject: [PATCH] Fix bug when in-memory matcher compares long id to string id --- .../main/java/ca/uhn/fhir/model/primitive/IdDt.java | 12 ++---------- .../java/ca/uhn/fhir/rest/param/ReferenceParam.java | 5 +++++ .../extractor/ResourceIndexedSearchParams.java | 6 +++++- .../extractor/ResourceIndexedSearchParamsTest.java | 1 - 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java index fd626a3fb3e..1e58340c09b 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/model/primitive/IdDt.java @@ -645,16 +645,8 @@ public class IdDt extends UriDt implements /*IPrimitiveDatatype, */IIdTy return new IdDt(value + '/' + Constants.PARAM_HISTORY + '/' + theVersion); } - private static boolean isValidLong(String id) { - if (StringUtils.isBlank(id)) { - return false; - } - for (int i = 0; i < id.length(); i++) { - if (Character.isDigit(id.charAt(i)) == false) { - return false; - } - } - return true; + public static boolean isValidLong(String id) { + return StringUtils.isNumeric(id); } /** diff --git a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/ReferenceParam.java b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/ReferenceParam.java index fca87b14841..b934f99dd77 100644 --- a/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/ReferenceParam.java +++ b/hapi-fhir-base/src/main/java/ca/uhn/fhir/rest/param/ReferenceParam.java @@ -19,6 +19,7 @@ package ca.uhn.fhir.rest.param; * limitations under the License. * #L% */ +import static ca.uhn.fhir.model.primitive.IdDt.isValidLong; import static org.apache.commons.lang3.StringUtils.isBlank; import static org.apache.commons.lang3.StringUtils.isNotBlank; @@ -280,4 +281,8 @@ public class ReferenceParam extends BaseParam /*implements IQueryParameterType*/ retVal.setValueAsQueryToken(theContext, null, null, getValueAsQueryToken(theContext)); return retVal; } + + public boolean isIdPartValidLong() { + return isValidLong(getIdPart()); + } } diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParams.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParams.java index 080ca2d86b5..887dbece0cb 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParams.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParams.java @@ -274,7 +274,11 @@ public final class ResourceIndexedSearchParams { ResourceTable target = theResourceLink.getTargetResource(); IdDt idDt = target.getIdDt(); if (idDt.isIdPartValidLong()) { - return theReference.getIdPartAsLong().equals(idDt.getIdPartAsLong()); + if (theReference.isIdPartValidLong()) { + return theReference.getIdPartAsLong().equals(idDt.getIdPartAsLong()); + } else { + return false; + } } else { ForcedId forcedId = target.getForcedId(); if (forcedId != null) { diff --git a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParamsTest.java b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParamsTest.java index 70596e2e85c..9a68834d788 100644 --- a/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParamsTest.java +++ b/hapi-fhir-jpaserver-searchparam/src/test/java/ca/uhn/fhir/jpa/searchparam/extractor/ResourceIndexedSearchParamsTest.java @@ -23,7 +23,6 @@ public class ResourceIndexedSearchParamsTest { target.setResourceType("Organization"); target.setId(123L); - ResourceIndexedSearchParams params = new ResourceIndexedSearchParams(source); ResourceLink link = new ResourceLink("organization", source, target, new Date()); params.getResourceLinks().add(link);