From 1c7247134993d59702133e0699538ad91271c28a Mon Sep 17 00:00:00 2001 From: Luke deGruchy Date: Thu, 10 Oct 2024 13:29:07 -0400 Subject: [PATCH] Remove race condition between different evaluation periods by deleting Parameters parameter from evaluateMeasure(). --- .../measure/common/BaseMeasureEvaluation.java | 22 ++++++------------- .../cr/measure/common/MeasureEvaluator.java | 9 +------- .../measure/dstu3/Dstu3MeasureEvaluation.java | 7 ++---- .../measure/dstu3/Dstu3MeasureProcessor.java | 17 ++------------ .../cr/measure/r4/R4MeasureEvaluation.java | 6 ++--- .../cr/measure/r4/R4MeasureProcessor.java | 15 ++----------- .../cr/measure/r4/utils/R4DateHelper.java | 5 ++++- .../dstu3/Dstu3MeasureEvaluationTest.java | 6 ++--- .../measure/r4/R4MeasureEvaluationTest.java | 6 ++--- 9 files changed, 26 insertions(+), 67 deletions(-) diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/BaseMeasureEvaluation.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/BaseMeasureEvaluation.java index d2eb82753..fa3e1d869 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/BaseMeasureEvaluation.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/BaseMeasureEvaluation.java @@ -3,7 +3,6 @@ import java.util.List; import java.util.Objects; import org.hl7.elm.r1.VersionedIdentifier; -import org.hl7.fhir.instance.model.api.IBaseParameters; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.runtime.Interval; import org.opencds.cqf.fhir.cql.LibraryEngine; @@ -17,7 +16,6 @@ public abstract class BaseMeasureEvaluation protected MeasureT measure; protected LibraryEngine libraryEngine; protected String measurementPeriodParameterName; - protected IBaseParameters parameters; protected VersionedIdentifier versionIdentifier; protected BaseMeasureEvaluation( @@ -26,8 +24,7 @@ protected BaseMeasureEvaluation( MeasureDefBuilder measureDefBuilder, MeasureReportBuilder measureReportBuilder, LibraryEngine libraryEngine, - VersionedIdentifier versionIdentifier, - IBaseParameters parameters) { + VersionedIdentifier versionIdentifier) { this( context, measure, @@ -35,8 +32,7 @@ protected BaseMeasureEvaluation( measureReportBuilder, MeasureConstants.MEASUREMENT_PERIOD_PARAMETER_NAME, libraryEngine, - versionIdentifier, - parameters); + versionIdentifier); } protected BaseMeasureEvaluation( @@ -46,8 +42,7 @@ protected BaseMeasureEvaluation( MeasureReportBuilder measureReportBuilder, String measurementPeriodParameterName, LibraryEngine libraryEngine, - VersionedIdentifier versionIdentifier, - IBaseParameters parameters) { + VersionedIdentifier versionIdentifier) { this.context = Objects.requireNonNull(context, "context is a required argument"); this.measure = Objects.requireNonNull(measure, "measure is a required argument"); this.measureDefBuilder = Objects.requireNonNull(measureDefBuilder, "measureDefBuilder is a required argument"); @@ -56,7 +51,6 @@ protected BaseMeasureEvaluation( this.measurementPeriodParameterName = Objects.requireNonNull( measurementPeriodParameterName, "measurementPeriodParameterName is a required argument"); this.libraryEngine = libraryEngine; - this.parameters = parameters; this.versionIdentifier = versionIdentifier; } @@ -64,9 +58,8 @@ public MeasureReportT evaluate( MeasureEvalType measureEvalType, List subjectIds, LibraryEngine libraryEngine, - VersionedIdentifier id, - IBaseParameters parameters) { - return this.evaluate(measureEvalType, subjectIds, null, libraryEngine, id, parameters); + VersionedIdentifier id) { + return this.evaluate(measureEvalType, subjectIds, null, libraryEngine, id); } public MeasureReportT evaluate( @@ -74,8 +67,7 @@ public MeasureReportT evaluate( List subjectIds, Interval measurementPeriod, LibraryEngine libraryEngine, - VersionedIdentifier id, - IBaseParameters parameters) { + VersionedIdentifier id) { Objects.requireNonNull(subjectIds, "subjectIds is a required parameter"); Objects.requireNonNull(measureEvalType, "measureEvalType is a required parameter"); @@ -83,7 +75,7 @@ public MeasureReportT evaluate( MeasureEvaluator measureEvaluation = new MeasureEvaluator(context, this.measurementPeriodParameterName, libraryEngine); measureDef = - measureEvaluation.evaluate(measureDef, measureEvalType, subjectIds, measurementPeriod, parameters, id); + measureEvaluation.evaluate(measureDef, measureEvalType, subjectIds, measurementPeriod, id); Interval measurementPeriodInterval; if (measurementPeriod == null) { diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureEvaluator.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureEvaluator.java index 7f5f865d6..361c51556 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureEvaluator.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/common/MeasureEvaluator.java @@ -30,7 +30,6 @@ import org.hl7.elm.r1.NamedTypeSpecifier; import org.hl7.elm.r1.ParameterDef; import org.hl7.elm.r1.VersionedIdentifier; -import org.hl7.fhir.instance.model.api.IBaseParameters; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.cql.engine.execution.EvaluationResult; import org.opencds.cqf.cql.engine.execution.ExpressionResult; @@ -83,7 +82,6 @@ public MeasureDef evaluate( MeasureEvalType measureEvalType, List subjectIds, @Nullable Interval measurementPeriod, - IBaseParameters parameters, VersionedIdentifier versionedIdentifier) { Objects.requireNonNull(measureDef, "measureDef is a required argument"); Objects.requireNonNull(subjectIds, "subjectIds is a required argument"); @@ -100,7 +98,6 @@ public MeasureDef evaluate( measureDef, MeasureReportType.INDIVIDUAL, subjectIds, - parameters, versionedIdentifier, zonedDateTime); case SUBJECTLIST: @@ -108,7 +105,6 @@ public MeasureDef evaluate( measureDef, MeasureReportType.SUBJECTLIST, subjectIds, - parameters, versionedIdentifier, zonedDateTime); case PATIENTLIST: @@ -117,7 +113,6 @@ public MeasureDef evaluate( measureDef, MeasureReportType.PATIENTLIST, subjectIds, - parameters, versionedIdentifier, zonedDateTime); case POPULATION: @@ -125,7 +120,6 @@ public MeasureDef evaluate( measureDef, MeasureReportType.SUMMARY, subjectIds, - parameters, versionedIdentifier, zonedDateTime); default: @@ -300,7 +294,6 @@ protected MeasureDef evaluate( MeasureDef measureDef, MeasureReportType type, List subjectIds, - IBaseParameters parameters, VersionedIdentifier id, ZonedDateTime zonedDateTime) { var subjectSize = subjectIds.size(); @@ -322,7 +315,7 @@ protected MeasureDef evaluate( context.getState().setContextValue(subjectTypePart, subjectIdPart); EvaluationResult result = libraryEngine.getEvaluationResult( - id, subjectId, parameters, null, null, null, zonedDateTime, context); + id, subjectId, null, null, null, null, zonedDateTime, context); evaluateSubject(measureDef, subjectTypePart, subjectIdPart, subjectSize, type, result); } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluation.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluation.java index a1887d257..3a7dac23d 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluation.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluation.java @@ -4,7 +4,6 @@ import org.hl7.fhir.dstu3.model.DomainResource; import org.hl7.fhir.dstu3.model.Measure; import org.hl7.fhir.dstu3.model.MeasureReport; -import org.hl7.fhir.dstu3.model.Parameters; import org.opencds.cqf.cql.engine.execution.CqlEngine; import org.opencds.cqf.fhir.cql.LibraryEngine; import org.opencds.cqf.fhir.cr.measure.common.BaseMeasureEvaluation; @@ -18,15 +17,13 @@ public Dstu3MeasureEvaluation( CqlEngine context, Measure measure, LibraryEngine libraryEngine, - VersionedIdentifier versionIdentifier, - Parameters parameters) { + VersionedIdentifier versionIdentifier) { super( context, measure, new Dstu3MeasureDefBuilder(), new Dstu3MeasureReportBuilder(), libraryEngine, - versionIdentifier, - parameters); + versionIdentifier); } } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureProcessor.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureProcessor.java index f86be0637..a588fd567 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureProcessor.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureProcessor.java @@ -138,22 +138,9 @@ protected MeasureReport evaluateMeasure( var subjects = subjectProvider.getSubjects(actualRepo, evalType, subjectIds).collect(Collectors.toList()); var libraryEngine = new LibraryEngine(repository, this.measureEvaluationOptions.getEvaluationSettings()); - var params = makeParameters(measurementPeriod); Dstu3MeasureEvaluation measureEvaluator = - new Dstu3MeasureEvaluation(context, measure, libraryEngine, id, params); - return measureEvaluator.evaluate(evalType, subjects, measurementPeriod, libraryEngine, id, params); - } - - public Parameters makeParameters(Interval measurementPeriod) { - Parameters parameters = new Parameters(); - if (measurementPeriod != null) { - - Period period = new Period(); - period.setStartElement(new DateTimeType(measurementPeriod.getStart().toString())); - period.setEndElement(new DateTimeType(measurementPeriod.getEnd().toString())); - parameters.addParameter().setName(MEASUREMENT_PERIOD_PARAMETER_NAME).setValue(period); - } - return parameters; + new Dstu3MeasureEvaluation(context, measure, libraryEngine, id); + return measureEvaluator.evaluate(evalType, subjects, measurementPeriod, libraryEngine, id); } protected MeasureReportType evalTypeToReportType(MeasureEvalType measureEvalType) { diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluation.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluation.java index 68e6dbef9..c3003a15f 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluation.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluation.java @@ -18,15 +18,13 @@ public R4MeasureEvaluation( CqlEngine context, Measure measure, LibraryEngine libraryEngine, - VersionedIdentifier versionIdentifier, - Parameters parameters) { + VersionedIdentifier versionIdentifier) { super( context, measure, new R4MeasureDefBuilder(), new R4MeasureReportBuilder(), libraryEngine, - versionIdentifier, - parameters); + versionIdentifier); } } diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureProcessor.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureProcessor.java index d24d46759..f149ac9cc 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureProcessor.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureProcessor.java @@ -164,19 +164,8 @@ protected MeasureReport evaluateMeasure( } // Library Evaluate var libraryEngine = new LibraryEngine(repository, this.measureEvaluationOptions.getEvaluationSettings()); - var params = makeParameters(measurementPeriod); - R4MeasureEvaluation measureEvaluator = new R4MeasureEvaluation(context, measure, libraryEngine, id, params); - return measureEvaluator.evaluate(evalType, subjectIds, measurementPeriod, libraryEngine, id, params); - } - - public Parameters makeParameters(Interval measurementPeriod) { - Parameters parameters = new Parameters(); - if (measurementPeriod != null) { - var helper = new R4DateHelper(); - parameters.setParameter( - MEASUREMENT_PERIOD_PARAMETER_NAME, helper.buildMeasurementPeriod(measurementPeriod)); - } - return parameters; + R4MeasureEvaluation measureEvaluator = new R4MeasureEvaluation(context, measure, libraryEngine, id); + return measureEvaluator.evaluate(evalType, subjectIds, measurementPeriod, libraryEngine, id); } protected Measure resolveByUrl(CanonicalType url) { diff --git a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/utils/R4DateHelper.java b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/utils/R4DateHelper.java index 2ebbce9d4..620d9405a 100644 --- a/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/utils/R4DateHelper.java +++ b/cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/measure/r4/utils/R4DateHelper.java @@ -6,6 +6,7 @@ import org.opencds.cqf.cql.engine.runtime.Date; import org.opencds.cqf.cql.engine.runtime.DateTime; import org.opencds.cqf.cql.engine.runtime.Interval; +import org.opencds.cqf.cql.engine.runtime.Precision; public class R4DateHelper { @@ -38,6 +39,8 @@ public Period buildMeasurementPeriod(Interval measurementPeriodInterval) { private DateTime convertToDateTime(ZonedDateTime zonedDateTime) { final OffsetDateTime offsetDateTime = zonedDateTime.toOffsetDateTime(); - return new DateTime(offsetDateTime); + final DateTime convertedDateTime = new DateTime(offsetDateTime); + convertedDateTime.setPrecision(Precision.SECOND); + return convertedDateTime; } } diff --git a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluationTest.java b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluationTest.java index 978972809..78e40a142 100644 --- a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluationTest.java +++ b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/dstu3/Dstu3MeasureEvaluationTest.java @@ -244,14 +244,14 @@ private MeasureReport runTest( var lib = engine.getEnvironment().getLibraryManager().resolveLibrary(id); engine.getState().init(lib.getLibrary()); var libraryEngine = new LibraryEngine(repository, this.evaluationOptions.getEvaluationSettings()); - Dstu3MeasureEvaluation evaluation = new Dstu3MeasureEvaluation(engine, measure, libraryEngine, id, null); + Dstu3MeasureEvaluation evaluation = new Dstu3MeasureEvaluation(engine, measure, libraryEngine, id); MeasureReport report = evaluation.evaluate( subjectIds.size() == 1 ? MeasureEvalType.PATIENT : MeasureEvalType.POPULATION, subjectIds, measurementPeriod, libraryEngine, - id, - null); + id + ); assertNotNull(report); // Simulate sending it across the wire diff --git a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluationTest.java b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluationTest.java index 15da5b03a..1489d9d86 100644 --- a/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluationTest.java +++ b/cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/measure/r4/R4MeasureEvaluationTest.java @@ -373,14 +373,14 @@ private MeasureReport runTest( var libraryEngine = new LibraryEngine(repository, evaluationOptions.getEvaluationSettings()); - R4MeasureEvaluation evaluation = new R4MeasureEvaluation(engine, measure, libraryEngine, id, null); + R4MeasureEvaluation evaluation = new R4MeasureEvaluation(engine, measure, libraryEngine, id); MeasureReport report = evaluation.evaluate( subjectIds.size() == 1 ? MeasureEvalType.SUBJECT : MeasureEvalType.POPULATION, subjectIds, measurementPeriod, libraryEngine, - id, - null); + id + ); assertNotNull(report); // Simulate sending it across the wire