Search in sources :

Example 1 with RetrieveProvider

use of org.opencds.cqf.cql.engine.retrieve.RetrieveProvider in project cqf-ruler by DBCG.

the class CqlExecutionProvider method setupEngine.

private CqlEngine setupEngine(String subject, Parameters parameters, Endpoint dataEndpoint, Endpoint terminologyEndpoint, Bundle data, boolean useServerData, LibraryLoader libraryLoader, VersionedIdentifier libraryIdentifier, RequestDetails theRequestDetails) {
    TerminologyProvider terminologyProvider;
    if (terminologyEndpoint != null) {
        IGenericClient client = Clients.forEndpoint(getFhirContext(), terminologyEndpoint);
        terminologyProvider = new Dstu3FhirTerminologyProvider(client);
    } else {
        terminologyProvider = jpaTerminologyProviderFactory.create(theRequestDetails);
    }
    DataProvider dataProvider;
    List<RetrieveProvider> retrieveProviderList = new ArrayList<>();
    if (useServerData) {
        JpaFhirRetrieveProvider jpaRetriever = new JpaFhirRetrieveProvider(getDaoRegistry(), new SearchParameterResolver(getFhirContext()));
        jpaRetriever.setTerminologyProvider(terminologyProvider);
        // Assume it's a different server, therefore need to expand.
        if (terminologyEndpoint != null) {
            jpaRetriever.setExpandValueSets(true);
        }
        retrieveProviderList.add(jpaRetriever);
    }
    if (dataEndpoint != null) {
        IGenericClient client = Clients.forEndpoint(dataEndpoint);
        RestFhirRetrieveProvider restRetriever = new RestFhirRetrieveProvider(new SearchParameterResolver(getFhirContext()), client);
        restRetriever.setTerminologyProvider(terminologyProvider);
        if (terminologyEndpoint == null || (terminologyEndpoint != null && !terminologyEndpoint.getAddress().equals(dataEndpoint.getAddress()))) {
            restRetriever.setExpandValueSets(true);
        }
        retrieveProviderList.add(restRetriever);
    }
    if (data != null) {
        BundleRetrieveProvider bundleRetriever = new BundleRetrieveProvider(getFhirContext(), data);
        bundleRetriever.setTerminologyProvider(terminologyProvider);
        retrieveProviderList.add(bundleRetriever);
    }
    PriorityRetrieveProvider priorityProvider = new PriorityRetrieveProvider(retrieveProviderList);
    dataProvider = new CompositeDataProvider(myModelResolver, priorityProvider);
    return new CqlEngine(libraryLoader, Collections.singletonMap("http://hl7.org/fhir", dataProvider), terminologyProvider);
}
Also used : JpaFhirRetrieveProvider(org.opencds.cqf.ruler.cql.JpaFhirRetrieveProvider) IGenericClient(ca.uhn.fhir.rest.client.api.IGenericClient) ArrayList(java.util.ArrayList) CqlEngine(org.opencds.cqf.cql.engine.execution.CqlEngine) CompositeDataProvider(org.opencds.cqf.cql.engine.data.CompositeDataProvider) DataProvider(org.opencds.cqf.cql.engine.data.DataProvider) SearchParameterResolver(org.opencds.cqf.cql.engine.fhir.searchparam.SearchParameterResolver) BundleRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.BundleRetrieveProvider) TerminologyProvider(org.opencds.cqf.cql.engine.terminology.TerminologyProvider) Dstu3FhirTerminologyProvider(org.opencds.cqf.cql.engine.fhir.terminology.Dstu3FhirTerminologyProvider) RestFhirRetrieveProvider(org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider) Dstu3FhirTerminologyProvider(org.opencds.cqf.cql.engine.fhir.terminology.Dstu3FhirTerminologyProvider) PriorityRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.PriorityRetrieveProvider) CompositeDataProvider(org.opencds.cqf.cql.engine.data.CompositeDataProvider) RestFhirRetrieveProvider(org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider) JpaFhirRetrieveProvider(org.opencds.cqf.ruler.cql.JpaFhirRetrieveProvider) RetrieveProvider(org.opencds.cqf.cql.engine.retrieve.RetrieveProvider) BundleRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.BundleRetrieveProvider) PriorityRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.PriorityRetrieveProvider)

Example 2 with RetrieveProvider

use of org.opencds.cqf.cql.engine.retrieve.RetrieveProvider in project cqf-ruler by DBCG.

the class LibraryEvaluationProvider method evaluate.

@SuppressWarnings({ "unchecked" })
@Operation(name = "$evaluate", idempotent = true, type = Library.class)
public Bundle evaluate(@IdParam IdType theId, @OperationParam(name = "patientId") String patientId, @OperationParam(name = "periodStart") String periodStart, @OperationParam(name = "periodEnd") String periodEnd, @OperationParam(name = "productLine") String productLine, @OperationParam(name = "terminologyEndpoint") Endpoint terminologyEndpoint, @OperationParam(name = "dataEndpoint") Endpoint dataEndpoint, @OperationParam(name = "context") String contextParam, @OperationParam(name = "executionResults") String executionResults, @OperationParam(name = "parameters") Parameters parameters, @OperationParam(name = "additionalData") Bundle additionalData, RequestDetails theRequestDetails) {
    log.info("Library evaluation started..");
    if (patientId == null && contextParam != null && contextParam.equals("Patient")) {
        log.error("Patient id null");
        throw new IllegalArgumentException("Must specify a patientId when executing in Patient context.");
    }
    Bundle libraryBundle = new Bundle();
    Library theResource = null;
    if (additionalData != null) {
        for (Bundle.BundleEntryComponent entry : additionalData.getEntry()) {
            if (entry.getResource().fhirType().equals("Library")) {
                libraryBundle.addEntry(entry);
                if (entry.getResource().getIdElement().equals(theId)) {
                    theResource = (Library) entry.getResource();
                }
            }
        }
    }
    if (theResource == null) {
        theResource = read(theId, theRequestDetails);
    }
    VersionedIdentifier libraryIdentifier = new VersionedIdentifier().withId(theResource.getName()).withVersion(theResource.getVersion());
    TerminologyProvider terminologyProvider;
    if (terminologyEndpoint != null) {
        IGenericClient client = Clients.forEndpoint(getFhirContext(), terminologyEndpoint);
        terminologyProvider = new R4FhirTerminologyProvider(client);
    } else {
        terminologyProvider = myJpaTerminologyProviderFactory.create(new SystemRequestDetails());
    }
    DataProvider dataProvider;
    if (dataEndpoint != null) {
        List<RetrieveProvider> retrieveProviderList = new ArrayList<>();
        IGenericClient client = Clients.forEndpoint(dataEndpoint);
        RestFhirRetrieveProvider retriever = new RestFhirRetrieveProvider(new SearchParameterResolver(getFhirContext()), client);
        retriever.setTerminologyProvider(terminologyProvider);
        if (terminologyEndpoint == null || (terminologyEndpoint != null && !terminologyEndpoint.getAddress().equals(dataEndpoint.getAddress()))) {
            retriever.setExpandValueSets(true);
        }
        retrieveProviderList.add(retriever);
        if (additionalData != null) {
            BundleRetrieveProvider bundleProvider = new BundleRetrieveProvider(getFhirContext(), additionalData);
            bundleProvider.setTerminologyProvider(terminologyProvider);
            retrieveProviderList.add(bundleProvider);
            PriorityRetrieveProvider priorityProvider = new PriorityRetrieveProvider(retrieveProviderList);
            dataProvider = new CompositeDataProvider(myModelResolver, priorityProvider);
        } else {
            dataProvider = new CompositeDataProvider(myModelResolver, retriever);
        }
    } else {
        List<RetrieveProvider> retrieveProviderList = new ArrayList<>();
        JpaFhirRetrieveProvider retriever = new JpaFhirRetrieveProvider(getDaoRegistry(), new SearchParameterResolver(getFhirContext()));
        retriever.setTerminologyProvider(terminologyProvider);
        // Assume it's a different server, therefore need to expand.
        if (terminologyEndpoint != null) {
            retriever.setExpandValueSets(true);
        }
        retrieveProviderList.add(retriever);
        if (additionalData != null) {
            BundleRetrieveProvider bundleProvider = new BundleRetrieveProvider(getFhirContext(), additionalData);
            bundleProvider.setTerminologyProvider(terminologyProvider);
            retrieveProviderList.add(bundleProvider);
            PriorityRetrieveProvider priorityProvider = new PriorityRetrieveProvider(retrieveProviderList);
            dataProvider = new CompositeDataProvider(myModelResolver, priorityProvider);
        } else {
            dataProvider = new CompositeDataProvider(myModelResolver, retriever);
        }
    }
    LibraryContentProvider bundleLibraryProvider = new BundleFhirLibraryContentProvider(this.getFhirContext(), libraryBundle, adapterFactory, libraryVersionSelector);
    LibraryContentProvider jpaLibraryContentProvider = this.myJpaLibraryContentProviderFactory.create(theRequestDetails);
    List<LibraryContentProvider> sourceProviders = new ArrayList<LibraryContentProvider>(Arrays.asList(bundleLibraryProvider, jpaLibraryContentProvider));
    LibraryLoader libraryLoader = this.myLibraryLoaderFactory.create(sourceProviders);
    CqlEngine engine = new CqlEngine(libraryLoader, Collections.singletonMap("http://hl7.org/fhir", dataProvider), terminologyProvider);
    Map<String, Object> resolvedParameters = new HashMap<>();
    if (parameters != null) {
        for (Parameters.ParametersParameterComponent pc : parameters.getParameter()) {
            resolvedParameters.put(pc.getName(), pc.getValue());
        }
    }
    if (periodStart != null && periodEnd != null) {
        // resolve the measurement period
        Interval measurementPeriod = new Interval(Operations.resolveRequestDate(periodStart, true), true, Operations.resolveRequestDate(periodEnd, false), true);
        resolvedParameters.put("Measurement Period", new Interval(DateTime.fromJavaDate((Date) measurementPeriod.getStart()), true, DateTime.fromJavaDate((Date) measurementPeriod.getEnd()), true));
    }
    if (productLine != null) {
        resolvedParameters.put("Product Line", productLine);
    }
    EvaluationResult evalResult = engine.evaluate(libraryIdentifier, null, Pair.of(contextParam != null ? contextParam : "Unspecified", patientId == null ? "null" : patientId), resolvedParameters, this.getDebugMap());
    List<Resource> results = new ArrayList<>();
    FhirMeasureBundler bundler = new FhirMeasureBundler();
    if (evalResult != null && evalResult.expressionResults != null) {
        for (Map.Entry<String, Object> def : evalResult.expressionResults.entrySet()) {
            Parameters result = new Parameters();
            try {
                result.setId(def.getKey());
                Object res = def.getValue();
                if (res == null) {
                    result.addParameter().setName("value").setValue(new StringType("null"));
                } else if (res instanceof List<?>) {
                    if (((List<?>) res).size() > 0 && ((List<?>) res).get(0) instanceof Resource) {
                        if (executionResults != null && executionResults.equals("Summary")) {
                            result.addParameter().setName("value").setValue(new StringType(((Resource) ((List<?>) res).get(0)).getIdElement().getResourceType() + "/" + ((Resource) ((List<?>) res).get(0)).getIdElement().getIdPart()));
                        } else {
                            result.addParameter().setName("value").setResource(bundler.bundle((Iterable<Resource>) res, theRequestDetails.getFhirServerBase()));
                        }
                    } else {
                        result.addParameter().setName("value").setValue(new StringType(res.toString()));
                    }
                } else if (res instanceof Iterable) {
                    result.addParameter().setName("value").setResource(bundler.bundle((Iterable<Resource>) res, theRequestDetails.getFhirServerBase()));
                } else if (res instanceof Resource) {
                    if (executionResults != null && executionResults.equals("Summary")) {
                        result.addParameter().setName("value").setValue(new StringType(((Resource) res).getIdElement().getResourceType() + "/" + ((Resource) res).getIdElement().getIdPart()));
                    } else {
                        result.addParameter().setName("value").setResource((Resource) res);
                    }
                } else if (res instanceof Type) {
                    result.addParameter().setName("value").setValue((Type) res);
                } else {
                    result.addParameter().setName("value").setValue(new StringType(res.toString()));
                }
                result.addParameter().setName("resultType").setValue(new StringType(resolveType(res)));
            } catch (RuntimeException re) {
                re.printStackTrace();
                String message = re.getMessage() != null ? re.getMessage() : re.getClass().getName();
                result.addParameter().setName("error").setValue(new StringType(message));
            }
            results.add(result);
        }
    }
    return bundler.bundle(results, theRequestDetails.getFhirServerBase());
}
Also used : HashMap(java.util.HashMap) StringType(org.hl7.fhir.r4.model.StringType) IGenericClient(ca.uhn.fhir.rest.client.api.IGenericClient) ArrayList(java.util.ArrayList) LibraryLoader(org.opencds.cqf.cql.engine.execution.LibraryLoader) CompositeDataProvider(org.opencds.cqf.cql.engine.data.CompositeDataProvider) DataProvider(org.opencds.cqf.cql.engine.data.DataProvider) VersionedIdentifier(org.cqframework.cql.elm.execution.VersionedIdentifier) BundleRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.BundleRetrieveProvider) RestFhirRetrieveProvider(org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider) SystemRequestDetails(ca.uhn.fhir.jpa.partition.SystemRequestDetails) PriorityRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.PriorityRetrieveProvider) List(java.util.List) ArrayList(java.util.ArrayList) R4FhirTerminologyProvider(org.opencds.cqf.cql.engine.fhir.terminology.R4FhirTerminologyProvider) FhirMeasureBundler(org.opencds.cqf.ruler.cpg.r4.util.FhirMeasureBundler) JpaFhirRetrieveProvider(org.opencds.cqf.ruler.cql.JpaFhirRetrieveProvider) LibraryContentProvider(org.opencds.cqf.cql.evaluator.cql2elm.content.LibraryContentProvider) BundleFhirLibraryContentProvider(org.opencds.cqf.cql.evaluator.cql2elm.content.fhir.BundleFhirLibraryContentProvider) Parameters(org.hl7.fhir.r4.model.Parameters) BundleFhirLibraryContentProvider(org.opencds.cqf.cql.evaluator.cql2elm.content.fhir.BundleFhirLibraryContentProvider) Bundle(org.hl7.fhir.r4.model.Bundle) Resource(org.hl7.fhir.r4.model.Resource) CqlEngine(org.opencds.cqf.cql.engine.execution.CqlEngine) EvaluationResult(org.opencds.cqf.cql.engine.execution.EvaluationResult) StringType(org.hl7.fhir.r4.model.StringType) Type(org.hl7.fhir.r4.model.Type) IdType(org.hl7.fhir.r4.model.IdType) SearchParameterResolver(org.opencds.cqf.cql.engine.fhir.searchparam.SearchParameterResolver) TerminologyProvider(org.opencds.cqf.cql.engine.terminology.TerminologyProvider) R4FhirTerminologyProvider(org.opencds.cqf.cql.engine.fhir.terminology.R4FhirTerminologyProvider) CompositeDataProvider(org.opencds.cqf.cql.engine.data.CompositeDataProvider) Library(org.hl7.fhir.r4.model.Library) RestFhirRetrieveProvider(org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider) JpaFhirRetrieveProvider(org.opencds.cqf.ruler.cql.JpaFhirRetrieveProvider) RetrieveProvider(org.opencds.cqf.cql.engine.retrieve.RetrieveProvider) BundleRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.BundleRetrieveProvider) PriorityRetrieveProvider(org.opencds.cqf.cql.evaluator.engine.retrieve.PriorityRetrieveProvider) Map(java.util.Map) DebugMap(org.opencds.cqf.cql.engine.debug.DebugMap) HashMap(java.util.HashMap) Interval(org.opencds.cqf.cql.engine.runtime.Interval) Operation(ca.uhn.fhir.rest.annotation.Operation)

Example 3 with RetrieveProvider

use of org.opencds.cqf.cql.engine.retrieve.RetrieveProvider in project quality-measure-and-cohort-service by Alvearie.

the class CachingRetrieveProviderTest method retrieve_passthrough_nonNullDatePath.

@Test
public void retrieve_passthrough_nonNullDatePath() {
    Iterable<Object> expected = new ArrayList<>();
    RetrieveProvider mockProvider = Mockito.mock(RetrieveProvider.class);
    Mockito.when(mockProvider.retrieve(CONTEXT, CONTEXT_PATH, CONTEXT_VALUE, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET, DATE_PATH, null, null, null)).thenReturn(expected);
    RetrieveCacheContext mockCacheContext = createMockCacheContext(Mockito.mock(Cache.class));
    CachingRetrieveProvider provider = new CachingRetrieveProvider(mockProvider, mockCacheContext);
    Iterable<Object> actual = provider.retrieve(CONTEXT, CONTEXT_PATH, CONTEXT_VALUE, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET, DATE_PATH, null, null, null);
    Assert.assertSame(expected, actual);
}
Also used : ArrayList(java.util.ArrayList) RetrieveProvider(org.opencds.cqf.cql.engine.retrieve.RetrieveProvider) Cache(javax.cache.Cache) Test(org.junit.Test)

Example 4 with RetrieveProvider

use of org.opencds.cqf.cql.engine.retrieve.RetrieveProvider in project quality-measure-and-cohort-service by Alvearie.

the class CachingRetrieveProviderTest method retrieve_cacheHit.

@Test
public void retrieve_cacheHit() {
    Iterable<Object> expected = new ArrayList<>();
    RetrieveProvider mockProvider = Mockito.mock(RetrieveProvider.class);
    RetrieveCacheKey retrieveCacheKey = RetrieveCacheKey.create(CONTEXT, CONTEXT_PATH, CONTEXT_VALUE, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET);
    Cache<RetrieveCacheKey, Iterable<Object>> mockCache = createMockCache(retrieveCacheKey, expected);
    RetrieveCacheContext mockCacheContext = createMockCacheContext(mockCache);
    CachingRetrieveProvider provider = new CachingRetrieveProvider(mockProvider, mockCacheContext);
    Iterable<Object> actual = provider.retrieve(CONTEXT, CONTEXT_PATH, CONTEXT_VALUE, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET, null, null, null, null);
    Assert.assertSame(expected, actual);
}
Also used : ArrayList(java.util.ArrayList) RetrieveProvider(org.opencds.cqf.cql.engine.retrieve.RetrieveProvider) Test(org.junit.Test)

Example 5 with RetrieveProvider

use of org.opencds.cqf.cql.engine.retrieve.RetrieveProvider in project quality-measure-and-cohort-service by Alvearie.

the class CachingRetrieveProviderTest method retrieve_passthrough_nonStringContextValue.

@Test
public void retrieve_passthrough_nonStringContextValue() {
    Iterable<Object> expected = new ArrayList<>();
    Object contextValue = new Object();
    RetrieveProvider mockProvider = Mockito.mock(RetrieveProvider.class);
    Mockito.when(mockProvider.retrieve(CONTEXT, CONTEXT_PATH, contextValue, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET, null, null, null, null)).thenReturn(expected);
    RetrieveCacheContext mockCacheContext = createMockCacheContext(Mockito.mock(Cache.class));
    CachingRetrieveProvider provider = new CachingRetrieveProvider(mockProvider, mockCacheContext);
    Iterable<Object> actual = provider.retrieve(CONTEXT, CONTEXT_PATH, contextValue, DATA_TYPE, TEMPLATE_ID, CODE_PATH, CODES, VALUE_SET, null, null, null, null);
    Assert.assertSame(expected, actual);
}
Also used : ArrayList(java.util.ArrayList) RetrieveProvider(org.opencds.cqf.cql.engine.retrieve.RetrieveProvider) Cache(javax.cache.Cache) Test(org.junit.Test)

Aggregations

RetrieveProvider (org.opencds.cqf.cql.engine.retrieve.RetrieveProvider)12 ArrayList (java.util.ArrayList)11 Test (org.junit.Test)8 Cache (javax.cache.Cache)6 RestFhirRetrieveProvider (org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider)4 SearchParameterResolver (org.opencds.cqf.cql.engine.fhir.searchparam.SearchParameterResolver)4 IGenericClient (ca.uhn.fhir.rest.client.api.IGenericClient)3 CompositeDataProvider (org.opencds.cqf.cql.engine.data.CompositeDataProvider)3 DataProvider (org.opencds.cqf.cql.engine.data.DataProvider)3 CqlEngine (org.opencds.cqf.cql.engine.execution.CqlEngine)3 TerminologyProvider (org.opencds.cqf.cql.engine.terminology.TerminologyProvider)3 BundleRetrieveProvider (org.opencds.cqf.cql.evaluator.engine.retrieve.BundleRetrieveProvider)3 PriorityRetrieveProvider (org.opencds.cqf.cql.evaluator.engine.retrieve.PriorityRetrieveProvider)3 JpaFhirRetrieveProvider (org.opencds.cqf.ruler.cql.JpaFhirRetrieveProvider)3 R4FhirTerminologyProvider (org.opencds.cqf.cql.engine.fhir.terminology.R4FhirTerminologyProvider)2 Interval (org.opencds.cqf.cql.engine.runtime.Interval)2 SystemRequestDetails (ca.uhn.fhir.jpa.partition.SystemRequestDetails)1 Operation (ca.uhn.fhir.rest.annotation.Operation)1 DefaultCqlDataProvider (com.ibm.cohort.cql.data.DefaultCqlDataProvider)1 CachingRetrieveProvider (com.ibm.cohort.engine.measure.cache.CachingRetrieveProvider)1