Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove validation for individual reports. Add utility method for eva… #594

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
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 @@ -7,8 +7,11 @@
import org.opencds.cqf.cql.engine.runtime.Interval;
import org.opencds.cqf.fhir.cql.LibraryEngine;
import org.opencds.cqf.fhir.cr.measure.constant.MeasureConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public abstract class BaseMeasureEvaluation<MeasureT, MeasureReportT, SubjectT> {
private static final Logger log = LoggerFactory.getLogger(BaseMeasureEvaluation.class);

protected MeasureDefBuilder<MeasureT> measureDefBuilder;
protected MeasureReportBuilder<MeasureT, MeasureReportT, SubjectT> measureReportBuilder;
Expand Down Expand Up @@ -83,6 +86,8 @@ public MeasureReportT evaluate(
} else {
measurementPeriodInterval = measurementPeriod;
}
final MeasureReportType measureReportType = this.evalTypeToReportType(measureEvalType);
log.info("592: measureEvalType: {}, measureReportType: {}", measureEvalType, measureReportType);
return this.measureReportBuilder.build(
measure, measureDef, this.evalTypeToReportType(measureEvalType), measurementPeriodInterval, subjectIds);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.opencds.cqf.fhir.cr.measure.common.MeasureReportType;
import org.opencds.cqf.fhir.cr.measure.common.SubjectProvider;
import org.opencds.cqf.fhir.cr.measure.helper.DateHelper;
import org.opencds.cqf.fhir.cr.measure.r4.R4MeasureProcessor;
import org.opencds.cqf.fhir.utility.repository.FederatedRepository;
import org.opencds.cqf.fhir.utility.repository.InMemoryFhirRepository;

Expand Down Expand Up @@ -125,11 +126,13 @@ protected MeasureReport evaluateMeasure(
this.repository, new InMemoryFhirRepository(this.repository.fhirContext(), additionalData));
}

var evalType = MeasureEvalType.fromCode(reportType)
.orElse(
subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null
? MeasureEvalType.POPULATION
: MeasureEvalType.SUBJECT);
// LUKETODO:
// var evalType = MeasureEvalType.fromCode(reportType)
// .orElse(
// subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null
// ? MeasureEvalType.POPULATION
// : MeasureEvalType.SUBJECT);
var evalType = R4MeasureProcessor.someSortOfMeasureTypeCodeConversion(null, reportType, subjectIds);

var subjects =
subjectProvider.getSubjects(actualRepo, evalType, subjectIds).collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.cqframework.cql.cql2elm.CqlIncludeException;
Expand All @@ -29,15 +30,20 @@
import org.opencds.cqf.fhir.cql.VersionedIdentifiers;
import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions;
import org.opencds.cqf.fhir.cr.measure.common.MeasureEvalType;
import org.opencds.cqf.fhir.cr.measure.common.MeasureReportType;
import org.opencds.cqf.fhir.cr.measure.common.SubjectProvider;
import org.opencds.cqf.fhir.cr.measure.r4.utils.R4DateHelper;
import org.opencds.cqf.fhir.utility.Canonicals;
import org.opencds.cqf.fhir.utility.monad.Either3;
import org.opencds.cqf.fhir.utility.repository.FederatedRepository;
import org.opencds.cqf.fhir.utility.repository.InMemoryFhirRepository;
import org.opencds.cqf.fhir.utility.search.Searches;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class R4MeasureProcessor {

private static final Logger log = LoggerFactory.getLogger(R4MeasureProcessor.class);
private final Repository repository;
private final MeasureEvaluationOptions measureEvaluationOptions;
private final SubjectProvider subjectProvider;
Expand All @@ -59,11 +65,17 @@ public MeasureReport evaluateMeasure(
IBaseBundle additionalData,
Parameters parameters) {

var evalType = MeasureEvalType.fromCode(reportType)
.orElse(
subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null
? MeasureEvalType.POPULATION
: MeasureEvalType.SUBJECT);
var evalType = MeasureEvalType.fromCode(
// validate in R4 accepted values
MeasureEvalType.fromCode(reportType)
.orElse(
// map null reportType parameter to evalType if no subject parameter is provided
subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null
? MeasureEvalType.POPULATION
: MeasureEvalType.SUBJECT)
.toCode())
.orElse(MeasureEvalType.SUBJECT);
// var evalType = R4MeasureProcessor.someSortOfMeasureTypeCodeConversion(null, reportType, subjectIds);

var actualRepo = this.repository;
if (additionalData != null) {
Expand Down Expand Up @@ -160,6 +172,8 @@ protected MeasureReport evaluateMeasure(
? MeasureEvalType.POPULATION
: MeasureEvalType.SUBJECT);
}
// evalType = someSortOfMeasureTypeCodeConversion(evalType, reportType, subjectIds);
log.info("592: NEW evalType: {}, reportType: {}, subjectIds: {}", evalType, reportType, subjectIds);
// Library Evaluate
var libraryEngine = new LibraryEngine(repository, this.measureEvaluationOptions.getEvaluationSettings());
R4MeasureEvaluation measureEvaluator = new R4MeasureEvaluation(context, measure, libraryEngine, id);
Expand Down Expand Up @@ -206,4 +220,58 @@ private Map<String, Object> resolveParameterMap(Parameters parameters) {
});
return parameterMap;
}
}

// LUKETODO: this is one part of the logic for converting null to INDIVIDUAL
/*

| Number | ReportType | subject | EvalType | MeasureReportType | Note |
| | param | param | used | returned | |
| ------ | ------------ | ----------------- | ------------ | ----------------- | ---------------------------------------------------- |
| 1 | empty | empty | population | summary | default behavior, when NO subject parameter provided |
| 2 | empty | Patient/{id} | subject | individual | default behavior, when subject parameter provided |
| 2 | empty | Practitioner/{id} | subject | individual | default behavior, when subject parameter provided |
| 2 | empty | Organization/{id} | subject | individual | default behavior, when subject parameter provided |
| 3 | empty | Group/{id} | subject | individual | default behavior, when subject parameter provided |
| 4 | subject | empty | subject | individual | | >>> currently this is an error?
| 5 | subject | Patient/{id} | subject | individual | |
| 5 | subject | Practitioner/{id} | subject | individual | |
| 5 | subject | Organization/{id} | subject | individual | |
| 6 | subject | Group/{id} | subject | individual | |
| 7 | population | empty | population | summary | |
| 8 | population | Patient/{id} | population | summary | |
| 8 | population | Practitioner/{id} | population | summary | |
| 8 | population | Organization/{id} | population | summary | |
| 9 | population | Group/{id} | population | summary | |
| 10 | subject-list | empty | subject-list | subject-list | |
| 11 | subject-list | Patient/{id} | subject-list | subject-list | |
| 11 | subject-list | Practitioner/{id} | subject-list | subject-list | |
| 11 | subject-list | Organization/{id} | subject-list | subject-list | |
| 12 | subject-list | Group/{id} | subject-list | subject-list | |
*/
public static MeasureEvalType someSortOfMeasureTypeCodeConversion(MeasureEvalType evalType, String reportType, List<String> subjectIds) {
log.info("592: OLD evalType: {}, reportType: {}, subjectIds: {}", evalType, reportType, subjectIds);

return Optional.ofNullable(evalType)
.orElse(MeasureEvalType.fromCode(reportType)
.orElse(
subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null
? MeasureEvalType.POPULATION
: MeasureEvalType.SUBJECT));

// LUKETODO: will this work?
// LUKETODO: does this conflict with the changes we made in cdr?
// return Optional.ofNullable(evalType)
// .orElse(MeasureEvalType.fromCode(reportType)
// .orElseGet(() -> {
// if (isSubjectListEffectivelyEmpty(subjectIds)) {
// return MeasureEvalType.POPULATION;
// }
//
// return MeasureEvalType.SUBJECT;
// }));
}

public static boolean isSubjectListEffectivelyEmpty(List<String> subjectIds) {
return subjectIds == null || subjectIds.isEmpty() || subjectIds.get(0) == null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -668,11 +668,15 @@ protected void buildSDE(BuilderContext bc, SdeDef sde) {
return;
}


// LUKETODO: investigate why this is NOT happening on master
// LUKETODO: what's this about?
// This is an individual report... shouldn't have more than one subject!
if (report.getType() == MeasureReport.MeasureReportType.INDIVIDUAL
&& sde.getResults().keySet().size() > 1) {
throw new IllegalArgumentException();
}
// LUKETODO: see if this works
// if (report.getType() == MeasureReport.MeasureReportType.INDIVIDUAL
// && sde.getResults().keySet().size() > 1) {
// throw new IllegalArgumentException();
// }

// Add all evaluated resources
for (var e : sde.getResults().entrySet()) {
Expand Down