From 1a6cc9c12fa25564ea7e1b08ab15f6b44f0f5bba Mon Sep 17 00:00:00 2001 From: Bryn Rhodes Date: Mon, 6 Jul 2020 19:19:24 -0600 Subject: [PATCH 01/15] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 466a0d9..0d1c26c 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ 1 - 1 + 3 0 ${version.major}.${version.minor}.${version.patch}-SNAPSHOT From 1613fa6e5b206c218610e46950d230c5d32eddfc Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Wed, 8 Jul 2020 14:59:22 -0600 Subject: [PATCH 02/15] Fix null pointer issues, Fallback to remote server if prefetch is empty --- .../cqf/cds/evaluation/EvaluationContext.java | 2 - .../cds/evaluation/R4EvaluationContext.java | 5 +++ .../cds/evaluation/Stu3EvaluationContext.java | 5 +++ .../cqf/cds/hooks/BaseHookEvaluator.java | 11 +++-- .../providers/PrefetchDataProviderDstu2.java | 11 +++-- .../providers/PrefetchDataProviderHelper.java | 4 ++ .../cds/providers/PrefetchDataProviderR4.java | 7 +--- .../providers/PrefetchDataProviderStu3.java | 7 +--- .../providers/PriorityRetrieveProvider.java | 42 +++++++++++++++++++ 9 files changed, 72 insertions(+), 22 deletions(-) create mode 100644 src/main/java/org/opencds/cqf/cds/providers/PriorityRetrieveProvider.java diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java index 732ccee..27357b6 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java @@ -98,8 +98,6 @@ public Library getLibrary() { private DataProvider getDataProvider() { if (remoteProvider == null) { ModelResolver resolver; - - // TODO: Need to factor out all the SearchParamRegistry stuff. TerminologyProvider terminologyProvider; switch (fhirVersion) { case DSTU2: diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java index c22d72c..930be75 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java @@ -12,6 +12,7 @@ import org.opencds.cqf.cql.engine.execution.Context; import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -24,6 +25,10 @@ public R4EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericClien @Override List applyCqlToResources(List resources) { + if (resources == null || resources.isEmpty()) { + return new ArrayList<>(); + } + Bundle bundle = new Bundle(); for (Object res : resources) { bundle.addEntry(new Bundle.BundleEntryComponent().setResource((Resource) res)); diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java index 2721103..1d4d9e7 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java @@ -12,6 +12,7 @@ import org.opencds.cqf.cql.engine.execution.Context; import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -24,6 +25,10 @@ public Stu3EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericCli @Override List applyCqlToResources(List resources) { + if (resources == null || resources.isEmpty()) { + return new ArrayList<>(); + } + Bundle bundle = new Bundle(); for (Object res : resources) { bundle.addEntry(new Bundle.BundleEntryComponent().setResource((Resource) res)); diff --git a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java index c3c11a8..715e0e0 100644 --- a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java +++ b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java @@ -7,6 +7,7 @@ import org.opencds.cqf.cds.providers.PrefetchDataProviderDstu2; import org.opencds.cqf.cds.providers.PrefetchDataProviderR4; import org.opencds.cqf.cds.providers.PrefetchDataProviderStu3; +import org.opencds.cqf.cds.providers.PriorityRetrieveProvider; import org.opencds.cqf.cds.response.CdsCard; import org.cqframework.cql.elm.execution.ListTypeSpecifier; import org.cqframework.cql.elm.execution.ParameterDef; @@ -48,23 +49,25 @@ public List evaluate(EvaluationContext

context) throws IOException { TerminologyAwareRetrieveProvider prefetchRetriever; ModelResolver resolver; if (context.getFhirVersion() == FhirVersionEnum.DSTU3) { - prefetchRetriever = new PrefetchDataProviderStu3(context.getPrefetchResources(), remoteRetriever); + prefetchRetriever = new PrefetchDataProviderStu3(context.getPrefetchResources()); resolver = new Dstu3FhirModelResolver(); } else if (context.getFhirVersion() == FhirVersionEnum.DSTU2) { - prefetchRetriever = new PrefetchDataProviderDstu2(context.getPrefetchResources(), remoteRetriever); + prefetchRetriever = new PrefetchDataProviderDstu2(context.getPrefetchResources()); resolver = new Dstu2FhirModelResolver(); } else { - prefetchRetriever = new PrefetchDataProviderR4(context.getPrefetchResources(), remoteRetriever); + prefetchRetriever = new PrefetchDataProviderR4(context.getPrefetchResources()); resolver = new R4FhirModelResolver(); } // TODO: Get the "system" terminology provider. prefetchRetriever.setTerminologyProvider(context.getContext().resolveTerminologyProvider()); + + PriorityRetrieveProvider priorityRetrieveProvider = new PriorityRetrieveProvider(prefetchRetriever, remoteRetriever); context.getContext().registerDataProvider("http://hl7.org/fhir", - new CompositeDataProvider(resolver, prefetchRetriever)); + new CompositeDataProvider(resolver, priorityRetrieveProvider)); context.getContext().registerTerminologyProvider(prefetchRetriever.getTerminologyProvider()); return evaluateCdsHooksPlanDefinition(context.getContext(), context.getPlanDefinition(), diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java index 7fbd888..9e5bea2 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java @@ -17,18 +17,18 @@ public class PrefetchDataProviderDstu2 extends TerminologyAwareRetrieveProvider private Map> prefetchResources; private ModelResolver resolver; - private RetrieveProvider remoteProvider; - - public PrefetchDataProviderDstu2(List resources, RetrieveProvider remoteProvider) { + + public PrefetchDataProviderDstu2(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); this.resolver = new Dstu2FhirModelResolver(); - this.remoteProvider = remoteProvider; } @Override public Iterable retrieve(String context, String contextPath, Object contextValue, String dataType, String templateId, String codePath, Iterable codes, String valueSet, String datePath, String dateLowPath, String dateHighPath, Interval dateRange) { + + if (codePath == null && (codes != null || valueSet != null)) { throw new IllegalArgumentException("A code path must be provided when filtering on codes or a valueset."); } @@ -41,8 +41,7 @@ public Iterable retrieve(String context, String contextPath, Object cont // This dataType can't be related to patient, therefore may // not be in the pre-fetch bundle, or might required a lookup by Id if (context.equals("Patient") && contextPath == null) { - return remoteProvider.retrieve(context, contextPath, contextValue, dataType, templateId, codePath, codes, - valueSet, datePath, dateLowPath, dateHighPath, dateRange); + return null; } List resourcesOfType = prefetchResources.get(dataType); diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java index b66a668..17d1746 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java @@ -18,6 +18,10 @@ public class PrefetchDataProviderHelper { public static Map> populateMap(List resources) { Map> prefetchResources = new HashMap<>(); + if (resources == null){ + return prefetchResources; + } + for (Object resource : resources) { if (resource instanceof Resource) { if (prefetchResources.containsKey(((Resource) resource).fhirType())) { diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java index 0fd6cac..a163515 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java @@ -17,11 +17,9 @@ public class PrefetchDataProviderR4 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; private ModelResolver resolver; - private RetrieveProvider remoteProvider; - public PrefetchDataProviderR4(List resources, RetrieveProvider remoteProvider) { + public PrefetchDataProviderR4(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); - this.remoteProvider = remoteProvider; this.resolver = new R4FhirModelResolver(); } @@ -41,8 +39,7 @@ public Iterable retrieve(String context, String contextPath, Object cont // This dataType can't be related to patient, therefore may // not be in the pre-fetch bundle, or might required a lookup by Id if (context.equals("Patient") && contextPath == null) { - return remoteProvider.retrieve(context, contextPath, contextValue, dataType, templateId, codePath, codes, - valueSet, datePath, dateLowPath, dateHighPath, dateRange); + return null; } List resourcesOfType = prefetchResources.get(dataType); diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java index 500279f..2cf7d43 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java @@ -17,12 +17,10 @@ public class PrefetchDataProviderStu3 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; private ModelResolver resolver; - private RetrieveProvider remoteProvider; - public PrefetchDataProviderStu3(List resources, RetrieveProvider remoteProvider) { + public PrefetchDataProviderStu3(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); this.resolver = new Dstu3FhirModelResolver(); - this.remoteProvider = remoteProvider; } @Override @@ -41,8 +39,7 @@ public Iterable retrieve(String context, String contextPath, Object cont // This dataType can't be related to patient, therefore may // not be in the pre-fetch bundle, or might required a lookup by Id if (context.equals("Patient") && contextPath == null) { - return remoteProvider.retrieve(context, contextPath, contextValue, dataType, templateId, codePath, codes, - valueSet, datePath, dateLowPath, dateHighPath, dateRange); + return null; } List resourcesOfType = prefetchResources.get(dataType); diff --git a/src/main/java/org/opencds/cqf/cds/providers/PriorityRetrieveProvider.java b/src/main/java/org/opencds/cqf/cds/providers/PriorityRetrieveProvider.java new file mode 100644 index 0000000..dd40b82 --- /dev/null +++ b/src/main/java/org/opencds/cqf/cds/providers/PriorityRetrieveProvider.java @@ -0,0 +1,42 @@ +package org.opencds.cqf.cds.providers; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.opencds.cqf.cql.engine.retrieve.RetrieveProvider; +import org.opencds.cqf.cql.engine.runtime.Code; +import org.opencds.cqf.cql.engine.runtime.Interval; + +public class PriorityRetrieveProvider implements RetrieveProvider { + + private List providers = new ArrayList<>(); + + public PriorityRetrieveProvider (RetrieveProvider... providers) { + if (providers != null) { + for (RetrieveProvider provider : providers) { + this.providers.add(provider); + } + } + } + + @Override + public Iterable retrieve(String context, String contextPath, Object contextValue, String dataType, + String templateId, String codePath, Iterable codes, String valueSet, String datePath, + String dateLowPath, String dateHighPath, Interval dateRange) { + + Iterable result = null; + for (RetrieveProvider provider : providers) { + result = provider.retrieve(context, contextPath, contextValue, dataType, templateId, codePath, codes, valueSet, datePath, dateLowPath, dateHighPath, dateRange); + if (result != null && result instanceof Collection) { + if (!((Collection)result).isEmpty()) { + return result; + } + } + + } + + return result; + } + +} \ No newline at end of file From d511751611f727ed4d937ae32d983856dd0b1b1e Mon Sep 17 00:00:00 2001 From: Adam Stevenson Date: Mon, 13 Jul 2020 16:05:00 -0600 Subject: [PATCH 03/15] Set expandvaluesets on RestFhirRetrieveProvider provider instances. --- .../java/org/opencds/cqf/cds/evaluation/EvaluationContext.java | 1 + src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java index 27357b6..cf933af 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java @@ -121,6 +121,7 @@ private DataProvider getDataProvider() { RestFhirRetrieveProvider provider = new RestFhirRetrieveProvider( new SearchParameterResolver(this.fhirContext), this.getHookFhirClient()); provider.setTerminologyProvider(terminologyProvider); + provider.setExpandValueSets(true); this.remoteProvider = new CompositeDataProvider(resolver, provider); } diff --git a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java index 715e0e0..5223b27 100644 --- a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java +++ b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java @@ -45,6 +45,7 @@ public List evaluate(EvaluationContext

context) throws IOException { new SearchParameterResolver(context.getFhirContext()), context.getHookFhirClient()); remoteRetriever.setTerminologyProvider(context.getContext().resolveTerminologyProvider()); + remoteRetriever.setExpandValueSets(true); TerminologyAwareRetrieveProvider prefetchRetriever; ModelResolver resolver; From ff07faa8f0295e9a8cc1e2167271e89c82a78f5e Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Thu, 16 Jul 2020 13:48:45 -0600 Subject: [PATCH 04/15] Add ability to configure providers --- pom.xml | 2 +- .../cqf/cds/evaluation/EvaluationContext.java | 15 ++++++++- .../cds/evaluation/R4EvaluationContext.java | 5 +-- .../cds/evaluation/Stu3EvaluationContext.java | 5 +-- .../cqf/cds/hooks/BaseHookEvaluator.java | 6 ++-- .../cds/providers/ProviderConfiguration.java | 31 +++++++++++++++++++ 6 files changed, 56 insertions(+), 8 deletions(-) create mode 100644 src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java diff --git a/pom.xml b/pom.xml index 0d1c26c..9511895 100644 --- a/pom.xml +++ b/pom.xml @@ -17,7 +17,7 @@ UTF-8 UTF-8 - 1.4.0 + 1.5.0-SNAPSHOT cds-hooks diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java index cf933af..4130bc3 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/EvaluationContext.java @@ -4,6 +4,7 @@ import java.util.List; import org.opencds.cqf.cds.hooks.Hook; +import org.opencds.cqf.cds.providers.ProviderConfiguration; import org.opencds.cqf.cds.exceptions.NotImplementedException; import org.cqframework.cql.elm.execution.Library; @@ -45,8 +46,10 @@ public abstract class EvaluationContext { private IGenericClient client; + private ProviderConfiguration providerConfiguration; + public EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericClient fhirClient, Context context, - Library library, T planDefinition) { + Library library, T planDefinition, ProviderConfiguration providerConfiguration) { // How to determine if it's a local server? // Local Server url? @@ -62,6 +65,8 @@ public EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericClient this.client = fhirClient; + this.providerConfiguration = providerConfiguration; + context.registerDataProvider("http://hl7.org/fhir", getDataProvider()); } @@ -123,6 +128,10 @@ private DataProvider getDataProvider() { provider.setTerminologyProvider(terminologyProvider); provider.setExpandValueSets(true); + provider.setExpandValueSets(this.providerConfiguration.getExpandValueSets()); + provider.setMaxCodesPerQuery(this.providerConfiguration.getMaxCodesPerQuery()); + provider.setSearchStyle(this.providerConfiguration.getSearchStyle()); + this.remoteProvider = new CompositeDataProvider(resolver, provider); } return remoteProvider; @@ -184,6 +193,10 @@ public IGenericClient getHookFhirClient() { return client; } + public ProviderConfiguration getProviderConfiguration() { + return this.providerConfiguration; + } + // NOTE: This is an operation defined in the cqf-ruler abstract List applyCqlToResources(List resources); } diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java index 930be75..ed209b3 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/R4EvaluationContext.java @@ -4,6 +4,7 @@ import ca.uhn.fhir.rest.client.api.IGenericClient; import org.opencds.cqf.cds.hooks.Hook; +import org.opencds.cqf.cds.providers.ProviderConfiguration; import org.cqframework.cql.elm.execution.Library; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Parameters; @@ -19,8 +20,8 @@ public class R4EvaluationContext extends EvaluationContext { public R4EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericClient fhirClient, - TerminologyProvider terminologyProvider, Context context, Library library, PlanDefinition planDefinition) { - super(hook, fhirVersion, fhirClient, context, library, planDefinition); + TerminologyProvider terminologyProvider, Context context, Library library, PlanDefinition planDefinition, ProviderConfiguration providerConfiguration) { + super(hook, fhirVersion, fhirClient, context, library, planDefinition, providerConfiguration); } @Override diff --git a/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java b/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java index 1d4d9e7..7addb27 100644 --- a/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java +++ b/src/main/java/org/opencds/cqf/cds/evaluation/Stu3EvaluationContext.java @@ -4,6 +4,7 @@ import ca.uhn.fhir.rest.client.api.IGenericClient; import org.opencds.cqf.cds.hooks.Hook; +import org.opencds.cqf.cds.providers.ProviderConfiguration; import org.cqframework.cql.elm.execution.Library; import org.hl7.fhir.dstu3.model.Bundle; import org.hl7.fhir.dstu3.model.Parameters; @@ -19,8 +20,8 @@ public class Stu3EvaluationContext extends EvaluationContext { public Stu3EvaluationContext(Hook hook, FhirVersionEnum fhirVersion, IGenericClient fhirClient, - TerminologyProvider terminologyProvider, Context context, Library library, PlanDefinition planDefinition) { - super(hook, fhirVersion, fhirClient, context, library, planDefinition); + TerminologyProvider terminologyProvider, Context context, Library library, PlanDefinition planDefinition, ProviderConfiguration providerConfiguration) { + super(hook, fhirVersion, fhirClient, context, library, planDefinition, providerConfiguration); } @Override diff --git a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java index 5223b27..a2d258d 100644 --- a/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java +++ b/src/main/java/org/opencds/cqf/cds/hooks/BaseHookEvaluator.java @@ -41,11 +41,13 @@ public List evaluate(EvaluationContext

context) throws IOException { } // Remote data retriever - TerminologyAwareRetrieveProvider remoteRetriever = new RestFhirRetrieveProvider( + RestFhirRetrieveProvider remoteRetriever = new RestFhirRetrieveProvider( new SearchParameterResolver(context.getFhirContext()), context.getHookFhirClient()); remoteRetriever.setTerminologyProvider(context.getContext().resolveTerminologyProvider()); - remoteRetriever.setExpandValueSets(true); + remoteRetriever.setExpandValueSets(context.getProviderConfiguration().getExpandValueSets()); + remoteRetriever.setMaxCodesPerQuery(context.getProviderConfiguration().getMaxCodesPerQuery()); + remoteRetriever.setSearchStyle(context.getProviderConfiguration().getSearchStyle()); TerminologyAwareRetrieveProvider prefetchRetriever; ModelResolver resolver; diff --git a/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java b/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java new file mode 100644 index 0000000..f2984dd --- /dev/null +++ b/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java @@ -0,0 +1,31 @@ +package org.opencds.cqf.cds.providers; + +import ca.uhn.fhir.rest.api.SearchStyleEnum; + +public class ProviderConfiguration { + + public static final ProviderConfiguration DEFAULT_PROVIDER_CONFIGURATION = + new ProviderConfiguration(true, 64, SearchStyleEnum.GET); + + private int maxCodesPerQuery; + private SearchStyleEnum searchStyle; + private boolean expandValueSets; + + public ProviderConfiguration(boolean expandValueSets, int maxCodesPerQuery, SearchStyleEnum searchStyle) { + this.maxCodesPerQuery = maxCodesPerQuery; + this.searchStyle = searchStyle; + this.expandValueSets = expandValueSets; + } + + public int getMaxCodesPerQuery() { + return this.maxCodesPerQuery; + } + + public SearchStyleEnum getSearchStyle() { + return this.searchStyle; + } + + public boolean getExpandValueSets() { + return this.expandValueSets; + } +} \ No newline at end of file From 2bb223ca645c0bb08355aa24e9ba6a9b2af0f56b Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Thu, 30 Jul 2020 09:30:33 -0600 Subject: [PATCH 05/15] Add notifications to build --- .travis.yml | 57 +++++++++++++++++++++++------------------------------ 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e3dc22..fde0095 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,44 +2,37 @@ language: java jdk: openjdk11 os: linux dist: xenial - cache: timeout: 180 directories: - "$HOME/.m2/repository" - install: - - mvn install -U -DskipTests=true -Dmaven.javadoc.skip=true -B -V - +- mvn install -U -DskipTests=true -Dmaven.javadoc.skip=true -B -V script: - # master or PRs into master, use the release profile - - 'if [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B -P release; fi' - - 'if ! [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B; fi' - - -## export GPG details +- if [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B -P release; fi +- if ! [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B; fi before_deploy: - - 'if [[ "$TRAVIS_BRANCH" =~ master* ]]; then echo $GPG_SECRET_KEYS | base64 --decode | $GPG_EXECUTABLE --import; fi' - - 'if [[ "$TRAVIS_BRANCH" =~ master* ]]; then echo $GPG_OWNERTRUST | base64 --decode | $GPG_EXECUTABLE --import-ownertrust; fi' - -# NOTE: tests were already run as part of the script phase +- if [[ "$TRAVIS_BRANCH" =~ master* ]]; then echo $GPG_SECRET_KEYS | base64 --decode + | $GPG_EXECUTABLE --import; fi +- if [[ "$TRAVIS_BRANCH" =~ master* ]]; then echo $GPG_OWNERTRUST | base64 --decode + | $GPG_EXECUTABLE --import-ownertrust; fi deploy: - # deploy develop as a snapshot - - provider: script - script: "cp .travis.settings.xml $HOME/.m2/settings.xml && mvn deploy -DskipTests=true" - cleanup: false - skip_cleanup: true # this is the current correct option, soon to be deprecated by the above - on: - branch: develop - # deploy master to production - - provider: script - script: "cp .travis.settings.xml $HOME/.m2/settings.xml && mvn deploy -P release -DskipTests=true" - cleanup: false - skip_cleanup: true # this is the current correct option, soon to be deprecated by the above - on: - branch: master - -# Remove the binaries generated by this build so that the cache isn't invalidated. -# Probably a better way to do this. +- provider: script + script: cp .travis.settings.xml $HOME/.m2/settings.xml && mvn deploy -DskipTests=true + cleanup: false + skip_cleanup: true + on: + branch: develop +- provider: script + script: cp .travis.settings.xml $HOME/.m2/settings.xml && mvn deploy -P release + -DskipTests=true + cleanup: false + skip_cleanup: true + on: + branch: master before_cache: - - rm -rf $HOME/.m2/repository/org/opencds/cqf/cds +- rm -rf $HOME/.m2/repository/org/opencds/cqf/cds +notifications: + slack: + rooms: + secure: i7QAWlakVmBpgtZIw+ecBt7anXG9Fdang1g/CfPT6PAD+SIk3GXxWHWrBRvicIziZT9waTgzg9uzcXe8BKxpNN13jORKWx7Y5UWWdG/rf+WcGJDsnVagt4E/S9DxUyzjR8AbFq9+jpbVYGusZLWrHynUaQE3EyPLkz6WCPROtuwuscaeBYlFh06wJg6TJu6G3rbj7anlZ3L1vT/8bbfJKEH3gW/0M8hbR8IJavQZnnptRHlfcWNjrdFDL4a4vrL5R+S+WgwZCvvaFWg6PeQbV1vlKnQ36DycDr2Z38OQxbNFoqu4pljQNvnPEo6tuRptzL3jjLluP+UjaGdLotLMzGCoXiB6DtaY2GnCqUXI5kHHTxuLnwFi58RSGZuHlTr9nUcftvA3JnlB0SjoEz6CKStJVksH/oKvExmPeAOOlN7AuqOtxXODqxS217Yro+DMjt3m5LO+PLHBE2XuWJSYUWcOnEEs6pMbeZvcpEiD3DmUC7QeErV8uay5LBIIkjgDRe0uQhpnOTDpbrSY1dU5rFGC4CNNPDwWHu3ysDjna/QYYkrG14Xi/FDlkRsBU4oYhh5+HqhBtMRTJ16a9ueX7LwgPxiZxtA7rJOG4Wic2huzW96tM2tFOkn85/IE19q2sbfzWj9dlJNA17nFKRav8RTYizPBsH39dSHHAcqm7g4= From ca3eab515e5cce26cb3a47a991fa670e76449eed Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Thu, 30 Jul 2020 10:26:43 -0600 Subject: [PATCH 06/15] Update travis token --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fde0095..136a8de 100644 --- a/.travis.yml +++ b/.travis.yml @@ -35,4 +35,4 @@ before_cache: notifications: slack: rooms: - secure: i7QAWlakVmBpgtZIw+ecBt7anXG9Fdang1g/CfPT6PAD+SIk3GXxWHWrBRvicIziZT9waTgzg9uzcXe8BKxpNN13jORKWx7Y5UWWdG/rf+WcGJDsnVagt4E/S9DxUyzjR8AbFq9+jpbVYGusZLWrHynUaQE3EyPLkz6WCPROtuwuscaeBYlFh06wJg6TJu6G3rbj7anlZ3L1vT/8bbfJKEH3gW/0M8hbR8IJavQZnnptRHlfcWNjrdFDL4a4vrL5R+S+WgwZCvvaFWg6PeQbV1vlKnQ36DycDr2Z38OQxbNFoqu4pljQNvnPEo6tuRptzL3jjLluP+UjaGdLotLMzGCoXiB6DtaY2GnCqUXI5kHHTxuLnwFi58RSGZuHlTr9nUcftvA3JnlB0SjoEz6CKStJVksH/oKvExmPeAOOlN7AuqOtxXODqxS217Yro+DMjt3m5LO+PLHBE2XuWJSYUWcOnEEs6pMbeZvcpEiD3DmUC7QeErV8uay5LBIIkjgDRe0uQhpnOTDpbrSY1dU5rFGC4CNNPDwWHu3ysDjna/QYYkrG14Xi/FDlkRsBU4oYhh5+HqhBtMRTJ16a9ueX7LwgPxiZxtA7rJOG4Wic2huzW96tM2tFOkn85/IE19q2sbfzWj9dlJNA17nFKRav8RTYizPBsH39dSHHAcqm7g4= + secure: ECKEk6sCGWP0IdlKx8cW7JMuD5Z9UsrpIa+gcHFyYHTly0ExTAaGAFFbFI3h1hnLdVqlUDhP5F65VXurEJ430Z9nF9Eb5oy+2Evhur5S0jWiHwak8Yf7MAkhf3waAWPtft4I0imMmMHgBSMI9R9VLjCiyhhS90OQpN7giDK0uo6AovijN+UelkZUNMH+6mQS9c1q5BXqoFU90hCCX5VUPPGXAXW535ZadNTd3b284MFVmLxik+p+hg+FxjI5utAA5o5f9uxxAtEBkDgM9vxyDRKKi4rMvNG12YZ/e20RiFJwPcsUA4uuaWqAJP8J9OHRTfrbGbFUDCTaSUp8CZcS/ydoaZBb0BYhF33U19aqYTovdcKzoCmWs5csoEHeFqjKYKyBc6dZcj3sZ1C2HOoz+Hb7uqRAAfi0N+kxTR2j/h1eAPS/28np1Uh1nSuVNx1h3OwCms0fDBNANRcpXOhfI01aV7Zx0HSu4fO9Gek6fJ4mB6eK47cO0H8O9F6px1WtPvaEoCXPoaCCO5QLI+OM/WX+Vj+iYE+3Z/FBBwcTgVrrHc5GFW5SPttr01qKGjkee5VBUkPTL9zr2tvavZYzJ9V25gvCta5ZXDGyLjfW7HoB6dOh9sDpQTzMUnb2AiYKLztEaotQwJRX6Se8ASHpkzbkwMszzmpta2qR1uvsrhE= From 8cbd3375136d020cab45e3c64d52a20339c2e510 Mon Sep 17 00:00:00 2001 From: Adam Stevenson Date: Mon, 3 Aug 2020 14:36:40 -0600 Subject: [PATCH 07/15] Mofified checkCodeMembership to use evaluator --- pom.xml | 7 +++++ .../providers/PrefetchDataProviderDstu2.java | 6 ++++- .../providers/PrefetchDataProviderHelper.java | 26 +++++++------------ .../cds/providers/PrefetchDataProviderR4.java | 3 ++- .../providers/PrefetchDataProviderStu3.java | 3 ++- 5 files changed, 26 insertions(+), 19 deletions(-) diff --git a/pom.xml b/pom.xml index 9511895..e052c3c 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,7 @@ UTF-8 1.5.0-SNAPSHOT + 1.0.0-SNAPSHOT cds-hooks @@ -59,6 +60,12 @@ + + org.opencds.cqf.cql + evaluator.execution + ${cql-evaluator-execution.version} + + org.opencds.cqf.cql engine diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java index 9e5bea2..1270f06 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java @@ -1,5 +1,7 @@ package org.opencds.cqf.cds.providers; +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; import org.opencds.cqf.cql.engine.elm.execution.IncludesEvaluator; import org.opencds.cqf.cql.engine.fhir.model.Dstu2FhirModelResolver; @@ -11,6 +13,7 @@ import org.opencds.cqf.cql.engine.runtime.Interval; import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; + import java.util.*; public class PrefetchDataProviderDstu2 extends TerminologyAwareRetrieveProvider { @@ -115,7 +118,8 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getDstu2Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject); + + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.DSTU2); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java index 17d1746..9e24ca7 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java @@ -1,5 +1,7 @@ package org.opencds.cqf.cds.providers; +import ca.uhn.fhir.context.FhirContext; +import ca.uhn.fhir.context.FhirVersionEnum; import ca.uhn.fhir.model.dstu2.composite.CodeableConceptDt; import ca.uhn.fhir.model.dstu2.composite.CodingDt; import ca.uhn.fhir.model.dstu2.composite.PeriodDt; @@ -186,22 +188,14 @@ public static Object getR4Code(Object codeObject) { return codeObject; } - public static boolean checkCodeMembership(Iterable codes, Object codeObject) { - // for now, just checking whether code values are equal... TODO - add - // intelligent checks for system and version - for (Code code : codes) { - if (codeObject instanceof String && code.getCode().equals(codeObject)) { - return true; - } else if (codeObject instanceof Code && code.getCode().equals(((Code) codeObject).getCode())) { - return true; - } else if (codeObject instanceof Iterable) { - for (Object obj : (Iterable) codeObject) { - if (code.getCode().equals(((Code) obj).getCode())) { - return true; - } - } - } + public static boolean checkCodeMembership(Iterable codes, Object codeObject, FhirVersionEnum fhirVersion) { + FhirContext fhirContext = new FhirContext(fhirVersion); + List qualifyingCodes = org.opencds.cqf.cql.evaluator.execution.util.CodeUtil.getElmCodesFromObject(codeObject, fhirContext); + + if (qualifyingCodes != null && !qualifyingCodes.isEmpty()) { + return true; + } else { + return false; } - return false; } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java index a163515..429e215 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java @@ -1,5 +1,6 @@ package org.opencds.cqf.cds.providers; +import ca.uhn.fhir.context.FhirVersionEnum; import org.opencds.cqf.cql.engine.retrieve.RetrieveProvider; import org.opencds.cqf.cql.engine.retrieve.TerminologyAwareRetrieveProvider; import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; @@ -112,7 +113,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getR4Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.R4); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java index 2cf7d43..fd80995 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java @@ -1,5 +1,6 @@ package org.opencds.cqf.cds.providers; +import ca.uhn.fhir.context.FhirVersionEnum; import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; import org.opencds.cqf.cql.engine.elm.execution.IncludesEvaluator; import org.opencds.cqf.cql.engine.fhir.model.Dstu3FhirModelResolver; @@ -112,7 +113,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getStu3Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.DSTU3); } } From 463238a07cb125149db7e3c842fac82573444389 Mon Sep 17 00:00:00 2001 From: Adam Stevenson Date: Tue, 4 Aug 2020 09:21:46 -0600 Subject: [PATCH 08/15] Null protection --- .../cds/providers/PrefetchDataProviderHelper.java | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java index 9e24ca7..a8320e9 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java @@ -190,12 +190,16 @@ public static Object getR4Code(Object codeObject) { public static boolean checkCodeMembership(Iterable codes, Object codeObject, FhirVersionEnum fhirVersion) { FhirContext fhirContext = new FhirContext(fhirVersion); - List qualifyingCodes = org.opencds.cqf.cql.evaluator.execution.util.CodeUtil.getElmCodesFromObject(codeObject, fhirContext); + List qualifyingCodes = new ArrayList(); - if (qualifyingCodes != null && !qualifyingCodes.isEmpty()) { - return true; - } else { - return false; + if (codeObject != null) { + qualifyingCodes = org.opencds.cqf.cql.evaluator.execution.util.CodeUtil.getElmCodesFromObject(codeObject, fhirContext); + + if (!qualifyingCodes.isEmpty()) { + return true; + } } + + return false; } } From e69527d35d6fb665a13cd0457ea4ffc1c20a144b Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Tue, 4 Aug 2020 09:51:32 -0600 Subject: [PATCH 09/15] Update to use existing context for prefetch data provider --- .../opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java | 5 +++-- .../cqf/cds/providers/PrefetchDataProviderHelper.java | 3 +-- .../opencds/cqf/cds/providers/PrefetchDataProviderR4.java | 5 +++-- .../opencds/cqf/cds/providers/PrefetchDataProviderStu3.java | 5 +++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java index 1270f06..6210b6c 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java @@ -5,6 +5,7 @@ import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; import org.opencds.cqf.cql.engine.elm.execution.IncludesEvaluator; import org.opencds.cqf.cql.engine.fhir.model.Dstu2FhirModelResolver; +import org.opencds.cqf.cql.engine.fhir.model.FhirModelResolver; import org.opencds.cqf.cql.engine.model.ModelResolver; import org.opencds.cqf.cql.engine.retrieve.RetrieveProvider; import org.opencds.cqf.cql.engine.retrieve.TerminologyAwareRetrieveProvider; @@ -19,7 +20,7 @@ public class PrefetchDataProviderDstu2 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; - private ModelResolver resolver; + private FhirModelResolver resolver; public PrefetchDataProviderDstu2(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); @@ -119,7 +120,7 @@ else if (dateInterval != null Object codeObject = PrefetchDataProviderHelper .getDstu2Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.DSTU2); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java index a8320e9..2f191d8 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java @@ -188,8 +188,7 @@ public static Object getR4Code(Object codeObject) { return codeObject; } - public static boolean checkCodeMembership(Iterable codes, Object codeObject, FhirVersionEnum fhirVersion) { - FhirContext fhirContext = new FhirContext(fhirVersion); + public static boolean checkCodeMembership(Iterable codes, Object codeObject, FhirContext fhirContext) { List qualifyingCodes = new ArrayList(); if (codeObject != null) { diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java index 429e215..d5028d4 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java @@ -6,6 +6,7 @@ import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; import org.opencds.cqf.cql.engine.elm.execution.IncludesEvaluator; import org.opencds.cqf.cql.engine.model.ModelResolver; +import org.opencds.cqf.cql.engine.fhir.model.FhirModelResolver; import org.opencds.cqf.cql.engine.fhir.model.R4FhirModelResolver; import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.DateTime; @@ -17,7 +18,7 @@ public class PrefetchDataProviderR4 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; - private ModelResolver resolver; + private FhirModelResolver resolver; public PrefetchDataProviderR4(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); @@ -113,7 +114,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getR4Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.R4); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java index fd80995..b646ac3 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java @@ -4,6 +4,7 @@ import org.opencds.cqf.cql.engine.elm.execution.InEvaluator; import org.opencds.cqf.cql.engine.elm.execution.IncludesEvaluator; import org.opencds.cqf.cql.engine.fhir.model.Dstu3FhirModelResolver; +import org.opencds.cqf.cql.engine.fhir.model.FhirModelResolver; import org.opencds.cqf.cql.engine.model.ModelResolver; import org.opencds.cqf.cql.engine.retrieve.RetrieveProvider; import org.opencds.cqf.cql.engine.retrieve.TerminologyAwareRetrieveProvider; @@ -17,7 +18,7 @@ public class PrefetchDataProviderStu3 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; - private ModelResolver resolver; + private FhirModelResolver resolver; public PrefetchDataProviderStu3(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); @@ -113,7 +114,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getStu3Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, FhirVersionEnum.DSTU3); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); } } From 7ea9a0c448f99e4ee9526336246e4e95de0e27c6 Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Fri, 4 Sep 2020 14:12:28 -0600 Subject: [PATCH 10/15] Update to latest engine --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index e052c3c..42c861f 100644 --- a/pom.xml +++ b/pom.xml @@ -89,6 +89,12 @@ + + + com.google.code.gson + gson + 2.8.5 + From 0f4bf995cb0f7c1f3cb6d9d237c5444abf028dab Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Sat, 12 Sep 2020 11:52:26 -0600 Subject: [PATCH 11/15] Add uri length configuration --- .../cds/discovery/DiscoveryResolutionR4.java | 22 +++++++++++++++---- .../discovery/DiscoveryResolutionStu3.java | 22 +++++++++++++++---- .../cds/providers/ProviderConfiguration.java | 10 +++++++-- 3 files changed, 44 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionR4.java b/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionR4.java index 8b9deca..b2e8609 100644 --- a/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionR4.java +++ b/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionR4.java @@ -10,12 +10,26 @@ public class DiscoveryResolutionR4 { private final String PATIENT_ID_CONTEXT = "{{context.patientId}}"; - private final int URI_MAX_LENGTH = 8000; + private final int DEFAULT_MAX_URI_LENGTH = 8000; + private int maxUriLength; private IGenericClient client; public DiscoveryResolutionR4(IGenericClient client) { this.client = client; + this.maxUriLength = DEFAULT_MAX_URI_LENGTH; + } + + public int getMaxUriLength() { + return this.maxUriLength; + } + + public void setMaxUriLength(int maxUriLength) { + if (maxUriLength <= 0) { + throw new IllegalArgumentException("maxUriLength must be >0"); + } + + this.maxUriLength = maxUriLength; } public PlanDefinition resolvePlanDefinition(Bundle.BundleEntryComponent component) { @@ -115,10 +129,10 @@ private StringBuilder getCodesStringBuilder(List ret, StringBuilder code String codeToken = system + "|" + code; int postAppendLength = codes.length() + codeToken.length(); - if (codes.length() > 0 && postAppendLength < URI_MAX_LENGTH) { + if (codes.length() > 0 && postAppendLength < this.maxUriLength) { codes.append(","); } - else if (postAppendLength > URI_MAX_LENGTH) { + else if (postAppendLength > this.maxUriLength) { ret.add(codes.toString()); codes = new StringBuilder(); } @@ -128,7 +142,7 @@ else if (postAppendLength > URI_MAX_LENGTH) { public List createRequestUrl(DataRequirement dataRequirement) { if (!isPatientCompartment(dataRequirement.getType())) return null; - String patientRelatedResource = dataRequirement.getType() + "?" + getPatientSearchParam(dataRequirement.getType()) + "=" + PATIENT_ID_CONTEXT; + String patientRelatedResource = dataRequirement.getType() + "?" + getPatientSearchParam(dataRequirement.getType()) + "=Patient/" + PATIENT_ID_CONTEXT; List ret = new ArrayList<>(); if (dataRequirement.hasCodeFilter()) { for (DataRequirement.DataRequirementCodeFilterComponent codeFilterComponent : dataRequirement.getCodeFilter()) { diff --git a/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionStu3.java b/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionStu3.java index 565dfbd..1110d3c 100644 --- a/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionStu3.java +++ b/src/main/java/org/opencds/cqf/cds/discovery/DiscoveryResolutionStu3.java @@ -9,12 +9,26 @@ public class DiscoveryResolutionStu3 { private final String PATIENT_ID_CONTEXT = "{{context.patientId}}"; - private final int URI_MAX_LENGTH = 8000; + private final int DEFAULT_MAX_URI_LENGTH = 8000; + private int maxUriLength; private IGenericClient client; public DiscoveryResolutionStu3(IGenericClient client) { this.client = client; + this.maxUriLength = DEFAULT_MAX_URI_LENGTH; + } + + public int getMaxUriLength() { + return this.maxUriLength; + } + + public void setMaxUriLength(int maxUriLength) { + if (maxUriLength <= 0) { + throw new IllegalArgumentException("maxUriLength must be >0"); + } + + this.maxUriLength = maxUriLength; } public PlanDefinition resolvePlanDefinition(Bundle.BundleEntryComponent component) { @@ -114,10 +128,10 @@ private StringBuilder getCodesStringBuilder(List ret, StringBuilder code String codeToken = system + "|" + code; int postAppendLength = codes.length() + codeToken.length(); - if (codes.length() > 0 && postAppendLength < URI_MAX_LENGTH) { + if (codes.length() > 0 && postAppendLength < this.maxUriLength) { codes.append(","); } - else if (postAppendLength > URI_MAX_LENGTH) { + else if (postAppendLength > this.maxUriLength) { ret.add(codes.toString()); codes = new StringBuilder(); } @@ -127,7 +141,7 @@ else if (postAppendLength > URI_MAX_LENGTH) { public List createRequestUrl(DataRequirement dataRequirement) { if (!isPatientCompartment(dataRequirement.getType())) return null; - String patientRelatedResource = dataRequirement.getType() + "?" + getPatientSearchParam(dataRequirement.getType()) + "=" + PATIENT_ID_CONTEXT; + String patientRelatedResource = dataRequirement.getType() + "?" + getPatientSearchParam(dataRequirement.getType()) + "=Patient/" + PATIENT_ID_CONTEXT; List ret = new ArrayList<>(); if (dataRequirement.hasCodeFilter()) { for (DataRequirement.DataRequirementCodeFilterComponent codeFilterComponent : dataRequirement.getCodeFilter()) { diff --git a/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java b/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java index f2984dd..187f0be 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java +++ b/src/main/java/org/opencds/cqf/cds/providers/ProviderConfiguration.java @@ -5,16 +5,18 @@ public class ProviderConfiguration { public static final ProviderConfiguration DEFAULT_PROVIDER_CONFIGURATION = - new ProviderConfiguration(true, 64, SearchStyleEnum.GET); + new ProviderConfiguration(true, 64, SearchStyleEnum.GET, 8000); private int maxCodesPerQuery; private SearchStyleEnum searchStyle; private boolean expandValueSets; + private int maxUriLength; - public ProviderConfiguration(boolean expandValueSets, int maxCodesPerQuery, SearchStyleEnum searchStyle) { + public ProviderConfiguration(boolean expandValueSets, int maxCodesPerQuery, SearchStyleEnum searchStyle, int maxUriLength) { this.maxCodesPerQuery = maxCodesPerQuery; this.searchStyle = searchStyle; this.expandValueSets = expandValueSets; + this.maxUriLength = maxUriLength; } public int getMaxCodesPerQuery() { @@ -28,4 +30,8 @@ public SearchStyleEnum getSearchStyle() { public boolean getExpandValueSets() { return this.expandValueSets; } + + public int getMaxUriLength() { + return this.maxUriLength; + } } \ No newline at end of file From 860baa6ec316b6af52def16e3d20608368caded7 Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Sat, 12 Sep 2020 12:03:48 -0600 Subject: [PATCH 12/15] Update to newest version of evaluator --- .../cqf/cds/providers/PrefetchDataProviderDstu2.java | 6 ++++-- .../cqf/cds/providers/PrefetchDataProviderHelper.java | 5 +++-- .../opencds/cqf/cds/providers/PrefetchDataProviderR4.java | 5 ++++- .../opencds/cqf/cds/providers/PrefetchDataProviderStu3.java | 5 ++++- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java index 6210b6c..1738266 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderDstu2.java @@ -13,7 +13,7 @@ import org.opencds.cqf.cql.engine.runtime.DateTime; import org.opencds.cqf.cql.engine.runtime.Interval; import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; - +import org.opencds.cqf.cql.evaluator.execution.util.CodeUtil; import java.util.*; @@ -21,10 +21,12 @@ public class PrefetchDataProviderDstu2 extends TerminologyAwareRetrieveProvider private Map> prefetchResources; private FhirModelResolver resolver; + private CodeUtil codeUtil; public PrefetchDataProviderDstu2(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); this.resolver = new Dstu2FhirModelResolver(); + this.codeUtil = new CodeUtil(this.resolver.getFhirContext()); } @Override @@ -120,7 +122,7 @@ else if (dateInterval != null Object codeObject = PrefetchDataProviderHelper .getDstu2Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.codeUtil); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java index 2f191d8..c7959cf 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderHelper.java @@ -13,6 +13,7 @@ import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.DateTime; import org.opencds.cqf.cql.engine.runtime.Interval; +import org.opencds.cqf.cql.evaluator.execution.util.CodeUtil; import java.util.*; @@ -188,11 +189,11 @@ public static Object getR4Code(Object codeObject) { return codeObject; } - public static boolean checkCodeMembership(Iterable codes, Object codeObject, FhirContext fhirContext) { + public static boolean checkCodeMembership(Iterable codes, Object codeObject, CodeUtil codeUtil) { List qualifyingCodes = new ArrayList(); if (codeObject != null) { - qualifyingCodes = org.opencds.cqf.cql.evaluator.execution.util.CodeUtil.getElmCodesFromObject(codeObject, fhirContext); + qualifyingCodes = codeUtil.getElmCodesFromObject(codeObject); if (!qualifyingCodes.isEmpty()) { return true; diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java index d5028d4..470aae8 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderR4.java @@ -12,6 +12,7 @@ import org.opencds.cqf.cql.engine.runtime.DateTime; import org.opencds.cqf.cql.engine.runtime.Interval; import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; +import org.opencds.cqf.cql.evaluator.execution.util.CodeUtil; import java.util.*; @@ -19,10 +20,12 @@ public class PrefetchDataProviderR4 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; private FhirModelResolver resolver; + private CodeUtil codeUtil; public PrefetchDataProviderR4(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); this.resolver = new R4FhirModelResolver(); + this.codeUtil = new CodeUtil(this.resolver.getFhirContext()); } @Override @@ -114,7 +117,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getR4Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.codeUtil); } } diff --git a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java index b646ac3..1508e9e 100644 --- a/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java +++ b/src/main/java/org/opencds/cqf/cds/providers/PrefetchDataProviderStu3.java @@ -12,6 +12,7 @@ import org.opencds.cqf.cql.engine.runtime.DateTime; import org.opencds.cqf.cql.engine.runtime.Interval; import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; +import org.opencds.cqf.cql.evaluator.execution.util.CodeUtil; import java.util.*; @@ -19,10 +20,12 @@ public class PrefetchDataProviderStu3 extends TerminologyAwareRetrieveProvider { private Map> prefetchResources; private FhirModelResolver resolver; + private CodeUtil codeUtil; public PrefetchDataProviderStu3(List resources) { prefetchResources = PrefetchDataProviderHelper.populateMap(resources); this.resolver = new Dstu3FhirModelResolver(); + this.codeUtil = new CodeUtil(this.resolver.getFhirContext()); } @Override @@ -114,7 +117,7 @@ else if (dateInterval != null if (codes != null) { Object codeObject = PrefetchDataProviderHelper .getStu3Code(this.resolver.resolvePath(resource, codePath)); - includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.resolver.getFhirContext()); + includeResource = PrefetchDataProviderHelper.checkCodeMembership(codes, codeObject, this.codeUtil); } } From 18547db8d0ea6886f845fffbda7d99c3e06156cc Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Sat, 12 Sep 2020 18:24:40 -0600 Subject: [PATCH 13/15] Add seperate room for build failures --- .travis.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 136a8de..4569677 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,5 +34,11 @@ before_cache: - rm -rf $HOME/.m2/repository/org/opencds/cqf/cds notifications: slack: - rooms: - secure: ECKEk6sCGWP0IdlKx8cW7JMuD5Z9UsrpIa+gcHFyYHTly0ExTAaGAFFbFI3h1hnLdVqlUDhP5F65VXurEJ430Z9nF9Eb5oy+2Evhur5S0jWiHwak8Yf7MAkhf3waAWPtft4I0imMmMHgBSMI9R9VLjCiyhhS90OQpN7giDK0uo6AovijN+UelkZUNMH+6mQS9c1q5BXqoFU90hCCX5VUPPGXAXW535ZadNTd3b284MFVmLxik+p+hg+FxjI5utAA5o5f9uxxAtEBkDgM9vxyDRKKi4rMvNG12YZ/e20RiFJwPcsUA4uuaWqAJP8J9OHRTfrbGbFUDCTaSUp8CZcS/ydoaZBb0BYhF33U19aqYTovdcKzoCmWs5csoEHeFqjKYKyBc6dZcj3sZ1C2HOoz+Hb7uqRAAfi0N+kxTR2j/h1eAPS/28np1Uh1nSuVNx1h3OwCms0fDBNANRcpXOhfI01aV7Zx0HSu4fO9Gek6fJ4mB6eK47cO0H8O9F6px1WtPvaEoCXPoaCCO5QLI+OM/WX+Vj+iYE+3Z/FBBwcTgVrrHc5GFW5SPttr01qKGjkee5VBUkPTL9zr2tvavZYzJ9V25gvCta5ZXDGyLjfW7HoB6dOh9sDpQTzMUnb2AiYKLztEaotQwJRX6Se8ASHpkzbkwMszzmpta2qR1uvsrhE= + - rooms: + - secure: ECKEk6sCGWP0IdlKx8cW7JMuD5Z9UsrpIa+gcHFyYHTly0ExTAaGAFFbFI3h1hnLdVqlUDhP5F65VXurEJ430Z9nF9Eb5oy+2Evhur5S0jWiHwak8Yf7MAkhf3waAWPtft4I0imMmMHgBSMI9R9VLjCiyhhS90OQpN7giDK0uo6AovijN+UelkZUNMH+6mQS9c1q5BXqoFU90hCCX5VUPPGXAXW535ZadNTd3b284MFVmLxik+p+hg+FxjI5utAA5o5f9uxxAtEBkDgM9vxyDRKKi4rMvNG12YZ/e20RiFJwPcsUA4uuaWqAJP8J9OHRTfrbGbFUDCTaSUp8CZcS/ydoaZBb0BYhF33U19aqYTovdcKzoCmWs5csoEHeFqjKYKyBc6dZcj3sZ1C2HOoz+Hb7uqRAAfi0N+kxTR2j/h1eAPS/28np1Uh1nSuVNx1h3OwCms0fDBNANRcpXOhfI01aV7Zx0HSu4fO9Gek6fJ4mB6eK47cO0H8O9F6px1WtPvaEoCXPoaCCO5QLI+OM/WX+Vj+iYE+3Z/FBBwcTgVrrHc5GFW5SPttr01qKGjkee5VBUkPTL9zr2tvavZYzJ9V25gvCta5ZXDGyLjfW7HoB6dOh9sDpQTzMUnb2AiYKLztEaotQwJRX6Se8ASHpkzbkwMszzmpta2qR1uvsrhE= + on_success: always + on_failure: never + - rooms: + - secure: mtnhu2EQGqxdfEAZ0IpVEzRlFTKwNcGM88YGWmeiSVnmFZJuJfzGxM5bziJMTc+5R3nZcg2fuDyHeSIApLRXsBlQnmuh9TZZMWhDnBDmcd3ead7c8/8/6ap6pSEYhDPtLP4oQ+a7txutd51mGxL1zCPb43RAK573sO9n1e7ujMWsz7IZN6xyd7aHWyTjHTBt83b3gsc6KRdzXRr/1+sYxQQJ21HKtaIdfUCij+HkchwxMTtTZtQbwqbu07j3nyeBEwZhadThVu8bw48ORQuiUUAtUkp9cI5yjGiXhofGiRq5ZAw6qzesdGuT5YhVXd28b4Ljpb0dMNJVAMVspigIFnk1bh6V9c45ZaT6uyudLocHuOKWQKRSt6ntA4/wjU8ubuKb5OEE9s7SD5cddwyz6aoT11qenni2ZD7tJBYrZHTCsATIYwUWZI1IkNC0BqYR0VmCogRDo5ihALCBxlHPNeWIYj0H3Byf+8OuvBQnSrWRDQLRP/GgVjmq80fgUrPzJjGBTcv9xwRd6BQZ+rtpbK/ldPWM3VW/JNXfKwqHBQlEsuv8Id9H5TpfkJkDx57ae8lzB/5ryhAVDbn0JQvxz24r3drECK9vV6An9N4l5vWCJv+qwGttEniWRY8vNdoJnFz00b8WOd23Q1E4ztIXC0c24/amL++t6oZMqNdnik0= + on_success: never + on_failure: always \ No newline at end of file From ca4b16446764bc32d1201c20abcda3ebdaf76fe9 Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Wed, 16 Sep 2020 21:53:37 -0600 Subject: [PATCH 14/15] Experiments --- .travis.yml | 2 +- scripts/install.sh | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) create mode 100755 scripts/install.sh diff --git a/.travis.yml b/.travis.yml index 4569677..7fc890b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,7 +7,7 @@ cache: directories: - "$HOME/.m2/repository" install: -- mvn install -U -DskipTests=true -Dmaven.javadoc.skip=true -B -V +- ./scripts/install.sh script: - if [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B -P release; fi - if ! [[ "$TRAVIS_BRANCH" =~ master* ]]; then mvn test -B; fi diff --git a/scripts/install.sh b/scripts/install.sh new file mode 100755 index 0000000..117c140 --- /dev/null +++ b/scripts/install.sh @@ -0,0 +1,2 @@ +#!/bin/bash +mvn install -U -DskipTests=true -Dmaven.javadoc.skip=true -B -V \ No newline at end of file From 8936fffea0b71e81cd987c01aaff1fefd1852c44 Mon Sep 17 00:00:00 2001 From: Jonathan Percival Date: Wed, 30 Sep 2020 16:17:44 -0600 Subject: [PATCH 15/15] Prep for release 1.3.0 --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 42c861f..eb425d8 100644 --- a/pom.xml +++ b/pom.xml @@ -17,8 +17,8 @@ UTF-8 UTF-8 - 1.5.0-SNAPSHOT - 1.0.0-SNAPSHOT + 1.5.0 + 1.0.0 cds-hooks