Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import org.hl7.fhir.r5.model.RelatedArtifact;
import org.hl7.fhir.r5.model.Resource;
import org.hl7.fhir.r5.model.StringType;
import org.opencds.cqf.tooling.utilities.constants.CqfConstants;
import org.opencds.cqf.tooling.utilities.constants.CrmiConstants;

public class MeasureRefreshProcessor {
Expand All @@ -39,6 +40,7 @@ public Measure refreshMeasure(Measure measureToUse, LibraryManager libraryManage

Library moduleDefinitionLibrary = getModuleDefinitionLibrary(measureToUse, libraryManager, compiledLibrary, options);
removeModelInfoDependencies(moduleDefinitionLibrary);
deduplicateLogicDefinitions(moduleDefinitionLibrary);
measureToUse.setDate(new Date());
// http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/measure-cqfm
setMeta(measureToUse, moduleDefinitionLibrary);
Expand Down Expand Up @@ -102,6 +104,30 @@ private Set<String> getExpressions(Measure measureToUse) {
return expressionSet;
}

private void deduplicateLogicDefinitions(Library moduleDefinitionLibrary) {
Set<String> seen = new HashSet<>();
moduleDefinitionLibrary.getExtension().removeIf(ext -> {
if (ext.hasUrl() && ext.getUrl().equals(CqfConstants.LOGIC_DEFINITION_EXT_URL)) {
String key = getLogicDefinitionKey(ext);
return key != null && !seen.add(key);
}
return false;
});
}

private String getLogicDefinitionKey(Extension logicDefinition) {
String libraryName = null;
String name = null;
for (Extension sub : logicDefinition.getExtension()) {
if ("libraryName".equals(sub.getUrl()) && sub.hasValue()) {
libraryName = sub.getValue().primitiveValue();
} else if ("name".equals(sub.getUrl()) && sub.hasValue()) {
name = sub.getValue().primitiveValue();
}
}
return (libraryName != null && name != null) ? libraryName + "|" + name : null;
}

private void clearMeasureExtensions(Measure measure, String extensionUrl) {
List<Extension> extensionsToRemove = measure.getExtensionsByUrl(extensionUrl);
measure.getExtension().removeAll(extensionsToRemove);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,14 +66,34 @@ public void refreshCqfmExtensions(MetadataResource resource, Library moduleDefin
resource.getExtension().removeAll(resource.getExtensionsByUrl(CqfmConstants.LOGIC_DEFINITION_EXT_URL));
resource.getExtension().removeAll(resource.getExtensionsByUrl(CqfmConstants.EFFECTIVE_DATA_REQS_EXT_URL));

Set<String> logicDefinitionKeys = new HashSet<>();
for (Extension extension : moduleDefinitionLibrary.getExtension()) {
if (extension.hasUrl() && extension.getUrl().equals(CqfmConstants.DIRECT_REF_CODE_EXT_URL)) {
continue;
}
if (extension.hasUrl() && extension.getUrl().equals(CqfmConstants.LOGIC_DEFINITION_EXT_URL)) {
String key = getLogicDefinitionKey(extension);
if (key != null && !logicDefinitionKeys.add(key)) {
continue;
}
}
resource.addExtension(extension);
}
}

private String getLogicDefinitionKey(Extension logicDefinition) {
String libraryName = null;
String name = null;
for (Extension sub : logicDefinition.getExtension()) {
if ("libraryName".equals(sub.getUrl()) && sub.hasValue()) {
libraryName = sub.getValue().primitiveValue();
} else if ("name".equals(sub.getUrl()) && sub.hasValue()) {
name = sub.getValue().primitiveValue();
}
}
return (libraryName != null && name != null) ? libraryName + "|" + name : null;
}

public void attachModuleDefinitionLibrary(MetadataResource resource, Library moduleDefinitionLibrary) {
resource.getContained().removeIf(res -> res.getId()
.equalsIgnoreCase("#" + CrmiConstants.EFFECTIVE_DATA_REQUIREMENTS_IDENTIFIER));
Expand Down
Loading