diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasure.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasure.java index f876539b4..200d381c8 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasure.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasure.java @@ -24,6 +24,8 @@ public class CompositeEvaluationResultsPerMeasure { private final Map> resultsPerMeasure; // We may get several errors for a given measure private final Map> errorsPerMeasure; + // We may get several warnings for a given measure + private final Map> warningsPerMeasure; private CompositeEvaluationResultsPerMeasure(Builder builder) { @@ -34,6 +36,10 @@ private CompositeEvaluationResultsPerMeasure(Builder builder) { var errorsBuilder = ImmutableMap.>builder(); builder.errorsPerMeasure.forEach((key, value) -> errorsBuilder.put(key, List.copyOf(value))); errorsPerMeasure = errorsBuilder.build(); + + var warningsBuilder = ImmutableMap.>builder(); + builder.warningsPerMeasure.forEach((key, value) -> warningsBuilder.put(key, List.copyOf(value))); + warningsPerMeasure = warningsBuilder.build(); } /** @@ -83,6 +89,7 @@ public static Builder builder() { public static class Builder { private final Map> resultsPerMeasure = new HashMap<>(); private final Map> errorsPerMeasure = new HashMap<>(); + private final Map> warningsPerMeasure = new HashMap<>(); public CompositeEvaluationResultsPerMeasure build() { return new CompositeEvaluationResultsPerMeasure(this); @@ -116,7 +123,17 @@ public void addErrors(List measureIds, String error) { } } - public void addError(IIdType measureId, String error) { + public void addWarnings(List measureIds, String warning) { + if (warning == null || warning.isEmpty()) { + return; + } + + for (IIdType measureId : measureIds) { + addWarning(measureId, warning); + } + } + + private void addError(IIdType measureId, String error) { if (error == null || error.isBlank()) { return; } @@ -125,5 +142,15 @@ public void addError(IIdType measureId, String error) { .computeIfAbsent(measureId.toUnqualifiedVersionless(), k -> new ArrayList<>()) .add(error); } + + private void addWarning(IIdType measureId, String warning) { + if (warning == null || warning.isBlank()) { + return; + } + + warningsPerMeasure + .computeIfAbsent(measureId.toUnqualifiedVersionless(), k -> new ArrayList<>()) + .add(warning); + } } } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureProcessorUtils.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureProcessorUtils.java index d2c3a75f1..549f597a7 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureProcessorUtils.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureProcessorUtils.java @@ -403,6 +403,14 @@ public CompositeEvaluationResultsPerMeasure getEvaluationResults( resultsBuilder.addErrors(measureIds, error); logger.error(error, exception); }); + + Optional.ofNullable(evaluationResultsForMultiLib.getWarningFor(libraryVersionedIdentifier)) + .ifPresent(warning -> { + var warningMessage = EXCEPTION_FOR_SUBJECT_ID_MESSAGE_TEMPLATE.formatted( + subjectId, warning.getMessage()); + resultsBuilder.addWarnings(measureIds, warningMessage); + logger.warn(warningMessage, warning); + }); } } catch (Exception e) { diff --git a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasureTest.java b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasureTest.java index b6e7c4aab..4129e5a00 100644 --- a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasureTest.java +++ b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/common/CompositeEvaluationResultsPerMeasureTest.java @@ -27,8 +27,8 @@ void gettersContainExpectedData() { CompositeEvaluationResultsPerMeasure.Builder builder = CompositeEvaluationResultsPerMeasure.builder(); builder.addResult(m1, "subject-123", er); - builder.addError(m1, "oops-1"); - builder.addError(m2, "oops-2"); + builder.addErrors(List.of(m1), "oops-1"); + builder.addErrors(List.of(m2), "oops-2"); CompositeEvaluationResultsPerMeasure composite = builder.build(); diff --git a/pom.xml b/pom.xml index a5720e702..8cbbd32c4 100644 --- a/pom.xml +++ b/pom.xml @@ -22,7 +22,7 @@ 5.10.2 2.0.4 - 3.29.0 + 3.30.0-SNAPSHOT 1.36 6.1.20 8.4.0