Skip to content

Commit ea22ea5

Browse files
committed
Expose overloaded FHIR Operator API for evaluateMeasure
1 parent 8301d62 commit ea22ea5

File tree

2 files changed

+84
-2
lines changed

2 files changed

+84
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package com.google.android.fhir.workflow;
2+
3+
import org.hl7.fhir.instance.model.api.IBaseBundle;
4+
import org.hl7.fhir.r4.model.Measure;
5+
import org.hl7.fhir.r4.model.MeasureReport;
6+
import org.hl7.fhir.r4.model.Parameters;
7+
import org.jetbrains.annotations.NotNull;
8+
import org.jetbrains.annotations.Nullable;
9+
import org.opencds.cqf.fhir.api.Repository;
10+
import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions;
11+
import org.opencds.cqf.fhir.cr.measure.common.MeasureEvalType;
12+
import org.opencds.cqf.fhir.cr.measure.common.SubjectProvider;
13+
import org.opencds.cqf.fhir.cr.measure.r4.R4MeasureProcessor;
14+
15+
import java.util.List;
16+
17+
public class FhirEngineR4MeasureProcessor extends R4MeasureProcessor {
18+
public FhirEngineR4MeasureProcessor(Repository repository, MeasureEvaluationOptions measureEvaluationOptions) {
19+
super(repository, measureEvaluationOptions);
20+
}
21+
22+
public FhirEngineR4MeasureProcessor(Repository repository, MeasureEvaluationOptions measureEvaluationOptions, SubjectProvider subjectProvider) {
23+
super(repository, measureEvaluationOptions, subjectProvider);
24+
}
25+
26+
public MeasureReport evaluateMeasure(Measure measure, String periodStart, String periodEnd, String reportType, List<String> subjectIds, IBaseBundle additionalData, Parameters parameters, MeasureEvalType evalType) {
27+
return super.evaluateMeasure(measure, periodStart, periodEnd, reportType, subjectIds, additionalData, parameters, evalType);
28+
}
29+
}

workflow/src/main/java/com/google/android/fhir/workflow/FhirOperator.kt

+55-2
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@ import org.hl7.fhir.instance.model.api.IBaseParameters
3131
import org.hl7.fhir.instance.model.api.IBaseResource
3232
import org.hl7.fhir.r4.model.CanonicalType
3333
import org.hl7.fhir.r4.model.IdType
34+
import org.hl7.fhir.r4.model.Measure
3435
import org.hl7.fhir.r4.model.MeasureReport
3536
import org.hl7.fhir.r4.model.Parameters
3637
import org.hl7.fhir.r4.model.PlanDefinition
3738
import org.hl7.fhir.r4.model.Reference
3839
import org.opencds.cqf.fhir.cql.EvaluationSettings
3940
import org.opencds.cqf.fhir.cql.LibraryEngine
4041
import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions
42+
import org.opencds.cqf.fhir.cr.measure.common.MeasureEvalType
4143
import org.opencds.cqf.fhir.cr.measure.common.MeasureReportType
42-
import org.opencds.cqf.fhir.cr.measure.r4.R4MeasureProcessor
4344
import org.opencds.cqf.fhir.cr.plandefinition.PlanDefinitionProcessor
4445
import org.opencds.cqf.fhir.utility.monad.Eithers
4546
import org.opencds.cqf.fhir.utility.repository.ProxyRepository
@@ -72,8 +73,8 @@ internal constructor(
7273
MeasureEvaluationOptions().apply { evaluationSettings = this@FhirOperator.evaluationSettings }
7374

7475
private val libraryProcessor = LibraryEngine(repository, evaluationSettings)
76+
private val measureProcessor = FhirEngineR4MeasureProcessor(repository, measureEvaluationOptions)
7577
private val planDefinitionProcessor = PlanDefinitionProcessor(repository, evaluationSettings)
76-
private val measureProcessor = R4MeasureProcessor(repository, measureEvaluationOptions)
7778

7879
/**
7980
* The function evaluates a FHIR library against the database.
@@ -154,6 +155,58 @@ internal constructor(
154155
return report
155156
}
156157

158+
@WorkerThread
159+
fun evaluateMeasure(
160+
measure: Measure,
161+
start: String,
162+
end: String,
163+
reportType: String,
164+
subjectId: String? = null,
165+
practitioner: String? = null,
166+
additionalData: IBaseBundle? = null,
167+
parameters: Parameters? = null,
168+
): MeasureReport {
169+
val subject =
170+
if (!practitioner.isNullOrBlank()) {
171+
checkAndAddType(practitioner, "Practitioner")
172+
} else if (!subjectId.isNullOrBlank()) {
173+
checkAndAddType(subjectId, "Patient")
174+
} else {
175+
// List of null is required to run population-level measures
176+
null
177+
}
178+
179+
val subjectIds = listOf(subject)
180+
181+
val evalType =
182+
MeasureEvalType.fromCode(reportType)
183+
.orElse(
184+
if (subjectIds.isNotEmpty() && subjectIds[0] != null) {
185+
MeasureEvalType.SUBJECT
186+
} else {
187+
MeasureEvalType.POPULATION
188+
},
189+
) as MeasureEvalType
190+
191+
val report =
192+
measureProcessor.evaluateMeasure(
193+
/* measure = */ measure,
194+
/* periodStart = */ start,
195+
/* periodEnd = */ end,
196+
/* reportType = */ reportType,
197+
/* subjectIds = */ subjectIds,
198+
/* additionalData = */ additionalData,
199+
/* parameters = */ parameters,
200+
/* evalType = */ evalType,
201+
)
202+
203+
// add subject reference for non-individual reportTypes
204+
if (report.type.name == MeasureReportType.SUMMARY.name && !subject.isNullOrBlank()) {
205+
report.setSubject(Reference(subject))
206+
}
207+
return report
208+
}
209+
157210
/**
158211
* Generates a [CarePlan] based on the provided inputs.
159212
*

0 commit comments

Comments
 (0)