Skip to content
This repository has been archived by the owner on Jun 28, 2024. It is now read-only.

Commit

Permalink
Merge pull request #302 from MeasureAuthoringTool/bugfix/dedup-hotfix…
Browse files Browse the repository at this point in the history
…-from-master

Deduplicate DataRequirements with varying Teminology Filters
  • Loading branch information
jkotanchik-SB authored Apr 20, 2021
2 parents 8e1b958 + 78677e8 commit 83f3a4c
Show file tree
Hide file tree
Showing 2 changed files with 87 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ private List<RelatedArtifact> distinctArtifacts(List<RelatedArtifact> artifacts)
return result;
}

private List<DataRequirement> distinctDataRequirements(List<DataRequirement> reqs) {
List<DataRequirement> distinctDataRequirements(List<DataRequirement> reqs) {
List<DataRequirement> result = new ArrayList<>(reqs.size());
//Remove duplicates. I wish HapiFhir implemented equals. Today it is SadFhir for me.
//Object.deepEquals doesn't work at all on codeFilter for some reason.
Expand All @@ -158,11 +158,19 @@ private Predicate<DataRequirement> matchType(String type) {
}

private Predicate<DataRequirement> matchCodeFilter(DataRequirement o) {
return d ->
//Both code filters are empty
(CollectionUtils.isEmpty(d.getCodeFilter()) && CollectionUtils.isEmpty(o.getCodeFilter())) ||
// OR both match on path AND code or value set
(StringUtils.equals(d.getCodeFilter().get(0).getPath(), o.getCodeFilter().get(0).getPath()) && (hasMatchingValueSet(d, o) || hasMatchingCode(o, d)));
return d -> {
if ((CollectionUtils.isEmpty(d.getCodeFilter()) && CollectionUtils.isEmpty(o.getCodeFilter()))) {
// Match when both code filters are empty
return true;
} else if ((CollectionUtils.isEmpty(d.getCodeFilter()) || CollectionUtils.isEmpty(o.getCodeFilter()))) {
// No match if either code filter is empty
return false;
} else {
// Match on path AND (code or value set)
return StringUtils.equals(d.getCodeFilter().get(0).getPath(), o.getCodeFilter().get(0).getPath())
&& (hasMatchingValueSet(d, o) || hasMatchingCode(o, d));
}
};
}

private boolean hasMatchingCode(DataRequirement o, DataRequirement d) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@
import org.apache.commons.lang3.StringUtils;
import org.hl7.fhir.r4.model.CodeableConcept;
import org.hl7.fhir.r4.model.Coding;
import org.hl7.fhir.r4.model.DataRequirement;
import org.hl7.fhir.r4.model.Enumerations;
import org.hl7.fhir.r4.model.Library;
import org.hl7.fhir.utilities.xhtml.NodeType;
import org.hl7.fhir.utilities.xhtml.XhtmlNode;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand All @@ -27,11 +29,14 @@

import java.io.IOException;
import java.io.InputStream;
import java.util.Base64;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;

import static org.junit.Assert.assertArrayEquals;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.hamcrest.Matchers.is;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
Expand Down Expand Up @@ -160,4 +165,70 @@ void testRetrieveAndRelatedArtifacts() throws IOException {
// assertEquals("'http://cts.nlm.nih.gov/fhir/ValueSet/2.16.840.1.113762.1.4.1110.39'",
// lib.getDataRequirement().get(2).getCodeFilter().get(0).getValueSet());
}

@Test
void testUniqueDataRequirementsAreNotDropped() {
List<DataRequirement> dataRequirements = new ArrayList<>();
dataRequirements.add(generateDataRequirementWithCode("Encounter", "systemA", "1234"));
dataRequirements.add(generateDataRequirementWithValueSet("Encounter", "http://host/fhir/ValueSet/abcd"));
dataRequirements.add(generateDataRequirementWithoutFilter("Encounter"));

List<DataRequirement> dedupResult = libTranslator.distinctDataRequirements(dataRequirements);

Assertions.assertEquals(dataRequirements, dedupResult);
assertThat(dedupResult, containsInAnyOrder(dataRequirements.toArray()));
}

@Test
void testDuplicateDataRequirementIsDropped() {
List<DataRequirement> uniqueList = new ArrayList<>();
uniqueList.add(generateDataRequirementWithCode("Encounter", "systemA", "1234"));
uniqueList.add(generateDataRequirementWithValueSet("Encounter", "http://host/fhir/ValueSet/abcd"));
uniqueList.add(generateDataRequirementWithoutFilter("Encounter"));

List<DataRequirement> duplicateList = new ArrayList<>(uniqueList);
duplicateList.add(generateDataRequirementWithoutFilter("Encounter"));
duplicateList.add(generateDataRequirementWithValueSet("Encounter", "http://host/fhir/ValueSet/abcd"));

List<DataRequirement> dedupResult = libTranslator.distinctDataRequirements(duplicateList);

Assertions.assertNotEquals(duplicateList, dedupResult);
Assertions.assertEquals(uniqueList, dedupResult);
assertThat(dedupResult, containsInAnyOrder(uniqueList.toArray()));
}

@Test
void testDedupZeroDataRequirements() {
List<DataRequirement> emptyList = Collections.emptyList();
List<DataRequirement> dedupResult = libTranslator.distinctDataRequirements(emptyList);
assertThat(dedupResult.size(), is(0));
}

private DataRequirement generateDataRequirementWithCode(String type, String system, String code) {
Coding drc = new Coding();
drc.setSystem(system).setCode(code).setDisplay("Coding Terminology: " + code);
return generateDataRequirement(type, null, drc);
}

private DataRequirement generateDataRequirementWithValueSet(String type, String valueSet) {
return generateDataRequirement(type, valueSet, null);
}

private DataRequirement generateDataRequirementWithoutFilter(String type) {
DataRequirement dataRequirement =
new DataRequirement();
return dataRequirement.setType(type);
}

private DataRequirement generateDataRequirement(String type, String valueSet, Coding drc) {
DataRequirement dataRequirement =
new DataRequirement();
DataRequirement.DataRequirementCodeFilterComponent filterComponent =
new DataRequirement.DataRequirementCodeFilterComponent();

return dataRequirement.setType(type).setCodeFilter(List.of(filterComponent
.setPath("code")
.setValueSet(valueSet)
.addCode(drc)));
}
}

0 comments on commit 83f3a4c

Please sign in to comment.