From 35e1dbae32f89e271bb6dd82bde5dee29e19e01f Mon Sep 17 00:00:00 2001 From: jamesagnew Date: Tue, 7 Apr 2020 15:22:59 -0400 Subject: [PATCH] One more bugfix on #1772 --- .../predicate/PredicateBuilderReference.java | 21 ++++++------ .../ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java | 3 ++ .../r4/FhirResourceDaoR4SearchNoFtTest.java | 33 +++++++++++++++++++ 3 files changed, 47 insertions(+), 10 deletions(-) diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/predicate/PredicateBuilderReference.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/predicate/PredicateBuilderReference.java index f503726f3ca..5278d08c559 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/predicate/PredicateBuilderReference.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/predicate/PredicateBuilderReference.java @@ -23,7 +23,6 @@ package ca.uhn.fhir.jpa.dao.predicate; import ca.uhn.fhir.context.BaseRuntimeChildDefinition; import ca.uhn.fhir.context.BaseRuntimeElementDefinition; import ca.uhn.fhir.context.ConfigurationException; -import ca.uhn.fhir.context.FhirContext; import ca.uhn.fhir.context.RuntimeChildChoiceDefinition; import ca.uhn.fhir.context.RuntimeChildResourceDefinition; import ca.uhn.fhir.context.RuntimeResourceDefinition; @@ -328,10 +327,11 @@ class PredicateBuilderReference extends BasePredicateBuilder { throw newInvalidTargetTypeForChainException(theResourceName, theParamName, typeValue); } + Predicate pathPredicate = createResourceLinkPathPredicate(theResourceName, theParamName, theJoin); Predicate sourceTypeParameter = myCriteriaBuilder.equal(theJoin.get("mySourceResourceType"), myResourceName); Predicate targetTypeParameter = myCriteriaBuilder.equal(theJoin.get("myTargetResourceType"), typeValue); - Predicate composite = myCriteriaBuilder.and(sourceTypeParameter, targetTypeParameter); + Predicate composite = myCriteriaBuilder.and(pathPredicate, sourceTypeParameter, targetTypeParameter); myQueryRoot.addPredicate(composite); return composite; } @@ -427,12 +427,7 @@ class PredicateBuilderReference extends BasePredicateBuilder { } Predicate createResourceLinkPathPredicate(String theResourceName, String theParamName, From from) { - return createResourceLinkPathPredicate(myContext, theParamName, from, theResourceName); - } - - private Predicate createResourceLinkPathPredicate(FhirContext theContext, String theParamName, From theFrom, - String theResourceType) { - RuntimeResourceDefinition resourceDef = theContext.getResourceDefinition(theResourceType); + RuntimeResourceDefinition resourceDef = myContext.getResourceDefinition(theResourceName); RuntimeSearchParam param = mySearchParamRegistry.getSearchParamByName(resourceDef, theParamName); List path = param.getPathsSplit(); @@ -445,12 +440,18 @@ class PredicateBuilderReference extends BasePredicateBuilder { ListIterator iter = path.listIterator(); while (iter.hasNext()) { String nextPath = trim(iter.next()); - if (!nextPath.contains(theResourceType + ".")) { + if (!nextPath.contains(theResourceName + ".")) { iter.remove(); } } - return theFrom.get("mySourcePath").in(path); + // one value + if (path.size() == 1) { + return myCriteriaBuilder.equal(from.get("mySourcePath").as(String.class), path.get(0)); + } + + // multiple values + return from.get("mySourcePath").in(path); } private IQueryParameterType mapReferenceChainToRawParamType(String remainingChain, RuntimeSearchParam param, String theParamName, String qualifier, Class nextType, String chain, boolean isMeta, String resourceId) { diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java index 9c098d3c03f..52e5ee4357c 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/BaseJpaR4Test.java @@ -144,6 +144,9 @@ public abstract class BaseJpaR4Test extends BaseJpaTest { @Qualifier("myCarePlanDaoR4") protected IFhirResourceDao myCarePlanDao; @Autowired + @Qualifier("myCareTeamDaoR4") + protected IFhirResourceDao myCareTeamDao; + @Autowired @Qualifier("myCodeSystemDaoR4") protected IFhirResourceDaoCodeSystem myCodeSystemDao; @Autowired diff --git a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4SearchNoFtTest.java b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4SearchNoFtTest.java index 2dd6bd0fa13..b8e78863ba4 100644 --- a/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4SearchNoFtTest.java +++ b/hapi-fhir-jpaserver-base/src/test/java/ca/uhn/fhir/jpa/dao/r4/FhirResourceDaoR4SearchNoFtTest.java @@ -416,6 +416,39 @@ public class FhirResourceDaoR4SearchNoFtTest extends BaseJpaR4Test { } + @Test + public void testChainOnType2() { + + CareTeam ct = new CareTeam(); + ct.addNote().setText("Care Team"); + IIdType ctId = myCareTeamDao.create(ct).getId().toUnqualifiedVersionless(); + + DiagnosticReport dr1 = new DiagnosticReport(); + dr1.getPerformerFirstRep().setReferenceElement(ctId); + IIdType drId1 = myDiagnosticReportDao.create(dr1).getId().toUnqualifiedVersionless(); + + DiagnosticReport dr2 = new DiagnosticReport(); + dr2.getResultsInterpreterFirstRep().setReferenceElement(ctId); + myDiagnosticReportDao.create(dr2).getId().toUnqualifiedVersionless(); + + // Log the link rows + runInTransaction(() -> myResourceLinkDao.findAll().forEach(t -> ourLog.info("ResLink: {}", t.toString()))); + + List ids; + SearchParameterMap map; + IBundleProvider results; + + myCaptureQueriesListener.clear(); + map = new SearchParameterMap(); + map.setLoadSynchronous(true); + map.add(DiagnosticReport.SP_PERFORMER, new ReferenceParam( "CareTeam").setChain(PARAM_TYPE)); + results = myDiagnosticReportDao.search(map); + ids = toUnqualifiedVersionlessIdValues(results); + assertThat(ids.toString(), ids, contains(drId1.getValue())); + myCaptureQueriesListener.logSelectQueriesForCurrentThread(); + + } + /** * See #441 */