diff --git a/hapi-deployable-pom/pom.xml b/hapi-deployable-pom/pom.xml index 53ce20c4618..878f8e86233 100644 --- a/hapi-deployable-pom/pom.xml +++ b/hapi-deployable-pom/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-android/pom.xml b/hapi-fhir-android/pom.xml index 255e4ffe450..e60ddcaff71 100644 --- a/hapi-fhir-android/pom.xml +++ b/hapi-fhir-android/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-base/pom.xml b/hapi-fhir-base/pom.xml index a491b2b05b5..1db4476b4d3 100644 --- a/hapi-fhir-base/pom.xml +++ b/hapi-fhir-base/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-bom/pom.xml b/hapi-fhir-bom/pom.xml index b7b350fe12c..e816820a5b6 100644 --- a/hapi-fhir-bom/pom.xml +++ b/hapi-fhir-bom/pom.xml @@ -4,7 +4,7 @@ 4.0.0 ca.uhn.hapi.fhir hapi-fhir-bom - 7.1.9-SNAPSHOT + 7.1.10-SNAPSHOT pom HAPI FHIR BOM @@ -12,7 +12,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-checkstyle/pom.xml b/hapi-fhir-checkstyle/pom.xml index cfd0c7ab084..5c2d84271c1 100644 --- a/hapi-fhir-checkstyle/pom.xml +++ b/hapi-fhir-checkstyle/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-cli/hapi-fhir-cli-api/pom.xml b/hapi-fhir-cli/hapi-fhir-cli-api/pom.xml index b01715cabb8..259e452b291 100644 --- a/hapi-fhir-cli/hapi-fhir-cli-api/pom.xml +++ b/hapi-fhir-cli/hapi-fhir-cli-api/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-cli/hapi-fhir-cli-app/pom.xml b/hapi-fhir-cli/hapi-fhir-cli-app/pom.xml index 149c8945a0f..0a92269dd80 100644 --- a/hapi-fhir-cli/hapi-fhir-cli-app/pom.xml +++ b/hapi-fhir-cli/hapi-fhir-cli-app/pom.xml @@ -6,7 +6,7 @@ ca.uhn.hapi.fhir hapi-fhir-cli - 7.1.9-SNAPSHOT + 7.1.10-SNAPSHOT ../pom.xml diff --git a/hapi-fhir-cli/pom.xml b/hapi-fhir-cli/pom.xml index d5a7d1adbe2..f4735a64673 100644 --- a/hapi-fhir-cli/pom.xml +++ b/hapi-fhir-cli/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-client-okhttp/pom.xml b/hapi-fhir-client-okhttp/pom.xml index a6f01526c67..42dca0baa55 100644 --- a/hapi-fhir-client-okhttp/pom.xml +++ b/hapi-fhir-client-okhttp/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-client/pom.xml b/hapi-fhir-client/pom.xml index 03db163bf02..3b36b9a78cc 100644 --- a/hapi-fhir-client/pom.xml +++ b/hapi-fhir-client/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-converter/pom.xml b/hapi-fhir-converter/pom.xml index eb86eb2ffba..0fb7336aa4e 100644 --- a/hapi-fhir-converter/pom.xml +++ b/hapi-fhir-converter/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-dist/pom.xml b/hapi-fhir-dist/pom.xml index 476a69d129c..bc58e77989b 100644 --- a/hapi-fhir-dist/pom.xml +++ b/hapi-fhir-dist/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-docs/pom.xml b/hapi-fhir-docs/pom.xml index 5531051b6c4..f06c114a1e0 100644 --- a/hapi-fhir-docs/pom.xml +++ b/hapi-fhir-docs/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-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_2_0/5850-migrate-cr-operations.yaml b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_2_0/5850-migrate-cr-operations.yaml new file mode 100644 index 00000000000..37b8d1133e5 --- /dev/null +++ b/hapi-fhir-docs/src/main/resources/ca/uhn/hapi/fhir/changelog/7_2_0/5850-migrate-cr-operations.yaml @@ -0,0 +1,6 @@ +--- +type: add +issue: 5850 +title: "Add additional Clinical Reasoning operations $collect-data and $data-requirements to HAPI-FHIR to expand capability +for clinical reasoning module users. These operations will assist users in identifying data requirements for evaluating a measure, and what +data was used for a measure evaluation" diff --git a/hapi-fhir-jacoco/pom.xml b/hapi-fhir-jacoco/pom.xml index a58f0810b18..062612c14f4 100644 --- a/hapi-fhir-jacoco/pom.xml +++ b/hapi-fhir-jacoco/pom.xml @@ -11,7 +11,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-jaxrsserver-base/pom.xml b/hapi-fhir-jaxrsserver-base/pom.xml index ad7d3a76c82..8abee5044e7 100644 --- a/hapi-fhir-jaxrsserver-base/pom.xml +++ b/hapi-fhir-jaxrsserver-base/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-jpa/pom.xml b/hapi-fhir-jpa/pom.xml index dbd315186f3..90fe5c84f17 100644 --- a/hapi-fhir-jpa/pom.xml +++ b/hapi-fhir-jpa/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-jpaserver-base/pom.xml b/hapi-fhir-jpaserver-base/pom.xml index 9314c0af2ad..6e69cafa0a1 100644 --- a/hapi-fhir-jpaserver-base/pom.xml +++ b/hapi-fhir-jpaserver-base/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-jpaserver-elastic-test-utilities/pom.xml b/hapi-fhir-jpaserver-elastic-test-utilities/pom.xml index 2be23223a1c..c7d8789b66b 100644 --- a/hapi-fhir-jpaserver-elastic-test-utilities/pom.xml +++ b/hapi-fhir-jpaserver-elastic-test-utilities/pom.xml @@ -6,7 +6,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-jpaserver-hfql/pom.xml b/hapi-fhir-jpaserver-hfql/pom.xml index edb3b7bfbd6..21658470076 100644 --- a/hapi-fhir-jpaserver-hfql/pom.xml +++ b/hapi-fhir-jpaserver-hfql/pom.xml @@ -3,7 +3,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-jpaserver-ips/pom.xml b/hapi-fhir-jpaserver-ips/pom.xml index 937f7b155e6..60ecf7dda97 100644 --- a/hapi-fhir-jpaserver-ips/pom.xml +++ b/hapi-fhir-jpaserver-ips/pom.xml @@ -3,7 +3,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-jpaserver-mdm/pom.xml b/hapi-fhir-jpaserver-mdm/pom.xml index e7b26745ade..9da334e1db8 100644 --- a/hapi-fhir-jpaserver-mdm/pom.xml +++ b/hapi-fhir-jpaserver-mdm/pom.xml @@ -6,7 +6,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-jpaserver-model/pom.xml b/hapi-fhir-jpaserver-model/pom.xml index ec13e7a2b20..75996628b21 100644 --- a/hapi-fhir-jpaserver-model/pom.xml +++ b/hapi-fhir-jpaserver-model/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-jpaserver-searchparam/pom.xml b/hapi-fhir-jpaserver-searchparam/pom.xml index 0637fd3251b..3e759bdd325 100755 --- a/hapi-fhir-jpaserver-searchparam/pom.xml +++ b/hapi-fhir-jpaserver-searchparam/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-jpaserver-subscription/pom.xml b/hapi-fhir-jpaserver-subscription/pom.xml index fa48039813e..c7372d53fe0 100644 --- a/hapi-fhir-jpaserver-subscription/pom.xml +++ b/hapi-fhir-jpaserver-subscription/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-jpaserver-test-dstu2/pom.xml b/hapi-fhir-jpaserver-test-dstu2/pom.xml index b73bfd76afb..e983f23ef78 100644 --- a/hapi-fhir-jpaserver-test-dstu2/pom.xml +++ b/hapi-fhir-jpaserver-test-dstu2/pom.xml @@ -6,7 +6,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-jpaserver-test-dstu3/pom.xml b/hapi-fhir-jpaserver-test-dstu3/pom.xml index c931a7db4bc..f7109d2f830 100644 --- a/hapi-fhir-jpaserver-test-dstu3/pom.xml +++ b/hapi-fhir-jpaserver-test-dstu3/pom.xml @@ -6,7 +6,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-jpaserver-test-r4/pom.xml b/hapi-fhir-jpaserver-test-r4/pom.xml index 55d4b2259c0..91490d9aa59 100644 --- a/hapi-fhir-jpaserver-test-r4/pom.xml +++ b/hapi-fhir-jpaserver-test-r4/pom.xml @@ -6,7 +6,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-jpaserver-test-r4b/pom.xml b/hapi-fhir-jpaserver-test-r4b/pom.xml index 5fe6f234e0b..ca1a4a08fbd 100644 --- a/hapi-fhir-jpaserver-test-r4b/pom.xml +++ b/hapi-fhir-jpaserver-test-r4b/pom.xml @@ -6,7 +6,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-jpaserver-test-r5/pom.xml b/hapi-fhir-jpaserver-test-r5/pom.xml index 87b7ba6da9a..ca814fc3407 100644 --- a/hapi-fhir-jpaserver-test-r5/pom.xml +++ b/hapi-fhir-jpaserver-test-r5/pom.xml @@ -6,7 +6,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-jpaserver-test-utilities/pom.xml b/hapi-fhir-jpaserver-test-utilities/pom.xml index 8a60ec85637..0592981d2ce 100644 --- a/hapi-fhir-jpaserver-test-utilities/pom.xml +++ b/hapi-fhir-jpaserver-test-utilities/pom.xml @@ -6,7 +6,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-jpaserver-uhnfhirtest/pom.xml b/hapi-fhir-jpaserver-uhnfhirtest/pom.xml index 8034cc4e83f..bb49ce2cff0 100644 --- a/hapi-fhir-jpaserver-uhnfhirtest/pom.xml +++ b/hapi-fhir-jpaserver-uhnfhirtest/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-server-cds-hooks/pom.xml b/hapi-fhir-server-cds-hooks/pom.xml index 71e76447df6..5de3625c9fa 100644 --- a/hapi-fhir-server-cds-hooks/pom.xml +++ b/hapi-fhir-server-cds-hooks/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-server-mdm/pom.xml b/hapi-fhir-server-mdm/pom.xml index 29a8318010f..33c0d53b3c7 100644 --- a/hapi-fhir-server-mdm/pom.xml +++ b/hapi-fhir-server-mdm/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-server-openapi/pom.xml b/hapi-fhir-server-openapi/pom.xml index 7079aab6795..8ebb87af6b9 100644 --- a/hapi-fhir-server-openapi/pom.xml +++ b/hapi-fhir-server-openapi/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-server/pom.xml b/hapi-fhir-server/pom.xml index 4e8b692ad02..539c930b36f 100644 --- a/hapi-fhir-server/pom.xml +++ b/hapi-fhir-server/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-server/src/main/java/ca/uhn/fhir/rest/server/provider/ProviderConstants.java b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/provider/ProviderConstants.java index 9ab2132e1f8..be33d2829b5 100644 --- a/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/provider/ProviderConstants.java +++ b/hapi-fhir-server/src/main/java/ca/uhn/fhir/rest/server/provider/ProviderConstants.java @@ -123,7 +123,8 @@ public class ProviderConstants { public static final String CR_OPERATION_EXTRACT = "$extract"; public static final String CR_OPERATION_PACKAGE = "$package"; public static final String CR_OPERATION_QUESTIONNAIRE = "$questionnaire"; - + public static final String CR_OPERATION_COLLECTDATA = "$collect-data"; + public static final String CR_OPERATION_DATAREQUIREMENTS = "$data-requirements"; /** * Operation name for the $meta operation */ diff --git a/hapi-fhir-serviceloaders/hapi-fhir-caching-api/pom.xml b/hapi-fhir-serviceloaders/hapi-fhir-caching-api/pom.xml index 58fb8baf837..fd86c76c918 100644 --- a/hapi-fhir-serviceloaders/hapi-fhir-caching-api/pom.xml +++ b/hapi-fhir-serviceloaders/hapi-fhir-caching-api/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-caffeine/pom.xml b/hapi-fhir-serviceloaders/hapi-fhir-caching-caffeine/pom.xml index d74d649f38e..6f3ad9aebf0 100644 --- a/hapi-fhir-serviceloaders/hapi-fhir-caching-caffeine/pom.xml +++ b/hapi-fhir-serviceloaders/hapi-fhir-caching-caffeine/pom.xml @@ -7,7 +7,7 @@ hapi-fhir-serviceloaders ca.uhn.hapi.fhir - 7.1.9-SNAPSHOT + 7.1.10-SNAPSHOT ../pom.xml @@ -21,7 +21,7 @@ ca.uhn.hapi.fhir hapi-fhir-caching-api - 7.1.9-SNAPSHOT + 7.1.10-SNAPSHOT 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