Skip to content

Commit

Permalink
Add input parameter resolution to $populate operation (#449)
Browse files Browse the repository at this point in the history
* Add InputParameterResolver to PopulateRequest

* Remove unused methods

* Add null check for required libraryEngine param

* Fix tests

---------

Co-authored-by: JP <[email protected]>
  • Loading branch information
barhodes and JPercival committed Apr 15, 2024
1 parent 07c745e commit 691da2a
Show file tree
Hide file tree
Showing 17 changed files with 224 additions and 78 deletions.
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:https://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

0 comments on commit 691da2a

Please sign in to comment.