diff --git a/hapi-fhir-serviceloaders/hapi-fhir-caching-guava/pom.xml b/hapi-fhir-serviceloaders/hapi-fhir-caching-guava/pom.xml
index 4f9fdfb83b6..083fd428a66 100644
--- a/hapi-fhir-serviceloaders/hapi-fhir-caching-guava/pom.xml
+++ b/hapi-fhir-serviceloaders/hapi-fhir-caching-guava/pom.xml
@@ -7,7 +7,7 @@
hapi-fhir-serviceloaders
ca.uhn.hapi.fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../pom.xml
diff --git a/hapi-fhir-serviceloaders/hapi-fhir-caching-testing/pom.xml b/hapi-fhir-serviceloaders/hapi-fhir-caching-testing/pom.xml
index de69a46093b..d76aaae39a5 100644
--- a/hapi-fhir-serviceloaders/hapi-fhir-caching-testing/pom.xml
+++ b/hapi-fhir-serviceloaders/hapi-fhir-caching-testing/pom.xml
@@ -7,7 +7,7 @@
hapi-fhir
ca.uhn.hapi.fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../pom.xml
diff --git a/hapi-fhir-serviceloaders/pom.xml b/hapi-fhir-serviceloaders/pom.xml
index fa62b23b455..d8b0ef67672 100644
--- a/hapi-fhir-serviceloaders/pom.xml
+++ b/hapi-fhir-serviceloaders/pom.xml
@@ -5,7 +5,7 @@
hapi-deployable-pom
ca.uhn.hapi.fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-autoconfigure/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-autoconfigure/pom.xml
index ca4923acca7..a36a8106d02 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-autoconfigure/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-autoconfigure/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-apache/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-apache/pom.xml
index 97d0fef42d6..5ab1e07f34c 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-apache/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-apache/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir-spring-boot-samples
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
hapi-fhir-spring-boot-sample-client-apache
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-okhttp/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-okhttp/pom.xml
index d43c0903312..89e66d269d4 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-okhttp/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-client-okhttp/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir-spring-boot-samples
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-server-jersey/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-server-jersey/pom.xml
index f50c94f7006..9ab88bfcc86 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-server-jersey/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/hapi-fhir-spring-boot-sample-server-jersey/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir-spring-boot-samples
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/pom.xml
index 756142f7b57..a3c882ef6b6 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-samples/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir-spring-boot
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
diff --git a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-starter/pom.xml b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-starter/pom.xml
index c87a70f6b22..65d782703f7 100644
--- a/hapi-fhir-spring-boot/hapi-fhir-spring-boot-starter/pom.xml
+++ b/hapi-fhir-spring-boot/hapi-fhir-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-spring-boot/pom.xml b/hapi-fhir-spring-boot/pom.xml
index 4bdab3c0201..7c12175c3ba 100644
--- a/hapi-fhir-spring-boot/pom.xml
+++ b/hapi-fhir-spring-boot/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../pom.xml
diff --git a/hapi-fhir-sql-migrate/pom.xml b/hapi-fhir-sql-migrate/pom.xml
index 179e3f7323d..dee88ccf8b7 100644
--- a/hapi-fhir-sql-migrate/pom.xml
+++ b/hapi-fhir-sql-migrate/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-batch2-jobs/pom.xml b/hapi-fhir-storage-batch2-jobs/pom.xml
index 15cb3b2e512..d5db154e318 100644
--- a/hapi-fhir-storage-batch2-jobs/pom.xml
+++ b/hapi-fhir-storage-batch2-jobs/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-batch2-test-utilities/pom.xml b/hapi-fhir-storage-batch2-test-utilities/pom.xml
index c54f3431689..c06a923d4dd 100644
--- a/hapi-fhir-storage-batch2-test-utilities/pom.xml
+++ b/hapi-fhir-storage-batch2-test-utilities/pom.xml
@@ -7,7 +7,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-batch2/pom.xml b/hapi-fhir-storage-batch2/pom.xml
index d6d96153e10..91f34741c1f 100644
--- a/hapi-fhir-storage-batch2/pom.xml
+++ b/hapi-fhir-storage-batch2/pom.xml
@@ -7,7 +7,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-cr/pom.xml b/hapi-fhir-storage-cr/pom.xml
index d2744f52f89..49893d00f35 100644
--- a/hapi-fhir-storage-cr/pom.xml
+++ b/hapi-fhir-storage-cr/pom.xml
@@ -7,7 +7,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/config/r4/CrR4Config.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/config/r4/CrR4Config.java
index f08743d7909..19466eba19b 100644
--- a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/config/r4/CrR4Config.java
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/config/r4/CrR4Config.java
@@ -26,13 +26,17 @@ import ca.uhn.fhir.cr.config.ProviderLoader;
import ca.uhn.fhir.cr.config.ProviderSelector;
import ca.uhn.fhir.cr.config.RepositoryConfig;
import ca.uhn.fhir.cr.r4.ICareGapsServiceFactory;
+import ca.uhn.fhir.cr.r4.ICollectDataServiceFactory;
import ca.uhn.fhir.cr.r4.ICqlExecutionServiceFactory;
+import ca.uhn.fhir.cr.r4.IDataRequirementsServiceFactory;
import ca.uhn.fhir.cr.r4.ILibraryEvaluationServiceFactory;
import ca.uhn.fhir.cr.r4.IMeasureServiceFactory;
import ca.uhn.fhir.cr.r4.ISubmitDataProcessorFactory;
import ca.uhn.fhir.cr.r4.cpg.CqlExecutionOperationProvider;
import ca.uhn.fhir.cr.r4.cpg.LibraryEvaluationOperationProvider;
import ca.uhn.fhir.cr.r4.measure.CareGapsOperationProvider;
+import ca.uhn.fhir.cr.r4.measure.CollectDataOperationProvider;
+import ca.uhn.fhir.cr.r4.measure.DataRequirementsOperationProvider;
import ca.uhn.fhir.cr.r4.measure.MeasureOperationsProvider;
import ca.uhn.fhir.cr.r4.measure.SubmitDataProvider;
import ca.uhn.fhir.rest.server.RestfulServer;
@@ -42,6 +46,8 @@ import org.opencds.cqf.fhir.cr.cpg.r4.R4LibraryEvaluationService;
import org.opencds.cqf.fhir.cr.measure.CareGapsProperties;
import org.opencds.cqf.fhir.cr.measure.MeasureEvaluationOptions;
import org.opencds.cqf.fhir.cr.measure.r4.R4CareGapsService;
+import org.opencds.cqf.fhir.cr.measure.r4.R4CollectDataService;
+import org.opencds.cqf.fhir.cr.measure.r4.R4DataRequirementsService;
import org.opencds.cqf.fhir.cr.measure.r4.R4MeasureService;
import org.opencds.cqf.fhir.cr.measure.r4.R4SubmitDataService;
import org.springframework.beans.factory.annotation.Qualifier;
@@ -86,6 +92,28 @@ public class CrR4Config {
return new CqlExecutionOperationProvider();
}
+ @Bean
+ CollectDataOperationProvider r4CollectDataOperationProvider() {
+ return new CollectDataOperationProvider();
+ }
+
+ @Bean
+ ICollectDataServiceFactory collectDataServiceFactory(
+ IRepositoryFactory theRepositoryFactory, MeasureEvaluationOptions theMeasureEvaluationOptions) {
+ return rd -> new R4CollectDataService(theRepositoryFactory.create(rd), theMeasureEvaluationOptions);
+ }
+
+ @Bean
+ DataRequirementsOperationProvider r4DataRequirementsOperationProvider() {
+ return new DataRequirementsOperationProvider();
+ }
+
+ @Bean
+ IDataRequirementsServiceFactory dataRequirementsServiceFactory(
+ IRepositoryFactory theRepositoryFactory, MeasureEvaluationOptions theMeasureEvaluationOptions) {
+ return rd -> new R4DataRequirementsService(theRepositoryFactory.create(rd), theMeasureEvaluationOptions);
+ }
+
@Bean
LibraryEvaluationOperationProvider r4LibraryEvaluationOperationProvider() {
return new LibraryEvaluationOperationProvider();
@@ -132,7 +160,9 @@ public class CrR4Config {
SubmitDataProvider.class,
CareGapsOperationProvider.class,
CqlExecutionOperationProvider.class,
- LibraryEvaluationOperationProvider.class)));
+ LibraryEvaluationOperationProvider.class,
+ CollectDataOperationProvider.class,
+ DataRequirementsOperationProvider.class)));
return new ProviderLoader(theRestfulServer, theApplicationContext, selector);
}
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/ICollectDataServiceFactory.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/ICollectDataServiceFactory.java
new file mode 100644
index 00000000000..fcd883576bf
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/ICollectDataServiceFactory.java
@@ -0,0 +1,9 @@
+package ca.uhn.fhir.cr.r4;
+
+import ca.uhn.fhir.rest.api.server.RequestDetails;
+import org.opencds.cqf.fhir.cr.measure.r4.R4CollectDataService;
+
+@FunctionalInterface
+public interface ICollectDataServiceFactory {
+ R4CollectDataService create(RequestDetails theRequestDetails);
+}
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/IDataRequirementsServiceFactory.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/IDataRequirementsServiceFactory.java
new file mode 100644
index 00000000000..f5de302cd97
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/IDataRequirementsServiceFactory.java
@@ -0,0 +1,9 @@
+package ca.uhn.fhir.cr.r4;
+
+import ca.uhn.fhir.rest.api.server.RequestDetails;
+import org.opencds.cqf.fhir.cr.measure.r4.R4DataRequirementsService;
+
+@FunctionalInterface
+public interface IDataRequirementsServiceFactory {
+ R4DataRequirementsService create(RequestDetails theRequestDetails);
+}
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/cpg/CqlExecutionOperationProvider.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/cpg/CqlExecutionOperationProvider.java
index ba2d0c36b7f..bf0c6c6f958 100644
--- a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/cpg/CqlExecutionOperationProvider.java
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/cpg/CqlExecutionOperationProvider.java
@@ -113,7 +113,7 @@ public class CqlExecutionOperationProvider {
* is a CQL system-defined or FHIR-defined type, the result is returned
* as a {@link Parameters} Parameters resource
*/
- @Operation(name = ProviderConstants.CR_OPERATION_CQL)
+ @Operation(name = ProviderConstants.CR_OPERATION_CQL, idempotent = true)
@Description(
shortDefinition = "$cql",
value =
@@ -145,6 +145,6 @@ public class CqlExecutionOperationProvider {
theDataEndpoint,
theContentEndpoint,
theTerminologyEndpoint,
- null);
+ theContent);
}
}
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/CollectDataOperationProvider.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/CollectDataOperationProvider.java
new file mode 100644
index 00000000000..bdaec6cc8ac
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/CollectDataOperationProvider.java
@@ -0,0 +1,56 @@
+package ca.uhn.fhir.cr.r4.measure;
+
+import ca.uhn.fhir.cr.r4.ICollectDataServiceFactory;
+import ca.uhn.fhir.model.api.annotation.Description;
+import ca.uhn.fhir.rest.annotation.IdParam;
+import ca.uhn.fhir.rest.annotation.Operation;
+import ca.uhn.fhir.rest.annotation.OperationParam;
+import ca.uhn.fhir.rest.api.server.RequestDetails;
+import ca.uhn.fhir.rest.server.provider.ProviderConstants;
+import org.hl7.fhir.r4.model.IdType;
+import org.hl7.fhir.r4.model.Measure;
+import org.hl7.fhir.r4.model.Parameters;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class CollectDataOperationProvider {
+ @Autowired
+ ICollectDataServiceFactory myR4CollectDataServiceFactory;
+ /**
+ * Implements the $collect-data
+ * operation found in the
+ * FHIR Clinical
+ * Reasoning Module.
+ *
+ *
+ * Returns a set of parameters with the generated MeasureReport and the
+ * resources that were used during the Measure evaluation
+ *
+ * @param theRequestDetails generally auto-populated by the HAPI server
+ * framework.
+ * @param theId the Id of the Measure to sub data for
+ * @param thePeriodStart The start of the reporting period
+ * @param thePeriodEnd The end of the reporting period
+ * @param theSubject the subject to use for the evaluation
+ * @param thePractitioner the practitioner to use for the evaluation
+ *
+ * @return Parameters the parameters containing the MeasureReport and the
+ * evaluated Resources
+ */
+ @Description(
+ shortDefinition = "$collect-data",
+ value =
+ "Implements the $collect-data operation found in the FHIR Clinical Reasoning Module.")
+ @Operation(name = ProviderConstants.CR_OPERATION_COLLECTDATA, idempotent = true, type = Measure.class)
+ public Parameters collectData(
+ @IdParam IdType theId,
+ @OperationParam(name = "periodStart") String thePeriodStart,
+ @OperationParam(name = "periodEnd") String thePeriodEnd,
+ @OperationParam(name = "subject") String theSubject,
+ @OperationParam(name = "practitioner") String thePractitioner,
+ RequestDetails theRequestDetails) {
+ return myR4CollectDataServiceFactory
+ .create(theRequestDetails)
+ .collectData(theId, thePeriodStart, thePeriodEnd, theSubject, thePractitioner);
+ }
+}
diff --git a/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/DataRequirementsOperationProvider.java b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/DataRequirementsOperationProvider.java
new file mode 100644
index 00000000000..9c801d91d39
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/main/java/ca/uhn/fhir/cr/r4/measure/DataRequirementsOperationProvider.java
@@ -0,0 +1,42 @@
+package ca.uhn.fhir.cr.r4.measure;
+
+import ca.uhn.fhir.cr.r4.IDataRequirementsServiceFactory;
+import ca.uhn.fhir.rest.annotation.IdParam;
+import ca.uhn.fhir.rest.annotation.Operation;
+import ca.uhn.fhir.rest.annotation.OperationParam;
+import ca.uhn.fhir.rest.api.server.RequestDetails;
+import ca.uhn.fhir.rest.server.provider.ProviderConstants;
+import org.hl7.fhir.r4.model.IdType;
+import org.hl7.fhir.r4.model.Library;
+import org.hl7.fhir.r4.model.Measure;
+import org.springframework.beans.factory.annotation.Autowired;
+
+public class DataRequirementsOperationProvider {
+ @Autowired
+ IDataRequirementsServiceFactory myR4DataRequirementsServiceFactory;
+ /**
+ * Implements the $evaluate-measure
+ * operation found in the
+ * FHIR Clinical
+ * Reasoning Module. This implementation aims to be compatible with the CQF
+ * IG.
+ *
+ * @param theId the id of the Measure to evaluate
+ * @param thePeriodStart The start of the reporting period
+ * @param thePeriodEnd The end of the reporting period
+ * @param theRequestDetails The details (such as tenant) of this request. Usually
+ * autopopulated HAPI.
+ * @return the calculated Library dataRequirements
+ */
+ @Operation(name = ProviderConstants.CR_OPERATION_DATAREQUIREMENTS, idempotent = true, type = Measure.class)
+ public Library dataRequirements(
+ @IdParam IdType theId,
+ @OperationParam(name = "periodStart") String thePeriodStart,
+ @OperationParam(name = "periodEnd") String thePeriodEnd,
+ RequestDetails theRequestDetails) {
+ return myR4DataRequirementsServiceFactory
+ .create(theRequestDetails)
+ .dataRequirements(theId, thePeriodStart, thePeriodEnd);
+ }
+}
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CollectDataTest.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CollectDataTest.java
new file mode 100644
index 00000000000..f85dcced5f9
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CollectDataTest.java
@@ -0,0 +1,73 @@
+package ca.uhn.fhir.cr.r4;
+
+import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
+import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
+import ca.uhn.fhir.rest.server.provider.ProviderConstants;
+import org.hl7.fhir.r4.model.DateType;
+import org.hl7.fhir.r4.model.Parameters;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(SpringExtension.class)
+public class CollectDataTest extends BaseCrR4TestServer{
+ public Parameters runCollectData(String thePeriodStart, String thePeriodEnd, String theMeasureId, String theSubject, String thePractitioner){
+
+ var parametersEval = new Parameters();
+ parametersEval.addParameter("periodStart", new DateType(thePeriodStart));
+ parametersEval.addParameter("periodEnd", new DateType(thePeriodEnd));
+ parametersEval.addParameter("practitioner", thePractitioner);
+ parametersEval.addParameter("subject", theSubject);
+
+
+ var report = ourClient.operation().onInstance("Measure/" + theMeasureId)
+ .named(ProviderConstants.CR_OPERATION_COLLECTDATA)
+ .withParameters(parametersEval)
+ .returnResourceType(Parameters.class)
+ .execute();
+
+ return report;
+ }
+ @Test
+ void testMeasureDataRequirements() {
+ loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
+ var reportAllSubjects = runCollectData("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR", null, null);
+ Assertions.assertFalse(reportAllSubjects.getParameter().isEmpty());
+ // use same loaded bundle for all tests
+ testCollectDataSubject();
+ testCollectDataGroup();
+ testCollectDataPractitioner();
+ testCollectDataInvalidInterval();
+ testCollectDataInvalidMeasure();
+ }
+
+ void testCollectDataSubject() {
+ var report = runCollectData("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR", "Patient/numer-EXM130", null);
+ Assertions.assertFalse(report.getParameter().isEmpty());
+ }
+
+
+ void testCollectDataGroup() {
+ var report = runCollectData("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR", "Group/group-EXM130", null);
+ Assertions.assertFalse(report.getParameter().isEmpty());
+ }
+
+
+ void testCollectDataPractitioner() {
+ var report = runCollectData("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR", null, "Practitioner/practitioner-EXM130");
+ Assertions.assertFalse(report.getParameter().isEmpty());
+ }
+
+
+ void testCollectDataInvalidInterval() {
+ assertThrows(InternalErrorException.class, ()->runCollectData("2020-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR", null, null));
+ }
+
+
+ void testCollectDataInvalidMeasure() {
+ assertThrows(ResourceNotFoundException.class, ()->runCollectData("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHI", null, null));
+ }
+}
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CpgOperationProviderTest.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CpgOperationProviderTest.java
index 9f56c02ba2f..6f437157c17 100644
--- a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CpgOperationProviderTest.java
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/CpgOperationProviderTest.java
@@ -30,23 +30,37 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
public class CpgOperationProviderTest extends BaseCrR4TestServer{
@BeforeEach
void setup() {
- var reqDeets = setupRequestDetails();
- loadResource(Library.class, "SimpleR4Library.json", reqDeets);
- loadResource(Patient.class, "SimplePatient.json", reqDeets);
- loadResource(Observation.class, "SimpleObservation.json", reqDeets);
- loadResource(Condition.class, "SimpleCondition.json", reqDeets);
+ var requestDetails = setupRequestDetails();
+ loadResource(Library.class, "SimpleR4Library.json", requestDetails);
+ loadResource(Patient.class, "SimplePatient.json", requestDetails);
+ loadResource(Observation.class, "SimpleObservation.json", requestDetails);
+ loadResource(Condition.class, "SimpleCondition.json", requestDetails);
+ }
+ @Test
+ void cpgProviderTest(){
+ // reuse loaded resources for all tests
+ assertTrue(cqlExecutionProviderTestSimpleDate());
+ cqlExecutionProviderTestSimpleArithmetic();
+ evaluateLibraryProviderTestLibraryWithSubject();
+ evaluateLibraryProviderTestSimpleExpression();
+ cqlExecutionProviderTestReferencedLibrary();
+ cqlExecutionProviderTestDataBundle();
+ cqlExecutionProviderTestDataBundleWithSubject();
+ cqlExecutionProviderTestSimpleParameters();
+ cqlExecutionProviderTestExpression();
+ cqlExecutionProviderTestErrorExpression();
}
- @Test
- void cqlExecutionProvider_testSimpleDate() {
+
+ private Boolean cqlExecutionProviderTestSimpleDate() {
// execute cql expression on date interval
Parameters params = parameters(stringPart("expression", "Interval[Today() - 2 years, Today())"));
Parameters results = runCqlExecution(params);
- assertTrue(results.getParameter("return").getValue() instanceof Period);
+ return results.getParameter("return").getValue() instanceof Period;
}
- @Test
- void cqlExecutionProvider_testSimpleArithmetic() {
+
+ void cqlExecutionProviderTestSimpleArithmetic() {
// execute simple cql expression
Parameters params = parameters(stringPart("expression", "5 * 5"));
Parameters results = runCqlExecution(params);
@@ -54,8 +68,7 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertEquals("25", ((IntegerType) results.getParameter("return").getValue()).asStringValue());
}
- @Test
- void evaluateLibraryProvider_testLibraryWithSubject() {
+ void evaluateLibraryProviderTestLibraryWithSubject() {
// evaluate library resource for a subject
var params = new Parameters();
params.addParameter("subject", new StringType("Patient/SimplePatient"));
@@ -71,8 +84,8 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(((BooleanType) report.getParameter("Denominator").getValue()).booleanValue());
}
- @Test
- void evaluateLibraryProvider_testSimpleExpression() {
+
+ void evaluateLibraryProviderTestSimpleExpression() {
// evaluate expression for subject from specified library resource
var params = new Parameters();
params.addParameter("subject", new StringType("Patient/SimplePatient"));
@@ -84,8 +97,7 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(((BooleanType) report.getParameter("Numerator").getValue()).booleanValue());
}
- @Test
- void cqlExecutionProvider_testReferencedLibrary() {
+ void cqlExecutionProviderTestReferencedLibrary() {
// execute cql expression from referenced library on subject
Parameters libraryParameter = parameters(
canonicalPart("url", ourClient.getServerBase() + "/Library/SimpleR4Library|0.0.1"),
@@ -100,8 +112,7 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(((BooleanType) results.getParameter("return").getValue()).booleanValue());
}
- @Test
- void cqlExecutionProvider_testDataBundle() {
+ void cqlExecutionProviderTestDataBundle() {
// execute cql expression from library over data from bundle with no subject
Parameters libraryParameter = parameters(
canonicalPart("url", ourClient.getServerBase() + "/Library/SimpleR4Library"),
@@ -118,8 +129,8 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(results.getParameter().get(0).getResource() instanceof Observation);
}
- @Test
- void cqlExecutionProvider_testDataBundleWithSubject() {
+
+ void cqlExecutionProviderTestDataBundleWithSubject() {
// execute cql expression from library over data from bundle with subject
Parameters libraryParameter = parameters(
canonicalPart("url", ourClient.getServerBase() + "/Library/SimpleR4Library"),
@@ -135,8 +146,8 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(results.getParameter().get(0).getResource() instanceof Observation);
}
- @Test
- void cqlExecutionProvider_testSimpleParameters() {
+
+ void cqlExecutionProviderTestSimpleParameters() {
// execute inline cql date expression with input valuemv
Parameters evaluationParams = parameters(
datePart("%inputDate", "2019-11-01"));
@@ -148,8 +159,7 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(((BooleanType) results.getParameter("return").getValue()).booleanValue());
}
- @Test
- void cqlExecutionProvider_testExpression() {
+ void cqlExecutionProviderTestExpression() {
// execute cql expression from referenced library
Parameters libraryParameter = parameters(
canonicalPart("url", ourClient.getServerBase() + "/Library/SimpleR4Library"),
@@ -168,8 +178,7 @@ public class CpgOperationProviderTest extends BaseCrR4TestServer{
assertTrue(((BooleanType) results.getParameter("return").getValue()).booleanValue());
}
- @Test
- void cqlExecutionProvider_testErrorExpression() {
+ void cqlExecutionProviderTestErrorExpression() {
// execute invalid cql expression
Parameters params = parameters(stringPart("expression", "Interval[1,5]"));
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/DataRequirementsTest.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/DataRequirementsTest.java
new file mode 100644
index 00000000000..1baf2ea012d
--- /dev/null
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/DataRequirementsTest.java
@@ -0,0 +1,49 @@
+package ca.uhn.fhir.cr.r4;
+
+import ca.uhn.fhir.rest.server.exceptions.InternalErrorException;
+import ca.uhn.fhir.rest.server.exceptions.ResourceNotFoundException;
+import ca.uhn.fhir.rest.server.provider.ProviderConstants;
+import org.hl7.fhir.r4.model.DateType;
+import org.hl7.fhir.r4.model.Library;
+import org.hl7.fhir.r4.model.Parameters;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+@ExtendWith(SpringExtension.class)
+public class DataRequirementsTest extends BaseCrR4TestServer{
+ public Library runDataRequirements(String periodStart, String periodEnd, String measureId){
+
+ var parametersEval = new Parameters();
+ parametersEval.addParameter("periodStart", new DateType(periodStart));
+ parametersEval.addParameter("periodEnd", new DateType(periodEnd));
+
+
+ var report = ourClient.operation().onInstance("Measure/" + measureId)
+ .named(ProviderConstants.CR_OPERATION_DATAREQUIREMENTS)
+ .withParameters(parametersEval)
+ .returnResourceType(Library.class)
+ .execute();
+
+ return report;
+
+ }
+ @Test
+ void testMeasureDataRequirements() {
+ loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
+ Assertions.assertFalse(runDataRequirements("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR").getDataRequirement().isEmpty());
+ testMeasureDataRequirementsInvalidInterval();
+ testMeasureDataRequirementsInvalidMeasure();
+ }
+ void testMeasureDataRequirementsInvalidInterval() {
+ assertThrows(InternalErrorException.class, ()->runDataRequirements("2020-01-01", "2019-12-31", "ColorectalCancerScreeningsFHIR"));
+ }
+
+ void testMeasureDataRequirementsInvalidMeasure() {
+ assertThrows(ResourceNotFoundException.class, ()->runDataRequirements("2019-01-01", "2019-12-31", "ColorectalCancerScreeningsFHI"));
+ }
+
+}
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/HapiFhirRepositoryR4Test.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/HapiFhirRepositoryR4Test.java
index dfb9bacb2d9..77e4a36414d 100644
--- a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/HapiFhirRepositoryR4Test.java
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/HapiFhirRepositoryR4Test.java
@@ -5,7 +5,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.*;
-import java.util.stream.Collectors;
import ca.uhn.fhir.rest.param.*;
import ca.uhn.fhir.rest.server.RestfulServer;
@@ -15,6 +14,7 @@ import org.hl7.fhir.r4.model.HumanName;
import org.hl7.fhir.r4.model.IdType;
import org.hl7.fhir.r4.model.Immunization;
import org.hl7.fhir.r4.model.Patient;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import ca.uhn.fhir.cr.repo.HapiFhirRepository;
@@ -28,13 +28,28 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
private static final String MY_TEST_DATA =
"ca/uhn/fhir/cr/r4/immunization/Patients_Encounters_Immunizations_Practitioners.json";
+ @BeforeEach
+ void setup() {
+ loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
+ loadBundle(MY_TEST_DATA);
+ }
@Test
- void crudTest() {
- var requestDetails = setupRequestDetails();
- //register repo
- //regster providers
- var repository = new HapiFhirRepository(myDaoRegistry, requestDetails, myRestfulServer);
- var result = repository
+ void repositoryTests(){
+ var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
+ //run repository tests
+ transactionReadsImmunizationResources(repository);
+ repositorySearchForEncounterWithMatchingCode(repository);
+ canSearchMoreThan50Patients(repository);
+ canSearchWithPagination(repository);
+ transactionReadsPatientResources(repository);
+ transactionReadsEncounterResources(repository);
+ assertTrue(crudTest(repository));
+ }
+
+
+ Boolean crudTest(HapiFhirRepository theRepository) {
+
+ var result = theRepository
.create(new Patient().addName(new HumanName().setFamily("Test").addGiven("Name1")));
assertEquals(true, result.getCreated());
var patient = (Patient) result.getResource();
@@ -42,64 +57,24 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
assertEquals("Test", patient.getName().get(0).getFamily());
assertEquals(1, patient.getName().get(0).getGiven().size());
patient.getName().get(0).addGiven("Name2");
- repository.update(patient);
- var updatedPatient = repository.read(Patient.class, patient.getIdElement());
+ theRepository.update(patient);
+ var updatedPatient = theRepository.read(Patient.class, patient.getIdElement());
assertEquals(2, updatedPatient.getName().get(0).getGiven().size());
- repository.delete(Patient.class, patient.getIdElement());
+ theRepository.delete(Patient.class, patient.getIdElement());
var ex = assertThrows(Exception.class,
- () -> repository.read(Patient.class, new IdType(patient.getIdElement().getIdPart())));
- assertTrue(ex.getMessage().contains("Resource was deleted"));
+ () -> theRepository.read(Patient.class, new IdType(patient.getIdElement().getIdPart())));
+ return ex.getMessage().contains("Resource was deleted");
}
- @Test
- void canSearchMoreThan50Patients() {
- loadBundle(MY_TEST_DATA);
- var expectedPatientCount = 63;
+ void canSearchMoreThan50Patients(HapiFhirRepository theRepository) {
+ var expectedPatientCount = 65;
ourPagingProvider.setMaximumPageSize(100);
- var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
// get all patient resources posted
- var result = repository.search(Bundle.class, Patient.class, withCountParam(100));
+ var result = theRepository.search(Bundle.class, Patient.class, withCountParam(100));
assertEquals(expectedPatientCount, result.getTotal());
// count all resources in result
int counter = 0;
- for (var e : result.getEntry()) {
- counter++;
- }
- // verify all patient resources captured
- assertEquals(expectedPatientCount, counter,
- "Patient search results don't match available resources");
- }
-
- @Test
- void canSearchWithPagination() {
- loadBundle(MY_TEST_DATA);
-
- var requestDetails = setupRequestDetails();
- var repository = new HapiFhirRepository(myDaoRegistry, requestDetails, myRestfulServer);
- var result = repository.search(Bundle.class, Patient.class, withCountParam(20));
- assertEquals(20, result.getEntry().size());
- var next = result.getLink().get(1);
- assertEquals("next", next.getRelation());
- var nextUrl = next.getUrl();
- var nextResult = repository.link(Bundle.class, nextUrl);
- assertEquals(20, nextResult.getEntry().size());
- assertEquals(false,
- result.getEntry().stream().map(e -> e.getResource().getIdPart()).anyMatch(
- i -> nextResult.getEntry().stream().map(e -> e.getResource().getIdPart())
- .collect(Collectors.toList()).contains(i)));
- }
-
- @Test
- void transactionReadsPatientResources() {
- var expectedPatientCount = 63;
- var theBundle = readResource(Bundle.class, MY_TEST_DATA);
- ourPagingProvider.setMaximumPageSize(100);
- var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
- repository.transaction(theBundle);
- var result = repository.search(Bundle.class, Patient.class, withCountParam(100));
- // count all resources in result
- int counter = 0;
for (Object i : result.getEntry()) {
counter++;
}
@@ -108,14 +83,41 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
"Patient search results don't match available resources");
}
- @Test
- void transactionReadsEncounterResources() {
- var expectedEncounterCount = 652;
- var theBundle = readResource(Bundle.class, MY_TEST_DATA);
+
+ void canSearchWithPagination(HapiFhirRepository theRepository) {
+
+ var result = theRepository.search(Bundle.class, Patient.class, withCountParam(20));
+ assertEquals(20, result.getEntry().size());
+ var next = result.getLink().get(1);
+ assertEquals("next", next.getRelation());
+ var nextUrl = next.getUrl();
+ var nextResult = theRepository.link(Bundle.class, nextUrl);
+ assertEquals(20, nextResult.getEntry().size());
+ assertEquals(false,
+ result.getEntry().stream().map(e -> e.getResource().getIdPart()).anyMatch(
+ i -> nextResult.getEntry().stream().map(e -> e.getResource().getIdPart())
+ .toList().contains(i)));
+ }
+
+
+ void transactionReadsPatientResources(HapiFhirRepository theRepository) {
+ var expectedPatientCount = 65;
+ ourPagingProvider.setMaximumPageSize(100);
+ var result = theRepository.search(Bundle.class, Patient.class, withCountParam(100));
+ // count all resources in result
+ int counter = 0;
+ for (Object i : result.getEntry()) {
+ counter++;
+ }
+ // verify all patient resources captured
+ assertEquals(expectedPatientCount, counter,
+ "Patient search results don't match available resources");
+ }
+
+ void transactionReadsEncounterResources(HapiFhirRepository theRepository) {
+ var expectedEncounterCount = 654;
ourPagingProvider.setMaximumPageSize(1000);
- var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
- repository.transaction(theBundle);
- var result = repository.search(Bundle.class, Encounter.class, withCountParam(1000));
+ var result = theRepository.search(Bundle.class, Encounter.class, withCountParam(1000));
// count all resources in result
int counter = 0;
for (Object i : result.getEntry()) {
@@ -125,10 +127,8 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
assertEquals(expectedEncounterCount, counter,
"Encounter search results don't match available resources");
}
-
- @Test
- void repositorySearchForEncounterWithMatchingCode() {
- loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
+
+ void repositorySearchForEncounterWithMatchingCode(HapiFhirRepository theRepository) {
//SearchConverter validation test for repository
List codeList = new ArrayList<>();
@@ -152,10 +152,8 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
// replicate repository searchParam list
Map> searchParams = Map.of("type", codeList, "subject", Collections.singletonList(new ReferenceParam("Patient/numer-EXM130")));
- var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
-
// replicate search for valueset codes
- var result = repository.search(Bundle.class, Encounter.class, searchParams);
+ var result = theRepository.search(Bundle.class, Encounter.class, searchParams);
// count all resources in result
int counter = 0;
@@ -166,15 +164,12 @@ public class HapiFhirRepositoryR4Test extends BaseCrR4TestServer {
assertEquals(1, counter,
"Encounter search results don't match available resources");
}
-
- @Test
- void transactionReadsImmunizationResources() {
+
+ void transactionReadsImmunizationResources(HapiFhirRepository theRepository) {
var expectedEncounterCount = 638;
- var theBundle = readResource(Bundle.class, MY_TEST_DATA);
ourPagingProvider.setMaximumPageSize(1000);
- var repository = new HapiFhirRepository(myDaoRegistry, setupRequestDetails(), myRestfulServer);
- repository.transaction(theBundle);
- var result = repository.search(Bundle.class, Immunization.class, withCountParam(1000));
+
+ var result = theRepository.search(Bundle.class, Immunization.class, withCountParam(1000));
// count all resources in result
int counter = 0;
for (Object i : result.getEntry()) {
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/MeasureOperationProviderTest.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/MeasureOperationProviderTest.java
index 1b4e9aa7a71..4a6ad5f6b06 100644
--- a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/MeasureOperationProviderTest.java
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/MeasureOperationProviderTest.java
@@ -7,6 +7,7 @@ import org.hl7.fhir.r4.model.MeasureReport;
import org.hl7.fhir.r4.model.Observation;
import org.hl7.fhir.r4.model.Parameters;
import org.hl7.fhir.r4.model.Resource;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
@@ -21,6 +22,27 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
@ExtendWith(SpringExtension.class)
class MeasureOperationProviderTest extends BaseCrR4TestServer {
+ @BeforeEach
+ void setup() {
+ // load resources
+ loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
+ loadBundle("Exm104FhirR4MeasureBundle.json");
+ loadBundle("ClientNonPatientBasedMeasureBundle.json");
+ loadBundle("multiversion/EXM124-7.0.000-bundle.json");
+ loadBundle("multiversion/EXM124-9.0.000-bundle.json");
+ loadBundle("largeValueSetMeasureTest-Bundle.json");
+ loadBundle("BCSEHEDISMY2022-bundle.json");
+ }
+ @Test
+ void runMeasureTests(){
+ // run tests
+ assertNotNull(testMeasureEvaluateExm130());
+ assertNotNull(testMeasureEvaluateExm104());
+ testClientNonPatientBasedMeasureEvaluate();
+ testMeasureEvaluateMultiVersion();
+ testLargeValuesetMeasure();
+ testHedis2022();
+ }
public MeasureReport runEvaluateMeasure(String periodStart, String periodEnd, String subject, String measureId, String reportType, String practitioner){
@@ -31,43 +53,96 @@ class MeasureOperationProviderTest extends BaseCrR4TestServer {
parametersEval.addParameter("reportType", reportType);
parametersEval.addParameter("subject", subject);
- var report = ourClient.operation().onInstance("Measure/" + measureId)
+ return ourClient.operation().onInstance("Measure/" + measureId)
.named(ProviderConstants.CR_OPERATION_EVALUATE_MEASURE)
.withParameters(parametersEval)
.returnResourceType(MeasureReport.class)
.execute();
-
- assertNotNull(report);
-
- return report;
+ }
+ MeasureReport testMeasureEvaluateExm130() {
+ return runEvaluateMeasure("2019-01-01", "2019-12-31", "Patient/numer-EXM130", "ColorectalCancerScreeningsFHIR", "Individual", null);
}
- @Test
- void testMeasureEvaluate_EXM130() {
- loadBundle("ColorectalCancerScreeningsFHIR-bundle.json");
- runEvaluateMeasure("2019-01-01", "2019-12-31", "Patient/numer-EXM130", "ColorectalCancerScreeningsFHIR", "Individual", null);
- }
- @Test
- void testMeasureEvaluate_EXM104() {
- loadBundle("Exm104FhirR4MeasureBundle.json");
- runEvaluateMeasure("2019-01-01", "2019-12-31", "Patient/numer-EXM104", "measure-EXM104-8.2.000", "Individual", null);
+ MeasureReport testMeasureEvaluateExm104() {
+ return runEvaluateMeasure("2019-01-01", "2019-12-31", "Patient/numer-EXM104", "measure-EXM104-8.2.000", "Individual", null);
}
+ void testHedis2022() {
+
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-5", 0, 0, 0, 0, false,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-7", 1, 1, 0, 0, true,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-9", 0, 0, 0, 0, true,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-21", 1, 0, 1, 0, true,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-23", 1, 1, 0, 0, true,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ runWithPatient("BCSEHEDISMY2022", "Patient/Patient-65", 1, 1, 0, 1, true,
+ "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
+ }
+
+ void testClientNonPatientBasedMeasureEvaluate() {
+
+ var measure = read(new IdType("Measure", "InitialInpatientPopulation"));
+ assertNotNull(measure);
+
+ var returnMeasureReport = runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/97f27374-8a5c-4aa1-a26f-5a1ab03caa47", "InitialInpatientPopulation", "Individual", null);
+
+
+ String populationName = "initial-population";
+ int expectedCount = 2;
+
+ Optional population = returnMeasureReport.getGroup().get(0)
+ .getPopulation().stream().filter(x -> x.hasCode() && x.getCode().hasCoding()
+ && x.getCode().getCoding().get(0).getCode().equals(populationName))
+ .findFirst();
+
+ assertTrue(population.isPresent(), String.format("Unable to locate a population with id \"%s\"", populationName));
+ assertEquals(population.get().getCount(), expectedCount,
+ String.format("expected count for population \"%s\" did not match", populationName));
+ }
+ void testMeasureEvaluateMultiVersion() {
+
+ assertNotNull(runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/numer-EXM124", "measure-EXM124-7.0.000", "Individual", null));
+ assertNotNull(runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/numer-EXM124", "measure-EXM124-9.0.000", "Individual", null));
+
+ }
+
+ void testLargeValuesetMeasure() throws NoSuchElementException {
+
+ var returnMeasureReport = runEvaluateMeasure("2023-01-01", "2024-01-01", null, "CMSTest", "population", null);
+
+ String populationName = "numerator";
+ int expectedCount = 1;
+
+ Optional population = returnMeasureReport.getGroup().get(0)
+ .getPopulation().stream().filter(x -> x.hasCode() && x.getCode().hasCoding()
+ && x.getCode().getCoding().get(0).getCode().equals(populationName))
+ .findFirst();
+ assertTrue(population.isPresent(), String.format("population \"%s\" not found in report", populationName));
+ assertEquals(
+ expectedCount,
+ population.get().getCount(),
+ String.format("expected count for population \"%s\" did not match", populationName)
+ );
+ }
private void runWithPatient(String measureId, String patientId, int initialPopulationCount, int denominatorCount,
- int denominatorExclusionCount, int numeratorCount, boolean enrolledDuringParticipationPeriod,
- String participationPeriod) {
+ int denominatorExclusionCount, int numeratorCount, boolean enrolledDuringParticipationPeriod,
+ String participationPeriod) {
var returnMeasureReport = runEvaluateMeasure("2022-01-01", "2022-12-31", patientId, measureId, "Individual", null);
for (MeasureReport.MeasureReportGroupPopulationComponent population : returnMeasureReport.getGroupFirstRep()
.getPopulation())
- switch (population.getCode().getCodingFirstRep().getCode()) {
- case "initial-population" -> assertEquals(initialPopulationCount, population.getCount());
- case "denominator" -> assertEquals(denominatorCount, population.getCount());
- case "denominator-exclusion" -> assertEquals(denominatorExclusionCount, population.getCount());
- case "numerator" -> assertEquals(numeratorCount, population.getCount());
- }
+ switch (population.getCode().getCodingFirstRep().getCode()) {
+ case "initial-population" -> assertEquals(initialPopulationCount, population.getCount());
+ case "denominator" -> assertEquals(denominatorCount, population.getCount());
+ case "denominator-exclusion" -> assertEquals(denominatorExclusionCount, population.getCount());
+ case "numerator" -> assertEquals(numeratorCount, population.getCount());
+ }
Observation enrolledDuringParticipationPeriodObs = null;
Observation participationPeriodObs = null;
@@ -88,76 +163,4 @@ class MeasureOperationProviderTest extends BaseCrR4TestServer {
assertNotNull(participationPeriodObs);
assertEquals(participationPeriod, participationPeriodObs.getValueCodeableConcept().getCodingFirstRep().getCode());
}
-
- @Test
- void testBCSEHEDISMY2022() {
- loadBundle("BCSEHEDISMY2022-bundle.json");
-
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-5", 0, 0, 0, 0, false,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-7", 1, 1, 0, 0, true,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-9", 0, 0, 0, 0, true,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-21", 1, 0, 1, 0, true,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-23", 1, 1, 0, 0, true,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- runWithPatient("BCSEHEDISMY2022", "Patient/Patient-65", 1, 1, 0, 1, true,
- "Interval[2020-10-01T00:00:00.000, 2022-12-31T23:59:59.999]");
- }
-
- @Test
- void testClientNonPatientBasedMeasureEvaluate() {
- this.loadBundle("ClientNonPatientBasedMeasureBundle.json");
-
- var measure = read(new IdType("Measure", "InitialInpatientPopulation"));
- assertNotNull(measure);
-
- var returnMeasureReport = runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/97f27374-8a5c-4aa1-a26f-5a1ab03caa47", "InitialInpatientPopulation", "Individual", null);
-
-
- String populationName = "initial-population";
- int expectedCount = 2;
-
- Optional population = returnMeasureReport.getGroup().get(0)
- .getPopulation().stream().filter(x -> x.hasCode() && x.getCode().hasCoding()
- && x.getCode().getCoding().get(0).getCode().equals(populationName))
- .findFirst();
-
- assertTrue(population.isPresent(), String.format("Unable to locate a population with id \"%s\"", populationName));
- assertEquals(population.get().getCount(), expectedCount,
- String.format("expected count for population \"%s\" did not match", populationName));
- }
-
- @Test
- void testMeasureEvaluateMultiVersion() {
- this.loadBundle("multiversion/EXM124-7.0.000-bundle.json");
- this.loadBundle("multiversion/EXM124-9.0.000-bundle.json");
-
- runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/numer-EXM124", "measure-EXM124-7.0.000", "Individual", null);
- runEvaluateMeasure("2019-01-01", "2020-01-01", "Patient/numer-EXM124", "measure-EXM124-9.0.000", "Individual", null);
-
- }
-
- @Test
- void testLargeValuesetMeasure() throws NoSuchElementException {
- this.loadBundle("largeValueSetMeasureTest-Bundle.json");
-
- var returnMeasureReport = runEvaluateMeasure("2023-01-01", "2024-01-01", null, "CMSTest", "population", null);
-
- String populationName = "numerator";
- int expectedCount = 1;
-
- Optional population = returnMeasureReport.getGroup().get(0)
- .getPopulation().stream().filter(x -> x.hasCode() && x.getCode().hasCoding()
- && x.getCode().getCoding().get(0).getCode().equals(populationName))
- .findFirst();
- assertTrue(population.isPresent(), String.format("population \"%s\" not found in report", populationName));
- assertEquals(
- expectedCount,
- population.get().getCount(),
- String.format("expected count for population \"%s\" did not match", populationName)
- );
- }
}
diff --git a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/TestCrR4Config.java b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/TestCrR4Config.java
index 09071d6ca64..e80eab49bc4 100644
--- a/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/TestCrR4Config.java
+++ b/hapi-fhir-storage-cr/src/test/java/ca/uhn/fhir/cr/r4/TestCrR4Config.java
@@ -4,7 +4,6 @@ import ca.uhn.fhir.cr.TestCqlProperties;
import ca.uhn.fhir.cr.TestCrConfig;
import ca.uhn.fhir.cr.common.CqlThreadFactory;
import ca.uhn.fhir.cr.config.r4.CrR4Config;
-import ca.uhn.fhir.rest.api.SearchStyleEnum;
import org.cqframework.cql.cql2elm.CqlCompilerOptions;
import org.cqframework.cql.cql2elm.model.CompiledLibrary;
import org.cqframework.cql.cql2elm.model.Model;
@@ -13,7 +12,6 @@ import org.hl7.elm.r1.VersionedIdentifier;
import org.opencds.cqf.cql.engine.execution.CqlEngine;
import org.opencds.cqf.cql.engine.runtime.Code;
import org.opencds.cqf.fhir.cql.EvaluationSettings;
-import org.opencds.cqf.fhir.cql.engine.retrieve.BaseRetrieveProvider;
import org.opencds.cqf.fhir.cql.engine.retrieve.RetrieveSettings;
import org.opencds.cqf.fhir.cql.engine.terminology.TerminologySettings;
import org.opencds.cqf.fhir.cr.measure.CareGapsProperties;
diff --git a/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json b/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json
index b48340e557e..96025856625 100644
--- a/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json
+++ b/hapi-fhir-storage-cr/src/test/resources/ColorectalCancerScreeningsFHIR-bundle.json
@@ -645,7 +645,7 @@
{
"type": "depends-on",
"display": "Code system SNOMEDCT:2017-09",
- "resource": "http://snomed.info/sct|http://snomed.info/sct/version/201709"
+ "resource": "http://snomed.info/sct/version/201709"
},
{
"type": "depends-on",
@@ -91120,7 +91120,7 @@
{
"type": "depends-on",
"display": "Code system SNOMEDCT:2017-09",
- "resource": "http://snomed.info/sct|http://snomed.info/sct/version/201709"
+ "resource": "http://snomed.info"
},
{
"type": "depends-on",
@@ -149191,13 +149191,46 @@
}
],
"gender": "male",
- "birthDate": "1965-01-01"
+ "birthDate": "1965-01-01",
+ "generalPractitioner":[
+ {"reference": "Practitioner/practitioner-EXM130"}
+ ]
},
"request": {
"method": "PUT",
"url": "Patient/numer-EXM130"
}
},
+ {"resource":{
+ "resourceType": "Group",
+ "id": "group-EXM130",
+ "type": "person",
+ "actual": true,
+ "member": [
+ { "entity": { "reference": "Patient/denom-EXM130" } },
+ { "entity": { "reference": "Patient/numer-EXM130" } },
+ { "entity": { "reference": "Patient/neg-ip-EXM130" } }
+ ]
+ },
+ "request": {
+ "method": "PUT",
+ "url": "Group/group-EXM130"
+ }
+ },
+ {"resource":{
+ "resourceType": "Practitioner",
+ "id": "practitioner-EXM130",
+ "name": [ {
+ "family": "Dawg",
+ "given": [ "Jay" ],
+ "prefix": [ "Dr" ]
+ } ]
+ },
+ "request": {
+ "method": "PUT",
+ "url": "Practitioner/practitioner-EXM130"
+ }
+ },
{
"resource": {
"resourceType": "ValueSet",
diff --git a/hapi-fhir-storage-mdm/pom.xml b/hapi-fhir-storage-mdm/pom.xml
index 6762591a2b9..df18f8b9d40 100644
--- a/hapi-fhir-storage-mdm/pom.xml
+++ b/hapi-fhir-storage-mdm/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage-test-utilities/pom.xml b/hapi-fhir-storage-test-utilities/pom.xml
index e62f8c7e2bf..d93b55c5cb6 100644
--- a/hapi-fhir-storage-test-utilities/pom.xml
+++ b/hapi-fhir-storage-test-utilities/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-storage/pom.xml b/hapi-fhir-storage/pom.xml
index 64d3e7c6c2e..5aea02bd8f2 100644
--- a/hapi-fhir-storage/pom.xml
+++ b/hapi-fhir-storage/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-dstu2.1/pom.xml b/hapi-fhir-structures-dstu2.1/pom.xml
index c93c2bdb158..e62996475ba 100644
--- a/hapi-fhir-structures-dstu2.1/pom.xml
+++ b/hapi-fhir-structures-dstu2.1/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-dstu2/pom.xml b/hapi-fhir-structures-dstu2/pom.xml
index 64485e7520e..7297607fc8a 100644
--- a/hapi-fhir-structures-dstu2/pom.xml
+++ b/hapi-fhir-structures-dstu2/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-dstu3/pom.xml b/hapi-fhir-structures-dstu3/pom.xml
index eaf3612ccd0..821380e7508 100644
--- a/hapi-fhir-structures-dstu3/pom.xml
+++ b/hapi-fhir-structures-dstu3/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-hl7org-dstu2/pom.xml b/hapi-fhir-structures-hl7org-dstu2/pom.xml
index cd303bde32e..88120888121 100644
--- a/hapi-fhir-structures-hl7org-dstu2/pom.xml
+++ b/hapi-fhir-structures-hl7org-dstu2/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-r4/pom.xml b/hapi-fhir-structures-r4/pom.xml
index f6ebdd3c94b..d0b3a4a6561 100644
--- a/hapi-fhir-structures-r4/pom.xml
+++ b/hapi-fhir-structures-r4/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-r4b/pom.xml b/hapi-fhir-structures-r4b/pom.xml
index 59edff2a9d6..26d6ce29e11 100644
--- a/hapi-fhir-structures-r4b/pom.xml
+++ b/hapi-fhir-structures-r4b/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-structures-r5/pom.xml b/hapi-fhir-structures-r5/pom.xml
index 813116ef724..0c68498f67c 100644
--- a/hapi-fhir-structures-r5/pom.xml
+++ b/hapi-fhir-structures-r5/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-test-utilities/pom.xml b/hapi-fhir-test-utilities/pom.xml
index 181461ece57..dedb670bef1 100644
--- a/hapi-fhir-test-utilities/pom.xml
+++ b/hapi-fhir-test-utilities/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-testpage-overlay/pom.xml b/hapi-fhir-testpage-overlay/pom.xml
index 5caacf907a9..8f5f6350e30 100644
--- a/hapi-fhir-testpage-overlay/pom.xml
+++ b/hapi-fhir-testpage-overlay/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../pom.xml
diff --git a/hapi-fhir-validation-resources-dstu2.1/pom.xml b/hapi-fhir-validation-resources-dstu2.1/pom.xml
index 158075f8d8d..5d10e9b7631 100644
--- a/hapi-fhir-validation-resources-dstu2.1/pom.xml
+++ b/hapi-fhir-validation-resources-dstu2.1/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation-resources-dstu2/pom.xml b/hapi-fhir-validation-resources-dstu2/pom.xml
index a7114fe0883..f72ebdf1655 100644
--- a/hapi-fhir-validation-resources-dstu2/pom.xml
+++ b/hapi-fhir-validation-resources-dstu2/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation-resources-dstu3/pom.xml b/hapi-fhir-validation-resources-dstu3/pom.xml
index 36197381a90..7ca2befe340 100644
--- a/hapi-fhir-validation-resources-dstu3/pom.xml
+++ b/hapi-fhir-validation-resources-dstu3/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation-resources-r4/pom.xml b/hapi-fhir-validation-resources-r4/pom.xml
index d283ed7ab1d..73a32446518 100644
--- a/hapi-fhir-validation-resources-r4/pom.xml
+++ b/hapi-fhir-validation-resources-r4/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation-resources-r4b/pom.xml b/hapi-fhir-validation-resources-r4b/pom.xml
index d912140ab61..4c457ee1d84 100644
--- a/hapi-fhir-validation-resources-r4b/pom.xml
+++ b/hapi-fhir-validation-resources-r4b/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation-resources-r5/pom.xml b/hapi-fhir-validation-resources-r5/pom.xml
index b030ccb250b..6bebb0710d6 100644
--- a/hapi-fhir-validation-resources-r5/pom.xml
+++ b/hapi-fhir-validation-resources-r5/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-fhir-validation/pom.xml b/hapi-fhir-validation/pom.xml
index 375d4769355..18a7b98a41e 100644
--- a/hapi-fhir-validation/pom.xml
+++ b/hapi-fhir-validation/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-deployable-pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../hapi-deployable-pom/pom.xml
diff --git a/hapi-tinder-plugin/pom.xml b/hapi-tinder-plugin/pom.xml
index 6845e456f5c..cf35dee8dcf 100644
--- a/hapi-tinder-plugin/pom.xml
+++ b/hapi-tinder-plugin/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../pom.xml
diff --git a/hapi-tinder-test/pom.xml b/hapi-tinder-test/pom.xml
index 4ade7bb82fd..9044c7b169e 100644
--- a/hapi-tinder-test/pom.xml
+++ b/hapi-tinder-test/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../pom.xml
diff --git a/pom.xml b/pom.xml
index 7f8822aceb7..c6ef616a573 100644
--- a/pom.xml
+++ b/pom.xml
@@ -9,7 +9,7 @@
ca.uhn.hapi.fhir
hapi-fhir
pom
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
HAPI-FHIR
An open-source implementation of the FHIR specification in Java.
@@ -1006,7 +1006,7 @@
1.0.8
- 3.3.1
+ 3.4.0
5.4.1
diff --git a/tests/hapi-fhir-base-test-jaxrsserver-kotlin/pom.xml b/tests/hapi-fhir-base-test-jaxrsserver-kotlin/pom.xml
index a7cd1eba2a8..a1d051bf841 100644
--- a/tests/hapi-fhir-base-test-jaxrsserver-kotlin/pom.xml
+++ b/tests/hapi-fhir-base-test-jaxrsserver-kotlin/pom.xml
@@ -7,7 +7,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../pom.xml
diff --git a/tests/hapi-fhir-base-test-mindeps-client/pom.xml b/tests/hapi-fhir-base-test-mindeps-client/pom.xml
index aa7c4d23be7..44c164994db 100644
--- a/tests/hapi-fhir-base-test-mindeps-client/pom.xml
+++ b/tests/hapi-fhir-base-test-mindeps-client/pom.xml
@@ -4,7 +4,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../pom.xml
diff --git a/tests/hapi-fhir-base-test-mindeps-server/pom.xml b/tests/hapi-fhir-base-test-mindeps-server/pom.xml
index 25a2406ef92..4744f63418c 100644
--- a/tests/hapi-fhir-base-test-mindeps-server/pom.xml
+++ b/tests/hapi-fhir-base-test-mindeps-server/pom.xml
@@ -5,7 +5,7 @@
ca.uhn.hapi.fhir
hapi-fhir
- 7.1.9-SNAPSHOT
+ 7.1.10-SNAPSHOT
../../pom.xml