5231 MDM Link History gives 404 after MDM clear and submit (#5232)
* fix + tests * remove comments * docs + changelog * spotless * edit changelog --------- Co-authored-by: justindar <justin.dar@smilecdr.com>
This commit is contained in:
parent
db6d8092f2
commit
6a7340a879
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
type: fix
|
||||||
|
issue: 5231
|
||||||
|
title: "Previously, the `$mdm-link-history` operation would result in a 404 response when it was executed after a
|
||||||
|
`$mdm-clear`. This has now been fixed by removing link history on `$mdm-clear`."
|
|
@ -839,7 +839,8 @@ your ruleset. It permits the user to reset the state of their MDM system without
|
||||||
and Golden Resources.
|
and Golden Resources.
|
||||||
|
|
||||||
After the operation is complete, all targeted MDM links are removed from the system, and their related Golden Resources
|
After the operation is complete, all targeted MDM links are removed from the system, and their related Golden Resources
|
||||||
are deleted and expunged from the server.
|
are deleted and expunged from the server. Additionally, the link history for targeted links and their related golden
|
||||||
|
resources will also be expunged.
|
||||||
|
|
||||||
This operation takes two optional Parameters.
|
This operation takes two optional Parameters.
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,13 @@ public interface IMdmLinkJpaRepository
|
||||||
@Query("DELETE FROM MdmLink f WHERE myGoldenResourcePid IN (:goldenPids) OR mySourcePid IN (:goldenPids)")
|
@Query("DELETE FROM MdmLink f WHERE myGoldenResourcePid IN (:goldenPids) OR mySourcePid IN (:goldenPids)")
|
||||||
void deleteLinksWithAnyReferenceToPids(@Param("goldenPids") List<Long> theResourcePids);
|
void deleteLinksWithAnyReferenceToPids(@Param("goldenPids") List<Long> theResourcePids);
|
||||||
|
|
||||||
|
@Modifying
|
||||||
|
@Query(
|
||||||
|
value =
|
||||||
|
"DELETE FROM MPI_LINK_AUD f WHERE GOLDEN_RESOURCE_PID IN (:goldenPids) OR TARGET_PID IN (:goldenPids)",
|
||||||
|
nativeQuery = true)
|
||||||
|
void deleteLinksHistoryWithAnyReferenceToPids(@Param("goldenPids") List<Long> theResourcePids);
|
||||||
|
|
||||||
@Query("SELECT ml2.myGoldenResourcePid as goldenPid, ml2.mySourcePid as sourcePid FROM MdmLink ml2 "
|
@Query("SELECT ml2.myGoldenResourcePid as goldenPid, ml2.mySourcePid as sourcePid FROM MdmLink ml2 "
|
||||||
+ "WHERE ml2.myMatchResult=:matchResult "
|
+ "WHERE ml2.myMatchResult=:matchResult "
|
||||||
+ "AND ml2.myGoldenResourcePid IN ("
|
+ "AND ml2.myGoldenResourcePid IN ("
|
||||||
|
|
|
@ -350,6 +350,7 @@ public class MdmLinkDaoJpaImpl implements IMdmLinkDao<JpaPid, MdmLink> {
|
||||||
List<List<Long>> chunks = ListUtils.partition(goldenResourcePids, 500);
|
List<List<Long>> chunks = ListUtils.partition(goldenResourcePids, 500);
|
||||||
for (List<Long> chunk : chunks) {
|
for (List<Long> chunk : chunks) {
|
||||||
myMdmLinkDao.deleteLinksWithAnyReferenceToPids(chunk);
|
myMdmLinkDao.deleteLinksWithAnyReferenceToPids(chunk);
|
||||||
|
myMdmLinkDao.deleteLinksHistoryWithAnyReferenceToPids(chunk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -4,14 +4,15 @@ import ca.uhn.fhir.jpa.api.config.JpaStorageSettings;
|
||||||
import ca.uhn.fhir.jpa.entity.MdmLink;
|
import ca.uhn.fhir.jpa.entity.MdmLink;
|
||||||
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
|
import ca.uhn.fhir.jpa.model.config.PartitionSettings;
|
||||||
import ca.uhn.fhir.mdm.api.IMdmLink;
|
import ca.uhn.fhir.mdm.api.IMdmLink;
|
||||||
|
import ca.uhn.fhir.mdm.api.MdmHistorySearchParameters;
|
||||||
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
|
||||||
|
import ca.uhn.fhir.mdm.api.MdmLinkWithRevision;
|
||||||
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
|
||||||
import org.hl7.fhir.instance.model.api.IAnyResource;
|
import org.hl7.fhir.instance.model.api.IAnyResource;
|
||||||
import org.hl7.fhir.r4.model.Patient;
|
import org.hl7.fhir.r4.model.Patient;
|
||||||
import org.hl7.fhir.r4.model.StringType;
|
import org.hl7.fhir.r4.model.StringType;
|
||||||
import org.junit.jupiter.api.AfterEach;
|
import org.junit.jupiter.api.AfterEach;
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
import org.junit.jupiter.api.BeforeEach;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -71,4 +72,12 @@ public abstract class BaseLinkR4Test extends BaseProviderR4Test {
|
||||||
protected List<? extends IMdmLink> getPatientLinks() {
|
protected List<? extends IMdmLink> getPatientLinks() {
|
||||||
return myMdmLinkDaoSvc.findMdmLinksBySourceResource(myPatient);
|
return myMdmLinkDaoSvc.findMdmLinksBySourceResource(myPatient);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected List<MdmLinkWithRevision<MdmLink>> getHistoricalLinks(List<String> theGoldenResourceIds, List<String> theResourceIds) {
|
||||||
|
MdmHistorySearchParameters historySearchParameters = new MdmHistorySearchParameters()
|
||||||
|
.setGoldenResourceIds(theGoldenResourceIds)
|
||||||
|
.setSourceIds(theResourceIds);
|
||||||
|
|
||||||
|
return myMdmLinkDaoSvc.findMdmLinkHistory(historySearchParameters);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,6 +30,7 @@ import org.mockito.ArgumentCaptor;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
@ -171,6 +172,7 @@ public class MdmProviderClearLinkR4Test extends BaseLinkR4Test {
|
||||||
assertLinkCount(2);
|
assertLinkCount(2);
|
||||||
clearMdmLinks();
|
clearMdmLinks();
|
||||||
assertNoLinksExist();
|
assertNoLinksExist();
|
||||||
|
assertNoHistoricalLinksExist(List.of(myPractitionerGoldenResourceId.getValueAsString(), mySourcePatientId.getValueAsString()), new ArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertNoLinksExist() {
|
private void assertNoLinksExist() {
|
||||||
|
@ -182,6 +184,10 @@ public class MdmProviderClearLinkR4Test extends BaseLinkR4Test {
|
||||||
assertThat(getPatientLinks(), hasSize(0));
|
assertThat(getPatientLinks(), hasSize(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void assertNoHistoricalLinksExist(List<String> theGoldenResourceIds, List<String> theResourceIds) {
|
||||||
|
assertThat(getHistoricalLinks(theGoldenResourceIds, theResourceIds), hasSize(0));
|
||||||
|
}
|
||||||
|
|
||||||
private void assertNoPractitionerLinksExist() {
|
private void assertNoPractitionerLinksExist() {
|
||||||
assertThat(getPractitionerLinks(), hasSize(0));
|
assertThat(getPractitionerLinks(), hasSize(0));
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue