Resolve MDM query links operation score field imprecise value (#5332)

* - Fixed precision error and rounded to 4 decimal places
- Removed the vector field from the return value of mdmlink toJSON
- modified tests for the above changes.

* changed to use BigDecimal instead of Precision to round score

* reformatted file
This commit is contained in:
TynerGjs 2023-09-25 10:44:36 -04:00 committed by GitHub
parent 10d9d9628c
commit bc0ee995a2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 39 additions and 8 deletions

View File

@ -403,7 +403,7 @@ public class ParametersUtil {
public static void addPartDecimal(FhirContext theContext, IBase theParameter, String theName, Double theValue) {
IPrimitiveType<BigDecimal> value = (IPrimitiveType<BigDecimal>)
theContext.getElementDefinition("decimal").newInstance();
value.setValue(theValue == null ? null : new BigDecimal(theValue));
value.setValue(theValue == null ? null : BigDecimal.valueOf(theValue));
addPart(theContext, theParameter, theName, value);
}

View File

@ -0,0 +1,5 @@
---
type: fix
issue: 5331
title: "Previously, the score field returned by $mdm-query-links operation would contain imprecise decimal values. This
is now fixed and rounded to 4 decimal places."

View File

@ -25,6 +25,7 @@ import ca.uhn.fhir.jpa.model.entity.ResourceTable;
import ca.uhn.fhir.mdm.api.IMdmLink;
import ca.uhn.fhir.mdm.api.MdmLinkSourceEnum;
import ca.uhn.fhir.mdm.api.MdmMatchResultEnum;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.hibernate.envers.AuditTable;
import org.hibernate.envers.Audited;
@ -161,6 +162,7 @@ public class MdmLink extends AuditableBasePartitionable implements IMdmLink<JpaP
private Boolean myHadToCreateNewGoldenResource;
@Column(name = "VECTOR")
@JsonIgnore
private Long myVector;
@Column(name = "SCORE")

View File

@ -26,6 +26,9 @@ import ca.uhn.fhir.mdm.model.mdmevents.MdmLinkJson;
import ca.uhn.fhir.mdm.model.mdmevents.MdmLinkWithRevisionJson;
import org.springframework.beans.factory.annotation.Autowired;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class MdmModelConverterSvcImpl implements IMdmModelConverterSvc {
@Autowired
@ -49,9 +52,13 @@ public class MdmModelConverterSvcImpl implements IMdmModelConverterSvc {
retVal.setLinkSource(theLink.getLinkSource());
retVal.setMatchResult(theLink.getMatchResult());
retVal.setLinkCreatedNewResource(theLink.getHadToCreateNewGoldenResource());
retVal.setScore(theLink.getScore());
Double score = theLink.getScore() == null
? null
: BigDecimal.valueOf(theLink.getScore())
.setScale(4, RoundingMode.HALF_UP)
.doubleValue();
retVal.setScore(score);
retVal.setUpdated(theLink.getUpdated());
retVal.setVector(theLink.getVector());
retVal.setVersion(theLink.getVersion());
retVal.setRuleCount(theLink.getRuleCount());
return retVal;

View File

@ -18,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.Month;
import java.time.ZoneId;
@ -35,15 +37,19 @@ public class MdmModelConverterSvcImplTest extends BaseMdmR4Test {
final Date updateTime = new Date();
final String version = "1";
final boolean isLinkCreatedResource = false;
final double score = 0.8333333333333;
final double scoreRounded = BigDecimal.valueOf(score).setScale(4, RoundingMode.HALF_UP).doubleValue();
final MdmLink mdmLink = createGoldenPatientAndLinkToSourcePatient(MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource);
MdmLink mdmLink = createGoldenPatientAndLinkToSourcePatient(MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource);
mdmLink.setScore(score);
mdmLink.setVector(61L);
myMdmLinkDao.save(mdmLink);
final MdmLinkJson actualMdmLinkJson = myMdmModelConverterSvc.toJson(mdmLink);
ourLog.info("actualMdmLinkJson: {}", actualMdmLinkJson);
assertEquals(getExepctedMdmLinkJson(mdmLink.getGoldenResourcePersistenceId().getId(), mdmLink.getSourcePersistenceId().getId(), MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource), actualMdmLinkJson);
assertEquals(getExepctedMdmLinkJson(mdmLink.getGoldenResourcePersistenceId().getId(), mdmLink.getSourcePersistenceId().getId(), MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource, scoreRounded), actualMdmLinkJson);
}
@Test
@ -57,15 +63,20 @@ public class MdmModelConverterSvcImplTest extends BaseMdmR4Test {
final String version = "1";
final boolean isLinkCreatedResource = false;
final long revisionNumber = 2L;
final double score = 0.8333333333333;
final double scoreRounded = BigDecimal.valueOf(score).setScale(4, RoundingMode.HALF_UP).doubleValue();
final MdmLink mdmLink = createGoldenPatientAndLinkToSourcePatient(MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource);
MdmLink mdmLink = createGoldenPatientAndLinkToSourcePatient(MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource);
mdmLink.setScore(score);
mdmLink.setVector(61L);
myMdmLinkDao.save(mdmLink);
final MdmLinkWithRevision<IMdmLink<? extends IResourcePersistentId<?>>> revision = new MdmLinkWithRevision<>(mdmLink, new EnversRevision(RevisionType.ADD, revisionNumber, revisionTimestamp));
final MdmLinkWithRevisionJson actualMdmLinkWithRevisionJson = myMdmModelConverterSvc.toJson(revision);
final MdmLinkWithRevisionJson expectedMdmLinkWithRevisionJson =
new MdmLinkWithRevisionJson(getExepctedMdmLinkJson(mdmLink.getGoldenResourcePersistenceId().getId(), mdmLink.getSourcePersistenceId().getId(), MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource), revisionNumber, revisionTimestamp);
new MdmLinkWithRevisionJson(getExepctedMdmLinkJson(mdmLink.getGoldenResourcePersistenceId().getId(), mdmLink.getSourcePersistenceId().getId(), MdmMatchResultEnum.MATCH, MdmLinkSourceEnum.MANUAL, version, createTime, updateTime, isLinkCreatedResource, scoreRounded), revisionNumber, revisionTimestamp);
assertMdmLinkRevisionsEqual(expectedMdmLinkWithRevisionJson, actualMdmLinkWithRevisionJson);
}
@ -77,12 +88,14 @@ public class MdmModelConverterSvcImplTest extends BaseMdmR4Test {
assertEquals(expectedMdmLink.getSourceId(), actualMdmLink.getSourceId());
assertEquals(expectedMdmLink.getMatchResult(), actualMdmLink.getMatchResult());
assertEquals(expectedMdmLink.getLinkSource(), actualMdmLink.getLinkSource());
assertEquals(expectedMdmLink.getScore(), actualMdmLink.getScore());
assertEquals(expectedMdmLink.getVector(), actualMdmLink.getVector());
assertEquals(theExpectedMdmLinkWithRevisionJson.getRevisionNumber(), theActualMdmLinkWithRevisionJson.getRevisionNumber());
assertEquals(theExpectedMdmLinkWithRevisionJson.getRevisionTimestamp(), theActualMdmLinkWithRevisionJson.getRevisionTimestamp());
}
private MdmLinkJson getExepctedMdmLinkJson(Long theGoldenPatientId, Long theSourceId, MdmMatchResultEnum theMdmMatchResultEnum, MdmLinkSourceEnum theMdmLinkSourceEnum, String version, Date theCreateTime, Date theUpdateTime, boolean theLinkCreatedNewResource) {
private MdmLinkJson getExepctedMdmLinkJson(Long theGoldenPatientId, Long theSourceId, MdmMatchResultEnum theMdmMatchResultEnum, MdmLinkSourceEnum theMdmLinkSourceEnum, String version, Date theCreateTime, Date theUpdateTime, boolean theLinkCreatedNewResource, double theScore) {
final MdmLinkJson mdmLinkJson = new MdmLinkJson();
mdmLinkJson.setGoldenResourceId("Patient/" + theGoldenPatientId);
@ -93,6 +106,10 @@ public class MdmModelConverterSvcImplTest extends BaseMdmR4Test {
mdmLinkJson.setCreated(theCreateTime);
mdmLinkJson.setUpdated(theUpdateTime);
mdmLinkJson.setLinkCreatedNewResource(theLinkCreatedNewResource);
mdmLinkJson.setScore(theScore);
// make sure vector is not converted
mdmLinkJson.setVector(null);
return mdmLinkJson;
}