diff --git a/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5129-add-total-results-to-mdm-possible-duplicate-operation.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5129-add-total-results-to-mdm-possible-duplicate-operation.yaml new file mode 100644 index 00000000000..5c4e726a6b8 --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_0_0/5129-add-total-results-to-mdm-possible-duplicate-operation.yaml @@ -0,0 +1,4 @@ +--- +type: add +issue: 5129 +title: "Added a field that shows the total number of `POSSIBLE_DUPLICATE` links has been added to the `$mdm-duplicate-golden-resources` operation response." diff --git a/hapi-fhir-jpaserver-mdm/src/test/java/ca/uhn/fhir/jpa/mdm/provider/MdmProviderQueryLinkR4Test.java b/hapi-fhir-jpaserver-mdm/src/test/java/ca/uhn/fhir/jpa/mdm/provider/MdmProviderQueryLinkR4Test.java index dfe9df38af9..b8873b48183 100644 --- a/hapi-fhir-jpaserver-mdm/src/test/java/ca/uhn/fhir/jpa/mdm/provider/MdmProviderQueryLinkR4Test.java +++ b/hapi-fhir-jpaserver-mdm/src/test/java/ca/uhn/fhir/jpa/mdm/provider/MdmProviderQueryLinkR4Test.java @@ -76,9 +76,13 @@ public class MdmProviderQueryLinkR4Test extends BaseLinkR4Test { myGoldenResource2Id = new StringType(sourcePatient2.getIdElement().toVersionless().getValue()); JpaPid sourcePatient2Pid = runInTransaction(()->myIdHelperService.getPidOrNull(RequestPartitionId.allPartitions(), sourcePatient2)); + createPossibleDuplicateLinkByPid(sourcePatient2Pid, sourcePatient1Pid); + } + + private void createPossibleDuplicateLinkByPid(JpaPid theSourcePid, JpaPid theGoldenPid) { MdmLink possibleDuplicateMdmLink = (MdmLink) myMdmLinkDaoSvc.newMdmLink(); - possibleDuplicateMdmLink.setGoldenResourcePersistenceId(sourcePatient1Pid) - .setSourcePersistenceId(sourcePatient2Pid) + possibleDuplicateMdmLink.setGoldenResourcePersistenceId(theGoldenPid) + .setSourcePersistenceId(theSourcePid) .setMatchResult(MdmMatchResultEnum.POSSIBLE_DUPLICATE) .setLinkSource(MdmLinkSourceEnum.AUTO) .setScore(1.0) @@ -392,6 +396,32 @@ public class MdmProviderQueryLinkR4Test extends BaseLinkR4Test { assertThat(list, hasSize(1)); List part = list.get(0).getPart(); assertMdmLink(2, part, myGoldenResource1Id.getValue(), myGoldenResource2Id.getValue(), MdmMatchResultEnum.POSSIBLE_DUPLICATE, "false", "false", null); + assertResponseDuplicateCount(list.size(), result); + } + + @Test + public void testQueryPossibleDuplicates_withCountLessThanTotal_returnsCorrectTotal() { + // Given: create second possible duplicate + JpaPid sourcePatient1Pid = runInTransaction(()->myIdHelperService.getPidOrThrowException(RequestPartitionId.allPartitions(), new IdType(myGoldenResource1Id.toString()))); + Patient sourcePatient3 = createGoldenPatient(); + JpaPid sourcePatient3Pid = runInTransaction(()->myIdHelperService.getPidOrNull(RequestPartitionId.allPartitions(), sourcePatient3)); + + createPossibleDuplicateLinkByPid(sourcePatient1Pid, sourcePatient3Pid); + + // When + Parameters result = (Parameters) myMdmProvider.getDuplicateGoldenResources(new UnsignedIntType(0), new UnsignedIntType(1), myRequestDetails, null); + ourLog.debug(myFhirContext.newJsonParser().setPrettyPrint(true).encodeResourceToString(result)); + + // Then: parameters should have 1 link (since count = 1), total should be 2 + List list = getParametersByName(result, "link"); + assertThat(list, hasSize(1)); + assertResponseDuplicateCount(2, result); + } + + private void assertResponseDuplicateCount(int expectedSize, Parameters result) { + List count = getParametersByName(result, "total"); + assertThat(count, hasSize(1)); + assertEquals(String.valueOf(expectedSize), count.get(0).getValue().primitiveValue()); } @Test @@ -403,6 +433,7 @@ public class MdmProviderQueryLinkR4Test extends BaseLinkR4Test { List part = list.get(0).getPart(); assertMdmLink(2, part, myGoldenResource1Id.getValue(), myGoldenResource2Id.getValue(), MdmMatchResultEnum.POSSIBLE_DUPLICATE, "false", "false", null); assertTrue(myGoldenResource1Id.toString().contains("Patient")); + assertResponseDuplicateCount(list.size(), result); } @Test @@ -412,6 +443,7 @@ public class MdmProviderQueryLinkR4Test extends BaseLinkR4Test { List list = getParametersByName(result, "link"); assertThat(list, hasSize(0)); + assertResponseDuplicateCount(list.size(), result); } @Test diff --git a/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/provider/BaseMdmProvider.java b/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/provider/BaseMdmProvider.java index bcfe9204100..710d1da5bc2 100644 --- a/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/provider/BaseMdmProvider.java +++ b/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/provider/BaseMdmProvider.java @@ -175,17 +175,21 @@ public abstract class BaseMdmProvider { protected IBaseParameters parametersFromMdmLinks( Page theMdmLinkStream, - boolean includeResultAndSource, + boolean theIncludeResultAndSource, ServletRequestDetails theServletRequestDetails, MdmPageRequest thePageRequest) { IBaseParameters retval = ParametersUtil.newInstance(myFhirContext); addPagingParameters(retval, theMdmLinkStream, theServletRequestDetails, thePageRequest); + + long numDuplicates = theMdmLinkStream.getTotalElements(); + ParametersUtil.addParameterToParametersLong(myFhirContext, retval, "total", numDuplicates); + theMdmLinkStream.getContent().forEach(mdmLink -> { IBase resultPart = ParametersUtil.addParameterToParameters(myFhirContext, retval, "link"); ParametersUtil.addPartString(myFhirContext, resultPart, "goldenResourceId", mdmLink.getGoldenResourceId()); ParametersUtil.addPartString(myFhirContext, resultPart, "sourceResourceId", mdmLink.getSourceId()); - if (includeResultAndSource) { + if (theIncludeResultAndSource) { ParametersUtil.addPartString( myFhirContext, resultPart,