Skip to content
New issue

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

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

Already on GitHub? # to your account

Add input parameter resolution to $populate operation #449

Merged
merged 5 commits into from
Apr 15, 2024
Merged
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
@@ -1,5 +1,7 @@
package org.opencds.cqf.fhir.cr.activitydefinition.apply;

import static com.google.common.base.Preconditions.checkNotNull;

import ca.uhn.fhir.context.FhirVersionEnum;
import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseDatatype;
Expand Down Expand Up @@ -49,6 +51,7 @@ public ApplyRequest(
IBaseBundle bundle,
LibraryEngine libraryEngine,
ModelResolver modelResolver) {
checkNotNull(libraryEngine, "expected non-null value for libraryEngine");
this.activityDefinition = activityDefinition;
this.subjectId = subjectId;
this.encounterId = encounterId;
Expand All @@ -66,16 +69,14 @@ public ApplyRequest(
this.modelResolver = modelResolver;
fhirVersion = activityDefinition.getStructureFhirVersionEnum();
defaultLibraryUrl = resolveDefaultLibraryUrl();
inputParameterResolver = libraryEngine == null
? null
: IInputParameterResolver.createResolver(
libraryEngine.getRepository(),
this.subjectId,
this.encounterId,
this.practitionerId,
this.parameters,
this.useServerData,
this.bundle);
inputParameterResolver = IInputParameterResolver.createResolver(
libraryEngine.getRepository(),
this.subjectId,
this.encounterId,
this.practitionerId,
this.parameters,
this.useServerData,
this.bundle);
}

public IBaseResource getActivityDefinition() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.opencds.cqf.fhir.cr.inputparameters;

import static com.google.common.base.Preconditions.checkNotNull;

import java.util.List;
import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseParameters;
Expand All @@ -21,6 +23,7 @@ public static <T extends IInputParameterResolver> T createResolver(
IBaseParameters parameters,
Boolean useServerData,
IBaseBundle bundle) {
checkNotNull(repository, "expected non-null value for repository");
var fhirVersion = repository.fhirContext().getVersion().getVersion();
switch (fhirVersion) {
case DSTU3:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package org.opencds.cqf.fhir.cr.plandefinition.apply;

import static com.google.common.base.Preconditions.checkNotNull;
import static org.opencds.cqf.fhir.cr.inputparameters.IInputParameterResolver.createResolver;
import static org.opencds.cqf.fhir.utility.Constants.APPLY_PARAMETER_ACTIVITY_DEFINITION;
import static org.opencds.cqf.fhir.utility.Constants.APPLY_PARAMETER_DATA;
Expand Down Expand Up @@ -69,6 +70,7 @@ public ApplyRequest(
LibraryEngine libraryEngine,
ModelResolver modelResolver,
IInputParameterResolver inputParameterResolver) {
checkNotNull(libraryEngine, "expected non-null value for libraryEngine");
this.planDefinition = planDefinition;
this.subjectId = subjectId;
this.encounterId = encounterId;
Expand All @@ -87,16 +89,14 @@ public ApplyRequest(
fhirVersion = planDefinition.getStructureFhirVersionEnum();
this.inputParameterResolver = inputParameterResolver != null
? inputParameterResolver
: this.libraryEngine == null
? null
: createResolver(
libraryEngine.getRepository(),
this.subjectId,
this.encounterId,
this.practitionerId,
this.parameters,
this.useServerData,
this.bundle);
: createResolver(
libraryEngine.getRepository(),
this.subjectId,
this.encounterId,
this.practitionerId,
this.parameters,
this.useServerData,
this.bundle);
defaultLibraryUrl = resolveDefaultLibraryUrl();
requestResources = new ArrayList<>();
extractedResources = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,13 +189,15 @@ public PopulateRequest buildPopulateRequest(
String subjectId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine) {
return new PopulateRequest(
operationName,
questionnaire,
Ids.newId(fhirVersion, Ids.ensureIdType(subjectId, SUBJECT_TYPE)),
parameters,
bundle,
useServerData,
libraryEngine != null ? libraryEngine : new LibraryEngine(repository, evaluationSettings),
modelResolver);
}
Expand Down Expand Up @@ -231,26 +233,34 @@ public <C extends IPrimitiveType<String>, R extends IBaseResource> R prePopulate
Repository terminologyRepository) {
repository = proxy(repository, useServerData, dataRepository, contentRepository, terminologyRepository);
return prePopulate(
questionnaire, patientId, parameters, bundle, new LibraryEngine(repository, evaluationSettings));
questionnaire,
patientId,
parameters,
bundle,
useServerData,
new LibraryEngine(repository, evaluationSettings));
}

public <C extends IPrimitiveType<String>, R extends IBaseResource> R prePopulate(
Either3<C, IIdType, R> questionnaire,
String patientId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine) {
return prePopulate(resolveQuestionnaire(questionnaire), patientId, parameters, bundle, libraryEngine);
return prePopulate(
resolveQuestionnaire(questionnaire), patientId, parameters, bundle, useServerData, libraryEngine);
}

public <R extends IBaseResource> R prePopulate(
IBaseResource questionnaire,
String subjectId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine) {
return prePopulate(
buildPopulateRequest("prepopulate", questionnaire, subjectId, parameters, bundle, libraryEngine));
return prePopulate(buildPopulateRequest(
"prepopulate", questionnaire, subjectId, parameters, bundle, useServerData, libraryEngine));
}

@SuppressWarnings("unchecked")
Expand Down Expand Up @@ -289,25 +299,34 @@ public <C extends IPrimitiveType<String>, R extends IBaseResource> IBaseResource
Repository terminologyRepository) {
repository = proxy(repository, useServerData, dataRepository, contentRepository, terminologyRepository);
return populate(
questionnaire, patientId, parameters, bundle, new LibraryEngine(repository, this.evaluationSettings));
questionnaire,
patientId,
parameters,
bundle,
useServerData,
new LibraryEngine(repository, this.evaluationSettings));
}

public <C extends IPrimitiveType<String>, R extends IBaseResource> IBaseResource populate(
Either3<C, IIdType, R> questionnaire,
String patientId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine) {
return populate(resolveQuestionnaire(questionnaire), patientId, parameters, bundle, libraryEngine);
return populate(
resolveQuestionnaire(questionnaire), patientId, parameters, bundle, useServerData, libraryEngine);
}

public IBaseResource populate(
IBaseResource questionnaire,
String subjectId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine) {
return populate(buildPopulateRequest("populate", questionnaire, subjectId, parameters, bundle, libraryEngine));
return populate(buildPopulateRequest(
"populate", questionnaire, subjectId, parameters, bundle, useServerData, libraryEngine));
}

public IBaseResource populate(PopulateRequest request) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.opencds.cqf.fhir.cr.questionnaire.populate;

import static com.google.common.base.Preconditions.checkNotNull;

import ca.uhn.fhir.context.FhirVersionEnum;
import org.hl7.fhir.instance.model.api.IBaseBundle;
import org.hl7.fhir.instance.model.api.IBaseOperationOutcome;
Expand All @@ -9,8 +11,8 @@
import org.hl7.fhir.instance.model.api.IPrimitiveType;
import org.opencds.cqf.cql.engine.model.ModelResolver;
import org.opencds.cqf.fhir.cql.LibraryEngine;
import org.opencds.cqf.fhir.cql.engine.model.FhirModelResolverCache;
import org.opencds.cqf.fhir.cr.common.IQuestionnaireRequest;
import org.opencds.cqf.fhir.cr.inputparameters.IInputParameterResolver;
import org.opencds.cqf.fhir.utility.Constants;

public class PopulateRequest implements IQuestionnaireRequest {
Expand All @@ -23,38 +25,38 @@ public class PopulateRequest implements IQuestionnaireRequest {
private final ModelResolver modelResolver;
private final FhirVersionEnum fhirVersion;
private final String defaultLibraryUrl;
private final Boolean useServerData;
private final IInputParameterResolver inputParameterResolver;
private IBaseOperationOutcome operationOutcome;

// test constructor
public PopulateRequest(FhirVersionEnum fhirVersion, String operationName) {
this.operationName = operationName;
this.questionnaire = null;
this.subjectId = null;
this.parameters = null;
this.bundle = null;
this.libraryEngine = null;
this.modelResolver = FhirModelResolverCache.resolverForVersion(fhirVersion);
this.fhirVersion = fhirVersion;
this.defaultLibraryUrl = null;
}

public PopulateRequest(
String operationName,
IBaseResource questionnaire,
IIdType subjectId,
IBaseParameters parameters,
IBaseBundle bundle,
Boolean useServerData,
LibraryEngine libraryEngine,
ModelResolver modelResolver) {
checkNotNull(libraryEngine, "expected non-null value for libraryEngine");
this.operationName = operationName;
this.questionnaire = questionnaire;
this.subjectId = subjectId;
this.parameters = parameters;
this.bundle = bundle;
this.useServerData = useServerData;
this.libraryEngine = libraryEngine;
this.modelResolver = modelResolver;
this.fhirVersion = questionnaire.getStructureFhirVersionEnum();
this.defaultLibraryUrl = resolveDefaultLibraryUrl();
inputParameterResolver = IInputParameterResolver.createResolver(
libraryEngine.getRepository(),
this.subjectId,
null,
null,
this.parameters,
this.useServerData,
this.bundle);
}

@Override
Expand All @@ -79,7 +81,7 @@ public IBaseBundle getBundle() {

@Override
public IBaseParameters getParameters() {
return parameters;
return inputParameterResolver.getParameters();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
import org.hl7.fhir.instance.model.api.IBaseResource;
import org.hl7.fhir.instance.model.api.IIdType;
import org.opencds.cqf.fhir.api.Repository;
import org.opencds.cqf.fhir.cql.EvaluationSettings;
import org.opencds.cqf.fhir.cql.LibraryEngine;
import org.opencds.cqf.fhir.cr.activitydefinition.apply.ApplyRequest;
import org.opencds.cqf.fhir.cr.activitydefinition.apply.BaseRequestResourceResolver;
import org.opencds.cqf.fhir.cr.activitydefinition.apply.IRequestResolverFactory;
Expand Down Expand Up @@ -52,19 +54,21 @@ public When when() {
.getImplementingClass();
var activityDefinition =
repository.read(activityDefinitionClass, Ids.newId(activityDefinitionClass, activityDefinitionId));
return new When(activityDefinition, buildResolver(activityDefinition));
return new When(repository, activityDefinition, buildResolver(activityDefinition));
}
}

public static class When {
private final Repository repository;
private final IBaseResource activityDefinition;
private final BaseRequestResourceResolver resolver;
private IIdType subjectId;
private IIdType encounterId;
private IIdType practitionerId;
private IIdType organizationId;

When(IBaseResource activityDefinition, BaseRequestResourceResolver resolver) {
When(Repository repository, IBaseResource activityDefinition, BaseRequestResourceResolver resolver) {
this.repository = repository;
this.activityDefinition = activityDefinition;
this.resolver = resolver;
}
Expand Down Expand Up @@ -104,7 +108,7 @@ public IBaseResource resolve() {
null,
null,
null,
null,
new LibraryEngine(repository, EvaluationSettings.getDefault()),
null));
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ public class DynamicValueProcessorTests {

@Test
void testUnsupportedFhirVersion() {
var request = RequestHelpers.newPDApplyRequestForVersion(FhirVersionEnum.R4B);
var request =
RequestHelpers.newPDApplyRequestForVersion(FhirVersionEnum.R4B, libraryEngine, inputParameterResolver);
assertNull(fixture.getDynamicValueExpression(request, null));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,14 +23,6 @@ public class RequestHelpers {
public static final String PROFILE_ID = "profileId";
public static final String PROFILE_URL = "http://test.fhir.org/fhir/StructureDefinition/";

// public static ApplyRequest newPDApplyRequestForVersion(FhirVersionEnum fhirVersion) {
// return new ApplyRequest(fhirVersion);
// }

public static ApplyRequest newPDApplyRequestForVersion(FhirVersionEnum fhirVersion) {
return newPDApplyRequestForVersion(fhirVersion, null, null);
}

public static ApplyRequest newPDApplyRequestForVersion(
FhirVersionEnum fhirVersion, LibraryEngine libraryEngine, IInputParameterResolver inputParameterResolver) {
var fhirContext = FhirContext.forCached(fhirVersion);
Expand Down Expand Up @@ -144,10 +136,6 @@ public static GenerateRequest newGenerateRequestForVersion(
FhirModelResolverCache.resolverForVersion(fhirVersion));
}

public static PopulateRequest newPopulateRequestForVersion(FhirVersionEnum fhirVersion, String operationName) {
return new PopulateRequest(fhirVersion, operationName);
}

public static PopulateRequest newPopulateRequestForVersion(
FhirVersionEnum fhirVersion, LibraryEngine libraryEngine, IBaseResource questionnaire) {
return newPopulateRequestForVersion(fhirVersion, libraryEngine, questionnaire, "populate");
Expand All @@ -164,6 +152,7 @@ public static PopulateRequest newPopulateRequestForVersion(
Ids.newId(fhirVersion, Ids.ensureIdType(PATIENT_ID, "Patient")),
null,
null,
true,
libraryEngine,
FhirModelResolverCache.resolverForVersion(fhirVersion));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ public class ApplyRequestTests {

@Test
void testInvalidVersionReturnsNull() {
var request = RequestHelpers.newPDApplyRequestForVersion(FhirVersionEnum.R4B);
var request =
RequestHelpers.newPDApplyRequestForVersion(FhirVersionEnum.R4B, libraryEngine, inputParameterResolver);
var activityDef = new org.hl7.fhir.r4.model.ActivityDefinition();
assertNull(request.transformRequestParameters(activityDef));
}
Expand Down
Loading