diff --git a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/matcher/InMemoryResourceMatcher.java b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/matcher/InMemoryResourceMatcher.java index 60a951534e1e..be4f9648aba6 100644 --- a/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/matcher/InMemoryResourceMatcher.java +++ b/hapi-fhir-jpaserver-searchparam/src/main/java/ca/uhn/fhir/jpa/searchparam/matcher/InMemoryResourceMatcher.java @@ -629,26 +629,29 @@ private boolean matchTokenParam( private boolean matchChainedReferenceParam( String theParamName, String theResourceName, IBaseResource theResource, ReferenceParam referenceParam) { + // Obtain the next parameter and chain + String[] chains = referenceParam.getChain().split("\\."); + String parameterNameWithModifier = chains[0]; + String chain = chains.length > 1 ? StringUtils.join(chains, ".", 1, chains.length) : null; + + // Obtain the next parameter name and modifier + String[] parameterNameAndModifier = parameterNameWithModifier.split(":"); + String parameterName = parameterNameAndModifier[0]; + String modifier = parameterNameAndModifier.length > 1 ? parameterNameAndModifier[1] : null; + RuntimeSearchParam activeSearchParam = mySearchParamRegistry.getActiveSearchParam(theResourceName, theParamName); + List bases = searchParamExtractor .getPathValueExtractor(theResource, activeSearchParam.getPath()) .get(); + return bases.stream() .filter(IBaseReference.class::isInstance) .map(IBaseReference.class::cast) .map(IBaseReference::getResource) .filter(Objects::nonNull) .anyMatch(resource -> { - // Obtain the next parameter name, modifier and chain - String[] chains = referenceParam.getChain().split("\\."); - String parameterNameWithModifier = chains[0]; - String chain = chains.length > 1 ? StringUtils.join(chains, ".", 1, chains.length) : null; - - String[] parameterNameAndModifier = parameterNameWithModifier.split(":"); - String parameterName = parameterNameAndModifier[0]; - String modifier = parameterNameAndModifier.length > 1 ? parameterNameAndModifier[1] : null; - // Find the path of next search parameter in the next resource RuntimeSearchParam resourceSearchParam = mySearchParamRegistry.getActiveSearchParam( resource.getIdElement().getResourceType(), parameterName);