From 88dc464211b464e5e570a4d8dfcf1fddae3e7f38 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 8 Jun 2022 14:06:42 +0200 Subject: [PATCH 001/124] Allow For Spaces in CQL File Path --- evaluate-measure.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/evaluate-measure.sh b/evaluate-measure.sh index 1bb589a87..0604157aa 100755 --- a/evaluate-measure.sh +++ b/evaluate-measure.sh @@ -121,7 +121,7 @@ BASE=$1 [[ -z "$BASE" ]] && usage SUBJECT_TYPE_LOWER=$(echo $SUBJECT_TYPE | tr '[:upper:]' '[:lower:]') -DATA=$(cat ${FILE} | base64 | tr -d '\n') +DATA=$(base64 < "$FILE" | tr -d '\n') LIBRARY_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') MEASURE_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') From 48c1afc2a737ebc5c70be98d2c716b76b2ee0426 Mon Sep 17 00:00:00 2001 From: Marlena Meyer Date: Mon, 30 May 2022 12:37:19 +0200 Subject: [PATCH 002/124] Implement CQL ConvertsTo: Decimal, Integer, Long, Quantity and String --- modules/cql/src/blaze/elm/boolean.clj | 14 ++ modules/cql/src/blaze/elm/compiler/core.clj | 3 +- .../src/blaze/elm/compiler/type_operators.clj | 30 ++- modules/cql/src/blaze/elm/date_time.clj | 39 ++- modules/cql/src/blaze/elm/quantity.clj | 5 +- modules/cql/src/blaze/elm/string.clj | 6 + modules/cql/src/blaze/elm/tuple.clj | 8 +- .../elm/compiler/type_operators_test.clj | 237 +++++++++++++++++- modules/cql/test/blaze/elm/literal.clj | 25 ++ modules/cql/test/data_readers.clj | 5 + 10 files changed, 343 insertions(+), 29 deletions(-) diff --git a/modules/cql/src/blaze/elm/boolean.clj b/modules/cql/src/blaze/elm/boolean.clj index 4cbab8c6b..75f130d61 100644 --- a/modules/cql/src/blaze/elm/boolean.clj +++ b/modules/cql/src/blaze/elm/boolean.clj @@ -16,6 +16,13 @@ (to-boolean [x] x)) +;; 22.24. ToDecimal +(extend-protocol p/ToDecimal + Boolean + (to-decimal [x] + (if (true? x) 1.0 0.0))) + + ;; 22.25. ToInteger (extend-protocol p/ToInteger Boolean @@ -28,3 +35,10 @@ Boolean (to-long [x] (if (true? x) 1 0))) + + +;; 22.30. ToString +(extend-protocol p/ToString + Boolean + (to-string [x] + (str x))) diff --git a/modules/cql/src/blaze/elm/compiler/core.clj b/modules/cql/src/blaze/elm/compiler/core.clj index ef4694cd7..0bdc4e32c 100644 --- a/modules/cql/src/blaze/elm/compiler/core.clj +++ b/modules/cql/src/blaze/elm/compiler/core.clj @@ -109,5 +109,4 @@ (extend-protocol p/ToString Object - (to-string [x] - (str x))) + (to-string [_])) diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index be445ad52..a68c76237 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -134,17 +134,37 @@ ;; TODO 22.9. ConvertsToDateTime -;; TODO 22.10. ConvertsToDecimal +;; 22.10. ConvertsToDecimal +(defunop converts-to-decimal [operand] + (when (some? operand) + (some? (p/to-decimal operand)))) + + +;; 22.11. ConvertsToLong +(defunop converts-to-long [operand] + (when (some? operand) + (some? (p/to-long operand)))) + + +;; 22.12. ConvertsToInteger +(defunop converts-to-integer [operand] + (when (some? operand) + (some? (p/to-integer operand)))) -;; TODO 22.11. ConvertsToLong -;; TODO 22.12. ConvertsToInteger +;; 22.13. ConvertsToQuantity +(defunop converts-to-quantity [operand] + (when (some? operand) + (some? (p/to-quantity operand)))) -;; TODO 22.13. ConvertsToQuantity ;; TODO 22.14. ConvertsToRatio -;; TODO 22.15. ConvertsToString +;; 22.15. ConvertsToString +(defunop converts-to-string [operand] + (when (some? operand) + (some? (p/to-string operand)))) + ;; TODO 22.16. ConvertsToTime diff --git a/modules/cql/src/blaze/elm/date_time.clj b/modules/cql/src/blaze/elm/date_time.clj index bd8670094..fb808c279 100644 --- a/modules/cql/src/blaze/elm/date_time.clj +++ b/modules/cql/src/blaze/elm/date_time.clj @@ -13,8 +13,7 @@ [blaze.fhir.spec.type OffsetInstant] [blaze.fhir.spec.type.system DateTimeYear DateTimeYearMonth DateTimeYearMonthDay] [java.time LocalDate LocalDateTime LocalTime OffsetDateTime Year YearMonth Instant] - [java.time.temporal ChronoField ChronoUnit Temporal TemporalAccessor] - [java.util Map])) + [java.time.temporal ChronoField ChronoUnit Temporal TemporalAccessor])) (set! *warn-on-reflection* true) @@ -1325,15 +1324,39 @@ String (to-date-time [s now] - (p/to-date-time (system/parse-date-time s) now)) - - ;; for the anomaly - Map - (to-date-time [_ _])) + (p/to-date-time (system/parse-date-time s) now))) ;; 22.30. ToString (extend-protocol p/ToString PrecisionLocalTime (to-string [{:keys [local-time]}] - (str local-time))) + (str local-time)) + + Year + (to-string [x] + (str x)) + + DateTimeYear + (to-string [x] + (str x)) + + YearMonth + (to-string [x] + (str x)) + + DateTimeYearMonth + (to-string [x] + (str x)) + + LocalDate + (to-string [x] + (str x)) + + DateTimeYearMonthDay + (to-string [x] + (str x)) + + LocalDateTime + (to-string [x] + (str x))) diff --git a/modules/cql/src/blaze/elm/quantity.clj b/modules/cql/src/blaze/elm/quantity.clj index 7792a56a9..d5793054d 100644 --- a/modules/cql/src/blaze/elm/quantity.clj +++ b/modules/cql/src/blaze/elm/quantity.clj @@ -223,9 +223,10 @@ String (to-quantity [s] ;; (+|-)?#0(.0#)?('')? - (let [[_ value unit] (re-matches #"(\d+(?:\.\d+)?)\s*('[^']+')?" s)] + (let [[_ value unit] (re-matches #"([+-]?\d+(?:\.\d+)?)\s*('[^']+')?" s)] (when value - (quantity (p/to-decimal value) (or (str/trim unit "'") "1")))))) + (when-let [value (p/to-decimal value)] + (quantity value (or (str/trim unit "'") "1"))))))) ;; 22.30. ToString diff --git a/modules/cql/src/blaze/elm/string.clj b/modules/cql/src/blaze/elm/string.clj index a630ff8b9..84f3ea707 100644 --- a/modules/cql/src/blaze/elm/string.clj +++ b/modules/cql/src/blaze/elm/string.clj @@ -52,3 +52,9 @@ (try (p/to-decimal (BigDecimal. s)) (catch Exception _)))) + +;; 22.30. ToString +(extend-protocol p/ToString + String + (to-string [s] + (str s))) diff --git a/modules/cql/src/blaze/elm/tuple.clj b/modules/cql/src/blaze/elm/tuple.clj index 65f5acf44..d8ee15747 100644 --- a/modules/cql/src/blaze/elm/tuple.clj +++ b/modules/cql/src/blaze/elm/tuple.clj @@ -5,7 +5,7 @@ (:import [java.util Map])) - +;; 12.1. Equal (extend-protocol p/Equal Map (equal [x y] @@ -17,3 +17,9 @@ false) false) true)))) + +;; 22.23. ToDateTime +(extend-protocol p/ToDateTime + ;; for the anomaly + Map + (to-date-time [_ _])) diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index edcc85f30..eec3eebd4 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -14,6 +14,7 @@ [blaze.elm.literal-spec] [blaze.elm.protocols :as p] [blaze.elm.quantity :as quantity] + [blaze.elm.quantity-spec] [blaze.fhir.spec.type.system :as system] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]])) @@ -277,7 +278,7 @@ (is (= '(convert-quantity (param-ref "q") "g") (core/-form expr)))))) -;; TODO 22.7. ConvertsToBoolean +;; 22.7. ConvertsToBoolean ;; ;; The ConvertsToBoolean operator returns true if the value of its argument is ;; or can be converted to a Boolean value. @@ -429,7 +430,7 @@ ;; If the argument is null, the result is null. -;; TODO 22.10. ConvertsToDecimal +;; 22.10. ConvertsToDecimal ;; ;; The ConvertsToDecimal operator returns true if the value of its argument is ;; or can be converted to a Decimal value. The operator accepts strings using @@ -455,9 +456,44 @@ ;; If the input is a Boolean, the result is true. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-decimal-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-decimal elm/string x)) + (str decimal/min) + "-1" + "0" + "1" + (str decimal/max)) + (are [x] (false? (tu/compile-unop elm/converts-to-decimal elm/string x)) + (str (- decimal/min 1e-8M)) + (str (+ decimal/max 1e-8M)) + "a")) -;; TODO 22.11. ConvertsToLong + (testing "Boolean" + (are [x] (true? (tu/compile-unop elm/converts-to-decimal elm/boolean x)) + "true")) + + (testing "Decimal" + (are [x] (true? (tu/compile-unop elm/converts-to-decimal elm/decimal x)) + "1.1")) + + (testing "dynamic" + (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-decimal x))) + #elm/parameter-ref "A") + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-decimal x))) + #elm/parameter-ref "1")) + + (tu/testing-unary-null elm/converts-to-decimal) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-decimal #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-decimal (param-ref "x")) (core/-form expr)))))) + + +;; 22.11. ConvertsToLong ;; ;; The ConvertsToLong operator returns true if the value of its argument is or ;; can be converted to a Long value. The operator accepts strings using the @@ -480,8 +516,44 @@ ;; If the input is a Boolean, the result is true. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-long-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-long elm/string x)) + (str Long/MIN_VALUE) + "-1" + "0" + "1" + (str Long/MAX_VALUE)) + + (are [x] (false? (tu/compile-unop elm/converts-to-long elm/string x)) + (str (dec (bigint Long/MIN_VALUE))) + (str (inc (bigint Long/MAX_VALUE))) + "a")) + + (testing "Boolean" + (are [x] (true? (tu/compile-unop elm/converts-to-long elm/boolean x)) + "true")) + + (testing "Long" + (are [x] (true? (tu/compile-unop elm/converts-to-long elm/long x)) + "1")) + + (testing "dynamic" + (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-long x))) + #elm/parameter-ref "A") + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-long x))) + #elm/parameter-ref "1")) + + (tu/testing-unary-null elm/converts-to-long) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-long #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-long (param-ref "x")) (core/-form expr)))))) + -;; TODO 22.12. ConvertsToInteger +;; 22.12. ConvertsToInteger ;; ;; The ConvertsToInteger operator returns true if the value of its argument is ;; or can be converted to an Integer value. The operator accepts strings using @@ -504,8 +576,43 @@ ;; If the input is a Boolean, the result is true ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-integer-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-integer elm/string x)) + (str Integer/MIN_VALUE) + "-1" + "0" + "1" + (str Integer/MAX_VALUE)) + (are [x] (false? (tu/compile-unop elm/converts-to-integer elm/string x)) + (str (dec Integer/MIN_VALUE)) + (str (inc Integer/MAX_VALUE)) + "a")) + + (testing "Boolean" + (are [x] (true? (tu/compile-unop elm/converts-to-integer elm/boolean x)) + "true")) -;; TODO 22.13. ConvertsToQuantity + (testing "Integer" + (are [x] (true? (tu/compile-unop elm/converts-to-integer elm/integer x)) + "1")) + + (testing "dynamic" + (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-integer x))) + #elm/parameter-ref "A") + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-integer x))) + #elm/parameter-ref "1")) + + (tu/testing-unary-null elm/converts-to-integer) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-integer #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-integer (param-ref "x")) (core/-form expr)))))) + + +;; 22.13. ConvertsToQuantity ;; ;; The ConvertsToQuantity operator returns true if the value of its argument is ;; or can be converted to a Quantity value. The operator may be used with @@ -534,6 +641,45 @@ ;; For Integer, Decimal, and Ratio values, the operator simply returns true. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-quantity-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-quantity elm/string x)) + (str decimal/min "'m'") + "-1'm'" + "0'm'" + "1'm'" + (str decimal/max "'m'")) + + (are [x] (false? (tu/compile-unop elm/converts-to-quantity elm/string x)) + (str (- decimal/min 1e-8M)) + (str (+ decimal/max 1e-8M)) + (str (- decimal/min 1e-8M) "'m'") + (str (+ decimal/max 1e-8M) "'m'") + "" + "a")) + + (testing "Integer" + (is (true? (tu/compile-unop elm/converts-to-quantity elm/integer "1")))) + + (testing "Decimal" + (is (true? (tu/compile-unop elm/converts-to-quantity elm/decimal "1.1")))) + + ;; TODO: Ratio + + (testing "dynamic" + (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-quantity x))) + #elm/parameter-ref "A") + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-quantity x))) + #elm/parameter-ref "1")) + + (tu/testing-unary-null elm/converts-to-quantity) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-quantity #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-quantity (param-ref "x")) (core/-form expr)))))) + ;; TODO 22.14. ConvertsToRatio ;; @@ -552,7 +698,7 @@ ;; ;; If the argument is null, the result is null. -;; TODO 22.15. ConvertsToString +;; 22.15. ConvertsToString ;; ;; The ConvertsToString operator returns true if the value of its argument is ;; or can be converted to a String value. @@ -571,6 +717,60 @@ ;; String ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-string-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/string x)) + "foo")) + + (testing "Long" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/long x)) + "1")) + + (testing "Boolean" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/boolean x)) + "true")) + + (testing "Integer" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/integer x)) + "1")) + + (testing "Decimal" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/decimal x)) + "1.1")) + + (testing "Quantity" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/quantity x)) + [1M "m"])) + + (testing "Date" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/date x)) + "2019-01-01")) + + (testing "DateTime" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/date-time x)) + "2019-01-01T01:00")) + + (testing "Time" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/time x)) + "01:00")) + + ;; TODO: Ratio + + (testing "Tuple" + (are [x] (false? (c/compile {} (elm/converts-to-string (elm/tuple x)))) + {"foo" #elm/integer "1"})) + + (testing "dynamic" + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-string x))) + #elm/parameter-ref "A")) + + (tu/testing-unary-null elm/converts-to-string) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-string #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-string (param-ref "x")) (core/-form expr)))))) ;; TODO 22.16. ConvertsToTime ;; @@ -881,8 +1081,8 @@ ;; 22.24. ToDecimal ;; -;; The ToDecimal operator converts the value of its argument to a Decimal value. -;; The operator accepts strings using the following format: +;; The ToDecimal operator converts the value of its argument to a Decimal +;; value. The operator accepts strings using the following format: ;; ;; (+|-)?#0(.0#)? ;; @@ -891,13 +1091,18 @@ ;; decimal point, at least one digit, and any number of additional digits ;; (including none). ;; -;; Note that the decimal value returned by this operator must be limited in -;; precision and scale to the maximum precision and scale representable for -;; Decimal values within CQL. +;; See Formatting Strings for a description of the formatting strings used in +;; this specification. +;; +;; Note that the Decimal value returned by this operator will be limited in +;; precision and scale to the maximum precision and scale representable by the +;; implementation (at least 28 digits of precision, and 8 digits of scale). ;; ;; If the input string is not formatted correctly, or cannot be interpreted as ;; a valid Decimal value, the result is null. ;; +;; If the input is Boolean, true will result in 1.0, false will result in 0.0. +;; ;; If the argument is null, the result is null. (deftest compile-to-decimal-test (testing "String" @@ -913,6 +1118,11 @@ (str (+ decimal/max 1e-8M)) nil "a" nil)) + (testing "Boolean" + (are [x res] (= res (tu/compile-unop elm/to-decimal elm/boolean x)) + "true" 1.0 + "false" 0.0)) + (tu/testing-unary-null elm/to-decimal) (testing "form" @@ -1086,6 +1296,7 @@ (are [x res] (p/equal res (core/-eval (tu/compile-unop elm/to-quantity elm/string x) {} nil nil)) + "-1" (quantity/quantity -1 "1") "1" (quantity/quantity 1 "1") "1'm'" (quantity/quantity 1 "m") @@ -1098,6 +1309,10 @@ (are [x] (nil? (core/-eval (tu/compile-unop elm/to-quantity elm/string x) {} nil nil)) + (str (- decimal/min 1e-8M)) + (str (+ decimal/max 1e-8M)) + (str (- decimal/min 1e-8M) "'m'") + (str (+ decimal/max 1e-8M) "'m'") "" "a")) diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 405ff5aa1..fd4a48676 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -803,6 +803,31 @@ {:type "ConvertsToBoolean" :operand operand}) +;; 22.10. ConvertsToDecimal +(defn converts-to-decimal [operand] + {:type "ConvertsToDecimal" :operand operand}) + + +;; 22.11. ConvertsToLong +(defn converts-to-long [operand] + {:type "ConvertsToLong" :operand operand}) + + +;; 22.12. ConvertsToInteger +(defn converts-to-integer [operand] + {:type "ConvertsToInteger" :operand operand}) + + +;; 22.13. ConvertsToQuantity +(defn converts-to-quantity [operand] + {:type "ConvertsToQuantity" :operand operand}) + + +;; 22.15. ConvertsToString +(defn converts-to-string [operand] + {:type "ConvertsToString" :operand operand}) + + ;; 22.17. Descendents (defn descendents [source] {:type "Descendents" :source source}) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index a004caa95..d501bc3b4 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -71,6 +71,11 @@ elm/can-convert-quantity blaze.elm.literal/can-convert-quantity elm/convert-quantity blaze.elm.literal/convert-quantity elm/converts-to-boolean blaze.elm.literal/converts-to-boolean + elm/converts-to-decimal blaze.elm.literal/converts-to-decimal + elm/converts-to-long blaze.elm.literal/converts-to-long + elm/converts-to-integer blaze.elm.literal/converts-to-integer + elm/converts-to-quantity blaze.elm.literal/converts-to-quantity + elm/converts-to-string blaze.elm.literal/converts-to-string elm/children blaze.elm.literal/children elm/descendents blaze.elm.literal/descendents elm/to-boolean blaze.elm.literal/to-boolean From f05fcfc4731b2048944eee6bf986851180c3f468 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 20 Jun 2022 12:13:53 +0200 Subject: [PATCH 003/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ deps.edn | 4 ++-- modules/anomaly/deps.edn | 2 +- modules/async/deps.edn | 2 +- modules/byte-buffer/deps.edn | 2 +- modules/cassandra/deps.edn | 4 ++-- modules/coll/deps.edn | 2 +- modules/cql/deps.edn | 2 +- modules/db-resource-store-cassandra/deps.edn | 2 +- modules/db-resource-store/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 2 +- modules/db-tx-log/deps.edn | 2 +- modules/db/deps.edn | 2 +- modules/executor/deps.edn | 2 +- modules/extern-terminology-service/deps.edn | 2 +- modules/fhir-client/deps.edn | 2 +- modules/fhir-path/deps.edn | 2 +- modules/fhir-structure/deps.edn | 4 ++-- modules/http-client/deps.edn | 2 +- modules/interaction/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/kv/deps.edn | 2 +- modules/luid/deps.edn | 2 +- modules/metrics/deps.edn | 4 ++-- modules/module-base/deps.edn | 2 +- modules/openid-auth/deps.edn | 2 +- modules/operation-measure-evaluate-measure/deps.edn | 2 +- modules/page-store-cassandra/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- modules/rest-api/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- modules/rocksdb/deps.edn | 4 ++-- modules/scheduler/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/thread-pool-executor-collector/deps.edn | 2 +- 35 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index ceb193801..0eb50a6e8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 @@ -583,7 +583,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 @@ -894,7 +894,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1113' + cli: '1.11.1.1145' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index b11df8276..51beafe35 100644 --- a/deps.edn +++ b/deps.edn @@ -66,7 +66,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "1.7.798"} + {:mvn/version "1.7.804"} org.slf4j/slf4j-nop {:mvn/version "1.7.36"}} diff --git a/modules/anomaly/deps.edn b/modules/anomaly/deps.edn index d2fd0ee00..920c42a29 100644 --- a/modules/anomaly/deps.edn +++ b/modules/anomaly/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/async/deps.edn b/modules/async/deps.edn index 935bda138..5b3f42aae 100644 --- a/modules/async/deps.edn +++ b/modules/async/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index cd410fbdc..6f0697cdd 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -13,6 +13,6 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 26aa4d15d..9489f4844 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.77.Final"}} + {:mvn/version "4.1.78.Final"}} :aliases {:test @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index 307969909..ad0e55f49 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -8,7 +8,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 719646fdd..481b06cc7 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -42,7 +42,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store-cassandra/deps.edn b/modules/db-resource-store-cassandra/deps.edn index 343fbaaf7..ce42f0269 100644 --- a/modules/db-resource-store-cassandra/deps.edn +++ b/modules/db-resource-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store/deps.edn b/modules/db-resource-store/deps.edn index 25a762857..dd9c91ffa 100644 --- a/modules/db-resource-store/deps.edn +++ b/modules/db-resource-store/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index b1fb42b1f..c4b2e8bc7 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index b89260e43..6f9b1fbdc 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db/deps.edn b/modules/db/deps.edn index 3565d7b41..397d144df 100644 --- a/modules/db/deps.edn +++ b/modules/db/deps.edn @@ -52,7 +52,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index 8c3396f14..37d2ed48c 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -9,7 +9,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/extern-terminology-service/deps.edn b/modules/extern-terminology-service/deps.edn index 258739d79..74f2e770b 100644 --- a/modules/extern-terminology-service/deps.edn +++ b/modules/extern-terminology-service/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index b146282ea..23a790d7b 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -31,7 +31,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index b081b3be2..80ae770c8 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 1fb7e6387..22b854846 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -26,7 +26,7 @@ {:mvn/version "5.2.1"} funcool/cuerdas - {:mvn/version "2022.03.27-397"} + {:mvn/version "2022.06.16-403"} metosin/jsonista {:mvn/version "0.3.6"} @@ -49,7 +49,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index cf8aa5581..2f218eb60 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/interaction/deps.edn b/modules/interaction/deps.edn index 8d6e7de32..5e3a5e856 100644 --- a/modules/interaction/deps.edn +++ b/modules/interaction/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 60a42b26d..affbe5530 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -12,7 +12,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/kv/deps.edn b/modules/kv/deps.edn index 96cfce248..564ce6aad 100644 --- a/modules/kv/deps.edn +++ b/modules/kv/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index 85ce1873e..eb22f41a9 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index f1dc8ac32..f8cb9f6e6 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -6,7 +6,7 @@ {:mvn/version "0.0.8"} io.prometheus/simpleclient_hotspot - {:mvn/version "0.15.0"}} + {:mvn/version "0.16.0"}} :aliases {:test @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/module-base/deps.edn b/modules/module-base/deps.edn index 79ee3bfd6..d566238e0 100644 --- a/modules/module-base/deps.edn +++ b/modules/module-base/deps.edn @@ -10,4 +10,4 @@ :git/sha "32a46f5dca8a6b563a6dddf88bec887be3201b08"} prom-metrics/prom-metrics - {:mvn/version "0.6-alpha.5"}}} + {:mvn/version "0.6-alpha.6"}}} diff --git a/modules/openid-auth/deps.edn b/modules/openid-auth/deps.edn index 3cb648439..fbf0687a5 100644 --- a/modules/openid-auth/deps.edn +++ b/modules/openid-auth/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/operation-measure-evaluate-measure/deps.edn b/modules/operation-measure-evaluate-measure/deps.edn index c24400998..8337e567a 100644 --- a/modules/operation-measure-evaluate-measure/deps.edn +++ b/modules/operation-measure-evaluate-measure/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store-cassandra/deps.edn b/modules/page-store-cassandra/deps.edn index fa13f4d49..f78a5a048 100644 --- a/modules/page-store-cassandra/deps.edn +++ b/modules/page-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index c4f7ff88b..64479023d 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 7a6bf0b9b..0dfb64d8d 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -33,7 +33,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index 69af437b4..ca3e29834 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -32,7 +32,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index 0df0d9515..abd455215 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.2.2"}} + {:mvn/version "7.3.1"}} :aliases {:test @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/scheduler/deps.edn b/modules/scheduler/deps.edn index a9c80226a..3a6839f1a 100644 --- a/modules/scheduler/deps.edn +++ b/modules/scheduler/deps.edn @@ -13,7 +13,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 4ff54be2b..01e255625 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -30,7 +30,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/thread-pool-executor-collector/deps.edn b/modules/thread-pool-executor-collector/deps.edn index b138c2836..ff97693e2 100644 --- a/modules/thread-pool-executor-collector/deps.edn +++ b/modules/thread-pool-executor-collector/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.66.1034"}} + {:mvn/version "1.67.1055"}} :main-opts ["-m" "kaocha.runner"]} From 783f42ef54e175c6ebeb3b04ddbd5b6511b2ee0e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 29 Jun 2022 11:13:33 +0200 Subject: [PATCH 004/124] Switch to Media Type text/cql-identifier for CQL Expressions However text/cql will still work. --- .../scripts/evaluate-measure-subject-list.sh | 2 +- .github/scripts/evaluate-measure.sh | 2 +- .../scripts/evaluate-patient-q1-measure.sh | 2 +- docs/cql-queries/api.md | 2 +- evaluate-measure.sh | 2 +- .../evaluate_measure/measure/util.clj | 2 +- .../evaluate_measure/measure/util_test.clj | 21 +++++++++++++++++-- .../evaluate_measure/measure_test.clj | 2 +- .../operation/evaluate_measure/q1-data.json | 2 +- .../operation/evaluate_measure/q10-data.json | 2 +- .../operation/evaluate_measure/q11-data.json | 2 +- .../operation/evaluate_measure/q12-data.json | 2 +- .../operation/evaluate_measure/q13-data.json | 2 +- .../operation/evaluate_measure/q14-data.json | 2 +- .../operation/evaluate_measure/q15-data.json | 2 +- .../operation/evaluate_measure/q16-data.json | 2 +- .../operation/evaluate_measure/q17-data.json | 2 +- .../q18-specimen-bmi-data.json | 2 +- .../q19-stratifier-ageclass-data.json | 4 ++-- .../operation/evaluate_measure/q2-data.json | 2 +- .../q20-stratifier-city-data.json | 4 ++-- ...21-stratifier-city-of-only-women-data.json | 4 ++-- ...-stratifier-multiple-cities-fail-data.json | 4 ++-- ...3-stratifier-ageclass-and-gender-data.json | 6 +++--- .../operation/evaluate_measure/q24-data.json | 2 +- .../q25-stratifier-collection-data.json | 4 ++-- .../q26-stratifier-bmi-data.json | 4 ++-- .../q27-stratifier-calculated-bmi-data.json | 4 ++-- ...relationship-procedure-condition-data.json | 2 +- ...-stratifier-sample-material-type-data.json | 4 ++-- .../operation/evaluate_measure/q3-data.json | 2 +- ...ratifier-with-missing-expression-data.json | 4 ++-- ...1-stratifier-storage-temperature-data.json | 4 ++-- .../q32-stratifier-underweight-data.json | 4 ++-- .../q33-incompatible-quantities-data.json | 2 +- .../evaluate_measure/q34-medication-data.json | 2 +- .../q35-literal-library-ref-data.json | 2 +- .../evaluate_measure/q36-parameter-data.json | 2 +- .../evaluate_measure/q37-overlaps-data.json | 2 +- .../evaluate_measure/q38-di-surv-data.json | 2 +- .../operation/evaluate_measure/q4-data.json | 2 +- .../operation/evaluate_measure/q5-data.json | 2 +- .../operation/evaluate_measure/q6-data.json | 2 +- .../operation/evaluate_measure/q7-data.json | 2 +- .../operation/evaluate_measure/q8-data.json | 2 +- .../operation/evaluate_measure/q9-data.json | 2 +- .../fhir/operation/evaluate_measure_test.clj | 2 +- .../src/test/resources/default/measure.json | 2 +- 48 files changed, 79 insertions(+), 62 deletions(-) diff --git a/.github/scripts/evaluate-measure-subject-list.sh b/.github/scripts/evaluate-measure-subject-list.sh index b4506f737..f608c2168 100755 --- a/.github/scripts/evaluate-measure-subject-list.sh +++ b/.github/scripts/evaluate-measure-subject-list.sh @@ -53,7 +53,7 @@ cat < Date: Wed, 29 Jun 2022 11:59:35 +0200 Subject: [PATCH 005/124] Update Dependencies --- .github/workflows/build.yml | 14 +++++++------- deps.edn | 2 +- modules/anomaly/deps.edn | 2 +- modules/async/deps.edn | 2 +- modules/byte-buffer/deps.edn | 4 ++-- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/coll/deps.edn | 2 +- modules/cql/deps.edn | 4 ++-- modules/db-resource-store-cassandra/deps.edn | 2 +- modules/db-resource-store/deps.edn | 4 ++-- modules/db-tx-log-kafka/deps.edn | 2 +- modules/db-tx-log/deps.edn | 2 +- modules/db/deps.edn | 2 +- modules/executor/deps.edn | 2 +- modules/extern-terminology-service/deps.edn | 2 +- modules/fhir-client/deps.edn | 2 +- modules/fhir-path/deps.edn | 4 ++-- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 2 +- modules/interaction/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/kv/deps.edn | 2 +- modules/luid/deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/openid-auth/deps.edn | 2 +- .../operation-measure-evaluate-measure/deps.edn | 2 +- modules/page-store-cassandra/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- modules/rest-api/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- modules/rocksdb/deps.edn | 2 +- modules/scheduler/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/thread-pool-executor-collector/deps.edn | 2 +- 35 files changed, 45 insertions(+), 45 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0eb50a6e8..4e09aeb81 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup clj-kondo uses: DeLaGuardo/setup-clj-kondo@master with: - version: '2022.05.31' + version: '2022.06.22' - name: Check out Git repository uses: actions/checkout@v3 @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 @@ -583,7 +583,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 @@ -894,7 +894,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1145' + cli: '1.11.1.1149' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index 51beafe35..0b9533a40 100644 --- a/deps.edn +++ b/deps.edn @@ -66,7 +66,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/anomaly/deps.edn b/modules/anomaly/deps.edn index 920c42a29..8f82afc7b 100644 --- a/modules/anomaly/deps.edn +++ b/modules/anomaly/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/async/deps.edn b/modules/async/deps.edn index 5b3f42aae..38526a4b4 100644 --- a/modules/async/deps.edn +++ b/modules/async/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 6f0697cdd..fb6cc90de 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.1"}} + {:mvn/version "3.21.2"}} :aliases {:test @@ -13,6 +13,6 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]}}} diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 4980d4e15..c4bb26b0b 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.1"} + {:mvn/version "3.21.2"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.13.3"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 9489f4844..54d541d36 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index ad0e55f49..888290546 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -8,7 +8,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 481b06cc7..f4cd77227 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -8,7 +8,7 @@ {:mvn/version "2.13.3"} info.cqframework/cql-to-elm - {:mvn/version "1.5.8" + {:mvn/version "1.5.9" :exclusions [com.google.code.javaparser/javaparser info.cqframework/qdm @@ -42,7 +42,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store-cassandra/deps.edn b/modules/db-resource-store-cassandra/deps.edn index ce42f0269..ca9b31be2 100644 --- a/modules/db-resource-store-cassandra/deps.edn +++ b/modules/db-resource-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store/deps.edn b/modules/db-resource-store/deps.edn index dd9c91ffa..8c61e481d 100644 --- a/modules/db-resource-store/deps.edn +++ b/modules/db-resource-store/deps.edn @@ -29,12 +29,12 @@ {:mvn/version "0.4.6"} mvxcvi/clj-cbor - {:mvn/version "1.1.0"}}} + {:mvn/version "1.1.1"}}} :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index c4b2e8bc7..ecb5ffc9e 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index 6f9b1fbdc..f308ab978 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db/deps.edn b/modules/db/deps.edn index 397d144df..a6215312c 100644 --- a/modules/db/deps.edn +++ b/modules/db/deps.edn @@ -52,7 +52,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index 37d2ed48c..21db138ba 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -9,7 +9,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/extern-terminology-service/deps.edn b/modules/extern-terminology-service/deps.edn index 74f2e770b..44207fa02 100644 --- a/modules/extern-terminology-service/deps.edn +++ b/modules/extern-terminology-service/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index 23a790d7b..de1227643 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -31,7 +31,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 80ae770c8..0b005d9d7 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-structure"} info.cqframework/cql - {:mvn/version "1.5.8"}} + {:mvn/version "1.5.9"}} :aliases {:test @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 22b854846..b64d3a836 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -49,7 +49,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 2f218eb60..2ced4be5f 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/interaction/deps.edn b/modules/interaction/deps.edn index 5e3a5e856..40ae0796f 100644 --- a/modules/interaction/deps.edn +++ b/modules/interaction/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index affbe5530..5ca789b91 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -12,7 +12,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/kv/deps.edn b/modules/kv/deps.edn index 564ce6aad..e4cf0b647 100644 --- a/modules/kv/deps.edn +++ b/modules/kv/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index eb22f41a9..6c8460e85 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index f8cb9f6e6..67a6f50b8 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/openid-auth/deps.edn b/modules/openid-auth/deps.edn index fbf0687a5..5d9deefc4 100644 --- a/modules/openid-auth/deps.edn +++ b/modules/openid-auth/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/operation-measure-evaluate-measure/deps.edn b/modules/operation-measure-evaluate-measure/deps.edn index 8337e567a..fa8bba9da 100644 --- a/modules/operation-measure-evaluate-measure/deps.edn +++ b/modules/operation-measure-evaluate-measure/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store-cassandra/deps.edn b/modules/page-store-cassandra/deps.edn index f78a5a048..036c5b106 100644 --- a/modules/page-store-cassandra/deps.edn +++ b/modules/page-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index 64479023d..c0ea62c82 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 0dfb64d8d..5ba8149d5 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -33,7 +33,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index ca3e29834..b4e3ddae7 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -32,7 +32,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index abd455215..b930d741c 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/scheduler/deps.edn b/modules/scheduler/deps.edn index 3a6839f1a..326657e09 100644 --- a/modules/scheduler/deps.edn +++ b/modules/scheduler/deps.edn @@ -13,7 +13,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 01e255625..b674854e3 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -30,7 +30,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/thread-pool-executor-collector/deps.edn b/modules/thread-pool-executor-collector/deps.edn index ff97693e2..34124b5ee 100644 --- a/modules/thread-pool-executor-collector/deps.edn +++ b/modules/thread-pool-executor-collector/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.67.1055"}} + {:mvn/version "1.68.1059"}} :main-opts ["-m" "kaocha.runner"]} From 5d276e3860cbbe671056e0d476c2fd1febbaf525 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 30 Jun 2022 12:26:36 +0200 Subject: [PATCH 006/124] Release v0.17.8 --- CHANGELOG.md | 12 +++++++++++- README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 25 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd8d6d930..86567202b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,16 @@ # Changelog -## v0.17.6 +## v0.17.8 + +### Other + +* Switch to Media Type text/cql-identifier for CQL Expressions ([#748](https://github.com/samply/blaze/pull/748)) +* Update Dependencies ([#749](https://github.com/samply/blaze/pull/749)) +* Update Dependencies ([#746](https://github.com/samply/blaze/pull/746)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/46?closed=1). + +## v0.17.7 ### Other diff --git a/README.md b/README.md index 041533bad..8a48ee0ae 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.7][5] +Latest release: [v0.17.8][5] ## Quick Start @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 828b3c801..f8ea6894c 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.7 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.8 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.7" + "version": "0.17.8" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 7523ff7e2..299e7a41e 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11. Blaze is tested with [AdoptOpenJDK][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.7). Look for `blaze-0.17.7-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.8). Look for `blaze-0.17.8-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.7-standalone.jar -m blaze.core +java -jar blaze-0.17.8-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.7-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.17.8-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.7-standalone.jar -m blaze.core +java -jar blaze-0.17.8-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.7 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.8 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.7" + "version": "0.17.8" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 2ff7f9fd4..0f6974d2d 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-06-05" + :date #fhir/dateTime"2022-06-30" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index c3b9c61af..6464d4f17 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.7 + 0.17.8 1.8 diff --git a/pom.xml b/pom.xml index ea749e4a9..633f6e89e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.7 + 0.17.8 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index f7f0f87cd..bac30e8c3 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.7" + {:blaze/version "0.17.8" :blaze/clock {} From 8bd10f7f14259f45956ba2e839de06a2760fa968 Mon Sep 17 00:00:00 2001 From: Marlena Meyer Date: Mon, 30 May 2022 15:35:04 +0200 Subject: [PATCH 007/124] Implement CQL ToTime and rearrange ToDate and ToDateTime --- .../src/blaze/elm/compiler/type_operators.clj | 12 +++++- modules/cql/src/blaze/elm/date_time.clj | 37 +++++++++++-------- modules/cql/src/blaze/elm/deps_infer.clj | 3 ++ modules/cql/src/blaze/elm/nil.clj | 18 +++++++++ modules/cql/src/blaze/elm/protocols.clj | 6 +++ modules/cql/src/blaze/elm/string.clj | 26 +++++++++++++ modules/cql/test/blaze/cql_test.clj | 9 +++-- .../compiler/comparison_operators_test.clj | 2 +- .../elm/compiler/date_time_operators_test.clj | 9 +++-- .../cql/test/blaze/elm/compiler/test_util.clj | 10 ++++- .../elm/compiler/type_operators_test.clj | 34 ++++++++++++++++- modules/cql/test/blaze/elm/literal.clj | 12 +++++- modules/cql/test/blaze/elm/literal_spec.clj | 5 +++ .../src/blaze/fhir/spec/type/system.clj | 30 ++++++++++++++- .../test/blaze/fhir/spec/type/system_test.clj | 20 ++++++++++ 15 files changed, 200 insertions(+), 33 deletions(-) diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index a68c76237..98110464f 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -257,4 +257,14 @@ (p/to-string x)) -;; TODO 22.31. ToTime +;; 22.31. ToTime +(defrecord ToTimeOperatorExpression [operand] + core/Expression + (-eval [_ {:keys [now] :as context} resource scope] + (p/to-time (core/-eval operand context resource scope) now))) + + +(defmethod core/compile* :elm.compiler.type/to-time + [context {:keys [operand]}] + (when-let [operand (core/compile* context operand)] + (->ToTimeOperatorExpression operand))) diff --git a/modules/cql/src/blaze/elm/date_time.clj b/modules/cql/src/blaze/elm/date_time.clj index fb808c279..a32cf61be 100644 --- a/modules/cql/src/blaze/elm/date_time.clj +++ b/modules/cql/src/blaze/elm/date_time.clj @@ -1233,14 +1233,6 @@ ;; 22.22. ToDate (extend-protocol p/ToDate - nil - (to-date [_ _]) - - String - (to-date [s _] - (-> (system/parse-date s) - (ba/exceptionally (constantly nil)))) - Year (to-date [this _] this) @@ -1277,9 +1269,6 @@ ;; 22.23. ToDateTime (extend-protocol p/ToDateTime - nil - (to-date-time [_ _]) - Instant (to-date-time [this now] (-> (.atOffset this (.getOffset ^OffsetDateTime now)) @@ -1320,11 +1309,7 @@ OffsetDateTime (to-date-time [this now] (-> (.withOffsetSameInstant this (.getOffset ^OffsetDateTime now)) - (.toLocalDateTime))) - - String - (to-date-time [s now] - (p/to-date-time (system/parse-date-time s) now))) + (.toLocalDateTime)))) ;; 22.30. ToString @@ -1360,3 +1345,23 @@ LocalDateTime (to-string [x] (str x))) + + +;; 22.31. ToTime +(extend-protocol p/ToTime + LocalTime + (to-time [this _] + this) + + LocalDateTime + (to-time [this _] + (.toLocalTime this)) + + OffsetDateTime + (to-time [this now] + (-> (.withOffsetSameInstant this (.getOffset ^OffsetDateTime now)) + (.toLocalTime))) + + PrecisionLocalTime + (to-time [this _] + (.-local_time this))) diff --git a/modules/cql/src/blaze/elm/deps_infer.clj b/modules/cql/src/blaze/elm/deps_infer.clj index af98a7edc..bd6e1aa1a 100644 --- a/modules/cql/src/blaze/elm/deps_infer.clj +++ b/modules/cql/src/blaze/elm/deps_infer.clj @@ -620,6 +620,9 @@ (derive :elm.deps.type/to-quantity :elm.deps.type/unary-expression) +;; 22.31. ToTime +(derive :elm.deps.type/to-time :elm.deps.type/unary-expression) + ;; 23. Clinical Operators diff --git a/modules/cql/src/blaze/elm/nil.clj b/modules/cql/src/blaze/elm/nil.clj index d5c914e39..82e17c558 100644 --- a/modules/cql/src/blaze/elm/nil.clj +++ b/modules/cql/src/blaze/elm/nil.clj @@ -284,6 +284,18 @@ (to-boolean [_])) +;; 22.22. ToDate +(extend-protocol p/ToDate + nil + (to-date [_ _])) + + +;; 22.23. ToDateTime +(extend-protocol p/ToDateTime + nil + (to-date-time [_ _])) + + ;; 22.24. ToDecimal (extend-protocol p/ToDecimal nil @@ -312,3 +324,9 @@ (extend-protocol p/ToString nil (to-string [_])) + + +;; 22.31. ToTime +(extend-protocol p/ToTime + nil + (to-time [_ _])) diff --git a/modules/cql/src/blaze/elm/protocols.clj b/modules/cql/src/blaze/elm/protocols.clj index beadceef6..142909bd7 100644 --- a/modules/cql/src/blaze/elm/protocols.clj +++ b/modules/cql/src/blaze/elm/protocols.clj @@ -308,3 +308,9 @@ ;; 22.30. ToString (defprotocol ToString (to-string [x])) + + +;; 22.31. ToTime +(defprotocol ToTime + "Converts an object into something usable as Time relative to `now`." + (to-time [x now])) diff --git a/modules/cql/src/blaze/elm/string.clj b/modules/cql/src/blaze/elm/string.clj index 84f3ea707..9f071dbd3 100644 --- a/modules/cql/src/blaze/elm/string.clj +++ b/modules/cql/src/blaze/elm/string.clj @@ -1,7 +1,9 @@ (ns blaze.elm.string "Implementation of the string type." (:require + [blaze.anomaly :as ba] [blaze.elm.protocols :as p] + [blaze.fhir.spec.type.system :as system] [clojure.string :as str])) @@ -45,6 +47,21 @@ nil))) +;; 22.22. ToDate +(extend-protocol p/ToDate + String + (to-date [s _] + (-> (system/parse-date s) + (ba/exceptionally (constantly nil))))) + + +;; 22.23. ToDateTime +(extend-protocol p/ToDateTime + String + (to-date-time [s now] + (p/to-date-time (system/parse-date-time s) now))) + + ;; 22.24. ToDecimal (extend-protocol p/ToDecimal String @@ -53,8 +70,17 @@ (p/to-decimal (BigDecimal. s)) (catch Exception _)))) + ;; 22.30. ToString (extend-protocol p/ToString String (to-string [s] (str s))) + + +;; 22.31. ToTime +(extend-protocol p/ToTime + String + (to-time [s _] + (-> (system/parse-time s) + (ba/exceptionally (constantly nil))))) diff --git a/modules/cql/test/blaze/cql_test.clj b/modules/cql/test/blaze/cql_test.clj index e36e95197..16c228611 100644 --- a/modules/cql/test/blaze/cql_test.clj +++ b/modules/cql/test/blaze/cql_test.clj @@ -155,10 +155,11 @@ "Decimal18D55ToString" ; TODO: implement "Quantity5D5CMToString" ; TODO: implement "BooleanTrueToString" ; TODO: implement - "ToTime1" ; TODO: implement - "ToTime2" ; TODO: implement - "ToTime3" ; TODO: implement - "ToTime4" ; TODO: implement + "ToTime1" ; shouldn't start with T + "ToTime2" ; time zone? + "ToTime3" ; time zone? + "ToTime4" ; time zone? + "ToTimeMalformed" ; should return null "StringToDateTimeMalformed" ; should return null "ToDateTimeMalformed" ; should return null }) diff --git a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj index 2908208f5..2d19179e7 100644 --- a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj @@ -212,7 +212,7 @@ "12:30:15" "12:30:16" false "12:30:16" "12:30:15" false - "12:30.00" "12:30" nil + "12:30:00" "12:30" nil "12:00" "12" nil) diff --git a/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj b/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj index 7171bc51e..e4c0a03e6 100644 --- a/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj @@ -849,11 +849,12 @@ ;; ;; At least one component other than timezoneOffset must be specified, and no ;; component may be specified at a precision below an unspecified precision. -;; For example, minute may be null, but if it is, second, and millisecond -;; must all be null as well. +;; For example, minute may be null, but if it is, second, and millisecond must +;; all be null as well. ;; -;; If timezoneOffset is not specified, it is defaulted to the timezone offset -;; of the evaluation request. +;; Although the milliseconds are specified with a separate component, seconds +;; and milliseconds are combined and represented as a Decimal for the purposes +;; of comparison. (deftest compile-time-test (testing "Static hour" (are [elm res] (= res (c/compile {} elm)) diff --git a/modules/cql/test/blaze/elm/compiler/test_util.clj b/modules/cql/test/blaze/elm/compiler/test_util.clj index 1133486c8..008d6047c 100644 --- a/modules/cql/test/blaze/elm/compiler/test_util.clj +++ b/modules/cql/test/blaze/elm/compiler/test_util.clj @@ -5,6 +5,7 @@ [blaze.elm.literal :as elm] [blaze.elm.literal-spec] [blaze.elm.spec] + [blaze.fhir.spec.type.system :as system] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :refer [is testing]]) @@ -60,13 +61,18 @@ {:name "ab"} {:name "b"} {:name "ba"} - {:name "A"}]}}}) + {:name "A"} + {:name "12:54:00"} + {:name "2020-01-02T03:04:05.006Z"}]}}}) (def dynamic-eval-ctx {:parameters {"true" true "false" false "nil" nil "1" 1 "2" 2 "3" 3 "4" 4 - "empty-string" "" "a" "a" "ab" "ab" "b" "b" "ba" "ba" "A" "A"}}) + "empty-string" "" "a" "a" "ab" "ab" "b" "b" "ba" "ba" "A" "A" + "12:54:00" (system/time 12 54 00) + "2020-01-02T03:04:05.006Z" (system/date-time 2020 1 2 3 4 5 6 ZoneOffset/UTC)} + :now now}) (defn dynamic-compile-eval [elm] diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index eec3eebd4..9474397d8 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -1441,7 +1441,7 @@ (is (= '(to-string (param-ref "x")) (core/-form expr)))))) -;; TODO 22.31. ToTime +;; 22.31. ToTime ;; ;; The ToTime operator converts the value of its argument to a Time value. ;; @@ -1464,4 +1464,34 @@ ;; For DateTime values, the result is the same as extracting the Time component ;; from the DateTime value. ;; -;; If the argument is null, the result is null. \ No newline at end of file +;; If the argument is null, the result is null. +(deftest compile-to-time-test + (let [eval #(core/-eval % {:now tu/now} nil nil)] + (testing "String" + (are [x res] (= res (eval (tu/compile-unop elm/to-time elm/string x))) + "12:54:30" (system/time 12 54 30) + "12:54:30.010" (system/time 12 54 30 10) + + "aaaa" nil + "12:54" nil + "24:54:00" nil + "23:60:00" nil + "14-30-00.0" nil)) + + (testing "Time" + (are [x res] (= res (eval (tu/compile-unop elm/to-time elm/time x))) + "12:54" (system/time 12 54) + "12:54:00" (system/time 12 54 00) + "12:54:30.010" (system/time 12 54 30 10))) + + (testing "DateTime" + (are [x res] (= res (eval (tu/compile-unop elm/to-time elm/date-time x))) + "2020-03-08T12:54:00" (system/time 12 54 00) + "2020-03-08T12:54:30.010" (system/time 12 54 30 10))) + + (testing "dynamic" + (are [x res] (= res (tu/dynamic-compile-eval (elm/to-time x))) + #elm/parameter-ref "12:54:00" (system/time 12 54 00) + #elm/parameter-ref "2020-01-02T03:04:05.006Z" (system/time 3 4 5 6)))) + + (tu/testing-unary-null elm/to-time)) diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index fd4a48676..d0efde792 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -8,6 +8,9 @@ [clojure.string :as str])) +(set! *warn-on-reflection* true) + + ;; 1. Simple Values ;; 1.1. Literal @@ -461,9 +464,12 @@ timezone-offset (assoc :timezoneOffset timezone-offset))))) +;; 18.18. Time (defn time [arg] (if (string? arg) - (time (map integer (str/split arg #"[:.]"))) + (time (map integer (str/split (if (.contains ^String arg ".") + (subs (str arg "000") 0 12) + arg) #"[:.]"))) (let [[hour minute second millisecond] arg] (cond-> {:type "Time" @@ -882,7 +888,9 @@ (defn to-string [operand] {:type "ToString" :operand operand}) - +;; 22.31. ToTime +(defn to-time [operand] + {:type "ToTime" :operand operand}) ;; 23. Clinical Operators diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index c7c294143..cc144bfa7 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -493,6 +493,11 @@ :ret :elm/expression) +;; 22.31. ToTime +(s/fdef elm/to-time + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + ;; 23. Clinical Operators diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type/system.clj b/modules/fhir-structure/src/blaze/fhir/spec/type/system.clj index 082e54f4e..64b82bde3 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type/system.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type/system.clj @@ -9,7 +9,7 @@ * DateTime * Time * Quantity" - (:refer-clojure :exclude [boolean? decimal? integer? string? type]) + (:refer-clojure :exclude [boolean? decimal? integer? string? time type]) (:require [blaze.anomaly :as ba] [cognitect.anomalies :as anom] @@ -538,6 +538,34 @@ (some->> x (.equals time)))) +(defn time + "Returns a System.Time" + ([hour minute] + (LocalTime/of (int hour) (int minute))) + ([hour minute second] + (LocalTime/of (int hour) (int minute) (int second))) + ([hour minute second millis] + (LocalTime/of (int hour) (int minute) (int second) + (unchecked-multiply-int (int millis) 1000000)))) + + +(defn parse-time* [s] + (LocalTime/parse s)) + + +(defn- time-string? [s] + (.matches (re-matcher #"([01][0-9]|2[0-3]):[0-5][0-9]:([0-5][0-9]|60)(\.[0-9]+)?" s))) + + +(defn parse-time + "Parses `s` into a System.Time. + + Returns an anomaly if `s` isn't a valid System.Time." + [s] + (if (time-string? s) + (ba/try-one DateTimeParseException ::anom/incorrect (parse-time* s)) + (ba/incorrect (format "Invalid date-time value `%s`." s)))) + ;; ---- Other ----------------------------------------------------------------- diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj index cfe7ee8c4..0a38ea876 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj @@ -513,6 +513,9 @@ (testing "type" (is (= :system/time (system/type (LocalTime/of 0 0 0))))) + (testing "time" + (is (= (system/time 3 4) (LocalTime/of 3 4)))) + (testing "system equals" (are [a b res] (= res (system/equals a b)) (LocalTime/of 0 0 0) (LocalTime/of 0 0 0) true @@ -527,3 +530,20 @@ (LocalTime/of 0 0 0) (Object.) false (Object.) (LocalTime/of 0 0 0) false))) + + +(deftest parse-time-test + (testing "valid" + (are [s d] (= d (system/parse-time s)) + "03:04:05" (system/time 3 4 5) + "03:04:05.1" (system/time 3 4 5 100) + "03:04:05.01" (system/time 3 4 5 10) + "03:04:05.006" (system/time 3 4 5 6))) + + (testing "invalid" + (are [s] (= ::anom/incorrect (::anom/category (system/parse-time s))) + "a" + "" + "25:00:00" + "12:60:00" + "12:12:60"))) From 2b76d136ffc1bb95636ddda1736491680b66389e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 1 Jul 2022 16:00:27 +0200 Subject: [PATCH 008/124] Improve CQL Error Message on Subtract Also do not log expected errors. --- modules/anomaly/src/blaze/anomaly.clj | 9 ++- modules/cql/src/blaze/elm/date_time.clj | 48 ++++++++++++--- .../compiler/arithmetic_operators_test.clj | 37 +++++++++++- .../fhir/operation/evaluate_measure/cql.clj | 28 ++++++--- .../operation/evaluate_measure/cql_spec.clj | 6 +- .../operation/evaluate_measure/cql_test.clj | 58 +++++++++++++++---- 6 files changed, 152 insertions(+), 34 deletions(-) diff --git a/modules/anomaly/src/blaze/anomaly.clj b/modules/anomaly/src/blaze/anomaly.clj index ee4e84112..d05a559d6 100644 --- a/modules/anomaly/src/blaze/anomaly.clj +++ b/modules/anomaly/src/blaze/anomaly.clj @@ -110,8 +110,8 @@ (defmacro try-one - "Applies a try-catch arround `body` catching exceptions of `type`, returning - an anomaly with `category` and possible message of the exception." + "Applies a try-catch form arround `body` catching exceptions of `type`, + returning an anomaly with `category` and possible message of the exception." [type category & body] `(try ~@body @@ -125,7 +125,10 @@ `(try-one Throwable ~category ~@body)) -(defmacro try-anomaly [& body] +(defmacro try-anomaly + "Applies a try-catch form arround `body` catching all Throwables and returns + an anomaly created by the `anomaly` function." + [& body] `(try ~@body (catch Throwable e# diff --git a/modules/cql/src/blaze/elm/date_time.clj b/modules/cql/src/blaze/elm/date_time.clj index a32cf61be..e8c2576a8 100644 --- a/modules/cql/src/blaze/elm/date_time.clj +++ b/modules/cql/src/blaze/elm/date_time.clj @@ -70,7 +70,11 @@ (- months (:months other)) (- millis (:millis other))) (throw (ex-info (str "Invalid RHS subtracting from Period. Expected Period but was `" (type other) "`.") - {:op :subtract :this this :other other}))))) + {:op :subtract :this this :other other})))) + + Object + (toString [_] + (format "Period[month = %d, millis = %d]" months millis))) (defn period [years months millis] @@ -527,13 +531,43 @@ ;; 16.20. Subtract +(defn- year-out-of-range-msg [result period year] + (format "Year %s out of range while subtracting the period %s from the year %s." + result period year)) + + +(defn year-out-of-range-ex-info [year period result] + (ex-info (year-out-of-range-msg result period year) + {:op :subtract :year year :period period})) + + +(defn- year-month-out-of-range-msg [result period year-month] + (format "Year-month %s out of range while subtracting the period %s from the year-month %s." + result period year-month)) + + +(defn year-month-out-of-range-ex-info [year-month period result] + (ex-info (year-month-out-of-range-msg result period year-month) + {:op :subtract :year-month year-month :period period})) + + +(defn- date-out-of-range-msg [result period date] + (format "Date %s out of range while subtracting the period %s from the date %s." + result period date)) + + +(defn date-out-of-range-ex-info [date period result] + (ex-info (date-out-of-range-msg result period date) + {:op :subtract :date date :period period})) + + (extend-protocol p/Subtract Year (subtract [this other] (if (instance? Period other) (let [result (time/minus this (time/years (quot (:months other) 12)))] (if (time/before? result min-year) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (year-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to Year. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) @@ -543,7 +577,7 @@ (if (instance? Period other) (let [result (time/minus this (time/years (quot (:months other) 12)))] (if (time/before? result date-time-min-year) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (year-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to Year. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) @@ -553,7 +587,7 @@ (if (instance? Period other) (let [result (time/minus this (time/months (:months other)))] (if (time/before? result min-year-month) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (year-month-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to YearMonth. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) @@ -563,7 +597,7 @@ (if (instance? Period other) (let [result (time/minus this (time/months (:months other)))] (if (time/before? result date-time-min-year-month) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (year-month-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to YearMonth. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) @@ -576,7 +610,7 @@ (time/months (:months other)) (time/days (quot (:millis other) 86400000)))] (if (time/before? result min-date) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (date-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to LocalDate. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) @@ -589,7 +623,7 @@ (time/months (:months other)) (time/days (quot (:millis other) 86400000)))] (if (time/before? result date-time-min-date) - (throw (ex-info "Out of range." {:op :subtract :this this :other other})) + (throw (date-out-of-range-ex-info this other result)) result)) (throw (ex-info (str "Invalid RHS adding to LocalDate. Expected Period but was `" (type other) "`.") {:op :subtract :this this :other other})))) diff --git a/modules/cql/test/blaze/elm/compiler/arithmetic_operators_test.clj b/modules/cql/test/blaze/elm/compiler/arithmetic_operators_test.clj index 63f0bb4a5..77e2c3853 100644 --- a/modules/cql/test/blaze/elm/compiler/arithmetic_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/arithmetic_operators_test.clj @@ -1080,7 +1080,32 @@ #elm/date "2019-01-01" #elm/quantity [1 "year"] (system/date 2018 1 1) #elm/date "2012-02-29" #elm/quantity [1 "year"] (system/date 2011 2 28) #elm/date "2019-01-01" #elm/quantity [1 "month"] (system/date 2018 12 1) - #elm/date "2019-01-01" #elm/quantity [1 "day"] (system/date 2018 12 31))) + #elm/date "2019-01-01" #elm/quantity [1 "day"] (system/date 2018 12 31)) + + (testing "out of range" + (testing "year" + (given (ba/try-anomaly (c/compile {} (elm/subtract [#elm/date "2022" #elm/quantity [2022 "year"]]))) + ::anom/category := ::anom/fault + ::anom/message := "Year 0 out of range while subtracting the period Period[month = 24264, millis = 0] from the year 2022." + :op := :subtract + :year := (system/date 2022) + :period (date-time/period 2022 0 0))) + + (testing "year-month" + (given (ba/try-anomaly (c/compile {} (elm/subtract [#elm/date "2022-07" #elm/quantity [2022 "year"]]))) + ::anom/category := ::anom/fault + ::anom/message := "Year-month 0000-07 out of range while subtracting the period Period[month = 24264, millis = 0] from the year-month 2022-07." + :op := :subtract + :year-month := (system/date 2022 7) + :period (date-time/period 2022 0 0))) + + (testing "date" + (given (ba/try-anomaly (c/compile {} (elm/subtract [#elm/date "2022-07-01" #elm/quantity [2022 "year"]]))) + ::anom/category := ::anom/fault + ::anom/message := "Date 0000-07-01 out of range while subtracting the period Period[month = 24264, millis = 0] from the date 2022-07-01." + :op := :subtract + :date := (system/date 2022 7 1) + :period (date-time/period 2022 0 0))))) ;; TODO: find a solution to avoid overflow #_(testing "Subtracting a positive amount of years from a year makes it smaller" @@ -1150,7 +1175,15 @@ #elm/date-time "2019-01-01T00" #elm/quantity [1 "day"] (system/date-time 2018 12 31 0 0 0) #elm/date-time "2019-01-01T00" #elm/quantity [1 "hour"] (system/date-time 2018 12 31 23 0 0) #elm/date-time "2019-01-01T00" #elm/quantity [1 "minute"] (system/date-time 2018 12 31 23 59 0) - #elm/date-time "2019-01-01T00" #elm/quantity [1 "second"] (system/date-time 2018 12 31 23 59 59))) + #elm/date-time "2019-01-01T00" #elm/quantity [1 "second"] (system/date-time 2018 12 31 23 59 59)) + + (testing "out of range" + (given (ba/try-anomaly (c/compile {} (elm/subtract [#elm/date-time "2022" #elm/quantity [2022 "year"]]))) + ::anom/category := ::anom/fault + ::anom/message := "Year 0 out of range while subtracting the period Period[month = 24264, millis = 0] from the year 2022." + :op := :subtract + :year := (system/date-time 2022) + :period (date-time/period 2022 0 0)))) (testing "Time - Quantity" (are [x y res] (= res (c/compile {} (elm/subtract [x y]))) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj index 3f12a2d19..8fc265d67 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj @@ -31,18 +31,27 @@ 512) +(defn- evaluate-expression-1-error-msg [expression-name e] + (format "Error while evaluating the expression `%s`: %s" expression-name + (ex-message e))) + + (defn- evaluate-expression-1 [{:keys [library-context] :as context} subject-handle expression-name] (try (expr/eval context (get library-context expression-name) subject-handle) (catch Exception e - (log/error (format "Error while evaluating the expression `%s`:" - expression-name) (ex-message (ex-cause e))) - (log/error e) - (ba/fault - (ex-message e) - :fhir/issue "exception" - :expression-name expression-name)))) + (let [ex-data (ex-data e)] + ;; only log if the exception hasn't ex-data because exception with + ;; ex-data are controlled by us and so are not unexpected + (when-not ex-data + (log/error (evaluate-expression-1-error-msg expression-name e)) + (log/error e)) + (-> (ba/fault + (evaluate-expression-1-error-msg expression-name e) + :fhir/issue "exception" + :expression-name expression-name) + (merge ex-data)))))) (defn- close-batch-db! [{:keys [db]}] @@ -129,11 +138,12 @@ (defn- unwrap-library-context {:arglists '([context])} - [{{:keys [compiled-expression-defs parameter-default-values]} :library + [{:keys [parameters] + {:keys [compiled-expression-defs parameter-default-values]} :library :as context}] (assoc context :library-context compiled-expression-defs - :parameters parameter-default-values)) + :parameters (merge parameter-default-values parameters))) (defn evaluate-expression diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj index 0abb040d5..a6471fc17 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj @@ -22,13 +22,17 @@ :fhir.resource/type) +(s/def ::parameters + (s/map-of string? any?)) + + (s/def ::context (s/keys :req-un [:blaze.db/db ::now ::library ::subject-type :blaze.fhir.operation.evaluate-measure/report-type])) (s/def ::individual-context - (s/keys :req-un [:blaze.db/db ::now ::library])) + (s/keys :req-un [:blaze.db/db ::now ::library] :opt-un [::parameters])) (s/fdef cql/evaluate-expression diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index b5257f971..edd8b1ed6 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -6,9 +6,11 @@ [blaze.db.api :as d] [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.elm.compiler.library :as library] + [blaze.elm.date-time :as date-time] [blaze.elm.expression :as expr] [blaze.fhir.operation.evaluate-measure.cql :as cql] [blaze.fhir.operation.evaluate-measure.cql-spec] + [blaze.fhir.spec.type.system :as system] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -37,7 +39,7 @@ (OffsetDateTime/now ^Clock clock)) -(def cql +(def cql-gender "library Retrieve using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' @@ -48,7 +50,20 @@ Patient.gender = 'male'") -(defn- compile-library [node] +(def cql-error + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + parameter Year2022 Date + + context Patient + + define InInitialPopulation: + Year2022 - 2022 'years'") + + +(defn- compile-library [node cql] (when-ok [library (cql-translator/translate cql)] (library/compile-library node library {}))) @@ -65,7 +80,7 @@ [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}]]] (let [context {:db (d/db node) :now (now clock) - :library (compile-library node) + :library (compile-library node cql-gender) :subject-type "Patient" :report-type "population"}] (is (= 1 (cql/evaluate-expression context "InInitialPopulation"))))) @@ -76,13 +91,13 @@ [[[:put {:fhir/type :fhir/Patient :id "0"}]]] (let [context {:db (d/db node) :now (now clock) - :library (compile-library node) + :library (compile-library node cql-gender) :subject-type "Patient" :report-type "population"}] (with-redefs [expr/eval (failing-eval "msg-222453")] (given (cql/evaluate-expression context "InInitialPopulation") ::anom/category := ::anom/fault - ::anom/message := "msg-222453")))))) + ::anom/message := "Error while evaluating the expression `InInitialPopulation`: msg-222453")))))) (deftest evaluate-individual-expression-test @@ -94,7 +109,7 @@ patient (d/resource-handle db "Patient" "0") context {:db db :now (now clock) - :library (compile-library node)}] + :library (compile-library node cql-gender)}] (is (true? (cql/evaluate-individual-expression context patient "InInitialPopulation")))))) (testing "no match" @@ -105,8 +120,27 @@ patient (d/resource-handle db "Patient" "0") context {:db db :now (now clock) - :library (compile-library node)}] - (is (false? (cql/evaluate-individual-expression context patient "InInitialPopulation"))))))) + :library (compile-library node cql-gender)}] + (is (false? (cql/evaluate-individual-expression context patient "InInitialPopulation")))))) + + (testing "error" + (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} + mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [db (d/db node) + patient (d/resource-handle db "Patient" "0") + context {:db db + :now (now clock) + :library (compile-library node cql-error) + :parameters {"Year2022" (system/date 2022)}}] + (given (cql/evaluate-individual-expression context patient "InInitialPopulation") + ::anom/category := ::anom/fault + ::anom/message := "Error while evaluating the expression `InInitialPopulation`: Year 0 out of range while subtracting the period Period[month = 24264, millis = 0] from the year 2022." + :fhir/issue := "exception" + :expression-name := "InInitialPopulation" + :op := :subtract + :year := (system/date 2022) + :period := (date-time/period 2022 0 0)))))) (def two-value-eval @@ -120,13 +154,13 @@ [[[:put {:fhir/type :fhir/Patient :id "0"}]]] (let [context {:db (d/db node) :now (now clock) - :library (compile-library node) + :library (compile-library node cql-gender) :subject-type "Patient" :report-type "population"}] (with-redefs [expr/eval (failing-eval "msg-221825")] (given (cql/calc-strata context "" "") ::anom/category := ::anom/fault - ::anom/message := "msg-221825"))))) + ::anom/message := "Error while evaluating the expression ``: msg-221825"))))) (testing "multiple values" (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} @@ -134,7 +168,7 @@ [[[:put {:fhir/type :fhir/Patient :id "0"}]]] (let [context {:db (d/db node) :now (now clock) - :library (compile-library node) + :library (compile-library node cql-gender) :subject-type "Patient" :report-type "population"}] (with-redefs [expr/eval two-value-eval] @@ -157,4 +191,4 @@ (with-redefs [expr/eval (failing-eval "msg-221154")] (given (cql/calc-individual-strata nil nil nil nil) ::anom/category := ::anom/fault - ::anom/message := "msg-221154")))) + ::anom/message := "Error while evaluating the expression `null`: msg-221154")))) From 3926bf0f17f2fca397216c2c47c466b5d76b02af Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 1 Jul 2022 18:39:15 +0200 Subject: [PATCH 009/124] Release v0.17.9 --- CHANGELOG.md | 9 +++++++++ README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 86567202b..c913540d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## v0.17.9 + +### Other Improvements + +* Implement CQL ToTime and rearrange ToDate and ToDateTime ([#747](https://github.com/samply/blaze/pull/747)) +* Improve CQL Error Message on Subtract ([#755](https://github.com/samply/blaze/pull/755)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/47?closed=1). + ## v0.17.8 ### Other diff --git a/README.md b/README.md index 8a48ee0ae..89d428c5f 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.8][5] +Latest release: [v0.17.9][5] ## Quick Start @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index f8ea6894c..b68d04a1b 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.8 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.9 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.8" + "version": "0.17.9" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 299e7a41e..edc4ac528 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11. Blaze is tested with [AdoptOpenJDK][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.8). Look for `blaze-0.17.8-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.9). Look for `blaze-0.17.9-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.8-standalone.jar -m blaze.core +java -jar blaze-0.17.9-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.8-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.17.9-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.8-standalone.jar -m blaze.core +java -jar blaze-0.17.9-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.8 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.9 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.8" + "version": "0.17.9" } ``` diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 6464d4f17..766e2c7f0 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.8 + 0.17.9 1.8 diff --git a/pom.xml b/pom.xml index 633f6e89e..b61e43b73 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.8 + 0.17.9 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index bac30e8c3..18f72cf9a 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.8" + {:blaze/version "0.17.9" :blaze/clock {} From 4bcd0d3b6b5c2601067145c11b204cc3f4b64360 Mon Sep 17 00:00:00 2001 From: Marlena Meyer Date: Thu, 30 Jun 2022 09:40:07 +0200 Subject: [PATCH 010/124] Implement CQL ConvertsToDate and ConvertsToDateTime and add new query to test SocialSecurityNumber with ConvertsToInteger --- docs/conformance/cql.md | 22 +-- .../src/blaze/elm/compiler/type_operators.clj | 36 ++++- .../elm/compiler/type_operators_test.clj | 61 +++++++- modules/cql/test/blaze/elm/literal.clj | 10 ++ modules/cql/test/data_readers.clj | 2 + .../evaluate_measure/measure_test.clj | 5 +- .../q39-social-sec-num-data.json | 145 ++++++++++++++++++ .../q39-social-sec-num-query.cql | 15 ++ 8 files changed, 279 insertions(+), 17 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index f3a43a47c..01fe594ef 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -329,20 +329,20 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.4. | Children | ✓ | | | | 22.5. | Convert | ✗ | | | | 22.6. | ConvertQuantity | ✓ | | | -| 22.7. | ConvertsToBoolean | ✗ | | | -| 22.8. | ConvertsToDate | ✗ | | | -| 22.9. | ConvertsToDateTime | ✗ | | | -| 22.10. | ConvertsToDecimal | ✗ | | | -| 22.11. | ConvertsToLong | ✗ | | | -| 22.12. | ConvertsToInteger | ✗ | | | -| 22.13. | ConvertsToQuantity | ✗ | | | +| 22.7. | ConvertsToBoolean | ✓ | | | +| 22.8. | ConvertsToDate | ✓ | | | +| 22.9. | ConvertsToDateTime | ✓ | | | +| 22.10. | ConvertsToDecimal | ✓ | | | +| 22.11. | ConvertsToLong | ✓ | | | +| 22.12. | ConvertsToInteger | ✓ | | | +| 22.13. | ConvertsToQuantity | ✓ | | | | 22.14. | ConvertsToRatio | ✗ | | | -| 22.15. | ConvertsToString | ✗ | | | +| 22.15. | ConvertsToString | ✓ | | | | 22.16. | ConvertsToTime | ✗ | | | | 22.17. | Descendents | ✓ | | | | 22.18. | Is | ✗ | | | -| 22.19. | ToBoolean | ✗ | | | -| 22.20. | ToChars | ✗ | | | +| 22.19. | ToBoolean | ✓ | | | +| 22.20. | ToChars | ✓ | | | | 22.21. | ToConcept | ✗ | | | | 22.22. | ToDate | ✓ | | | | 22.23. | ToDateTime | ✓ | | | @@ -353,7 +353,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.28. | ToQuantity | ✓ | | | | 22.29. | ToRatio | ✗ | | | | 22.30. | ToString | ✓ | | | -| 22.31. | ToTime | ✗ | | | +| 22.31. | ToTime | ✓ | | | ### 23. Clinical Operators diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index 98110464f..335f67533 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -130,9 +130,41 @@ (some? (p/to-boolean operand)))) -;; TODO 22.8. ConvertsToDate +;; 22.8. ConvertsToDate +(defrecord ConvertsToDateOperatorExpression [operand] + core/Expression + (-eval [_ {:keys [now] :as context} resource scope] + (when-let [operand (core/-eval operand context resource scope)] + (when (some? operand) + (some? (p/to-date operand now))))) + (-form [_] + (list 'converts-to-date (core/-form operand)))) + + +(defmethod core/compile* :elm.compiler.type/converts-to-date + [context {:keys [operand]}] + (when-let [operand (core/compile* context operand)] + (->ConvertsToDateOperatorExpression operand))) + + +;; 22.9. ConvertsToDateTime +(defrecord ConvertsToDateTimeOperatorExpression [operand] + core/Expression + (-eval [_ {:keys [now] :as context} resource scope] + (when-let [operand (core/-eval operand context resource scope)] + (when (some? operand) + (some? (p/to-date-time operand now))))) + (-form [_] + (list 'converts-to-date-time (core/-form operand)))) + + +(defmethod core/compile* :elm.compiler.type/converts-to-date-time + [context {:keys [operand]}] + (when-let [operand (core/compile* context operand)] + (if (system/date? operand) + (some? (p/to-date-time operand nil)) + (->ConvertsToDateTimeOperatorExpression operand)))) -;; TODO 22.9. ConvertsToDateTime ;; 22.10. ConvertsToDecimal (defunop converts-to-decimal [operand] diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 9474397d8..0f728c002 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -380,7 +380,7 @@ expr (c/compile compile-ctx elm)] (is (= '(converts-to-boolean (param-ref "x")) (core/-form expr)))))) -;; TODO 22.8. ConvertsToDate +;; 22.8. ConvertsToDate ;; ;; The ConvertsToDate operator returns true if the value of its argument is or ;; can be converted to a Date value. @@ -404,8 +404,38 @@ ;; As with date literals, date values may be specified to any precision. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-date-test + (let [eval #(core/-eval % {:now tu/now} nil nil)] + (testing "String" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-date elm/string x))) + "2019" + "2019-01" + "2019-01-01") + + (are [x] (false? (eval (tu/compile-unop elm/converts-to-date elm/string x))) + "aaaa" + "2019-13" + "2019-02-29")) + + (testing "Date" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-date elm/date x))) + "2019" + "2019-01" + "2019-01-01")) + + (testing "DateTime" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-date elm/date-time x))) + "2019" + "2019-01" + "2019-01-01" + "2019-01-01T12:13"))) + + (tu/testing-unary-null elm/converts-to-date) + + (tu/testing-unary-form elm/converts-to-date)) + -;; TODO 22.9. ConvertsToDateTime +;; 22.9. ConvertsToDateTime ;; ;; The ConvertsToDateTime operator returns true if the value of its argument is ;; or can be converted to a DateTime value. @@ -428,6 +458,33 @@ ;; evaluation request timestamp is assumed. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-date-time-test + (let [eval #(core/-eval % {:now tu/now} nil nil)] + (testing "String" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-date-time elm/string x))) + "2020-03-08T12:54:00+01:00") + + (are [x] (false? (eval (tu/compile-unop elm/converts-to-date-time elm/string x))) + "2019-13" + "2019-02-29")) + + (testing "Date" + (testing "Static" + (are [x] (true? (tu/compile-unop elm/converts-to-date-time elm/date x)) + "2020" + "2020-03" + "2020-03-08"))) + + (testing "DateTime" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-date-time elm/date-time x))) + "2020" + "2020-03" + "2020-03-08" + "2020-03-08T12:13" ))) + + (tu/testing-unary-null elm/converts-to-date-time) + + (tu/testing-unary-form elm/converts-to-date-time)) ;; 22.10. ConvertsToDecimal diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index d0efde792..dca9cde80 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -809,6 +809,16 @@ {:type "ConvertsToBoolean" :operand operand}) +;; 22.8. ConvertsToDate +(defn converts-to-date [operand] + {:type "ConvertsToDate" :operand operand}) + + +;; 22.9. ConvertsToDateTime +(defn converts-to-date-time [operand] + {:type "ConvertsToDateTime" :operand operand}) + + ;; 22.10. ConvertsToDecimal (defn converts-to-decimal [operand] {:type "ConvertsToDecimal" :operand operand}) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index d501bc3b4..32ef4c4e0 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -71,6 +71,8 @@ elm/can-convert-quantity blaze.elm.literal/can-convert-quantity elm/convert-quantity blaze.elm.literal/convert-quantity elm/converts-to-boolean blaze.elm.literal/converts-to-boolean + elm/converts-to-date blaze.elm.literal/converts-to-date + elm/converts-to-date-time blaze.elm.literal/converts-to-date-time elm/converts-to-decimal blaze.elm.literal/converts-to-decimal elm/converts-to-long blaze.elm.literal/converts-to-long elm/converts-to-integer blaze.elm.literal/converts-to-integer diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index a2d1a5aed..9fb133734 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -343,7 +343,8 @@ "q35-literal-library-ref" 1 "q36-parameter" 1 "q37-overlaps" 3 - "q38-di-surv" 2) + "q38-di-surv" 2 + "q39-social-sec-num" 1) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -497,5 +498,5 @@ (comment (log/set-level! :debug) (evaluate "q38-di-surv") - + (evaluate "q39-social-sec-num") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json new file mode 100644 index 000000000..1ab5fe0f2 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json @@ -0,0 +1,145 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0", + "identifier": [ + { + "system": "https://github.com/synthetichealth/synthea", + "value": "1363ed76-25b9-dc4f-6de7-6ee133d82db3" + }, + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "MR", + "display": "Medical Record Number" + } + ], + "text": "Medical Record Number" + }, + "system": "http://hospital.smarthealthit.org", + "value": "1363ed76-25b9-dc4f-6de7-6ee133d82db3" + }, + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "SS", + "display": "Social Security Number" + } + ], + "text": "Social Security Number" + }, + "system": "http://hl7.org/fhir/sid/us-ssn", + "value": "9A99-97-1459" + } + ] + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1", + "identifier": [ + { + "system": "https://github.com/synthetichealth/synthea", + "value": "19625ee6-1a94-1a6a-ca95-40c4efbbdfc7" + }, + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "MR", + "display": "Medical Record Number" + } + ], + "text": "Medical Record Number" + }, + "system": "http://hospital.smarthealthit.org", + "value": "19625ee6-1a94-1a6a-ca95-40c4efbbdfc7" + }, + { + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/v2-0203", + "code": "SS", + "display": "Social Security Number" + } + ], + "text": "Social Security Number" + }, + "system": "http://hl7.org/fhir/sid/us-ssn", + "value": "999-38-6812" + } + ] + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql new file mode 100644 index 000000000..c06674931 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql @@ -0,0 +1,15 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define SocialSecurityNumber: + First(Patient.identifier.where(system = 'http://hl7.org/fhir/sid/us-ssn').value) + +define IntegerParts: + from (Split(SocialSecurityNumber, '-')) S + where ConvertsToInteger(S) + +define InInitialPopulation: + Count(IntegerParts) = 3 From 4b2dc550c7e87774d7ae73a38eeed08089a8b3b3 Mon Sep 17 00:00:00 2001 From: Marlena Meyer Date: Mon, 4 Jul 2022 18:00:47 +0200 Subject: [PATCH 011/124] Implement CQL ConvertsToTime --- docs/conformance/cql.md | 64 +++++++++---------- .../src/blaze/elm/compiler/type_operators.clj | 17 ++++- .../elm/compiler/type_operators_test.clj | 36 ++++++++++- modules/cql/test/blaze/elm/literal.clj | 5 ++ modules/cql/test/data_readers.clj | 1 + 5 files changed, 89 insertions(+), 34 deletions(-) diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index 01fe594ef..6d1b24564 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -322,38 +322,38 @@ The section numbers refer to the documentation of the [ELM Specification](https: ### 22. Type Operators | Num | Group | Expression | State | Notes | -|--------|--------------------|------------|---------------|-------| -| 22.1. | As | ! | no strictness | | -| 22.2. | CanConvert | ✗ | | | -| 22.3. | CanConvertQuantity | ✓ | | | -| 22.4. | Children | ✓ | | | -| 22.5. | Convert | ✗ | | | -| 22.6. | ConvertQuantity | ✓ | | | -| 22.7. | ConvertsToBoolean | ✓ | | | -| 22.8. | ConvertsToDate | ✓ | | | -| 22.9. | ConvertsToDateTime | ✓ | | | -| 22.10. | ConvertsToDecimal | ✓ | | | -| 22.11. | ConvertsToLong | ✓ | | | -| 22.12. | ConvertsToInteger | ✓ | | | -| 22.13. | ConvertsToQuantity | ✓ | | | -| 22.14. | ConvertsToRatio | ✗ | | | -| 22.15. | ConvertsToString | ✓ | | | -| 22.16. | ConvertsToTime | ✗ | | | -| 22.17. | Descendents | ✓ | | | -| 22.18. | Is | ✗ | | | -| 22.19. | ToBoolean | ✓ | | | -| 22.20. | ToChars | ✓ | | | -| 22.21. | ToConcept | ✗ | | | -| 22.22. | ToDate | ✓ | | | -| 22.23. | ToDateTime | ✓ | | | -| 22.24. | ToDecimal | ✓ | | | -| 22.25. | ToInteger | ✓ | | | -| 22.26. | ToList | ✓ | | | -| 22.27. | ToLong | ✓ | | | -| 22.28. | ToQuantity | ✓ | | | -| 22.29. | ToRatio | ✗ | | | -| 22.30. | ToString | ✓ | | | -| 22.31. | ToTime | ✓ | | | +|--------|--------------------|-----------|---------------|-------| +| 22.1. | As | ! | no strictness | | +| 22.2. | CanConvert | ✗ | | | +| 22.3. | CanConvertQuantity | ✓ | | | +| 22.4. | Children | ✓ | | | +| 22.5. | Convert | ✗ | | | +| 22.6. | ConvertQuantity | ✓ | | | +| 22.7. | ConvertsToBoolean | ✓ | | | +| 22.8. | ConvertsToDate | ✓ | | | +| 22.9. | ConvertsToDateTime | ✓ | | | +| 22.10. | ConvertsToDecimal | ✓ | | | +| 22.11. | ConvertsToLong | ✓ | | | +| 22.12. | ConvertsToInteger | ✓ | | | +| 22.13. | ConvertsToQuantity | ✓ | | | +| 22.14. | ConvertsToRatio | ✗ | | | +| 22.15. | ConvertsToString | ✓ | | | +| 22.16. | ConvertsToTime | ✓ | | | +| 22.17. | Descendents | ✓ | | | +| 22.18. | Is | ✗ | | | +| 22.19. | ToBoolean | ✓ | | | +| 22.20. | ToChars | ✓ | | | +| 22.21. | ToConcept | ✗ | | | +| 22.22. | ToDate | ✓ | | | +| 22.23. | ToDateTime | ✓ | | | +| 22.24. | ToDecimal | ✓ | | | +| 22.25. | ToInteger | ✓ | | | +| 22.26. | ToList | ✓ | | | +| 22.27. | ToLong | ✓ | | | +| 22.28. | ToQuantity | ✓ | | | +| 22.29. | ToRatio | ✗ | | | +| 22.30. | ToString | ✓ | | | +| 22.31. | ToTime | ✓ | | | ### 23. Clinical Operators diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index 335f67533..3f078a70e 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -198,7 +198,22 @@ (some? (p/to-string operand)))) -;; TODO 22.16. ConvertsToTime +;; 22.16. ConvertsToTime +(defrecord ConvertsToTimeOperatorExpression [operand] + core/Expression + (-eval [_ {:keys [now] :as context} resource scope] + (when-let [operand (core/-eval operand context resource scope)] + (when (some? operand) + (some? (p/to-time operand now))))) + (-form [_] + (list 'converts-to-time (core/-form operand)))) + + +(defmethod core/compile* :elm.compiler.type/converts-to-time + [context {:keys [operand]}] + (when-let [operand (core/compile* context operand)] + (->ConvertsToTimeOperatorExpression operand))) + ;; 22.17. Descendents (defrecord DescendentsOperatorExpression [source] diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 0f728c002..2d646c4a8 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -829,7 +829,7 @@ expr (c/compile compile-ctx elm)] (is (= '(converts-to-string (param-ref "x")) (core/-form expr)))))) -;; TODO 22.16. ConvertsToTime +;; 22.16. ConvertsToTime ;; ;; The ConvertsToTime operator returns true if the value of its argument is or ;; can be converted to a Time value. @@ -852,6 +852,40 @@ ;; evaluation request timestamp is assumed. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-time-test + (let [eval #(core/-eval % {:now tu/now} nil nil)] + (testing "String" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-time elm/string x))) + "12:54:30" + "12:54:30.010") + + (are [x] (false? (eval (tu/compile-unop elm/converts-to-time elm/string x))) + "aaaa" + "12:54" + "24:54:00" + "23:60:00" + "14-30-00.0")) + + (testing "Time" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-time elm/time x))) + "12:54" + "12:54:00" + "12:54:30.010")) + + (testing "DateTime" + (are [x] (true? (eval (tu/compile-unop elm/converts-to-time elm/date-time x))) + "2020-03-08T12:54:00" + "2020-03-08T12:54:30.010")) + + (testing "dynamic" + (are [x] (true? (tu/dynamic-compile-eval (elm/converts-to-time x))) + #elm/parameter-ref "12:54:00" + #elm/parameter-ref "2020-01-02T03:04:05.006Z"))) + + (tu/testing-unary-null elm/converts-to-time) + + (tu/testing-unary-form elm/converts-to-time)) + ;; 22.17. Descendents ;; diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index dca9cde80..04f3f769e 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -844,6 +844,11 @@ {:type "ConvertsToString" :operand operand}) +;; 22.16. ConvertsToTime +(defn converts-to-time [operand] + {:type "ConvertsToTime" :operand operand}) + + ;; 22.17. Descendents (defn descendents [source] {:type "Descendents" :source source}) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index 32ef4c4e0..750db50ac 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -78,6 +78,7 @@ elm/converts-to-integer blaze.elm.literal/converts-to-integer elm/converts-to-quantity blaze.elm.literal/converts-to-quantity elm/converts-to-string blaze.elm.literal/converts-to-string + elm/converts-to-time blaze.elm.literal/converts-to-time elm/children blaze.elm.literal/children elm/descendents blaze.elm.literal/descendents elm/to-boolean blaze.elm.literal/to-boolean From b95b04b077df6cdaa465664aa592979b53360199 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 4 Jul 2022 19:19:41 +0200 Subject: [PATCH 012/124] Fix Reference Resolution on Extended Primitive References This bug was introduced by #722. Reference resolution only works on non-extended Reference.reference string types. On extended string types however the value of the extended string has to be obtained by calling the value function. which also works on non-extended strings. Closes: #758 --- .../test/blaze/db/node/transaction_test.clj | 33 ++++++++-- .../src/blaze/fhir/spec/type.clj | 4 +- .../test/blaze/fhir/spec/type_test.clj | 62 ++++++++++++------- 3 files changed, 67 insertions(+), 32 deletions(-) diff --git a/modules/db/test/blaze/db/node/transaction_test.clj b/modules/db/test/blaze/db/node/transaction_test.clj index bf4eff3f3..4ef5d6f85 100644 --- a/modules/db/test/blaze/db/node/transaction_test.clj +++ b/modules/db/test/blaze/db/node/transaction_test.clj @@ -35,7 +35,7 @@ (given (tx/prepare-ops context [[:create {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}]]) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}]]) [0 0 :op] := "create" [0 0 :type] := "Observation" [0 0 :id] := "0" @@ -43,13 +43,34 @@ [0 0 :refs] := [["Patient" "0"]] [1 0 0] := #blaze/hash"7B3980C2BFCF43A8CDD61662E1AABDA9CA6431964820BC8D52958AEC9A270378" [1 0 1] := {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}) + + (testing "with extended reference.reference" + (given (tx/prepare-ops + context + [[:create + {:fhir/type :fhir/Observation :id "0" + :subject #fhir/Reference + {:reference #fhir/string + {:extension [#fhir/Extension{:url "foo"}] + :value "Patient/190740"}}}]]) + [0 0 :refs] := [["Patient" "190740"]]) + + (testing "without value" + (given (tx/prepare-ops + context + [[:create + {:fhir/type :fhir/Observation :id "0" + :subject #fhir/Reference + {:reference #fhir/string + {:extension [#fhir/Extension{:url "foo"}]}}}]]) + [0 0 :refs] :? empty?))) (testing "with disabled referential integrity check" (given (tx/prepare-ops {:blaze.db/enforce-referential-integrity false} [[:create {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}]]) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}]]) [0 0 :refs] :? empty?))) (testing "conditional" @@ -75,7 +96,7 @@ (given (tx/prepare-ops context [[:put {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}]]) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}]]) [0 0 :op] := "put" [0 0 :type] := "Observation" [0 0 :id] := "0" @@ -83,12 +104,12 @@ [0 0 :refs] := [["Patient" "0"]] [1 0 0] := #blaze/hash"7B3980C2BFCF43A8CDD61662E1AABDA9CA6431964820BC8D52958AEC9A270378" [1 0 1] := {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}) (testing "with disabled referential integrity check" (given (tx/prepare-ops {:blaze.db/enforce-referential-integrity false} [[:put {:fhir/type :fhir/Observation :id "0" - :subject #fhir/Reference{:reference "Patient/0"}}]]) + :subject #fhir/Reference{:reference #fhir/string"Patient/0"}}]]) [0 0 :refs] :? empty?))) (testing "with matches" diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type.clj b/modules/fhir-structure/src/blaze/fhir/spec/type.clj index a292f4f99..96a1736b6 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type.clj @@ -36,7 +36,7 @@ (xml-name/alias-uri 'f "http://hl7.org/fhir") -;;(set! *warn-on-reflection* true) +(set! *warn-on-reflection* true) (set! *unchecked-math* :warn-on-boxed) @@ -1209,7 +1209,7 @@ ^:primitive-string display] :hash-num 43 :references - (-> (transient (or (some-> reference reference-reference) [])) + (-> (transient (or (some-> reference value reference-reference) [])) (macros/into! (p/-references extension)) (macros/into! (p/-references type)) (macros/into! (p/-references identifier)) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj index df43c1e3a..433dc0b1e 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj @@ -22,7 +22,8 @@ [com.fasterxml.jackson.databind ObjectMapper] [com.google.common.hash Hashing] [java.nio.charset StandardCharsets] - [java.time Instant LocalTime OffsetDateTime ZoneOffset])) + [java.time Instant LocalTime OffsetDateTime ZoneOffset] + [com.fasterxml.jackson.core SerializableString])) (xml-name/alias-uri 'f "http://hl7.org/fhir") @@ -489,27 +490,27 @@ (testing "getValue" (satisfies-prop 10 (prop/for-all [value fg/uri-value] - (= value (.getValue (type/uri value)))))) + (= value (.getValue ^SerializableString (type/uri value)))))) (testing "appendQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/uri-value] (let [expected-buffer (.quoteAsUTF8 (JsonStringEncoder/getInstance) value) buffer (byte-array (count expected-buffer))] - (.appendQuotedUTF8 (type/uri value) buffer 0) + (.appendQuotedUTF8 ^SerializableString (type/uri value) buffer 0) (= (bb/wrap expected-buffer) (bb/wrap buffer)))))) (testing "asUnquotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/uri-value] (= (bb/wrap (.encodeAsUTF8 (JsonStringEncoder/getInstance) ^String value)) - (bb/wrap (.asUnquotedUTF8 (type/uri value))))))) + (bb/wrap (.asUnquotedUTF8 ^SerializableString (type/uri value))))))) (testing "asQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/uri-value] (= (bb/wrap (.quoteAsUTF8 (JsonStringEncoder/getInstance) value)) - (bb/wrap (.asQuotedUTF8 (type/uri value))))))))) + (bb/wrap (.asQuotedUTF8 ^SerializableString (type/uri value))))))))) (deftest url-test @@ -666,27 +667,27 @@ (testing "getValue" (satisfies-prop 10 (prop/for-all [value fg/canonical-value] - (= value (.getValue (type/canonical value)))))) + (= value (.getValue ^SerializableString (type/canonical value)))))) (testing "appendQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/canonical-value] (let [expected-buffer (.quoteAsUTF8 (JsonStringEncoder/getInstance) value) buffer (byte-array (count expected-buffer))] - (.appendQuotedUTF8 (type/canonical value) buffer 0) + (.appendQuotedUTF8 ^SerializableString (type/canonical value) buffer 0) (= (bb/wrap expected-buffer) (bb/wrap buffer)))))) (testing "asUnquotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/canonical-value] (= (bb/wrap (.encodeAsUTF8 (JsonStringEncoder/getInstance) ^String value)) - (bb/wrap (.asUnquotedUTF8 (type/canonical value))))))) + (bb/wrap (.asUnquotedUTF8 ^SerializableString (type/canonical value))))))) (testing "asQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/canonical-value] (= (bb/wrap (.quoteAsUTF8 (JsonStringEncoder/getInstance) value)) - (bb/wrap (.asQuotedUTF8 (type/canonical value))))))))) + (bb/wrap (.asQuotedUTF8 ^SerializableString (type/canonical value))))))))) (deftest base64Binary-test @@ -1004,7 +1005,7 @@ (testing "equals" (satisfies-prop 100 (prop/for-all [date (s/gen :system/date)] - (.equals date date))) + (.equals ^Object date date))) (is (not (.equals #fhir/date"2020-01-01" #fhir/date"2020-01-02"))) (is (not (.equals #fhir/date"2020-01-01" "2020-01-01")))) @@ -1421,7 +1422,7 @@ (is (= extended-date-time-element (type/to-xml extended-date-time)))) (testing "equals" - (is (.equals (type/dateTime {:extension [string-extension] :value "2020"}) extended-date-time))) + (is (.equals ^Object (type/dateTime {:extension [string-extension] :value "2020"}) extended-date-time))) (testing "hash-into" (are [x hex] (= hex (murmur3 x)) @@ -1577,27 +1578,27 @@ (testing "getValue" (satisfies-prop 10 (prop/for-all [value fg/code-value] - (= value (.getValue (type/code value)))))) + (= value (.getValue ^SerializableString (type/code value)))))) (testing "appendQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/code-value] (let [expected-buffer (.quoteAsUTF8 (JsonStringEncoder/getInstance) value) buffer (byte-array (count expected-buffer))] - (.appendQuotedUTF8 (type/code value) buffer 0) + (.appendQuotedUTF8 ^SerializableString (type/code value) buffer 0) (= (bb/wrap expected-buffer) (bb/wrap buffer)))))) (testing "asUnquotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/code-value] (= (bb/wrap (.encodeAsUTF8 (JsonStringEncoder/getInstance) ^String value)) - (bb/wrap (.asUnquotedUTF8 (type/code value))))))) + (bb/wrap (.asUnquotedUTF8 ^SerializableString (type/code value))))))) (testing "asQuotedUTF8" (satisfies-prop 100 (prop/for-all [value fg/code-value] (= (bb/wrap (.quoteAsUTF8 (JsonStringEncoder/getInstance) value)) - (bb/wrap (.asQuotedUTF8 (type/code value))))))))) + (bb/wrap (.asQuotedUTF8 ^SerializableString (type/code value))))))))) (deftest oid-test @@ -2588,7 +2589,7 @@ #fhir/Reference{:extension [#fhir/Extension{}]} "210e3eb7" - #fhir/Reference{:reference "Patient/0"} + #fhir/Reference{:reference #fhir/string"Patient/0"} "cd80b8ac" #fhir/Reference{:type #fhir/uri"type-161222"} @@ -2597,7 +2598,7 @@ #fhir/Reference{:identifier #fhir/Identifier{}} "eb066d27" - #fhir/Reference{:display "display-161314"} + #fhir/Reference{:display #fhir/string"display-161314"} "543cf75f")) (testing "references" @@ -2610,23 +2611,36 @@ #fhir/Reference {:extension - [#fhir/Extension{:value #fhir/Reference{:reference "Patient/1"}}]} + [#fhir/Extension + {:value #fhir/Reference + {:reference #fhir/string"Patient/1"}}]} [["Patient" "1"]] - #fhir/Reference{:reference "Patient/0"} + #fhir/Reference{:reference #fhir/string"Patient/0"} [["Patient" "0"]] - #fhir/Reference{:reference "Patient"} + #fhir/Reference{:reference #fhir/string"Patient"} [] - #fhir/Reference{:reference ""} + #fhir/Reference{:reference #fhir/string""} [] #fhir/Reference {:extension - [#fhir/Extension{:value #fhir/Reference{:reference "Patient/1"}}] - :reference "Patient/0"} - [["Patient" "0"] ["Patient" "1"]])) + [#fhir/Extension + {:value #fhir/Reference + {:reference #fhir/string"Patient/1"}}] + :reference #fhir/string"Patient/0"} + [["Patient" "0"] ["Patient" "1"]] + + #fhir/Reference + {:reference #fhir/string{:extension [#fhir/Extension{:url "foo"}]}} + [] + + #fhir/Reference + {:reference #fhir/string{:extension [#fhir/Extension{:url "foo"}] + :value "Patient/0"}} + [["Patient" "0"]])) (testing "print" (are [v s] (= s (pr-str v)) From be31285d3081b8a2d3507ef7d1f4f7a0a2606de3 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 4 Jul 2022 16:04:06 +0200 Subject: [PATCH 013/124] Update Dev Dependencies --- deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 0b9533a40..9ad80e070 100644 --- a/deps.edn +++ b/deps.edn @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "1.7.804"} + {:mvn/version "1.8.847"} org.slf4j/slf4j-nop {:mvn/version "1.7.36"}} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 5ca789b91..1fb7ec0d0 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-client"} jepsen/jepsen - {:mvn/version "0.2.6"}} + {:mvn/version "0.2.7"}} :aliases {:test From d8bf662a7de29979eb3fba6dc8d9323ada61124e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 4 Jul 2022 20:50:25 +0200 Subject: [PATCH 014/124] Release v0.17.10 --- CHANGELOG.md | 12 ++++++++++++ README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c913540d7..dde33f72d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v0.17.10 + +### Bugfixes + +* Fix Reference Resolution on Extended Primitive References + +### Other Improvements ([#758](https://github.com/samply/blaze/issues/758)) + +* Implement CQL ConvertsToTime ([#759](https://github.com/samply/blaze/pull/759)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/48?closed=1). + ## v0.17.9 ### Other Improvements diff --git a/README.md b/README.md index 89d428c5f..a80017f79 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.9][5] +Latest release: [v0.17.10][5] ## Quick Start @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index b68d04a1b..dd67cdc78 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.9 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.10 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.9" + "version": "0.17.10" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index edc4ac528..ee5595e1e 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11. Blaze is tested with [AdoptOpenJDK][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.9). Look for `blaze-0.17.9-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.10). Look for `blaze-0.17.10-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.9-standalone.jar -m blaze.core +java -jar blaze-0.17.10-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.9-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.17.10-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.9-standalone.jar -m blaze.core +java -jar blaze-0.17.10-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.9 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.10 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.9" + "version": "0.17.10" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 0f6974d2d..c7b5d142b 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-06-30" + :date #fhir/dateTime"2022-07-04" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 766e2c7f0..7249eeee8 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.9 + 0.17.10 1.8 diff --git a/pom.xml b/pom.xml index b61e43b73..93c70a15a 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.9 + 0.17.10 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 18f72cf9a..01f5c3177 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.9" + {:blaze/version "0.17.10" :blaze/clock {} From a84c303fa36f6b3a09c689522ad31c3834f9a575 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 5 Jul 2022 15:27:30 +0200 Subject: [PATCH 015/124] Fix Quantity Indexing without Value Closes: #764 --- .../blaze/db/impl/search_param/quantity.clj | 20 ++++++------- .../db/impl/search_param/quantity_test.clj | 28 ++++++++++++++++++- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/modules/db/src/blaze/db/impl/search_param/quantity.clj b/modules/db/src/blaze/db/impl/search_param/quantity.clj index ba4fa9198..91249e913 100644 --- a/modules/db/src/blaze/db/impl/search_param/quantity.clj +++ b/modules/db/src/blaze/db/impl/search_param/quantity.clj @@ -30,19 +30,17 @@ (defn- index-quantity-entries [{:keys [value system code unit]}] - (let [value (type/value value) - system (type/value system) + (let [system (type/value system) code (type/value code) unit (type/value unit)] - (cond-> [] - value - (conj [nil (codec/quantity nil value)]) - code - (conj [nil (codec/quantity code value)]) - (and unit (not= unit code)) - (conj [nil (codec/quantity unit value)]) - (and system code) - (conj [nil (codec/quantity (str system "|" code) value)])))) + (when-let [value (type/value value)] + (cond-> [[nil (codec/quantity nil value)]] + code + (conj [nil (codec/quantity code value)]) + (and unit (not= unit code)) + (conj [nil (codec/quantity unit value)]) + (and system code) + (conj [nil (codec/quantity (str system "|" code) value)]))))) (defmethod index-entries :fhir/Quantity diff --git a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj index f2f117a34..60724a682 100644 --- a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj @@ -362,7 +362,33 @@ :id := "id-155558" :hash-prefix := (hash/prefix hash) :code := "value-quantity" - :v-hash := (codec/quantity "mmHg" 120M)))))) + :v-hash := (codec/quantity "mmHg" 120M))))) + + (testing "without Quantity value" + (let [observation + {:fhir/type :fhir/Observation + :id "id-155558" + :status #fhir/code"final" + :value + #fhir/Quantity + {:code #fhir/code"mm[Hg]" + :system #fhir/uri"http://unitsofmeasure.org"}} + hash (hash/generate observation)] + + (is (empty? (search-param/index-entries + (sr/get search-param-registry "value-quantity" "Observation") + [] hash observation))))) + + (testing "without value" + (let [observation + {:fhir/type :fhir/Observation + :id "id-155558" + :status #fhir/code"final"} + hash (hash/generate observation)] + + (is (empty? (search-param/index-entries + (sr/get search-param-registry "value-quantity" "Observation") + [] hash observation)))))) (testing "FHIRPath evaluation problem" (let [resource {:fhir/type :fhir/Observation :id "foo"} From 579f233f9b90d05541fd199d53901d36e79af38a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 7 Jul 2022 21:15:10 +0200 Subject: [PATCH 016/124] Implement Functions in CQL Closes: #501 --- docs/conformance/cql.md | 66 ++++++------- modules/cql/src/blaze/elm/compiler/core.clj | 6 +- .../src/blaze/elm/compiler/external_data.clj | 8 +- .../cql/src/blaze/elm/compiler/function.clj | 12 +++ .../cql/src/blaze/elm/compiler/library.clj | 58 +++++++---- .../cql/src/blaze/elm/compiler/queries.clj | 22 ++--- .../src/blaze/elm/compiler/reusing_logic.clj | 38 ++++++- modules/cql/src/blaze/elm/compiler/spec.clj | 4 + modules/cql/src/blaze/elm/spec.clj | 25 +++-- .../blaze/elm/compiler/external_data_test.clj | 98 ++++++++++--------- .../test/blaze/elm/compiler/library_test.clj | 50 ++++++++-- .../test/blaze/elm/compiler/queries_test.clj | 16 ++- .../blaze/elm/compiler/reusing_logic_test.clj | 80 +++++++++++++-- modules/cql/test/blaze/elm/literal.clj | 10 +- modules/cql/test/data_readers.clj | 2 + .../q39-social-sec-num-query.cql | 9 +- 16 files changed, 348 insertions(+), 156 deletions(-) create mode 100644 modules/cql/src/blaze/elm/compiler/function.clj diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index 6d1b24564..2d8e89517 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -85,7 +85,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: |------|---------------|------------|---------------------------------------------|-------| | 9.1. | ExpressionDef | ✓ | | | | 9.2. | ExpressionRef | ! | only inside same library | | -| 9.3. | FunctionDef | ✗ | | | +| 9.3. | FunctionDef | ✓ | | | | 9.4. | FunctionRef | ! | hard coded implementation of some functions | | ### 10. Queries @@ -322,38 +322,38 @@ The section numbers refer to the documentation of the [ELM Specification](https: ### 22. Type Operators | Num | Group | Expression | State | Notes | -|--------|--------------------|-----------|---------------|-------| -| 22.1. | As | ! | no strictness | | -| 22.2. | CanConvert | ✗ | | | -| 22.3. | CanConvertQuantity | ✓ | | | -| 22.4. | Children | ✓ | | | -| 22.5. | Convert | ✗ | | | -| 22.6. | ConvertQuantity | ✓ | | | -| 22.7. | ConvertsToBoolean | ✓ | | | -| 22.8. | ConvertsToDate | ✓ | | | -| 22.9. | ConvertsToDateTime | ✓ | | | -| 22.10. | ConvertsToDecimal | ✓ | | | -| 22.11. | ConvertsToLong | ✓ | | | -| 22.12. | ConvertsToInteger | ✓ | | | -| 22.13. | ConvertsToQuantity | ✓ | | | -| 22.14. | ConvertsToRatio | ✗ | | | -| 22.15. | ConvertsToString | ✓ | | | -| 22.16. | ConvertsToTime | ✓ | | | -| 22.17. | Descendents | ✓ | | | -| 22.18. | Is | ✗ | | | -| 22.19. | ToBoolean | ✓ | | | -| 22.20. | ToChars | ✓ | | | -| 22.21. | ToConcept | ✗ | | | -| 22.22. | ToDate | ✓ | | | -| 22.23. | ToDateTime | ✓ | | | -| 22.24. | ToDecimal | ✓ | | | -| 22.25. | ToInteger | ✓ | | | -| 22.26. | ToList | ✓ | | | -| 22.27. | ToLong | ✓ | | | -| 22.28. | ToQuantity | ✓ | | | -| 22.29. | ToRatio | ✗ | | | -| 22.30. | ToString | ✓ | | | -| 22.31. | ToTime | ✓ | | | +|--------|--------------------|------------|---------------|-------| +| 22.1. | As | ! | no strictness | | +| 22.2. | CanConvert | ✗ | | | +| 22.3. | CanConvertQuantity | ✓ | | | +| 22.4. | Children | ✓ | | | +| 22.5. | Convert | ✗ | | | +| 22.6. | ConvertQuantity | ✓ | | | +| 22.7. | ConvertsToBoolean | ✓ | | | +| 22.8. | ConvertsToDate | ✓ | | | +| 22.9. | ConvertsToDateTime | ✓ | | | +| 22.10. | ConvertsToDecimal | ✓ | | | +| 22.11. | ConvertsToLong | ✓ | | | +| 22.12. | ConvertsToInteger | ✓ | | | +| 22.13. | ConvertsToQuantity | ✓ | | | +| 22.14. | ConvertsToRatio | ✗ | | | +| 22.15. | ConvertsToString | ✓ | | | +| 22.16. | ConvertsToTime | ✓ | | | +| 22.17. | Descendents | ✓ | | | +| 22.18. | Is | ✗ | | | +| 22.19. | ToBoolean | ✓ | | | +| 22.20. | ToChars | ✓ | | | +| 22.21. | ToConcept | ✗ | | | +| 22.22. | ToDate | ✓ | | | +| 22.23. | ToDateTime | ✓ | | | +| 22.24. | ToDecimal | ✓ | | | +| 22.25. | ToInteger | ✓ | | | +| 22.26. | ToList | ✓ | | | +| 22.27. | ToLong | ✓ | | | +| 22.28. | ToQuantity | ✓ | | | +| 22.29. | ToRatio | ✗ | | | +| 22.30. | ToString | ✓ | | | +| 22.31. | ToTime | ✓ | | | ### 23. Clinical Operators diff --git a/modules/cql/src/blaze/elm/compiler/core.clj b/modules/cql/src/blaze/elm/compiler/core.clj index 0bdc4e32c..6d5521da1 100644 --- a/modules/cql/src/blaze/elm/compiler/core.clj +++ b/modules/cql/src/blaze/elm/compiler/core.clj @@ -41,7 +41,11 @@ (defmulti compile* - "Compiles `expression` in `context`." + "Compiles `expression` in `context`. + + Context consists of: + * :library - the library in it's ELM form + * :node - the database node" {:arglists '([context expression])} (fn [_ {:keys [type] :as expr}] (assert (string? type) (format "Missing :type in expression `%s`." (pr-str expr))) diff --git a/modules/cql/src/blaze/elm/compiler/external_data.clj b/modules/cql/src/blaze/elm/compiler/external_data.clj index e659c46aa..0693b3c5a 100644 --- a/modules/cql/src/blaze/elm/compiler/external_data.clj +++ b/modules/cql/src/blaze/elm/compiler/external_data.clj @@ -18,7 +18,9 @@ (defrecord CompartmentListRetrieveExpression [context data-type] core/Expression (-eval [_ {:keys [db]} {:keys [id]} _] - (d/list-compartment-resource-handles db context id data-type))) + (d/list-compartment-resource-handles db context id data-type)) + (-form [_] + `(~'compartment-list-retrieve ~data-type))) (defrecord CompartmentQueryRetrieveExpression [query data-type clauses] @@ -93,7 +95,9 @@ (defrecord ResourceRetrieveExpression [] core/Expression (-eval [_ _ resource _] - [resource])) + [resource]) + (-form [_] + (list 'retrieve-resource))) (def ^:private resource-expr diff --git a/modules/cql/src/blaze/elm/compiler/function.clj b/modules/cql/src/blaze/elm/compiler/function.clj new file mode 100644 index 000000000..ece770ad5 --- /dev/null +++ b/modules/cql/src/blaze/elm/compiler/function.clj @@ -0,0 +1,12 @@ +(ns blaze.elm.compiler.function + (:require + [blaze.elm.compiler.core :as core])) + + +(defn arity-n [name fn-expr operand-names operands] + (reify core/Expression + (-eval [_ context resource scope] + (let [values (map #(core/-eval % context resource scope) operands)] + (core/-eval fn-expr context resource (merge scope (zipmap operand-names values))))) + (-form [_] + `(~'call ~name ~@(map core/-form operands))))) diff --git a/modules/cql/src/blaze/elm/compiler/library.clj b/modules/cql/src/blaze/elm/compiler/library.clj index f78367791..6b5d5bbc6 100644 --- a/modules/cql/src/blaze/elm/compiler/library.clj +++ b/modules/cql/src/blaze/elm/compiler/library.clj @@ -1,39 +1,57 @@ (ns blaze.elm.compiler.library (:require - [blaze.anomaly :as ba :refer [when-ok]] + [blaze.anomaly :as ba :refer [if-ok when-ok]] [blaze.elm.compiler :as compiler] + [blaze.elm.compiler.function :as function] [blaze.elm.deps-infer :as deps-infer] [blaze.elm.equiv-relationships :as equiv-relationships] [blaze.elm.normalizer :as normalizer])) (defn- compile-expression-def - "Compiles the expression of `expression-def` in `context` and associates the - resulting compiled expression under ::compiler/expression to the - `expression-def` which itself is returned. - - Returns an anomaly on errors." - {:arglists '([context expression-def])} - [context {:keys [expression] :as expression-def}] - (let [context (assoc context :eval-context (:context expression-def))] - (-> (ba/try-anomaly - (assoc expression-def - ::compiler/expression (compiler/compile context expression))) + "Compiles the expression of `def` in `context` and returns a tuple of + `[name compiled-expression]` or an anomaly on errors." + [context {:keys [name expression] :as def}] + (let [context (assoc context :eval-context (:context def))] + (-> (ba/try-anomaly [name (compiler/compile context expression)]) (ba/exceptionally #(assoc % :context context :elm/expression expression))))) -(defn- expr-defs [context library] +(defn- compile-function-def + "Compiles the function of `def` in `context`. + + Returns the compiled function or an anomaly on errors." + [context {:keys [name operand] :as def}] + (when-ok [[_ expression] (compile-expression-def context def)] + (partial function/arity-n name expression (mapv :name operand)))) + + +(defn- compile-function-defs [context library] (transduce - (comp (map (partial compile-expression-def context)) - (halt-when ba/anomaly?)) + (filter (comp #{"FunctionDef"} :type)) (completing - (fn [r {:keys [name] ::compiler/keys [expression]}] - (assoc r name expression))) - {} + (fn [context {:keys [name] :as def}] + (if-ok [function (compile-function-def context def)] + (assoc-in context [:functions name] function) + reduced))) + context (-> library :statements :def))) +(defn- expression-defs [context library] + (when-ok [context (compile-function-defs context library)] + (transduce + (comp (filter (comp nil? :type)) + (map (partial compile-expression-def context)) + (halt-when ba/anomaly?)) + (completing + (fn [r [name expression]] + (assoc r name expression))) + {} + (-> library :statements :def)))) + + (defn- compile-parameter-def "Compiles the default value of `parameter-def` in `context` and associates the resulting compiled default value under :default to the `parameter-def` which @@ -71,7 +89,7 @@ equiv-relationships/find-equiv-rels-library deps-infer/infer-library-deps) context (assoc opts :node node :library library)] - (when-ok [expr-defs (expr-defs context library) + (when-ok [expression-defs (expression-defs context library) parameter-default-values (parameter-default-values context library)] - {:compiled-expression-defs expr-defs + {:compiled-expression-defs expression-defs :parameter-default-values parameter-default-values}))) diff --git a/modules/cql/src/blaze/elm/compiler/queries.clj b/modules/cql/src/blaze/elm/compiler/queries.clj index 1abcfc388..9aa10f81b 100644 --- a/modules/cql/src/blaze/elm/compiler/queries.clj +++ b/modules/cql/src/blaze/elm/compiler/queries.clj @@ -298,18 +298,6 @@ (throw (Exception. (str "Unsupported number of " (count sources) " sources in query."))))) -;; ?.? IdentifierRef -;; -;; The IdentifierRef type defines an expression that references an identifier -;; that is either unresolved, or has been resolved to an attribute in an -;; unambiguous iteration scope such as a sort. Implementations should attempt to -;; resolve the identifier, only throwing an error at compile-time (or run-time -;; for an interpretive system) if the identifier reference cannot be resolved. -(defmethod core/compile* :elm.compiler.type/identifier-ref - [_ {:keys [name]}] - (structured-values/->SingleScopePropertyExpression (keyword name))) - - ;; 10.3. AliasRef ;; ;; The AliasRef expression allows for the reference of a specific source within @@ -336,7 +324,13 @@ (->AliasRefExpression name))) -;; 10.12. With +;; 10.7 IdentifierRef +(defmethod core/compile* :elm.compiler.type/identifier-ref + [_ {:keys [name]}] + (structured-values/->SingleScopePropertyExpression (keyword name))) + + +;; 10.14. With ;; ;; The With clause restricts the elements of a given source to only those ;; elements that have elements in the related source that satisfy the suchThat @@ -386,4 +380,4 @@ (format "Unsupported call without single query scope."))))) -;; TODO 10.13. Without +;; TODO 10.15. Without diff --git a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj index 8100b5678..e3a074302 100644 --- a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj +++ b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj @@ -40,11 +40,17 @@ `(~'expr-ref ~name))) -(defn- find-expression-def - "Returns the expression-def with `name` from `library` or nil if not found." +(defn- find-def + "Returns the def with `name` from `library` or nil if not found." {:arglists '([library name])} - [{{expr-defs :def} :statements} name] - (some #(when (= name (:name %)) %) expr-defs)) + [{{defs :def} :statements} name] + (some #(when (= name (:name %)) %) defs)) + + +(defn- find-expression-def [library name] + (when-let [def (find-def library name)] + (when (nil? (:type def)) + def))) (defn- expression-def-not-found-anom [context name] @@ -157,6 +163,18 @@ `(~'call "ToInterval" ~(core/-form operand)))) +(defn- function-def-not-found-anom [context name] + (ba/incorrect + (format "Function definition `%s` not found." name) + :context context)) + + +(defn compile-function [{:keys [functions] :as context} name operands] + (if-let [function (get functions name)] + (function operands) + (throw-anom (function-def-not-found-anom context name)))) + + ;; 9.4. FunctionRef (defmethod core/compile* :elm.compiler.type/function-ref [context {:keys [name] operands :operand}] @@ -184,4 +202,14 @@ "ToInterval" (->ToIntervalFunctionExpression (first operands)) - (throw (Exception. (str "Unsupported function `" name "` in `FunctionRef` expression.")))))) + (compile-function context name operands)))) + + +;; 9.5 OperandRef +(defmethod core/compile* :elm.compiler.type/operand-ref + [_ {:keys [name]}] + (reify core/Expression + (-eval [_ _ _ scope] + (scope name)) + (-form [_] + `(~'operand-ref ~name)))) diff --git a/modules/cql/src/blaze/elm/compiler/spec.clj b/modules/cql/src/blaze/elm/compiler/spec.clj index 9fab2fc57..896730d14 100644 --- a/modules/cql/src/blaze/elm/compiler/spec.clj +++ b/modules/cql/src/blaze/elm/compiler/spec.clj @@ -10,5 +10,9 @@ core/expr?) +(s/def :blaze.elm.compiler/function + fn?) + + (s/def :elm/compile-context (s/keys :req-un [:elm/library :blaze.db/node])) diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index 87fa7ffef..61d35e8cf 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -622,8 +622,8 @@ (s/keys :opt-un [:elm/name :elm/libraryName :elm.nary-expression/operand])) -;; ?.? IdentifierRef -(defmethod expression :elm.spec.type/identifier-ref [_] +;; 9.5 OperandRef +(defmethod expression :elm.spec.type/operand-ref [_] (s/keys :opt-un [:elm/name])) @@ -669,14 +669,23 @@ :elm.sort-by-item.by-expression/expression])) -;; 10.9. RelationshipClause +;; 10.7 IdentifierRef +(defmethod expression :elm.spec.type/identifier-ref [_] + (s/keys :req-un [:elm/name] :opt-un [:elm/libraryName])) + + +;; TODO: 10.8. LetClause + +;; TODO 10.9. QueryLetRef + +;; 10.10. RelationshipClause (defmulti relationship-clause :type) (s/def :elm/relationship-clause (s/multi-spec relationship-clause :type)) -;; 10.10. ReturnClause +;; 10.11. ReturnClause (s/def :elm.return-clause/expression :elm/expression) @@ -690,9 +699,9 @@ :opt-un [:elm.return-clause/distinct])) -;; TODO: 10.11. AggregateClause +;; TODO: 10.12. AggregateClause -;; 10.12. SortClause +;; 10.13. SortClause (s/def :elm.sort-clause/by (s/coll-of :elm/sort-by-item :min-count 1)) @@ -701,7 +710,7 @@ (s/keys :req-un [:elm.sort-clause/by])) -;; 10.13. With +;; 10.14. With (defmethod relationship-clause "With" [_] (s/keys :req-un [:elm/expression :elm/alias :elm.query/suchThat])) @@ -711,7 +720,7 @@ :opt-un [:elm.query/suchThat])) -;; 10.14. Without +;; 10.15. Without (defmethod relationship-clause "Without" [_] (s/keys :req-un [:elm/expression :elm/alias :elm.query/suchThat])) diff --git a/modules/cql/test/blaze/elm/compiler/external_data_test.clj b/modules/cql/test/blaze/elm/compiler/external_data_test.clj index d6d38bed8..129077f8f 100644 --- a/modules/cql/test/blaze/elm/compiler/external_data_test.clj +++ b/modules/cql/test/blaze/elm/compiler/external_data_test.clj @@ -75,9 +75,13 @@ db (d/db node) patient (d/resource-handle db "Patient" "0")] - (given (core/-eval expr {:db db} patient nil) - [0 fhir-spec/fhir-type] := :fhir/Patient - [0 :id] := "0")))) + (testing "eval" + (given (core/-eval expr {:db db} patient nil) + [0 fhir-spec/fhir-type] := :fhir/Patient + [0 :id] := "0")) + + (testing "form" + (is (= '(retrieve-resource) (core/-form expr))))))) (testing "Observation" (with-system-data [{:blaze.db/keys [node]} mem-node-system] @@ -94,9 +98,13 @@ db (d/db node) patient (d/resource-handle db "Patient" "0")] - (given (core/-eval expr {:db db} patient nil) - [0 fhir-spec/fhir-type] := :fhir/Observation - [0 :id] := "1"))) + (testing "eval" + (given (core/-eval expr {:db db} patient nil) + [0 fhir-spec/fhir-type] := :fhir/Observation + [0 :id] := "1")) + + (testing "form" + (is (= '(compartment-list-retrieve "Observation") (core/-form expr)))))) (testing "with one code" (with-system-data [{:blaze.db/keys [node]} mem-node-system] @@ -107,10 +115,10 @@ [:put {:fhir/type :fhir/Observation :id "1" :code #fhir/CodeableConcept - {:coding - [#fhir/Coding - {:system #fhir/uri"system-192253" - :code #fhir/code"code-192300"}]} + {:coding + [#fhir/Coding + {:system #fhir/uri"system-192253" + :code #fhir/code"code-192300"}]} :subject #fhir/Reference{:reference "Patient/0"}}]]] @@ -123,9 +131,9 @@ [{:name "sys-def-131750" :id "system-192253"}]}}} elm #elm/retrieve - {:type "Observation" - :codes #elm/list [#elm/code ["sys-def-131750" - "code-192300"]]} + {:type "Observation" + :codes #elm/list [#elm/code ["sys-def-131750" + "code-192300"]]} expr (c/compile context elm) db (d/db node) patient (d/resource-handle db "Patient" "0")] @@ -149,19 +157,19 @@ [:put {:fhir/type :fhir/Observation :id "1" :code #fhir/CodeableConcept - {:coding - [#fhir/Coding - {:system #fhir/uri"system-192253" - :code #fhir/code"code-192300"}]} + {:coding + [#fhir/Coding + {:system #fhir/uri"system-192253" + :code #fhir/code"code-192300"}]} :subject #fhir/Reference{:reference "Patient/0"}}] [:put {:fhir/type :fhir/Observation :id "2" :code #fhir/CodeableConcept - {:coding - [#fhir/Coding - {:system #fhir/uri"system-192253" - :code #fhir/code"code-140541"}]} + {:coding + [#fhir/Coding + {:system #fhir/uri"system-192253" + :code #fhir/code"code-140541"}]} :subject #fhir/Reference{:reference "Patient/0"}}]]] @@ -174,10 +182,10 @@ [{:name "sys-def-131750" :id "system-192253"}]}}} elm #elm/retrieve - {:type "Observation" - :codes - #elm/list [#elm/code ["sys-def-131750" "code-192300"] - #elm/code ["sys-def-131750" "code-140541"]]} + {:type "Observation" + :codes + #elm/list [#elm/code ["sys-def-131750" "code-192300"] + #elm/code ["sys-def-131750" "code-140541"]]} expr (c/compile context elm) db (d/db node) patient (d/resource-handle db "Patient" "0")] @@ -215,10 +223,10 @@ [[[:put {:fhir/type :fhir/Medication :id "0" :code #fhir/CodeableConcept - {:coding - [#fhir/Coding - {:system #fhir/uri"system-225806" - :code #fhir/code"code-225809"}]}}]]] + {:coding + [#fhir/Coding + {:system #fhir/uri"system-225806" + :code #fhir/code"code-225809"}]}}]]] (let [context {:node node @@ -229,9 +237,9 @@ [{:name "sys-def-225944" :id "system-225806"}]}}} elm #elm/retrieve - {:type "Medication" - :codes #elm/list [#elm/code ["sys-def-225944" - "code-225809"]]} + {:type "Medication" + :codes #elm/list [#elm/code ["sys-def-225944" + "code-225809"]]} expr (c/compile context elm) db (d/db node)] @@ -251,10 +259,10 @@ [{:name "sys-def-225944" :id "system-225806"}]}}} elm #elm/retrieve - {:type "Medication" - :codes #elm/list [#elm/code ["sys-def-225944" - "code-225809"]] - :code-property "foo"}] + {:type "Medication" + :codes #elm/list [#elm/code ["sys-def-225944" + "code-225809"]] + :code-property "foo"}] (given (ba/try-anomaly (c/compile context elm)) ::anom/category := ::anom/not-found @@ -270,10 +278,10 @@ [{:name "name-174207" :resultTypeName "{http://hl7.org/fhir}Patient"}]}} elm #elm/retrieve - {:type "Observation" - :context #elm/expression-ref "name-174207" - :codes #elm/list [#elm/code ["sys-def-174848" - "code-174911"]]} + {:type "Observation" + :context #elm/expression-ref "name-174207" + :codes #elm/list [#elm/code ["sys-def-174848" + "code-174911"]]} expr (c/compile {:node node :library library} elm)] (given expr type := WithRelatedContextQueryRetrieveExpression)))) @@ -287,11 +295,11 @@ [{:name "name-174207" :resultTypeName "{http://hl7.org/fhir}Patient"}]}} elm #elm/retrieve - {:type "Observation" - :context #elm/expression-ref "name-174207" - :codes #elm/list [#elm/code ["sys-def-174848" - "code-174911"]] - :code-property "foo"}] + {:type "Observation" + :context #elm/expression-ref "name-174207" + :codes #elm/list [#elm/code ["sys-def-174848" + "code-174911"]] + :code-property "foo"}] (given (ba/try-anomaly (c/compile {:node node :library library} elm)) ::anom/category := ::anom/not-found ::anom/message := "The search-param with code `foo` and type `Observation` was not found."))))) diff --git a/modules/cql/test/blaze/elm/compiler/library_test.clj b/modules/cql/test/blaze/elm/compiler/library_test.clj index fe5924a4e..8928d6eb2 100644 --- a/modules/cql/test/blaze/elm/compiler/library_test.clj +++ b/modules/cql/test/blaze/elm/compiler/library_test.clj @@ -2,6 +2,7 @@ (:require [blaze.cql-translator :as t] [blaze.db.api-stub :refer [mem-node-system]] + [blaze.elm.compiler :as compiler] [blaze.elm.compiler.library :as library] [blaze.elm.compiler.library-spec] [blaze.fhir.spec.type.system :as system] @@ -37,23 +38,52 @@ (given (library/compile-library node library {}) :compiled-expression-defs := {"Foo" true})))) - (testing "one static expression" + (testing "one dynamic expression" (let [library (t/translate "library Test - using FHIR version '4.0.0' - context Patient - define Gender: Patient.gender")] + using FHIR version '4.0.0' + context Patient + define Gender: Patient.gender")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - [:compiled-expression-defs "Gender" :key] := :gender - [:compiled-expression-defs "Gender" :source :name] := "Patient")))) + [:compiled-expression-defs "Gender" compiler/form] := '(:gender (expr-ref "Patient")))))) - (testing "with compile-time error" + (testing "one function" (let [library (t/translate "library Test - define Error: singleton from {1, 2}")] + using FHIR version '4.0.0' + context Patient + define function Gender(P Patient): P.gender + define InInitialPopulation: Gender(Patient)")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - ::anom/category := ::anom/conflict - ::anom/message := "More than one element in `SingletonFrom` expression.")))) + [:compiled-expression-defs "InInitialPopulation" compiler/form] := '(call "Gender" (expr-ref "Patient")))))) + + (testing "two functions, one calling the other" + (let [library (t/translate "library Test + using FHIR version '4.0.0' + context Patient + define function Inc(i System.Integer): i + 1 + define function Inc2(i System.Integer): Inc(i) + 1 + define InInitialPopulation: Inc2(1)")] + (with-system [{:blaze.db/keys [node]} mem-node-system] + (given (library/compile-library node library {}) + [:compiled-expression-defs "InInitialPopulation" compiler/form] := '(call "Inc2" 1))))) + + (testing "with compile-time error" + (testing "function" + (let [library (t/translate "library Test + define function Error(): singleton from {1, 2}")] + (with-system [{:blaze.db/keys [node]} mem-node-system] + (given (library/compile-library node library {}) + ::anom/category := ::anom/conflict + ::anom/message := "More than one element in `SingletonFrom` expression.")))) + + (testing "expression" + (let [library (t/translate "library Test + define Error: singleton from {1, 2}")] + (with-system [{:blaze.db/keys [node]} mem-node-system] + (given (library/compile-library node library {}) + ::anom/category := ::anom/conflict + ::anom/message := "More than one element in `SingletonFrom` expression."))))) (testing "with parameter default" (let [library (t/translate "library Test diff --git a/modules/cql/test/blaze/elm/compiler/queries_test.clj b/modules/cql/test/blaze/elm/compiler/queries_test.clj index 4cbba0382..cee6b06bb 100644 --- a/modules/cql/test/blaze/elm/compiler/queries_test.clj +++ b/modules/cql/test/blaze/elm/compiler/queries_test.clj @@ -232,7 +232,21 @@ ::result)) -;; 10.12. With +;; 10.7 IdentifierRef +;; +;; The IdentifierRef type defines an expression that references an identifier +;; that is either unresolved, or has been resolved to an attribute in an +;; unambiguous iteration scope such as a sort. Implementations should attempt to +;; resolve the identifier, only throwing an error at compile-time (or run-time +;; for an interpretive system) if the identifier reference cannot be resolved. +(deftest compile-identifier-ref-test + (let [expr (c/compile {} {:type "IdentifierRef" :name "foo"})] + + (testing "form" + (is (= '(:foo default) (core/-form expr)))))) + + +;; 10.14. With (deftest compile-with-clause-test (testing "Equiv With with two Observations comparing there subjects." (with-system-data [{:blaze.db/keys [node]} mem-node-system] diff --git a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj index e715f2551..0b19d9bbd 100644 --- a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj +++ b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj @@ -7,6 +7,7 @@ [blaze.anomaly :as ba] [blaze.elm.compiler :as c] [blaze.elm.compiler.core :as core] + [blaze.elm.compiler.function :as function] [blaze.elm.compiler.test-util :as tu] [blaze.elm.interval :as interval] [blaze.elm.literal :as elm] @@ -66,9 +67,59 @@ ;; The FunctionRef type defines an expression that invokes a previously defined ;; function. The result of evaluating each operand is passed to the function. (deftest compile-function-ref-test + (testing "Throws error on missing function" + (given (ba/try-anomaly (c/compile {} #elm/function-ref ["name-175844"])) + ::anom/category := ::anom/incorrect + ::anom/message := "Function definition `name-175844` not found." + :context := {})) + + (testing "Custom function with arity 0" + (let [function-name "name-210650" + fn-expr (c/compile {} #elm/integer "1") + compile-ctx {:functions {function-name (partial function/arity-n function-name fn-expr [])}} + elm (elm/function-ref [function-name]) + expr (c/compile compile-ctx elm)] + (testing "eval" + (is (= 1 (core/-eval expr {} nil nil)))) + + (testing "form" + (is (= `(~'call ~function-name) (core/-form expr)))))) + + (testing "Custom function with arity 1" + (let [function-name "name-180815" + fn-expr (c/compile {} #elm/negate #elm/operand-ref"x") + compile-ctx {:library {:parameters {:def [{:name "a"}]}} + :functions {function-name (partial function/arity-n function-name fn-expr ["x"])}} + elm (elm/function-ref [function-name #elm/parameter-ref "a"]) + expr (c/compile compile-ctx elm)] + (testing "eval" + (are [a res] (= res (core/-eval expr {:parameters {"a" a}} nil nil)) + 1 -1 + -1 1 + 0 0)) + + (testing "form" + (is (= `(~'call ~function-name (~'param-ref "a")) (core/-form expr)))))) + + (testing "Custom function with arity 2" + (let [function-name "name-184652" + fn-expr (c/compile {} #elm/add [#elm/operand-ref"x" #elm/operand-ref"y"]) + compile-ctx {:library {:parameters {:def [{:name "a"} {:name "b"}]}} + :functions {function-name (partial function/arity-n function-name fn-expr ["x" "y"])}} + elm (elm/function-ref [function-name #elm/parameter-ref "a" #elm/parameter-ref "b"]) + expr (c/compile compile-ctx elm)] + (testing "eval" + (are [a b res] (= res (core/-eval expr {:parameters {"a" a "b" b}} nil nil)) + 1 1 2 + 1 0 1 + 0 1 1)) + + (testing "form" + (is (= `(~'call ~function-name (~'param-ref "a") (~'param-ref "b")) (core/-form expr)))))) + (testing "ToQuantity" (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} - elm (elm/function-ref "ToQuantity" #elm/parameter-ref "x") + elm #elm/function-ref ["ToQuantity" #elm/parameter-ref "x"] expr (c/compile compile-ctx elm)] (testing "eval" (are [x res] (= res (core/-eval expr {:parameters {"x" x}} nil nil)) @@ -81,7 +132,7 @@ (testing "ToDateTime" (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} - elm (elm/function-ref "ToDateTime" #elm/parameter-ref "x") + elm #elm/function-ref ["ToDateTime" #elm/parameter-ref "x"] expr (c/compile compile-ctx elm) eval-ctx (fn [x] {:now tu/now :parameters {"x" x}})] (testing "eval" @@ -98,7 +149,7 @@ (testing "ToString" (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} - elm (elm/function-ref "ToString" #elm/parameter-ref "x") + elm #elm/function-ref ["ToString" #elm/parameter-ref "x"] expr (c/compile compile-ctx elm)] (testing "eval" (are [x res] (= res (core/-eval expr {:parameters {"x" x}} nil nil)) @@ -110,29 +161,38 @@ (testing "ToInterval" (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} - elm (elm/function-ref "ToInterval" #elm/parameter-ref "x") + elm #elm/function-ref ["ToInterval" #elm/parameter-ref "x"] expr (c/compile compile-ctx elm) eval-ctx (fn [x] {:now tu/now :parameters {"x" x}})] (testing "eval" (are [x res] (= res (core/-eval expr (eval-ctx x) nil nil)) #fhir/Period - {:start #fhir/dateTime"2021-02-23T15:12:45+01:00" - :end #fhir/dateTime"2021-02-23T16:00:00+01:00"} + {:start #fhir/dateTime"2021-02-23T15:12:45+01:00" + :end #fhir/dateTime"2021-02-23T16:00:00+01:00"} (interval/interval (system/date-time 2021 2 23 14 12 45) (system/date-time 2021 2 23 15 0 0)) #fhir/Period - {:start nil - :end #fhir/dateTime"2021-02-23T16:00:00+01:00"} + {:start nil + :end #fhir/dateTime"2021-02-23T16:00:00+01:00"} (interval/interval nil (system/date-time 2021 2 23 15 0 0)) #fhir/Period - {:start #fhir/dateTime"2021-02-23T15:12:45+01:00" - :end nil} + {:start #fhir/dateTime"2021-02-23T15:12:45+01:00" + :end nil} (interval/interval (system/date-time 2021 2 23 14 12 45) nil))) (testing "form" (is (= '(call "ToInterval" (param-ref "x")) (core/-form expr))))))) + + +;; 9.5 OperandRef +;; +;; The OperandRef expression allows the value of an operand to be referenced as +;; part of an expression within the body of a function definition. +(deftest compile-operand-ref-test + (testing "form" + (is (= '(operand-ref "x") (core/-form (c/compile {} #elm/operand-ref"x")))))) diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 04f3f769e..cc3f9635d 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -110,10 +110,16 @@ ;; 9.4. FunctionRef -(defn function-ref [name & ops] +(defn function-ref [[name & ops]] {:type "FunctionRef" :name name - :operand ops}) + :operand (vec ops)}) + + +;; 9.5. OperandRef +(defn operand-ref [name] + {:type "OperandRef" + :name name}) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index 750db50ac..33ef2a785 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -10,6 +10,8 @@ elm/quantity blaze.elm.literal/quantity elm/parameter-ref blaze.elm.literal/parameter-ref elm/expression-ref blaze.elm.literal/expression-ref + elm/function-ref blaze.elm.literal/function-ref + elm/operand-ref blaze.elm.literal/operand-ref elm/retrieve blaze.elm.literal/retrieve elm/equal blaze.elm.literal/equal elm/equivalent blaze.elm.literal/equivalent diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql index c06674931..d4f62ff66 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql @@ -4,12 +4,11 @@ include FHIRHelpers version '4.0.0' context Patient +define function IntegerParts(s String): + from (Split(s, '-')) S where ConvertsToInteger(S) + define SocialSecurityNumber: First(Patient.identifier.where(system = 'http://hl7.org/fhir/sid/us-ssn').value) -define IntegerParts: - from (Split(SocialSecurityNumber, '-')) S - where ConvertsToInteger(S) - define InInitialPopulation: - Count(IntegerParts) = 3 + Count(IntegerParts(SocialSecurityNumber)) = 3 From a5c2552d295507604fe2025e289c16a693b39719 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 13 Jul 2022 13:46:56 +0200 Subject: [PATCH 017/124] Fix Deserialisation of Primitive Values in Extensions Closes: #767 --- .../src/blaze/fhir/spec/type.clj | 2 +- .../test/blaze/fhir/spec/type/system_test.clj | 2 +- .../test/blaze/fhir/spec_test.clj | 31 +++++++++++++------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type.clj b/modules/fhir-structure/src/blaze/fhir/spec/type.clj index 96a1736b6..19dc7360a 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type.clj @@ -1119,7 +1119,7 @@ (declare extension) -(def-complex-type Extension [^String id extension ^String url ^:polymorph value] +(def-complex-type Extension [^String id extension ^String url ^:polymorph ^:primitive value] :hash-num 39 :interned (and (nil? id) (p/-interned extension) (p/-interned value))) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj index 0a38ea876..655f56a7e 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj @@ -298,7 +298,7 @@ (LocalDate/of 2020 1 1))) (testing "comparable" - (are [a b] (pos? (.compareTo a b)) + (are [a b] (pos? (compare a b)) (system/date-time 2021) (system/date-time 2020) (system/date-time 2020 2) (system/date-time 2020 1) (system/date-time 2020 1 2) (system/date-time 2020 1 1))) diff --git a/modules/fhir-structure/test/blaze/fhir/spec_test.clj b/modules/fhir-structure/test/blaze/fhir/spec_test.clj index 77485a03b..cf1370b7f 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec_test.clj @@ -3045,7 +3045,10 @@ #fhir/Extension{:url "foo" :value #fhir/Reference{:reference "bar"}} {:url "foo" :valueCodeableConcept {:text "bar"}} - #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}})) + #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}} + + {:url "foo" :extension [{:url "bar" :_valueDateTime {:extension [{:url "baz" :valueCode "qux"}]}}]} + #fhir/Extension{:url "foo" :extension [#fhir/Extension{:url "bar" :value #fhir/dateTime{:extension [#fhir/Extension{:url "baz" :value #fhir/code"qux"}]}}]})) (testing "XML" (are [xml fhir] (= fhir (s2/conform :fhir.xml/Extension xml)) @@ -3059,7 +3062,10 @@ #fhir/Extension{:url "foo" :value #fhir/Reference{:reference "bar"}} (sexp [nil {:url "foo"} [::f/valueCodeableConcept {} [::f/text {:value "bar"}]]]) - #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}})) + #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}} + + (sexp [nil {:url "foo"} [::f/extension {:url "bar"} [::f/valueDateTime {} [::f/extension {:url "baz"} [::f/valueCode {:value "qux"}]]]]]) + #fhir/Extension{:url "foo" :extension [#fhir/Extension{:url "bar" :value #fhir/dateTime{:extension [#fhir/Extension{:url "baz" :value #fhir/code"qux"}]}}]})) (testing "CBOR" (are [json fhir] (= fhir (s2/conform :fhir.cbor/Extension json)) @@ -3073,7 +3079,10 @@ #fhir/Extension{:url "foo" :value #fhir/Reference{:reference "bar"}} {:url "foo" :valueCodeableConcept {:text "bar"}} - #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}}))) + #fhir/Extension{:url "foo" :value #fhir/CodeableConcept{:text #fhir/string"bar"}} + + {:url "foo" :extension [{:url "bar" :_valueDateTime {:extension [{:url "baz" :valueCode "qux"}]}}]} + #fhir/Extension{:url "foo" :extension [#fhir/Extension{:url "bar" :value #fhir/dateTime{:extension [#fhir/Extension{:url "baz" :value #fhir/code"qux"}]}}]}))) (testing "unforming" (testing "JSON" @@ -3102,15 +3111,14 @@ #fhir/Extension{:value #fhir/CodeableConcept{:text #fhir/string"text-104840"}} {:valueCodeableConcept {:text "text-104840"}} - #fhir/Extension - {:value - #fhir/CodeableConcept - {:coding - [#fhir/Coding{:system #fhir/uri"system-105127"}]}} + #fhir/Extension{:value #fhir/CodeableConcept{:coding [#fhir/Coding{:system #fhir/uri"system-105127"}]}} {:valueCodeableConcept {:coding [{:system "system-105127"}]}} #fhir/Extension{:value {:fhir/type :fhir/Annotation :text "text-105422"}} - {:valueAnnotation {:text "text-105422"}})) + {:valueAnnotation {:text "text-105422"}} + + #fhir/Extension{:url "foo" :extension [#fhir/Extension{:url "bar" :value #fhir/dateTime{:extension [#fhir/Extension{:url "baz" :value #fhir/code"qux"}]}}]} + {:url "foo" :extension [{:url "bar" :_valueDateTime {:extension [{:url "baz" :valueCode "qux"}]}}]})) (testing "CBOR" (are [fhir cbor] (= cbor (fhir-spec/parse-cbor (fhir-spec/unform-cbor fhir))) @@ -3139,7 +3147,10 @@ {:valueAddress {}} #fhir/Extension{:value #fhir/Address{:city "foo"}} - {:valueAddress {:city "foo"}})))) + {:valueAddress {:city "foo"}} + + #fhir/Extension{:url "foo" :extension [#fhir/Extension{:url "bar" :value #fhir/dateTime{:extension [#fhir/Extension{:url "baz" :value #fhir/code"qux"}]}}]} + {:url "foo" :extension [{:url "bar" :_valueDateTime {:extension [{:url "baz" :valueCode "qux"}]}}]})))) (deftest coding-test From 02f2409893ee3e5a716ef925ea36e81c8a5fc755 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 13 Jul 2022 16:22:10 +0200 Subject: [PATCH 018/124] Release v0.17.11 --- CHANGELOG.md | 17 +++++++++++++++-- README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ .../src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 29 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dde33f72d..8c0e533cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,13 +1,26 @@ # Changelog -## v0.17.10 +## v0.17.11 ### Bugfixes -* Fix Reference Resolution on Extended Primitive References +* Fix Quantity Indexing without Value ([#764](https://github.com/samply/blaze/issues/764)) +* Fix Deserialisation of Primitive Values in Extensions ([#767](https://github.com/samply/blaze/issues/767)) ### Other Improvements ([#758](https://github.com/samply/blaze/issues/758)) +* Implement Functions in CQL ([#766](https://github.com/samply/blaze/pull/766)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/50?closed=1). + +## v0.17.10 + +### Bugfixes + +* Fix Reference Resolution on Extended Primitive References ([#758](https://github.com/samply/blaze/issues/758)) + +### Other Improvements + * Implement CQL ConvertsToTime ([#759](https://github.com/samply/blaze/pull/759)) The full changelog can be found [here](https://github.com/samply/blaze/milestone/48?closed=1). diff --git a/README.md b/README.md index a80017f79..6a84a0de1 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.10][5] +Latest release: [v0.17.11][5] ## Quick Start @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index dd67cdc78..e4a018a21 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.10 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.11 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.10" + "version": "0.17.11" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index ee5595e1e..d8c9ba8a4 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11. Blaze is tested with [AdoptOpenJDK][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.10). Look for `blaze-0.17.10-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.11). Look for `blaze-0.17.11-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.10-standalone.jar -m blaze.core +java -jar blaze-0.17.11-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.10-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.17.11-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.10-standalone.jar -m blaze.core +java -jar blaze-0.17.11-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.10 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.11 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.10" + "version": "0.17.11" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index c7b5d142b..062d32ab4 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-07-04" + :date #fhir/dateTime"2022-07-13" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 7249eeee8..728352914 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.10 + 0.17.11 1.8 diff --git a/pom.xml b/pom.xml index 93c70a15a..5dac3ebfe 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.10 + 0.17.11 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 01f5c3177..8870448c7 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.10" + {:blaze/version "0.17.11" :blaze/clock {} From a908dec94296e5eb4345387bf74e12969bfcc6e1 Mon Sep 17 00:00:00 2001 From: Marlena Meyer Date: Fri, 1 Jul 2022 15:05:43 +0200 Subject: [PATCH 019/124] Add type operators to deps_infer.clj and normalizer.clj --- modules/cql/src/blaze/elm/deps_infer.clj | 68 ++++++++++++++++++ modules/cql/src/blaze/elm/normalizer.clj | 90 +++++++++++++++++++++++- 2 files changed, 157 insertions(+), 1 deletion(-) diff --git a/modules/cql/src/blaze/elm/deps_infer.clj b/modules/cql/src/blaze/elm/deps_infer.clj index bd6e1aa1a..79fe02569 100644 --- a/modules/cql/src/blaze/elm/deps_infer.clj +++ b/modules/cql/src/blaze/elm/deps_infer.clj @@ -604,6 +604,58 @@ (derive :elm.deps.type/as :elm.deps.type/unary-expression) +;; 22.3. CanConvertQuantity +(derive :elm.deps.type/can-convert-quantity :elm.deps.type/binary-expression) + + +;; 22.6. ConvertQuantity +(derive :elm.deps.type/convert-quantity :elm.deps.type/binary-expression) + + +;; 22.7. ConvertsToBoolean +(derive :elm.deps.type/converts-to-boolean :elm.deps.type/unary-expression) + + +;; 22.8. ConvertsToDate +(derive :elm.deps.type/converts-to-date :elm.deps.type/unary-expression) + + +;; 22.9. ConvertsToDateTime +(derive :elm.deps.type/converts-to-date-time :elm.deps.type/unary-expression) + + +;; 22.10. ConvertsToDecimal +(derive :elm.deps.type/converts-to-decimal :elm.deps.type/unary-expression) + + +;; 22.11. ConvertsToLong +(derive :elm.deps.type/converts-to-long :elm.deps.type/unary-expression) + + +;; 22.12. ConvertsToInteger +(derive :elm.deps.type/converts-to-integer :elm.deps.type/unary-expression) + + +;; 22.13. ConvertsToQuantity +(derive :elm.deps.type/converts-to-quantity :elm.deps.type/unary-expression) + + +;; 22.15. ConvertsToString +(derive :elm.deps.type/converts-to-string :elm.deps.type/unary-expression) + + +;; 22.16. ConvertsToTime +(derive :elm.deps.type/converts-to-time :elm.deps.type/unary-expression) + + +;; 22.19. ToBoolean +(derive :elm.deps.type/to-boolean :elm.deps.type/unary-expression) + + +;; 22.20. ToChars +(derive :elm.deps.type/to-chars :elm.deps.type/unary-expression) + + ;; 22.22. ToDate (derive :elm.deps.type/to-date :elm.deps.type/unary-expression) @@ -612,14 +664,30 @@ (derive :elm.deps.type/to-date-time :elm.deps.type/unary-expression) +;; 22.24. ToDecimal +(derive :elm.deps.type/to-decimal :elm.deps.type/unary-expression) + + +;; 22.25. ToInteger +(derive :elm.deps.type/to-integer :elm.deps.type/unary-expression) + + ;; 22.26. ToList (derive :elm.deps.type/to-list :elm.deps.type/unary-expression) +;; 22.27. ToLong +(derive :elm.deps.type/to-long :elm.deps.type/unary-expression) + + ;; 22.28. ToQuantity (derive :elm.deps.type/to-quantity :elm.deps.type/unary-expression) +;; 22.30. ToString +(derive :elm.deps.type/to-string :elm.deps.type/unary-expression) + + ;; 22.31. ToTime (derive :elm.deps.type/to-time :elm.deps.type/unary-expression) diff --git a/modules/cql/src/blaze/elm/normalizer.clj b/modules/cql/src/blaze/elm/normalizer.clj index 5e6686f46..2f13202b2 100644 --- a/modules/cql/src/blaze/elm/normalizer.clj +++ b/modules/cql/src/blaze/elm/normalizer.clj @@ -410,10 +410,98 @@ ;; 22. Type Operators -;; 20.27. ToLong +;; 22.1. As +(derive :elm.normalizer.type/as :elm.normalizer.type/unary-expression) + + +;; 22.3. CanConvertQuantity +(derive :elm.normalizer.type/can-convert-quantity :elm.normalizer.type/binary-expression) + + +;; 22.6. ConvertQuantity +(derive :elm.normalizer.type/convert-quantity :elm.normalizer.type/binary-expression) + + +;; 22.7. ConvertsToBoolean +(derive :elm.normalizer.type/converts-to-boolean :elm.normalizer.type/unary-expression) + + +;; 22.8. ConvertsToDate +(derive :elm.normalizer.type/converts-to-date :elm.normalizer.type/unary-expression) + + +;; 22.9. ConvertsToDateTime +(derive :elm.normalizer.type/converts-to-date-time :elm.normalizer.type/unary-expression) + + +;; 22.10. ConvertsToDecimal +(derive :elm.normalizer.type/converts-to-decimal :elm.normalizer.type/unary-expression) + + +;; 22.11. ConvertsToLong +(derive :elm.normalizer.type/converts-to-long :elm.normalizer.type/unary-expression) + + +;; 22.12. ConvertsToInteger +(derive :elm.normalizer.type/converts-to-integer :elm.normalizer.type/unary-expression) + + +;; 22.13. ConvertsToQuantity +(derive :elm.normalizer.type/converts-to-quantity :elm.normalizer.type/unary-expression) + + +;; 22.15. ConvertsToString +(derive :elm.normalizer.type/converts-to-string :elm.normalizer.type/unary-expression) + + +;; 22.16. ConvertsToTime +(derive :elm.normalizer.type/converts-to-time :elm.normalizer.type/unary-expression) + + +;; 22.19. ToBoolean +(derive :elm.normalizer.type/to-boolean :elm.normalizer.type/unary-expression) + + +;; 22.20. ToChars +(derive :elm.normalizer.type/to-chars :elm.normalizer.type/unary-expression) + + +;; 22.22. ToDate +(derive :elm.normalizer.type/to-date :elm.normalizer.type/unary-expression) + + +;; 22.23. ToDateTime +(derive :elm.normalizer.type/to-date-time :elm.normalizer.type/unary-expression) + + +;; 22.24. ToDecimal +(derive :elm.normalizer.type/to-decimal :elm.normalizer.type/unary-expression) + + +;; 22.25. ToInteger +(derive :elm.normalizer.type/to-integer :elm.normalizer.type/unary-expression) + + +;; 22.26. ToList +(derive :elm.normalizer.type/to-list :elm.normalizer.type/unary-expression) + + +;; 22.27. ToLong (derive :elm.normalizer.type/to-long :elm.normalizer.type/unary-expression) +;; 22.28. ToQuantity +(derive :elm.normalizer.type/to-quantity :elm.normalizer.type/unary-expression) + + +;; 22.30. ToString +(derive :elm.normalizer.type/to-string :elm.normalizer.type/unary-expression) + + +;; 22.31. ToTime +(derive :elm.normalizer.type/to-time :elm.normalizer.type/unary-expression) + + ;; 23. Clinical Operators From ce6b4acfacb9e9a82ae383b43aa83a40f45882d4 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 21 Jul 2022 17:31:50 +0200 Subject: [PATCH 020/124] Remove Bare Polymorph JSON Properties The example is a Task resource were the output value is given as with the bare "value" key instead of one of the concrete keys like "valueReference". Such properties can't be assigned a type and have to be removed. --- .../scripts/evaluate-measure-subject-list.sh | 6 ++-- docs/cql-queries/api.md | 2 +- evaluate-measure.sh | 2 +- .../src/blaze/fhir/spec/impl.clj | 8 ++++-- .../test/blaze/fhir/spec_test.clj | 28 +++++++++++++++++-- .../middleware/params_test.clj | 2 +- .../fhir/operation/evaluate_measure_test.clj | 2 +- 7 files changed, 37 insertions(+), 13 deletions(-) diff --git a/.github/scripts/evaluate-measure-subject-list.sh b/.github/scripts/evaluate-measure-subject-list.sh index f608c2168..a346966b6 100755 --- a/.github/scripts/evaluate-measure-subject-list.sh +++ b/.github/scripts/evaluate-measure-subject-list.sh @@ -71,15 +71,15 @@ cat < (dissoc m k) (assoc key v)) (recur keys)) - m))) + (dissoc m key)))) (def ^:private choice-type-key-cache @@ -392,7 +394,7 @@ (keyword (str (name key) (str/capital (name type))))))))) -(defn choice-type-key [key type] +(defn- choice-type-key [key type] (.get ^LoadingCache choice-type-key-cache [key type])) diff --git a/modules/fhir-structure/test/blaze/fhir/spec_test.clj b/modules/fhir-structure/test/blaze/fhir/spec_test.clj index cf1370b7f..0d4c9eab9 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec_test.clj @@ -4332,9 +4332,9 @@ [#fhir/Extension {:value #fhir/Reference{:reference "Patient/153540"}}]} #fhir/uri - {:extension - [#fhir/Extension - {:value #fhir/Reference{:reference "Observation/153628"}}]}]} + {:extension + [#fhir/Extension + {:value #fhir/Reference{:reference "Observation/153628"}}]}]} [["Procedure" "153904"] ["Condition" "153931"] ["Patient" "153540"] @@ -4381,6 +4381,28 @@ ["Observation" "204754"]]))) +(deftest task-test + (testing "conforming" + (s2/form :fhir.json.Task/output) + (testing "JSON" + (are [json fhir] (= fhir (s2/conform :fhir.json/Task json)) + {:resourceType "Task" + :output + [{:valueReference {:reference "bar"}}]} + {:fhir/type :fhir/Task + :output + [{:fhir/type :fhir.Task/output + :value #fhir/Reference{:reference "bar"}}]}) + + (testing "bare :value properties are removed" + (are [json fhir] (= fhir (s2/conform :fhir.json/Task json)) + {:resourceType "Task" + :output + [{:value {:reference "bar"}}]} + {:fhir/type :fhir/Task + :output + [{:fhir/type :fhir.Task/output}]}))))) + (deftest primitive-val-test (are [x] (fhir-spec/primitive-val? x) "foo" diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj index 68cd7787c..490fb2d53 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj @@ -140,7 +140,7 @@ :value #fhir/date"2015"} {:fhir/type :fhir.Parameters/parameter :name "measure" - :value "measure-202606"}]}}]] + :value #fhir/string"measure-202606"}]}}]] (let [{:blaze.fhir.operation.evaluate-measure/keys [params]} @(handler request)] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index 06bdc71a2..ff538afe0 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -503,7 +503,7 @@ :parameter [{:fhir/type :fhir.Parameters/parameter :name "measure" - :value "url-181501"} + :value #fhir/string"url-181501"} {:fhir/type :fhir.Parameters/parameter :name "periodStart" :value #fhir/date"2014"} From ba7f3b12346fbc56bb81ba1d68e97552fda3191a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 21 Jul 2022 18:01:17 +0200 Subject: [PATCH 021/124] Migrate to Eclipse Temurin because OpenJDK is Deprecated The former used image openjdk:17-oracle is now 3 month old while the new image eclipse-temurin:17 is only 1 day old. --- Dockerfile | 8 ++++---- docs/deployment/manual-deployment.md | 4 ++-- modules/server/deps.edn | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Dockerfile b/Dockerfile index 8e798cf25..262bb8459 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ -FROM openjdk:17-oracle +FROM eclipse-temurin:17-jre -RUN microdnf upgrade && microdnf remove expat fontconfig freetype \ - aajohan-comfortaa-fonts fontpackages-filesystem gzip bzip2 tar libpng \ - binutils && microdnf clean all +RUN apt-get update && apt-get upgrade -y && \ + apt-get purge curl libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ + apt-get autoremove -y && apt-get clean RUN mkdir -p /app/data && chown 1001:1001 /app/data COPY target/blaze-standalone.jar /app/ diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index d8c9ba8a4..2f7c8be83 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -1,6 +1,6 @@ # Manual Deployment -The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11. Blaze is tested with [AdoptOpenJDK][1]. +The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.11). Look for `blaze-0.17.11-standalone.jar`. @@ -68,5 +68,5 @@ that should return: Blaze will be configured through environment variables which are documented [here][2]. -[1]: +[1]: [2]: diff --git a/modules/server/deps.edn b/modules/server/deps.edn index b674854e3..e2f5c1e0a 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -6,7 +6,7 @@ {:local/root "../module-base"} org.eclipse.jetty/jetty-server - {:mvn/version "9.4.46.v20220331"} + {:mvn/version "9.4.48.v20220622"} ring/ring-jetty-adapter {:mvn/version "1.9.5" From 698ebbb4c524c1d6f650f041fa5425ad1265a5e3 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 21 Jul 2022 19:03:19 +0200 Subject: [PATCH 022/124] Update Dependencies --- deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/cql/deps.edn | 2 +- modules/fhir-path/deps.edn | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deps.edn b/deps.edn index 9ad80e070..55ac43efa 100644 --- a/deps.edn +++ b/deps.edn @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "1.8.847"} + {:mvn/version "1.9.863"} org.slf4j/slf4j-nop {:mvn/version "1.7.36"}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 54d541d36..d50769d82 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.78.Final"}} + {:mvn/version "4.1.79.Final"}} :aliases {:test diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index f4cd77227..f84439fde 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -8,7 +8,7 @@ {:mvn/version "2.13.3"} info.cqframework/cql-to-elm - {:mvn/version "1.5.9" + {:mvn/version "1.5.10" :exclusions [com.google.code.javaparser/javaparser info.cqframework/qdm diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 0b005d9d7..d587785be 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-structure"} info.cqframework/cql - {:mvn/version "1.5.9"}} + {:mvn/version "1.5.10"}} :aliases {:test From 253568514b7a158ebb57c49fec80bd10dc343dfc Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 21 Jul 2022 20:48:56 +0200 Subject: [PATCH 023/124] Release v0.17.12 --- CHANGELOG.md | 14 +++++++++++++- README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ .../rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 27 insertions(+), 15 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8c0e533cb..fa18defe2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v0.17.12 + +### Security + +* Migrate to Eclipse Temurin because OpenJDK is Deprecated ([#773](https://github.com/samply/blaze/issues/773)) + +### Bugfixes + +* Remove Bare Polymorph JSON Properties ([#772](https://github.com/samply/blaze/pull/772)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/51?closed=1). + ## v0.17.11 ### Bugfixes @@ -7,7 +19,7 @@ * Fix Quantity Indexing without Value ([#764](https://github.com/samply/blaze/issues/764)) * Fix Deserialisation of Primitive Values in Extensions ([#767](https://github.com/samply/blaze/issues/767)) -### Other Improvements ([#758](https://github.com/samply/blaze/issues/758)) +### Other Improvements * Implement Functions in CQL ([#766](https://github.com/samply/blaze/pull/766)) diff --git a/README.md b/README.md index 6a84a0de1..5d346eb4f 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.11][5] +Latest release: [v0.17.12][5] ## Quick Start @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index e4a018a21..551855f57 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.11 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.12 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.11" + "version": "0.17.12" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 2f7c8be83..3575975d4 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.11). Look for `blaze-0.17.11-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.12). Look for `blaze-0.17.12-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.11-standalone.jar -m blaze.core +java -jar blaze-0.17.12-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.11-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.17.12-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.11-standalone.jar -m blaze.core +java -jar blaze-0.17.12-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.11 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.12 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.11" + "version": "0.17.12" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 062d32ab4..cd6940c35 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-07-13" + :date #fhir/dateTime"2022-07-21" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 728352914..e47028531 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.11 + 0.17.12 1.8 diff --git a/pom.xml b/pom.xml index 5dac3ebfe..b3f927d13 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.11 + 0.17.12 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 8870448c7..5fee64886 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.11" + {:blaze/version "0.17.12" :blaze/clock {} From 3a878389b59891b06054d91dcd701dd20d2cc0aa Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 12 Jul 2022 17:36:38 +0200 Subject: [PATCH 024/124] Allow Population Basis Differ from Subject --- .../cql/src/blaze/elm/compiler/library.clj | 50 +- .../src/blaze/elm/compiler/library_spec.clj | 28 +- .../src/blaze/elm/compiler/reusing_logic.clj | 17 +- modules/cql/src/blaze/elm/expression.clj | 4 +- modules/cql/src/blaze/elm/expression_spec.clj | 10 +- modules/cql/src/blaze/elm/util.clj | 9 + .../test/blaze/elm/compiler/library_test.clj | 18 +- .../blaze/elm/compiler/reusing_logic_test.clj | 8 +- .../elm/compiler/structured_values_test.clj | 12 +- modules/cql/test/blaze/elm/util_test.clj | 8 + .../db-tx-log/src/blaze/db/tx_log/spec.clj | 2 +- modules/db/src/blaze/db/impl/search_param.clj | 1 - .../blaze/db/impl/search_param/composite.clj | 2 - modules/db/test/blaze/db/impl/codec_spec.clj | 4 +- .../db/impl/search_param/composite_test.clj | 2 +- .../src/blaze/fhir/spec/spec.clj | 8 +- .../src/blaze/fhir/spec_spec.clj | 2 +- .../test/blaze/interaction/search/spec.clj | 6 +- .../fhir/operation/evaluate_measure/cql.clj | 401 +++++++++------- .../operation/evaluate_measure/measure.clj | 34 +- .../evaluate_measure/measure/population.clj | 27 +- .../evaluate_measure/measure/spec.clj | 22 +- .../evaluate_measure/measure/stratifier.clj | 67 ++- .../evaluate_measure/measure/util.clj | 51 +- .../evaluate_measure/middleware/params.clj | 3 +- .../operation/evaluate_measure/cql_spec.clj | 50 +- .../operation/evaluate_measure/cql_test.clj | 329 ++++++++++--- .../measure/population_spec.clj | 23 + .../measure/stratifier_spec.clj | 25 + .../measure/stratifier_test.clj | 283 +++++++++++ .../evaluate_measure/measure/util_spec.clj | 11 + .../evaluate_measure/measure/util_test.clj | 1 + .../evaluate_measure/measure_spec.clj | 4 +- .../evaluate_measure/measure_test.clj | 170 +++++-- .../q40-specimen-stratifier-data.json | 354 ++++++++++++++ .../q40-specimen-stratifier-query.cql | 11 + .../q41-specimen-multi-stratifier-data.json | 452 ++++++++++++++++++ .../q41-specimen-multi-stratifier-query.cql | 15 + .../fhir/operation/evaluate_measure_test.clj | 30 +- 39 files changed, 2074 insertions(+), 480 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_spec.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql diff --git a/modules/cql/src/blaze/elm/compiler/library.clj b/modules/cql/src/blaze/elm/compiler/library.clj index 6b5d5bbc6..573b1f408 100644 --- a/modules/cql/src/blaze/elm/compiler/library.clj +++ b/modules/cql/src/blaze/elm/compiler/library.clj @@ -9,22 +9,25 @@ (defn- compile-expression-def - "Compiles the expression of `def` in `context` and returns a tuple of - `[name compiled-expression]` or an anomaly on errors." - [context {:keys [name expression] :as def}] + "Compiles the expression of `def` in `context`. + + Returns `def` with :expression replaced with the compiled expression or an + anomaly on errors." + [context def] (let [context (assoc context :eval-context (:context def))] - (-> (ba/try-anomaly [name (compiler/compile context expression)]) - (ba/exceptionally - #(assoc % :context context :elm/expression expression))))) + (-> (ba/try-anomaly (update def :expression (partial compiler/compile context))) + (ba/exceptionally #(assoc % :context context :elm/expression (:expression def)))))) (defn- compile-function-def "Compiles the function of `def` in `context`. - Returns the compiled function or an anomaly on errors." + Returns `def` with :expression removed and :function added or an anomaly on + errors." [context {:keys [name operand] :as def}] - (when-ok [[_ expression] (compile-expression-def context def)] - (partial function/arity-n name expression (mapv :name operand)))) + (when-ok [{:keys [expression]} (compile-expression-def context def)] + (-> (dissoc def :expression) + (assoc :function (partial function/arity-n name expression (mapv :name operand)))))) (defn- compile-function-defs [context library] @@ -32,24 +35,23 @@ (filter (comp #{"FunctionDef"} :type)) (completing (fn [context {:keys [name] :as def}] - (if-ok [function (compile-function-def context def)] - (assoc-in context [:functions name] function) + (if-ok [def (compile-function-def context def)] + (assoc-in context [:function-defs name] def) reduced))) context (-> library :statements :def))) (defn- expression-defs [context library] - (when-ok [context (compile-function-defs context library)] - (transduce - (comp (filter (comp nil? :type)) - (map (partial compile-expression-def context)) - (halt-when ba/anomaly?)) - (completing - (fn [r [name expression]] - (assoc r name expression))) - {} - (-> library :statements :def)))) + (transduce + (comp (filter (comp nil? :type)) + (map (partial compile-expression-def context)) + (halt-when ba/anomaly?)) + (completing + (fn [r {:keys [name] :as def}] + (assoc r name def))) + {} + (-> library :statements :def))) (defn- compile-parameter-def @@ -89,7 +91,9 @@ equiv-relationships/find-equiv-rels-library deps-infer/infer-library-deps) context (assoc opts :node node :library library)] - (when-ok [expression-defs (expression-defs context library) + (when-ok [{:keys [function-defs] :as context} (compile-function-defs context library) + expression-defs (expression-defs context library) parameter-default-values (parameter-default-values context library)] - {:compiled-expression-defs expression-defs + {:expression-defs expression-defs + :function-defs function-defs :parameter-default-values parameter-default-values}))) diff --git a/modules/cql/src/blaze/elm/compiler/library_spec.clj b/modules/cql/src/blaze/elm/compiler/library_spec.clj index f39cced8a..70a6f8636 100644 --- a/modules/cql/src/blaze/elm/compiler/library_spec.clj +++ b/modules/cql/src/blaze/elm/compiler/library_spec.clj @@ -1,25 +1,41 @@ (ns blaze.elm.compiler.library-spec (:require [blaze.anomaly-spec] + [blaze.elm.compiler :as-alias compiler] [blaze.elm.compiler-spec] [blaze.elm.compiler.core :as core] + [blaze.elm.compiler.expression-def :as-alias expression-def] [blaze.elm.compiler.library :as library] + [blaze.elm.compiler.spec] + [blaze.fhir.spec.spec] [clojure.spec.alpha :as s] [cognitect.anomalies :as anom])) -(s/def ::compiled-expression-defs - (s/map-of :elm/name core/expr?)) +(s/def ::expression-def/name + string?) + + +(s/def ::expression-def/context + :fhir.resource/type) + +(s/def ::compiler/expression-def + (s/keys :req-un [::expression-def/name ::expression-def/context ::compiler/expression])) -(s/def ::parameter-default-values + +(s/def ::compiler/expression-defs (s/map-of :elm/name core/expr?)) -(s/def :life/compiled-library - (s/keys :req-un [::compiled-expression-defs ::parameter-default-values])) +(s/def ::compiler/parameter-default-values + (s/map-of :elm/name ::compiler/expression)) + + +(s/def ::compiler/library + (s/keys :req-un [::compiler/expression-defs ::compiler/parameter-default-values])) (s/fdef library/compile-library :args (s/cat :node :blaze.db/node :library :elm/library :opts map?) - :ret (s/or :library :life/compiled-library :anomaly ::anom/anomaly)) + :ret (s/or :library ::compiler/library :anomaly ::anom/anomaly)) diff --git a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj index e3a074302..bf18f3868 100644 --- a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj +++ b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj @@ -31,11 +31,10 @@ (defrecord ExpressionRef [name] core/Expression - (-eval [_ {:keys [library-context] :as context} resource _] - (let [expr (get library-context name ::not-found)] - (if (identical? ::not-found expr) - (throw-anom (expression-not-found-anom context name)) - (core/-eval expr context resource nil)))) + (-eval [_ {:keys [expression-defs] :as context} resource _] + (if-let [{:keys [expression]} (get expression-defs name)] + (core/-eval expression context resource nil) + (throw-anom (expression-not-found-anom context name)))) (-form [_] `(~'expr-ref ~name))) @@ -71,8 +70,8 @@ ;; Unfiltered context. So we map the referenced expression over all ;; concrete resources. (reify core/Expression - (-eval [_ {:keys [db library-context] :as context} _ _] - (if-some [expression (get library-context name)] + (-eval [_ {:keys [db expression-defs] :as context} _ _] + (if-some [{:keys [expression]} (get expression-defs name)] (mapv #(core/-eval expression context % nil) (d/type-list db def-eval-context)) @@ -169,8 +168,8 @@ :context context)) -(defn compile-function [{:keys [functions] :as context} name operands] - (if-let [function (get functions name)] +(defn compile-function [{:keys [function-defs] :as context} name operands] + (if-let [{:keys [function]} (get function-defs name)] (function operands) (throw-anom (function-def-not-found-anom context name)))) diff --git a/modules/cql/src/blaze/elm/expression.clj b/modules/cql/src/blaze/elm/expression.clj index 36d6c21e8..5c769b643 100644 --- a/modules/cql/src/blaze/elm/expression.clj +++ b/modules/cql/src/blaze/elm/expression.clj @@ -5,6 +5,8 @@ (defn eval - "Evaluates `expression` on `resource` using `context`." + "Evaluates `expression` on `resource` using `context`. + + Throws an Exception on errors." [context expression resource] (core/-eval expression context resource nil)) diff --git a/modules/cql/src/blaze/elm/expression_spec.clj b/modules/cql/src/blaze/elm/expression_spec.clj index 698f55f30..c2e1233be 100644 --- a/modules/cql/src/blaze/elm/expression_spec.clj +++ b/modules/cql/src/blaze/elm/expression_spec.clj @@ -1,6 +1,8 @@ (ns blaze.elm.expression-spec (:require [blaze.db.api-spec] + [blaze.elm.compiler :as-alias compiler] + [blaze.elm.compiler.library-spec] [blaze.elm.compiler.spec] [blaze.elm.expression :as expr] [blaze.fhir.spec] @@ -12,17 +14,13 @@ time/offset-date-time?) -(s/def ::library-context - (s/map-of string? :blaze.elm.compiler/expression)) - - (s/def ::parameters - (s/map-of string? any?)) + (s/map-of :elm/name ::compiler/expression)) (s/def :blaze.elm.expression/context (s/keys :req-un [:blaze.db/db ::now] - :opt-un [::library-context ::parameters])) + :opt-un [::compiler/expression-defs ::parameters])) (s/fdef expr/eval diff --git a/modules/cql/src/blaze/elm/util.clj b/modules/cql/src/blaze/elm/util.clj index 9a5aea199..9aecb510a 100644 --- a/modules/cql/src/blaze/elm/util.clj +++ b/modules/cql/src/blaze/elm/util.clj @@ -9,3 +9,12 @@ [s] (when-let [[_ ns name] (some->> s (re-matches #"\{(.+)\}(.+)"))] [ns name])) + + +(defn parse-type + [{:keys [type name] element-type :elementType}] + (condp = type + "NamedTypeSpecifier" + (second (parse-qualified-name name)) + "ListTypeSpecifier" + (str "List<" (parse-type element-type) ">"))) diff --git a/modules/cql/test/blaze/elm/compiler/library_test.clj b/modules/cql/test/blaze/elm/compiler/library_test.clj index 8928d6eb2..fc2cb5bc8 100644 --- a/modules/cql/test/blaze/elm/compiler/library_test.clj +++ b/modules/cql/test/blaze/elm/compiler/library_test.clj @@ -30,13 +30,14 @@ (let [library (t/translate "library Test")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - :compiled-expression-defs := {})))) + :expression-defs := {})))) (testing "one static expression" (let [library (t/translate "library Test define Foo: true")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - :compiled-expression-defs := {"Foo" true})))) + [:expression-defs "Foo" :context] := "Patient" + [:expression-defs "Foo" :expression] := true)))) (testing "one dynamic expression" (let [library (t/translate "library Test @@ -45,7 +46,8 @@ define Gender: Patient.gender")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - [:compiled-expression-defs "Gender" compiler/form] := '(:gender (expr-ref "Patient")))))) + [:expression-defs "Gender" :context] := "Patient" + [:expression-defs "Gender" :expression compiler/form] := '(:gender (expr-ref "Patient")))))) (testing "one function" (let [library (t/translate "library Test @@ -55,7 +57,12 @@ define InInitialPopulation: Gender(Patient)")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - [:compiled-expression-defs "InInitialPopulation" compiler/form] := '(call "Gender" (expr-ref "Patient")))))) + [:expression-defs "InInitialPopulation" :context] := "Patient" + [:expression-defs "InInitialPopulation" :resultTypeName] := "{http://hl7.org/fhir}AdministrativeGender" + [:expression-defs "InInitialPopulation" :expression compiler/form] := '(call "Gender" (expr-ref "Patient")) + [:function-defs "Gender" :context] := "Patient" + [:function-defs "Gender" :resultTypeName] := "{http://hl7.org/fhir}AdministrativeGender" + [:function-defs "Gender" :function] :? fn?)))) (testing "two functions, one calling the other" (let [library (t/translate "library Test @@ -66,7 +73,8 @@ define InInitialPopulation: Inc2(1)")] (with-system [{:blaze.db/keys [node]} mem-node-system] (given (library/compile-library node library {}) - [:compiled-expression-defs "InInitialPopulation" compiler/form] := '(call "Inc2" 1))))) + [:expression-defs "InInitialPopulation" :context] := "Patient" + [:expression-defs "InInitialPopulation" :expression compiler/form] := '(call "Inc2" 1))))) (testing "with compile-time error" (testing "function" diff --git a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj index 0b19d9bbd..e16680f36 100644 --- a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj +++ b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj @@ -54,7 +54,7 @@ (testing "Eval" (let [library {:statements {:def [{:name "name-170312"}]}} expr (c/compile {:library library} #elm/expression-ref "name-170312")] - (is (= ::result (core/-eval expr {:library-context {"name-170312" ::result}} nil nil))))) + (is (= ::result (core/-eval expr {:expression-defs {"name-170312" {:expression ::result}}} nil nil))))) (testing "form" (let [library {:statements {:def [{:name "name-170312"}]}} @@ -76,7 +76,7 @@ (testing "Custom function with arity 0" (let [function-name "name-210650" fn-expr (c/compile {} #elm/integer "1") - compile-ctx {:functions {function-name (partial function/arity-n function-name fn-expr [])}} + compile-ctx {:function-defs {function-name {:function (partial function/arity-n function-name fn-expr [])}}} elm (elm/function-ref [function-name]) expr (c/compile compile-ctx elm)] (testing "eval" @@ -89,7 +89,7 @@ (let [function-name "name-180815" fn-expr (c/compile {} #elm/negate #elm/operand-ref"x") compile-ctx {:library {:parameters {:def [{:name "a"}]}} - :functions {function-name (partial function/arity-n function-name fn-expr ["x"])}} + :function-defs {function-name {:function (partial function/arity-n function-name fn-expr ["x"])}}} elm (elm/function-ref [function-name #elm/parameter-ref "a"]) expr (c/compile compile-ctx elm)] (testing "eval" @@ -105,7 +105,7 @@ (let [function-name "name-184652" fn-expr (c/compile {} #elm/add [#elm/operand-ref"x" #elm/operand-ref"y"]) compile-ctx {:library {:parameters {:def [{:name "a"} {:name "b"}]}} - :functions {function-name (partial function/arity-n function-name fn-expr ["x" "y"])}} + :function-defs {function-name {:function (partial function/arity-n function-name fn-expr ["x" "y"])}}} elm (elm/function-ref [function-name #elm/parameter-ref "a" #elm/parameter-ref "b"]) expr (c/compile compile-ctx elm)] (testing "eval" diff --git a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj index 1210ffa78..5dcb11a3d 100644 --- a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj @@ -338,7 +338,7 @@ {:fhir/type :fhir/Patient :id "0" :identifier [identifier]} expr (c/compile {:library library :eval-context "Patient"} elm) - result (coll/first (core/-eval expr {:library-context {"Patient" source}} nil nil))] + result (coll/first (core/-eval expr {:expression-defs {"Patient" {:expression source}}} nil nil))] (is (= identifier result)) (testing "form" @@ -358,7 +358,7 @@ {:fhir/type :fhir/Patient :id "0" :identifier [identifier]} expr (c/compile {:library library :eval-context "Patient"} elm) - result (coll/first (core/-eval expr {:library-context {"Patient" source}} nil nil))] + result (coll/first (core/-eval expr {:expression-defs {"Patient" {:expression source}}} nil nil))] (is (= identifier result))))) (testing "Patient.gender" @@ -373,7 +373,7 @@ {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"} expr (c/compile {:library library :eval-context "Patient"} elm) - result (core/-eval expr {:library-context {"Patient" source}} nil nil)] + result (core/-eval expr {:expression-defs {"Patient" {:expression source}}} nil nil)] (is (= #fhir/code"male" result)))) (testing "without source-type" @@ -386,7 +386,7 @@ {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"} expr (c/compile {:library library :eval-context "Patient"} elm) - result (core/-eval expr {:library-context {"Patient" source}} nil nil)] + result (core/-eval expr {:expression-defs {"Patient" {:expression source}}} nil nil)] (is (= #fhir/code"male" result))))) (testing "Observation.value" @@ -401,7 +401,7 @@ {:fhir/type :fhir/Observation :id "0" :value "value-114318"} expr (c/compile {:library library :eval-context "Patient"} elm) - result (core/-eval expr {:library-context {"Observation" source}} nil nil)] + result (core/-eval expr {:expression-defs {"Observation" {:expression source}}} nil nil)] (is (= "value-114318" result)))) (testing "without source-type" @@ -414,7 +414,7 @@ {:fhir/type :fhir/Observation :id "0" :value "value-114318"} expr (c/compile {:library library :eval-context "Patient"} elm) - result (core/-eval expr {:library-context {"Observation" source}} nil nil)] + result (core/-eval expr {:expression-defs {"Observation" {:expression source}}} nil nil)] (is (= "value-114318" result))))) (testing "Tuple" diff --git a/modules/cql/test/blaze/elm/util_test.clj b/modules/cql/test/blaze/elm/util_test.clj index 9787462ce..e3a4386c2 100644 --- a/modules/cql/test/blaze/elm/util_test.clj +++ b/modules/cql/test/blaze/elm/util_test.clj @@ -33,3 +33,11 @@ (testing "valid string" (are [s ns name] (= [ns name] (elm-util/parse-qualified-name s)) "{a}b" "a" "b"))) + + +(deftest parse-type-test + (testing "ELM type" + (is (= "String" (elm-util/parse-type {:type "NamedTypeSpecifier" :name "{urn:hl7-org:elm-types:r1}String"})))) + + (testing "list type" + (is (= "List" (elm-util/parse-type {:type "ListTypeSpecifier" :elementType {:type "NamedTypeSpecifier" :name "{http://hl7.org/fhir}Encounter"}}))))) diff --git a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj index a28c434e4..8100d26b3 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj @@ -20,7 +20,7 @@ (s/def :blaze.db.tx-cmd/type - :fhir.type/name) + :fhir.resource/type) (s/def :blaze.db.tx-cmd/refs diff --git a/modules/db/src/blaze/db/impl/search_param.clj b/modules/db/src/blaze/db/impl/search_param.clj index f49bb4d5e..23f39634d 100644 --- a/modules/db/src/blaze/db/impl/search_param.clj +++ b/modules/db/src/blaze/db/impl/search_param.clj @@ -33,7 +33,6 @@ (comp (map (partial p/-compile-value search-param modifier)) (halt-when ba/anomaly?)) conj - [] values)) diff --git a/modules/db/src/blaze/db/impl/search_param/composite.clj b/modules/db/src/blaze/db/impl/search_param/composite.clj index 845ce0d5f..29aec6199 100644 --- a/modules/db/src/blaze/db/impl/search_param/composite.clj +++ b/modules/db/src/blaze/db/impl/search_param/composite.clj @@ -25,7 +25,6 @@ (comp (map (partial resolve-search-param index)) (halt-when ba/anomaly?)) conj - [] components)) @@ -40,7 +39,6 @@ (comp (map compile-expression) (halt-when ba/anomaly?)) conj - [] components)) diff --git a/modules/db/test/blaze/db/impl/codec_spec.clj b/modules/db/test/blaze/db/impl/codec_spec.clj index 6c4471ecd..8a0b6e6da 100644 --- a/modules/db/test/blaze/db/impl/codec_spec.clj +++ b/modules/db/test/blaze/db/impl/codec_spec.clj @@ -30,13 +30,13 @@ ;; ---- Other Functions ------------------------------------------------------- (s/fdef codec/tid - :args (s/cat :type :fhir.type/name) + :args (s/cat :type :fhir.resource/type) :ret :blaze.db/tid) (s/fdef codec/tid->type :args (s/cat :tid :blaze.db/tid) - :ret :fhir.type/name) + :ret :fhir.resource/type) (s/fdef codec/c-hash diff --git a/modules/db/test/blaze/db/impl/search_param/composite_test.clj b/modules/db/test/blaze/db/impl/search_param/composite_test.clj index 2c62092f2..8a3e9737f 100644 --- a/modules/db/test/blaze/db/impl/search_param/composite_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/composite_test.clj @@ -132,7 +132,7 @@ (defn anom-vec [coll] - (transduce (halt-when ba/anomaly?) conj [] coll)) + (transduce (halt-when ba/anomaly?) conj coll)) (deftest index-entries-test diff --git a/modules/fhir-structure/src/blaze/fhir/spec/spec.clj b/modules/fhir-structure/src/blaze/fhir/spec/spec.clj index f70236664..a5d6fd4b3 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/spec.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/spec.clj @@ -6,19 +6,15 @@ [clojure.string :as str])) -(s/def :fhir.type/name - (s/and string? #(re-matches #"[A-Z]([A-Za-z0-9_]){0,254}" %))) - - (s/def :fhir.resource/type - :fhir.type/name) + (s/and string? #(re-matches #"[A-Z]([A-Za-z0-9_]){0,254}" %))) (s/def :fhir/type (s/and keyword? #(some-> (namespace %) (str/starts-with? "fhir")) - #(s/valid? :fhir.type/name (name %)))) + #(re-matches #"[A-Za-z]([A-Za-z0-9_]){0,254}" (name %)))) (s/def :blaze.resource/id diff --git a/modules/fhir-structure/src/blaze/fhir/spec_spec.clj b/modules/fhir-structure/src/blaze/fhir/spec_spec.clj index 40b48e913..5dfc5bc2d 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec_spec.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec_spec.clj @@ -63,4 +63,4 @@ (s/fdef fhir-spec/fhir-type :args (s/cat :x any?) - :ret (s/nilable keyword?)) + :ret (s/nilable :fhir/type)) diff --git a/modules/interaction/test/blaze/interaction/search/spec.clj b/modules/interaction/test/blaze/interaction/search/spec.clj index 384ad5b9f..5bc582599 100644 --- a/modules/interaction/test/blaze/interaction/search/spec.clj +++ b/modules/interaction/test/blaze/interaction/search/spec.clj @@ -9,7 +9,7 @@ (s/def ::target-type - :fhir.type/name) + :fhir.resource/type) (s/def ::include-def @@ -17,11 +17,11 @@ (s/def ::forward - (s/map-of :fhir.type/name (s/coll-of ::include-def))) + (s/map-of :fhir.resource/type (s/coll-of ::include-def))) (s/def ::reverse - (s/map-of (s/or :type :fhir.type/name :any #{:any}) (s/coll-of ::include-def))) + (s/map-of (s/or :type :fhir.resource/type :any #{:any}) (s/coll-of ::include-def))) (s/def ::direct diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj index 8fc265d67..bc4e8e8a0 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj @@ -1,8 +1,9 @@ (ns blaze.fhir.operation.evaluate-measure.cql (:require - [blaze.anomaly :as ba :refer [when-ok]] + [blaze.anomaly :as ba :refer [if-ok when-ok]] [blaze.db.api :as d] [blaze.elm.expression :as expr] + [blaze.elm.util :as elm-util] [blaze.fhir.spec :as fhir-spec] [clojure.core.reducers :as r] [taoensso.timbre :as log]) @@ -36,21 +37,20 @@ (ex-message e))) -(defn- evaluate-expression-1 - [{:keys [library-context] :as context} subject-handle expression-name] +(defn- evaluate-expression-1 [context subject-handle name expression] (try - (expr/eval context (get library-context expression-name) subject-handle) + (expr/eval context expression subject-handle) (catch Exception e (let [ex-data (ex-data e)] ;; only log if the exception hasn't ex-data because exception with ;; ex-data are controlled by us and so are not unexpected (when-not ex-data - (log/error (evaluate-expression-1-error-msg expression-name e)) + (log/error (evaluate-expression-1-error-msg name e)) (log/error e)) (-> (ba/fault - (evaluate-expression-1-error-msg expression-name e) + (evaluate-expression-1-error-msg name e) :fhir/issue "exception" - :expression-name expression-name) + :expression-name name) (merge ex-data)))))) @@ -87,7 +87,7 @@ [combine-op] (fn anomaly-combine-op ([] (combine-op)) - ([r] r) + ([r] (if (ba/anomaly? r) r (combine-op r))) ([a b] (cond (ba/anomaly? a) a @@ -95,73 +95,123 @@ :else (combine-op a b))))) -(defn- expression-result-combine-op [{:keys [report-type]}] - (case report-type - "population" + - "subject-list" into)) +(defn- expression-combine-op [context] + (-> (fn + ([] (transient [])) + ([x] (persistent! x)) + ([a b] (reduce conj! a (persistent! b)))) + (wrap-anomaly) + (wrap-batch-db context))) -(defn- expression-result-reduce-op [{:keys [report-type]}] - (case report-type - "population" (fn [result _] (inc result)) - "subject-list" (fn [result {:keys [id]}] (conj result id)))) +(defn- handle [subject-handle] + {:population-handle subject-handle :subject-handle subject-handle}) -(defn- expression-combine-op [context] - (-> (expression-result-combine-op context) - (wrap-anomaly) - (wrap-batch-db context))) +(defn- conj-all! [handles subject-handle population-handles] + (reduce + (fn [handles population-handle] + (conj! handles {:population-handle population-handle + :subject-handle subject-handle})) + handles + population-handles)) -(defn- evaluate-expression* - "Evaluates the expression with `name` over `subject-handles` parallel. +(defn- evaluate-expression** + "Evaluates the expression within `def` over `subject-handles` parallel. Subject handles have to be a vector in order to ensure parallel execution." - [context name subject-handles] - (let [reduce-result-op (expression-result-reduce-op context)] - (r/fold - eval-sequential-chunk-size - (expression-combine-op context) - (fn [context subject-handle] - (let [res (evaluate-expression-1 context subject-handle name)] - (cond - (ba/anomaly? res) - (reduced (assoc context ::result res)) - - res - (update context ::result reduce-result-op subject-handle) - - :else - context))) - subject-handles))) - - -(defn- unwrap-library-context - {:arglists '([context])} - [{:keys [parameters] - {:keys [compiled-expression-defs parameter-default-values]} :library - :as context}] - (assoc context - :library-context compiled-expression-defs - :parameters (merge parameter-default-values parameters))) + [context {:keys [name expression]} subject-handles population-basis] + (r/fold + eval-sequential-chunk-size + (expression-combine-op context) + (fn [context subject-handle] + (if-ok [res (evaluate-expression-1 context subject-handle name expression)] + (if (identical? :boolean population-basis) + (cond-> context res (update ::result conj! (handle subject-handle))) + (update context ::result conj-all! subject-handle res)) + #(reduced (assoc context ::result %)))) + subject-handles)) + + +(defn evaluate-expression* + [{:keys [db] :as context} expression-def subject-type population-basis] + (transduce + (comp + (partition-all eval-parallel-chunk-size) + (map #(evaluate-expression** context expression-def % population-basis))) + (expression-combine-op context) + (d/type-list db subject-type))) + + +(defn- missing-expression-anom [name] + (ba/incorrect + (format "Missing expression with name `%s`." name) + :expression-name name)) + + +(defn- expression-def [{:keys [expression-defs]} name] + (if-let [def (get expression-defs name)] + def + (missing-expression-anom name))) + + +(defn- check-context [subject-type {:keys [context name]}] + (when-not (= subject-type context) + (ba/incorrect + (format "The context `%s` of the expression `%s` differs from the subject type `%s`." + context name subject-type) + :expression-name name + :subject-type subject-type + :expression-context context))) + + +(defn- def-result-type + [{result-type-name :resultTypeName + result-type-specifier :resultTypeSpecifier}] + (if result-type-name + (elm-util/parse-type {:type "NamedTypeSpecifier" :name result-type-name}) + (elm-util/parse-type result-type-specifier))) + + +(defn- check-result-type [population-basis {:keys [name] :as expression-def}] + (let [result-type (def-result-type expression-def)] + (if (= :boolean population-basis) + (when-not (= "Boolean" result-type) + (ba/incorrect + (format "The result type `%s` of the expression `%s` differs from the population basis :boolean." + result-type name) + :expression-name name + :population-basis population-basis + :expression-result-type result-type)) + (when-not (= (str "List<" population-basis ">") result-type) + (ba/incorrect + (format "The result type `%s` of the expression `%s` differs from the population basis `%s`." + result-type name population-basis) + :expression-name name + :population-basis population-basis + :expression-result-type result-type))))) (defn evaluate-expression - "Evaluates the expression with `name` according to `context`. + "Evaluates the expression with `name` on each subject of `subject-type` + available in :db of `context`. - Depending on :report-type of `context`, returns either the number of or a - vector of the actual subject id's of expressions evaluated to true. + The context consists of: + :db - the database to use for obtaining subjects and evaluating the expression + :now - the evaluation time + :expression-defs - a map of available expression definitions + :parameters - an optional map of parameters - Returns an anomaly in case of errors." - {:arglists '([context name])} - [{:keys [db subject-type] :as context} name] - (let [context (unwrap-library-context context)] - (transduce - (comp - (partition-all eval-parallel-chunk-size) - (map #(evaluate-expression* context name %))) - (expression-combine-op context) - (d/type-list db subject-type)))) + The context of the expression has to match `subject-type`. The result type of + the expression has to match the `population-basis`. + + Returns a list of subject-handles or an anomaly in case of errors." + [context name subject-type population-basis] + (when-ok [expression-def (expression-def context name) + _ (check-context subject-type expression-def) + _ (check-result-type population-basis expression-def)] + (evaluate-expression* context expression-def subject-type population-basis))) (defn evaluate-individual-expression @@ -169,25 +219,16 @@ Returns an anomaly in case of errors." [context subject-handle name] - (evaluate-expression-1 (unwrap-library-context context) subject-handle name)) - - -(defn- stratum-result-combine-op [{:keys [report-type]}] - (case report-type - "population" (partial merge-with +) - "subject-list" (partial merge-with into))) + (when-ok [{:keys [name expression]} (expression-def context name)] + (evaluate-expression-1 context subject-handle name expression))) -(defn- stratum-result-reduce-op [{:keys [report-type]}] - (case report-type - "population" - (fn [result stratum _] (update result stratum (fnil inc 0))) - "subject-list" - (fn [result stratum {:keys [id]}] (update result stratum (fnil conj []) id)))) +(defn- stratum-result-reduce-op [result stratum subject-handle] + (update result stratum (fnil conj []) subject-handle)) (defn- stratum-combine-op [context] - (-> (stratum-result-combine-op context) + (-> (partial merge-with into) (wrap-anomaly) (wrap-batch-db context))) @@ -197,114 +238,138 @@ expression-name (-> handle fhir-spec/fhir-type name (str "/" id)))) -(defn- evaluate-stratum-expression [context subject-handle name] - (let [result (evaluate-expression-1 context subject-handle name)] +(defn- evaluate-stratum-expression + [context subject-handle name expression] + (let [result (evaluate-expression-1 context subject-handle name expression)] (if (sequential? result) (ba/incorrect (incorrect-stratum-msg subject-handle name)) result))) -(defn calc-strata* - [context population-expression-name stratum-expression-name subject-handles] - (let [stratum-result-reduce-op (stratum-result-reduce-op context)] - (r/fold - eval-sequential-chunk-size - (stratum-combine-op context) - (fn [context subject-handle] - (let [res (evaluate-expression-1 context subject-handle - population-expression-name)] - (cond - (ba/anomaly? res) - (reduced (assoc context ::result res)) +(defn- calc-strata** [context {:keys [name expression]} handles] + (r/fold + eval-sequential-chunk-size + (stratum-combine-op context) + (fn [context {:keys [subject-handle] :as handle}] + (if-ok [stratum (evaluate-stratum-expression context subject-handle + name expression)] + (update context ::result stratum-result-reduce-op stratum handle) + #(reduced (assoc context ::result %)))) + handles)) - res - (let [stratum (evaluate-stratum-expression - context subject-handle stratum-expression-name)] - (if (ba/anomaly? stratum) - (reduced (assoc context ::result stratum)) - (update context ::result stratum-result-reduce-op stratum subject-handle))) - :else - context))) - subject-handles))) +(defn calc-strata* [context expression-def handles] + (transduce + (comp + (partition-all eval-parallel-chunk-size) + (map (partial calc-strata** context expression-def))) + (stratum-combine-op context) + handles)) (defn calc-strata - "Returns a map of stratum to count or an anomaly." - {:arglists '([context population-expression-name stratum-expression-name])} - [{:keys [db subject-type] :as context} population-expression-name - stratum-expression-name] - (let [context (unwrap-library-context context)] - (transduce - (comp - (partition-all eval-parallel-chunk-size) - (map #(calc-strata* context population-expression-name - stratum-expression-name %))) - (stratum-combine-op context) - (d/type-list db subject-type)))) - - -(defn calc-individual-strata - "Returns a map of stratum to count or an anomaly." - [context subject-handle population-expression-name stratum-expression-name] - (let [context (unwrap-library-context context)] - (when-ok [included? (evaluate-expression-1 context subject-handle - population-expression-name)] - (when included? - (when-ok [stratum (evaluate-stratum-expression - context subject-handle stratum-expression-name)] - {stratum 1}))))) - - -(defn- anom-conj - ([] []) - ([r] r) - ([r x] (if (ba/anomaly? x) (reduced x) (conj r x)))) - - -(defn- evaluate-mult-component-stratum-expression [context subject-handle names] + "Returns a map of stratum value to a list of subject handles or an anomaly." + [context expression-name handles] + (when-ok [expression-def (expression-def context expression-name)] + (calc-strata* context expression-def handles))) + + +(defn- calc-function-strata** [context {:keys [name function]} handles] + (r/fold + eval-sequential-chunk-size + (stratum-combine-op context) + (fn [context {:keys [population-handle subject-handle] :as handle}] + (if-ok [stratum (evaluate-stratum-expression context subject-handle + name (function [population-handle]))] + (update context ::result stratum-result-reduce-op stratum handle) + #(reduced (assoc context ::result %)))) + handles)) + + +(defn- calc-function-strata* [context function-def handles] (transduce - (map #(evaluate-stratum-expression context subject-handle %)) - anom-conj - names)) + (comp + (partition-all eval-parallel-chunk-size) + (map (partial calc-function-strata** context function-def))) + (stratum-combine-op context) + handles)) -(defn calc-mult-component-strata* - [context population-expression-name stratum-expression-names subject-handles] - (let [stratum-result-reduce-op (stratum-result-reduce-op context)] - (r/fold - eval-sequential-chunk-size - (stratum-combine-op context) - (fn [context subject-handle] - (let [res (evaluate-expression-1 context subject-handle - population-expression-name)] - (cond - (ba/anomaly? res) - (reduced (assoc context ::result res)) +(defn- missing-function-anom [name] + (ba/incorrect + (format "Missing function with name `%s`." name) + :function-name name)) - res - (let [stratum (evaluate-mult-component-stratum-expression - context subject-handle stratum-expression-names)] - (if (ba/anomaly? stratum) - (reduced (assoc context ::result stratum)) - (update context ::result stratum-result-reduce-op stratum subject-handle))) +(defn- function-def [{:keys [function-defs]} name] + (if-let [def (get function-defs name)] + def + (missing-function-anom name))) - :else - context))) - subject-handles))) + +(defn calc-function-strata + "Returns a map of stratum value to a list of subject handles or an anomaly." + [context function-name handles] + (when-ok [function-def (function-def context function-name)] + (calc-function-strata* context function-def handles))) + + +(defn- evaluate-multi-component-stratum-1 + [context + {:keys [subject-handle population-handle]} + {:keys [name expression function]}] + (if function + (evaluate-stratum-expression context subject-handle name (function [population-handle])) + (evaluate-stratum-expression context subject-handle name expression))) + + +(defn- evaluate-multi-component-stratum [context handle defs] + (transduce + (comp (map (partial evaluate-multi-component-stratum-1 context handle)) + (halt-when ba/anomaly?)) + conj + defs)) + + +(defn calc-multi-component-strata** [context defs handles] + (r/fold + eval-sequential-chunk-size + (stratum-combine-op context) + (fn [context handle] + (if-ok [stratum (evaluate-multi-component-stratum context handle defs)] + (update context ::result stratum-result-reduce-op stratum handle) + #(reduced (assoc context ::result %)))) + handles)) + + +(defn calc-multi-component-strata* [context defs handles] + (transduce + (comp + (partition-all eval-parallel-chunk-size) + (map (partial calc-multi-component-strata** context defs))) + (stratum-combine-op context) + handles)) + + +(defn- def [{:keys [expression-defs population-basis] :as context} name] + (if-let [def (get expression-defs name)] + def + (if (string? population-basis) + (function-def context name) + (missing-expression-anom name)))) + + +(defn- defs [context names] + (transduce + (comp (map (partial def context)) + (halt-when ba/anomaly?)) + conj + names)) (defn calc-multi-component-strata - "Returns a map of stratum to count or an anomaly." - {:arglists '([[context population-expression-name expression-names]])} - [{:keys [db subject-type] :as context} population-expression-name - stratum-expression-names] - (let [context (unwrap-library-context context)] - (transduce - (comp - (partition-all eval-parallel-chunk-size) - (map #(calc-mult-component-strata* context population-expression-name - stratum-expression-names %))) - (stratum-combine-op context) - (d/type-list db subject-type)))) + "Returns a map of list of stratum values to a list of subject handles or an + anomaly." + [context expression-names handles] + (when-ok [defs (defs context expression-names)] + (calc-multi-component-strata* context defs handles))) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj index c3bd3d1cb..4147bdcfd 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj @@ -159,30 +159,42 @@ (fn [{:keys [luids] :as ret} [idx population]] (->> (population/evaluate (assoc context :luids luids) idx population) (u/merge-result ret)))) - {:result [] :luids luids :tx-ops []} + {:result [] :handles [] :luids luids :tx-ops []} populations)) -(defn- evaluate-stratifiers [{:keys [luids] :as context} populations stratifiers] +(defn- evaluate-stratifiers + [{:keys [luids] :as context} evaluated-populations stratifiers] (transduce (map-indexed vector) (completing (fn [{:keys [luids] :as ret} [idx stratifier]] (->> (stratifier/evaluate (assoc context :luids luids :stratifier-idx idx) - populations stratifier) + evaluated-populations stratifier) (u/merge-result ret)))) {:result [] :luids luids :tx-ops []} stratifiers)) +(defn- population-basis [{:keys [extension]}] + (some + (fn [{:keys [url value]}] + (when (= "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis" url) + (let [basis (type/value value)] + (cond-> basis (= "boolean" basis) keyword)))) + extension)) + + (defn- evaluate-group {:arglists '([context group])} - [context {:keys [code population stratifier]}] - (when-ok [{:keys [luids] :as evaluated-populations} + [context {:keys [code population stratifier] :as group}] + (when-ok [context (assoc context :population-basis (population-basis group)) + {:keys [luids] :as evaluated-populations} (evaluate-populations context population) evaluated-stratifiers - (evaluate-stratifiers (assoc context :luids luids) population + (evaluate-stratifiers (assoc context :luids luids) + evaluated-populations stratifier)] {:result (cond-> {:fhir/type :fhir.MeasureReport/group} @@ -241,7 +253,7 @@ (or (get-first-code codings "http://hl7.org/fhir/resource-types") "Patient")) -(defn eval-duration [duration] +(defn- eval-duration [duration] (type/extension {:url "https://samply.github.io/blaze/fhir/StructureDefinition/eval-duration" :value @@ -323,13 +335,17 @@ [{:keys [clock db] :as context} {:keys [id] groups :group :as measure} {:keys [report-type subject-ref] [start end] :period}] - (when-ok [library (compile-primary-library db measure) + (when-ok [{:keys [expression-defs function-defs parameter-default-values]} (compile-primary-library db measure) now (now clock) subject-type (subject-type measure) subject-handle (some->> subject-ref (subject-handle db subject-type)) context (cond-> (assoc context - :db db :now now :library library + :db db + :now now + :expression-defs expression-defs + :function-defs function-defs + :parameters parameter-default-values :subject-type subject-type :report-type report-type :luids (successive-luids context)) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/population.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/population.clj index d97c29dee..87727834f 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/population.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/population.clj @@ -9,17 +9,24 @@ (format "Measure.group[%d].population[%d]" group-idx population-idx)) -(defn- evaluate-expression [{:keys [subject-handle] :as context} expression] +(defn- evaluate-expression + [{:keys [subject-handle subject-type population-basis] :as context} + expression-name] (if subject-handle - (cql/evaluate-individual-expression context subject-handle expression) - (cql/evaluate-expression context expression))) + (when (cql/evaluate-individual-expression context subject-handle + expression-name) + [{:population-handle subject-handle + :subject-handle subject-handle}]) + (cql/evaluate-expression context expression-name subject-type + (or population-basis :boolean)))) (defn evaluate - {:arglists '([context population-idx population])} - [{:keys [group-idx] :as context} population-idx - {:keys [code criteria]}] - (let [population-path-fn #(population-path group-idx population-idx)] - (when-ok [expression (u/expression population-path-fn criteria) - result (evaluate-expression context expression)] - (u/population context :fhir.MeasureReport.group/population code result)))) + "Returns a map of :result, :handles, :luids and :tx-ops." + {:arglists '([context idx population])} + [{:keys [group-idx] :as context} idx {:keys [code criteria]}] + (let [population-path-fn #(population-path group-idx idx)] + (when-ok [expression-name (u/expression population-path-fn criteria) + handles (evaluate-expression context expression-name)] + (-> (u/population context :fhir.MeasureReport.group/population code handles) + (assoc :handles handles))))) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj index 13ce54cfb..f901bcae9 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj @@ -1,12 +1,30 @@ (ns blaze.fhir.operation.evaluate-measure.measure.spec (:require + [blaze.db.spec] + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] [clojure.spec.alpha :as s])) -(s/def :blaze.fhir.operation.evaluate-measure/report-type +(s/def ::measure/report-type #{"subject" "subject-list" "population"}) -(s/def :blaze.fhir.operation.evaluate-measure/subject-ref +(s/def ::measure/subject-ref (s/or :id :blaze.resource/id :local-ref (s/tuple :fhir.resource/type :blaze.resource/id))) + + +(s/def ::measure/population-handle + :blaze.db/resource-handle) + + +(s/def ::measure/subject-handle + :blaze.db/resource-handle) + + +(s/def ::measure/handle + (s/keys :req-un [::measure/population-handle ::measure/subject-handle])) + + +(s/def ::measure/handles + (s/coll-of ::measure/handle)) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj index 18b0033a7..db61a5f09 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj @@ -8,7 +8,7 @@ (defn- value-concept [value] (type/codeable-concept - {:text (type/string (str (if (nil? value) "null" value)))})) + {:text (type/string (if (nil? value) "null" (str value)))})) (defn- stratum* [population value] @@ -17,16 +17,16 @@ :population [population]}) -(defn- stratum [context population-code [value result]] +(defn- stratum [context population-code [value handles]] (-> (u/population context :fhir.MeasureReport.group.stratifier.stratum/population - population-code result) + population-code handles) (update :result stratum* value))) (defn- stratifier* [strata code] (cond-> {:fhir/type :fhir.MeasureReport.group/stratifier - :stratum (sort-by (comp type/value :text :value) strata)} + :stratum (vec (sort-by (comp type/value :text :value) strata))} code (assoc :code [code]))) @@ -45,28 +45,21 @@ (format "Measure.group[%d].stratifier[%d]" group-idx stratifier-idx)) -(defn- calc-strata - [{:keys [subject-handle] :as context} population-expression-name - stratum-expression-name] - (if subject-handle - (cql/calc-individual-strata context subject-handle - population-expression-name - stratum-expression-name) - (cql/calc-strata context population-expression-name - stratum-expression-name))) +(defn- calc-strata [{:keys [population-basis] :as context} name handles] + (if (= :boolean (or population-basis :boolean)) + (cql/calc-strata context name handles) + (cql/calc-function-strata context name handles))) -(defn- evaluate-single-stratifier - {:arglists '([context populations stratifier])} - [{:keys [group-idx stratifier-idx] :as context} populations +(defn- evaluate-stratifier + {:arglists '([context evaluated-populations stratifier])} + [{:keys [group-idx stratifier-idx] :as context} evaluated-populations {:keys [code criteria]}] - (when-ok [expression (u/expression #(stratifier-path group-idx stratifier-idx) - criteria) - strata (calc-strata - context - (-> populations first :criteria :expression) - expression)] - (stratifier context code (-> populations first :code) strata))) + (when-ok [name (u/expression #(stratifier-path group-idx stratifier-idx) + criteria) + strata (calc-strata context name + (-> evaluated-populations :handles first))] + (stratifier context code (-> evaluated-populations :result first :code) strata))) (defn- stratifier-component-path [{:keys [group-idx stratifier-idx component-idx]}] @@ -132,7 +125,7 @@ (defn- multi-component-stratifier* [strata codes] {:fhir/type :fhir.MeasureReport.group/stratifier :code codes - :stratum (sort-by (comp #(mapv (comp type/value :text :value) %) :component) strata)}) + :stratum (vec (sort-by (comp #(mapv (comp type/value :text :value) %) :component) strata))}) (defn- multi-component-stratifier @@ -148,20 +141,20 @@ (defn- evaluate-multi-component-stratifier - [context populations {:keys [component]}] - (when-ok [results (extract-stratifier-components context component)] - (let [{:keys [codes expression-names]} results] - (when-ok [strata (cql/calc-multi-component-strata - context - (-> populations first :criteria :expression) - expression-names)] - (multi-component-stratifier context codes (-> populations first :code) - strata))))) + [context evaluated-populations {:keys [component]}] + (when-ok [{:keys [codes expression-names]} (extract-stratifier-components context component) + strata (cql/calc-multi-component-strata + context + expression-names + (-> evaluated-populations :handles first))] + (multi-component-stratifier context codes + (-> evaluated-populations :result first :code) + strata))) (defn evaluate - {:arglists '([context populations stratifier])} - [context populations {:keys [component] :as stratifier}] + {:arglists '([context evaluated-populations stratifier])} + [context evaluated-populations {:keys [component] :as stratifier}] (if (seq component) - (evaluate-multi-component-stratifier context populations stratifier) - (evaluate-single-stratifier context populations stratifier))) + (evaluate-multi-component-stratifier context evaluated-populations stratifier) + (evaluate-stratifier context evaluated-populations stratifier))) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/util.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/util.clj index 65ab093ea..a9e479abd 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/util.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/util.clj @@ -1,6 +1,7 @@ (ns blaze.fhir.operation.evaluate-measure.measure.util (:require [blaze.anomaly :as ba] + [blaze.db.impl.index.resource-handle :as rh] [blaze.fhir.spec.type :as type])) @@ -30,7 +31,15 @@ expression))) -(defn- population-tx-ops [{:keys [subject-type]} list-id result] +(defn- list-reference [list-id] + (type/map->Reference {:reference (str "List/" list-id)})) + + +(defn- resource-handle-reference [resource-handle] + (type/map->Reference {:reference (rh/reference resource-handle)})) + + +(defn- population-tx-ops [list-id handles] [[:create {:fhir/type :fhir/List :id list-id @@ -38,28 +47,19 @@ :mode #fhir/code"working" :entry (mapv - (fn [subject-id] + (fn [{:keys [population-handle]}] {:fhir/type :fhir.List/entry - :item - (type/map->Reference {:reference (str subject-type "/" subject-id)})}) - result)}]]) + :item (resource-handle-reference population-handle)}) + handles)}]]) -(defn population [{:keys [luids] :as context} fhir-type code result] +(defn population [{:keys [luids] :as context} fhir-type code handles] (case (:report-type context) - "population" - {:result - (cond-> - {:fhir/type fhir-type - :count (int result)} - code - (assoc :code code)) - :luids luids} - "subject" + ("population" "subject") {:result (cond-> {:fhir/type fhir-type - :count (if result (int 1) (int 0))} + :count (count handles)} code (assoc :code code)) :luids luids} @@ -68,22 +68,25 @@ {:result (cond-> {:fhir/type fhir-type - :count (count result) - :subjectResults - (type/map->Reference {:reference (str "List/" list-id)})} + :count (count handles) + :subjectResults (list-reference list-id)} code (assoc :code code)) :luids (next luids) - :tx-ops (population-tx-ops context list-id result)}))) + :tx-ops (population-tx-ops list-id handles)}))) (defn- merge-result* "Merges `result` into the return value of the reduction `ret`." {:arglists '([ret result])} - [ret {:keys [result luids tx-ops]}] - (-> (update ret :result conj result) - (assoc :luids luids) - (update :tx-ops into tx-ops))) + [ret {:keys [result handles luids tx-ops]}] + (cond-> (update ret :result conj result) + (seq handles) + (update :handles conj handles) + luids + (assoc :luids luids) + (seq tx-ops) + (update :tx-ops into tx-ops))) (defn merge-result diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/middleware/params.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/middleware/params.clj index 8d40f9120..f5646443d 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/middleware/params.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/middleware/params.clj @@ -2,6 +2,7 @@ (:require [blaze.anomaly :as ba :refer [if-ok when-ok]] [blaze.async.comp :as ac] + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] [blaze.fhir.operation.evaluate-measure.measure.spec] [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type :as type] @@ -54,7 +55,7 @@ (defn- coerce-report-type [_ value] - (if-not (s/valid? :blaze.fhir.operation.evaluate-measure/report-type value) + (if-not (s/valid? ::measure/report-type value) (ba/incorrect (invalid-report-type-param-msg value) :fhir/issue "value") (type/code value))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj index a6471fc17..fd31cf2c8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj @@ -1,9 +1,12 @@ (ns blaze.fhir.operation.evaluate-measure.cql-spec (:require [blaze.db.spec] + [blaze.elm.compiler :as-alias compiler] [blaze.elm.compiler.library-spec] [blaze.elm.expression-spec] [blaze.fhir.operation.evaluate-measure.cql :as cql] + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] + [blaze.fhir.operation.evaluate-measure.measure.spec] [blaze.fhir.spec] [clojure.spec.alpha :as s] [cognitect.anomalies :as anom] @@ -14,31 +17,22 @@ time/offset-date-time?) -(s/def ::library - :life/compiled-library) - - -(s/def ::subject-type - :fhir.resource/type) - - (s/def ::parameters (s/map-of string? any?)) (s/def ::context - (s/keys :req-un [:blaze.db/db ::now ::library ::subject-type - :blaze.fhir.operation.evaluate-measure/report-type])) + (s/keys :req-un [:blaze.db/db ::now ::compiler/expression-defs])) (s/def ::individual-context - (s/keys :req-un [:blaze.db/db ::now ::library] :opt-un [::parameters])) + (s/keys :req-un [:blaze.db/db ::now ::compiler/expression-defs] :opt-un [::parameters])) (s/fdef cql/evaluate-expression - :args (s/cat :context ::context :name string?) - :ret (s/or :count nat-int? - :subject-ids (s/coll-of :blaze.resource/id) + :args (s/cat :context ::context :name string? :subject-type :fhir.resource/type + :population-basis (s/alt :subject-based #{:boolean} :other :fhir.resource/type)) + :ret (s/or :handles ::measure/handles :anomaly ::anom/anomaly)) @@ -46,31 +40,29 @@ :args (s/cat :context ::individual-context :subject-handle :blaze.db/resource-handle :name string?) - :ret (s/or :result boolean? :anomaly ::anom/anomaly)) + :ret (s/or :value any? + :anomaly ::anom/anomaly)) (s/fdef cql/calc-strata :args (s/cat :context ::context - :population-expression-name string? - :stratum-expression-name string?) - :ret (s/or :strata (s/map-of any? nat-int?) - :subject-strata (s/map-of any? (s/coll-of :blaze.resource/id)) + :expression-name string? + :handles ::measure/handles) + :ret (s/or :strata (s/map-of any? ::measure/handles) :anomaly ::anom/anomaly)) -(s/fdef cql/calc-individual-strata - :args (s/cat :context ::individual-context - :subject-handle :blaze.db/resource-handle - :population-expression-name string? - :stratum-expression-name string?) - :ret (s/or :strata (s/map-of any? nat-int?) +(s/fdef cql/calc-function-strata + :args (s/cat :context ::context + :function-name string? + :handles ::measure/handles) + :ret (s/or :strata (s/map-of any? ::measure/handles) :anomaly ::anom/anomaly)) (s/fdef cql/calc-multi-component-strata :args (s/cat :context ::context - :population-expression-name string? - :expression-names (s/coll-of string?)) - :ret (s/or :strata (s/map-of (s/coll-of some?) nat-int?) - :subject-strata (s/map-of (s/coll-of some?) (s/coll-of :blaze.resource/id)) + :expression-names (s/coll-of string?) + :handles ::measure/handles) + :ret (s/or :strata (s/map-of (s/coll-of any?) ::measure/handles) :anomaly ::anom/anomaly)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index edd8b1ed6..104c2224b 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -10,8 +10,10 @@ [blaze.elm.expression :as expr] [blaze.fhir.operation.evaluate-measure.cql :as cql] [blaze.fhir.operation.evaluate-measure.cql-spec] + [blaze.fhir.spec :as fhir-spec] + [blaze.fhir.spec.type] [blaze.fhir.spec.type.system :as system] - [clojure.spec.alpha :as s] + [blaze.test-util :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -39,7 +41,13 @@ (OffsetDateTime/now ^Clock clock)) -(def cql-gender +(def library-empty + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0'") + + +(def library-gender "library Retrieve using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' @@ -47,10 +55,13 @@ context Patient define InInitialPopulation: - Patient.gender = 'male'") + Patient.gender = 'male' + + define Gender: + Patient.gender") -(def cql-error +(def library-error "library Retrieve using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' @@ -63,6 +74,28 @@ Year2022 - 2022 'years'") +(def library-encounter + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define InInitialPopulation: + [Encounter]") + + +(def library-encounter-status + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define function Status(encounter Encounter): + encounter.status") + + (defn- compile-library [node cql] (when-ok [library (cql-translator/translate cql)] (library/compile-library node library {}))) @@ -72,67 +105,135 @@ (fn [_ _ _] (throw (Exception. ^String msg)))) +(defn- context [{:blaze.db/keys [node] :blaze.test/keys [clock]} library] + (let [{:keys [expression-defs function-defs]} (compile-library node library)] + {:db (d/db node) + :now (now clock) + :expression-defs expression-defs + :function-defs function-defs})) + + (deftest evaluate-expression-test - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] - [[[:put {:fhir/type :fhir/Patient :id "0"}] - [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] - [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}]]] - (let [context {:db (d/db node) - :now (now clock) - :library (compile-library node cql-gender) - :subject-type "Patient" - :report-type "population"}] - (is (= 1 (cql/evaluate-expression context "InInitialPopulation"))))) + (testing "finds the male patient" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] + [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}]]] + + (let [context (context system library-gender)] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) + [0 :population-handle fhir-spec/fhir-type] := :fhir/Patient + [0 :population-handle :id] := "1" + [0 :subject-handle fhir-spec/fhir-type] := :fhir/Patient + [0 :subject-handle :id] := "1" + count := 1)))) + + (testing "returns all encounters" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Encounter :id "0-0" :subject #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Patient :id "1"}] + [:put {:fhir/type :fhir/Encounter :id "1-0" :subject #fhir/Reference{:reference "Patient/1"}}] + [:put {:fhir/type :fhir/Encounter :id "1-1" :subject #fhir/Reference{:reference "Patient/1"}}] + [:put {:fhir/type :fhir/Patient :id "2"}]]] + + (let [context (context system library-encounter)] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" "Encounter") + [0 :population-handle fhir-spec/fhir-type] := :fhir/Encounter + [0 :population-handle :id] := "0-0" + [0 :subject-handle fhir-spec/fhir-type] := :fhir/Patient + [0 :subject-handle :id] := "0" + [1 :population-handle fhir-spec/fhir-type] := :fhir/Encounter + [1 :population-handle :id] := "1-0" + [1 :subject-handle fhir-spec/fhir-type] := :fhir/Patient + [1 :subject-handle :id] := "1" + [2 :population-handle fhir-spec/fhir-type] := :fhir/Encounter + [2 :population-handle :id] := "1-1" + [2 :subject-handle fhir-spec/fhir-type] := :fhir/Patient + [2 :subject-handle :id] := "1" + count := 3)))) + + (testing "missing expression" + (with-system [system mem-node-system] + (let [context (context system library-empty)] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `InInitialPopulation`." + :expression-name := "InInitialPopulation")))) + + (testing "expression context doesn't match the subject type" + (with-system [system mem-node-system] + (let [context (context system library-gender)] + (given (cql/evaluate-expression context "InInitialPopulation" "Encounter" :boolean) + ::anom/category := ::anom/incorrect + ::anom/message := "The context `Patient` of the expression `InInitialPopulation` differs from the subject type `Encounter`." + :expression-name := "InInitialPopulation" + :subject-type := "Encounter" + :expression-context := "Patient")))) + + (testing "population basis doesn't match the expression return type" + (testing "boolean" + (with-system [system mem-node-system] + (let [context (context system library-encounter)] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) + ::anom/category := ::anom/incorrect + ::anom/message := "The result type `List` of the expression `InInitialPopulation` differs from the population basis :boolean." + :expression-name := "InInitialPopulation" + :population-basis := :boolean + :expression-result-type := "List")))) + + (testing "Encounter" + (with-system [system mem-node-system] + (let [context (context system library-gender)] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" "Encounter") + ::anom/category := ::anom/incorrect + ::anom/message := "The result type `Boolean` of the expression `InInitialPopulation` differs from the population basis `Encounter`." + :expression-name := "InInitialPopulation" + :population-basis := "Encounter" + :expression-result-type := "Boolean"))))) (testing "failing eval" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] - (let [context {:db (d/db node) - :now (now clock) - :library (compile-library node cql-gender) - :subject-type "Patient" - :report-type "population"}] + + (let [context (context system library-gender)] (with-redefs [expr/eval (failing-eval "msg-222453")] - (given (cql/evaluate-expression context "InInitialPopulation") + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) ::anom/category := ::anom/fault ::anom/message := "Error while evaluating the expression `InInitialPopulation`: msg-222453")))))) (deftest evaluate-individual-expression-test (testing "match" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"}]]] - (let [db (d/db node) - patient (d/resource-handle db "Patient" "0") - context {:db db - :now (now clock) - :library (compile-library node cql-gender)}] + (let [{:keys [db] :as context} (context system library-gender) + patient (d/resource-handle db "Patient" "0")] (is (true? (cql/evaluate-individual-expression context patient "InInitialPopulation")))))) (testing "no match" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] - (let [db (d/db node) - patient (d/resource-handle db "Patient" "0") - context {:db db - :now (now clock) - :library (compile-library node cql-gender)}] + (let [{:keys [db] :as context} (context system library-gender) + patient (d/resource-handle db "Patient" "0")] (is (false? (cql/evaluate-individual-expression context patient "InInitialPopulation")))))) + (testing "missing expression" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [{:keys [db] :as context} (context system library-empty) + patient (d/resource-handle db "Patient" "0")] + (given (cql/evaluate-individual-expression context patient "InInitialPopulation") + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `InInitialPopulation`." + :expression-name := "InInitialPopulation")))) + (testing "error" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] - (let [db (d/db node) - patient (d/resource-handle db "Patient" "0") - context {:db db - :now (now clock) - :library (compile-library node cql-error) - :parameters {"Year2022" (system/date 2022)}}] + (let [{:keys [db] :as context} (assoc (context system library-error) + :parameters {"Year2022" (system/date 2022)}) + patient (d/resource-handle db "Patient" "0")] (given (cql/evaluate-individual-expression context patient "InInitialPopulation") ::anom/category := ::anom/fault ::anom/message := "Error while evaluating the expression `InInitialPopulation`: Year 0 out of range while subtracting the period Period[month = 24264, millis = 0] from the year 2022." @@ -147,48 +248,122 @@ (fn [_ _ _] ["1" "2"])) +(defn- handle [subject-handle] + {:population-handle subject-handle :subject-handle subject-handle}) + + (deftest calc-strata-test + (testing "missing expression" + (with-system [system mem-node-system] + (let [context (context system library-empty)] + (given (cql/calc-strata context "Gender" []) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `Gender`." + :expression-name := "Gender")))) + (testing "failing eval" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] - (let [context {:db (d/db node) - :now (now clock) - :library (compile-library node cql-gender) - :subject-type "Patient" - :report-type "population"}] + (let [{:keys [db] :as context} (context system library-gender)] (with-redefs [expr/eval (failing-eval "msg-221825")] - (given (cql/calc-strata context "" "") + (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) ::anom/category := ::anom/fault - ::anom/message := "Error while evaluating the expression ``: msg-221825"))))) + ::anom/message := "Error while evaluating the expression `Gender`: msg-221825"))))) (testing "multiple values" - (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock]} - mem-node-system] + (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] - (let [context {:db (d/db node) - :now (now clock) - :library (compile-library node cql-gender) - :subject-type "Patient" - :report-type "population"}] + (let [{:keys [db] :as context} (context system library-gender)] (with-redefs [expr/eval two-value-eval] - (given (cql/calc-strata context "" "expr-133506") + (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) ::anom/category := ::anom/incorrect - ::anom/message := "CQL expression `expr-133506` returned more than one value for resource `Patient/0`.")))))) + ::anom/message := "CQL expression `Gender` returned more than one value for resource `Patient/0`."))))) + + (testing "gender" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] + [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}] + [:put {:fhir/type :fhir/Patient :id "3" :gender #fhir/code"male"}]]] + (let [{:keys [db] :as context} (context system library-gender)] + (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) + [#(get % nil) 0 :subject-handle :id] := "0" + [#(get % nil) 0 :population-handle :id] := "0" + [#(get % nil) count] := 1 + [#(get % #fhir/code"male") 0 :subject-handle :id] := "1" + [#(get % #fhir/code"male") 0 :population-handle :id] := "1" + [#(get % #fhir/code"male") 1 :subject-handle :id] := "3" + [#(get % #fhir/code"male") 1 :population-handle :id] := "3" + [#(get % #fhir/code"male") count] := 2 + [#(get % #fhir/code"female") 0 :subject-handle :id] := "2" + [#(get % #fhir/code"female") 0 :population-handle :id] := "2" + [#(get % #fhir/code"female") count] := 1))))) + + +(deftest calc-function-strata-test + (testing "Encounter status" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1"}] + [:put {:fhir/type :fhir/Patient :id "2"}] + [:put {:fhir/type :fhir/Encounter :id "0" + :subject #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Encounter :id "1" + :status #fhir/code"finished" + :subject #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Encounter :id "2" + :status #fhir/code"planned" + :subject #fhir/Reference{:reference "Patient/1"}}] + [:put {:fhir/type :fhir/Encounter :id "3" + :status #fhir/code"finished" + :subject #fhir/Reference{:reference "Patient/2"}}]]] + (let [{:keys [db] :as context} (context system library-encounter-status) + handles + [{:population-handle (d/resource-handle db "Encounter" "0") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "1") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "2") + :subject-handle (d/resource-handle db "Patient" "1")} + {:population-handle (d/resource-handle db "Encounter" "3") + :subject-handle (d/resource-handle db "Patient" "2")}]] + (given (cql/calc-function-strata context "Status" handles) + [#(get % nil) 0 :population-handle :id] := "0" + [#(get % nil) 0 :subject-handle :id] := "0" + [#(get % nil) count] := 1 + [#(get % #fhir/code"finished") 0 :population-handle :id] := "1" + [#(get % #fhir/code"finished") 0 :subject-handle :id] := "0" + [#(get % #fhir/code"finished") 1 :population-handle :id] := "3" + [#(get % #fhir/code"finished") 1 :subject-handle :id] := "2" + [#(get % #fhir/code"finished") count] := 2 + [#(get % #fhir/code"planned") 0 :population-handle :id] := "2" + [#(get % #fhir/code"planned") 0 :subject-handle :id] := "1" + [#(get % #fhir/code"planned") count] := 1)))) + + (testing "missing function" + (with-system [system mem-node-system] + (let [context (context system library-empty)] + (given (cql/calc-function-strata context "Gender" []) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing function with name `Gender`." + :function-name := "Gender")))) + + (testing "failing eval" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [{:keys [db] :as context} (context system library-encounter-status)] + (with-redefs [expr/eval (failing-eval "msg-111807")] + (given (cql/calc-function-strata context "Status" (mapv handle (d/type-list db "Patient"))) + ::anom/category := ::anom/fault + ::anom/message := "Error while evaluating the expression `Status`: msg-111807")))))) -(deftest calc-individual-strata-test +(deftest calc-multi-component-strata-test (testing "failing eval" - (st/instrument - `cql/calc-individual-strata - {:spec - {`cql/calc-individual-strata - (s/fspec - :args (s/cat :context nil? - :subject-handle nil? - :population-expression-name nil? - :stratum-expression-name nil?))}}) - (with-redefs [expr/eval (failing-eval "msg-221154")] - (given (cql/calc-individual-strata nil nil nil nil) - ::anom/category := ::anom/fault - ::anom/message := "Error while evaluating the expression `null`: msg-221154")))) + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [{:keys [db] :as context} (context system library-gender)] + (with-redefs [expr/eval (failing-eval "msg-111557")] + (given (cql/calc-multi-component-strata context ["Gender"] (mapv handle (d/type-list db "Patient"))) + ::anom/category := ::anom/fault + ::anom/message := "Error while evaluating the expression `Gender`: msg-111557")))))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj new file mode 100644 index 000000000..2d321e948 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj @@ -0,0 +1,23 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.population-spec + (:require + [blaze.fhir.operation.evaluate-measure.cql-spec :as cql-spec] + [blaze.fhir.operation.evaluate-measure.measure.population :as population] + [blaze.fhir.spec.spec] + [clojure.spec.alpha :as s])) + + +(s/def ::subject-type + :fhir.resource/type) + + +(s/def ::subject-handle + :blaze.db/resource-handle) + + +(s/def ::context + (s/merge (s/keys :req-un [(or ::subject-type ::subject-handle)]) + ::cql-spec/context)) + + +(s/fdef population/evaluate + :args (s/cat :context ::context :idx nat-int? :population map?)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj new file mode 100644 index 000000000..048bad110 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj @@ -0,0 +1,25 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.stratifier-spec + (:require + [blaze.fhir.operation.evaluate-measure.cql-spec] + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] + [blaze.fhir.operation.evaluate-measure.measure.spec] + [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] + [blaze.fhir.operation.evaluate-measure.measure.util-spec] + [clojure.spec.alpha :as s])) + + +(s/def ::handles + (s/coll-of ::measure/handles)) + + +(s/def ::evaluated-populations + (s/keys :req-un [::handles])) + + +(s/def ::context + (s/keys :req-un [::measure/report-type])) + + +(s/fdef stratifier/evaluate + :args (s/cat :context ::context :evaluated-populations ::evaluated-populations + :stratifier map?)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj new file mode 100644 index 000000000..abc485ee6 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -0,0 +1,283 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.stratifier-test + (:require + [blaze.anomaly :refer [when-ok]] + [blaze.anomaly-spec] + [blaze.cql-translator :as cql-translator] + [blaze.db.api :as d] + [blaze.db.api-stub :refer [mem-node-system with-system-data]] + [blaze.elm.compiler.library :as library] + [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] + [blaze.fhir.operation.evaluate-measure.measure.stratifier-spec] + [blaze.fhir.spec.type :as type] + [clojure.spec.test.alpha :as st] + [clojure.test :as test :refer [deftest testing]] + [cognitect.anomalies :as anom] + [juxt.iota :refer [given]]) + (:import + [java.time Clock OffsetDateTime])) + + +(set! *warn-on-reflection* true) +(st/instrument) + + +(defn- fixture [f] + (st/instrument) + (f) + (st/unstrument)) + + +(test/use-fixtures :each fixture) + +(defn- now [clock] + (OffsetDateTime/now ^Clock clock)) + + +(defn- compile-library [node cql] + (when-ok [library (cql-translator/translate cql)] + (library/compile-library node library {}))) + + +(def empty-library + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient") + + +(def library-age-gender + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define Gender: + Patient.gender + + define Age: + AgeInYears()") + + +(def library-encounter-status-age + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define function Status(encounter Encounter): + encounter.status + + define function Age(encounter Encounter): + AgeInYearsAt(encounter.period.start)") + + +(defn- cql-expression [expr] + {:fhir/type :fhir/Expression + :language #fhir/code"text/cql-identifier" + :expression expr}) + + +(def gender-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :code #fhir/CodeableConcept{:text #fhir/string"gender"} + :criteria (cql-expression "Gender")}) + + +(def age-gender-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :component + [{:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"age"} + :criteria (cql-expression "Age")} + {:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"gender"} + :criteria (cql-expression "Gender")}]}) + + +(def status-age-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :component + [{:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"status"} + :criteria (cql-expression "Status")} + {:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"age"} + :criteria (cql-expression "Age")}]}) + + +(defn- context [{:blaze.db/keys [node] :blaze.test/keys [clock]} library] + (let [{:keys [expression-defs function-defs]} (compile-library node library)] + {:db (d/db node) + :now (now clock) + :expression-defs expression-defs + :function-defs function-defs})) + + +(defn- handle [subject-handle] + {:population-handle subject-handle :subject-handle subject-handle}) + + +(deftest evaluate + (testing "one component" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] + [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}] + [:put {:fhir/type :fhir/Patient :id "3" :gender #fhir/code"male"}]]] + (let [{:keys [db] :as context} (context system library-age-gender) + evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] + + (testing "report-type population" + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations gender-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text type/value] := "gender" + [:result :stratum 0 :value :text type/value] := "female" + [:result :stratum 0 :population 0 :count type/value] := 1 + [:result :stratum 1 :value :text type/value] := "male" + [:result :stratum 1 :population 0 :count type/value] := 2 + [:result :stratum 2 :value :text type/value] := "null" + [:result :stratum 2 :population 0 :count type/value] := 1)) + + (testing "report-type subject-list" + (given (stratifier/evaluate + (assoc context + :luids ["L0" "L1" "L2"] + :report-type "subject-list") + evaluated-populations gender-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text type/value] := "gender" + [:result :stratum 0 :value :text type/value] := "female" + [:result :stratum 0 :population 0 :count type/value] := 1 + [:result :stratum 0 :population 0 :subjectResults :reference] := "List/L2" + [:result :stratum 1 :value :text type/value] := "male" + [:result :stratum 1 :population 0 :count type/value] := 2 + [:result :stratum 1 :population 0 :subjectResults :reference] := "List/L1" + [:result :stratum 2 :value :text type/value] := "null" + [:result :stratum 2 :population 0 :count type/value] := 1 + [:result :stratum 2 :population 0 :subjectResults :reference] := "List/L0" + [:tx-ops 0 0] := :create + [:tx-ops 0 1 :fhir/type] := :fhir/List + [:tx-ops 0 1 :id] := "L0" + [:tx-ops 0 1 :entry 0 :item :reference] := "Patient/0" + [:tx-ops 1 1 :id] := "L1" + [:tx-ops 1 1 :entry 0 :item :reference] := "Patient/1" + [:tx-ops 1 1 :entry 1 :item :reference] := "Patient/3" + [:tx-ops 2 1 :id] := "L2" + [:tx-ops 2 1 :entry 0 :item :reference] := "Patient/2" + [:tx-ops count] := 3))))) + + (testing "two components" + (testing "subject-based measure" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" + :gender #fhir/code"male" + :birthDate #fhir/date"1960"}] + [:put {:fhir/type :fhir/Patient :id "2" + :gender #fhir/code"female" + :birthDate #fhir/date"1960"}] + [:put {:fhir/type :fhir/Patient :id "3" + :gender #fhir/code"male" + :birthDate #fhir/date"1950"}]]] + (let [{:keys [db] :as context} (context system library-age-gender) + evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] + + (testing "report-type population" + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations age-gender-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text type/value] := "age" + [:result :code 1 :text type/value] := "gender" + [:result :stratum 0 :component 0 :code :text type/value] := "age" + [:result :stratum 0 :component 0 :value :text type/value] := "10" + [:result :stratum 0 :component 1 :code :text type/value] := "gender" + [:result :stratum 0 :component 1 :value :text type/value] := "female" + [:result :stratum 0 :population 0 :count type/value] := 1 + [:result :stratum 1 :component 0 :value :text type/value] := "10" + [:result :stratum 1 :component 1 :value :text type/value] := "male" + [:result :stratum 1 :population 0 :count type/value] := 1 + [:result :stratum 2 :component 0 :value :text type/value] := "20" + [:result :stratum 2 :component 1 :value :text type/value] := "male" + [:result :stratum 2 :population 0 :count type/value] := 1 + [:result :stratum 3 :component 0 :value :text type/value] := "null" + [:result :stratum 3 :component 1 :value :text type/value] := "null" + [:result :stratum 3 :population 0 :count type/value] := 1))))) + + (testing "Encounter measure" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0" :birthDate #fhir/date"2000"}] + [:put {:fhir/type :fhir/Patient :id "1" :birthDate #fhir/date"2001"}] + [:put {:fhir/type :fhir/Patient :id "2" :birthDate #fhir/date"2003"}] + [:put {:fhir/type :fhir/Encounter :id "0" + :subject #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Encounter :id "1" + :status #fhir/code"finished" + :subject #fhir/Reference{:reference "Patient/0"} + :period #fhir/Period{:start #fhir/dateTime"2020"}}] + [:put {:fhir/type :fhir/Encounter :id "2" + :status #fhir/code"planned" + :subject #fhir/Reference{:reference "Patient/1"} + :period #fhir/Period{:start #fhir/dateTime"2021"}}] + [:put {:fhir/type :fhir/Encounter :id "3" + :status #fhir/code"finished" + :subject #fhir/Reference{:reference "Patient/2"} + :period #fhir/Period{:start #fhir/dateTime"2022"}}]]] + (let [{:keys [db] :as context} (context system library-encounter-status-age) + evaluated-populations + {:handles + [[{:population-handle (d/resource-handle db "Encounter" "0") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "1") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "2") + :subject-handle (d/resource-handle db "Patient" "1")} + {:population-handle (d/resource-handle db "Encounter" "3") + :subject-handle (d/resource-handle db "Patient" "2")}]]}] + + (testing "report-type population" + (given (stratifier/evaluate + (assoc context + :report-type "population" + :population-basis "Encounter") + evaluated-populations status-age-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text type/value] := "status" + [:result :code 1 :text type/value] := "age" + [:result :stratum 0 :component 0 :code :text type/value] := "status" + [:result :stratum 0 :component 0 :value :text type/value] := "finished" + [:result :stratum 0 :component 1 :code :text type/value] := "age" + [:result :stratum 0 :component 1 :value :text type/value] := "19" + [:result :stratum 0 :population 0 :count type/value] := 1 + [:result :stratum 1 :component 0 :value :text type/value] := "finished" + [:result :stratum 1 :component 1 :value :text type/value] := "20" + [:result :stratum 1 :population 0 :count type/value] := 1 + [:result :stratum 2 :component 0 :value :text type/value] := "null" + [:result :stratum 2 :component 1 :value :text type/value] := "null" + [:result :stratum 2 :population 0 :count type/value] := 1 + [:result :stratum 3 :component 0 :value :text type/value] := "planned" + [:result :stratum 3 :component 1 :value :text type/value] := "20" + [:result :stratum 3 :population 0 :count type/value] := 1))))) + + (testing "with unknown expression error" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" + :gender #fhir/code"male" + :birthDate #fhir/date"1960"}] + [:put {:fhir/type :fhir/Patient :id "2" + :gender #fhir/code"female" + :birthDate #fhir/date"1960"}] + [:put {:fhir/type :fhir/Patient :id "3" + :gender #fhir/code"male" + :birthDate #fhir/date"1950"}]]] + (let [{:keys [db] :as context} (context system empty-library) + evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations age-gender-stratifier) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `Age`." + :expression-name := "Age")))))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_spec.clj new file mode 100644 index 000000000..9938778d0 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_spec.clj @@ -0,0 +1,11 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.util-spec + (:require + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] + [blaze.fhir.operation.evaluate-measure.measure.spec] + [blaze.fhir.operation.evaluate-measure.measure.util :as u] + [clojure.spec.alpha :as s])) + + +(s/fdef u/population + :args (s/cat :context map? :fhir-type :fhir/type :code any? + :handles ::measure/handles)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj index 154cff554..36ea66da3 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj @@ -2,6 +2,7 @@ (:require [blaze.anomaly-spec] [blaze.fhir.operation.evaluate-measure.measure.util :as u] + [blaze.fhir.operation.evaluate-measure.measure.util-spec] [blaze.test-util :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_spec.clj index ec973f6eb..f048a0485 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_spec.clj @@ -27,9 +27,9 @@ (s/keys :req-un [::period - :blaze.fhir.operation.evaluate-measure/report-type] + ::measure/report-type] :opt-un - [:blaze.fhir.operation.evaluate-measure/subject-ref])) + [::measure/subject-ref])) (s/fdef measure/evaluate-measure diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index 9fb133734..e2cebb398 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -2,8 +2,11 @@ (:require [blaze.db.api :as d] [blaze.db.api-stub :refer [mem-node-system with-system-data]] - [blaze.fhir.operation.evaluate-measure.measure :refer [evaluate-measure]] + [blaze.fhir.operation.evaluate-measure.measure :as measure] [blaze.fhir.operation.evaluate-measure.measure-spec] + [blaze.fhir.operation.evaluate-measure.measure.population-spec] + [blaze.fhir.operation.evaluate-measure.measure.stratifier-spec] + [blaze.fhir.operation.evaluate-measure.measure.util-spec] [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type :as type] [blaze.log] @@ -16,6 +19,7 @@ [reitit.core :as reitit] [taoensso.timbre :as log]) (:import + [java.nio.charset StandardCharsets] [java.util Base64])) @@ -98,9 +102,9 @@ context {:clock clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} period [#system/date"2000" #system/date"2020"]] - (evaluate-measure context - @(d/pull node (d/resource-handle db "Measure" "0")) - {:period period :report-type report-type}))))) + (measure/evaluate-measure context + @(d/pull node (d/resource-handle db "Measure" "0")) + {:period period :report-type report-type}))))) (defn- first-population [result] @@ -136,18 +140,102 @@ :expression expr}) -(def library-content - #fhir/Attachment - {:contentType #fhir/code"text/cql" - :data #fhir/base64Binary"bGlicmFyeSBSZXRyaWV2ZQp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4wJwppbmNsdWRlIEZISVJIZWxwZXJzIHZlcnNpb24gJzQuMC4wJwoKY29udGV4dCBQYXRpZW50CgpkZWZpbmUgSW5Jbml0aWFsUG9wdWxhdGlvbjoKICB0cnVlCgpkZWZpbmUgR2VuZGVyOgogIFBhdGllbnQuZ2VuZGVyCg=="}) +(defn encode-base64 [^String s] + (-> (Base64/getEncoder) + (.encode (.getBytes s StandardCharsets/UTF_8)) + (String. StandardCharsets/UTF_8))) + + +(defn library-content [content] + (type/attachment {:contentType #fhir/code"text/cql" + :data (type/base64Binary (encode-base64 content))})) + + +(def library-gender + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define InInitialPopulation: + true + + define Gender: + Patient.gender") + + +(def library-encounter + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define InInitialPopulation: + [Encounter]") (deftest evaluate-measure-test + (testing "Encounter population basis" + (with-system-data + [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Encounter :id "0-0" :subject #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Patient :id "1"}] + [:put {:fhir/type :fhir/Encounter :id "1-0" :subject #fhir/Reference{:reference "Patient/1"}}] + [:put {:fhir/type :fhir/Encounter :id "1-1" :subject #fhir/Reference{:reference "Patient/1"}}] + [:put {:fhir/type :fhir/Patient :id "2"}]] + [[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" + :content [(library-content library-encounter)]}]]] + + (let [db (d/db node) + context {:clock clock :rng-fn fixed-rng-fn :db db + :blaze/base-url "" ::reitit/router router} + measure {:fhir/type :fhir/Measure :id "0" + :library [#fhir/canonical"0"] + :group + [{:fhir/type :fhir.Measure/group + :extension + [#fhir/Extension + {:url "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis" + :value #fhir/code"Encounter"}] + :population + [{:fhir/type :fhir.Measure.group/population + :code (population-concept "initial-population") + :criteria (cql-expression "InInitialPopulation")}]}]}] + + (testing "population report" + (let [params {:period [#system/date"2000" #system/date"2020"] + :report-type "population"}] + (given (:resource (measure/evaluate-measure context measure params)) + :fhir/type := :fhir/MeasureReport + [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" + [:group 0 :population 0 :count] := 3))) + + (testing "subject-list report" + (let [params {:period [#system/date"2000" #system/date"2020"] + :report-type "subject-list"} + {:keys [resource tx-ops]} (measure/evaluate-measure context measure params)] + + (given resource + :fhir/type := :fhir/MeasureReport + [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" + [:group 0 :population 0 :count] := 3 + [:group 0 :population 0 :subjectResults :reference] := "List/AAAAAAAAAAAAAAAA") + + (given tx-ops + [0 0] := :create + [0 1 :id] := "AAAAAAAAAAAAAAAA" + [0 1 :entry 0 :item :reference] := "Encounter/0-0" + [0 1 :entry 1 :item :reference] := "Encounter/1-0" + [0 1 :entry 2 :item :reference] := "Encounter/1-1")))))) + (testing "missing criteria" (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]]] + :content [(library-content library-gender)]}]]] (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db @@ -160,9 +248,9 @@ [{:fhir/type :fhir.Measure.group/population :code (population-concept "initial-population")}]}]} params {:period [#system/date"2000" #system/date"2020"] - :report-type "subject" + :report-type "population" :subject "Patient/0"}] - (given (evaluate-measure context measure params) + (given (measure/evaluate-measure context measure params) ::anom/category := ::anom/incorrect ::anom/message := "Missing criteria." :fhir/issue := "required" @@ -173,7 +261,7 @@ [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]]] + :content [(library-content library-gender)]}]]] (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db @@ -189,7 +277,7 @@ params {:period [#system/date"2000" #system/date"2020"] :report-type "subject" :subject-ref "0"}] - (given (:resource (evaluate-measure context measure params)) + (given (:resource (measure/evaluate-measure context measure params)) :fhir/type := :fhir/MeasureReport :status := #fhir/code"complete" :type := #fhir/code"individual" @@ -206,7 +294,7 @@ [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]]] + :content [(library-content library-gender)]}]]] (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db @@ -226,7 +314,7 @@ params {:period [#system/date"2000" #system/date"2020"] :report-type "subject" :subject-ref "0"}] - (given (:resource (evaluate-measure context measure params)) + (given (:resource (measure/evaluate-measure context measure params)) :fhir/type := :fhir/MeasureReport :status := #fhir/code"complete" :type := #fhir/code"individual" @@ -245,7 +333,7 @@ (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]]] + :content [(library-content library-gender)]}]]] (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db @@ -261,7 +349,7 @@ params {:period [#system/date"2000" #system/date"2020"] :report-type "subject" :subject-ref ["Observation" "0"]}] - (given (evaluate-measure context measure params) + (given (measure/evaluate-measure context measure params) ::anom/category := ::anom/incorrect ::anom/message := "Type mismatch between evaluation subject `Observation` and Measure subject `Patient`.")))) @@ -269,7 +357,7 @@ (with-system-data [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]]] + :content [(library-content library-gender)]}]]] (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db @@ -285,7 +373,7 @@ params {:period [#system/date"2000" #system/date"2020"] :report-type "subject" :subject-ref "0"}] - (given (evaluate-measure context measure params) + (given (measure/evaluate-measure context measure params) ::anom/category := ::anom/incorrect ::anom/message := "Subject with type `Patient` and id `0` was not found.")))) @@ -294,7 +382,7 @@ [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [library-content]}]] + :content [(library-content library-gender)]}]] [[:delete "Patient" "0"]]] (let [db (d/db node) @@ -311,7 +399,7 @@ params {:period [#system/date"2000" #system/date"2020"] :report-type "subject" :subject-ref "0"}] - (given (evaluate-measure context measure params) + (given (measure/evaluate-measure context measure params) ::anom/category := ::anom/incorrect ::anom/message := "Subject with type `Patient` and id `0` was not found.")))))) @@ -368,6 +456,8 @@ (given (first-stratifier-strata result) [0 :value :text type/value] := "10" + [0 :population 0 :code :coding 0 :system] := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" + [0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [0 :population 0 :count] := 1 [1 :value :text type/value] := "70" [1 :population 0 :count] := 2)) @@ -415,6 +505,8 @@ [0 :component 0 :value :text type/value] := "10" [0 :component 1 :code :text type/value] := "gender" [0 :component 1 :value :text type/value] := "male" + [0 :population 0 :code :coding 0 :system] := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" + [0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [0 :population 0 :count] := 1 [1 :component 0 :value :text type/value] := "70" [1 :component 1 :value :text type/value] := "female" @@ -432,6 +524,8 @@ [0 :component 0 :value :text type/value] := "10" [0 :component 1 :code :text type/value] := "gender" [0 :component 1 :value :text type/value] := "male" + [0 :population 0 :code :coding 0 :system] := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" + [0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [0 :population 0 :count] := 1 [0 :population 0 :subjectResults :reference] := "List/AAAAAAAAAAAAAAAB" [1 :component 0 :value :text type/value] := "70" @@ -479,9 +573,10 @@ [1 :value :text type/value] := "tissue" [1 :population 0 :count] := 1) - (given (first-stratifier-strata (evaluate "q30-stratifier-with-missing-expression")) - [0 :value :text type/value] := "null" - [0 :population 0 :count] := 2) + (given (evaluate "q30-stratifier-with-missing-expression") + ::anom/category := ::anom/incorrect, + ::anom/message := "Missing expression with name `SampleMaterialTypeCategory`.", + :expression-name := "SampleMaterialTypeCategory") (given (first-stratifier-strata (evaluate "q31-stratifier-storage-temperature")) [0 :value :text type/value] := "temperature2to10" @@ -493,10 +588,31 @@ [0 :value :text type/value] := "false" [0 :population 0 :count] := 2 [1 :value :text type/value] := "true" - [1 :population 0 :count] := 1)) + [1 :population 0 :count] := 1) + + (given (first-stratifier-strata (evaluate "q40-specimen-stratifier")) + [0 :value :text type/value] := "blood-plasma" + [0 :population 0 :count] := 4 + [1 :value :text type/value] := "peripheral-blood-cells-vital" + [1 :population 0 :count] := 3) + + (given (first-stratifier-strata (evaluate "q41-specimen-multi-stratifier")) + [0 :component 0 :code :coding 0 :code type/value] := "sample-diagnosis" + [0 :component 0 :value :text type/value] := "C34.9" + [0 :component 1 :code :coding 0 :code type/value] := "sample-type" + [0 :component 1 :value :text type/value] := "blood-plasma" + [0 :population 0 :count] := 2 + [1 :component 0 :value :text type/value] := "C34.9" + [1 :component 1 :value :text type/value] := "peripheral-blood-cells-vital" + [1 :population 0 :count] := 1 + [2 :component 0 :value :text type/value] := "C50.9" + [2 :component 1 :value :text type/value] := "blood-plasma" + [2 :population 0 :count] := 2 + [3 :component 0 :value :text type/value] := "C50.9" + [3 :component 1 :value :text type/value] := "peripheral-blood-cells-vital" + [3 :population 0 :count] := 2)) (comment (log/set-level! :debug) - (evaluate "q38-di-surv") - (evaluate "q39-social-sec-num") + (evaluate "q41-specimen-multi-stratifier") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json new file mode 100644 index 000000000..b12ee82be --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json @@ -0,0 +1,354 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "fullUrl": "Patient/1", + "request": { + "method": "PUT", + "url": "Patient/1" + }, + "resource": { + "resourceType": "Patient", + "id": "1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + }, + "gender": "male", + "birthDate": "1989-11-18" + } + }, + { + "fullUrl": "Specimen/1-1", + "request": { + "method": "PUT", + "url": "Specimen/1-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/1-2", + "request": { + "method": "PUT", + "url": "Specimen/1-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/1-3", + "request": { + "method": "PUT", + "url": "Specimen/1-3" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-3", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Patient/2", + "request": { + "method": "PUT", + "url": "Patient/2" + }, + "resource": { + "resourceType": "Patient", + "id": "2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + } + } + }, + { + "fullUrl": "Specimen/2-1", + "request": { + "method": "PUT", + "url": "Specimen/2-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "2-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/2" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/2-2", + "request": { + "method": "PUT", + "url": "Specimen/2-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "2-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/2" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Patient/3", + "request": { + "method": "PUT", + "url": "Patient/3" + }, + "resource": { + "resourceType": "Patient", + "id": "3", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + } + } + }, + { + "fullUrl": "Specimen/3-1", + "request": { + "method": "PUT", + "url": "Specimen/3-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "3-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/3" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/3-2", + "request": { + "method": "PUT", + "url": "Specimen/3-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "3-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/3" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Specimen" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql", + "expression": "InInitialPopulation" + } + } + ], + "stratifier": [ + { + "code": { + "coding": [ + { + "system": "https://dktk.dkfz.de/fhir/CodeSystem/exliquid-stratifier", + "code": "sample-type" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "SampleType" + } + } + + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql new file mode 100644 index 000000000..d7d6ca049 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql @@ -0,0 +1,11 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + [Specimen] + +define function SampleType(specimen FHIR.Specimen): + specimen.type.coding.where(system = 'https://fhir.bbmri.de/CodeSystem/SampleMaterialType').code.first() diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json new file mode 100644 index 000000000..390d560e6 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json @@ -0,0 +1,452 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "fullUrl": "Patient/1", + "request": { + "method": "PUT", + "url": "Patient/1" + }, + "resource": { + "resourceType": "Patient", + "id": "1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + }, + "gender": "male", + "birthDate": "1989-11-18" + } + }, + { + "fullUrl": "Condition/1-1", + "request": { + "method": "PUT", + "url": "Condition/1-1" + }, + "resource": { + "id": "1-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "resourceType": "Condition", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "code": "C34.9" + } + ] + }, + "subject": { + "reference": "Patient/1" + } + } + }, + { + "fullUrl": "Specimen/1-1", + "request": { + "method": "PUT", + "url": "Specimen/1-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/1-2", + "request": { + "method": "PUT", + "url": "Specimen/1-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/1-3", + "request": { + "method": "PUT", + "url": "Specimen/1-3" + }, + "resource": { + "resourceType": "Specimen", + "id": "1-3", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/1" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Patient/2", + "request": { + "method": "PUT", + "url": "Patient/2" + }, + "resource": { + "resourceType": "Patient", + "id": "2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + } + } + }, + { + "fullUrl": "Condition/2-1", + "request": { + "method": "PUT", + "url": "Condition/2-1" + }, + "resource": { + "id": "2-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "resourceType": "Condition", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "code": "C50.9" + } + ] + }, + "subject": { + "reference": "Patient/2" + } + } + }, + { + "fullUrl": "Specimen/2-1", + "request": { + "method": "PUT", + "url": "Specimen/2-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "2-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/2" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/2-2", + "request": { + "method": "PUT", + "url": "Specimen/2-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "2-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/2" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Patient/3", + "request": { + "method": "PUT", + "url": "Patient/3" + }, + "resource": { + "resourceType": "Patient", + "id": "3", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Patient" + ] + } + } + }, + { + "fullUrl": "Condition/3-1", + "request": { + "method": "PUT", + "url": "Condition/3-1" + }, + "resource": { + "resourceType": "Condition", + "id": "3-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/icd-10-gm", + "code": "C50.9" + } + ] + }, + "subject": { + "reference": "Patient/3" + } + } + }, + { + "fullUrl": "Specimen/3-1", + "request": { + "method": "PUT", + "url": "Specimen/3-1" + }, + "resource": { + "resourceType": "Specimen", + "id": "3-1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/3" + }, + "type": { + "coding": [ + { + "code": "blood-plasma", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "fullUrl": "Specimen/3-2", + "request": { + "method": "PUT", + "url": "Specimen/3-2" + }, + "resource": { + "resourceType": "Specimen", + "id": "3-2", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Specimen" + ] + }, + "identifier": [ + { + "system": "https://dktk.dkfz.de/fhir/NamingSystem/exliquid-specimen" + } + ], + "subject": { + "reference": "Patient/3" + }, + "type": { + "coding": [ + { + "code": "peripheral-blood-cells-vital", + "system": "https://fhir.bbmri.de/CodeSystem/SampleMaterialType" + } + ] + } + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "extension": [ + { + "url": "http://hl7.org/fhir/us/cqfmeasures/StructureDefinition/cqfm-populationBasis", + "valueCode": "Specimen" + } + ], + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql", + "expression": "InInitialPopulation" + } + } + ], + "stratifier": [ + { + "component": [ + { + "code": { + "coding": [ + { + "system": "https://dktk.dkfz.de/fhir/CodeSystem/exliquid-stratifier", + "code": "sample-diagnosis" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "Diagnosis" + } + }, + { + "code": { + "coding": [ + { + "system": "https://dktk.dkfz.de/fhir/CodeSystem/exliquid-stratifier", + "code": "sample-type" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "SampleType" + } + } + ] + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql new file mode 100644 index 000000000..5f260e919 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql @@ -0,0 +1,15 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + [Specimen] + +define function SampleType(specimen FHIR.Specimen): + specimen.type.coding.where(system = 'https://fhir.bbmri.de/CodeSystem/SampleMaterialType').code.first() + +define Diagnosis: + First(from [Condition] C + return C.code.coding.where(system = 'http://fhir.de/CodeSystem/dimdi/icd-10-gm').code.first()) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index ff538afe0..d7b2ddf83 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -38,6 +38,10 @@ (def ^:private base-url "base-url-144638") +(def ^:private measure-population-uri + #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population") + + (def router (reitit/router [["/MeasureReport" {:name :MeasureReport/type}]] @@ -56,7 +60,7 @@ (type/codeable-concept {:coding [(type/coding - {:system #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" + {:system measure-population-uri :code (type/code code)})]})) @@ -409,10 +413,8 @@ :date := #fhir/dateTime"1970-01-01T00:00:00Z" [:period :start] := #fhir/dateTime"2014" [:period :end] := #fhir/dateTime"2015" - [:group 0 :population 0 :code :coding 0 :system] - := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" - [:group 0 :population 0 :code :coding 0 :code] - := #fhir/code"initial-population" + [:group 0 :population 0 :code :coding 0 :system] := measure-population-uri + [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [:group 0 :population 0 :count] := 1)))) (testing "cohort scoring with stratifiers" @@ -467,22 +469,16 @@ :date := #fhir/dateTime"1970-01-01T00:00:00Z" [:period :start] := #fhir/dateTime"2014" [:period :end] := #fhir/dateTime"2015" - [:group 0 :population 0 :code :coding 0 :system] - := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" - [:group 0 :population 0 :code :coding 0 :code] - := #fhir/code"initial-population" + [:group 0 :population 0 :code :coding 0 :system] := measure-population-uri + [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [:group 0 :population 0 :count] := 3 [:group 0 :stratifier 0 :code 0 :text] := #fhir/string"gender" - [:group 0 :stratifier 0 :stratum 0 :population 0 :code :coding 0 :system] - := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" - [:group 0 :stratifier 0 :stratum 0 :population 0 :code :coding 0 :code] - := #fhir/code"initial-population" + [:group 0 :stratifier 0 :stratum 0 :population 0 :code :coding 0 :system] := measure-population-uri + [:group 0 :stratifier 0 :stratum 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [:group 0 :stratifier 0 :stratum 0 :population 0 :count] := 2 [:group 0 :stratifier 0 :stratum 0 :value :text] := #fhir/string"female" - [:group 0 :stratifier 0 :stratum 1 :population 0 :code :coding 0 :system] - := #fhir/uri"http://terminology.hl7.org/CodeSystem/measure-population" - [:group 0 :stratifier 0 :stratum 1 :population 0 :code :coding 0 :code] - := #fhir/code"initial-population" + [:group 0 :stratifier 0 :stratum 1 :population 0 :code :coding 0 :system] := measure-population-uri + [:group 0 :stratifier 0 :stratum 1 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" [:group 0 :stratifier 0 :stratum 1 :population 0 :count] := 1 [:group 0 :stratifier 0 :stratum 1 :value :text] := #fhir/string"male"))))) From f1df40cec2a35d125f3dfd7afb2c9cef25a0c603 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 2 Aug 2022 10:50:58 +0200 Subject: [PATCH 025/124] Update Dependencies --- deps.edn | 4 ++-- modules/anomaly/deps.edn | 2 +- modules/async/deps.edn | 2 +- modules/byte-buffer/deps.edn | 4 ++-- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/coll/deps.edn | 2 +- modules/cql/deps.edn | 2 +- modules/db-resource-store-cassandra/deps.edn | 2 +- modules/db-resource-store/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 4 ++-- modules/db-tx-log/deps.edn | 2 +- modules/db/deps.edn | 2 +- modules/executor/deps.edn | 2 +- modules/extern-terminology-service/deps.edn | 2 +- modules/fhir-client/deps.edn | 2 +- modules/fhir-path/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 2 +- modules/interaction/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/kv/deps.edn | 2 +- modules/luid/deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/openid-auth/deps.edn | 2 +- modules/operation-measure-evaluate-measure/deps.edn | 2 +- modules/page-store-cassandra/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- modules/rest-api/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- modules/rocksdb/deps.edn | 4 ++-- modules/scheduler/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/thread-pool-executor-collector/deps.edn | 2 +- 34 files changed, 38 insertions(+), 38 deletions(-) diff --git a/deps.edn b/deps.edn index 55ac43efa..5f2415af5 100644 --- a/deps.edn +++ b/deps.edn @@ -66,7 +66,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "1.9.863"} + {:mvn/version "1.9.874"} org.slf4j/slf4j-nop {:mvn/version "1.7.36"}} diff --git a/modules/anomaly/deps.edn b/modules/anomaly/deps.edn index 8f82afc7b..a5c77d200 100644 --- a/modules/anomaly/deps.edn +++ b/modules/anomaly/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/async/deps.edn b/modules/async/deps.edn index 38526a4b4..7b33db4bf 100644 --- a/modules/async/deps.edn +++ b/modules/async/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index fb6cc90de..cfd34e3db 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.2"}} + {:mvn/version "3.21.4"}} :aliases {:test @@ -13,6 +13,6 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]}}} diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index c4bb26b0b..3599c6aac 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.2"} + {:mvn/version "3.21.4"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.13.3"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index d50769d82..5b696bfa7 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index 888290546..392e3250e 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -8,7 +8,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index f84439fde..6fefb0ce7 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -42,7 +42,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store-cassandra/deps.edn b/modules/db-resource-store-cassandra/deps.edn index ca9b31be2..f32ae8aa1 100644 --- a/modules/db-resource-store-cassandra/deps.edn +++ b/modules/db-resource-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store/deps.edn b/modules/db-resource-store/deps.edn index 8c61e481d..789fc434c 100644 --- a/modules/db-resource-store/deps.edn +++ b/modules/db-resource-store/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index ecb5ffc9e..989004703 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.2.0"}} + {:mvn/version "3.2.1"}} :aliases {:test @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index f308ab978..40c8c0f64 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db/deps.edn b/modules/db/deps.edn index a6215312c..20e57ae04 100644 --- a/modules/db/deps.edn +++ b/modules/db/deps.edn @@ -52,7 +52,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index 21db138ba..1784baf77 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -9,7 +9,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/extern-terminology-service/deps.edn b/modules/extern-terminology-service/deps.edn index 44207fa02..82e3dd52f 100644 --- a/modules/extern-terminology-service/deps.edn +++ b/modules/extern-terminology-service/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index de1227643..8a8549cc5 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -31,7 +31,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index d587785be..42cd9d7f6 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index b64d3a836..a521bb1fc 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -49,7 +49,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 2ced4be5f..d3d54f3dd 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/interaction/deps.edn b/modules/interaction/deps.edn index 40ae0796f..f5f0d76f9 100644 --- a/modules/interaction/deps.edn +++ b/modules/interaction/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 1fb7ec0d0..4d6f00ded 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -12,7 +12,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/kv/deps.edn b/modules/kv/deps.edn index e4cf0b647..2471350c4 100644 --- a/modules/kv/deps.edn +++ b/modules/kv/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index 6c8460e85..4fbd19edb 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 67a6f50b8..5e7ad87cb 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/openid-auth/deps.edn b/modules/openid-auth/deps.edn index 5d9deefc4..c65dcf943 100644 --- a/modules/openid-auth/deps.edn +++ b/modules/openid-auth/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/operation-measure-evaluate-measure/deps.edn b/modules/operation-measure-evaluate-measure/deps.edn index fa8bba9da..cd80c40ce 100644 --- a/modules/operation-measure-evaluate-measure/deps.edn +++ b/modules/operation-measure-evaluate-measure/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store-cassandra/deps.edn b/modules/page-store-cassandra/deps.edn index 036c5b106..544553feb 100644 --- a/modules/page-store-cassandra/deps.edn +++ b/modules/page-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index c0ea62c82..5e5dc8855 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 5ba8149d5..101f860fc 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -33,7 +33,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index b4e3ddae7..896ccc97f 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -32,7 +32,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index b930d741c..e9c2ad9e2 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.3.1"}} + {:mvn/version "7.4.4"}} :aliases {:test @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/scheduler/deps.edn b/modules/scheduler/deps.edn index 326657e09..3a31aff8e 100644 --- a/modules/scheduler/deps.edn +++ b/modules/scheduler/deps.edn @@ -13,7 +13,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/server/deps.edn b/modules/server/deps.edn index e2f5c1e0a..238dd9a9d 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -30,7 +30,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/thread-pool-executor-collector/deps.edn b/modules/thread-pool-executor-collector/deps.edn index 34124b5ee..4c153e64f 100644 --- a/modules/thread-pool-executor-collector/deps.edn +++ b/modules/thread-pool-executor-collector/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.68.1059"}} + {:mvn/version "1.69.1069"}} :main-opts ["-m" "kaocha.runner"]} From 03fd97ada877a5bf0f00e3c145fb60fb78cc7cb5 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 2 Aug 2022 12:01:08 +0200 Subject: [PATCH 026/124] Allow Metadata Requests in Batches Closes: #778 --- .github/scripts/batch-metadata.sh | 57 +++++++++++++++++++ .github/scripts/batch.sh | 2 +- .github/workflows/build.yml | 6 ++ .../src/blaze/interaction/transaction.clj | 5 +- .../blaze/interaction/transaction_test.clj | 35 +++++++++++- test/blaze/system_test.clj | 21 +++++++ 6 files changed, 123 insertions(+), 3 deletions(-) create mode 100755 .github/scripts/batch-metadata.sh diff --git a/.github/scripts/batch-metadata.sh b/.github/scripts/batch-metadata.sh new file mode 100755 index 000000000..8aaebe59d --- /dev/null +++ b/.github/scripts/batch-metadata.sh @@ -0,0 +1,57 @@ +#!/bin/bash -e + +# +# This script fetches the CapabilityStatement through a batch request. +# + +BASE="http://localhost:8080/fhir" + +bundle() { +cat < Date: Wed, 3 Aug 2022 20:30:17 +0200 Subject: [PATCH 027/124] Implement Sorting by _lastUpdated Closes: #98 --- .../scripts/download-resources-query-sort.sh | 49 +++++++++ .github/scripts/install-blazectl.sh | 2 +- .../scripts/search-patient-last-updated.sh | 2 +- .github/workflows/build.yml | 36 ++++++ modules/cql/src/blaze/elm/compiler/core.clj | 4 +- modules/cql/src/blaze/elm/deps_infer.clj | 4 +- .../cql/src/blaze/elm/equiv_relationships.clj | 4 +- modules/cql/src/blaze/elm/normalizer.clj | 4 +- modules/cql/src/blaze/elm/quantity.clj | 6 +- modules/cql/src/blaze/elm/spec.clj | 4 +- .../src/blaze/db/impl/protocols.clj | 4 + .../db/resource_store/cassandra_test.clj | 4 +- .../test/blaze/db/resource_store/kv_test.clj | 4 +- modules/db-tx-log/deps.edn | 3 +- .../db-tx-log/src/blaze/db/tx_log/spec.clj | 2 +- modules/db/src/blaze/db/api_spec.clj | 2 +- modules/db/src/blaze/db/impl/batch_db.clj | 4 +- modules/db/src/blaze/db/impl/index.clj | 34 ++++-- .../index/search_param_value_resource.clj | 40 +++++-- .../db/src/blaze/db/impl/index/type_as_of.clj | 8 +- modules/db/src/blaze/db/impl/search_param.clj | 11 ++ .../src/blaze/db/impl/search_param/date.clj | 23 ++++ modules/db/src/blaze/db/node.clj | 81 +++++++++----- modules/db/src/blaze/db/spec.clj | 2 +- .../impl/index/resource_handle_test_perf.clj | 4 +- modules/db/test/blaze/db/api_test.clj | 89 +++++++++++++-- .../search_param_value_resource_spec.clj | 8 -- modules/db/test/blaze/db/impl/index_spec.clj | 9 +- .../test/blaze/db/impl/search_param_spec.clj | 10 ++ modules/fhir-path/src/blaze/fhir_path.clj | 7 +- .../src/blaze/fhir/spec/impl.clj | 15 +-- .../blaze/fhir/spec/type_test_mem.clj | 6 +- .../src/blaze/interaction/create.clj | 6 +- .../src/blaze/interaction/search/nav.clj | 19 +++- .../src/blaze/interaction/search/params.clj | 8 +- .../src/blaze/interaction/transaction.clj | 11 +- .../blaze/interaction/transaction/bundle.clj | 20 +++- .../src/blaze/interaction/util.clj | 19 +++- .../test/blaze/interaction/create_test.clj | 24 ++++ .../blaze/interaction/search/nav_spec.clj | 4 +- .../blaze/interaction/search/nav_test.clj | 13 ++- .../blaze/interaction/search/params_test.clj | 14 ++- .../blaze/interaction/search_type_test.clj | 104 +++++++++++++++++- .../interaction/transaction/bundle_test.clj | 37 ++++++- .../blaze/interaction/transaction_test.clj | 44 ++++++++ .../test/blaze/interaction/util_spec.clj | 10 +- .../test/blaze/interaction/util_test.clj | 49 ++++++++- .../src/blaze/page_store/cassandra.clj | 4 +- .../src/blaze/page_store/cassandra/codec.clj | 40 ++++++- .../blaze/page_store/cassandra/codec_spec.clj | 3 +- .../blaze/page_store/cassandra/codec_test.clj | 31 ++++++ .../test/blaze/page_store/cassandra_test.clj | 7 +- .../page-store/src/blaze/page_store/local.clj | 10 +- .../test/blaze/page_store/local_test.clj | 14 +-- .../test/blaze/page_store/weigh_test.clj | 6 +- .../src/blaze/rest_api/capabilities.clj | 6 +- .../test/blaze/rest_api/capabilities_test.clj | 5 +- modules/spec/src/blaze/spec.clj | 21 +++- 58 files changed, 843 insertions(+), 171 deletions(-) create mode 100755 .github/scripts/download-resources-query-sort.sh create mode 100644 modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj diff --git a/.github/scripts/download-resources-query-sort.sh b/.github/scripts/download-resources-query-sort.sh new file mode 100755 index 000000000..c990a9999 --- /dev/null +++ b/.github/scripts/download-resources-query-sort.sh @@ -0,0 +1,49 @@ +#!/bin/bash -e + +BASE="http://localhost:8080/fhir" +TYPE=$1 +QUERY=$2 +SORT=$3 +EXPECTED_SIZE=$4 +FILE_NAME_PREFIX="$(uuidgen)" + +blazectl --server "$BASE" download "$TYPE" -q "_sort=$SORT&$QUERY" -o "$FILE_NAME_PREFIX-get".ndjson + +SIZE=$(wc -l "$FILE_NAME_PREFIX-get".ndjson | xargs | cut -d ' ' -f1) +if [ "$EXPECTED_SIZE" = "$SIZE" ]; then + echo "Success: download size matches for GET request" +else + echo "Fail: download size was ${SIZE} but should be ${EXPECTED_SIZE} for GET request" + exit 1 +fi + +blazectl --server "$BASE" download "$TYPE" -p -q "_sort=$SORT&$QUERY" -o "$FILE_NAME_PREFIX-post".ndjson + +SIZE=$(wc -l "$FILE_NAME_PREFIX-post".ndjson | xargs | cut -d ' ' -f1) +if [ "$EXPECTED_SIZE" = "$SIZE" ]; then + echo "Success: download size matches for POST request" +else + echo "Fail: download size was ${SIZE} but should be ${EXPECTED_SIZE} for POST request" + exit 1 +fi + +if [ "$(diff "$FILE_NAME_PREFIX-get.ndjson" "$FILE_NAME_PREFIX-post.ndjson")" = "" ]; then + echo "Success: both downloads are identical" +else + echo "Fail: the GET and the POST download differ" + exit 1 +fi + +# test sorting, ignoring the milliseconds because Blaze strips them in the index +LAST_UPDATED=$(cat "$FILE_NAME_PREFIX-get.ndjson" | jq -r '.meta.lastUpdated' | cut -d'.' -f1 | uniq) +if [[ "$SORT" == -* ]]; then + LAST_UPDATED_SORT=$(echo "$LAST_UPDATED" | sort -r) +else + LAST_UPDATED_SORT=$(echo "$LAST_UPDATED" | sort) +fi +if [ "$LAST_UPDATED" = "$LAST_UPDATED_SORT" ]; then + echo "Success: resources are sorted" +else + echo "Fail: resources are not sorted" + exit 1 +fi diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh index 21e857985..8199b33dc 100755 --- a/.github/scripts/install-blazectl.sh +++ b/.github/scripts/install-blazectl.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -VERSION=0.8.5 +VERSION=0.9.0 curl -sLO https://github.com/samply/blazectl/releases/download/v${VERSION}/blazectl-${VERSION}-linux-amd64.tar.gz tar xzf blazectl-${VERSION}-linux-amd64.tar.gz diff --git a/.github/scripts/search-patient-last-updated.sh b/.github/scripts/search-patient-last-updated.sh index b61c4c2bd..6c052e81a 100755 --- a/.github/scripts/search-patient-last-updated.sh +++ b/.github/scripts/search-patient-last-updated.sh @@ -10,7 +10,7 @@ BASE="http://localhost:8080/fhir" NOW=$(date +%Y-%m-%dT%H:%M:%S) PATIENT_COUNT=$(curl -sH 'Prefer: handling=strict' "$BASE/Patient?_lastUpdated=gt$NOW&_summary=count" | jq -r .total) -if [ $PATIENT_COUNT -eq 0 ]; then +if [ "$PATIENT_COUNT" -eq 0 ]; then echo "Success: no patents are updated after $NOW" else echo "Fail: $PATIENT_COUNT patents are updated after $NOW" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index a8d563187..1e796a607 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -325,9 +325,21 @@ jobs: - name: Download Observation Resources of male Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=male" 20466 + - name: Download Observation Resources of male Patients Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "_lastUpdated" 20466 + + - name: Download Observation Resources of male Patients Sorted Descending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "-_lastUpdated" 20466 + - name: Download Observation Resources of female Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=female" 22463 + - name: Download Observation Resources of female Patients Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "_lastUpdated" 22463 + + - name: Download Observation Resources of female Patients Sorted Descending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "-_lastUpdated" 22463 + - name: Download Observation Resources - Including Patients run: blazectl --no-progress --server http://localhost:8080/fhir download Observation -q '_include=Observation:patient' -o Observation-Patient.ndjson @@ -352,6 +364,12 @@ jobs: - name: Download MedicationRequest Resources of Medications with code 854235 run: .github/scripts/download-resources-query.sh MedicationRequest "medication.code=1736854" 112 + - name: Download MedicationRequest Resources of Medications with code 854235 Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh MedicationRequest "medication.code=1736854" "_lastUpdated" 112 + + - name: Download MedicationRequest Resources of Medications with code 854235 Sorted Descending + run: .github/scripts/download-resources-query-sort.sh MedicationRequest "medication.code=1736854" "-_lastUpdated" 112 + - name: Download MedicationRequest Resources - Including Medications run: blazectl --no-progress --server http://localhost:8080/fhir download MedicationRequest -q '_include=MedicationRequest:medication' -o MedicationRequest.ndjson @@ -748,9 +766,21 @@ jobs: - name: Download Observation Resources of male Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=male" 20466 + - name: Download Observation Resources of male Patients Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "_lastUpdated" 20466 + + - name: Download Observation Resources of male Patients Sorted Descending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "-_lastUpdated" 20466 + - name: Download Observation Resources of female Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=female" 22463 + - name: Download Observation Resources of female Patients Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "_lastUpdated" 22463 + + - name: Download Observation Resources of female Patients Sorted Descending + run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "-_lastUpdated" 22463 + - name: Download Observation Resources - Including Patients run: blazectl --no-progress --server http://localhost:8080/fhir download Observation -q '_include=Observation:patient' -o Observation-Patient.ndjson @@ -775,6 +805,12 @@ jobs: - name: Download MedicationRequest Resources of Medications with code 854235 run: .github/scripts/download-resources-query.sh MedicationRequest "medication.code=1736854" 112 + - name: Download MedicationRequest Resources of Medications with code 854235 Sorted Ascending + run: .github/scripts/download-resources-query-sort.sh MedicationRequest "medication.code=1736854" "_lastUpdated" 112 + + - name: Download MedicationRequest Resources of Medications with code 854235 Sorted Descending + run: .github/scripts/download-resources-query-sort.sh MedicationRequest "medication.code=1736854" "-_lastUpdated" 112 + - name: Download MedicationRequest Resources - Including Medications run: blazectl --no-progress --server http://localhost:8080/fhir download MedicationRequest -q '_include=MedicationRequest:medication' -o MedicationRequest.ndjson diff --git a/modules/cql/src/blaze/elm/compiler/core.clj b/modules/cql/src/blaze/elm/compiler/core.clj index 6d5521da1..1dd89bed9 100644 --- a/modules/cql/src/blaze/elm/compiler/core.clj +++ b/modules/cql/src/blaze/elm/compiler/core.clj @@ -3,7 +3,7 @@ [blaze.elm.protocols :as p] [blaze.fhir.spec.type.system :as system] [clojure.string :as str] - [cuerdas.core :as cuerdas]) + [cuerdas.core :as c-str]) (:import [java.time.temporal ChronoUnit])) @@ -49,7 +49,7 @@ {:arglists '([context expression])} (fn [_ {:keys [type] :as expr}] (assert (string? type) (format "Missing :type in expression `%s`." (pr-str expr))) - (keyword "elm.compiler.type" (cuerdas/kebab type)))) + (keyword "elm.compiler.type" (c-str/kebab type)))) (defmethod compile* :default diff --git a/modules/cql/src/blaze/elm/deps_infer.clj b/modules/cql/src/blaze/elm/deps_infer.clj index 79fe02569..08018f3d6 100644 --- a/modules/cql/src/blaze/elm/deps_infer.clj +++ b/modules/cql/src/blaze/elm/deps_infer.clj @@ -2,7 +2,7 @@ (:require [blaze.elm.spec] [clojure.set :as set] - [cuerdas.core :as str])) + [cuerdas.core :as c-str])) (defmulti infer-deps @@ -11,7 +11,7 @@ {:arglists '([expression])} (fn [{:keys [type]}] (assert type) - (keyword "elm.deps.type" (str/kebab type)))) + (keyword "elm.deps.type" (c-str/kebab type)))) (defn- update-expression-defs [expression-defs] diff --git a/modules/cql/src/blaze/elm/equiv_relationships.clj b/modules/cql/src/blaze/elm/equiv_relationships.clj index 0c9efee08..fa0110ec5 100644 --- a/modules/cql/src/blaze/elm/equiv_relationships.clj +++ b/modules/cql/src/blaze/elm/equiv_relationships.clj @@ -3,14 +3,14 @@ expression resulting in equiv semi-joins and semi-differences." (:require [blaze.elm.spec] - [cuerdas.core :as str])) + [cuerdas.core :as c-str])) (defmulti find-equiv-rels {:arglists '([expression])} (fn [{:keys [type]}] (assert type) - (keyword "elm.equiv-relationships.type" (str/kebab type)))) + (keyword "elm.equiv-relationships.type" (c-str/kebab type)))) (defn- update-expression-defs [expression-defs] diff --git a/modules/cql/src/blaze/elm/normalizer.clj b/modules/cql/src/blaze/elm/normalizer.clj index 2f13202b2..5d65954b8 100644 --- a/modules/cql/src/blaze/elm/normalizer.clj +++ b/modules/cql/src/blaze/elm/normalizer.clj @@ -1,14 +1,14 @@ (ns blaze.elm.normalizer (:require [blaze.elm.spec] - [cuerdas.core :as str])) + [cuerdas.core :as c-str])) (defmulti normalize {:arglists '([expression])} (fn [{:keys [type]}] (assert type) - (keyword "elm.normalizer.type" (str/kebab type)))) + (keyword "elm.normalizer.type" (c-str/kebab type)))) (defn- normalize-expression [x] diff --git a/modules/cql/src/blaze/elm/quantity.clj b/modules/cql/src/blaze/elm/quantity.clj index d5793054d..fbb8c1c4a 100644 --- a/modules/cql/src/blaze/elm/quantity.clj +++ b/modules/cql/src/blaze/elm/quantity.clj @@ -6,7 +6,7 @@ (:require [blaze.anomaly :as ba :refer [throw-anom]] [blaze.elm.protocols :as p] - [cuerdas.core :as str]) + [cuerdas.core :as c-str]) (:import [javax.measure Quantity UnconvertibleException Unit] [javax.measure.format UnitFormat] @@ -41,7 +41,7 @@ (defn- replace-exp [s n] - (str/replace s (str "10*" n) (apply str "1" (repeat n \0)))) + (c-str/replace s (str "10*" n) (apply str "1" (repeat n \0)))) (defn- hack-replace-unsupported [s] @@ -226,7 +226,7 @@ (let [[_ value unit] (re-matches #"([+-]?\d+(?:\.\d+)?)\s*('[^']+')?" s)] (when value (when-let [value (p/to-decimal value)] - (quantity value (or (str/trim unit "'") "1"))))))) + (quantity value (or (c-str/trim unit "'") "1"))))))) ;; 22.30. ToString diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index 61d35e8cf..daba6ea62 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -5,7 +5,7 @@ [clojure.set :as set] [clojure.spec.alpha :as s] [clojure.spec.gen.alpha :as gen] - [cuerdas.core :as str]) + [cuerdas.core :as c-str]) (:import [javax.measure.spi ServiceProvider SystemOfUnits] [tech.units.indriya.unit BaseUnit])) @@ -91,7 +91,7 @@ (defn- expression-dispatch [{:keys [type]}] (when type - (keyword "elm.spec.type" (str/kebab type)))) + (keyword "elm.spec.type" (c-str/kebab type)))) (defmulti expression expression-dispatch) diff --git a/modules/db-protocols/src/blaze/db/impl/protocols.clj b/modules/db-protocols/src/blaze/db/impl/protocols.clj index 61ddc38c5..d151bb64c 100644 --- a/modules/db-protocols/src/blaze/db/impl/protocols.clj +++ b/modules/db-protocols/src/blaze/db/impl/protocols.clj @@ -73,6 +73,10 @@ [search-param context tid modifier compiled-value] [search-param context tid modifier compiled-value start-id] "Returns a reducible collection.") + (-sorted-resource-handles + [search-param context tid direction] + [search-param context tid direction start-id] + "Returns a reducible collection.") (-compartment-keys [search-param context compartment tid compiled-value]) (-matches? [search-param context resource-handle modifier compiled-values]) (-compartment-ids [_ resolver resource]) diff --git a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj index 678cbd6af..1d0c84c07 100644 --- a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj +++ b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj @@ -17,7 +17,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [integrant.core :as ig] [jsonista.core :as j] [taoensso.timbre :as log]) @@ -51,7 +51,7 @@ (defn hash [s] (assert (= 1 (count s))) - (hash/from-hex (str/repeat s 64))) + (hash/from-hex (c-str/repeat s 64))) (def bound-get-statement (reify BoundStatement)) diff --git a/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj b/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj index 90a1e22c7..9b35170ec 100644 --- a/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj +++ b/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj @@ -19,7 +19,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [integrant.core :as ig] [jsonista.core :as j] [taoensso.timbre :as log]) @@ -47,7 +47,7 @@ (hash "0")) ([s] (assert (= 1 (count s))) - (hash/from-hex (str/repeat s 64)))) + (hash/from-hex (c-str/repeat s 64)))) (defn- invalid-content diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index 40c8c0f64..0a3131c00 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -31,4 +31,5 @@ {cloverage/cloverage {:mvn/version "1.2.4"}} - :main-opts ["-m" "cloverage.coverage" "--codecov" "-p" "src" "-s" "test"]}}} + :main-opts ["-m" "cloverage.coverage" "--codecov" "-p" "src" "-s" "test" + "-e" ".*spec$"]}}} diff --git a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj index 8100d26b3..2bc1fd024 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj @@ -32,7 +32,7 @@ (s/def :blaze.db.tx-cmd/if-none-exist - :blaze.db.query/clauses) + (s/coll-of :blaze.db.query/search-clause :kind vector? :min-count 1)) (s/def :blaze.db.tx-cmd/if-match diff --git a/modules/db/src/blaze/db/api_spec.clj b/modules/db/src/blaze/db/api_spec.clj index abdffed50..012ea9fc0 100644 --- a/modules/db/src/blaze/db/api_spec.clj +++ b/modules/db/src/blaze/db/api_spec.clj @@ -152,7 +152,7 @@ (s/fdef d/query-clauses :args (s/cat :query :blaze.db/query) - :ret (s/nilable (s/coll-of :blaze.db.query/clause))) + :ret (s/nilable :blaze.db.query/clauses)) diff --git a/modules/db/src/blaze/db/impl/batch_db.clj b/modules/db/src/blaze/db/impl/batch_db.clj index b249aeb51..6df2ba0ab 100644 --- a/modules/db/src/blaze/db/impl/batch_db.clj +++ b/modules/db/src/blaze/db/impl/batch_db.clj @@ -232,7 +232,9 @@ (defn- decode-clauses [clauses] (mapv (fn [[search-param modifier values]] - (into [(cond-> (:code search-param) modifier (str ":" modifier))] values)) + (if (#{"asc" "desc"} modifier) + [:sort (:code search-param) (keyword modifier)] + (into [(cond-> (:code search-param) modifier (str ":" modifier))] values))) clauses)) diff --git a/modules/db/src/blaze/db/impl/index.clj b/modules/db/src/blaze/db/impl/index.clj index 17860e784..528775f65 100644 --- a/modules/db/src/blaze/db/impl/index.clj +++ b/modules/db/src/blaze/db/impl/index.clj @@ -18,24 +18,40 @@ true))))) +(defn- resource-handles + ([search-param context tid modifier values] + (condp = modifier + "asc" (search-param/sorted-resource-handles search-param context tid :asc) + "desc" (search-param/sorted-resource-handles search-param context tid :desc) + (search-param/resource-handles search-param context tid modifier values))) + ([search-param context tid modifier values start-id] + (condp = modifier + "asc" (search-param/sorted-resource-handles search-param context tid :asc + start-id) + "desc" (search-param/sorted-resource-handles search-param context tid :desc + start-id) + (search-param/resource-handles search-param context tid modifier values + start-id)))) + + (defn type-query ([context tid clauses] (let [[[search-param modifier _ values] & other-clauses] clauses] (if (seq other-clauses) (coll/eduction (other-clauses-filter context other-clauses) - (search-param/resource-handles + (resource-handles search-param context tid modifier values)) - (search-param/resource-handles + (resource-handles search-param context tid modifier values)))) ([context tid clauses start-id] (let [[[search-param modifier _ values] & other-clauses] clauses] (if (seq other-clauses) (coll/eduction (other-clauses-filter context other-clauses) - (search-param/resource-handles + (resource-handles search-param context tid modifier values start-id)) - (search-param/resource-handles + (resource-handles search-param context tid modifier values start-id))))) @@ -69,10 +85,10 @@ [context resource-handle code target-tid])} ([{:keys [rsvi] :as context} {:keys [tid id hash]} code] (coll/eduction - (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code))) + (u/reference-resource-handle-mapper context) + (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code))) ([{:keys [rsvi] :as context} {:keys [tid id hash]} code target-tid] (coll/eduction - (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code - (codec/tid-byte-string target-tid))))) + (u/reference-resource-handle-mapper context) + (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code + (codec/tid-byte-string target-tid))))) diff --git a/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj b/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj index 35ba22a73..099b05572 100644 --- a/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj +++ b/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj @@ -83,15 +83,19 @@ bs/from-byte-buffer!))) -(def ^:private bs-ff - (bs/from-hex "FF")) +(def ^:private max-hash-prefix + (bs/from-hex "FFFFFFFF")) -(defn encode-seek-key-for-prev +(defn- encode-seek-key-for-prev + "It is important to cover at least the hash prefix because it could be all + binary ones. Other parts like the id will be never all binary ones." + ([c-hash tid] + (bs/concat (encode-seek-key c-hash tid) max-hash-prefix)) ([c-hash tid value] - (bs/concat (encode-seek-key c-hash tid value) bs-ff)) + (bs/concat (encode-seek-key c-hash tid value) max-hash-prefix)) ([c-hash tid value id] - (bs/concat (encode-seek-key c-hash tid value id) bs-ff))) + (bs/concat (encode-seek-key c-hash tid value id) max-hash-prefix))) (defn decode-value-id-hash-prefix @@ -125,6 +129,23 @@ (i/prefix-keys! iter prefix decode-value-id-hash-prefix start-key)))) +(defn all-keys-prev! + "Returns a reducible collection of `[value id hash-prefix]` triples of the + whole range prefixed with `c-hash` and `tid` starting with `start-value` and + `start-id` (optional), iterating in reverse. + + Changes the state of `iter`. Consuming the collection requires exclusive + access to `iter`. Doesn't close `iter`." + ([iter c-hash tid] + (let [prefix (encode-seek-key c-hash tid) + start-key (encode-seek-key-for-prev c-hash tid)] + (i/prefix-keys-prev! iter prefix decode-value-id-hash-prefix start-key))) + ([iter c-hash tid start-value start-id] + (let [prefix (encode-seek-key c-hash tid) + start-key (encode-seek-key-for-prev c-hash tid start-value start-id)] + (i/prefix-keys-prev! iter prefix decode-value-id-hash-prefix start-key)))) + + (defn decode-id-hash-prefix "Returns a tuple of `[id hash-prefix]`." ([] (bb/allocate-direct key-buffer-capacity)) @@ -156,8 +177,8 @@ (defn prefix-keys'! "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys - starting at `start-value` and optional `start-id` and ending when - `prefix-value` is no longer a prefix of the values processed. + starting at `start-value` and ending when `prefix-value` is no longer a prefix + of the values processed. Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." @@ -187,9 +208,8 @@ (defn prefix-keys-prev'! "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys - starting at `start-value` and optional `start-id` and ending when - `prefix-value` is no longer a prefix of the values processed, iterating in - reverse. + starting at `start-value` and ending when `prefix-value` is no longer a prefix + of the values processed, iterating in reverse. Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." diff --git a/modules/db/src/blaze/db/impl/index/type_as_of.clj b/modules/db/src/blaze/db/impl/index/type_as_of.clj index ef4f5d9d8..ac3621b07 100644 --- a/modules/db/src/blaze/db/impl/index/type_as_of.clj +++ b/modules/db/src/blaze/db/impl/index/type_as_of.clj @@ -83,11 +83,9 @@ (defn type-history - "Returns a reducible collection of all versions between `start-t` (inclusive), - `start-id` (optional, inclusive) and `end-t` (inclusive) of resources with - `tid`. - - Versions are resource handles." + "Returns a reducible collection of all historic resource handles between + `start-t` (inclusive), `start-id` (optional, inclusive) and `end-t` + (inclusive) of resources with `tid`." [taoi tid start-t start-id end-t] (coll/eduction (take-while (key-valid? tid end-t)) diff --git a/modules/db/src/blaze/db/impl/search_param.clj b/modules/db/src/blaze/db/impl/search_param.clj index 23f39634d..6f4db9aea 100644 --- a/modules/db/src/blaze/db/impl/search_param.clj +++ b/modules/db/src/blaze/db/impl/search_param.clj @@ -58,6 +58,17 @@ (resource-handles search-param context tid modifier values)))))) +(defn sorted-resource-handles + "Returns a reducible collection of distinct resource handles sorted by + `search-param` in `direction`. + + Optionally starts at `start-id`" + ([search-param context tid direction] + (p/-sorted-resource-handles search-param context tid direction)) + ([search-param context tid direction start-id] + (p/-sorted-resource-handles search-param context tid direction start-id))) + + (defn- compartment-keys "Returns a reducible collection of `[prefix id hash-prefix]` triples." [search-param context compartment tid compiled-values] diff --git a/modules/db/src/blaze/db/impl/search_param/date.clj b/modules/db/src/blaze/db/impl/search_param/date.clj index 4f0ef4f17..89427b59f 100644 --- a/modules/db/src/blaze/db/impl/search_param/date.clj +++ b/modules/db/src/blaze/db/impl/search_param/date.clj @@ -106,6 +106,11 @@ start-id)) +(defn- all-keys-prev! [{:keys [svri] :as context} c-hash tid start-id] + (sp-vr/all-keys-prev! svri c-hash tid + (resource-value! context c-hash tid start-id) start-id)) + + (defn- eq-keys! "Returns a reducible collection of `[value id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by @@ -234,6 +239,24 @@ (u/resource-handle-mapper context tid)) (resource-keys! context c-hash tid value start-id))) + (-sorted-resource-handles [_ context tid direction] + (coll/eduction + (comp + (map (fn [[_value id hash-prefix]] [id hash-prefix])) + (u/resource-handle-mapper context tid)) + (if (= :asc direction) + (sp-vr/all-keys! (:svri context) c-hash tid) + (sp-vr/all-keys-prev! (:svri context) c-hash tid)))) + + (-sorted-resource-handles [_ context tid direction start-id] + (coll/eduction + (comp + (map (fn [[_value id hash-prefix]] [id hash-prefix])) + (u/resource-handle-mapper context tid)) + (if (= :asc direction) + (all-keys! context c-hash tid start-id) + (all-keys-prev! context c-hash tid start-id)))) + (-matches? [_ context resource-handle _ values] (some? (some #(matches? context c-hash resource-handle %) values))) diff --git a/modules/db/src/blaze/db/node.clj b/modules/db/src/blaze/db/node.clj index 7bf8b85b2..a0c9ea9eb 100644 --- a/modules/db/src/blaze/db/node.clj +++ b/modules/db/src/blaze/db/node.clj @@ -30,6 +30,7 @@ [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type :as type] [blaze.module :refer [reg-collector]] + [blaze.spec] [clojure.spec.alpha :as s] [cognitect.anomalies :as anom] [integrant.core :as ig] @@ -75,15 +76,40 @@ (take 16 (iterate #(* 2 %) 1))) +(defmulti resolve-search-param (fn [_registry _type _ret [type] _lenient?] type)) + + +(defmethod resolve-search-param :search-clause + [registry type ret [_ [param & values]] lenient?] + (let [values (distinct values)] + (if-ok [[search-param modifier] (spc/parse-search-param registry type param)] + (if-ok [compiled-values (search-param/compile-values search-param modifier values)] + (conj ret [search-param modifier values compiled-values]) + reduced) + #(if lenient? ret (reduced %))))) + + +(defmethod resolve-search-param :sort-clause + [registry type ret [_ [_ param direction]] _lenient?] + (cond + (seq ret) + (reduced (ba/incorrect "Sort clauses are only allowed at first position.")) + + (not= "_lastUpdated" param) + (reduced (ba/incorrect (format "Unknown search-param `%s` in sort clause." param))) + + :else + (let [[search-param] (spc/parse-search-param registry type param)] + (conj ret [search-param (name direction) [] []])))) + + +(defn- conform-clause [clause] + (s/conform :blaze.db.query/clause clause)) + + (defn- resolve-search-params [registry type clauses lenient?] (reduce - (fn [ret [param & values]] - (let [values (distinct values)] - (if-ok [[search-param modifier] (spc/parse-search-param registry type param)] - (if-ok [compiled-values (search-param/compile-values search-param modifier values)] - (conj ret [search-param modifier values compiled-values]) - reduced) - #(if lenient? ret (reduced %))))) + #(resolve-search-param registry type %1 (conform-clause %2) lenient?) [] clauses)) @@ -229,6 +255,24 @@ (rs/get resource-store (rh/hash resource-handle)))) +(defn- compile-type-query [search-param-registry type clauses lenient?] + (when-ok [clauses (resolve-search-params search-param-registry type clauses + lenient?)] + (if (empty? clauses) + (batch-db/->EmptyTypeQuery (codec/tid type)) + (batch-db/->TypeQuery (codec/tid type) clauses)))) + + +(defn- compile-compartment-query + [search-param-registry code type clauses lenient?] + (when-ok [clauses (resolve-search-params search-param-registry type clauses + lenient?)] + (if (empty? clauses) + (batch-db/->EmptyCompartmentQuery (codec/c-hash code) (codec/tid type)) + (batch-db/->CompartmentQuery (codec/c-hash code) (codec/tid type) + clauses)))) + + (defrecord Node [context tx-log rh-cache tx-cache kv-store resource-store search-param-registry resource-indexer state run? poll-timeout finished] @@ -279,34 +323,21 @@ p/QueryCompiler (-compile-type-query [_ type clauses] - (when-ok [clauses (resolve-search-params search-param-registry type clauses - false)] - (batch-db/->TypeQuery (codec/tid type) (seq clauses)))) + (compile-type-query search-param-registry type clauses false)) (-compile-type-query-lenient [_ type clauses] - (when-ok [clauses (resolve-search-params search-param-registry type clauses - true)] - (if-let [clauses (seq clauses)] - (batch-db/->TypeQuery (codec/tid type) clauses) - (batch-db/->EmptyTypeQuery (codec/tid type))))) + (compile-type-query search-param-registry type clauses true)) (-compile-system-query [_ clauses] (when-ok [clauses (resolve-search-params search-param-registry "Resource" clauses false)] - (batch-db/->SystemQuery (seq clauses)))) + (batch-db/->SystemQuery clauses))) (-compile-compartment-query [_ code type clauses] - (when-ok [clauses (resolve-search-params search-param-registry type clauses - false)] - (batch-db/->CompartmentQuery (codec/c-hash code) (codec/tid type) - (seq clauses)))) + (compile-compartment-query search-param-registry code type clauses false)) (-compile-compartment-query-lenient [_ code type clauses] - (if-let [clauses (seq (resolve-search-params search-param-registry type clauses - true))] - (batch-db/->CompartmentQuery (codec/c-hash code) (codec/tid type) - clauses) - (batch-db/->EmptyCompartmentQuery (codec/c-hash code) (codec/tid type)))) + (compile-compartment-query search-param-registry code type clauses true)) p/Pull (-pull [_ resource-handle] diff --git a/modules/db/src/blaze/db/spec.clj b/modules/db/src/blaze/db/spec.clj index 99aacbbe4..19821f07d 100644 --- a/modules/db/src/blaze/db/spec.clj +++ b/modules/db/src/blaze/db/spec.clj @@ -69,7 +69,7 @@ (defmethod tx-op :create [_] (s/cat :op #{:create} :resource :blaze/resource - :if-none-exist (s/? :blaze.db.query/clauses))) + :if-none-exist (s/? :blaze.db.tx-cmd/if-none-exist))) (defmethod tx-op :put [_] diff --git a/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj b/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj index bc6279628..1b04d145d 100644 --- a/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj +++ b/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj @@ -4,7 +4,7 @@ [blaze.db.impl.index.resource-handle :as rh] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] - [cuerdas.core :as str]) + [cuerdas.core :as c-str]) (:import [org.openjdk.jol.info GraphLayout])) @@ -27,7 +27,7 @@ (defn- resource-handle [id-size] - (rh/resource-handle 0 (str/repeat "0" id-size) 0 (bb/allocate 40))) + (rh/resource-handle 0 (c-str/repeat "0" id-size) 0 (bb/allocate 40))) (deftest resource-handle-test diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index 24f5b0cae..ad1d0bde6 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -764,9 +764,20 @@ (deftest type-query-test - (testing "a new node has no patients" - (with-system [{:blaze.db/keys [node]} system] - (is (coll/empty? (d/type-query (d/db node) "Patient" [["gender" "male"]]))))) + (with-system [{:blaze.db/keys [node]} system] + (testing "a new node has no patients" + (is (coll/empty? (d/type-query (d/db node) "Patient" [["gender" "male"]])))) + + (testing "sort clauses are anly allowed at first position" + (given (d/type-query (d/db node) "Patient" [["gender" "male"] + [:sort "_lastUpdated" :desc]]) + ::anom/category := ::anom/incorrect + ::anom/message := "Sort clauses are only allowed at first position.")) + + (testing "unknown search-param in sort clause" + (given (d/type-query (d/db node) "Patient" [[:sort "foo" :desc]]) + ::anom/category := ::anom/incorrect + ::anom/message := "Unknown search-param `foo` in sort clause."))) (testing "a node with one patient" (with-system-data [{:blaze.db/keys [node]} system] @@ -774,6 +785,7 @@ (testing "the patient can be found" (given (pull-type-query node "Patient" [["active" "true"]]) + count := 1 [0 :fhir/type] := :fhir/Patient [0 :id] := "0")) @@ -797,23 +809,79 @@ (testing "only the active patient will be found" (given (pull-type-query node "Patient" [["active" "true"]]) + count := 1 [0 :fhir/type] := :fhir/Patient - [0 :id] := "0" - 1 := nil)) + [0 :id] := "0")) (testing "only the non-active patient will be found" (given (pull-type-query node "Patient" [["active" "false"]]) + count := 1 [0 :fhir/type] := :fhir/Patient - [0 :id] := "1" - 1 := nil)) + [0 :id] := "1")) (testing "both patients will be found" (given (pull-type-query node "Patient" [["active" "true" "false"]]) + count := 2 [0 :fhir/type] := :fhir/Patient [0 :id] := "0" [1 :fhir/type] := :fhir/Patient [1 :id] := "1")))) + (testing "a node with two patients in two transactions" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]]] + + (testing "the oldest patient comes first" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :asc]]) + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "0" + [1 :id] := "1")) + + (testing "the newest patient comes first" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :desc]]) + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "1" + [1 :id] := "0")))) + + (testing "a node with three patients in three transactions" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]] + [[:put {:fhir/type :fhir/Patient :id "2"}]]] + + (testing "the oldest patient comes first" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :asc]]) + count := 3 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "0" + [1 :id] := "1" + [2 :id] := "2") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :asc]] "1") + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "1" + [1 :id] := "2"))) + + (testing "the newest patient comes first" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :desc]]) + count := 3 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "2" + [1 :id] := "1" + [2 :id] := "0") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" :desc]] "1") + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "1" + [1 :id] := "0"))))) + (testing "does not find the deleted active patient" (with-system-data [{:blaze.db/keys [node]} system] [[[:put {:fhir/type :fhir/Patient :id "0" :active true}] @@ -3087,7 +3155,12 @@ (given (d/compile-type-query-lenient node "Patient" [["birthdate" "invalid"]]) ::anom/category := ::anom/incorrect - ::anom/message := "Invalid date-time value `invalid` in search parameter `birthdate`."))))) + ::anom/message := "Invalid date-time value `invalid` in search parameter `birthdate`.")) + + (testing "sort parameter" + (let [query (d/compile-type-query-lenient + node "Patient" [[:sort "_lastUpdated" :asc]])] + (is (= [[:sort "_lastUpdated" :asc]] (d/query-clauses query)))))))) diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj index e155c5bc8..91eb3701c 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj @@ -32,14 +32,6 @@ :ret byte-string?) -(s/fdef sp-vr/encode-seek-key-for-prev - :args (s/cat :c-hash :blaze.db/c-hash - :tid :blaze.db/tid - :value byte-string? - :id (s/? :blaze.db/id-byte-string)) - :ret byte-string?) - - (s/fdef sp-vr/index-entry :args (s/cat :c-hash :blaze.db/c-hash :tid :blaze.db/tid diff --git a/modules/db/test/blaze/db/impl/index_spec.clj b/modules/db/test/blaze/db/impl/index_spec.clj index c703a5d40..8a02c56c6 100644 --- a/modules/db/test/blaze/db/impl/index_spec.clj +++ b/modules/db/test/blaze/db/impl/index_spec.clj @@ -12,13 +12,14 @@ (s/def :blaze.db.index.query/clause - (s/tuple :blaze.db/search-param (s/nilable :blaze.db.search-param/modifier) - (s/coll-of string?) (s/coll-of some?))) + (s/tuple :blaze.db/search-param + (s/nilable :blaze.db.search-param/modifier) + (s/coll-of string?) + (s/coll-of some?))) -;; it's a bit faster to have the clauses as seq instead of an vector (s/def :blaze.db.index.query/clauses - (s/coll-of :blaze.db.index.query/clause :kind seq? :min-count 1)) + (s/coll-of :blaze.db.index.query/clause :min-count 1)) (s/fdef index/type-query diff --git a/modules/db/test/blaze/db/impl/search_param_spec.clj b/modules/db/test/blaze/db/impl/search_param_spec.clj index bd6dabf27..30014927a 100644 --- a/modules/db/test/blaze/db/impl/search_param_spec.clj +++ b/modules/db/test/blaze/db/impl/search_param_spec.clj @@ -21,6 +21,7 @@ [blaze.db.search-param-registry-spec] [blaze.fhir-path-spec] [blaze.fhir.spec] + [blaze.spec] [clojure.spec.alpha :as s] [cognitect.anomalies :as anom])) @@ -43,6 +44,15 @@ :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) +(s/fdef search-param/sorted-resource-handles + :args (s/cat :search-param :blaze.db/search-param + :context :blaze.db.impl.batch-db/context + :tid :blaze.db/tid + :direction :blaze.db.query/sort-direction + :start-id (s/? :blaze.db/id-byte-string)) + :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) + + (s/fdef search-param/compartment-resource-handles :args (s/cat :search-param :blaze.db/search-param :context :blaze.db.impl.batch-db/context diff --git a/modules/fhir-path/src/blaze/fhir_path.clj b/modules/fhir-path/src/blaze/fhir_path.clj index 9fd4dd8ef..3da249f4a 100644 --- a/modules/fhir-path/src/blaze/fhir_path.clj +++ b/modules/fhir-path/src/blaze/fhir_path.clj @@ -6,11 +6,12 @@ [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type :as type] [blaze.fhir.spec.type.system :as system] + [clojure.string :as str] [cognitect.anomalies :as anom] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [taoensso.timbre :as log]) (:import - [clojure.lang PersistentVector IReduceInit] + [clojure.lang IReduceInit PersistentVector] [java.io StringReader] [org.antlr.v4.runtime CharStreams CommonTokenStream] [org.antlr.v4.runtime.tree TerminalNode] @@ -528,7 +529,7 @@ fhirpathParser$StringLiteralContext (-compile [ctx] - [(str/trim (.getText (.getSymbol (.STRING ctx))) "'")]) + [(c-str/trim (.getText (.getSymbol (.STRING ctx))) "'")]) fhirpathParser$NumberLiteralContext (-compile [ctx] diff --git a/modules/fhir-structure/src/blaze/fhir/spec/impl.clj b/modules/fhir-structure/src/blaze/fhir/spec/impl.clj index ec8d86f24..9bf7c2629 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/impl.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/impl.clj @@ -9,7 +9,8 @@ [clojure.alpha.spec :as s] [clojure.data.xml.name :as xml-name] [clojure.data.xml.node :as xml-node] - [cuerdas.core :as str]) + [clojure.string :as str] + [cuerdas.core :as c-str]) (:import [com.github.benmanes.caffeine.cache CacheLoader Caffeine LoadingCache] [java.net URLEncoder] @@ -116,7 +117,7 @@ (defn- key-name [last-path-part {:keys [code]}] (if (str/ends-with? last-path-part "[x]") - (str/replace last-path-part "[x]" (str/capital code)) + (str/replace last-path-part "[x]" (c-str/capital code)) last-path-part)) @@ -146,7 +147,7 @@ (defn- choice-spec-def* [modifier path code min max] - {:key (path-parts->key' (str "fhir." (name modifier)) (split-path (str/replace path "[x]" (str/capital code)))) + {:key (path-parts->key' (str "fhir." (name modifier)) (split-path (str/replace path "[x]" (c-str/capital code)))) :modifier modifier :min min :max max @@ -391,7 +392,7 @@ (.build (reify CacheLoader (load [_ [key type]] - (keyword (str (name key) (str/capital (name type))))))))) + (keyword (str (name key) (c-str/capital (name type))))))))) (defn- choice-type-key [key type] @@ -478,7 +479,7 @@ :fhir.json/HumanName :fhir.json/Address :fhir.json/Reference) - (json-object-spec-form (str/kebab path-part) child-spec-defs) + (json-object-spec-form (c-str/kebab path-part) child-spec-defs) :fhir.json.Bundle.entry/search (json-object-spec-form "bundle-entry-search" child-spec-defs) (conj (seq (remap-choice-conformer-forms child-spec-defs)) @@ -655,7 +656,7 @@ :fhir.cbor/HumanName :fhir.cbor/Address :fhir.cbor/Reference) - (cbor-object-spec-form (str/kebab path-part) child-spec-defs) + (cbor-object-spec-form (c-str/kebab path-part) child-spec-defs) :fhir.cbor.Bundle.entry/search (cbor-object-spec-form "bundle-entry-search" child-spec-defs) (conj (seq (remap-choice-conformer-forms child-spec-defs)) @@ -770,7 +771,7 @@ (defn- xml-spec-form [name {:keys [element]}] (let [regex (type-regex (value-type element)) - constructor (str "xml->" (str/capital name))] + constructor (str "xml->" (c-str/capital name))] (case name "xhtml" `(s/and xml/element? (s/conformer type/xml->Xhtml type/to-xml)) (xml/primitive-xml-form regex (symbol "blaze.fhir.spec.type" constructor))))) diff --git a/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj b/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj index 9374e089b..778c1f9b3 100644 --- a/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj +++ b/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj @@ -3,7 +3,7 @@ [blaze.fhir.spec.memory :as mem] [blaze.fhir.spec.type :as type] [clojure.test :refer [are deftest is testing]] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [clojure.alpha.spec :as s2] [blaze.test-util :as tu]) (:import @@ -22,8 +22,8 @@ #fhir/string"" 40 #fhir/string"a" 48 #fhir/string{:value "a"} 48 - (type/string (str/repeat "a" 8)) 48 - (type/string (str/repeat "a" 9)) 56 + (type/string (c-str/repeat "a" 8)) 48 + (type/string (c-str/repeat "a" 9)) 56 #fhir/string{:id "0" :value "foo"} 136 #fhir/decimal 1.1M 40 diff --git a/modules/interaction/src/blaze/interaction/create.clj b/modules/interaction/src/blaze/interaction/create.clj index a9f185649..2239b7e4c 100644 --- a/modules/interaction/src/blaze/interaction/create.clj +++ b/modules/interaction/src/blaze/interaction/create.clj @@ -13,6 +13,7 @@ [blaze.interaction.util :as iu] [blaze.middleware.fhir.metrics :refer [wrap-observe-request-duration]] [clojure.spec.alpha :as s] + [clojure.string :as str] [integrant.core :as ig] [reitit.core :as reitit] [ring.util.codec :as ring-codec] @@ -46,8 +47,9 @@ (conj conditional-clauses))) -(defn- conditional-clauses [headers] - (some-> headers (get "if-none-exist") ring-codec/form-decode iu/clauses)) +(defn- conditional-clauses [{:strs [if-none-exist]}] + (when-not (str/blank? if-none-exist) + (-> if-none-exist ring-codec/form-decode iu/search-clauses))) (defn- response-context [{:keys [headers] :as request} db-after] diff --git a/modules/interaction/src/blaze/interaction/search/nav.clj b/modules/interaction/src/blaze/interaction/search/nav.clj index 808509ad4..9498ef98c 100644 --- a/modules/interaction/src/blaze/interaction/search/nav.clj +++ b/modules/interaction/src/blaze/interaction/search/nav.clj @@ -6,12 +6,21 @@ [reitit.core :as reitit])) +(defmulti clause->query-param (fn [_ret [key]] key)) + + +(defmethod clause->query-param :sort + [ret [_sort param direction]] + (assoc ret "_sort" (if (= :desc direction) (str "-" param) param))) + + +(defmethod clause->query-param :default + [ret [param & values]] + (update ret param (fnil conj []) (str/join "," values))) + + (defn- clauses->query-params [clauses] - (reduce - (fn [ret [param & values]] - (update ret param (fnil conj []) (str/join "," values))) - {} - clauses)) + (reduce clause->query-param {} clauses)) (defn- clauses->token-query-params [page-store token clauses] diff --git a/modules/interaction/src/blaze/interaction/search/params.clj b/modules/interaction/src/blaze/interaction/search/params.clj index fc816f2ce..695f6fb65 100644 --- a/modules/interaction/src/blaze/interaction/search/params.clj +++ b/modules/interaction/src/blaze/interaction/search/params.clj @@ -25,7 +25,8 @@ :http/status 422)) :else - (ac/completed-future {:clauses (iu/clauses query-params)}))) + (do-sync [clauses (ac/completed-future (iu/clauses query-params))] + {:clauses clauses}))) (defn- summary? @@ -36,7 +37,10 @@ (defn decode "Returns a CompletableFuture that will complete with decoded params or - complete exceptionally in case of errors." + complete exceptionally in case of errors. + + Decoded params consist of: + :clauses - query clauses" [page-store handling query-params] (do-sync [{:keys [clauses token]} (clauses page-store query-params)] (when-ok [include-defs (include/include-defs handling query-params)] diff --git a/modules/interaction/src/blaze/interaction/transaction.clj b/modules/interaction/src/blaze/interaction/transaction.clj index b4fe80322..7801e3de0 100644 --- a/modules/interaction/src/blaze/interaction/transaction.clj +++ b/modules/interaction/src/blaze/interaction/transaction.clj @@ -26,8 +26,8 @@ [ring.util.response :as ring] [taoensso.timbre :as log]) (:import - [java.time.format DateTimeFormatter] - [java.time Instant])) + [java.time Instant] + [java.time.format DateTimeFormatter])) (set! *warn-on-reflection* true) @@ -277,6 +277,11 @@ :lastModified (:blaze.db.tx/instant tx)}})) +(defn- conditional-clauses [if-none-exist] + (when-not (str/blank? if-none-exist) + (-> if-none-exist ring-codec/form-decode iu/search-clauses))) + + (defmethod build-response-entry "POST" [{:keys [return-preference db] :as context} _ @@ -290,7 +295,7 @@ (assoc (created-entry context type handle) :resource resource)) (ac/completed-future (created-entry context type handle))) (let [if-none-exist (-> entry :request :ifNoneExist) - clauses (some-> if-none-exist ring-codec/form-decode iu/clauses) + clauses (conditional-clauses if-none-exist) handle (first (d/type-query db type clauses))] (if (identical? :blaze.preference.return/representation return-preference) (do-sync [resource (d/pull db handle)] diff --git a/modules/interaction/src/blaze/interaction/transaction/bundle.clj b/modules/interaction/src/blaze/interaction/transaction/bundle.clj index 4f130c9a0..2ccf9b385 100644 --- a/modules/interaction/src/blaze/interaction/transaction/bundle.clj +++ b/modules/interaction/src/blaze/interaction/transaction/bundle.clj @@ -1,10 +1,12 @@ (ns blaze.interaction.transaction.bundle "FHIR Bundle specific stuff." (:require + [blaze.anomaly :as ba] [blaze.fhir.spec.type :as type] [blaze.interaction.transaction.bundle.links :as links] [blaze.interaction.transaction.bundle.url :as url] [blaze.interaction.util :as iu] + [clojure.string :as str] [ring.util.codec :as ring-codec])) @@ -21,11 +23,18 @@ (defmulti entry-tx-op (fn [{{:keys [method]} :request}] (type/value method))) +(defn- conditional-clauses [if-none-exist] + (when-not (str/blank? if-none-exist) + (-> if-none-exist ring-codec/form-decode iu/search-clauses))) + + (defmethod entry-tx-op "POST" [{:keys [resource] {if-none-exist :ifNoneExist} :request}] - (cond-> [:create resource] - if-none-exist - (conj (-> if-none-exist ring-codec/form-decode iu/clauses)))) + (let [clauses (conditional-clauses if-none-exist)] + (cond-> + [:create resource] + (seq clauses) + (conj clauses)))) (defmethod entry-tx-op "PUT" @@ -43,4 +52,7 @@ (defn tx-ops "Returns transaction operations of all `entries` of a transaction bundle." [entries] - (mapv entry-tx-op (links/resolve-entry-links entries))) + (transduce + (comp (map entry-tx-op) (halt-when ba/anomaly?)) + conj + (links/resolve-entry-links entries))) diff --git a/modules/interaction/src/blaze/interaction/util.clj b/modules/interaction/src/blaze/interaction/util.clj index 364334a1f..1630b089b 100644 --- a/modules/interaction/src/blaze/interaction/util.clj +++ b/modules/interaction/src/blaze/interaction/util.clj @@ -1,9 +1,11 @@ (ns blaze.interaction.util (:require + [blaze.anomaly :as ba] [blaze.db.api :as d] [blaze.handler.fhir.util :as fhir-util] [blaze.luid :as luid] - [clojure.string :as str])) + [clojure.string :as str] + [cuerdas.core :as c-str])) (defn etag->t [etag] @@ -33,7 +35,20 @@ (mapcat query-param->clauses))) -(defn clauses [query-params] +(defn- sort-clauses [sort] + (let [[param & params] (str/split sort #",") + param (str/trim param)] + (if params + (ba/unsupported "More than one sort parameter is unsupported.") + [[:sort (c-str/ltrim param "-") (if (str/starts-with? param "-") :desc :asc)]]))) + + +(defn clauses [{:strs [_sort] :as query-params}] + (into (if (str/blank? _sort) [] (sort-clauses _sort)) + query-params->clauses-xf query-params)) + + +(defn search-clauses [query-params] (into [] query-params->clauses-xf query-params)) diff --git a/modules/interaction/test/blaze/interaction/create_test.clj b/modules/interaction/test/blaze/interaction/create_test.clj index 29a7afadd..4c01b07de 100644 --- a/modules/interaction/test/blaze/interaction/create_test.clj +++ b/modules/interaction/test/blaze/interaction/create_test.clj @@ -272,6 +272,30 @@ (is (= :fhir/OperationOutcome (:fhir/type body))))))) (testing "conditional create" + (testing "with empty header" + (with-handler [handler] + [] + (let [{:keys [status]} + @(handler + {::reitit/match patient-match + :headers {"if-none-exist" ""} + :body {:fhir/type :fhir/Patient}})] + + (testing "a unconditional create is executed" + (is (= 201 status)))))) + + (testing "with ignorable _sort search parameter" + (with-handler [handler] + [] + (let [{:keys [status]} + @(handler + {::reitit/match patient-match + :headers {"if-none-exist" "_sort=a"} + :body {:fhir/type :fhir/Patient}})] + + (testing "a unconditional create is executed" + (is (= 201 status)))))) + (testing "with non-matching query" (testing "on empty database" (with-handler [handler] diff --git a/modules/interaction/test/blaze/interaction/search/nav_spec.clj b/modules/interaction/test/blaze/interaction/search/nav_spec.clj index a5b19a9e7..2feddbfad 100644 --- a/modules/interaction/test/blaze/interaction/search/nav_spec.clj +++ b/modules/interaction/test/blaze/interaction/search/nav_spec.clj @@ -11,7 +11,7 @@ :args (s/cat :base-url string? :match some? :params (s/nilable map?) - :clauses (s/nilable (s/coll-of :blaze.db.query/clause)) + :clauses (s/nilable :blaze.db.query/clauses) :t :blaze.db/t :offset (s/nilable map?)) :ret string?) @@ -22,7 +22,7 @@ :base-url string? :match some? :params (s/nilable map?) - :clauses (s/nilable (s/coll-of :blaze.db.query/clause)) + :clauses (s/nilable :blaze.db.query/clauses) :t :blaze.db/t :offset (s/nilable map?)) :ret ac/completable-future?) diff --git a/modules/interaction/test/blaze/interaction/search/nav_test.clj b/modules/interaction/test/blaze/interaction/search/nav_test.clj index 747fe6304..9b76fa808 100644 --- a/modules/interaction/test/blaze/interaction/search/nav_test.clj +++ b/modules/interaction/test/blaze/interaction/search/nav_test.clj @@ -6,7 +6,7 @@ [blaze.page-store.protocols :as p] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] - [cuerdas.core :as str])) + [cuerdas.core :as c-str])) (st/instrument) @@ -42,6 +42,15 @@ ["combo-code-value-quantity" "8462-4$ge90"]] 1 nil)))) + (testing "sort clause" + (testing "ascending" + (is (= "base-url-110407/Observation?_sort=foo&__t=1" + (nav/url "base-url-110407" match nil [[:sort "foo" :asc]] 1 nil)))) + + (testing "descending" + (is (= "base-url-110407/Observation?_sort=-foo&__t=1" + (nav/url "base-url-110407" match nil [[:sort "foo" :desc]] 1 nil))))) + (testing "with include-defs" (testing "empty" (is (= "base-url-110439/Observation?__t=1" @@ -162,7 +171,7 @@ (reify p/PageStore (-put [_ clauses] (assert (= clauses-1 clauses)) - (ac/completed-future (str/repeat "A" 32))))) + (ac/completed-future (c-str/repeat "A" 32))))) (deftest token-url-test diff --git a/modules/interaction/test/blaze/interaction/search/params_test.clj b/modules/interaction/test/blaze/interaction/search/params_test.clj index 2e5552622..2350bffb2 100644 --- a/modules/interaction/test/blaze/interaction/search/params_test.clj +++ b/modules/interaction/test/blaze/interaction/search/params_test.clj @@ -8,7 +8,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [juxt.iota :refer [given]])) @@ -29,6 +29,12 @@ (deftest decode-test + (testing "unsupported sort parameter" + (given-failed-future (params/decode page-store + :blaze.preference.handling/lenient + {"_sort" "a,b"}) + ::anom/category := ::anom/unsupported)) + (testing "invalid include parameter" (given-failed-future (params/decode page-store :blaze.preference.handling/strict @@ -47,9 +53,9 @@ (given @(params/decode (reify p/PageStore (-get [_ token] - (assert (= (str/repeat "A" 32) token)) + (assert (= (c-str/repeat "A" 32) token)) (ac/completed-future [["foo" "bar"]]))) :blaze.preference.handling/strict - {"__token" (str/repeat "A" 32)}) + {"__token" (c-str/repeat "A" 32)}) :clauses := [["foo" "bar"]] - :token := (str/repeat "A" 32)))) + :token := (c-str/repeat "A" 32)))) diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index 407f7ac03..0e1462f08 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -18,7 +18,7 @@ [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [integrant.core :as ig] [java-time :as time] [juxt.iota :refer [given]] @@ -464,6 +464,38 @@ (is (= #fhir/uri"base-url-113047/Patient?active=true&_summary=count&_count=50&__t=1" (link-url body "self"))))))))))) + (testing "on unsupported second sort parameter" + (testing "returns error" + (with-handler [handler] + [] + (testing "normal result" + (let [{:keys [status body]} + @(handler + {::reitit/match patient-match + :params {"_sort" "a,b"}})] + + (is (= 422 status)) + + (given body + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"not-supported" + [:issue 0 :diagnostics] := "More than one sort parameter is unsupported."))) + + (testing "summary result" + (let [{:keys [status body]} + @(handler + {::reitit/match patient-match + :params {"_sort" "a,b" "_summary" "count"}})] + + (is (= 422 status)) + + (given body + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"not-supported" + [:issue 0 :diagnostics] := "More than one sort parameter is unsupported.")))))) + (testing "on invalid date-time" (testing "returns error" (with-handler [handler] @@ -523,7 +555,7 @@ (let [{:keys [status body]} @(handler {::reitit/match patient-page-match - :params {"__token" (str/repeat "A" 32) "_count" "1" "__t" "1" + :params {"__token" (c-str/repeat "A" 32) "_count" "1" "__t" "1" "__page-id" "1"}})] (is (= 422 status)) @@ -533,7 +565,7 @@ [:issue 0 :severity] := #fhir/code"error" [:issue 0 :code] := #fhir/code"not-found" [:issue 0 :diagnostics] := (format "Clauses of token `%s` not found." - (str/repeat "A" 32))))))) + (c-str/repeat "A" 32))))))) (testing "with one patient" (with-handler [handler] @@ -993,6 +1025,72 @@ (testing "the bundle contains one entry" (is (= 0 (count (:entry body))))))))) + (testing "_lastUpdated sort" + (with-handler [handler] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]] + [[:put {:fhir/type :fhir/Patient :id "2"}]]] + + (testing "ascending" + (let [{:keys [status body]} + @(handler + {::reitit/match patient-match + :params {"_sort" "_lastUpdated"}})] + + (is (= 200 status)) + + (testing "the body contains a bundle" + (is (= :fhir/Bundle (:fhir/type body)))) + + (testing "the bundle type is searchset" + (is (= #fhir/code"searchset" (:type body)))) + + (testing "the total count is 3" + (is (= #fhir/unsignedInt 3 (:total body)))) + + (testing "the bundle contains three entries" + (is (= 3 (count (:entry body))))) + + (testing "the resources are sorted ascending" + (given (:entry body) + [0 :resource :id] := "0" + [1 :resource :id] := "1" + [2 :resource :id] := "2")) + + (testing "has a self link" + (is (= #fhir/uri"base-url-113047/Patient?_sort=_lastUpdated&_count=50&__t=3&__page-id=0" + (link-url body "self")))))) + + (testing "descending" + (let [{:keys [status body]} + @(handler + {::reitit/match patient-match + :params {"_sort" "-_lastUpdated"}})] + + (is (= 200 status)) + + (testing "the body contains a bundle" + (is (= :fhir/Bundle (:fhir/type body)))) + + (testing "the bundle type is searchset" + (is (= #fhir/code"searchset" (:type body)))) + + (testing "the total count is 3" + (is (= #fhir/unsignedInt 3 (:total body)))) + + (testing "the bundle contains three entries" + (is (= 3 (count (:entry body))))) + + (testing "the resources are sorted ascending" + (given (:entry body) + [0 :resource :id] := "2" + [1 :resource :id] := "1" + [2 :resource :id] := "0")) + + (testing "has a self link" + (is (= #fhir/uri"base-url-113047/Patient?_sort=-_lastUpdated&_count=50&__t=3&__page-id=2" + (link-url body "self")))))))) + (testing "_profile search" (with-handler [handler] [[[:put {:fhir/type :fhir/Patient :id "0"}] diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj index e1003a7a3..824870a2b 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj @@ -50,11 +50,46 @@ :method #fhir/code"POST" :url #fhir/uri"Patient" :ifNoneExist "birthdate=2020"}}]) + [0 count] := 3 [0 0] := :create [0 1 :fhir/type] := :fhir/Patient [0 1 :id] := "id-220200" [0 2 count] := 1 - [0 2 0] := ["birthdate" "2020"])) + [0 2 0] := ["birthdate" "2020"]) + + (testing "with empty :ifNoneExist" + (given + (bundle/tx-ops + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient + :id "id-220200"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"POST" + :url #fhir/uri"Patient" + :ifNoneExist ""}}]) + [0 count] := 2 + [0 0] := :create + [0 1 :fhir/type] := :fhir/Patient + [0 1 :id] := "id-220200")) + + (testing "with ignorable _sort search parameter" + (given + (bundle/tx-ops + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient + :id "id-220200"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"POST" + :url #fhir/uri"Patient" + :ifNoneExist "_sort=a"}}]) + [0 count] := 2 + [0 0] := :create + [0 1 :fhir/type] := :fhir/Patient + [0 1 :id] := "id-220200"))) (testing "update" (given diff --git a/modules/interaction/test/blaze/interaction/transaction_test.clj b/modules/interaction/test/blaze/interaction/transaction_test.clj index 2473e3e85..3bf704f47 100644 --- a/modules/interaction/test/blaze/interaction/transaction_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction_test.clj @@ -490,6 +490,50 @@ :lastModified := Instant/EPOCH))))))) (testing "and conditional create interaction" + (testing "with empty property" + (with-handler [handler] + [] + + (let [{:keys [status]} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type (type/code type) + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"POST" + :url #fhir/uri"Patient" + :ifNoneExist ""}}]}})] + + (testing "a unconditional create is executed" + (is (= 200 status)))))) + + (testing "with ignorable _sort search parameter" + (with-handler [handler] + [] + + (let [{:keys [status]} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type (type/code type) + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"POST" + :url #fhir/uri"Patient" + :ifNoneExist "_sort=a"}}]}})] + + (testing "a unconditional create is executed" + (is (= 200 status)))))) + (testing "with non-matching patient" (testing "without return preference" (with-handler [handler] diff --git a/modules/interaction/test/blaze/interaction/util_spec.clj b/modules/interaction/test/blaze/interaction/util_spec.clj index 6b8965448..dd47c35e9 100644 --- a/modules/interaction/test/blaze/interaction/util_spec.clj +++ b/modules/interaction/test/blaze/interaction/util_spec.clj @@ -4,7 +4,8 @@ [blaze.db.tx-log.spec] [blaze.handler.fhir.util-spec] [blaze.interaction.util :as iu] - [clojure.spec.alpha :as s])) + [clojure.spec.alpha :as s] + [cognitect.anomalies :as anom])) (s/fdef iu/etag->t @@ -14,4 +15,9 @@ (s/fdef iu/clauses :args (s/cat :query-params (s/nilable :ring.request/query-params)) - :ret (s/coll-of :blaze.db.query/clause)) + :ret (s/or :clauses :blaze.db.query/clauses :anomaly ::anom/anomaly)) + + +(s/fdef iu/search-clauses + :args (s/cat :query-params (s/nilable :ring.request/query-params)) + :ret :blaze.db.query/search-clauses) diff --git a/modules/interaction/test/blaze/interaction/util_test.clj b/modules/interaction/test/blaze/interaction/util_test.clj index 7e62c650d..ed35694b8 100644 --- a/modules/interaction/test/blaze/interaction/util_test.clj +++ b/modules/interaction/test/blaze/interaction/util_test.clj @@ -3,7 +3,9 @@ [blaze.interaction.util :as iu] [blaze.interaction.util-spec] [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [are deftest is testing]])) + [clojure.test :as test :refer [are deftest is testing]] + [cognitect.anomalies :as anom] + [juxt.iota :refer [given]])) (st/instrument) @@ -34,13 +36,16 @@ (deftest clauses-test (testing "nil" - (is (empty? (iu/clauses nil)))) + (is (empty? (iu/clauses nil))) + (is (empty? (iu/search-clauses nil)))) (testing "empty map" - (is (empty? (iu/clauses {})))) + (is (empty? (iu/clauses {}))) + (is (empty? (iu/search-clauses {})))) (testing "empty key and value" - (is (= [["" ""]] (iu/clauses {"" ""})))) + (is (= [["" ""]] (iu/clauses {"" ""}))) + (is (= [["" ""]] (iu/search-clauses {"" ""})))) (testing "empty key and two empty values" (is (= [["" ""] ["" ""]] (iu/clauses {"" ["" ""]})))) @@ -76,6 +81,42 @@ (testing "with two parts" (is (= [["a" "b" "c"]] (iu/clauses {"a" " b , c "})))))) + (testing "one sort param" + (testing "ascending" + (is (= [[:sort "a" :asc]] (iu/clauses {"_sort" "a"}))) + (is (= [] (iu/search-clauses {"_sort" "a"}))) + + (testing "with leading whitespace" + (is (= [[:sort "a" :asc]] (iu/clauses {"_sort" " a"})))) + + (testing "with trailing whitespace" + (is (= [[:sort "a" :asc]] (iu/clauses {"_sort" "a "}))))) + + (testing "descending" + (is (= [[:sort "a" :desc]] (iu/clauses {"_sort" "-a"}))) + + (testing "with leading whitespace" + (is (= [[:sort "a" :desc]] (iu/clauses {"_sort" " -a"})))) + + (testing "with trailing whitespace" + (is (= [[:sort "a" :desc]] (iu/clauses {"_sort" "-a "}))))) + + (testing "with two parts is unsupported" + (given (iu/clauses {"_sort" "a,b"}) + ::anom/category := ::anom/unsupported + ::anom/message := "More than one sort parameter is unsupported."))) + + (testing "one sort and one other param" + (testing "sort param comes always first" + (is (= [[:sort "a" :asc] ["b" "c"]] + (iu/clauses {"_sort" "a" "b" "c"}) + (iu/clauses {"b" "c" "_sort" "a" })))) + + (testing "with two parts is unsupported" + (given (iu/clauses {"_sort" "a,b" "c" "d"}) + ::anom/category := ::anom/unsupported + ::anom/message := "More than one sort parameter is unsupported."))) + (testing "removes keys" (are [key] (empty? (iu/clauses {key "bar"})) "_foo" diff --git a/modules/page-store-cassandra/src/blaze/page_store/cassandra.clj b/modules/page-store-cassandra/src/blaze/page_store/cassandra.clj index de23e2457..ee5dcbb21 100644 --- a/modules/page-store-cassandra/src/blaze/page_store/cassandra.clj +++ b/modules/page-store-cassandra/src/blaze/page_store/cassandra.clj @@ -68,8 +68,8 @@ (defn- bind-put [statement token clauses] (let [content (codec/encode clauses)] - (prom/observe! clauses-bytes (bb/capacity content)) - (cass/bind statement token content))) + (prom/observe! clauses-bytes (alength content)) + (cass/bind statement token (bb/wrap content)))) (defn- map-execute-put-error [token clauses e] diff --git a/modules/page-store-cassandra/src/blaze/page_store/cassandra/codec.clj b/modules/page-store-cassandra/src/blaze/page_store/cassandra/codec.clj index 4575bb306..1d8730ebf 100644 --- a/modules/page-store-cassandra/src/blaze/page_store/cassandra/codec.clj +++ b/modules/page-store-cassandra/src/blaze/page_store/cassandra/codec.clj @@ -1,7 +1,6 @@ (ns blaze.page-store.cassandra.codec (:require [blaze.anomaly :as ba] - [blaze.byte-buffer :as bb] [cognitect.anomalies :as anom] [jsonista.core :as j]) (:import @@ -12,6 +11,24 @@ (j/object-mapper {:factory (CBORFactory.)})) +(defmulti decode-sort-clause (fn [[key]] key)) + + +(defmethod decode-sort-clause "_sort" + [[_key param direction]] [:sort param (keyword direction)]) + + +(defmethod decode-sort-clause :default + [clause] clause) + + +(defn- decode-sort-clauses + "Decodes the strings in sort clauses to keywords because CBOR can't store + keywords." + [clauses] + (mapv decode-sort-clause clauses)) + + (defn- parse-msg [token cause-msg] (format "Error while parsing resource content with token `%s`: %s" token cause-msg)) @@ -19,11 +36,30 @@ (defn decode [bytes token] (-> (ba/try-all ::anom/incorrect (j/read-value bytes cbor-object-mapper)) + (ba/map decode-sort-clauses) (ba/exceptionally #(assoc % ::anom/message (parse-msg token (::anom/message %)) :blaze.page-store/token token)))) +(defmulti encode-sort-clause (fn [[key]] key)) + + +(defmethod encode-sort-clause :sort + [[_key param direction]] ["_sort" param (name direction)]) + + +(defmethod encode-sort-clause :default + [clause] clause) + + +(defn- encode-sort-clauses + "Encodes the keywords in sort clauses to strings because CBOR can't store + keywords." + [clauses] + (mapv encode-sort-clause clauses)) + + (defn encode [clauses] - (bb/wrap (j/write-value-as-bytes clauses cbor-object-mapper))) + (j/write-value-as-bytes (encode-sort-clauses clauses) cbor-object-mapper)) diff --git a/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_spec.clj b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_spec.clj index 773a80117..55a9174e8 100644 --- a/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_spec.clj +++ b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_spec.clj @@ -1,7 +1,6 @@ (ns blaze.page-store.cassandra.codec-spec (:require [blaze.anomaly-spec] - [blaze.byte-buffer :as bb] [blaze.page-store :as page-store] [blaze.page-store.cassandra.codec :as codec] [blaze.page-store.spec] @@ -17,4 +16,4 @@ (s/fdef codec/encode :args (s/cat :clauses :blaze.db.query/clauses) - :ret bb/byte-buffer?) + :ret bytes?) diff --git a/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj new file mode 100644 index 000000000..c9e9a786e --- /dev/null +++ b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj @@ -0,0 +1,31 @@ +(ns blaze.page-store.cassandra.codec-test + (:require + [blaze.page-store.cassandra.codec :as codec] + [blaze.spec] + [blaze.test-util :refer [satisfies-prop]] + [clojure.spec.alpha :as s] + [clojure.spec.test.alpha :as st] + [clojure.test :as test :refer [deftest]] + [clojure.test.check.properties :as prop] + [cuerdas.core :as c-str])) + + +(st/instrument) + + +(defn- fixture [f] + (st/instrument) + (f) + (st/unstrument)) + + +(test/use-fixtures :each fixture) + + +(def token (c-str/repeat "A" 32)) + + +(deftest encode-decode-test + (satisfies-prop 100 + (prop/for-all [clauses (s/gen :blaze.db.query/clauses)] + (= clauses (codec/decode (codec/encode clauses) token))))) diff --git a/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj b/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj index fb6eb8c58..dde3cf6cb 100644 --- a/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj +++ b/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj @@ -1,6 +1,7 @@ (ns blaze.page-store.cassandra-test (:require [blaze.async.comp :as ac] + [blaze.byte-buffer :as bb] [blaze.cassandra :as cass] [blaze.cassandra-spec] [blaze.page-store :as page-store] @@ -12,7 +13,7 @@ [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [integrant.core :as ig] [taoensso.timbre :as log]) (:import @@ -64,7 +65,7 @@ (def clauses [["active" "true"]]) -(def token (str (str/repeat "A" 31) "B")) +(def token (str (c-str/repeat "A" 31) "B")) (deftest put-test @@ -74,7 +75,7 @@ cass/prepare prepare cass/bind (fn [prepared-statement & params] (assert (= ::prepared-put-statement prepared-statement)) - (assert (= [token (codec/encode clauses)] params)) + (assert (= [token (bb/wrap (codec/encode clauses))] params)) ::bound-put-statement) cass/execute (fn [session statement] (assert (= ::session session)) diff --git a/modules/page-store/src/blaze/page_store/local.clj b/modules/page-store/src/blaze/page_store/local.clj index dfe8d0e54..29222e664 100644 --- a/modules/page-store/src/blaze/page_store/local.clj +++ b/modules/page-store/src/blaze/page_store/local.clj @@ -11,7 +11,7 @@ [java-time :as time] [taoensso.timbre :as log]) (:import - [com.github.benmanes.caffeine.cache Caffeine Cache Weigher])) + [com.github.benmanes.caffeine.cache Cache Caffeine Weigher])) (set! *warn-on-reflection* true) @@ -28,9 +28,11 @@ (or (.getIfPresent db token) (ba/not-found (not-found-msg token))))) (-put [_ clauses] - (let [token (token/generate secure-rng)] - (.put db token clauses) - (ac/completed-future token)))) + (if (empty? clauses) + (ac/completed-future (ba/incorrect "Clauses should not be empty.")) + (let [token (token/generate secure-rng)] + (.put db token clauses) + (ac/completed-future token))))) (def ^:private ^:const ^long token-weigh 72) diff --git a/modules/page-store/test/blaze/page_store/local_test.clj b/modules/page-store/test/blaze/page_store/local_test.clj index 3daedae0b..5af0c85f7 100644 --- a/modules/page-store/test/blaze/page_store/local_test.clj +++ b/modules/page-store/test/blaze/page_store/local_test.clj @@ -9,7 +9,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] - [cuerdas.core :as str] + [cuerdas.core :as c-str] [integrant.core :as ig] [taoensso.timbre :as log])) @@ -32,7 +32,7 @@ :blaze.test/fixed-rng {}}) -(def token (str (str/repeat "A" 31) "B")) +(def token (str (c-str/repeat "A" 31) "B")) (deftest init-test @@ -67,17 +67,17 @@ (is (= [["active" "true"]] @(page-store/get store token)))) (testing "not-found" - (given-failed-future (page-store/get store (str/repeat "B" 32)) + (given-failed-future (page-store/get store (c-str/repeat "B" 32)) ::anom/category := ::anom/not-found - ::anom/message := (format "Clauses of token `%s` not found." (str/repeat "B" 32)))))) + ::anom/message := (format "Clauses of token `%s` not found." (c-str/repeat "B" 32)))))) (deftest put-test (with-system [{store :blaze.page-store/local} system] (testing "shall not be called with an empty list of clauses" - (given-thrown (page-store/put! store []) - ::s/failure := :instrument - [::s/problems 0 :val] := [])) + (given-failed-future (page-store/put! store []) + ::anom/category := ::anom/incorrect + ::anom/message := "Clauses should not be empty.")) (testing "returns a token" (is (= token @(page-store/put! store [["active" "true"]])))))) diff --git a/modules/page-store/test/blaze/page_store/weigh_test.clj b/modules/page-store/test/blaze/page_store/weigh_test.clj index 0f943ba18..2035d95b3 100644 --- a/modules/page-store/test/blaze/page_store/weigh_test.clj +++ b/modules/page-store/test/blaze/page_store/weigh_test.clj @@ -2,7 +2,7 @@ (:require [blaze.page-store.weigh :as w] [clojure.test :refer [are deftest testing]] - [cuerdas.core :as str])) + [cuerdas.core :as c-str])) (deftest weigh-test @@ -10,8 +10,8 @@ (are [s size] (= size (w/weigh s)) "" 40 "a" 48 - (str/repeat "a" 8) 48 - (str/repeat "a" 9) 56)) + (c-str/repeat "a" 8) 48 + (c-str/repeat "a" 9) 56)) (testing "Vector" (are [v size] (= size (w/weigh v)) diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index cd6940c35..9c98ffd5a 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -141,7 +141,11 @@ (some? transaction-handler) (conj {:code #fhir/code"transaction"} {:code #fhir/code"batch"}) (some? history-system-handler) - (conj {:code #fhir/code"history-system"}))}]}] + (conj {:code #fhir/code"history-system"})) + :searchParam + [{:name "_sort" + :type "special" + :documentation "Only `_lastUpdated` and `-_lastUpdated` is supported at the moment."}]}]}] (fn [{:blaze/keys [base-url]}] (ac/completed-future (ring/response diff --git a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj index 4a006c77c..92901a1a9 100644 --- a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj +++ b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj @@ -60,7 +60,10 @@ [:implementation :url] := #fhir/url"base-url-131713" :fhirVersion := #fhir/code"4.0.1" :format := [#fhir/code"application/fhir+json" - #fhir/code"application/xml+json"])) + #fhir/code"application/xml+json"] + [:rest 0 :searchParam 0 :name] := "_sort" + [:rest 0 :searchParam 0 :type] := "special" + [:rest 0 :searchParam 0 :documentation] := "Only `_lastUpdated` and `-_lastUpdated` is supported at the moment.")) (testing "minimal config + search-system" (given diff --git a/modules/spec/src/blaze/spec.clj b/modules/spec/src/blaze/spec.clj index 7bb193ae4..26f813d2f 100644 --- a/modules/spec/src/blaze/spec.clj +++ b/modules/spec/src/blaze/spec.clj @@ -40,12 +40,29 @@ ;; ---- DB ------------------------------------------------------------------ -(s/def :blaze.db.query/clause +(s/def :blaze.db.query/search-clause (s/coll-of string? :kind vector? :min-count 2)) +(s/def :blaze.db.query/search-clauses + (s/coll-of :blaze.db.query/search-clause :kind vector?)) + + +(s/def :blaze.db.query/sort-direction + #{:asc :desc}) + + +(s/def :blaze.db.query/sort-clause + (s/tuple #{:sort} string? :blaze.db.query/sort-direction)) + + +(s/def :blaze.db.query/clause + (s/or :search-clause :blaze.db.query/search-clause + :sort-clause :blaze.db.query/sort-clause)) + + (s/def :blaze.db.query/clauses - (s/coll-of :blaze.db.query/clause :min-count 1)) + (s/coll-of :blaze.db.query/clause :kind vector?)) From 3778a0e62c8095e2325e396c471b0b30c0bf0192 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 4 Aug 2022 20:29:26 +0200 Subject: [PATCH 028/124] Add Important Eye Candy at Startup --- src/blaze/core.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/blaze/core.clj b/src/blaze/core.clj index e8069f4d1..c371b9064 100644 --- a/src/blaze/core.clj +++ b/src/blaze/core.clj @@ -66,5 +66,5 @@ (log/info "JVM version:" (System/getProperty "java.version")) (log/info "Maximum available memory:" (max-memory) "MiB") (log/info "Number of available processors:" (available-processors)) - (log/info "Successfully started Blaze version" version "in" + (log/info "Successfully started \uD83D\uDD25 Blaze version" version "in" (duration-s start) "seconds"))) From fc91629491ff7881b721d5319e29d20d05a658d7 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 9 Aug 2022 21:24:18 +0200 Subject: [PATCH 029/124] Update Dependencies --- .github/workflows/build.yml | 14 +++++++------- modules/cql/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/rest-api/deps.edn | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1e796a607..55bb8ee94 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup clj-kondo uses: DeLaGuardo/setup-clj-kondo@master with: - version: '2022.06.22' + version: '2022.08.03' - name: Check out Git repository uses: actions/checkout@v3 @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 @@ -604,7 +604,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 @@ -936,7 +936,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1149' + cli: '1.11.1.1155' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 6fefb0ce7..87017d26f 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -37,7 +37,7 @@ {:local/root "../db-stub"} org.clojure/data.xml - {:mvn/version "0.2.0-alpha6"}}} + {:mvn/version "0.2.0-alpha7"}}} :kaocha {:extra-deps diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index a521bb1fc..0faa427f8 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -36,7 +36,7 @@ :git/sha "5c86612d50ab523e48a3937d9d437116a1964bd6"} org.clojure/data.xml - {:mvn/version "0.2.0-alpha6"}} + {:mvn/version "0.2.0-alpha7"}} :aliases {:test diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 101f860fc..26d3e2658 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -20,7 +20,7 @@ :exclusions [com.cognitect/transit-clj]} org.clojure/data.xml - {:mvn/version "0.2.0-alpha6"}} + {:mvn/version "0.2.0-alpha7"}} :aliases {:test From a0cb701d1b911c7f3fed416d13b5ae649bff034b Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 6 Sep 2022 15:12:25 +0200 Subject: [PATCH 030/124] Update Dependencies --- deps.edn | 6 +++--- modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 4 ++-- modules/cassandra/deps.edn | 4 ++-- modules/cql/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 4 ++-- modules/rocksdb/deps.edn | 2 +- modules/test-util/deps.edn | 2 +- 9 files changed, 14 insertions(+), 14 deletions(-) diff --git a/deps.edn b/deps.edn index 5f2415af5..170d0fff8 100644 --- a/deps.edn +++ b/deps.edn @@ -41,7 +41,7 @@ {:mvn/version "1.3.6"} org.slf4j/slf4j-nop - {:mvn/version "1.7.36"}} + {:mvn/version "2.0.0"}} :aliases {:depstar @@ -80,10 +80,10 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "1.9.874"} + {:mvn/version "2.0.895"} org.slf4j/slf4j-nop - {:mvn/version "1.7.36"}} + {:mvn/version "2.0.0"}} :main-opts ["-m" "antq.core" diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index cfd34e3db..eae988c36 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.4"}} + {:mvn/version "3.21.5"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 3599c6aac..5eba8d9a2 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.4"} + {:mvn/version "3.21.5"} com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.3"}}} + {:mvn/version "2.13.4"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 5b696bfa7..7047f0226 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -7,11 +7,11 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.3"} + {:mvn/version "2.13.4"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.79.Final"}} + {:mvn/version "4.1.80.Final"}} :aliases {:test diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 87017d26f..1cb16ed4c 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -5,7 +5,7 @@ {:local/root "../db"} com.fasterxml.jackson.module/jackson-module-jaxb-annotations - {:mvn/version "2.13.3"} + {:mvn/version "2.13.4"} info.cqframework/cql-to-elm {:mvn/version "1.5.10" diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 0faa427f8..efe250d0e 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -20,7 +20,7 @@ {:mvn/version "31.1-jre"} com.fasterxml.jackson.dataformat/jackson-dataformat-cbor - {:mvn/version "2.13.3"} + {:mvn/version "2.13.4"} com.taoensso/timbre {:mvn/version "5.2.1"} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index d3d54f3dd..a4af30835 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -8,10 +8,10 @@ [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor]} com.fasterxml.jackson.core/jackson-core - {:mvn/version "2.13.3"} + {:mvn/version "2.13.4"} com.fasterxml.jackson.dataformat/jackson-dataformat-smile - {:mvn/version "2.13.3"} + {:mvn/version "2.13.4"} hato/hato {:mvn/version "0.8.2"}} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index e9c2ad9e2..fd1809f80 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.4.4"}} + {:mvn/version "7.5.3"}} :aliases {:test diff --git a/modules/test-util/deps.edn b/modules/test-util/deps.edn index d39e4bdb4..79b627c63 100644 --- a/modules/test-util/deps.edn +++ b/modules/test-util/deps.edn @@ -25,4 +25,4 @@ {:mvn/version "1.1.1"} org.slf4j/slf4j-nop - {:mvn/version "1.7.36"}}} + {:mvn/version "2.0.0"}}} From 697caa815252481e247e0a7752c70cd5c8e25726 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 8 Sep 2022 17:11:39 +0200 Subject: [PATCH 031/124] Add Some CQL Tests --- .../evaluate_measure/measure_test.clj | 7 +- .../q42-medication-2-data.json | 155 ++++++++++++++++++ .../q42-medication-2-query.cql | 16 ++ .../q43-medication-3-data.json | 155 ++++++++++++++++++ .../q43-medication-3-query.cql | 17 ++ 5 files changed, 348 insertions(+), 2 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index e2cebb398..c8655ece7 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -432,7 +432,9 @@ "q36-parameter" 1 "q37-overlaps" 3 "q38-di-surv" 2 - "q39-social-sec-num" 1) + "q39-social-sec-num" 1 + "q42-medication-2" 2 + "q43-medication-3" 2) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -614,5 +616,6 @@ (comment (log/set-level! :debug) - (evaluate "q41-specimen-multi-stratifier") + (evaluate "q42-medication-2") + (evaluate "q43-medication-3") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json new file mode 100644 index 000000000..bf7a8ea2b --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json @@ -0,0 +1,155 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "2" + }, + "request": { + "method": "PUT", + "url": "Patient/2" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "0", + "medicationReference": { + "reference": "Medication/0" + }, + "subject": { + "reference": "Patient/0" + } + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/0" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "1", + "medicationReference": { + "reference": "Medication/1" + }, + "subject": { + "reference": "Patient/1" + } + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/1" + } + }, + { + "resource": { + "resourceType": "Medication", + "id": "0", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L01AX03" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Medication/0" + } + }, + { + "resource": { + "resourceType": "Medication", + "id": "1", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L01AX03" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Medication/1" + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql new file mode 100644 index 000000000..a4f1a7d8f --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql @@ -0,0 +1,16 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem atc: 'http://fhir.de/CodeSystem/dimdi/atc' + +context Unfiltered + +define "Temozolomid Refs": + [Medication: Code 'L01AX03' from atc] M return 'Medication/' + M.id + +context Patient + +define InInitialPopulation: + exists from [MedicationStatement] M + where M.medication.reference in "Temozolomid Refs" diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json new file mode 100644 index 000000000..bf7a8ea2b --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json @@ -0,0 +1,155 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "2" + }, + "request": { + "method": "PUT", + "url": "Patient/2" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "0", + "medicationReference": { + "reference": "Medication/0" + }, + "subject": { + "reference": "Patient/0" + } + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/0" + } + }, + { + "resource": { + "resourceType": "MedicationStatement", + "id": "1", + "medicationReference": { + "reference": "Medication/1" + }, + "subject": { + "reference": "Patient/1" + } + }, + "request": { + "method": "PUT", + "url": "MedicationStatement/1" + } + }, + { + "resource": { + "resourceType": "Medication", + "id": "0", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L01AX03" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Medication/0" + } + }, + { + "resource": { + "resourceType": "Medication", + "id": "1", + "code": { + "coding": [ + { + "system": "http://fhir.de/CodeSystem/dimdi/atc", + "code": "L01AX03" + } + ] + } + }, + "request": { + "method": "PUT", + "url": "Medication/1" + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql new file mode 100644 index 000000000..42d49b984 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql @@ -0,0 +1,17 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem atc: 'http://fhir.de/CodeSystem/dimdi/atc' + +context Unfiltered + +define Temozolomid: + [Medication: Code 'L01AX03' from atc] + +context Patient + +define InInitialPopulation: + exists from [MedicationStatement] MS + with Temozolomid M + such that MS.medication.reference = 'Medication/' + M.id From edf773cd6615f3dd73c1aa60e4e2c2cb914d45a1 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 12 Sep 2022 19:38:42 +0200 Subject: [PATCH 032/124] Update Dependencies --- .github/workflows/build.yml | 2 +- modules/cassandra/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- modules/server/deps.edn | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 55bb8ee94..36e150979 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup clj-kondo uses: DeLaGuardo/setup-clj-kondo@master with: - version: '2022.08.03' + version: '2022.09.08' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 7047f0226..b1dce9174 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.80.Final"}} + {:mvn/version "4.1.81.Final"}} :aliases {:test diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index 989004703..847e6f980 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.2.1"}} + {:mvn/version "3.2.2"}} :aliases {:test diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index 896ccc97f..dc0c19b7a 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -15,7 +15,7 @@ {:mvn/version "0.5.18"} ring/ring-core - {:mvn/version "1.9.5" + {:mvn/version "1.9.6" :exclusions [commons-fileupload/commons-fileupload crypto-equality/crypto-equality diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 238dd9a9d..794f1f4c7 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -9,7 +9,7 @@ {:mvn/version "9.4.48.v20220622"} ring/ring-jetty-adapter - {:mvn/version "1.9.5" + {:mvn/version "1.9.6" :exclusions [clj-time/clj-time commons-fileupload/commons-fileupload From d33d3403db09093f2c7eccd81e2428aad61b6cb8 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 14 Sep 2022 21:17:36 +0200 Subject: [PATCH 033/124] Allow to Set Separate WAL Dirs --- docs/deployment/environment-variables.md | 4 ++++ .../rocksdb/src/blaze/db/kv/rocksdb/impl.clj | 7 ++++-- .../rocksdb/src/blaze/db/kv/rocksdb/spec.clj | 7 +++++- .../test/blaze/db/kv/rocksdb/impl_test.clj | 5 +++- resources/blaze.edn | 24 +++++++++---------- 5 files changed, 30 insertions(+), 17 deletions(-) diff --git a/docs/deployment/environment-variables.md b/docs/deployment/environment-variables.md index e5ea3415f..a736cbb71 100644 --- a/docs/deployment/environment-variables.md +++ b/docs/deployment/environment-variables.md @@ -20,8 +20,11 @@ The three database directories must not exist on the first start of Blaze and wi | Name | Default | Since | Depr ¹ | Description | |:-------------------------------|:--------------|:------|:-------|:-------------------------------------------------------------------------------------------------------------------------------------------------| | INDEX_DB_DIR | index ² | v0.8 | | The directory were the index database files are stored. | +| INDEX_DB_WAL_DIR | \ | v0.18 | | The directory were the index database write ahead log (WAL) files are stored. Empty means same dir as database files. | | TRANSACTION_DB_DIR | transaction ² | v0.8 | | The directory were the transaction log files are stored. This directory must not exist on the first start of Blaze and will be created by Blaze. | +| TRANSACTION_DB_WAL_DIR | \ | v0.18 | | The directory were the transaction log write ahead log (WAL) files are stored. Empty means same dir as database files. | | RESOURCE_DB_DIR | resource ² | v0.8 | | The directory were the resource files are stored. This directory must not exist on the first start of Blaze and will be created by | +| RESOURCE_DB_WAL_DIR | \ | v0.18 | | The directory were the resource write ahead log (WAL) files are stored. Empty means same dir as database files. | | DB_BLOCK_CACHE_SIZE | 128 | v0.8 | | The size of the [block cache][2] of the DB in MB. | | DB_RESOURCE_CACHE_SIZE | 100000 | v0.8 | | The size of the resource cache of the DB in number of resources. | | DB_MAX_BACKGROUND_JOBS | 4 | v0.8 | | The maximum number of the [background jobs][3] used for DB compactions. | @@ -38,6 +41,7 @@ The distributed storage variant only uses the index database locally. | Name | Default | Since | Depr ¹ | Description | |:-----------------------------------|:---------------|:------|:-------|:-----------------------------------------------------------------------------------------------------------------------------------------------------| | INDEX_DB_DIR | index ² | v0.8 | | The directory were the index database files are stored. | +| INDEX_DB_WAL_DIR | \ | v0.18 | | The directory were the index database write ahead log (WAL) files are stored. Empty means same dir as database files. | | DB_BLOCK_CACHE_SIZE | 128 | v0.8 | | The size of the [block cache][2] of the DB in MB. | | DB_RESOURCE_CACHE_SIZE | 100000 | v0.8 | | The size of the resource cache of the DB in number of resources. | | DB_MAX_BACKGROUND_JOBS | 4 | v0.8 | | The maximum number of the [background jobs][3] used for DB compactions. | diff --git a/modules/rocksdb/src/blaze/db/kv/rocksdb/impl.clj b/modules/rocksdb/src/blaze/db/kv/rocksdb/impl.clj index 0404ee4e6..b71ab726a 100644 --- a/modules/rocksdb/src/blaze/db/kv/rocksdb/impl.clj +++ b/modules/rocksdb/src/blaze/db/kv/rocksdb/impl.clj @@ -78,12 +78,15 @@ (defn db-options ^DBOptions [stats - {:keys [max-background-jobs + {:keys [wal-dir + max-background-jobs compaction-readahead-size] - :or {max-background-jobs 2 + :or {wal-dir "" + max-background-jobs 2 compaction-readahead-size 0}}] (doto (DBOptions.) (.setStatistics ^Statistics stats) + (.setWalDir (str wal-dir)) (.setMaxBackgroundJobs (long max-background-jobs)) (.setCompactionReadaheadSize (long compaction-readahead-size)) (.setEnablePipelinedWrite true) diff --git a/modules/rocksdb/src/blaze/db/kv/rocksdb/spec.clj b/modules/rocksdb/src/blaze/db/kv/rocksdb/spec.clj index da592526f..1174d81d6 100644 --- a/modules/rocksdb/src/blaze/db/kv/rocksdb/spec.clj +++ b/modules/rocksdb/src/blaze/db/kv/rocksdb/spec.clj @@ -23,6 +23,10 @@ #(instance? Statistics %)) +(s/def ::db-options/wal-dir + string?) + + (s/def ::db-options/max-background-jobs nat-int?) @@ -32,7 +36,8 @@ (s/def :blaze.db.kv.rocksdb/db-options - (s/keys :opt-un [::db-options/max-background-jobs + (s/keys :opt-un [::db-options/wal-dir + ::db-options/max-background-jobs ::db-options/compaction-readahead-size])) diff --git a/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj b/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj index 5de89f18c..65761eb65 100644 --- a/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj +++ b/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj @@ -72,7 +72,8 @@ DBOptions (datafy [options] - {:max-background-jobs (.maxBackgroundJobs options) + {:wal-dir (.walDir options) + :max-background-jobs (.maxBackgroundJobs options) :compaction-readahead-size (.compactionReadaheadSize options) :enable-pipelined-write (.enablePipelinedWrite options) :create-if-missing (.createIfMissing options) @@ -144,6 +145,7 @@ (deftest db-options-test (testing "with defaults" (given (datafy/datafy (impl/db-options (Statistics.) nil)) + :wal-dir := "" :max-background-jobs := 2 :compaction-readahead-size := 0 :enable-pipelined-write := true @@ -154,6 +156,7 @@ (given (datafy/datafy (impl/db-options (Statistics.) {key value})) key := value) + :wal-dir "wal" :max-background-jobs 4 :compaction-readahead-size 10))) diff --git a/resources/blaze.edn b/resources/blaze.edn index 6fbf37a09..b696db97e 100644 --- a/resources/blaze.edn +++ b/resources/blaze.edn @@ -351,7 +351,8 @@ :block-cache #blaze/ref :blaze.db.kv.rocksdb/block-cache :stats #blaze/ref :blaze.db.index-kv-store/stats :opts - {:max-background-jobs + {:wal-dir #blaze/cfg ["INDEX_DB_WAL_DIR" string? ""] + :max-background-jobs #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] :compaction-readahead-size #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} @@ -457,10 +458,9 @@ :block-cache #blaze/ref :blaze.db.kv.rocksdb/block-cache :stats #blaze/ref :blaze.db.transaction-kv-store/stats :opts - {:max-background-jobs - #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] - :compaction-readahead-size - #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} + {:wal-dir #blaze/cfg ["TRANSACTION_DB_WAL_DIR" string? ""] + :max-background-jobs #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] + :compaction-readahead-size #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} :column-families {:default {:write-buffer-size-in-mb 8 @@ -493,10 +493,9 @@ :block-cache #blaze/ref :blaze.db.kv.rocksdb/block-cache :stats #blaze/ref :blaze.db.resource-kv-store/stats :opts - {:max-background-jobs - #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] - :compaction-readahead-size - #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} + {:wal-dir #blaze/cfg ["RESOURCE_DB_WAL_DIR" string? ""] + :max-background-jobs #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] + :compaction-readahead-size #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} :column-families {:default {:write-buffer-size-in-mb 64 @@ -545,10 +544,9 @@ :block-cache #blaze/ref :blaze.db.kv.rocksdb/block-cache :stats #blaze/ref :blaze.db.index-kv-store/stats :opts - {:max-background-jobs - #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] - :compaction-readahead-size - #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} + {:wal-dir #blaze/cfg ["INDEX_DB_WAL_DIR" string? ""] + :max-background-jobs #blaze/cfg ["DB_MAX_BACKGROUND_JOBS" int? 4] + :compaction-readahead-size #blaze/cfg ["DB_COMPACTION_READAHEAD_SIZE" int? 0]} :column-families {:search-param-value-index {:write-buffer-size-in-mb 64 From dfc7eb4195dc8351e8f33449881dce3bc399b8f2 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 21 Sep 2022 16:38:18 +0200 Subject: [PATCH 034/124] Add Documentation Index Files --- docs/README.md | 14 ++++++++++++++ docs/deployment/README.md | 4 ++++ 2 files changed, 18 insertions(+) create mode 100644 docs/README.md diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..4f97e6616 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,14 @@ +# Documentation + +* [Deployment](deployment/README.md) +* [FHIR RESTful API](api.md) +* [Importing Data](importing-data.md) +* [Sync Data](data-sync.md) +* [Conformance](conformance.md) +* [Performance](performance.md) +* [Tuning Guide](tuning-guide.md) +* [Tooling](tooling.md) +* [CQL Queries](cql-queries.md) +* [Authentication](authentication.md) +* [Architecture](architecture.md) +* [Implementation](implementation/README.md) diff --git a/docs/deployment/README.md b/docs/deployment/README.md index 5db42e3f8..0cc658d74 100644 --- a/docs/deployment/README.md +++ b/docs/deployment/README.md @@ -4,3 +4,7 @@ For production ready deployments, there are two options: * [Docker Deployment](docker-deployment.md) * [Manual Deployment](manual-deployment.md) + +## Jump To + +* [Environment Variables](environment-variables.md) From eb69fed1e2ae109802089559be3953d9055b7591 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 21 Sep 2022 19:53:18 +0200 Subject: [PATCH 035/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ deps.edn | 8 ++++---- modules/anomaly/deps.edn | 2 +- modules/async/deps.edn | 2 +- modules/byte-buffer/deps.edn | 4 ++-- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 6 +++--- modules/coll/deps.edn | 2 +- modules/cql/deps.edn | 4 ++-- modules/db-resource-store-cassandra/deps.edn | 2 +- modules/db-resource-store/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 4 ++-- modules/db-tx-log/deps.edn | 2 +- modules/db/deps.edn | 2 +- modules/executor/deps.edn | 2 +- modules/extern-terminology-service/deps.edn | 2 +- modules/fhir-client/deps.edn | 2 +- modules/fhir-path/deps.edn | 2 +- modules/fhir-structure/deps.edn | 4 ++-- modules/http-client/deps.edn | 2 +- modules/interaction/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/kv/deps.edn | 2 +- modules/luid/deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/module-base/deps.edn | 2 +- modules/openid-auth/deps.edn | 2 +- modules/operation-measure-evaluate-measure/deps.edn | 2 +- modules/page-store-cassandra/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- modules/rest-api/deps.edn | 4 ++-- modules/rest-util/deps.edn | 2 +- modules/rocksdb/deps.edn | 2 +- modules/scheduler/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/test-util/deps.edn | 2 +- modules/thread-pool-executor-collector/deps.edn | 2 +- 37 files changed, 52 insertions(+), 52 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 36e150979..181d24f03 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 @@ -604,7 +604,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 @@ -936,7 +936,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1155' + cli: '1.11.1.1165' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index 170d0fff8..db40192e7 100644 --- a/deps.edn +++ b/deps.edn @@ -41,7 +41,7 @@ {:mvn/version "1.3.6"} org.slf4j/slf4j-nop - {:mvn/version "2.0.0"}} + {:mvn/version "2.0.2"}} :aliases {:depstar @@ -66,7 +66,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} @@ -80,10 +80,10 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.0.895"} + {:mvn/version "2.1.927"} org.slf4j/slf4j-nop - {:mvn/version "2.0.0"}} + {:mvn/version "2.0.2"}} :main-opts ["-m" "antq.core" diff --git a/modules/anomaly/deps.edn b/modules/anomaly/deps.edn index a5c77d200..f6a758cd4 100644 --- a/modules/anomaly/deps.edn +++ b/modules/anomaly/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/async/deps.edn b/modules/async/deps.edn index 7b33db4bf..f643e0bd9 100644 --- a/modules/async/deps.edn +++ b/modules/async/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index eae988c36..58b1554a5 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.5"}} + {:mvn/version "3.21.6"}} :aliases {:test @@ -13,6 +13,6 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]}}} diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 5eba8d9a2..7eb0278a8 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.5"} + {:mvn/version "3.21.6"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.13.4"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index b1dce9174..c41592c3b 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -3,7 +3,7 @@ {:local/root "../async"} com.datastax.oss/java-driver-core - {:mvn/version "4.14.1"} + {:mvn/version "4.15.0"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.81.Final"}} + {:mvn/version "4.1.82.Final"}} :aliases {:test @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index 392e3250e..a7b3e14ab 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -8,7 +8,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 1cb16ed4c..76abb158e 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -37,12 +37,12 @@ {:local/root "../db-stub"} org.clojure/data.xml - {:mvn/version "0.2.0-alpha7"}}} + {:mvn/version "0.2.0-alpha8"}}} :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store-cassandra/deps.edn b/modules/db-resource-store-cassandra/deps.edn index f32ae8aa1..27763a9da 100644 --- a/modules/db-resource-store-cassandra/deps.edn +++ b/modules/db-resource-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store/deps.edn b/modules/db-resource-store/deps.edn index 789fc434c..fa9bbd129 100644 --- a/modules/db-resource-store/deps.edn +++ b/modules/db-resource-store/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index 847e6f980..ff78979cd 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.2.2"}} + {:mvn/version "3.2.3"}} :aliases {:test @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index 0a3131c00..13b19c714 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db/deps.edn b/modules/db/deps.edn index 20e57ae04..9f817b9e0 100644 --- a/modules/db/deps.edn +++ b/modules/db/deps.edn @@ -52,7 +52,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index 1784baf77..3110a2f5c 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -9,7 +9,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/extern-terminology-service/deps.edn b/modules/extern-terminology-service/deps.edn index 82e3dd52f..6e3da4f8f 100644 --- a/modules/extern-terminology-service/deps.edn +++ b/modules/extern-terminology-service/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index 8a8549cc5..246e5ab35 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -31,7 +31,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 42cd9d7f6..5c4cdebf7 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index efe250d0e..07d7bc36b 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -36,7 +36,7 @@ :git/sha "5c86612d50ab523e48a3937d9d437116a1964bd6"} org.clojure/data.xml - {:mvn/version "0.2.0-alpha7"}} + {:mvn/version "0.2.0-alpha8"}} :aliases {:test @@ -49,7 +49,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index a4af30835..a95359a77 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/interaction/deps.edn b/modules/interaction/deps.edn index f5f0d76f9..88e8e6f89 100644 --- a/modules/interaction/deps.edn +++ b/modules/interaction/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 4d6f00ded..58c6414b8 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -12,7 +12,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/kv/deps.edn b/modules/kv/deps.edn index 2471350c4..5906be934 100644 --- a/modules/kv/deps.edn +++ b/modules/kv/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index 4fbd19edb..24acbd1ed 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 5e7ad87cb..e342ad396 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/module-base/deps.edn b/modules/module-base/deps.edn index d566238e0..02ef0e1a5 100644 --- a/modules/module-base/deps.edn +++ b/modules/module-base/deps.edn @@ -10,4 +10,4 @@ :git/sha "32a46f5dca8a6b563a6dddf88bec887be3201b08"} prom-metrics/prom-metrics - {:mvn/version "0.6-alpha.6"}}} + {:mvn/version "0.6-alpha.7"}}} diff --git a/modules/openid-auth/deps.edn b/modules/openid-auth/deps.edn index c65dcf943..578e964a8 100644 --- a/modules/openid-auth/deps.edn +++ b/modules/openid-auth/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/operation-measure-evaluate-measure/deps.edn b/modules/operation-measure-evaluate-measure/deps.edn index cd80c40ce..b977bf8f4 100644 --- a/modules/operation-measure-evaluate-measure/deps.edn +++ b/modules/operation-measure-evaluate-measure/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store-cassandra/deps.edn b/modules/page-store-cassandra/deps.edn index 544553feb..09b762d35 100644 --- a/modules/page-store-cassandra/deps.edn +++ b/modules/page-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index 5e5dc8855..f2bc2ca1f 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 26d3e2658..9f84938f2 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -20,7 +20,7 @@ :exclusions [com.cognitect/transit-clj]} org.clojure/data.xml - {:mvn/version "0.2.0-alpha7"}} + {:mvn/version "0.2.0-alpha8"}} :aliases {:test @@ -33,7 +33,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index dc0c19b7a..86b1faaab 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -32,7 +32,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index fd1809f80..fc274b4ec 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/scheduler/deps.edn b/modules/scheduler/deps.edn index 3a31aff8e..af329531b 100644 --- a/modules/scheduler/deps.edn +++ b/modules/scheduler/deps.edn @@ -13,7 +13,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 794f1f4c7..ad23d8a5a 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -30,7 +30,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/test-util/deps.edn b/modules/test-util/deps.edn index 79b627c63..fcd58a07a 100644 --- a/modules/test-util/deps.edn +++ b/modules/test-util/deps.edn @@ -25,4 +25,4 @@ {:mvn/version "1.1.1"} org.slf4j/slf4j-nop - {:mvn/version "2.0.0"}}} + {:mvn/version "2.0.2"}}} diff --git a/modules/thread-pool-executor-collector/deps.edn b/modules/thread-pool-executor-collector/deps.edn index 4c153e64f..998a0d483 100644 --- a/modules/thread-pool-executor-collector/deps.edn +++ b/modules/thread-pool-executor-collector/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.69.1069"}} + {:mvn/version "1.70.1086"}} :main-opts ["-m" "kaocha.runner"]} From c8a80785e6e02a9230cfa35a850eb198a032f1c7 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 22 Sep 2022 13:28:55 +0200 Subject: [PATCH 036/124] Release v0.18.0 --- CHANGELOG.md | 11 +++++++++++ README.md | 6 +++--- docker-compose.yml | 2 +- docs/cql-queries.md | 2 +- docs/cql-queries/command-line.md | 2 +- docs/data-sync/docker-compose.yml | 2 +- docs/database/migration.md | 2 +- docs/deployment/distributed/docker-compose.yml | 4 ++-- docs/deployment/docker-deployment.md | 8 ++++---- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 14 files changed, 35 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fa18defe2..25a2a7783 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## v0.18.0 + +### New Features + +* Allow Population Basis Differ from Subject in Measures ([#768](https://github.com/samply/blaze/pull/768)) +* Implement Sorting by _lastUpdated ([#98](https://github.com/samply/blaze/issues/98)) +* Allow Metadata Requests in Batches ([#781](https://github.com/samply/blaze/pull/781)) +* Allow to Set Separate RocksDB WAL Dirs ([#791](https://github.com/samply/blaze/pull/791)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/36?closed=1). + ## v0.17.12 ### Security diff --git a/README.md b/README.md index 5d346eb4f..6c88fe64b 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.17.12][5] +Latest release: [v0.18.0][5] ## Quick Start @@ -24,7 +24,7 @@ In order to run Blaze just execute the following: ```sh docker volume create blaze-data -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.17 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 ``` Blaze will create multiple directories inside the `blaze-data` volume on its first start and use the same directories on subsequent starts. @@ -72,7 +72,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docker-compose.yml b/docker-compose.yml index 0183720bf..0861b0c04 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.2' services: blaze: - image: "samply/blaze:0.17" + image: "samply/blaze:0.18" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/cql-queries.md b/docs/cql-queries.md index 135dea1ab..b3bacef39 100644 --- a/docs/cql-queries.md +++ b/docs/cql-queries.md @@ -17,7 +17,7 @@ The most accessible way to create and execute CQL queries is to use the Quality If you don't already have Blaze running, you can read about how to do it in [Deployment](deployment/README.md). If you have Docker available just run: ``` -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.17 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 ``` Start the Quality Reporting UI. You should see an empty measure list. diff --git a/docs/cql-queries/command-line.md b/docs/cql-queries/command-line.md index 58b70d9e1..02f1a5de6 100644 --- a/docs/cql-queries/command-line.md +++ b/docs/cql-queries/command-line.md @@ -15,7 +15,7 @@ git clone https://github.com/samply/blaze.git If you don't already have Blaze running, you can read about how to do it in [Deployment](../deployment/README.md). If you have Docker available just run: ```sh -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.17 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 ``` ## Import some data diff --git a/docs/data-sync/docker-compose.yml b/docs/data-sync/docker-compose.yml index 172ff5e05..c2db92559 100644 --- a/docs/data-sync/docker-compose.yml +++ b/docs/data-sync/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.2' services: blaze: - image: "samply/blaze:0.17" + image: "samply/blaze:0.18" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/database/migration.md b/docs/database/migration.md index abf950f5f..6d9920cf6 100644 --- a/docs/database/migration.md +++ b/docs/database/migration.md @@ -22,7 +22,7 @@ backup of all the data Blaze has written to disk, **plan for a downtime**, delet Please start Blaze with a shell assuming that you use the volume `blaze-data`: ```sh -docker run -it -v blaze-data:/app/data samply/blaze:0.17 sh +docker run -it -v blaze-data:/app/data samply/blaze:0.18 sh ``` in that shell, go into `/app/data` and list all directories: diff --git a/docs/deployment/distributed/docker-compose.yml b/docs/deployment/distributed/docker-compose.yml index c7d71b348..f84d95b44 100644 --- a/docs/deployment/distributed/docker-compose.yml +++ b/docs/deployment/distributed/docker-compose.yml @@ -72,7 +72,7 @@ services: HEAP_NEWSIZE: "200M" blaze-1: - image: "samply/blaze:0.17" + image: "samply/blaze:0.18" hostname: "blaze-1" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" @@ -102,7 +102,7 @@ services: - cassandra-3 blaze-2: - image: "samply/blaze:0.17" + image: "samply/blaze:0.18" hostname: "blaze-2" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 551855f57..09d92e325 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -11,7 +11,7 @@ docker volume create blaze-data ## Blaze ```sh -docker run -d --name blaze -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.17 +docker run -d --name blaze -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 ``` Blaze should log something like this: @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.12 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.0 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.12" + "version": "0.18.0" } ``` @@ -61,7 +61,7 @@ A Docker Compose file looks like this: version: '3.2' services: blaze: - image: "samply/blaze:0.17" + image: "samply/blaze:0.18" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 3575975d4..9c72d2bb2 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.17.12). Look for `blaze-0.17.12-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.0). Look for `blaze-0.18.0-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.17.12-standalone.jar -m blaze.core +java -jar blaze-0.18.0-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.17.12-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.0-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.17.12-standalone.jar -m blaze.core +java -jar blaze-0.18.0-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.17.12 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.0 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.17.12" + "version": "0.18.0" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 9c98ffd5a..6e9de7b51 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-07-21" + :date #fhir/dateTime"2022-09-22" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index e47028531..36aa6ce0e 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.17.12 + 0.18.0 1.8 diff --git a/pom.xml b/pom.xml index b3f927d13..b2958132e 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.17.12 + 0.18.0 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 5fee64886..91f648882 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.17.12" + {:blaze/version "0.18.0" :blaze/clock {} From 4c01f314993bb7091972ffbc1b52da3bd39c8b02 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 22 Sep 2022 17:05:43 +0200 Subject: [PATCH 037/124] Uninstall wget because of CVE-2021-31879 --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 262bb8459..397600125 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM eclipse-temurin:17-jre RUN apt-get update && apt-get upgrade -y && \ - apt-get purge curl libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ + apt-get purge curl wget libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ apt-get autoremove -y && apt-get clean RUN mkdir -p /app/data && chown 1001:1001 /app/data From 49381c0a8ed7fecbe5104dc2558259e8afb724e4 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 4 Oct 2022 16:09:57 +0200 Subject: [PATCH 038/124] Add TNM-T CQL Test --- .../evaluate_measure/measure_test.clj | 5 +- .../evaluate_measure/q44-tnm-t-data.json | 215 ++++++++++++++++++ .../evaluate_measure/q44-tnm-t-query.cql | 13 ++ 3 files changed, 231 insertions(+), 2 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index c8655ece7..ed16ec5f5 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -434,7 +434,8 @@ "q38-di-surv" 2 "q39-social-sec-num" 1 "q42-medication-2" 2 - "q43-medication-3" 2) + "q43-medication-3" 2 + "q44-tnm-t" 1) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -617,5 +618,5 @@ (comment (log/set-level! :debug) (evaluate "q42-medication-2") - (evaluate "q43-medication-3") + (evaluate "q44-tnm-t") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json new file mode 100644 index 000000000..90ceb00ec --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json @@ -0,0 +1,215 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "request": { + "method": "PUT", + "url": "Observation/0" + }, + "resource": { + "code": { + "coding": [ + { + "code": "21908-9", + "system": "http://loinc.org" + } + ] + }, + "id": "0", + "meta": { + "profile": [ + "http://dktk.dkfz.de/fhir/StructureDefinition/onco-core-Observation-TNMc" + ] + }, + "resourceType": "Observation", + "subject": { + "reference": "Patient/0" + }, + "component": [ + { + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "21905-5" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://dktk.dkfz.de/fhir/onco/core/CodeSystem/TNMTCS", + "code": "0" + } + ] + } + } + ] + } + }, + { + "request": { + "method": "PUT", + "url": "Observation/1" + }, + "resource": { + "code": { + "coding": [ + { + "code": "21908-9", + "system": "http://loinc.org" + } + ] + }, + "id": "1", + "meta": { + "profile": [ + "http://dktk.dkfz.de/fhir/StructureDefinition/onco-core-Observation-TNMc" + ] + }, + "resourceType": "Observation", + "subject": { + "reference": "Patient/1" + }, + "component": [ + { + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "21905-5" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://dktk.dkfz.de/fhir/onco/core/CodeSystem/TNMTCS", + "code": "1" + } + ] + } + } + ] + } + }, + { + "request": { + "method": "PUT", + "url": "Observation/2" + }, + "resource": { + "code": { + "coding": [ + { + "code": "21908-9", + "system": "http://loinc.org" + } + ] + }, + "id": "2", + "meta": { + "profile": [ + "http://dktk.dkfz.de/fhir/StructureDefinition/onco-core-Observation-TNMc" + ] + }, + "resourceType": "Observation", + "subject": { + "reference": "Patient/1" + }, + "component": [ + { + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "21906-3" + } + ] + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "http://dktk.dkfz.de/fhir/onco/core/CodeSystem/TNMNCS", + "code": "0" + } + ] + } + } + ] + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql new file mode 100644 index 000000000..9169f7606 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql @@ -0,0 +1,13 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' +codesystem tnmt: 'http://dktk.dkfz.de/fhir/onco/core/CodeSystem/TNMTCS' + +context Patient + +define InInitialPopulation: + exists + from [Observation: Code '21908-9' from loinc] O + where O.component.where(code.coding contains Code '21905-5' from loinc).value.coding contains Code '0' from tnmt From 8ae8b390ec4882ab85fe5ee13791468079459461 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 4 Oct 2022 17:37:57 +0200 Subject: [PATCH 039/124] Update Dependencies --- deps.edn | 6 +++--- dev/blaze/dev.clj | 2 +- dev/blaze/dev/tx_log.clj | 2 +- modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 2 +- modules/cassandra/src/blaze/cassandra/config.clj | 2 +- modules/cassandra/test/blaze/cassandra/config_test.clj | 2 +- modules/cql/src/blaze/elm/date_time.clj | 2 +- modules/cql/src/blaze/elm/expression_spec.clj | 2 +- .../test/blaze/elm/compiler/date_time_operators_test.clj | 2 +- modules/db-stub/src/blaze/db/api_stub.clj | 2 +- modules/db-tx-log-kafka/deps.edn | 2 +- .../db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj | 2 +- modules/db-tx-log/src/blaze/db/tx_log_spec.clj | 2 +- modules/db-tx-log/test/blaze/db/tx_log_test.clj | 2 +- modules/db/src/blaze/db/node.clj | 2 +- modules/db/src/blaze/db/tx_log/local.clj | 2 +- modules/db/test-perf/blaze/db/api_test_perf.clj | 2 +- modules/db/test/blaze/db/test_util.clj | 2 +- modules/db/test/blaze/db/tx_log/local_test.clj | 2 +- .../test/blaze/fhir/spec/type/system_test.clj | 2 +- modules/http-client/test/blaze/http_client_test.clj | 2 +- .../test/blaze/interaction/history/instance_test.clj | 2 +- .../test/blaze/interaction/history/system_test.clj | 2 +- .../test/blaze/interaction/history/type_test.clj | 2 +- .../test/blaze/interaction/search_compartment_test.clj | 2 +- .../test/blaze/interaction/search_system_test.clj | 2 +- .../test/blaze/interaction/search_type_test.clj | 2 +- modules/luid/test/blaze/luid_test.clj | 2 +- modules/openid-auth/src/blaze/openid_auth.clj | 2 +- .../blaze/fhir/operation/evaluate_measure/cql_spec.clj | 2 +- modules/page-store/src/blaze/page_store/local.clj | 2 +- modules/rocksdb/deps.edn | 2 +- modules/scheduler/src/blaze/scheduler.clj | 2 +- modules/scheduler/src/blaze/scheduler_spec.clj | 2 +- modules/scheduler/test/blaze/scheduler_test.clj | 2 +- modules/server/deps.edn | 2 +- modules/spec/deps.edn | 7 ++----- modules/spec/src/blaze/spec.clj | 2 +- modules/test-util/deps.edn | 2 +- 40 files changed, 43 insertions(+), 46 deletions(-) diff --git a/deps.edn b/deps.edn index db40192e7..1a3e29dcf 100644 --- a/deps.edn +++ b/deps.edn @@ -41,7 +41,7 @@ {:mvn/version "1.3.6"} org.slf4j/slf4j-nop - {:mvn/version "2.0.2"}} + {:mvn/version "2.0.3"}} :aliases {:depstar @@ -80,10 +80,10 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.1.927"} + {:mvn/version "2.1.932"} org.slf4j/slf4j-nop - {:mvn/version "2.0.2"}} + {:mvn/version "2.0.3"}} :main-opts ["-m" "antq.core" diff --git a/dev/blaze/dev.clj b/dev/blaze/dev.clj index 0cf1de216..742781db2 100644 --- a/dev/blaze/dev.clj +++ b/dev/blaze/dev.clj @@ -13,7 +13,7 @@ [clojure.repl :refer [pst]] [clojure.spec.test.alpha :as st] [clojure.tools.namespace.repl :refer [refresh]] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log]) (:import [com.github.benmanes.caffeine.cache Cache])) diff --git a/dev/blaze/dev/tx_log.clj b/dev/blaze/dev/tx_log.clj index 073713055..5c9dba769 100644 --- a/dev/blaze/dev/tx_log.clj +++ b/dev/blaze/dev/tx_log.clj @@ -2,7 +2,7 @@ (:require [blaze.core :refer [system]] [blaze.db.tx-log :as tx-log] - [java-time :as time])) + [java-time.api :as time])) (def tx-log diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 58b1554a5..155f9fba1 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.6"}} + {:mvn/version "3.21.7"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 7eb0278a8..5923b7951 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.6"} + {:mvn/version "3.21.7"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.13.4"}}} diff --git a/modules/cassandra/src/blaze/cassandra/config.clj b/modules/cassandra/src/blaze/cassandra/config.clj index 771526163..3268ae123 100644 --- a/modules/cassandra/src/blaze/cassandra/config.clj +++ b/modules/cassandra/src/blaze/cassandra/config.clj @@ -1,7 +1,7 @@ (ns blaze.cassandra.config (:require [clojure.string :as str] - [java-time :as time]) + [java-time.api :as time]) (:import [com.datastax.oss.driver.api.core.config OptionsMap TypedDriverOption] [java.net InetSocketAddress])) diff --git a/modules/cassandra/test/blaze/cassandra/config_test.clj b/modules/cassandra/test/blaze/cassandra/config_test.clj index 11a894488..e41f65cfb 100644 --- a/modules/cassandra/test/blaze/cassandra/config_test.clj +++ b/modules/cassandra/test/blaze/cassandra/config_test.clj @@ -3,7 +3,7 @@ [blaze.cassandra.config :as config] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest are testing]] - [java-time :as time]) + [java-time.api :as time]) (:import [com.datastax.oss.driver.api.core.config OptionsMap TypedDriverOption] [java.net InetSocketAddress])) diff --git a/modules/cql/src/blaze/elm/date_time.clj b/modules/cql/src/blaze/elm/date_time.clj index e8c2576a8..a2dce7d28 100644 --- a/modules/cql/src/blaze/elm/date_time.clj +++ b/modules/cql/src/blaze/elm/date_time.clj @@ -8,7 +8,7 @@ [blaze.elm.protocols :as p] [blaze.fhir.spec.type] [blaze.fhir.spec.type.system :as system] - [java-time :as time]) + [java-time.api :as time]) (:import [blaze.fhir.spec.type OffsetInstant] [blaze.fhir.spec.type.system DateTimeYear DateTimeYearMonth DateTimeYearMonthDay] diff --git a/modules/cql/src/blaze/elm/expression_spec.clj b/modules/cql/src/blaze/elm/expression_spec.clj index c2e1233be..6097d5eaf 100644 --- a/modules/cql/src/blaze/elm/expression_spec.clj +++ b/modules/cql/src/blaze/elm/expression_spec.clj @@ -7,7 +7,7 @@ [blaze.elm.expression :as expr] [blaze.fhir.spec] [clojure.spec.alpha :as s] - [java-time :as time])) + [java-time.api :as time])) (s/def ::now diff --git a/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj b/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj index e4c0a03e6..f1d5d2f53 100644 --- a/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/date_time_operators_test.clj @@ -18,7 +18,7 @@ [clojure.test :as test :refer [are deftest is testing]] [clojure.test.check.properties :as prop] [cognitect.anomalies :as anom] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]]) (:import [java.time Year YearMonth] diff --git a/modules/db-stub/src/blaze/db/api_stub.clj b/modules/db-stub/src/blaze/db/api_stub.clj index 33cc925ca..9b259d8a1 100644 --- a/modules/db-stub/src/blaze/db/api_stub.clj +++ b/modules/db-stub/src/blaze/db/api_stub.clj @@ -17,7 +17,7 @@ [blaze.fhir.structure-definition-repo] [blaze.test-util :refer [with-system]] [integrant.core :as ig] - [java-time :as time])) + [java-time.api :as time])) (defn create-mem-node-system [node-config] diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index ff78979cd..cc3ea9a6e 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.2.3"}} + {:mvn/version "3.3.1"}} :aliases {:test diff --git a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj index 62d539d35..83deced4f 100644 --- a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj +++ b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj @@ -13,7 +13,7 @@ [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [taoensso.timbre :as log]) (:import diff --git a/modules/db-tx-log/src/blaze/db/tx_log_spec.clj b/modules/db-tx-log/src/blaze/db/tx_log_spec.clj index ff463c3f0..3f2a377fc 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log_spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log_spec.clj @@ -5,7 +5,7 @@ [blaze.db.tx-log :as tx-log] [blaze.db.tx-log.spec] [clojure.spec.alpha :as s] - [java-time :as time])) + [java-time.api :as time])) ;; returns a CompletableFuture of :blaze.db/t diff --git a/modules/db-tx-log/test/blaze/db/tx_log_test.clj b/modules/db-tx-log/test/blaze/db/tx_log_test.clj index 2cd58935d..8e41ab0a5 100644 --- a/modules/db-tx-log/test/blaze/db/tx_log_test.clj +++ b/modules/db-tx-log/test/blaze/db/tx_log_test.clj @@ -7,7 +7,7 @@ [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [is deftest]] - [java-time :as time]) + [java-time.api :as time]) (:import [java.lang AutoCloseable] [java.time Instant])) diff --git a/modules/db/src/blaze/db/node.clj b/modules/db/src/blaze/db/node.clj index a0c9ea9eb..ba7acffb4 100644 --- a/modules/db/src/blaze/db/node.clj +++ b/modules/db/src/blaze/db/node.clj @@ -34,7 +34,7 @@ [clojure.spec.alpha :as s] [cognitect.anomalies :as anom] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [prometheus.alpha :as prom :refer [defhistogram]] [taoensso.timbre :as log]) (:import diff --git a/modules/db/src/blaze/db/tx_log/local.clj b/modules/db/src/blaze/db/tx_log/local.clj index 9b67b5992..1a0a28f44 100644 --- a/modules/db/src/blaze/db/tx_log/local.clj +++ b/modules/db/src/blaze/db/tx_log/local.clj @@ -20,7 +20,7 @@ [blaze.module :refer [reg-collector]] [clojure.spec.alpha :as s] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [prometheus.alpha :as prom :refer [defhistogram]] [taoensso.timbre :as log]) (:import diff --git a/modules/db/test-perf/blaze/db/api_test_perf.clj b/modules/db/test-perf/blaze/db/api_test_perf.clj index c31b39296..88b9f38a1 100644 --- a/modules/db/test-perf/blaze/db/api_test_perf.clj +++ b/modules/db/test-perf/blaze/db/api_test_perf.clj @@ -18,7 +18,7 @@ [clojure.test :refer [deftest]] [criterium.core :as criterium] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log])) diff --git a/modules/db/test/blaze/db/test_util.clj b/modules/db/test/blaze/db/test_util.clj index 82e32ef68..82497b9e1 100644 --- a/modules/db/test/blaze/db/test_util.clj +++ b/modules/db/test/blaze/db/test_util.clj @@ -13,7 +13,7 @@ [blaze.fhir.structure-definition-repo] [blaze.test-util :refer [with-system]] [integrant.core :as ig] - [java-time :as time])) + [java-time.api :as time])) (def system diff --git a/modules/db/test/blaze/db/tx_log/local_test.clj b/modules/db/test/blaze/db/tx_log/local_test.clj index 3eb89c11b..f22d4d1fe 100644 --- a/modules/db/test/blaze/db/tx_log/local_test.clj +++ b/modules/db/test/blaze/db/tx_log/local_test.clj @@ -18,7 +18,7 @@ [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [jsonista.core :as j] [juxt.iota :refer [given]] [taoensso.timbre :as log]) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj index 655f56a7e..3f59b5e00 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj @@ -5,7 +5,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] - [java-time :as time]) + [java-time.api :as time]) (:import [com.google.common.hash Hashing] [java.time LocalDate LocalDateTime Year YearMonth OffsetDateTime diff --git a/modules/http-client/test/blaze/http_client_test.clj b/modules/http-client/test/blaze/http_client_test.clj index 7b310e8fe..7858ec33d 100644 --- a/modules/http-client/test/blaze/http_client_test.clj +++ b/modules/http-client/test/blaze/http_client_test.clj @@ -9,7 +9,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [taoensso.timbre :as log]) (:import diff --git a/modules/interaction/test/blaze/interaction/history/instance_test.clj b/modules/interaction/test/blaze/interaction/history/instance_test.clj index 5cfb26ee7..d7b9198c3 100644 --- a/modules/interaction/test/blaze/interaction/history/instance_test.clj +++ b/modules/interaction/test/blaze/interaction/history/instance_test.clj @@ -17,7 +17,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) diff --git a/modules/interaction/test/blaze/interaction/history/system_test.clj b/modules/interaction/test/blaze/interaction/history/system_test.clj index c14cae29f..affa812d9 100644 --- a/modules/interaction/test/blaze/interaction/history/system_test.clj +++ b/modules/interaction/test/blaze/interaction/history/system_test.clj @@ -15,7 +15,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) diff --git a/modules/interaction/test/blaze/interaction/history/type_test.clj b/modules/interaction/test/blaze/interaction/history/type_test.clj index 78b55f163..959126bd8 100644 --- a/modules/interaction/test/blaze/interaction/history/type_test.clj +++ b/modules/interaction/test/blaze/interaction/history/type_test.clj @@ -15,7 +15,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) diff --git a/modules/interaction/test/blaze/interaction/search_compartment_test.clj b/modules/interaction/test/blaze/interaction/search_compartment_test.clj index 7da3625ca..e925393e8 100644 --- a/modules/interaction/test/blaze/interaction/search_compartment_test.clj +++ b/modules/interaction/test/blaze/interaction/search_compartment_test.clj @@ -19,7 +19,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log])) diff --git a/modules/interaction/test/blaze/interaction/search_system_test.clj b/modules/interaction/test/blaze/interaction/search_system_test.clj index 3a6ded869..a0ef4bb4a 100644 --- a/modules/interaction/test/blaze/interaction/search_system_test.clj +++ b/modules/interaction/test/blaze/interaction/search_system_test.clj @@ -18,7 +18,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index 0e1462f08..568e8ec8e 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -20,7 +20,7 @@ [clojure.test :as test :refer [deftest is testing]] [cuerdas.core :as c-str] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) diff --git a/modules/luid/test/blaze/luid_test.clj b/modules/luid/test/blaze/luid_test.clj index b99df3959..7241e8e2a 100644 --- a/modules/luid/test/blaze/luid_test.clj +++ b/modules/luid/test/blaze/luid_test.clj @@ -5,7 +5,7 @@ [clojure.math :as math] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] - [java-time :as time] + [java-time.api :as time] [juxt.iota :refer [given]]) (:import [java.time Clock Instant ZoneId] diff --git a/modules/openid-auth/src/blaze/openid_auth.clj b/modules/openid-auth/src/blaze/openid_auth.clj index fe5ea6ca7..14e9ba9aa 100644 --- a/modules/openid-auth/src/blaze/openid_auth.clj +++ b/modules/openid-auth/src/blaze/openid_auth.clj @@ -6,7 +6,7 @@ [blaze.scheduler.spec] [clojure.spec.alpha :as s] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log]) (:import [java.security PublicKey])) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj index fd31cf2c8..5b9e9656f 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj @@ -10,7 +10,7 @@ [blaze.fhir.spec] [clojure.spec.alpha :as s] [cognitect.anomalies :as anom] - [java-time :as time])) + [java-time.api :as time])) (s/def ::now diff --git a/modules/page-store/src/blaze/page_store/local.clj b/modules/page-store/src/blaze/page_store/local.clj index 29222e664..968520e43 100644 --- a/modules/page-store/src/blaze/page_store/local.clj +++ b/modules/page-store/src/blaze/page_store/local.clj @@ -8,7 +8,7 @@ [blaze.page-store.weigh :as w] [clojure.spec.alpha :as s] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log]) (:import [com.github.benmanes.caffeine.cache Cache Caffeine Weigher])) diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index fc274b4ec..6dfc71dda 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.5.3"}} + {:mvn/version "7.6.0"}} :aliases {:test diff --git a/modules/scheduler/src/blaze/scheduler.clj b/modules/scheduler/src/blaze/scheduler.clj index 7ca9758e6..0a5aa8fae 100644 --- a/modules/scheduler/src/blaze/scheduler.clj +++ b/modules/scheduler/src/blaze/scheduler.clj @@ -4,7 +4,7 @@ [blaze.scheduler.protocol :as p] [blaze.scheduler.spec] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log]) (:import [java.util.concurrent Executors Future ScheduledExecutorService TimeUnit])) diff --git a/modules/scheduler/src/blaze/scheduler_spec.clj b/modules/scheduler/src/blaze/scheduler_spec.clj index 833292290..d50d5d59f 100644 --- a/modules/scheduler/src/blaze/scheduler_spec.clj +++ b/modules/scheduler/src/blaze/scheduler_spec.clj @@ -3,7 +3,7 @@ [blaze.scheduler :as sched] [blaze.scheduler.spec] [clojure.spec.alpha :as s] - [java-time :as time])) + [java-time.api :as time])) (s/fdef sched/schedule-at-fixed-rate diff --git a/modules/scheduler/test/blaze/scheduler_test.clj b/modules/scheduler/test/blaze/scheduler_test.clj index abe0b0cb3..e751891c2 100644 --- a/modules/scheduler/test/blaze/scheduler_test.clj +++ b/modules/scheduler/test/blaze/scheduler_test.clj @@ -7,7 +7,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] - [java-time :as time] + [java-time.api :as time] [taoensso.timbre :as log])) diff --git a/modules/server/deps.edn b/modules/server/deps.edn index ad23d8a5a..09a9ae556 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -6,7 +6,7 @@ {:local/root "../module-base"} org.eclipse.jetty/jetty-server - {:mvn/version "9.4.48.v20220622"} + {:mvn/version "9.4.49.v20220914"} ring/ring-jetty-adapter {:mvn/version "1.9.6" diff --git a/modules/spec/deps.edn b/modules/spec/deps.edn index 24adf0a70..3232a6c0e 100644 --- a/modules/spec/deps.edn +++ b/modules/spec/deps.edn @@ -1,6 +1,3 @@ {:deps - { - ;; switch to original dependency of https://github.com/dm3/clojure.java-time/issues/84 is solved - clojure.java-time/clojure.java-time - {:git/url "https://github.com/bevuta/clojure.java-time.git" - :git/sha "bf11ca522c83f39a32bf02e490241a4b9ce499b5"}}} + {clojure.java-time/clojure.java-time + {:mvn/version "1.1.0"}}} diff --git a/modules/spec/src/blaze/spec.clj b/modules/spec/src/blaze/spec.clj index 26f813d2f..946240e25 100644 --- a/modules/spec/src/blaze/spec.clj +++ b/modules/spec/src/blaze/spec.clj @@ -2,7 +2,7 @@ (:require [clojure.spec.alpha :as s] [clojure.string :as str] - [java-time :as time]) + [java-time.api :as time]) (:import [java.util Random])) diff --git a/modules/test-util/deps.edn b/modules/test-util/deps.edn index fcd58a07a..0434e2339 100644 --- a/modules/test-util/deps.edn +++ b/modules/test-util/deps.edn @@ -25,4 +25,4 @@ {:mvn/version "1.1.1"} org.slf4j/slf4j-nop - {:mvn/version "2.0.2"}}} + {:mvn/version "2.0.3"}}} From 3876250d703be1de3eb22e9fbffe48cd959f4afe Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 5 Oct 2022 15:08:42 +0200 Subject: [PATCH 040/124] Add Histology CQL Test --- .../evaluate_measure/measure_test.clj | 5 +- .../evaluate_measure/q45-histology-data.json | 135 ++++++++++++++++++ .../evaluate_measure/q45-histology-query.cql | 13 ++ 3 files changed, 151 insertions(+), 2 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index ed16ec5f5..d690a8db3 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -435,7 +435,8 @@ "q39-social-sec-num" 1 "q42-medication-2" 2 "q43-medication-3" 2 - "q44-tnm-t" 1) + "q44-tnm-t" 1 + "q45-histology" 1) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -618,5 +619,5 @@ (comment (log/set-level! :debug) (evaluate "q42-medication-2") - (evaluate "q44-tnm-t") + (evaluate "q45-histology") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json new file mode 100644 index 000000000..8c9ea89da --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json @@ -0,0 +1,135 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "request": { + "method": "PUT", + "url": "Observation/0" + }, + "resource": { + "resourceType": "Observation", + "id": "0", + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "59847-4" + } + ] + }, + "subject": { + "reference": "Patient/0" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "urn:oid:2.16.840.1.113883.6.43.1", + "code": "8140/3" + } + ] + } + } + }, + { + "request": { + "method": "PUT", + "url": "Observation/1" + }, + "resource": { + "resourceType": "Observation", + "id": "1", + "code": { + "coding": [ + { + "system": "http://loinc.org", + "code": "59847-4" + } + ] + }, + "subject": { + "reference": "Patient/1" + }, + "valueCodeableConcept": { + "coding": [ + { + "system": "urn:oid:2.16.840.1.113883.6.43.1", + "code": "8147/3" + } + ] + } + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql new file mode 100644 index 000000000..c2d9edfc6 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql @@ -0,0 +1,13 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' +codesystem icdo3: 'urn:oid:2.16.840.1.113883.6.43.1' + +context Patient + +define InInitialPopulation: + exists + from [Observation: Code '59847-4' from loinc] O + where O.value.coding contains Code '8140/3' from icdo3 From 9ba9133b23d3cf8a4c272f788a925195a04f6797 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 11 Oct 2022 19:27:08 +0200 Subject: [PATCH 041/124] Add Date Component CQL Test --- .../compiler/comparison_operators_test.clj | 4 + .../evaluate_measure/measure_test.clj | 6 +- .../q46-between-date-data.json | 107 ++++++++++++++++++ .../q46-between-date-query.cql | 8 ++ 4 files changed, 122 insertions(+), 3 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql diff --git a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj index 2d19179e7..79e5cd6d2 100644 --- a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj @@ -564,6 +564,10 @@ (tu/testing-binary-null elm/greater-or-equal #elm/date "2013-06-15")) + (testing "DateTime with mixed precision" + (are [x y] (nil? (tu/compile-binop elm/greater-or-equal elm/date-time x y)) + "2005-06-17" "2005")) + (testing "Time" (are [x y res] (= res (tu/compile-binop elm/greater-or-equal elm/time x y)) "00:00:00" "00:00:00" true diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index d690a8db3..92f8a9fd8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -436,7 +436,8 @@ "q42-medication-2" 2 "q43-medication-3" 2 "q44-tnm-t" 1 - "q45-histology" 1) + "q45-histology" 1 + "q46-between-date" 1) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -618,6 +619,5 @@ (comment (log/set-level! :debug) - (evaluate "q42-medication-2") - (evaluate "q45-histology") + (evaluate "q46-between-date") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json new file mode 100644 index 000000000..d370ce37e --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json @@ -0,0 +1,107 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0", + "gender": "male" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1", + "gender": "female" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "request": { + "method": "PUT", + "url": "Condition/0" + }, + "resource": { + "code": { + "coding": [ + { + "code": "Z77.8", + "system": "http://hl7.org/fhir/sid/icd-10", + "version": "2016" + } + ] + }, + "id": "0", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "onsetDateTime": "2005-06-17", + "resourceType": "Condition", + "subject": { + "reference": "Patient/0" + } + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql new file mode 100644 index 000000000..c141555f9 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql @@ -0,0 +1,8 @@ +library Retrieve +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +define InInitialPopulation: + exists + from [Condition] C + where year from C.onset between 2005 and 2006 From e628ab6180e38d6cb3b3c7bebcdc2a17ea82594f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 11 Oct 2022 19:46:37 +0200 Subject: [PATCH 042/124] Update Dependencies --- .github/workflows/build.yml | 6 +++--- modules/fhir-client/deps.edn | 2 +- modules/http-client/deps.edn | 2 +- modules/server/deps.edn | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 181d24f03..230a9e87c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -19,10 +19,10 @@ jobs: runs-on: ubuntu-20.04 steps: - - name: Setup clj-kondo - uses: DeLaGuardo/setup-clj-kondo@master + - name: Setup Clojure + uses: DeLaGuardo/setup-clojure@master with: - version: '2022.09.08' + clj-kondo: '2022.10.05' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index 246e5ab35..2c112c48a 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -15,7 +15,7 @@ {:mvn/version "5.2.1"} hato/hato - {:mvn/version "0.8.2"}} + {:mvn/version "0.9.0"}} :aliases {:test diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index a95359a77..688ee5d14 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -14,7 +14,7 @@ {:mvn/version "2.13.4"} hato/hato - {:mvn/version "0.8.2"}} + {:mvn/version "0.9.0"}} :aliases {:test diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 09a9ae556..0ee881d51 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -25,7 +25,7 @@ {:local/root "../test-util"} hato/hato - {:mvn/version "0.8.2"}}} + {:mvn/version "0.9.0"}}} :kaocha {:extra-deps From 2a945595b45560bb56bd95d600297f3e2ae8ed31 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 12 Oct 2022 17:29:48 +0200 Subject: [PATCH 043/124] Add Release badge --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6c88fe64b..88325d598 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,8 @@ [![Build](https://github.com/samply/blaze/actions/workflows/build.yml/badge.svg)](https://github.com/samply/blaze/actions/workflows/build.yml) [![Docker Pulls](https://img.shields.io/docker/pulls/samply/blaze.svg)](https://hub.docker.com/r/samply/blaze/) -[![codecov](https://codecov.io/gh/samply/blaze/branch/develop/graph/badge.svg)](https://codecov.io/gh/samply/blaze) +[![Code Coverage](https://codecov.io/gh/samply/blaze/branch/develop/graph/badge.svg)](https://codecov.io/gh/samply/blaze) +[![Latest Release](https://img.shields.io/github/v/release/samply/blaze)][5] A FHIR® Store with internal, fast CQL Evaluation Engine From 1efc415736b3a459b7ba01a282b5778b4767f01c Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 13 Oct 2022 11:45:12 +0200 Subject: [PATCH 044/124] Fix Git SHA Problems in GitHub Actions The variable github.sha points now to the merge commit of a PR but the Docker metadata action uses the SHA of the commit to merge. Now in addition to pushing the Docker image into the registries, I build local Docker image and upload it to the artifact storage to be able to use it at the integration tests. --- .github/distributed-test/docker-compose.yml | 4 +- .github/openid-auth-test/docker-compose.yml | 2 +- .github/workflows/build.yml | 166 +++++++++++--------- 3 files changed, 94 insertions(+), 78 deletions(-) diff --git a/.github/distributed-test/docker-compose.yml b/.github/distributed-test/docker-compose.yml index 74ee6c88e..345a0fc51 100644 --- a/.github/distributed-test/docker-compose.yml +++ b/.github/distributed-test/docker-compose.yml @@ -65,7 +65,7 @@ services: HEAP_NEWSIZE: "100M" blaze-1: - image: "ghcr.io/samply/blaze:sha-${GITHUB_SHA}" + image: "blaze:latest" environment: JAVA_TOOL_OPTIONS: "-Xmx512m" STORAGE: "distributed" @@ -94,7 +94,7 @@ services: - cassandra-2 blaze-2: - image: "ghcr.io/samply/blaze:sha-${GITHUB_SHA}" + image: "blaze:latest" environment: JAVA_TOOL_OPTIONS: "-Xmx512m" STORAGE: "distributed" diff --git a/.github/openid-auth-test/docker-compose.yml b/.github/openid-auth-test/docker-compose.yml index 6634e6713..091cdf758 100644 --- a/.github/openid-auth-test/docker-compose.yml +++ b/.github/openid-auth-test/docker-compose.yml @@ -12,7 +12,7 @@ services: - "${GITHUB_WORKSPACE}/.github/openid-auth-test/realm.json:/tmp/realm.json" blaze: - image: "ghcr.io/samply/blaze:sha-${GITHUB_SHA}" + image: "blaze:latest" environment: JAVA_TOOL_OPTIONS: "-Xmx2g" OPENID_PROVIDER_URL: "http://keycloak:8080/auth/realms/blaze" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 230a9e87c..e7ff42e60 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -200,6 +200,41 @@ jobs: - name: Build Uberjar run: make uberjar + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Build and Export to Docker + uses: docker/build-push-action@v3 + with: + context: . + tags: blaze:latest + outputs: type=docker,dest=/tmp/blaze.tar + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Run Trivy vulnerability scanner + uses: aquasecurity/trivy-action@master + with: + image-ref: blaze:latest + format: sarif + output: trivy-results.sarif + severity: 'CRITICAL,HIGH' + + - name: Upload Trivy scan results to GitHub Security tab + uses: github/codeql-action/upload-sarif@v2 + with: + sarif_file: trivy-results.sarif + + - name: Upload Blaze Image + uses: actions/upload-artifact@v3 + with: + name: blaze-image + path: /tmp/blaze.tar + - name: Login to GitHub Container Registry uses: docker/login-action@v2 with: @@ -213,12 +248,6 @@ jobs: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_TOKEN }} - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 - - name: Docker meta id: docker-meta uses: docker/metadata-action@v4 @@ -232,7 +261,6 @@ jobs: type=ref,event=pr type=semver,pattern={{version}} type=semver,pattern={{major}}.{{minor}} - type=sha,format=long - name: Build and push uses: docker/build-push-action@v3 @@ -243,19 +271,6 @@ jobs: tags: ${{ steps.docker-meta.outputs.tags }} labels: ${{ steps.docker-meta.outputs.labels }} - - name: Run Trivy vulnerability scanner - uses: aquasecurity/trivy-action@master - with: - image-ref: ghcr.io/samply/blaze:sha-${{ github.sha }} - format: sarif - output: trivy-results.sarif - severity: 'CRITICAL,HIGH' - - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v2 - with: - sarif_file: trivy-results.sarif - integration-test: needs: build runs-on: ubuntu-20.04 @@ -267,18 +282,17 @@ jobs: - name: Install Blazectl run: .github/scripts/install-blazectl.sh - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp - - name: Pull Docker Image - run: docker pull ghcr.io/samply/blaze:sha-${{ github.sha }} + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Blaze - run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -p 8081:8081 -v blaze-data:/app/data ghcr.io/samply/blaze:sha-${{ github.sha }} + run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -p 8081:8081 -v blaze-data:/app/data blaze:latest - name: Wait for Blaze run: .github/scripts/wait-for-url.sh http://localhost:8080/health @@ -486,18 +500,17 @@ jobs: - name: Install Blazectl run: .github/scripts/install-blazectl.sh - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp - - name: Pull Docker Image - run: docker pull ghcr.io/samply/blaze:sha-${{ github.sha }} + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Blaze - run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -e ENFORCE_REFERENTIAL_INTEGRITY=false -p 8080:8080 -v blaze-data:/app/data ghcr.io/samply/blaze:sha-${{ github.sha }} + run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -e ENFORCE_REFERENTIAL_INTEGRITY=false -p 8080:8080 -v blaze-data:/app/data blaze:latest - name: Wait for Blaze run: .github/scripts/wait-for-url.sh http://localhost:8080/health @@ -532,18 +545,17 @@ jobs: - name: Install Blazectl run: .github/scripts/install-blazectl.sh - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp - - name: Pull Docker Image - run: docker pull ghcr.io/samply/blaze:sha-${{ github.sha }} + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Blaze - run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -p 8081:8081 -v blaze-data:/app/data ghcr.io/samply/blaze:sha-${{ github.sha }} + run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -p 8081:8081 -v blaze-data:/app/data blaze:latest - name: Wait for Blaze run: .github/scripts/wait-for-url.sh http://localhost:8080/health @@ -571,18 +583,17 @@ jobs: - name: Check out Git repository uses: actions/checkout@v3 - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp - - name: Pull Docker Image - run: docker pull ghcr.io/samply/blaze:sha-${{ github.sha }} + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Blaze - run: docker run --rm -d -e JAVA_TOOL_OPTIONS=-Xmx1g -e ENFORCE_REFERENTIAL_INTEGRITY=false -p 8080:8080 ghcr.io/samply/blaze:sha-${{ github.sha }} + run: docker run --rm -d -e JAVA_TOOL_OPTIONS=-Xmx1g -e ENFORCE_REFERENTIAL_INTEGRITY=false -p 8080:8080 blaze:latest - name: Wait for Blaze run: .github/scripts/wait-for-url.sh http://localhost:8080/health @@ -621,18 +632,17 @@ jobs: - name: Install Gnuplot run: sudo apt-get install gnuplot - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp - - name: Pull Docker Image - run: docker pull ghcr.io/samply/blaze:sha-${{ github.sha }} + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Blaze - run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -v blaze-data:/app/data ghcr.io/samply/blaze:sha-${{ github.sha }} + run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -p 8080:8080 -v blaze-data:/app/data blaze:latest - name: Wait for Blaze run: .github/scripts/wait-for-url.sh http://localhost:8080/health @@ -654,12 +664,14 @@ jobs: - name: Check out Git repository uses: actions/checkout@v3 - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Keycloak and Blaze run: docker-compose -f .github/openid-auth-test/docker-compose.yml up -d @@ -690,12 +702,14 @@ jobs: - name: Install Blazectl run: .github/scripts/install-blazectl.sh - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Zookeeper, Kafka, Cassandra and Blaze run: docker-compose -f .github/distributed-test/docker-compose.yml up -d @@ -953,12 +967,14 @@ jobs: - name: Install Gnuplot run: sudo apt-get install gnuplot - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 + - name: Download Blaze Image + uses: actions/download-artifact@v3 with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar - name: Run Zookeeper, Kafka, Cassandra and Blaze run: docker-compose -f .github/distributed-test/docker-compose.yml up -d From dbb85f1e2dba753c01b21d46ec0cf8c22898880c Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 12 Oct 2022 18:17:04 +0200 Subject: [PATCH 045/124] Ensure CQL Library Name Equals its Filename The new IntelliJ CQL Plugins needs that. --- .../scripts/evaluate-patient-q1-measure.sh | 2 +- .github/workflows/build.yml | 64 +++++++++---------- .../evaluate_measure/measure_test.clj | 4 +- .../evaluate_measure/{q1-query.cql => q1.cql} | 2 +- .../{q1-data.json => q1.json} | 0 .../{q10-query.cql => q10.cql} | 2 +- .../{q10-data.json => q10.json} | 0 .../{q11-query.cql => q11.cql} | 2 +- .../{q11-data.json => q11.json} | 0 .../{q12-query.cql => q12.cql} | 2 +- .../{q12-data.json => q12.json} | 0 .../{q13-query.cql => q13.cql} | 2 +- .../{q13-data.json => q13.json} | 0 .../{q14-query.cql => q14.cql} | 2 +- .../{q14-data.json => q14.json} | 0 .../{q15-query.cql => q15.cql} | 2 +- .../{q15-data.json => q15.json} | 0 .../{q16-query.cql => q16.cql} | 2 +- .../{q16-data.json => q16.json} | 0 .../{q17-query.cql => q17.cql} | 2 +- .../{q17-data.json => q17.json} | 0 ...men-bmi-query.cql => q18-specimen-bmi.cql} | 2 +- ...en-bmi-data.json => q18-specimen-bmi.json} | 0 ...-query.cql => q19-stratifier-ageclass.cql} | 2 +- ...data.json => q19-stratifier-ageclass.json} | 0 .../evaluate_measure/{q2-query.cql => q2.cql} | 2 +- .../{q2-data.json => q2.json} | 0 ...city-query.cql => q20-stratifier-city.cql} | 2 +- ...ity-data.json => q20-stratifier-city.json} | 0 ... => q21-stratifier-city-of-only-women.cql} | 2 +- ...=> q21-stratifier-city-of-only-women.json} | 0 ...> q22-stratifier-multiple-cities-fail.cql} | 2 +- ... q22-stratifier-multiple-cities-fail.json} | 0 ...=> q23-stratifier-ageclass-and-gender.cql} | 2 +- ...> q23-stratifier-ageclass-and-gender.json} | 0 .../{q24-query.cql => q24.cql} | 2 +- .../{q24-data.json => q24.json} | 0 ...uery.cql => q25-stratifier-collection.cql} | 2 +- ...ta.json => q25-stratifier-collection.json} | 0 ...r-bmi-query.cql => q26-stratifier-bmi.cql} | 2 +- ...-bmi-data.json => q26-stratifier-bmi.json} | 0 ....cql => q27-stratifier-calculated-bmi.cql} | 2 +- ...son => q27-stratifier-calculated-bmi.json} | 0 ... q28-relationship-procedure-condition.cql} | 2 +- ...q28-relationship-procedure-condition.json} | 0 ...> q29-stratifier-sample-material-type.cql} | 2 +- ... q29-stratifier-sample-material-type.json} | 0 .../evaluate_measure/{q3-query.cql => q3.cql} | 2 +- .../{q3-data.json => q3.json} | 0 ...30-stratifier-with-missing-expression.cql} | 2 +- ...0-stratifier-with-missing-expression.json} | 0 ...=> q31-stratifier-storage-temperature.cql} | 2 +- ...> q31-stratifier-storage-temperature.json} | 0 ...ery.cql => q32-stratifier-underweight.cql} | 2 +- ...a.json => q32-stratifier-underweight.json} | 0 ...ry.cql => q33-incompatible-quantities.cql} | 2 +- ....json => q33-incompatible-quantities.json} | 0 ...edication-query.cql => q34-medication.cql} | 2 +- ...dication-data.json => q34-medication.json} | 0 ...-query.cql => q35-literal-library-ref.cql} | 2 +- ...data.json => q35-literal-library-ref.json} | 0 ...-parameter-query.cql => q36-parameter.cql} | 2 +- ...parameter-data.json => q36-parameter.json} | 0 ...37-overlaps-query.cql => q37-overlaps.cql} | 2 +- ...7-overlaps-data.json => q37-overlaps.json} | 0 ...{q38-di-surv-query.cql => q38-di-surv.cql} | 2 +- ...q38-di-surv-data.json => q38-di-surv.json} | 0 ...c-num-query.cql => q39-social-sec-num.cql} | 2 +- ...-num-data.json => q39-social-sec-num.json} | 0 .../evaluate_measure/{q4-query.cql => q4.cql} | 2 +- .../{q4-data.json => q4.json} | 0 ...-query.cql => q40-specimen-stratifier.cql} | 2 +- ...data.json => q40-specimen-stratifier.json} | 0 ....cql => q41-specimen-multi-stratifier.cql} | 2 +- ...son => q41-specimen-multi-stratifier.json} | 0 ...ation-2-query.cql => q42-medication-2.cql} | 2 +- ...tion-2-data.json => q42-medication-2.json} | 0 ...ation-3-query.cql => q43-medication-3.cql} | 2 +- ...tion-3-data.json => q43-medication-3.json} | 0 .../{q44-tnm-t-query.cql => q44-tnm-t.cql} | 2 +- .../{q44-tnm-t-data.json => q44-tnm-t.json} | 0 ...-histology-query.cql => q45-histology.cql} | 2 +- ...histology-data.json => q45-histology.json} | 0 ...en-date-query.cql => q46-between-date.cql} | 2 +- ...n-date-data.json => q46-between-date.json} | 0 .../evaluate_measure/{q5-query.cql => q5.cql} | 2 +- .../{q5-data.json => q5.json} | 0 .../evaluate_measure/{q6-query.cql => q6.cql} | 2 +- .../{q6-data.json => q6.json} | 0 .../evaluate_measure/{q7-query.cql => q7.cql} | 2 +- .../{q7-data.json => q7.json} | 0 .../evaluate_measure/{q8-query.cql => q8.cql} | 2 +- .../{q8-data.json => q8.json} | 0 .../evaluate_measure/{q9-query.cql => q9.cql} | 2 +- .../{q9-data.json => q9.json} | 0 95 files changed, 81 insertions(+), 81 deletions(-) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q1-query.cql => q1.cql} (88%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q1-data.json => q1.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q10-query.cql => q10.cql} (96%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q10-data.json => q10.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q11-query.cql => q11.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q11-data.json => q11.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q12-query.cql => q12.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q12-data.json => q12.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q13-query.cql => q13.cql} (97%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q13-data.json => q13.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q14-query.cql => q14.cql} (92%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q14-data.json => q14.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q15-query.cql => q15.cql} (86%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q15-data.json => q15.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q16-query.cql => q16.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q16-data.json => q16.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q17-query.cql => q17.cql} (78%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q17-data.json => q17.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q18-specimen-bmi-query.cql => q18-specimen-bmi.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q18-specimen-bmi-data.json => q18-specimen-bmi.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q19-stratifier-ageclass-query.cql => q19-stratifier-ageclass.cql} (82%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q19-stratifier-ageclass-data.json => q19-stratifier-ageclass.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q2-query.cql => q2.cql} (92%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q2-data.json => q2.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q20-stratifier-city-query.cql => q20-stratifier-city.cql} (84%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q20-stratifier-city-data.json => q20-stratifier-city.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q21-stratifier-city-of-only-women-query.cql => q21-stratifier-city-of-only-women.cql} (80%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q21-stratifier-city-of-only-women-data.json => q21-stratifier-city-of-only-women.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q22-stratifier-multiple-cities-fail-query.cql => q22-stratifier-multiple-cities-fail.cql} (76%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q22-stratifier-multiple-cities-fail-data.json => q22-stratifier-multiple-cities-fail.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q23-stratifier-ageclass-and-gender-query.cql => q23-stratifier-ageclass-and-gender.cql} (81%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q23-stratifier-ageclass-and-gender-data.json => q23-stratifier-ageclass-and-gender.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q24-query.cql => q24.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q24-data.json => q24.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q25-stratifier-collection-query.cql => q25-stratifier-collection.cql} (88%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q25-stratifier-collection-data.json => q25-stratifier-collection.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q26-stratifier-bmi-query.cql => q26-stratifier-bmi.cql} (90%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q26-stratifier-bmi-data.json => q26-stratifier-bmi.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q27-stratifier-calculated-bmi-query.cql => q27-stratifier-calculated-bmi.cql} (94%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q27-stratifier-calculated-bmi-data.json => q27-stratifier-calculated-bmi.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q28-relationship-procedure-condition-query.cql => q28-relationship-procedure-condition.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q28-relationship-procedure-condition-data.json => q28-relationship-procedure-condition.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q29-stratifier-sample-material-type-query.cql => q29-stratifier-sample-material-type.cql} (97%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q29-stratifier-sample-material-type-data.json => q29-stratifier-sample-material-type.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q3-query.cql => q3.cql} (94%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q3-data.json => q3.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q30-stratifier-with-missing-expression-query.cql => q30-stratifier-with-missing-expression.cql} (70%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q30-stratifier-with-missing-expression-data.json => q30-stratifier-with-missing-expression.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q31-stratifier-storage-temperature-query.cql => q31-stratifier-storage-temperature.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q31-stratifier-storage-temperature-data.json => q31-stratifier-storage-temperature.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q32-stratifier-underweight-query.cql => q32-stratifier-underweight.cql} (90%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q32-stratifier-underweight-data.json => q32-stratifier-underweight.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q33-incompatible-quantities-query.cql => q33-incompatible-quantities.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q33-incompatible-quantities-data.json => q33-incompatible-quantities.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q34-medication-query.cql => q34-medication.cql} (94%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q34-medication-data.json => q34-medication.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q35-literal-library-ref-query.cql => q35-literal-library-ref.cql} (92%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q35-literal-library-ref-data.json => q35-literal-library-ref.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q36-parameter-query.cql => q36-parameter.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q36-parameter-data.json => q36-parameter.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q37-overlaps-query.cql => q37-overlaps.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q37-overlaps-data.json => q37-overlaps.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q38-di-surv-query.cql => q38-di-surv.cql} (97%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q38-di-surv-data.json => q38-di-surv.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q39-social-sec-num-query.cql => q39-social-sec-num.cql} (92%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q39-social-sec-num-data.json => q39-social-sec-num.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q4-query.cql => q4.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q4-data.json => q4.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q40-specimen-stratifier-query.cql => q40-specimen-stratifier.cql} (89%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q40-specimen-stratifier-data.json => q40-specimen-stratifier.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q41-specimen-multi-stratifier-query.cql => q41-specimen-multi-stratifier.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q41-specimen-multi-stratifier-data.json => q41-specimen-multi-stratifier.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q42-medication-2-query.cql => q42-medication-2.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q42-medication-2-data.json => q42-medication-2.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q43-medication-3-query.cql => q43-medication-3.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q43-medication-3-data.json => q43-medication-3.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q44-tnm-t-query.cql => q44-tnm-t.cql} (95%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q44-tnm-t-data.json => q44-tnm-t.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q45-histology-query.cql => q45-histology.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q45-histology-data.json => q45-histology.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q46-between-date-query.cql => q46-between-date.cql} (86%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q46-between-date-data.json => q46-between-date.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q5-query.cql => q5.cql} (93%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q5-data.json => q5.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q6-query.cql => q6.cql} (95%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q6-data.json => q6.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q7-query.cql => q7.cql} (91%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q7-data.json => q7.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q8-query.cql => q8.cql} (90%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q8-data.json => q8.json} (100%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q9-query.cql => q9.cql} (95%) rename modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/{q9-data.json => q9.json} (100%) diff --git a/.github/scripts/evaluate-patient-q1-measure.sh b/.github/scripts/evaluate-patient-q1-measure.sh index 1316d7589..9a3675397 100755 --- a/.github/scripts/evaluate-patient-q1-measure.sh +++ b/.github/scripts/evaluate-patient-q1-measure.sh @@ -76,7 +76,7 @@ evaluate-measure() { } BASE="http://localhost:8080/fhir" -FILE="modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql" +FILE="modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql" DATA=$(base64 "$FILE" | tr -d '\n') LIBRARY_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') MEASURE_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e7ff42e60..3218afce3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -397,55 +397,55 @@ jobs: run: .github/scripts/search-compartment.sh - name: Evaluate CQL Query 1 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql 56 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 - name: Evaluate CQL Query 1 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql 56 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 - name: Evaluate CQL Query 1 on Individual Patients run: .github/scripts/evaluate-patient-q1-measure.sh - name: Evaluate CQL Query 2 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql 42 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 - name: Evaluate CQL Query 2 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql 42 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 - name: Evaluate CQL Query 4 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql 0 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 - name: Evaluate CQL Query 4 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql 0 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 - name: Evaluate CQL Query 7 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql 81 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 - name: Evaluate CQL Query 7 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql 81 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 - name: Evaluate CQL Query 14 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql 96 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 - name: Evaluate CQL Query 14 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql 96 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 - name: Evaluate CQL Query 17 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql 120 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 - name: Evaluate CQL Query 17 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql 120 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 - name: Evaluate CQL Query 36 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql 86 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 - name: Evaluate CQL Query 36 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql 86 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 - name: Evaluate CQL Query 34 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql 24 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 - name: Evaluate CQL Query 34 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql 24 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https @@ -838,55 +838,55 @@ jobs: run: .github/scripts/search-compartment.sh - name: Evaluate CQL Query 1 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql 56 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 - name: Evaluate CQL Query 1 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql 56 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 - name: Evaluate CQL Query 1 on Individual Patients run: .github/scripts/evaluate-patient-q1-measure.sh - name: Evaluate CQL Query 2 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql 42 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 - name: Evaluate CQL Query 2 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql 42 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 - name: Evaluate CQL Query 4 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql 0 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 - name: Evaluate CQL Query 4 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql 0 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 - name: Evaluate CQL Query 7 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql 81 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 - name: Evaluate CQL Query 7 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql 81 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 - name: Evaluate CQL Query 14 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql 96 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 - name: Evaluate CQL Query 14 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql 96 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 - name: Evaluate CQL Query 17 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql 120 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 - name: Evaluate CQL Query 17 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql 120 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 - name: Evaluate CQL Query 36 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql 86 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 - name: Evaluate CQL Query 36 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql 86 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 - name: Evaluate CQL Query 34 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql 24 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 - name: Evaluate CQL Query 34 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql 24 + run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index 92f8a9fd8..707583126 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -79,9 +79,9 @@ (defn- read-data [name] - (let [raw (slurp-resource (str name "-data.json")) + (let [raw (slurp-resource (str name ".json")) bundle (fhir-spec/conform-json (fhir-spec/parse-json raw)) - library (library-entry (slurp-resource (str name "-query.cql")))] + library (library-entry (slurp-resource (str name ".cql")))] (update bundle :entry conj library))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql similarity index 88% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql index 146b3a14d..0cda302fc 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql @@ -1,4 +1,4 @@ -library Retrieve +library q1 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10.cql similarity index 96% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10.cql index 51fd1f541..edea1e877 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10.cql @@ -1,4 +1,4 @@ -library Retrieve +library q10 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q10.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11.cql index 1cff3b11c..84f54849c 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11.cql @@ -1,4 +1,4 @@ -library Retrieve +library q11 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q11.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12.cql index d6761f2f2..4cee0b095 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12.cql @@ -1,4 +1,4 @@ -library Retrieve +library q12 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q12.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13.cql similarity index 97% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13.cql index 523671fb2..2ea017fd4 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13.cql @@ -1,4 +1,4 @@ -library Retrieve +library q13 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q13.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql similarity index 92% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql index c6119ee90..e9901a696 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql @@ -1,4 +1,4 @@ -library Retrieve +library q14 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.cql similarity index 86% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.cql index 52855b8b9..eb98d6c8a 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.cql @@ -1,4 +1,4 @@ -library Retrieve +library q15 using FHIR version '4.0.0' context Patient diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16.cql index 59f33245d..50b7910a9 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16.cql @@ -1,4 +1,4 @@ -library Retrieve +library q16 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q16.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql similarity index 78% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql index c5d7a4316..47d31831b 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql @@ -1,4 +1,4 @@ -library Retrieve +library q17 using FHIR version '4.0.0' define InInitialPopulation: diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi.cql index 70b2f2128..af547bb66 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q18-specimen-bmi" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q18-specimen-bmi.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.cql similarity index 82% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.cql index 51b9598aa..200a6d2b8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q19-stratifier-ageclass" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql similarity index 92% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql index 5d6e43f5e..1286a526d 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql @@ -1,4 +1,4 @@ -library Retrieve +library q2 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.cql similarity index 84% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.cql index 0ac53fc7d..28aa760fc 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q20-stratifier-city" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.cql similarity index 80% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.cql index d620ed91e..9b4fa8b4e 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q21-stratifier-city-of-only-women" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail.cql similarity index 76% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail.cql index 175ee5e9a..c74aeb87f 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q22-stratifier-multiple-cities-fail" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q22-stratifier-multiple-cities-fail.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender.cql similarity index 81% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender.cql index cafaeceed..d12796be4 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q23-stratifier-ageclass-and-gender" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q23-stratifier-ageclass-and-gender.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24.cql index 027162c0a..b68568165 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24.cql @@ -1,4 +1,4 @@ -library Retrieve +library q24 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q24.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection.cql similarity index 88% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection.cql index 46e72e445..a1718ff6c 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q25-stratifier-collection" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q25-stratifier-collection.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.cql similarity index 90% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.cql index 454b7b743..4d10f3542 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q26-stratifier-bmi" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.cql similarity index 94% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.cql index be84f7519..a5f43d21e 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q27-stratifier-calculated-bmi" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition.cql index 913c9e83f..2c9b0241d 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q28-relationship-procedure-condition" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q28-relationship-procedure-condition.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type.cql similarity index 97% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type.cql index f79d55590..7a8a2a90c 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q29-stratifier-sample-material-type" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q29-stratifier-sample-material-type.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3.cql similarity index 94% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3.cql index 7d8273699..625d1a5d6 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3.cql @@ -1,4 +1,4 @@ -library Retrieve +library q3 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q3.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression.cql similarity index 70% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression.cql index 17cb0fd9f..8a74805fe 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q30-stratifier-with-missing-expression" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q30-stratifier-with-missing-expression.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature.cql index 7d2cf97eb..b45c706ed 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q31-stratifier-storage-temperature" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q31-stratifier-storage-temperature.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.cql similarity index 90% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.cql index 90514e576..c2942d072 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q32-stratifier-underweight" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities.cql index 1736d37d1..46fee54a5 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q33-incompatible-quantities" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q33-incompatible-quantities.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication.cql similarity index 94% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication.cql index d1d81c664..c7f2626ce 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q34-medication" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q34-medication.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref.cql similarity index 92% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref.cql index d1d81c664..394aa76fc 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q35-literal-library-ref" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q35-literal-library-ref.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql index 9e63fdbde..5730b708e 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q36-parameter" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql index e88673ed6..f72759892 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q37-overlaps" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv.cql similarity index 97% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv.cql index eb0655cd5..ed8b9fe08 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv.cql @@ -1,4 +1,4 @@ -library DiSurv +library "q38-di-surv" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q38-di-surv.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num.cql similarity index 92% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num.cql index d4f62ff66..9807ab1e1 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q39-social-sec-num" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q39-social-sec-num.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql index 89ea94d79..bc1f0d922 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql @@ -1,4 +1,4 @@ -library Retrieve +library q4 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier.cql similarity index 89% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier.cql index d7d6ca049..661fb2959 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q40-specimen-stratifier" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q40-specimen-stratifier.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier.cql index 5f260e919..492885889 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q41-specimen-multi-stratifier" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q41-specimen-multi-stratifier.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2.cql index a4f1a7d8f..9add85275 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q42-medication-2" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q42-medication-2.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3.cql index 42d49b984..6168898b8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q43-medication-3" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q43-medication-3.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t.cql similarity index 95% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t.cql index 9169f7606..00b972170 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q44-tnm-t" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q44-tnm-t.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology.cql index c2d9edfc6..cde9a6f72 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q45-histology" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q45-histology.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.cql similarity index 86% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.cql index c141555f9..a3e886a92 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.cql @@ -1,4 +1,4 @@ -library Retrieve +library "q46-between-date" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5.cql similarity index 93% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5.cql index 83248059b..8c3e07a18 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5.cql @@ -1,4 +1,4 @@ -library Retrieve +library q5 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q5.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6.cql similarity index 95% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6.cql index b6fcac946..fbe7ff425 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6.cql @@ -1,4 +1,4 @@ -library Retrieve +library q6 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q6.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql similarity index 91% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql index 7133fbd12..45aee6d4d 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql @@ -1,4 +1,4 @@ -library Retrieve +library q7 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8.cql similarity index 90% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8.cql index 01636cc03..cdfbec102 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8.cql @@ -1,4 +1,4 @@ -library Retrieve +library q8 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q8.json diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9-query.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9.cql similarity index 95% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9-query.cql rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9.cql index d86732f04..7fd922171 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9-query.cql +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9.cql @@ -1,4 +1,4 @@ -library Retrieve +library q9 using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9-data.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9.json similarity index 100% rename from modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9-data.json rename to modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q9.json From 31d1751e211d80d9a223c1591b6d16b462f75a3f Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Mon, 19 Sep 2022 15:54:11 +0200 Subject: [PATCH 046/124] Implement CQL Is --- docs/conformance/cql.md | 2 +- .../src/blaze/elm/compiler/type_operators.clj | 60 ++++++- modules/cql/test/blaze/cql_test.clj | 2 - .../elm/compiler/type_operators_test.clj | 162 +++++++++++++++++- modules/cql/test/blaze/elm/literal.clj | 5 + modules/cql/test/data_readers.clj | 1 + 6 files changed, 227 insertions(+), 5 deletions(-) diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index 2d8e89517..fd104621d 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -340,7 +340,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.15. | ConvertsToString | ✓ | | | | 22.16. | ConvertsToTime | ✓ | | | | 22.17. | Descendents | ✓ | | | -| 22.18. | Is | ✗ | | | +| 22.18. | Is | ✓ | | | | 22.19. | ToBoolean | ✓ | | | | 22.20. | ToChars | ✓ | | | | 22.21. | ToConcept | ✗ | | | diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index 3f078a70e..85ea6911a 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -228,7 +228,65 @@ (->DescendentsOperatorExpression source))) -;; TODO 22.18. Is +;; 22.18. Is +(defrecord IsExpression [operand type pred] + core/Expression + (-eval [_ context resource scope] + (pred (core/-eval operand context resource scope))) + (-form [_] + `(~'is ~type ~(core/-form operand)))) + + +(defn- matches-elm-named-type-is [type-name] + (case type-name + "Boolean" ['elm/boolean boolean?] + "Integer" ['elm/integer int?] + "Long" ['elm/long system/long?] + "Decimal" ['elm/decimal decimal?] + "Date" ['elm/date system/date?] + "DateTime" ['elm/date-time date-time/temporal?] + "Quantity" ['elm/quantity quantity/quantity?] + "String" ['elm/string string?])) + + +(defn- matches-named-type-is [type-name] + (let [[type-ns type-name] (elm-util/parse-qualified-name type-name)] + (case type-ns + "http://hl7.org/fhir" + [(symbol "fhir" type-name) + (let [fhir-type (keyword "fhir" type-name)] + #(identical? fhir-type (fhir-spec/fhir-type %)))] + "urn:hl7-org:elm-types:r1" + (matches-elm-named-type-is type-name)))) + + +(defn- matches-type-specifier-is [is-type-specifier] + (case (:type is-type-specifier) + "NamedTypeSpecifier" + (matches-named-type-is (:name is-type-specifier)) + + "ListTypeSpecifier" + (let [[type pred] (matches-type-specifier-is (:elementType is-type-specifier))] + [`(~'list ~type) + (fn matches-type? [x] + (every? pred x))]))) + + +(defn- matches-type-is + [{is-type :isType is-type-specifier :isTypeSpecifier}] + (cond + is-type + (matches-named-type-is is-type) + + is-type-specifier + (matches-type-specifier-is is-type-specifier))) + + +(defmethod core/compile* :elm.compiler.type/is + [context {:keys [operand] :as expression}] + (let [[type pred] (matches-type-is expression)] + (->IsExpression (core/compile* context operand) type pred))) + ;; 22.19. ToBoolean (defunop to-boolean [x] diff --git a/modules/cql/test/blaze/cql_test.clj b/modules/cql/test/blaze/cql_test.clj index 16c228611..4057163ca 100644 --- a/modules/cql/test/blaze/cql_test.clj +++ b/modules/cql/test/blaze/cql_test.clj @@ -143,8 +143,6 @@ "StringToIntegerError" ; TODO: implement "StringToDateTime" ; TODO: implement "StringToTime" ; TODO: implement - "IntegerIsInteger" ; TODO: implement - "StringIsInteger" ; TODO: implement "StringNoToBoolean" ; TODO: implement "CodeToConcept1" ; TODO: implement "ToDateTime4" ; time zones don't match diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 2d646c4a8..4a59b320f 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -909,12 +909,172 @@ (tu/testing-unary-null elm/descendents)) -;; TODO 22.18. Is +;; 22.18. Is ;; ;; The Is operator allows the type of a result to be tested. The language must ;; support the ability to test against any type. If the run-time type of the ;; argument is of the type being tested, the result of the operator is true; ;; otherwise, the result is false. +(deftest compile-is-test + (testing "FHIR types" + (are [elm resource] (true? (core/-eval (c/compile {} elm) {} nil {"R" resource})) + #elm/is ["{http://hl7.org/fhir}boolean" + {:path "deceased" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Patient :id "0" :deceased true} + + #elm/is ["{http://hl7.org/fhir}integer" + {:path "value" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Observation :value (int 1)} + + #elm/is ["{http://hl7.org/fhir}decimal" + {:path "duration" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Media :duration 1.1M} + + #elm/is ["{http://hl7.org/fhir}string" + {:path "name" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Account :name "a"} + + #elm/is ["{http://hl7.org/fhir}uri" + {:path "url" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Measure :url #fhir/uri"a"} + + #elm/is ["{http://hl7.org/fhir}url" + {:path "address" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Endpoint :address #fhir/url"a"} + + #elm/is ["{http://hl7.org/fhir}dateTime" + {:path "value" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Observation :value #fhir/dateTime"2019-09-04"}) + + (are [elm resource] (false? (core/-eval (c/compile {} elm) {} nil {"R" resource})) + #elm/is ["{http://hl7.org/fhir}boolean" + {:path "deceased" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Patient :id "0" :deceased "foo"} + + #elm/is ["{http://hl7.org/fhir}integer" + {:path "value" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Observation :value true} + + #elm/is ["{http://hl7.org/fhir}decimal" + {:path "duration" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Media :duration #fhir/uri"a"} + + #elm/is ["{http://hl7.org/fhir}string" + {:path "name" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Account :name (int 1)} + + #elm/is ["{http://hl7.org/fhir}uri" + {:path "url" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Measure :url 1.1M} + + #elm/is ["{http://hl7.org/fhir}url" + {:path "address" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Endpoint :address #fhir/dateTime"2019-09-04"} + + #elm/is ["{http://hl7.org/fhir}dateTime" + {:path "value" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Observation :value #fhir/url"a"} + + #elm/is ["{http://hl7.org/fhir}Quantity" + {:path "value" + :scope "R" + :type "Property"}] + {:fhir/type :fhir/Observation :value #fhir/dateTime"2019-09-04"})) + + (testing "ELM types" + (are [elm] (true? (core/-eval (c/compile {} elm) {} nil nil)) + #elm/is ["{urn:hl7-org:elm-types:r1}Boolean" #elm/boolean "true"] + + #elm/is ["{urn:hl7-org:elm-types:r1}Integer" #elm/integer "1"] + + #elm/is ["{urn:hl7-org:elm-types:r1}Long" #elm/long "1"] + + #elm/is ["{urn:hl7-org:elm-types:r1}Decimal" #elm/decimal "-1.1"] + + #elm/is ["{urn:hl7-org:elm-types:r1}Quantity" #elm/quantity [10 "m"]] + + #elm/is ["{urn:hl7-org:elm-types:r1}String" #elm/string "foo"] + + #elm/is ["{urn:hl7-org:elm-types:r1}Date" #elm/date "2020-03-08"] + + #elm/is ["{urn:hl7-org:elm-types:r1}DateTime" #elm/date-time "2019-09-04"]) + + (are [elm] (false? (core/-eval (c/compile {} elm) {} nil nil)) + #elm/is ["{urn:hl7-org:elm-types:r1}Boolean" #elm/integer "1"] + #elm/is ["{urn:hl7-org:elm-types:r1}Boolean" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}Integer" #elm/boolean "true"] + #elm/is ["{urn:hl7-org:elm-types:r1}Integer" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}Long" #elm/string "foo"] + #elm/is ["{urn:hl7-org:elm-types:r1}Long" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}Decimal" #elm/integer "1"] + #elm/is ["{urn:hl7-org:elm-types:r1}Decimal" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}Quantity" #elm/long "1"] + #elm/is ["{urn:hl7-org:elm-types:r1}Quantity" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}String" #elm/decimal "-1.1"] + #elm/is ["{urn:hl7-org:elm-types:r1}String" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}Date" #elm/date-time "2020-03-08"] + #elm/is ["{urn:hl7-org:elm-types:r1}Date" {:type "Null"}] + + #elm/is ["{urn:hl7-org:elm-types:r1}DateTime" #elm/string "2019-09-04"] + #elm/is ["{urn:hl7-org:elm-types:r1}DateTime" {:type "Null"}])) + + (testing "form" + (are [elm form] (= form (core/-form (c/compile {} elm))) + #elm/is ["{urn:hl7-org:elm-types:r1}Integer" {:type "Null"}] + '(is elm/integer nil) + + #elm/is ["{urn:hl7-org:elm-types:r1}Integer" #elm/integer "1"] + '(is elm/integer 1) + + #elm/is ["{http://hl7.org/fhir}dateTime" + {:path "value" + :scope "R" + :type "Property"}] + '(is fhir/dateTime (:value R)) + + {:type "Is" + :isTypeSpecifier + {:type "ListTypeSpecifier" + :elementType + {:type "NamedTypeSpecifier" + :name "{http://hl7.org/fhir}Quantity"}} + :operand #elm/integer "1"} + '(is (list fhir/Quantity) 1)))) + ;; 22.19. ToBoolean ;; diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index cc3f9635d..8c70da479 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -860,6 +860,11 @@ {:type "Descendents" :source source}) +;; 22.18. Is +(defn is [[type operand]] + {:type "Is" :isType type :operand operand}) + + ;; 22.19. ToBoolean (defn to-boolean [operand] {:type "ToBoolean" :operand operand}) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index 33ef2a785..f204f5f5d 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -83,6 +83,7 @@ elm/converts-to-time blaze.elm.literal/converts-to-time elm/children blaze.elm.literal/children elm/descendents blaze.elm.literal/descendents + elm/is blaze.elm.literal/is elm/to-boolean blaze.elm.literal/to-boolean elm/to-chars blaze.elm.literal/to-chars elm/to-date blaze.elm.literal/to-date From 8e7b98f6099d1812c33154fa7f177e43640184a7 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 14 Oct 2022 11:02:48 +0200 Subject: [PATCH 047/124] Update Dependencies --- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 5923b7951..8c6433720 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -8,4 +8,4 @@ {:mvn/version "3.21.7"} com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.4"}}} + {:mvn/version "2.13.4.2"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index c41592c3b..4f1a53c1a 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -7,11 +7,11 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.4"} + {:mvn/version "2.13.4.2"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.82.Final"}} + {:mvn/version "4.1.84.Final"}} :aliases {:test From 66da08162d2ca6b95d5399b9251916ea28187140 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 14 Oct 2022 14:40:02 +0200 Subject: [PATCH 048/124] Release v0.18.1 --- CHANGELOG.md | 9 +++++++++ README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 25a2a7783..28b6ea932 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## v0.18.1 + +### Security + +* Update Dependencies ([#817](https://github.com/samply/blaze/pull/817)) +* Uninstall wget because of CVE-2021-31879 ([#801](https://github.com/samply/blaze/pull/801)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/52?closed=1). + ## v0.18.0 ### New Features diff --git a/README.md b/README.md index 88325d598..d54cb6905 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.0][5] +Latest release: [v0.18.1][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 09d92e325..684a0af12 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.0 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.1 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.0" + "version": "0.18.1" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 9c72d2bb2..e20e30172 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.0). Look for `blaze-0.18.0-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.1). Look for `blaze-0.18.1-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.0-standalone.jar -m blaze.core +java -jar blaze-0.18.1-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.0-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.1-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.0-standalone.jar -m blaze.core +java -jar blaze-0.18.1-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.0 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.1 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.0" + "version": "0.18.1" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 6e9de7b51..6cc64aca1 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-09-22" + :date #fhir/dateTime"2022-10-14" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 36aa6ce0e..e77011a45 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.0 + 0.18.1 1.8 diff --git a/pom.xml b/pom.xml index b2958132e..771e8b95f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.18.0 + 0.18.1 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 91f648882..cef6da4ec 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.0" + {:blaze/version "0.18.1" :blaze/clock {} From d7d17b3ff380f3e1d9fd70156f9f8091f15e002e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 25 Oct 2022 18:59:52 +0200 Subject: [PATCH 049/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ deps.edn | 4 ++-- modules/anomaly/deps.edn | 2 +- modules/async/deps.edn | 2 +- modules/byte-buffer/deps.edn | 4 ++-- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/coll/deps.edn | 2 +- modules/cql/deps.edn | 2 +- modules/db-resource-store-cassandra/deps.edn | 2 +- modules/db-resource-store/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 2 +- modules/db-tx-log/deps.edn | 2 +- modules/db/deps.edn | 2 +- modules/executor/deps.edn | 2 +- modules/extern-terminology-service/deps.edn | 2 +- modules/fhir-client/deps.edn | 2 +- modules/fhir-path/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 2 +- modules/interaction/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/kv/deps.edn | 2 +- modules/luid/deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/openid-auth/deps.edn | 2 +- modules/operation-measure-evaluate-measure/deps.edn | 2 +- modules/page-store-cassandra/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- modules/rest-api/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- modules/rocksdb/deps.edn | 4 ++-- modules/scheduler/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/thread-pool-executor-collector/deps.edn | 2 +- 35 files changed, 43 insertions(+), 43 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3218afce3..dbd606a52 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 @@ -615,7 +615,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 @@ -950,7 +950,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1165' + cli: '1.11.1.1182' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index 1a3e29dcf..5062185f9 100644 --- a/deps.edn +++ b/deps.edn @@ -66,7 +66,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.1.932"} + {:mvn/version "2.1.939"} org.slf4j/slf4j-nop {:mvn/version "2.0.3"}} diff --git a/modules/anomaly/deps.edn b/modules/anomaly/deps.edn index f6a758cd4..0bf318019 100644 --- a/modules/anomaly/deps.edn +++ b/modules/anomaly/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/async/deps.edn b/modules/async/deps.edn index f643e0bd9..03cb78c30 100644 --- a/modules/async/deps.edn +++ b/modules/async/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 155f9fba1..55a52523e 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.7"}} + {:mvn/version "3.21.8"}} :aliases {:test @@ -13,6 +13,6 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]}}} diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 8c6433720..4f745571e 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.7"} + {:mvn/version "3.21.8"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.13.4.2"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 4f1a53c1a..4db3a2bf1 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index a7b3e14ab..2af1d55af 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -8,7 +8,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 76abb158e..4afb4d6b7 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -42,7 +42,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store-cassandra/deps.edn b/modules/db-resource-store-cassandra/deps.edn index 27763a9da..b8decc17d 100644 --- a/modules/db-resource-store-cassandra/deps.edn +++ b/modules/db-resource-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-resource-store/deps.edn b/modules/db-resource-store/deps.edn index fa9bbd129..28b69b97d 100644 --- a/modules/db-resource-store/deps.edn +++ b/modules/db-resource-store/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index cc3ea9a6e..fae37f62f 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db-tx-log/deps.edn b/modules/db-tx-log/deps.edn index 13b19c714..5d43ccc9b 100644 --- a/modules/db-tx-log/deps.edn +++ b/modules/db-tx-log/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/db/deps.edn b/modules/db/deps.edn index 9f817b9e0..5af2bc981 100644 --- a/modules/db/deps.edn +++ b/modules/db/deps.edn @@ -52,7 +52,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index 3110a2f5c..f533e4541 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -9,7 +9,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/extern-terminology-service/deps.edn b/modules/extern-terminology-service/deps.edn index 6e3da4f8f..cf710f865 100644 --- a/modules/extern-terminology-service/deps.edn +++ b/modules/extern-terminology-service/deps.edn @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-client/deps.edn b/modules/fhir-client/deps.edn index 2c112c48a..ed5f6a402 100644 --- a/modules/fhir-client/deps.edn +++ b/modules/fhir-client/deps.edn @@ -31,7 +31,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 5c4cdebf7..7ce97700f 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 07d7bc36b..bea67f21c 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -49,7 +49,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 688ee5d14..9301a2ee0 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/interaction/deps.edn b/modules/interaction/deps.edn index 88e8e6f89..4cb13eccd 100644 --- a/modules/interaction/deps.edn +++ b/modules/interaction/deps.edn @@ -28,7 +28,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 58c6414b8..0d1328bdf 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -12,7 +12,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/kv/deps.edn b/modules/kv/deps.edn index 5906be934..178d73575 100644 --- a/modules/kv/deps.edn +++ b/modules/kv/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index 24acbd1ed..af7e3b8e0 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index e342ad396..114e6fc17 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -19,7 +19,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/openid-auth/deps.edn b/modules/openid-auth/deps.edn index 578e964a8..ad3001226 100644 --- a/modules/openid-auth/deps.edn +++ b/modules/openid-auth/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/operation-measure-evaluate-measure/deps.edn b/modules/operation-measure-evaluate-measure/deps.edn index b977bf8f4..2b3a8c035 100644 --- a/modules/operation-measure-evaluate-measure/deps.edn +++ b/modules/operation-measure-evaluate-measure/deps.edn @@ -34,7 +34,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store-cassandra/deps.edn b/modules/page-store-cassandra/deps.edn index 09b762d35..34afece7f 100644 --- a/modules/page-store-cassandra/deps.edn +++ b/modules/page-store-cassandra/deps.edn @@ -25,7 +25,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index f2bc2ca1f..21e23d42d 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -27,7 +27,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-api/deps.edn b/modules/rest-api/deps.edn index 9f84938f2..f5f2e0a58 100644 --- a/modules/rest-api/deps.edn +++ b/modules/rest-api/deps.edn @@ -33,7 +33,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index 86b1faaab..2ff2fe1bb 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -32,7 +32,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index 6dfc71dda..a67b74e1a 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.6.0"}} + {:mvn/version "7.7.3"}} :aliases {:test @@ -22,7 +22,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/scheduler/deps.edn b/modules/scheduler/deps.edn index af329531b..901aa08f6 100644 --- a/modules/scheduler/deps.edn +++ b/modules/scheduler/deps.edn @@ -13,7 +13,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/server/deps.edn b/modules/server/deps.edn index 0ee881d51..a6e5a8433 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -30,7 +30,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} diff --git a/modules/thread-pool-executor-collector/deps.edn b/modules/thread-pool-executor-collector/deps.edn index 998a0d483..c2cd29b1a 100644 --- a/modules/thread-pool-executor-collector/deps.edn +++ b/modules/thread-pool-executor-collector/deps.edn @@ -16,7 +16,7 @@ :kaocha {:extra-deps {lambdaisland/kaocha - {:mvn/version "1.70.1086"}} + {:mvn/version "1.71.1119"}} :main-opts ["-m" "kaocha.runner"]} From da5f1038e2d430642c69ebf8fb462a205ec80ac6 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 25 Oct 2022 18:46:12 +0200 Subject: [PATCH 050/124] Fix Storage of Bundles with References Before, references inside Bundles were tried to resolve during transactions. That required resources to exists that were referenced inside Bundles. But Bundles should be stored "as-is", opaque without resolving any references in them. This fix, changes the function blaze.fhir.spec.type/references to not look inside Bundle entries. The integration test "bundle-with-references-test" was added to try to issue a transaction that stores a transaction bundle with a reference in it. --- .../bundle-with-references/bundle.json | 30 ++++++++++++ .github/workflows/build.yml | 31 +++++++++++++ .../src/blaze/fhir/spec/type.clj | 4 +- .../test/blaze/fhir/spec/generators.clj | 9 ++++ .../test/blaze/fhir/spec/type_test.clj | 4 +- .../test/blaze/fhir/spec_test.clj | 39 ++++++++++++++++ .../test/blaze/interaction/create_test.clj | 46 ++++++++++++++++++- 7 files changed, 157 insertions(+), 6 deletions(-) create mode 100644 .github/test-data/bundle-with-references/bundle.json diff --git a/.github/test-data/bundle-with-references/bundle.json b/.github/test-data/bundle-with-references/bundle.json new file mode 100644 index 000000000..ce33ae0fe --- /dev/null +++ b/.github/test-data/bundle-with-references/bundle.json @@ -0,0 +1,30 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Condition", + "subject": { + "reference": "Patient/db03f428-4fea-4006-bb90-aeaa7c6e9d1d" + } + }, + "request": { + "method": "POST", + "url": "Condition" + } + } + ] + }, + "request": { + "method": "POST", + "url": "Bundle" + } + } + ] +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3218afce3..379e1e22e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -601,6 +601,37 @@ jobs: - name: Test Include run: .github/scripts/include-without-referential-integrity.sh + # Test that a transaction can create a transaction bundle with references that will be taken "as-is" and not tried to + # resolve to existing resources + bundle-with-references-test: + needs: build + runs-on: ubuntu-20.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Install Blazectl + run: .github/scripts/install-blazectl.sh + + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Run Blaze + run: docker run --rm -d -e JAVA_TOOL_OPTIONS=-Xmx1g -p 8080:8080 blaze:latest + + - name: Wait for Blaze + run: .github/scripts/wait-for-url.sh http://localhost:8080/health + + - name: Load Data + run: blazectl --no-progress --server http://localhost:8080/fhir upload .github/test-data/bundle-with-references + jepsen-test: needs: build runs-on: ubuntu-20.04 diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type.clj b/modules/fhir-structure/src/blaze/fhir/spec/type.clj index 19dc7360a..fffddb10f 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type.clj @@ -1103,7 +1103,9 @@ (p/-hash-into (k m) sink)) (sort (keys m)))) (-references [m] - (transduce (mapcat p/-references) conj [] (vals m)))) + ;; Bundle entries have no references, because Bundles itself are stored "as-is" + (when-not (identical? :fhir.Bundle/entry (p/-type m)) + (transduce (mapcat p/-references) conj [] (vals m))))) (declare attachment) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/generators.clj b/modules/fhir-structure/test/blaze/fhir/spec/generators.clj index 4e06d67cf..cfafa5724 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/generators.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/generators.clj @@ -482,3 +482,12 @@ (->> (gen/tuple category) (to-map [:category]) (fhir-type :fhir/AllergyIntolerance))) + + +(defn bundle-entry + [& {:keys [id extension resource] + :or {id (gen/return nil) + extension (extensions)}}] + (->> (gen/tuple id extension resource) + (to-map [:id :extension :resource]) + (fhir-type :fhir.Bundle/entry))) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj index 433dc0b1e..41ec16691 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj @@ -109,9 +109,7 @@ (is (= "0" (murmur3 nil)))) (testing "references" - (are [x refs] (= refs (type/references x)) - nil - nil)))) + (is (nil? (type/references nil)))))) (deftest Object-test diff --git a/modules/fhir-structure/test/blaze/fhir/spec_test.clj b/modules/fhir-structure/test/blaze/fhir/spec_test.clj index 0d4c9eab9..50f0817f3 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec_test.clj @@ -4206,6 +4206,45 @@ {:score 1.1M})))) +(deftest bundle-entry-reference-test + (testing "transforming" + (testing "JSON" + (satisfies-prop 100 + (prop/for-all [x (fg/bundle-entry {:resource (fg/patient)})] + (= (->> x + fhir-spec/unform-json + fhir-spec/parse-json + (s2/conform :fhir.json.Bundle/entry)) + x)))) + + (testing "XML" + (satisfies-prop 100 + (prop/for-all [x (fg/bundle-entry {:resource (fg/patient)})] + (= (->> x + (s2/unform :fhir.xml.Bundle/entry) + (s2/conform :fhir.xml.Bundle/entry)) + x)))) + + (testing "CBOR" + (satisfies-prop 100 + (prop/for-all [x (fg/bundle-entry {:resource (fg/patient)})] + (= (->> x + fhir-spec/unform-cbor + fhir-spec/parse-cbor + (s2/conform :fhir.cbor.Bundle/entry)) + x))))) + + (testing "references" + (satisfies-prop 10 + (prop/for-all [x (fg/bundle-entry + {:resource + (fg/observation + {:subject + (fg/reference + {:reference (gen/return "Patient/0")})})})] + (empty? (type/references x)))))) + + ;; ---- Resources ------------------------------------------------------------- diff --git a/modules/interaction/test/blaze/interaction/create_test.clj b/modules/interaction/test/blaze/interaction/create_test.clj index 4c01b07de..bad7c0156 100644 --- a/modules/interaction/test/blaze/interaction/create_test.clj +++ b/modules/interaction/test/blaze/interaction/create_test.clj @@ -46,7 +46,8 @@ (def router (reitit/router [["/Patient" {:name :Patient/type}] - ["/Observation" {:name :Observation/type}]] + ["/Observation" {:name :Observation/type}] + ["/Bundle" {:name :Bundle/type}]] {:syntax :bracket})) @@ -115,6 +116,10 @@ (reitit/map->Match {:data {:fhir.resource/type "Observation"}})) +(def bundle-match + (reitit/map->Match {:data {:fhir.resource/type "Bundle"}})) + + (deftest handler-test (testing "errors on" (testing "missing body" @@ -391,4 +396,41 @@ :id := "AAAAAAAAAAAAAAAA" [:meta :versionId] := #fhir/id"1" [:meta :lastUpdated] := Instant/EPOCH - [:subject :reference] := "Patient/0"))))) + [:subject :reference] := "Patient/0")))) + + (testing "with a Bundle with references" + (with-handler [handler] + [] + (let [{:keys [status headers body]} + @(handler + {::reitit/match bundle-match + :body {:fhir/type :fhir/Bundle + :type #fhir/code"collection" + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Observation + :subject #fhir/Reference{:reference "Patient/0"}} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"POST" + :url #fhir/uri"Observation"}}]}})] + + (is (= 201 status)) + + (testing "Location header" + (is (= (str base-url "/Bundle/AAAAAAAAAAAAAAAA/_history/1") + (get headers "Location")))) + + (testing "Transaction time in Last-Modified header" + (is (= "Thu, 1 Jan 1970 00:00:00 GMT" (get headers "Last-Modified")))) + + (testing "Version in ETag header" + ;; 1 is the T of the transaction of the resource creation + (is (= "W/\"1\"" (get headers "ETag")))) + + (given body + :fhir/type := :fhir/Bundle + :id := "AAAAAAAAAAAAAAAA" + [:meta :versionId] := #fhir/id"1" + [:meta :lastUpdated] := Instant/EPOCH))))) From 8629c95dba0478f1e21446a8921e9f66a5ebc51f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 25 Oct 2022 20:01:06 +0200 Subject: [PATCH 051/124] Release v0.18.2 --- CHANGELOG.md | 12 ++++++++++++ README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 26 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 28b6ea932..4168f16d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v0.18.2 + +### Bugfixes + +* Fix Storage of Bundles with References ([#822](https://github.com/samply/blaze/pull/822)) + +### Security + +* Update Dependencies ([#824](https://github.com/samply/blaze/pull/824)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/53?closed=1). + ## v0.18.1 ### Security diff --git a/README.md b/README.md index d54cb6905..c00ec89ce 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.1][5] +Latest release: [v0.18.2][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 684a0af12..61e784096 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.1 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.2 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.1" + "version": "0.18.2" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index e20e30172..9861e3807 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.1). Look for `blaze-0.18.1-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.2). Look for `blaze-0.18.2-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.1-standalone.jar -m blaze.core +java -jar blaze-0.18.2-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.1-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.2-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.1-standalone.jar -m blaze.core +java -jar blaze-0.18.2-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.1 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.2 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.1" + "version": "0.18.2" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 6cc64aca1..0756e17e4 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-10-14" + :date #fhir/dateTime"2022-10-25" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index e77011a45..a14483768 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.1 + 0.18.2 1.8 diff --git a/pom.xml b/pom.xml index 771e8b95f..7b2090864 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.18.1 + 0.18.2 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index cef6da4ec..f54eaf226 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.1" + {:blaze/version "0.18.2" :blaze/clock {} From d49bc0f77fb4fd5703a9e3648a60c432c143625d Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 7 Nov 2022 09:05:51 +0100 Subject: [PATCH 052/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 4 ++-- modules/cassandra/deps.edn | 2 +- modules/cql/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 4 ++-- 7 files changed, 14 insertions(+), 14 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8e4cc889..b8a8e7bd5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 @@ -646,7 +646,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 @@ -981,7 +981,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1182' + cli: '1.11.1.1189' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 55a52523e..690f43e04 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.8"}} + {:mvn/version "3.21.9"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 4f745571e..a29b59f81 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.8"} + {:mvn/version "3.21.9"} com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.4.2"}}} + {:mvn/version "2.14.0"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 4db3a2bf1..e2a025ab1 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -7,7 +7,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.13.4.2"} + {:mvn/version "2.14.0"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 4afb4d6b7..c3e8001fb 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -5,7 +5,7 @@ {:local/root "../db"} com.fasterxml.jackson.module/jackson-module-jaxb-annotations - {:mvn/version "2.13.4"} + {:mvn/version "2.14.0"} info.cqframework/cql-to-elm {:mvn/version "1.5.10" diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index bea67f21c..91e8b85de 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -20,7 +20,7 @@ {:mvn/version "31.1-jre"} com.fasterxml.jackson.dataformat/jackson-dataformat-cbor - {:mvn/version "2.13.4"} + {:mvn/version "2.14.0"} com.taoensso/timbre {:mvn/version "5.2.1"} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 9301a2ee0..98cdecb07 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -8,10 +8,10 @@ [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor]} com.fasterxml.jackson.core/jackson-core - {:mvn/version "2.13.4"} + {:mvn/version "2.14.0"} com.fasterxml.jackson.dataformat/jackson-dataformat-smile - {:mvn/version "2.13.4"} + {:mvn/version "2.14.0"} hato/hato {:mvn/version "0.9.0"}} From a1d542eb335da01870c70da02bb38e8114545161 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 8 Nov 2022 13:19:53 +0100 Subject: [PATCH 053/124] Remove English Locale to Prevent CQL Parsing Bug Related to: #235 --- modules/cql/src/blaze/cql_translator.clj | 3 --- modules/cql/test/blaze/cql_translator_test.clj | 10 +++++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/modules/cql/src/blaze/cql_translator.clj b/modules/cql/src/blaze/cql_translator.clj index 34088e346..d781ca959 100644 --- a/modules/cql/src/blaze/cql_translator.clj +++ b/modules/cql/src/blaze/cql_translator.clj @@ -9,7 +9,6 @@ CqlTranslator CqlTranslator$Options FhirLibrarySourceProvider LibraryManager ModelManager ModelInfoProvider ModelInfoLoader] - [java.util Locale] [javax.xml.bind JAXB] [org.hl7.elm_modelinfo.r1 ModelInfo])) @@ -47,8 +46,6 @@ Returns an anomaly with category :cognitect.anomalies/incorrect in case of errors." [cql & {:keys [locators?]}] - ;; TODO: Remove if https://github.com/cqframework/clinical_quality_language/issues/579 is solved - (Locale/setDefault Locale/ENGLISH) (let [model-manager (ModelManager.) library-manager (LibraryManager. model-manager) _ (.registerProvider (.getLibrarySourceLoader library-manager) (FhirLibrarySourceProvider.)) diff --git a/modules/cql/test/blaze/cql_translator_test.clj b/modules/cql/test/blaze/cql_translator_test.clj index 8bfe3e15a..fdd17ef31 100644 --- a/modules/cql/test/blaze/cql_translator_test.clj +++ b/modules/cql/test/blaze/cql_translator_test.clj @@ -5,6 +5,7 @@ [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] + [cognitect.anomalies :as anom] [juxt.iota :refer [given]])) @@ -64,4 +65,11 @@ [:parameters :def 0 :name] := "MeasurementPeriod" [:parameters :def 0 :resultTypeSpecifier :type] := "IntervalTypeSpecifier" [:parameters :def 0 :resultTypeSpecifier :pointType :type] := "NamedTypeSpecifier" - [:parameters :def 0 :resultTypeSpecifier :pointType :name] := "{urn:hl7-org:elm-types:r1}DateTime"))) + [:parameters :def 0 :resultTypeSpecifier :pointType :name] := "{urn:hl7-org:elm-types:r1}DateTime")) + + (testing "Syntax Error" + (given (translate + "library Test + define Error: (") + ::anom/category := ::anom/incorrect + ::anom/message := "Syntax error at "))) From de4515f9f4c7d78b7de9bbc0cd853e8925c60d56 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 10 Nov 2022 08:06:45 +0100 Subject: [PATCH 054/124] Revert Purging curl for Future Docker Health Checks Docker health check will need curl. However I don't introduce the actual health check in this PR because I don't oversee all implications. For now we have one user that will put the health check in the Docker Compose file. --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 397600125..d0c41f0f7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM eclipse-temurin:17-jre RUN apt-get update && apt-get upgrade -y && \ - apt-get purge curl wget libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ + apt-get purge wget libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ apt-get autoremove -y && apt-get clean RUN mkdir -p /app/data && chown 1001:1001 /app/data From c15a1a9c618a97b24725b30218147fb7bc459c5d Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 10 Nov 2022 10:02:13 +0100 Subject: [PATCH 055/124] Release v0.18.3 --- CHANGELOG.md | 8 ++++++++ README.md | 4 ++-- docs/authentication/docker-compose.yml | 2 +- docs/deployment/distributed.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 10 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4168f16d3..4556705f5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.18.3 + +### Operation + +* Revert Purging curl for Future Docker Health Checks ([#831](https://github.com/samply/blaze/pull/831)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/54?closed=1). + ## v0.18.2 ### Bugfixes diff --git a/README.md b/README.md index c00ec89ce..f7cf95cc3 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.2][5] +Latest release: [v0.18.3][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/authentication/docker-compose.yml b/docs/authentication/docker-compose.yml index 08539dfb8..ce7e07cf5 100644 --- a/docs/authentication/docker-compose.yml +++ b/docs/authentication/docker-compose.yml @@ -11,7 +11,7 @@ services: volumes: - "../../.github/openid-auth-test/realm.json:/tmp/realm.json" blaze: - image: "ghcr.io/samply/blaze:1a90350d0ef932d99cbaab6e7168e3f40216a880" + image: "samply/blaze:0.18" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/deployment/distributed.md b/docs/deployment/distributed.md index 1d6ad31c0..01623ef02 100644 --- a/docs/deployment/distributed.md +++ b/docs/deployment/distributed.md @@ -172,7 +172,7 @@ docker-compose exec cassandra-1 cqlsh -u cassandra -p cassandra ```yaml blaze-1: - image: "ghcr.io/samply/blaze:c1958af39eacc7e0eb9db658e2c6258e2d946578" + image: "samply/blaze:0.18" hostname: "blaze-1" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" @@ -202,7 +202,7 @@ blaze-1: - cassandra-3 blaze-2: - image: "ghcr.io/samply/blaze:c1958af39eacc7e0eb9db658e2c6258e2d946578" + image: "samply/blaze:0.18" hostname: "blaze-2" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 61e784096..9b6c813ef 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.2 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.3 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.2" + "version": "0.18.3" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 9861e3807..8c6e316a0 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.2). Look for `blaze-0.18.2-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.3). Look for `blaze-0.18.3-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.2-standalone.jar -m blaze.core +java -jar blaze-0.18.3-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.2-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.3-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.2-standalone.jar -m blaze.core +java -jar blaze-0.18.3-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.2 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.3 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.2" + "version": "0.18.3" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 0756e17e4..46c409017 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-10-25" + :date #fhir/dateTime"2022-11-09" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index a14483768..357592624 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.2 + 0.18.3 1.8 diff --git a/pom.xml b/pom.xml index 7b2090864..f0eea1a86 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.18.2 + 0.18.3 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index f54eaf226..f25fada3f 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.2" + {:blaze/version "0.18.3" :blaze/clock {} From 10c068f05a063c1e1229a87259b86566c99800e2 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 11 Nov 2022 16:34:50 +0100 Subject: [PATCH 056/124] Add Form to Concatenate --- modules/cql/src/blaze/elm/compiler/macros.clj | 4 +++- .../cql/test/blaze/elm/compiler/string_operators_test.clj | 8 +++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/cql/src/blaze/elm/compiler/macros.clj b/modules/cql/src/blaze/elm/compiler/macros.clj index 632baa81d..9bbfa40d6 100644 --- a/modules/cql/src/blaze/elm/compiler/macros.clj +++ b/modules/cql/src/blaze/elm/compiler/macros.clj @@ -91,7 +91,9 @@ (reify core/Expression (~'-eval [~'_ context# resource# scope#] (let [~operands-binding (mapv #(core/-eval % context# resource# scope#) operands#)] - ~@body)))))) + ~@body)) + (~'-form [~'_] + (cons (quote ~name) (map core/-form operands#))))))) (defmacro defaggop diff --git a/modules/cql/test/blaze/elm/compiler/string_operators_test.clj b/modules/cql/test/blaze/elm/compiler/string_operators_test.clj index 5b896b757..c782cf6b1 100644 --- a/modules/cql/test/blaze/elm/compiler/string_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/string_operators_test.clj @@ -69,7 +69,13 @@ [#elm/string "a" #elm/string "b"] "ab" [#elm/string "a" {:type "Null"}] nil - [{:type "Null"}] nil)) + [{:type "Null"}] nil) + + (testing "form" + (are [args form] (= form (core/-form (c/compile {} {:type "Concatenate" :operand args}))) + [#elm/string "a"] '(concatenate "a") + [#elm/string "a" #elm/string "b"] '(concatenate "a" "b") + [#elm/string "a" {:type "Null"}] '(concatenate "a" nil)))) ;; 17.3. EndsWith From 7903fbabbbc57d1c42b67d869696f1833fe482a9 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 11 Nov 2022 17:32:00 +0100 Subject: [PATCH 057/124] Fix CQL Function Argument Hiding I added CQL functions in #501. Function arguments are added to the scope. However in queries, I had an optimization that overrode the scope with a single value if the scope was empty. The problem was that I did not pay attention to the function argument scope. To keeps things simple, I just removed the optimization. --- .github/workflows/build.yml | 6 + .../cql/src/blaze/elm/compiler/queries.clj | 122 ++++++++---------- .../blaze/elm/compiler/structured_values.clj | 6 +- .../test/blaze/elm/compiler/queries_test.clj | 52 +++++--- .../elm/compiler/structured_values_test.clj | 111 +--------------- .../evaluate_measure/measure_test.clj | 5 +- .../q47-managing-organization.cql | 14 ++ .../q47-managing-organization.json | 91 +++++++++++++ 8 files changed, 207 insertions(+), 200 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.cql create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.json diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b8a8e7bd5..c96b08587 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -447,6 +447,9 @@ jobs: - name: Evaluate CQL Query 34 - Subject List run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + - name: Evaluate CQL Query 46 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure//q46-between-date.cql 19 + - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https @@ -919,6 +922,9 @@ jobs: - name: Evaluate CQL Query 34 - Subject List run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + - name: Evaluate CQL Query 46 + run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure//q46-between-date.cql 19 + - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https diff --git a/modules/cql/src/blaze/elm/compiler/queries.clj b/modules/cql/src/blaze/elm/compiler/queries.clj index 9aa10f81b..dfba49f1e 100644 --- a/modules/cql/src/blaze/elm/compiler/queries.clj +++ b/modules/cql/src/blaze/elm/compiler/queries.clj @@ -19,17 +19,18 @@ (defprotocol XformFactory - (-create [_ context resource] + (-create [_ context resource scope] "Creates a xform which filters and/or shapes query sources.") (-form [_])) (defrecord WithXformFactory - [rhs rhs-operand such-that lhs-operand single-query-scope] + [rhs rhs-operand rhs-alias such-that lhs-operand lhs-alias] XformFactory - (-create [_ context resource] - (let [rhs (core/-eval rhs context resource nil) - indexer #(core/-eval rhs-operand context resource %)] + (-create [_ context resource scope] + (let [rhs (core/-eval rhs context resource scope) + indexer #(core/-eval rhs-operand context resource + (assoc scope rhs-alias %))] (if (some? such-that) (let [index (group-by indexer rhs)] (filter @@ -39,12 +40,13 @@ (get index))] (some #(core/-eval such-that context resource - {single-query-scope lhs-entity alias %}) + (assoc scope lhs-alias lhs-entity rhs-alias %)) rhs-entities))))) (let [index (into #{} (map indexer) rhs)] (filter (fn eval-with-clause [lhs-entity] - (some->> (core/-eval lhs-operand context resource lhs-entity) + (some->> (core/-eval lhs-operand context resource + (assoc scope lhs-alias lhs-entity)) (contains? index)))))))) (-form [_] (list 'with (core/-form rhs)))) @@ -56,27 +58,29 @@ (filter #(with-clause context resource %))))) -(defrecord WhereXformFactory [expr] +(defrecord WhereXformFactory [alias expr] XformFactory - (-create [_ context resource] - (filter #(core/-eval expr context resource %))) + (-create [_ context resource scope] + (filter #(core/-eval expr context resource (assoc scope alias %)))) (-form [_] - `(~'where ~(core/-form expr)))) + `(~'where ~(symbol alias) ~(core/-form expr)))) -(defn- where-xform-factory [expr] - (->WhereXformFactory expr)) +(defn- where-xform-factory [alias expr] + (->WhereXformFactory alias expr)) -(defrecord ReturnXformFactory [expr] +(defrecord ReturnXformFactory [alias expr] XformFactory - (-create [_ context resource] - (map #(core/-eval expr context resource %)))) + (-create [_ context resource scope] + (map #(core/-eval expr context resource (assoc scope alias %)))) + (-form [_] + `(~'return ~(symbol alias) ~(core/-form expr)))) (defrecord DistinctXformFactory [] XformFactory - (-create [_ _ _] + (-create [_ _ _ _] (distinct)) (-form [_] 'distinct)) @@ -84,26 +88,28 @@ (defrecord ComposedDistinctXformFactory [xform-factory] XformFactory - (-create [_ context resource] + (-create [_ context resource scope] (comp - (-create xform-factory context resource) - (distinct)))) + (-create xform-factory context resource scope) + (distinct))) + (-form [_] + `(~'distinct ~(-form xform-factory)))) -(defn- return-xform-factory [expr distinct] +(defn- return-xform-factory [alias expr distinct] (if (some? expr) (if distinct - (-> (->ReturnXformFactory expr) + (-> (->ReturnXformFactory alias expr) (->ComposedDistinctXformFactory)) - (->ReturnXformFactory expr)) + (->ReturnXformFactory alias expr)) (when distinct (->DistinctXformFactory)))) (defrecord ComposedXformFactory [factories] XformFactory - (-create [_ context resource] - (transduce (map #(-create % context resource)) comp factories)) + (-create [_ context resource scope] + (transduce (map #(-create % context resource scope)) comp factories)) (-form [_] `(~'comp ~@(map -form factories)))) @@ -133,7 +139,7 @@ core/Expression (-eval [_ context resource scope] (coll/eduction - (-create xform-factory context resource) + (-create xform-factory context resource scope) (core/-eval source context resource scope))) (-form [_] `(~'eduction-query ~(-form xform-factory) ~(core/-form source)))) @@ -148,7 +154,7 @@ (-eval [_ context resource scope] (into [] - (-create xform-factory context resource) + (-create xform-factory context resource scope) (core/-eval source context resource scope))) (-form [_] `(~'vector-query ~(-form xform-factory) ~(core/-form source)))) @@ -215,7 +221,7 @@ ;; TODO: build a comparator of all sort by items (->> (into [] - (-create xform-factory context resource) + (-create xform-factory context resource scope) (core/-eval source context resource scope)) (sort-by (if-let [expr (:expression sort-by-item)] @@ -278,12 +284,11 @@ (let [{:keys [expression alias]} (first sources) context (dissoc context :optimizations) source (core/compile* context expression) - context (assoc context :life/single-query-scope alias) with-equiv-clauses (filter (comp #{"WithEquiv"} :type) relationships) - with-xform-factories (map #(compile-with-equiv-clause context %) with-equiv-clauses) - where-xform-factory (some->> where (core/compile* context) (where-xform-factory)) + with-xform-factories (map #(compile-with-equiv-clause context alias %) with-equiv-clauses) + where-xform-factory (some->> where (core/compile* context) (where-xform-factory alias)) distinct (if (contains? optimizations :non-distinct) false distinct) - return-xform-factory (return-xform-factory (some->> return (core/compile* context)) distinct) + return-xform-factory (return-xform-factory alias (some->> return (core/compile* context)) distinct) xform-factory (xform-factory with-xform-factories where-xform-factory return-xform-factory) sort-by-items (mapv #(compile-sort-by-item context %) sort-by-items)] (if (empty? sort-by-items) @@ -305,23 +310,14 @@ (defrecord AliasRefExpression [key] core/Expression (-eval [_ _ _ scopes] - (get scopes key))) - - -(defrecord SingleScopeAliasRefExpression [] - core/Expression - (-eval [_ _ _ scope] - scope)) - - -(def single-scope-alias-ref-expression (->SingleScopeAliasRefExpression)) + (get scopes key)) + (-form [_] + `(~'alias-ref ~(symbol key)))) (defmethod core/compile* :elm.compiler.type/alias-ref - [{:life/keys [single-query-scope]} {:keys [name]}] - (if (= single-query-scope name) - single-scope-alias-ref-expression - (->AliasRefExpression name))) + [_ {:keys [name]}] + (->AliasRefExpression name)) ;; 10.7 IdentifierRef @@ -358,26 +354,20 @@ the semi-join here. Returns an XformFactory." - {:arglists '([context with-equiv-clause])} - [context {:keys [alias] rhs :expression equiv-operands :equivOperand - such-that :suchThat}] - (if-let [single-query-scope (:life/single-query-scope context)] - (if-let [rhs-operand (find-operand-with-alias equiv-operands alias)] - (if-let [lhs-operand (find-operand-with-alias equiv-operands - single-query-scope)] - (let [rhs (core/compile* context rhs) - rhs-operand (core/compile* (assoc context :life/single-query-scope alias) - rhs-operand) - lhs-operand (core/compile* context lhs-operand) - such-that (some->> such-that - (core/compile* (dissoc context :life/single-query-scope)))] - (->WithXformFactory rhs rhs-operand such-that lhs-operand - single-query-scope)) - (throw-anom missing-lhs-operand-anom)) - (throw-anom (missing-rhs-operand-anom alias))) - (throw-anom - (ba/incorrect - (format "Unsupported call without single query scope."))))) + {:arglists '([context lhs-alias with-equiv-clause])} + [context + lhs-alias + {rhs-alias :alias rhs :expression equiv-operands :equivOperand + such-that :suchThat}] + (if-let [rhs-operand (find-operand-with-alias equiv-operands rhs-alias)] + (if-let [lhs-operand (find-operand-with-alias equiv-operands lhs-alias)] + (let [rhs (core/compile* context rhs) + rhs-operand (core/compile* context rhs-operand) + lhs-operand (core/compile* context lhs-operand) + such-that (some->> such-that (core/compile* context))] + (->WithXformFactory rhs rhs-operand rhs-alias such-that lhs-operand lhs-alias)) + (throw-anom missing-lhs-operand-anom)) + (throw-anom (missing-rhs-operand-anom rhs-alias)))) ;; TODO 10.15. Without diff --git a/modules/cql/src/blaze/elm/compiler/structured_values.clj b/modules/cql/src/blaze/elm/compiler/structured_values.clj index e86e738f3..a136e37c7 100644 --- a/modules/cql/src/blaze/elm/compiler/structured_values.clj +++ b/modules/cql/src/blaze/elm/compiler/structured_values.clj @@ -121,13 +121,11 @@ (defmethod core/compile* :elm.compiler.type/property - [{:life/keys [single-query-scope] :as context} {:keys [source scope path]}] + [context {:keys [source scope path]}] (let [key (path->key path)] (cond source (->SourcePropertyExpression (core/compile* context source) key) scope - (if (= single-query-scope scope) - (->SingleScopePropertyExpression key) - (->ScopePropertyExpression scope key))))) + (->ScopePropertyExpression scope key)))) diff --git a/modules/cql/test/blaze/elm/compiler/queries_test.clj b/modules/cql/test/blaze/elm/compiler/queries_test.clj index cee6b06bb..5843e623a 100644 --- a/modules/cql/test/blaze/elm/compiler/queries_test.clj +++ b/modules/cql/test/blaze/elm/compiler/queries_test.clj @@ -100,13 +100,19 @@ (code/to-code "foo" nil "c")])))) (testing "Return non-distinct" - (are [query res] (= res (core/-eval (c/compile {} query) {} nil nil)) - {:type "Query" - :source - [{:alias "S" - :expression #elm/list [#elm/integer "1" #elm/integer "1"]}] - :return {:distinct false :expression {:type "AliasRef" :name "S"}}} - [1 1])) + (let [elm {:type "Query" + :source + [{:alias "S" + :expression #elm/list [#elm/integer "1" #elm/integer "1"]}] + :return {:distinct false :expression {:type "AliasRef" :name "S"}}} + expr (c/compile {} elm)] + + (testing "eval" + (is (= [1 1] (core/-eval expr {} nil nil)))) + + (testing "form" + (is (= '(vector-query (return S (alias-ref S)) [1 1]) + (core/-form expr)))))) (testing "with query hint optimize first" (let [elm {:type "Query" @@ -146,6 +152,7 @@ [{:alias "P" :expression retrieve}]} expr (c/compile {:node node :eval-context "Unfiltered"} elm)] + (testing "eval" (given (core/-eval expr {:db db} nil nil) [0 fhir-spec/fhir-type] := :fhir/Patient @@ -165,7 +172,7 @@ (testing "form" (is (= '(vector-query - (comp (where (equal (:gender default) 2)) distinct) + (comp (where P (equal (:gender P) 2)) distinct) (retrieve "Patient")) (core/-form expr))))) @@ -227,9 +234,12 @@ ;; 10.3. AliasRef (deftest compile-alias-ref-test - (are [elm res] (= res (core/-eval (c/compile {} elm) {} nil {"foo" ::result})) - {:type "AliasRef" :name "foo"} - ::result)) + (let [expr (c/compile {} {:type "AliasRef" :name "foo"})] + (testing "eval" + (is (= ::result (core/-eval expr {} nil {"foo" ::result})))) + + (testing "form" + (is (= '(alias-ref foo) (core/-form expr)))))) ;; 10.7 IdentifierRef @@ -274,13 +284,19 @@ :life/scopes #{"O1"} :life/source-type "{http://hl7.org/fhir}Observation"}]} compile-context - {:node node :life/single-query-scope "O0" :eval-context "Unfiltered"} - xform-factory (queries/compile-with-equiv-clause compile-context elm) + {:node node :eval-context "Unfiltered"} + xform-factory (queries/compile-with-equiv-clause compile-context "O0" elm) eval-context {:db (d/db node)} - xform (queries/-create xform-factory eval-context nil) + xform (queries/-create xform-factory eval-context nil nil) lhs-entity {:fhir/type :fhir/Observation :subject #fhir/Reference{:reference "Patient/0"}}] - (is (= [lhs-entity] (into [] xform [lhs-entity])))))) + + (testing "filtering" + (is (= [lhs-entity] (into [] xform [lhs-entity])))) + + (testing "form" + (is (= '(with (retrieve "Observation")) + (queries/-form xform-factory))))))) (testing "Equiv With with one Patient and one Observation comparing the patient with the operation subject." (with-system-data [{:blaze.db/keys [node]} mem-node-system] @@ -303,9 +319,9 @@ :life/scopes #{"O"} :life/source-type "{http://hl7.org/fhir}Observation"}]} compile-context - {:node node :life/single-query-scope "P" :eval-context "Unfiltered"} - xform-factory (queries/compile-with-equiv-clause compile-context elm) + {:node node :eval-context "Unfiltered"} + xform-factory (queries/compile-with-equiv-clause compile-context "P" elm) eval-context {:db (d/db node)} - xform (queries/-create xform-factory eval-context nil) + xform (queries/-create xform-factory eval-context nil nil) lhs-entity #fhir/Reference{:reference "Patient/0"}] (is (= [lhs-entity] (into [] xform [lhs-entity]))))))) diff --git a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj index 5dcb11a3d..d6d75b9dd 100644 --- a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj @@ -210,116 +210,7 @@ (c/compile {:eval-context "Patient"} elm)] - (is (= "value-114318" (core/-eval expr nil nil {"R" entity}))))))) - - (testing "with entity supplied directly" - (testing "Patient.identifier" - (testing "with source-type" - (let [elm - {:path "identifier" - :scope "R" - :type "Property" - :life/source-type "{http://hl7.org/fhir}Patient"} - identifier - #fhir/Identifier - {:system #fhir/uri"foo" - :value "bar"} - entity - {:fhir/type :fhir/Patient :id "0" - :identifier [identifier]} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm) - result (coll/first (core/-eval expr nil nil entity))] - (is (= identifier result)) - - (testing "form" - (is (= '(:identifier default) (core/-form expr)))))) - - (testing "without source-type" - (let [elm - {:path "identifier" - :scope "R" - :type "Property"} - identifier - #fhir/Identifier - {:system #fhir/uri"foo" - :value "bar"} - entity - {:fhir/type :fhir/Patient :id "0" - :identifier [identifier]} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm) - result (coll/first (core/-eval expr nil nil entity))] - (is (= identifier result))))) - - (testing "Patient.gender" - (testing "with source-type" - (let [elm - {:path "gender" - :scope "R" - :type "Property" - :life/source-type "{http://hl7.org/fhir}Patient"} - entity - {:fhir/type :fhir/Patient :id "0" - :gender #fhir/code"male"} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm)] - (is (= #fhir/code"male" (core/-eval expr nil nil entity))))) - - (testing "without source-type" - (let [elm - {:path "gender" - :scope "R" - :type "Property"} - entity - {:fhir/type :fhir/Patient :id "0" - :gender #fhir/code"male"} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm)] - (is (= #fhir/code"male" (core/-eval expr nil nil entity)))))) - - (testing "Observation.value" - (testing "with source-type" - (let [elm - {:path "value" - :scope "R" - :type "Property" - :life/source-type "{http://hl7.org/fhir}Observation"} - entity - {:fhir/type :fhir/Observation :id "0" - :value "value-114318"} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm)] - (is (= "value-114318" (core/-eval expr nil nil entity))))) - - (testing "without source-type" - (let [elm - {:path "value" - :scope "R" - :type "Property"} - entity - {:fhir/type :fhir/Observation :id "0" :value "value-114318"} - expr - (c/compile - {:eval-context "Patient" - :life/single-query-scope "R"} - elm)] - (is (= "value-114318" (core/-eval expr nil nil entity)))))))) + (is (= "value-114318" (core/-eval expr nil nil {"R" entity})))))))) (testing "with source" (testing "Patient.identifier" diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index 707583126..c83f977a2 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -437,7 +437,8 @@ "q43-medication-3" 2 "q44-tnm-t" 1 "q45-histology" 1 - "q46-between-date" 1) + "q46-between-date" 1 + "q47-managing-organization" 1) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -619,5 +620,5 @@ (comment (log/set-level! :debug) - (evaluate "q46-between-date") + (evaluate "q47-managing-organization") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.cql new file mode 100644 index 000000000..fe3a50915 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.cql @@ -0,0 +1,14 @@ +library "q47-managing-organization" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Unfiltered + +define function "Organization Ref"(name System.String): + 'Organization/' + singleton from ( + [Organization] O where O.name = name return FHIRHelpers.ToString(O.id)) + +context Patient + +define InInitialPopulation: + Patient.managingOrganization.reference = "Organization Ref"('UKL Leipzig') diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.json new file mode 100644 index 000000000..63ac70538 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q47-managing-organization.json @@ -0,0 +1,91 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0", + "managingOrganization" : { + "reference": "Organization/0" + } + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "resource": { + "resourceType": "Organization", + "id": "0", + "name": "UKL Leipzig" + }, + "request": { + "method": "PUT", + "url": "Organization/0" + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} From 99fc73f6ec7968dc4e0edf62a9a1dc708067e8a6 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sat, 12 Nov 2022 10:46:41 +0100 Subject: [PATCH 058/124] Release v0.18.4 --- CHANGELOG.md | 8 ++++++++ README.md | 4 ++-- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- perf-test/gatling/pom.xml | 2 +- pom.xml | 2 +- src/blaze/system.clj | 2 +- 8 files changed, 22 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4556705f5..5ebd3717b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.18.4 + +### Bugfixes + +* Fix CQL Function Argument Hiding ([#835](https://github.com/samply/blaze/pull/835)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/55?closed=1). + ## v0.18.3 ### Operation diff --git a/README.md b/README.md index f7cf95cc3..efdee3c2e 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.3][5] +Latest release: [v0.18.4][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 9b6c813ef..12140a159 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.3 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.4 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.3" + "version": "0.18.4" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 8c6e316a0..09f9a7dce 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.3). Look for `blaze-0.18.3-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.4). Look for `blaze-0.18.4-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.3-standalone.jar -m blaze.core +java -jar blaze-0.18.4-standalone.jar -m blaze.core ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.3-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.4-standalone.jar -m blaze.core ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.3-standalone.jar -m blaze.core +java -jar blaze-0.18.4-standalone.jar -m blaze.core ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.3 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.4 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.3" + "version": "0.18.4" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 46c409017..2490bd43b 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,7 +117,7 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-11-09" + :date #fhir/dateTime"2022-11-12" :software {:name "Blaze" :version version} diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 357592624..924cdf32a 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.3 + 0.18.4 1.8 diff --git a/pom.xml b/pom.xml index f0eea1a86..1b3254d8f 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 samply blaze - 0.18.3 + 0.18.4 blaze A FHIR Store with internal, fast CQL Evaluation Engine diff --git a/src/blaze/system.clj b/src/blaze/system.clj index f25fada3f..0f330c57c 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.3" + {:blaze/version "0.18.4" :blaze/clock {} From efc345bf891c272b785d9a25d84a175ed40c9793 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 11 Oct 2022 10:21:35 +0200 Subject: [PATCH 059/124] Implement CQL ratio --- docs/conformance/cql.md | 2 +- .../blaze/elm/compiler/clinical_values.clj | 12 +- modules/cql/src/blaze/elm/ratio.clj | 43 ++++++++ modules/cql/src/blaze/elm/spec.clj | 21 ++++ .../elm/compiler/clinical_values_test.clj | 20 ++++ .../compiler/comparison_operators_test.clj | 103 +++++++++++++----- .../elm/compiler/type_operators_test.clj | 36 +++++- modules/cql/test/blaze/elm/literal.clj | 15 +++ modules/cql/test/blaze/elm/literal_spec.clj | 13 +++ modules/cql/test/blaze/elm/ratio_spec.clj | 16 +++ modules/cql/test/data_readers.clj | 1 + .../fhir-structure/resources/data_readers.clj | 1 + 12 files changed, 249 insertions(+), 34 deletions(-) create mode 100644 modules/cql/src/blaze/elm/ratio.clj create mode 100644 modules/cql/test/blaze/elm/ratio_spec.clj diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index fd104621d..f318e5df9 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -31,7 +31,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 3.7. | ConceptDef | ✗ | | | | 3.8. | ConceptRef | ✗ | | | | 3.9. | Quantity | ✓ | | | -| 3.10. | Ratio | ✗ | | | +| 3.10. | Ratio | ✓ | | | | 3.11. | ValueSetDef | ✗ | | | | 3.12. | ValueSetRef | ✗ | | | diff --git a/modules/cql/src/blaze/elm/compiler/clinical_values.clj b/modules/cql/src/blaze/elm/compiler/clinical_values.clj index 3cfbe7f30..715c860f2 100644 --- a/modules/cql/src/blaze/elm/compiler/clinical_values.clj +++ b/modules/cql/src/blaze/elm/compiler/clinical_values.clj @@ -8,7 +8,8 @@ [blaze.elm.code :as code] [blaze.elm.compiler.core :as core] [blaze.elm.date-time :as date-time] - [blaze.elm.quantity :as quantity])) + [blaze.elm.quantity :as quantity] + [blaze.elm.ratio :as ratio])) (defn- find-code-system-def @@ -102,8 +103,13 @@ ;; 3.10. Ratio -;; -;; TODO +(defmethod core/compile* :elm.compiler.type/ratio + [_ {:keys [numerator denominator]}] + (ratio/ratio (quantity/quantity (:value numerator) (or (:unit numerator) + "1")) + (quantity/quantity (:value denominator) (or (:unit denominator) + "1")))) + ;; 3.11. ValueSetDef ;; diff --git a/modules/cql/src/blaze/elm/ratio.clj b/modules/cql/src/blaze/elm/ratio.clj new file mode 100644 index 000000000..bd69ddba0 --- /dev/null +++ b/modules/cql/src/blaze/elm/ratio.clj @@ -0,0 +1,43 @@ +(ns blaze.elm.ratio + "Implementation of the ratio type. + Section numbers are according to + https://cql.hl7.org/04-logicalspecification.html." + (:require + [blaze.elm.protocols :as p])) + + +(set! *warn-on-reflection* true) + + +(defrecord Ratio [numerator denominator] + p/Equal + (equal [_ other] + (and (p/equal numerator (:numerator other)) + (p/equal denominator (:denominator other)))) + + p/Equivalent + (equivalent [_ other] + (if other + (p/equal (p/divide numerator denominator) + (p/divide (:numerator other) (:denominator other))) + false))) + + +(defn ratio + "Creates a ratio between two quantities." + [numerator denominator] + (->Ratio numerator denominator)) + + +;; 22.28. ToQuantity +(extend-protocol p/ToQuantity + Ratio + (to-quantity [x] + (p/divide (:denominator x) (:numerator x)))) + + +;; 22.30. ToString +(extend-protocol p/ToString + Ratio + (to-string [x] + (str (p/to-string (:numerator x)) ":" (p/to-string (:denominator x))))) diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index daba6ea62..6955c4ba0 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -402,6 +402,27 @@ :elm.quantity.temporal-keyword/unit hours-unit-gen}))) +;; 3.10. Ratio +(s/def :elm.ratio/type + #{"Ratio"}) + + +(s/def :elm.ratio/numerator + :elm/quantity) + + +(s/def :elm.ratio/denominator + :elm/quantity) + + +(s/def :elm/ratio + (s/keys + :req-un [:elm.ratio/type :elm.ratio/numerator :elm.ratio/denominator])) + + +(defmethod expression :elm.spec.type/ratio [_] + :elm/ratio) + ;; 4. Type Specifiers diff --git a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj index e036f8c87..473dd07eb 100644 --- a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj @@ -14,6 +14,7 @@ [blaze.elm.literal] [blaze.elm.literal-spec] [blaze.elm.quantity :as quantity] + [blaze.elm.ratio :as ratio] [blaze.test-util :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -171,3 +172,22 @@ (satisfies-prop 100 (prop/for-all [period (s/gen :elm/period)] (#{BigDecimal Period} (type (core/-eval (c/compile {} period) {} nil nil))))))) + + +;; 3.10. Ratio +;; +;; The Ratio type defines a ratio between two quantities. For example, the +;; titre 1:128, or the concentration ratio 5 mg/10 mL. The numerator and +;; denominator are both quantities. +(deftest compile-ratio-test + (testing "Examples" + (are [elm res] (= res (c/compile {} elm)) + #elm/ratio [[1 "s"] [1 "s"]] (ratio/ratio (quantity/quantity 1 "s") (quantity/quantity 1 "s")) + #elm/ratio [[1 ""] [128 ""]] (ratio/ratio (quantity/quantity 1 "") (quantity/quantity 128 "")) + #elm/ratio [[1 "s"] [1 ""]] (ratio/ratio (quantity/quantity 1 "s") (quantity/quantity 1 "")) + #elm/ratio [[1 ""] [1 "s"]] (ratio/ratio (quantity/quantity 1 "") (quantity/quantity 1 "s")) + #elm/ratio [[1 "cm2"] [1 "s"]] (ratio/ratio (quantity/quantity 1 "cm2") (quantity/quantity 1 "s")) + #elm/ratio [[1] [1]] (ratio/ratio (quantity/quantity 1 "") (quantity/quantity 1 "")) + #elm/ratio [[1] [1 "s"]] (ratio/ratio (quantity/quantity 1 "") (quantity/quantity 1 "s")) + #elm/ratio [[1 "s"] [1]] (ratio/ratio (quantity/quantity 1 "s") (quantity/quantity 1 "")) + #elm/ratio [[5 "mg"] [10 "g"]] (ratio/ratio (quantity/quantity 5 "mg") (quantity/quantity 10 "g"))))) diff --git a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj index 79e5cd6d2..127e1b47a 100644 --- a/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/comparison_operators_test.clj @@ -132,7 +132,22 @@ (tu/testing-binary-null elm/equal #elm/quantity [1])) - ;; TODO: Ratio + (testing "Ratio" + (are [x y res] (= res (tu/compile-binop elm/equal elm/ratio x y)) + [[1] [1]] [[1] [1]] true + [[1] [1]] [[2] [1]] false + [[1] [100]] [[10] [1000]] false + + [[1 "s"] [1 "s"]] [[1 "s"] [1 "s"]] true + [[1 "m"] [1 "m"]] [[1 "m"] [1 "m"]] true + [[100 "cm"] [100 "cm"]] [[1 "m"] [1 "m"]] true + [[1 "s"] [1 "s"]] [[1 "s"] [2 "s"]] false + [[1 "s"] [1 "s"]] [[2 "s"] [2 "s"]] false + [[2 "s"] [1 "s"]] [[1 "s"] [2 "s"]] false + [[1 "s"] [1 "s"]] [[1 "m"] [1 "m"]] false + [[1 "s"] [1 "m"]] [[1 "m"] [1 "s"]] false) + + (tu/testing-binary-null elm/equal #elm/ratio [[1] [1]])) (testing "Tuple" (are [x y res] (= res (tu/compile-binop elm/equal elm/tuple x y)) @@ -297,61 +312,97 @@ {:type "Null"} {:type "Null"} true)) (testing "Boolean" - (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) - #elm/boolean "true" #elm/boolean "true" true - #elm/boolean "true" #elm/boolean "false" false + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/boolean x y)) + "true" "true" true + "true" "false" false) + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) {:type "Null"} #elm/boolean "true" false #elm/boolean "true" {:type "Null"} false)) (testing "Integer" - (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) - #elm/integer "1" #elm/integer "1" true - #elm/integer "1" #elm/integer "2" false + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/integer x y)) + "1" "1" true + "1" "2" false + "2" "1" false) + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) {:type "Null"} #elm/integer "1" false #elm/integer "1" {:type "Null"} false)) (testing "Decimal" - (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) - #elm/decimal "1.1" #elm/decimal "1.1" true - #elm/decimal "1.1" #elm/decimal "2.1" false + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/decimal x y)) + "1.1" "1.1" true + "1.1" "2.1" false + "2.1" "1.1" false + + "1.1" "1.10" true + "1.10" "1.1" true) + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) {:type "Null"} #elm/decimal "1.1" false #elm/decimal "1.1" {:type "Null"} false)) (testing "Mixed Integer Decimal" - (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) + (are [x y res] (= res (c/compile {} (elm/equivalent [x y]))) #elm/integer "1" #elm/decimal "1" true #elm/decimal "1" #elm/integer "1" true)) (testing "Quantity" - (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) - #elm/quantity [1] #elm/quantity [1] true - #elm/quantity [1] #elm/quantity [2] false + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/quantity x y)) + [1] [1] true + [1] [2] false - #elm/quantity [1 "s"] #elm/quantity [1 "s"] true - #elm/quantity [1 "m"] #elm/quantity [1 "m"] true - #elm/quantity [100 "cm"] #elm/quantity [1 "m"] true - #elm/quantity [1 "s"] #elm/quantity [2 "s"] false - #elm/quantity [1 "s"] #elm/quantity [1 "m"] false + [1 "s"] [1 "s"] true + [1 "m"] [1 "m"] true + [100 "cm"] [1 "m"] true + [1 "s"] [2 "s"] false + [1 "s"] [1 "m"] false) + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) {:type "Null"} #elm/quantity [1] false #elm/quantity [1] {:type "Null"} false {:type "Null"} #elm/quantity [1 "s"] false #elm/quantity [1 "s"] {:type "Null"} false)) - (testing "List" + (testing "Ratio" + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/ratio x y)) + [[1] [1]] [[1] [1]] true + [[1] [100]] [[10] [1000]] true + [[1] [1]] [[2] [1]] false + + [[1 "s"] [1 "s"]] [[1 "s"] [1 "s"]] true + [[1 "s"] [1 "s"]] [[1 "m"] [1 "m"]] true + [[1 "s"] [100 "s"]] [[10 "s"] [1000 "s"]] true + [[1 "s"] [1 "s"]] [[2 "s"] [2 "s"]] true + [[1 "m"] [1 "m"]] [[1 "m"] [1 "m"]] true + [[100 "cm"] [100 "cm"]] [[1 "m"] [1 "m"]] true + [[1000 "cm"] [100000 "cm"]] [[10 "m"] [1000 "m"]] true + [[100 "cm"] [1 "m"]] [[100 "cm"] [1 "m"]] true + [[1 "s"] [1 "s"]] [[1 "s"] [2 "s"]] false + [[2 "s"] [1 "s"]] [[1 "s"] [2 "s"]] false + [[1 "s"] [1 "m"]] [[1 "m"] [1 "s"]] false + [[1 "s"] [1 "s"]] [[1 "m"] [1 "s"]] false) + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) - #elm/list [#elm/integer "1"] #elm/list [#elm/integer "1"] true - #elm/list [] #elm/list [] true + {:type "Null"} #elm/ratio [[1] [1]] false + #elm/ratio [[1] [1]] {:type "Null"} false - #elm/list [#elm/integer "1"] #elm/list [] false - #elm/list [#elm/integer "1"] #elm/list [#elm/integer "2"] false - #elm/list [#elm/integer "1" #elm/integer "1"] - #elm/list [#elm/integer "1" #elm/integer "2"] false + {:type "Null"} #elm/ratio [[1 "s"] [1 "s"]] false + #elm/ratio [[1 "s"] [1 "s"]] {:type "Null"} false)) + (testing "List" + (are [x y res] (= res (tu/compile-binop elm/equivalent elm/list x y)) + [#elm/integer "1"] [#elm/integer "1"] true + [] [] true + + [#elm/integer "1"] [] false + [#elm/integer "1"] [#elm/integer "2"] false + [#elm/integer "1" #elm/integer "1"] + [#elm/integer "1" #elm/integer "2"] false) + + (are [x y res] (= res (core/-eval (c/compile {} (elm/equivalent [x y])) {} nil nil)) #elm/list [#elm/integer "1" {:type "Null"}] #elm/list [#elm/integer "1" {:type "Null"}] true #elm/list [{:type "Null"}] #elm/list [{:type "Null"}] true diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 4a59b320f..7a272efec 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -721,7 +721,13 @@ (testing "Decimal" (is (true? (tu/compile-unop elm/converts-to-quantity elm/decimal "1.1")))) - ;; TODO: Ratio + (testing "Ratio" + (are [x] (true? (tu/compile-unop elm/converts-to-quantity elm/ratio x)) + [[-1] [-1]] + [[1] [1]] + [[1 "s"] [1 "s"]] + [[1 "m"] [1 "s"]] + [[10 "s"] [1 "s"]])) (testing "dynamic" (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-quantity x))) @@ -811,7 +817,9 @@ (are [x] (true? (tu/compile-unop elm/converts-to-string elm/time x)) "01:00")) - ;; TODO: Ratio + (testing "Ratio" + (are [x] (true? (tu/compile-unop elm/converts-to-string elm/ratio x)) + [[1M "m"] [1M "m"]])) (testing "Tuple" (are [x] (false? (c/compile {} (elm/converts-to-string (elm/tuple x)))) @@ -1579,7 +1587,19 @@ "1" (quantity/quantity 1 "1") "1.1" (quantity/quantity 1.1M "1"))) - ;; TODO: Ratio + (testing "Ratio" + (are [x res] (p/equal res (core/-eval (tu/compile-unop elm/to-quantity + elm/ratio x) + {} nil nil)) + [[1] [1]] (quantity/quantity 1 "1") + [[-1] [1]] (quantity/quantity -1 "1") + + [[1 "s"] [1 "s"]] (quantity/quantity 1 "1") + [[1 "s"] [2 "s"]] (quantity/quantity 2 "1") + + [[1 "m"] [1 "s"]] (quantity/quantity 1 "s/m") + [[1 "s"] [1 "m"]] (quantity/quantity 1 "m/s") + [[100 "cm"] [1 "m"]] (quantity/quantity 1 "1"))) (tu/testing-unary-null elm/to-quantity) @@ -1681,7 +1701,15 @@ {} nil nil)) "01:00" "01:00")) - ;; TODO: Ratio + (testing "Ratio" + (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/ratio + x) + {} nil nil)) + [[1 "m"] [1 "m"]] "1 'm':1 'm'" + [[1 "m"] [2 "m"]] "1 'm':2 'm'" + [[1M "m"] [1M "m"]] "1 'm':1 'm'" + [[100M "m"] [1M "m"]] "100 'm':1 'm'" + [[1.1M "m"] [1.1M "m"]] "1.1 'm':1.1 'm'")) (tu/testing-unary-null elm/to-string) diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 8c70da479..cc134e5e7 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -92,6 +92,21 @@ (assoc :unit unit))) +;; 3.10. Ratio +(defn ratio + [[[numerator-value numerator-unit] [denominator-value denominator-unit]]] + {:type "Ratio" + :numerator (cond-> + {:type "Quantity" + :value numerator-value} + numerator-unit + (assoc :unit numerator-unit)) + :denominator (cond-> + {:type "Quantity" + :value denominator-value} + denominator-unit + (assoc :unit denominator-unit))}) + ;; 7. Parameters diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index cc144bfa7..77f267754 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -68,6 +68,19 @@ :ret :elm/expression) +;; 3.10. Ratio +(s/fdef elm/ratio + :args + (s/cat + :args + (s/spec + (s/cat + :numerator + (s/spec (s/cat :numerator-value number? :numerator-unit (s/? string?))) + :denominator + (s/spec (s/cat :denominator-value number? :denominator-unit (s/? string?)))))) + :ret :elm/expression) + ;; 9. Reusing Logic diff --git a/modules/cql/test/blaze/elm/ratio_spec.clj b/modules/cql/test/blaze/elm/ratio_spec.clj new file mode 100644 index 000000000..89256d6fc --- /dev/null +++ b/modules/cql/test/blaze/elm/ratio_spec.clj @@ -0,0 +1,16 @@ +(ns blaze.elm.ratio-spec + (:require + [blaze.anomaly-spec] + [blaze.elm.quantity :as quantity] + [blaze.elm.ratio :as ratio] + [clojure.spec.alpha :as s]) + (:import + [blaze.elm.ratio Ratio])) + + +(defn ratio? [x] + (instance? Ratio x)) + + +(s/fdef ratio/ratio + :args (s/cat :numerator quantity/quantity? :denominator quantity/quantity?)) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index f204f5f5d..c28db7f6c 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -8,6 +8,7 @@ elm/code blaze.elm.literal/code elm/code-ref blaze.elm.literal/code-ref elm/quantity blaze.elm.literal/quantity + elm/ratio blaze.elm.literal/ratio elm/parameter-ref blaze.elm.literal/parameter-ref elm/expression-ref blaze.elm.literal/expression-ref elm/function-ref blaze.elm.literal/function-ref diff --git a/modules/fhir-structure/resources/data_readers.clj b/modules/fhir-structure/resources/data_readers.clj index d1ab2c71a..21f203778 100644 --- a/modules/fhir-structure/resources/data_readers.clj +++ b/modules/fhir-structure/resources/data_readers.clj @@ -27,6 +27,7 @@ fhir/Coding blaze.fhir.spec.type/coding fhir/CodeableConcept blaze.fhir.spec.type/codeable-concept fhir/Quantity blaze.fhir.spec.type/quantity + fhir/Ratio blaze.fhir.spec.type/ratio fhir/Period blaze.fhir.spec.type/period fhir/Identifier blaze.fhir.spec.type/identifier fhir/HumanName blaze.fhir.spec.type/human-name From 06a4f904b38dd287d4f0db59300d81acb0b48419 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 15 Nov 2022 16:30:04 +0100 Subject: [PATCH 060/124] Implement CQL concept --- .../blaze/elm/compiler/clinical_values.clj | 9 ++- modules/cql/src/blaze/elm/concept.clj | 16 +++++ modules/cql/src/blaze/elm/spec.clj | 20 +++++- .../elm/compiler/clinical_values_test.clj | 72 ++++++++++++++++++- modules/cql/test/blaze/elm/concept_spec.clj | 16 +++++ modules/cql/test/blaze/elm/literal.clj | 11 +++ modules/cql/test/blaze/elm/literal_spec.clj | 13 +++- modules/cql/test/data_readers.clj | 1 + 8 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 modules/cql/src/blaze/elm/concept.clj create mode 100644 modules/cql/test/blaze/elm/concept_spec.clj diff --git a/modules/cql/src/blaze/elm/compiler/clinical_values.clj b/modules/cql/src/blaze/elm/compiler/clinical_values.clj index 715c860f2..e6413c3c9 100644 --- a/modules/cql/src/blaze/elm/compiler/clinical_values.clj +++ b/modules/cql/src/blaze/elm/compiler/clinical_values.clj @@ -7,6 +7,7 @@ [blaze.anomaly :as ba :refer [throw-anom]] [blaze.elm.code :as code] [blaze.elm.compiler.core :as core] + [blaze.elm.concept :as concept] [blaze.elm.date-time :as date-time] [blaze.elm.quantity :as quantity] [blaze.elm.ratio :as ratio])) @@ -72,8 +73,12 @@ ;; 3.6. Concept -;; -;; TODO +(defn- compile-codes [context codes] + (map #(core/compile* context %) codes)) + +(defmethod core/compile* :elm.compiler.type/concept + [context {:keys [codes]}] + (concept/to-concept (compile-codes context codes))) ;; 3.7. ConceptDef diff --git a/modules/cql/src/blaze/elm/concept.clj b/modules/cql/src/blaze/elm/concept.clj new file mode 100644 index 000000000..9ddfe3a21 --- /dev/null +++ b/modules/cql/src/blaze/elm/concept.clj @@ -0,0 +1,16 @@ +(ns blaze.elm.concept + "Implementation of the concept type." + (:require + [blaze.elm.protocols :as p])) + + +(defrecord Concept [codes] + p/Equivalent + ; todo + ) + + +(defn to-concept + "Returns a CQL concept" + [codes] + (->Concept codes)) diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index 6955c4ba0..4438e1c83 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -284,11 +284,13 @@ (s/def :elm.code/display string?) - -(defmethod expression :elm.spec.type/code [_] +(s/def :elm/code (s/keys :req-un [:elm.code/system :elm.code/code] :opt-un [:elm.code/display])) +(defmethod expression :elm.spec.type/code [_] + :elm/code) + ;; 3.2. CodeDef (s/def :elm.code-def/codeSystem @@ -316,6 +318,20 @@ :elm/code-system-ref) +;; 3.6. Concept +(s/def :elm.concept/codes + (s/coll-of :elm/code)) + + +(s/def :elm.concept/display + string?) + + +(defmethod expression :elm.spec.type/concept [_] + (s/keys :req-un [:elm.concept/codes] + :opt-un [:elm.concept/display])) + + ;; 3.9. Quantity (s/def :elm.quantity/type #{"Quantity"}) diff --git a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj index 473dd07eb..714dd54f6 100644 --- a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj @@ -10,6 +10,7 @@ [blaze.elm.compiler.clinical-values] [blaze.elm.compiler.core :as core] [blaze.elm.compiler.test-util :as tu] + [blaze.elm.concept-spec] [blaze.elm.date-time :as date-time] [blaze.elm.literal] [blaze.elm.literal-spec] @@ -24,6 +25,7 @@ [juxt.iota :refer [given]]) (:import [blaze.elm.code Code] + [blaze.elm.concept Concept] [blaze.elm.date_time Period])) @@ -136,7 +138,75 @@ ;; 3.6. Concept ;; ;; The Concept type represents a literal concept selector. -;; TODO +(deftest compile-concept-test + (testing "without version and one code" + (let [context + {:library + {:codeSystems + {:def [{:name "sys-def-115852" :id "system-115910"}]}}}] + (given + (c/compile context #elm/concept [[["sys-def-115852" "code-115927"]]]) + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-115910" + [:codes 0 :code] := "code-115927"))) + + (testing "without version and two codes" + (let [context + {:library + {:codeSystems + {:def [{:name "sys-def-115852" :id "system-115910"} + {:name "sys-def-115853" :id "system-115911"}]}}}] + (given + (c/compile context #elm/concept [[["sys-def-115852" "code-115927"] + ["sys-def-115853" "code-115928"]]]) + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-115910" + [:codes 0 :code] := "code-115927" + [:codes 1 type] := Code + [:codes 1 :system] := "system-115911" + [:codes 1 :code] := "code-115928"))) + + (testing "with version and one code" + (let [context + {:library + {:codeSystems + {:def + [{:name "sys-def-120434" + :id "system-120411" + :version "version-120408"}]}}}] + (given + (c/compile context #elm/concept [[["sys-def-120434" "code-115927"]]]) + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-120411" + [:codes 0 :version] := "version-120408" + [:codes 0 :code] := "code-115927"))) + + (testing "with version and two codes" + (let [context + {:library + {:codeSystems + {:def + [{:name "sys-def-120434" + :id "system-120411" + :version "version-120408"} + {:name "sys-def-115853" + :id "system-115911" + :version "version-115909"}]}}}] + (given + (c/compile context #elm/concept [[["sys-def-120434" "code-115927"] + ["sys-def-115853" "code-115928"]]]) + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-120411" + [:codes 0 :version] := "version-120408" + [:codes 0 :code] := "code-115927" + [:codes 1 type] := Code + [:codes 1 :system] := "system-115911" + [:codes 1 :version] := "version-115909" + [:codes 1 :code] := "code-115928")))) ;; 3.9. Quantity diff --git a/modules/cql/test/blaze/elm/concept_spec.clj b/modules/cql/test/blaze/elm/concept_spec.clj new file mode 100644 index 000000000..0d4f488d6 --- /dev/null +++ b/modules/cql/test/blaze/elm/concept_spec.clj @@ -0,0 +1,16 @@ +(ns blaze.elm.concept-spec + (:require + [blaze.elm.code-spec :as code-spec] + [blaze.elm.concept :as concept] + [clojure.spec.alpha :as s]) + (:import + [blaze.elm.concept Concept])) + + +(defn concept? [x] + (instance? Concept x)) + + +(s/fdef concept/to-concept + :args (s/cat :codes (s/coll-of code-spec/code?)) + :ret concept?) diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index cc134e5e7..4ea6e3036 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -83,6 +83,17 @@ {:type "CodeRef" :name name}) +;; 3.6. Concept +(defn concept [[codes display]] + (cond-> + {:type "Concept" + :codes (mapv (fn [[sys code]] {:type "Code" :system + {:type "CodeSystemRef", :name sys} + :code code}) codes)} + display + (assoc :display display))) + + ;; 3.9. Quantity (defn quantity [[value unit]] (cond-> diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index 77f267754..48fb11181 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -38,7 +38,7 @@ :ret :elm/expression) -;; 2.1. Instance +;; 2.2. Instance (s/fdef elm/instance :args (s/cat :arg (s/tuple string? (s/map-of string? :elm/expression))) :ret :elm/expression) @@ -62,6 +62,17 @@ :ret :elm/expression) +;; 3.6. Concept +(s/fdef elm/concept + :args (s/cat + :args + (s/spec (s/cat + :codes (s/coll-of (s/spec (s/cat :system-name string? + :code string?))) + :display (s/? string?)))) + :ret :elm/expression) + + ;; 3.9. Quantity (s/fdef elm/quantity :args (s/cat :args (s/spec (s/cat :value number? :unit (s/? string?)))) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index c28db7f6c..ef674d5ac 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -7,6 +7,7 @@ elm/instance blaze.elm.literal/instance elm/code blaze.elm.literal/code elm/code-ref blaze.elm.literal/code-ref + elm/concept blaze.elm.literal/concept elm/quantity blaze.elm.literal/quantity elm/ratio blaze.elm.literal/ratio elm/parameter-ref blaze.elm.literal/parameter-ref From c362bc1a9c5dba15369bd8b9831009894ffca195 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sat, 26 Nov 2022 22:45:42 +0100 Subject: [PATCH 061/124] Support HTTP Header If-None-Match in Update Interactions Closes: #782 --- .github/scripts/check-capability-statement.sh | 12 +- .../check-total-number-of-resources.sh | 10 +- .github/scripts/conditional-create.sh | 4 +- .../conditional-update-if-none-match.sh | 22 ++ .../scripts/download-resources-query-sort.sh | 2 +- .github/scripts/download-resources-query.sh | 2 +- .github/scripts/download-resources.sh | 14 +- .github/scripts/install-blazectl.sh | 2 +- .github/scripts/transaction-rw.sh | 38 +--- .github/scripts/transaction.sh | 38 +--- .github/scripts/util.sh | 10 + .github/workflows/build.yml | 6 + .../db-tx-log/src/blaze/db/tx_log/spec.clj | 7 +- modules/db/src/blaze/db/api.clj | 2 +- modules/db/src/blaze/db/node/transaction.clj | 14 +- .../src/blaze/db/node/tx_indexer/verify.clj | 45 +++- modules/db/src/blaze/db/spec.clj | 19 +- modules/db/test/blaze/db/api_test.clj | 25 ++- .../test/blaze/db/node/transaction_test.clj | 2 +- .../blaze/db/node/tx_indexer/verify_test.clj | 111 +++++++--- .../src/blaze/interaction/transaction.clj | 8 +- .../blaze/interaction/transaction/bundle.clj | 5 +- .../src/blaze/interaction/update.clj | 12 +- .../src/blaze/interaction/util.clj | 20 +- .../test/blaze/interaction/create_test.clj | 24 +-- .../test/blaze/interaction/delete_test.clj | 13 +- .../interaction/history/instance_test.clj | 18 +- .../blaze/interaction/history/system_test.clj | 17 +- .../blaze/interaction/history/type_test.clj | 33 ++- .../test/blaze/interaction/read_test.clj | 19 +- .../interaction/search_compartment_test.clj | 22 +- .../blaze/interaction/search_system_test.clj | 19 +- .../blaze/interaction/search_type_test.clj | 23 +- .../test/blaze/interaction/test_util.clj | 6 + .../interaction/transaction/bundle_test.clj | 20 +- .../blaze/interaction/transaction_test.clj | 197 +++++++++++++----- .../test/blaze/interaction/update_test.clj | 95 +++++++-- .../test/blaze/interaction/util_spec.clj | 2 +- .../test/blaze/interaction/util_test.clj | 3 - .../operation/evaluate_measure/test_util.clj | 6 + .../fhir/operation/evaluate_measure_test.clj | 20 +- .../src/blaze/rest_api/capabilities.clj | 6 +- 42 files changed, 645 insertions(+), 328 deletions(-) create mode 100755 .github/scripts/conditional-update-if-none-match.sh create mode 100644 .github/scripts/util.sh diff --git a/.github/scripts/check-capability-statement.sh b/.github/scripts/check-capability-statement.sh index fc6c4aa69..d321df487 100755 --- a/.github/scripts/check-capability-statement.sh +++ b/.github/scripts/check-capability-statement.sh @@ -1,10 +1,8 @@ #!/bin/bash -e -SOFTWARE_NAME=$(curl -s http://localhost:8080/fhir/metadata | jq -r .software.name) +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" -if [ "Blaze" = "$SOFTWARE_NAME" ]; then - echo "Success" -else - echo "Fail" - exit 1 -fi +BASE="http://localhost:8080/fhir" + +test "software name" "$(curl -s "$BASE/metadata" | jq -r .software.name)" "Blaze" diff --git a/.github/scripts/check-total-number-of-resources.sh b/.github/scripts/check-total-number-of-resources.sh index a0d58ef38..f20a690dc 100755 --- a/.github/scripts/check-total-number-of-resources.sh +++ b/.github/scripts/check-total-number-of-resources.sh @@ -1,10 +1,6 @@ #!/bin/bash -e -TOTAL=$(curl -s http://localhost:8080/fhir | jq -r .total) +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" -if [ "$1" = "$TOTAL" ]; then - echo "Success" -else - echo "Fail: total number of resources was $TOTAL but should be $1" - exit 1 -fi +test "total number of resources" "$(curl -s http://localhost:8080/fhir | jq -r .total)" "$1" diff --git a/.github/scripts/conditional-create.sh b/.github/scripts/conditional-create.sh index 2108be8d5..730951dea 100755 --- a/.github/scripts/conditional-create.sh +++ b/.github/scripts/conditional-create.sh @@ -34,7 +34,7 @@ STATUS=$(curl -sH "Content-Type: application/fhir+json" \ -d "$(bundle)" "$BASE" | jq -r '.entry[].response.status') if [ "$STATUS" = "201" ]; then - echo "OK: first atempt created the Organization" + echo "OK: first attempt created the Organization" else echo "Fail: status was ${STATUS} but should be 201" exit 1 @@ -44,7 +44,7 @@ STATUS=$(curl -sH "Content-Type: application/fhir+json" \ -d "$(bundle)" "$BASE" | jq -r '.entry[].response.status') if [ "$STATUS" = "200" ]; then - echo "OK: second atempt returned the already created Organization" + echo "OK: second attempt returned the already created Organization" else echo "Fail: status was ${STATUS} but should be 200" exit 1 diff --git a/.github/scripts/conditional-update-if-none-match.sh b/.github/scripts/conditional-update-if-none-match.sh new file mode 100755 index 000000000..5dfdb6a27 --- /dev/null +++ b/.github/scripts/conditional-update-if-none-match.sh @@ -0,0 +1,22 @@ +#!/bin/bash -e + +# +# This script first creates a patient and expects the conditional update with +# If-None-Match=* to fail afterwards. +# + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + +BASE="http://localhost:8080/fhir" +PATIENT_ID=$(curl -sH "Content-Type: application/fhir+json" \ + -d '{"resourceType": "Patient"}' "$BASE/Patient" | jq -r .id) + +PATIENT="{\"resourceType\": \"Patient\", \"id\": \"$PATIENT_ID\"}" +RESULT=$(curl -sXPUT -H "Content-Type: application/fhir+json" -H "If-None-Match: *" \ + -d "$PATIENT" "$BASE/Patient/$PATIENT_ID") + +test "resource type" "$(echo "$RESULT" | jq -r .resourceType)" "OperationOutcome" +test "severity" "$(echo "$RESULT" | jq -r .issue[0].severity)" "error" +test "code" "$(echo "$RESULT" | jq -r .issue[0].code)" "conflict" +test "diagnostics" "$(echo "$RESULT" | jq -r .issue[0].diagnostics)" "Resource \`Patient/$PATIENT_ID\` already exists." diff --git a/.github/scripts/download-resources-query-sort.sh b/.github/scripts/download-resources-query-sort.sh index c990a9999..e498ebd21 100755 --- a/.github/scripts/download-resources-query-sort.sh +++ b/.github/scripts/download-resources-query-sort.sh @@ -7,7 +7,7 @@ SORT=$3 EXPECTED_SIZE=$4 FILE_NAME_PREFIX="$(uuidgen)" -blazectl --server "$BASE" download "$TYPE" -q "_sort=$SORT&$QUERY" -o "$FILE_NAME_PREFIX-get".ndjson +blazectl --no-progress --server "$BASE" download "$TYPE" -q "_sort=$SORT&$QUERY" -o "$FILE_NAME_PREFIX-get".ndjson SIZE=$(wc -l "$FILE_NAME_PREFIX-get".ndjson | xargs | cut -d ' ' -f1) if [ "$EXPECTED_SIZE" = "$SIZE" ]; then diff --git a/.github/scripts/download-resources-query.sh b/.github/scripts/download-resources-query.sh index 2efe99c18..2b3f11bec 100755 --- a/.github/scripts/download-resources-query.sh +++ b/.github/scripts/download-resources-query.sh @@ -6,7 +6,7 @@ QUERY=$2 EXPECTED_SIZE=$3 FILE_NAME_PREFIX="$(uuidgen)" -blazectl --server "$BASE" download "$TYPE" -q "$QUERY" -o "$FILE_NAME_PREFIX-get".ndjson +blazectl --no-progress --server "$BASE" download "$TYPE" -q "$QUERY" -o "$FILE_NAME_PREFIX-get".ndjson SIZE=$(wc -l "$FILE_NAME_PREFIX-get".ndjson | xargs | cut -d ' ' -f1) if [ "$EXPECTED_SIZE" = "$SIZE" ]; then diff --git a/.github/scripts/download-resources.sh b/.github/scripts/download-resources.sh index 0d3dc6b53..3b8850011 100755 --- a/.github/scripts/download-resources.sh +++ b/.github/scripts/download-resources.sh @@ -1,17 +1,13 @@ #!/bin/bash -e +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + BASE="http://localhost:8080/fhir" TYPE=$1 EXPECTED_SIZE=$(curl -s "$BASE/${TYPE}?_summary=count" | jq -r .total) FILE_NAME=$(uuidgen) -blazectl --server $BASE download "$TYPE" -o "$FILE_NAME".ndjson - -SIZE=$(wc -l "$FILE_NAME".ndjson | xargs | cut -d ' ' -f1) +blazectl --no-progress --server $BASE download "$TYPE" -o "$FILE_NAME".ndjson -if [ "$EXPECTED_SIZE" = "$SIZE" ]; then - echo "Success: download size matches" -else - echo "Fail: download size was ${SIZE} but should be ${EXPECTED_SIZE}" - exit 1 -fi +test "download size" "$(wc -l "$FILE_NAME".ndjson | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh index 8199b33dc..6ba3a961f 100755 --- a/.github/scripts/install-blazectl.sh +++ b/.github/scripts/install-blazectl.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -VERSION=0.9.0 +VERSION=0.10.0 curl -sLO https://github.com/samply/blazectl/releases/download/v${VERSION}/blazectl-${VERSION}-linux-amd64.tar.gz tar xzf blazectl-${VERSION}-linux-amd64.tar.gz diff --git a/.github/scripts/transaction-rw.sh b/.github/scripts/transaction-rw.sh index b36cb2093..a319a3ff5 100755 --- a/.github/scripts/transaction-rw.sh +++ b/.github/scripts/transaction-rw.sh @@ -4,6 +4,9 @@ # This script creates and reads a patient in a single transaction. # +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + BASE="http://localhost:8080/fhir" PATIENT_ID="e42a47bb-a371-4cf5-9f17-51e59c1f612a" @@ -35,34 +38,7 @@ END } RESULT=$(curl -sH "Content-Type: application/fhir+json" -d "$(bundle)" "$BASE") -RESOURCE_TYPE="$(echo "$RESULT" | jq -r .resourceType)" -if [ "$RESOURCE_TYPE" = "Bundle" ]; then - echo "OK: the resource type is Bundle" -else - echo "Fail: the resource type is $RESOURCE_TYPE, expected Bundle" - exit 1 -fi - -BUNDLE_TYPE="$(echo "$RESULT" | jq -r .type)" -if [ "$BUNDLE_TYPE" = "transaction-response" ]; then - echo "OK: the bundle type is transaction-response" -else - echo "Fail: the bundle type is $BUNDLE_TYPE, expected transaction-response" - exit 1 -fi - -RESPONSE_STATUS="$(echo "$RESULT" | jq -r .entry[1].response.status)" -if [ "$RESPONSE_STATUS" = "200" ]; then - echo "OK: the response status is 200" -else - echo "Fail: the response status is $RESPONSE_STATUS, expected 200" - exit 1 -fi - -RESPONSE_PATIENT_ID="$(echo "$RESULT" | jq -r .entry[1].resource.id)" -if [ "$RESPONSE_PATIENT_ID" = "$PATIENT_ID" ]; then - echo "OK: patient id's match" -else - echo "Fail: response patient id was $RESPONSE_PATIENT_ID but should be $RESPONSE_PATIENT_ID" - exit 1 -fi +test "resource type" "$(echo "$RESULT" | jq -r .resourceType)" "Bundle" +test "bundle type" "$(echo "$RESULT" | jq -r .type)" "transaction-response" +test "response status" "$(echo "$RESULT" | jq -r .entry[1].response.status)" "200" +test "patient id" "$(echo "$RESULT" | jq -r .entry[1].resource.id)" "$PATIENT_ID" diff --git a/.github/scripts/transaction.sh b/.github/scripts/transaction.sh index 67f03f412..4188792ac 100755 --- a/.github/scripts/transaction.sh +++ b/.github/scripts/transaction.sh @@ -5,6 +5,9 @@ # request. # +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + BASE="http://localhost:8080/fhir" PATIENT_ID=$(curl -sH "Content-Type: application/fhir+json" \ -d '{"resourceType": "Patient"}' "$BASE/Patient" | jq -r .id) @@ -27,34 +30,7 @@ END } RESULT=$(curl -sH "Content-Type: application/fhir+json" -d "$(bundle)" "$BASE") -RESOURCE_TYPE="$(echo "$RESULT" | jq -r .resourceType)" -if [ "$RESOURCE_TYPE" = "Bundle" ]; then - echo "OK: the resource type is Bundle" -else - echo "Fail: the resource type is $RESOURCE_TYPE, expected Bundle" - exit 1 -fi - -BUNDLE_TYPE="$(echo "$RESULT" | jq -r .type)" -if [ "$BUNDLE_TYPE" = "transaction-response" ]; then - echo "OK: the bundle type is transaction-response" -else - echo "Fail: the bundle type is $BUNDLE_TYPE, expected transaction-response" - exit 1 -fi - -RESPONSE_STATUS="$(echo "$RESULT" | jq -r .entry[].response.status)" -if [ "$RESPONSE_STATUS" = "200" ]; then - echo "OK: the response status is 200" -else - echo "Fail: the response status is $RESPONSE_STATUS, expected 200" - exit 1 -fi - -RESPONSE_PATIENT_ID="$(echo "$RESULT" | jq -r .entry[].resource.id)" -if [ "$RESPONSE_PATIENT_ID" = "$PATIENT_ID" ]; then - echo "OK: patient id's match" -else - echo "Fail: response patient id was $RESPONSE_PATIENT_ID but should be $RESPONSE_PATIENT_ID" - exit 1 -fi +test "resource type" "$(echo "$RESULT" | jq -r .resourceType)" "Bundle" +test "bundle type" "$(echo "$RESULT" | jq -r .type)" "transaction-response" +test "response status" "$(echo "$RESULT" | jq -r .entry[].response.status)" "200" +test "patient id" "$(echo "$RESULT" | jq -r .entry[].resource.id)" "$PATIENT_ID" diff --git a/.github/scripts/util.sh b/.github/scripts/util.sh new file mode 100644 index 000000000..93519cd2d --- /dev/null +++ b/.github/scripts/util.sh @@ -0,0 +1,10 @@ +#!/bin/bash -e + +test() { + if [ "$2" = "$3" ]; then + echo "OK: the $1 is $3" + else + echo "Fail: the $1 is $2, expected $3" + exit 1 + fi +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c96b08587..4fa6d2c5b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -492,6 +492,9 @@ jobs: - name: Not Acceptable run: .github/scripts/not-acceptable.sh + - name: Conditional Update If-None-Match + run: .github/scripts/conditional-update-if-none-match.sh + not-enforcing-referential-integrity-test: needs: build runs-on: ubuntu-20.04 @@ -970,6 +973,9 @@ jobs: - name: Not Acceptable run: .github/scripts/not-acceptable.sh + - name: Conditional Update If-None-Match + run: .github/scripts/conditional-update-if-none-match.sh + - name: Docker Stats run: docker stats --no-stream diff --git a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj index 2bc1fd024..9a8622e5f 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj @@ -39,6 +39,10 @@ :blaze.db/t) +(s/def :blaze.db.tx-cmd/if-none-match + (s/or :any #{"*"} :t :blaze.db/t)) + + (defmulti tx-cmd "Transaction command" :op) @@ -57,7 +61,8 @@ :blaze.resource/id :blaze.resource/hash] :opt-un [:blaze.db.tx-cmd/refs - :blaze.db.tx-cmd/if-match])) + :blaze.db.tx-cmd/if-match + :blaze.db.tx-cmd/if-none-match])) (defmethod tx-cmd "delete" [_] diff --git a/modules/db/src/blaze/db/api.clj b/modules/db/src/blaze/db/api.clj index cd0c73302..ac564e819 100644 --- a/modules/db/src/blaze/db/api.clj +++ b/modules/db/src/blaze/db/api.clj @@ -52,7 +52,7 @@ A transaction operator can be one of the following: * [:create resource clauses?] - * [:put resource t?] + * [:put resource precondition?] * [:delete type id] Returns a CompletableFuture that completes with the database after the diff --git a/modules/db/src/blaze/db/node/transaction.clj b/modules/db/src/blaze/db/node/transaction.clj index d5474ecf6..9655555c7 100644 --- a/modules/db/src/blaze/db/node/transaction.clj +++ b/modules/db/src/blaze/db/node/transaction.clj @@ -30,8 +30,14 @@ (assoc :if-none-exist clauses))})) +(defn- prepare-if-none-match [if-none-match] + (if (= :any if-none-match) + "*" + if-none-match)) + + (defmethod prepare-op :put - [{:keys [references-fn]} [op resource matches]] + [{:keys [references-fn]} [op resource [precond-op precond]]] (let [hash (hash/generate resource) refs (references-fn resource)] {:hash-resource @@ -44,8 +50,10 @@ :hash hash} (seq refs) (assoc :refs refs) - matches - (assoc :if-match matches))})) + (identical? :if-match precond-op) + (assoc :if-match precond) + (identical? :if-none-match precond-op) + (assoc :if-none-match (prepare-if-none-match precond)))})) (defmethod prepare-op :delete diff --git a/modules/db/src/blaze/db/node/tx_indexer/verify.clj b/modules/db/src/blaze/db/node/tx_indexer/verify.clj index a6a04d9a8..a8212df41 100644 --- a/modules/db/src/blaze/db/node/tx_indexer/verify.clj +++ b/modules/db/src/blaze/db/node/tx_indexer/verify.clj @@ -147,9 +147,13 @@ (update-in [:stats tid :total] (fnil inc 0)))))) -(defn- verify-tx-cmd-put-msg [type id matches] - (if matches - (format "verify-tx-cmd :put %s/%s matches-t: %d" type id matches) +(defn- verify-tx-cmd-put-msg [type id if-match if-none-match] + (cond + if-match + (format "verify-tx-cmd :put %s/%s if-match: %d" type id if-match) + if-none-match + (format "verify-tx-cmd :put %s/%s if-none-match: %s" type id if-none-match) + :else (format "verify-tx-cmd :put %s/%s" type id))) @@ -161,21 +165,46 @@ (ba/conflict (precondition-failed-msg if-match type id) :http/status 412)) +(defn- precondition-any-failed-msg [type id] + (format "Resource `%s/%s` already exists." type id)) + + +(defn- precondition-any-failed-anomaly [type id] + (ba/conflict (precondition-any-failed-msg type id) :http/status 412)) + + +(defn- precondition-version-failed-msg [type id if-none-match] + (format "Resource `%s/%s` with version %d already exists." type id if-none-match)) + + +(defn- precondition-version-failed-anomaly [type id if-none-match] + (ba/conflict (precondition-version-failed-msg type id if-none-match) :http/status 412)) + + (defmethod verify-tx-cmd "put" - [db-before t res {:keys [type id hash if-match]}] - (log/trace (verify-tx-cmd-put-msg type id if-match)) + [db-before t res {:keys [type id hash if-match if-none-match]}] + (log/trace (verify-tx-cmd-put-msg type id if-match if-none-match)) (with-open [_ (prom/timer duration-seconds "verify-put")] (let [tid (codec/tid type) {:keys [num-changes op] :or {num-changes 0} old-t :t} (d/resource-handle db-before type id)] - (if (or (nil? if-match) (= if-match old-t)) + (cond + (and if-match (not= if-match old-t)) + (throw-anom (precondition-failed-anomaly if-match type id)) + + (and (some? old-t) (= "*" if-none-match)) + (throw-anom (precondition-any-failed-anomaly type id)) + + (and (some? old-t) (= if-none-match old-t)) + (throw-anom (precondition-version-failed-anomaly type id if-none-match)) + + :else (cond-> (-> (update res :entries into (index-entries tid id t hash (inc num-changes) :put)) (update :new-resources conj [type id]) (update-in [:stats tid :num-changes] (fnil inc 0))) (or (nil? old-t) (identical? :delete op)) - (update-in [:stats tid :total] (fnil inc 0))) - (throw-anom (precondition-failed-anomaly if-match type id)))))) + (update-in [:stats tid :total] (fnil inc 0))))))) (defmethod verify-tx-cmd "delete" diff --git a/modules/db/src/blaze/db/spec.clj b/modules/db/src/blaze/db/spec.clj index 19821f07d..3c63b8db6 100644 --- a/modules/db/src/blaze/db/spec.clj +++ b/modules/db/src/blaze/db/spec.clj @@ -72,10 +72,27 @@ :if-none-exist (s/? :blaze.db.tx-cmd/if-none-exist))) +(defmulti put-precond-op "Put precondition operator" first) + + +(defmethod put-precond-op :if-match [_] + (s/cat :op #{:if-match} + :t :blaze.db/t)) + + +(defmethod put-precond-op :if-none-match [_] + (s/cat :op #{:if-none-match} + :val (s/or :any #{:any} :t :blaze.db/t))) + + +(s/def :blaze.db.tx-op.put/precondition + (s/multi-spec put-precond-op first)) + + (defmethod tx-op :put [_] (s/cat :op #{:put} :resource :blaze/resource - :matches (s/? :blaze.db/t))) + :precondition (s/? :blaze.db.tx-op.put/precondition))) (defmethod tx-op :delete [_] diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index ad1d0bde6..0900bf59d 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -297,7 +297,30 @@ :id := "0" :gender := #fhir/code"female" [:meta :versionId] := #fhir/id"2" - [meta :blaze.db/op] := :put))) + [meta :blaze.db/op] := :put)) + + (testing "with if-none-match" + (testing "of any" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (given-failed-future + (d/transact + node + [[:put {:fhir/type :fhir/Patient :id "0"} [:if-none-match :any]]]) + ::anom/category := ::anom/conflict + ::anom/message := "Resource `Patient/0` already exists."))) + + (testing "of 1" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (given-failed-future + (d/transact + node + [[:put {:fhir/type :fhir/Patient :id "0"} [:if-none-match 1]]]) + ::anom/category := ::anom/conflict + ::anom/message := "Resource `Patient/0` with version 1 already exists."))))) (testing "Diamond Reference Dependencies" (with-system-data [{:blaze.db/keys [node]} system] diff --git a/modules/db/test/blaze/db/node/transaction_test.clj b/modules/db/test/blaze/db/node/transaction_test.clj index 4ef5d6f85..4a8a8615a 100644 --- a/modules/db/test/blaze/db/node/transaction_test.clj +++ b/modules/db/test/blaze/db/node/transaction_test.clj @@ -113,7 +113,7 @@ [0 0 :refs] :? empty?))) (testing "with matches" - (given (tx/prepare-ops context [[:put {:fhir/type :fhir/Patient :id "0"} 4]]) + (given (tx/prepare-ops context [[:put {:fhir/type :fhir/Patient :id "0"} [:if-match 4]]]) [0 0 :if-match] := 4))) (testing "delete" diff --git a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj index 3cdb53391..1648989bf 100644 --- a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj +++ b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj @@ -92,7 +92,27 @@ (sao/encode-key 1 tid-patient (codec/id-byte-string "0")) value] (type-stats/index-entry tid-patient 1 {:total 1 :num-changes 1}) - (system-stats/index-entry 1 {:total 1 :num-changes 1})])))) + (system-stats/index-entry 1 {:total 1 :num-changes 1})]))) + + (testing "using if-none-match of `*`" + (with-system [{:blaze.db/keys [node]} system] + (is-entries= + (verify/verify-tx-cmds + (d/db node) 1 + [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) + :if-none-match "*"}]) + (let [value (rts/encode-value (hash/generate patient-0) 1 :put)] + [[:resource-as-of-index + (rao/encode-key tid-patient (codec/id-byte-string "0") 1) + value] + [:type-as-of-index + (tao/encode-key tid-patient 1 (codec/id-byte-string "0")) + value] + [:system-as-of-index + (sao/encode-key 1 tid-patient (codec/id-byte-string "0")) + value] + (type-stats/index-entry tid-patient 1 {:total 1 :num-changes 1}) + (system-stats/index-entry 1 {:total 1 :num-changes 1})]))))) (testing "adding a second version of a patient to a store containing it already" (with-system [{:blaze.db/keys [node]} system] @@ -113,29 +133,29 @@ (sao/encode-key 2 tid-patient (codec/id-byte-string "0")) value] (type-stats/index-entry tid-patient 2 {:total 1 :num-changes 2}) - (system-stats/index-entry 2 {:total 1 :num-changes 2})])))) + (system-stats/index-entry 2 {:total 1 :num-changes 2})]))) - (testing "adding a second version of a patient to a store containing it already incl. matcher" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + (testing "using matching if-match" + (with-system [{:blaze.db/keys [node]} system] + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - (is-entries= - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0-v2) - :if-match 1}]) - (let [value (rts/encode-value (hash/generate patient-0-v2) 2 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 2) - value] - [:type-as-of-index - (tao/encode-key tid-patient 2 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 2 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 2 {:total 1 :num-changes 2}) - (system-stats/index-entry 2 {:total 1 :num-changes 2})])))) + (is-entries= + (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0-v2) + :if-match 1}]) + (let [value (rts/encode-value (hash/generate patient-0-v2) 2 :put)] + [[:resource-as-of-index + (rao/encode-key tid-patient (codec/id-byte-string "0") 2) + value] + [:type-as-of-index + (tao/encode-key tid-patient 2 (codec/id-byte-string "0")) + value] + [:system-as-of-index + (sao/encode-key 2 tid-patient (codec/id-byte-string "0")) + value] + (type-stats/index-entry tid-patient 2 {:total 1 :num-changes 2}) + (system-stats/index-entry 2 {:total 1 :num-changes 2})]))))) (testing "deleting a patient from an empty store" (with-system [{:blaze.db/keys [node]} system] @@ -242,17 +262,44 @@ (system-stats/index-entry 2 {:total 2 :num-changes 2})])))) (testing "update conflict" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + (testing "using non-matching if-match" + (with-system [{:blaze.db/keys [node]} system] + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) - :if-match 0}]) - ::anom/category := ::anom/conflict - ::anom/message := "Precondition `W/\"0\"` failed on `Patient/0`." - :http/status := 412))) + (given + (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) + :if-match 0}]) + ::anom/category := ::anom/conflict + ::anom/message := "Precondition `W/\"0\"` failed on `Patient/0`." + :http/status := 412))) + + (testing "using if-none-match of `*`" + (with-system [{:blaze.db/keys [node]} system] + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + + (given + (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) + :if-none-match "*"}]) + ::anom/category := ::anom/conflict + ::anom/message := "Resource `Patient/0` already exists." + :http/status := 412))) + + (testing "using matching if-none-match" + (with-system [{:blaze.db/keys [node]} system] + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + + (given + (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) + :if-none-match 1}]) + ::anom/category := ::anom/conflict + ::anom/message := "Resource `Patient/0` with version 1 already exists." + :http/status := 412)))) (testing "conditional create" (testing "conflict" diff --git a/modules/interaction/src/blaze/interaction/transaction.clj b/modules/interaction/src/blaze/interaction/transaction.clj index 7801e3de0..924cff805 100644 --- a/modules/interaction/src/blaze/interaction/transaction.clj +++ b/modules/interaction/src/blaze/interaction/transaction.clj @@ -409,7 +409,10 @@ (defn- batch-request [{:keys [context-path return-preference db] :blaze/keys [base-url]} - {{:keys [method url identity] if-match :ifMatch if-none-exist :ifNoneExist} + {{:keys [method url identity] + if-none-match :ifNoneMatch + if-match :ifMatch + if-none-exist :ifNoneExist} :request :keys [resource]}] (let [url (-> url type/value strip-leading-slash) [url query-string] (str/split url #"\?") @@ -428,6 +431,9 @@ return-preference (assoc-in [:headers "prefer"] (str "return=" return-preference)) + if-none-match + (assoc-in [:headers "if-none-match"] if-none-match) + if-match (assoc-in [:headers "if-match"] if-match) diff --git a/modules/interaction/src/blaze/interaction/transaction/bundle.clj b/modules/interaction/src/blaze/interaction/transaction/bundle.clj index 2ccf9b385..accdc95fc 100644 --- a/modules/interaction/src/blaze/interaction/transaction/bundle.clj +++ b/modules/interaction/src/blaze/interaction/transaction/bundle.clj @@ -38,9 +38,8 @@ (defmethod entry-tx-op "PUT" - [{{if-match :ifMatch} :request :keys [resource]}] - (let [t (iu/etag->t if-match)] - (cond-> [:put resource] t (conj t)))) + [{{if-match :ifMatch if-none-match :ifNoneMatch} :request :keys [resource]}] + (iu/put-tx-op resource if-match if-none-match)) (defmethod entry-tx-op "DELETE" diff --git a/modules/interaction/src/blaze/interaction/update.clj b/modules/interaction/src/blaze/interaction/update.clj index 05f8cef9a..177d69272 100644 --- a/modules/interaction/src/blaze/interaction/update.clj +++ b/modules/interaction/src/blaze/interaction/update.clj @@ -55,10 +55,8 @@ :else body)) -(defn- tx-op [resource if-match-t] - (cond-> [:put resource] - if-match-t - (conj if-match-t))) +(defn- tx-op [resource {:strs [if-match if-none-match]}] + (iu/put-tx-op resource if-match if-none-match)) (defn- response-context [{:keys [headers] :as request} db-after] @@ -75,12 +73,10 @@ (defn- handler [{:keys [node executor]}] (fn [{{{:fhir.resource/keys [type]} :data} ::reitit/match {:keys [id]} :path-params - :keys [body] - {:strs [if-match]} :headers + :keys [headers body] :as request}] (-> (ac/completed-future (validate-resource type id body)) - (ac/then-compose - #(d/transact node [(tx-op % (iu/etag->t if-match))])) + (ac/then-compose #(d/transact node [(tx-op % headers)])) ;; it's important to switch to the executor here, because otherwise ;; the central indexing thread would execute response building. (ac/then-apply-async identity executor) diff --git a/modules/interaction/src/blaze/interaction/util.clj b/modules/interaction/src/blaze/interaction/util.clj index 1630b089b..3bae9e937 100644 --- a/modules/interaction/src/blaze/interaction/util.clj +++ b/modules/interaction/src/blaze/interaction/util.clj @@ -9,9 +9,8 @@ (defn etag->t [etag] - (when etag - (let [[_ t] (re-find #"W/\"(\d+)\"" etag)] - (some-> t parse-long)))) + (let [[_ t] (re-find #"W/\"(\d+)\"" etag)] + (some-> t parse-long))) (defn- remove-query-param? [[k]] @@ -62,3 +61,18 @@ (defn t [db] (or (d/as-of-t db) (d/basis-t db))) + + +(defn- prep-if-none-match [if-none-match] + (if (= "*" if-none-match) + :any + (etag->t if-none-match))) + + +(defn put-tx-op [resource if-match if-none-match] + (let [if-match (some-> if-match etag->t) + if-none-match (some-> if-none-match prep-if-none-match)] + (cond + if-match [:put resource [:if-match if-match]] + if-none-match [:put resource [:if-none-match if-none-match]] + :else [:put resource]))) diff --git a/modules/interaction/test/blaze/interaction/create_test.clj b/modules/interaction/test/blaze/interaction/create_test.clj index bad7c0156..497159853 100644 --- a/modules/interaction/test/blaze/interaction/create_test.clj +++ b/modules/interaction/test/blaze/interaction/create_test.clj @@ -12,7 +12,7 @@ [blaze.fhir.response.create-spec] [blaze.fhir.spec.type] [blaze.interaction.create] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.interaction.util-spec] [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] @@ -101,11 +101,12 @@ ::reitit/router router)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{handler# :blaze.interaction/create} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{handler# :blaze.interaction/create} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults wrap-error)] + ~@body)))) (def patient-match @@ -124,7 +125,6 @@ (testing "errors on" (testing "missing body" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match patient-match})] @@ -139,7 +139,6 @@ (testing "type mismatch" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match patient-match @@ -157,7 +156,6 @@ (testing "violated referential integrity" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match observation-match @@ -175,7 +173,6 @@ (testing "on newly created resource" (testing "with no Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {::reitit/match patient-match @@ -202,7 +199,6 @@ (testing "with return=minimal Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {::reitit/match patient-match @@ -226,7 +222,6 @@ (testing "with return=representation Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {::reitit/match patient-match @@ -254,7 +249,6 @@ (testing "with return=OperationOutcome Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {::reitit/match patient-match @@ -279,7 +273,6 @@ (testing "conditional create" (testing "with empty header" (with-handler [handler] - [] (let [{:keys [status]} @(handler {::reitit/match patient-match @@ -291,7 +284,6 @@ (testing "with ignorable _sort search parameter" (with-handler [handler] - [] (let [{:keys [status]} @(handler {::reitit/match patient-match @@ -304,7 +296,6 @@ (testing "with non-matching query" (testing "on empty database" (with-handler [handler] - [] (let [{:keys [status]} @(handler {::reitit/match patient-match @@ -400,7 +391,6 @@ (testing "with a Bundle with references" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {::reitit/match bundle-match diff --git a/modules/interaction/test/blaze/interaction/delete_test.clj b/modules/interaction/test/blaze/interaction/delete_test.clj index af281e64e..a8762c11f 100644 --- a/modules/interaction/test/blaze/interaction/delete_test.clj +++ b/modules/interaction/test/blaze/interaction/delete_test.clj @@ -6,6 +6,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.executors :as ex] [blaze.interaction.delete] + [blaze.interaction.test-util :as itu] [blaze.test-util :as tu :refer [given-thrown]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -60,17 +61,17 @@ :blaze.test/executor {})) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{handler# :blaze.interaction/delete} system] - ~txs - (let [~handler-binding handler#] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{handler# :blaze.interaction/delete} system] + ~txs + (let [~handler-binding handler#] + ~@body)))) (deftest handler-test (testing "Returns No Content on non-existing resource" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {:path-params {:id "0"} diff --git a/modules/interaction/test/blaze/interaction/history/instance_test.clj b/modules/interaction/test/blaze/interaction/history/instance_test.clj index d7b9198c3..7378b4dc4 100644 --- a/modules/interaction/test/blaze/interaction/history/instance_test.clj +++ b/modules/interaction/test/blaze/interaction/history/instance_test.clj @@ -9,7 +9,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.interaction.history.instance] [blaze.interaction.history.util-spec] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.test-util :as tu :refer [given-thrown]] @@ -97,19 +97,19 @@ ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction.history/instance} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction.history/instance} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test (testing "returns not found on empty node" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"}})] diff --git a/modules/interaction/test/blaze/interaction/history/system_test.clj b/modules/interaction/test/blaze/interaction/history/system_test.clj index affa812d9..dac934b6b 100644 --- a/modules/interaction/test/blaze/interaction/history/system_test.clj +++ b/modules/interaction/test/blaze/interaction/history/system_test.clj @@ -8,6 +8,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.interaction.history.system] [blaze.interaction.history.util-spec] + [blaze.interaction.test-util :as itu] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.test-util :as tu :refer [given-thrown]] @@ -98,18 +99,18 @@ ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction.history/system} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#))] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction.history/system} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#))] + ~@body)))) (deftest handler-test - (testing "returns empty history on empty node" + (testing "with empty node" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {})] diff --git a/modules/interaction/test/blaze/interaction/history/type_test.clj b/modules/interaction/test/blaze/interaction/history/type_test.clj index 959126bd8..5aedea317 100644 --- a/modules/interaction/test/blaze/interaction/history/type_test.clj +++ b/modules/interaction/test/blaze/interaction/history/type_test.clj @@ -8,6 +8,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.interaction.history.type] [blaze.interaction.history.util-spec] + [blaze.interaction.test-util :as itu] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.test-util :as tu :refer [given-thrown]] @@ -99,15 +100,35 @@ ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction.history/type} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#))] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction.history/type} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#))] + ~@body)))) (deftest handler-test + (testing "with empty node" + (with-handler [handler] + (let [{:keys [status body]} + @(handler {})] + + (is (= 200 status)) + + (testing "the body contains a bundle" + (is (= :fhir/Bundle (:fhir/type body)))) + + (testing "the bundle id is an LUID" + (is (= "AAAAAAAAAAAAAAAA" (:id body)))) + + (is (= #fhir/code"history" (:type body))) + + (is (= #fhir/unsignedInt 0 (:total body))) + + (is (empty? (:entry body)))))) + (testing "with one patient" (with-handler [handler] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] diff --git a/modules/interaction/test/blaze/interaction/read_test.clj b/modules/interaction/test/blaze/interaction/read_test.clj index 99cb503cd..27acd7994 100644 --- a/modules/interaction/test/blaze/interaction/read_test.clj +++ b/modules/interaction/test/blaze/interaction/read_test.clj @@ -9,7 +9,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.db.spec] [blaze.interaction.read] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.test-util :as tu] @@ -49,19 +49,19 @@ (handler (assoc request ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction/read} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction/read} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test (testing "returns Not-Found on non-existing resource" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"}})] @@ -75,7 +75,6 @@ (testing "returns Not-Found on invalid version id" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0" :vid "a"}})] diff --git a/modules/interaction/test/blaze/interaction/search_compartment_test.clj b/modules/interaction/test/blaze/interaction/search_compartment_test.clj index e925393e8..6ac139c32 100644 --- a/modules/interaction/test/blaze/interaction/search_compartment_test.clj +++ b/modules/interaction/test/blaze/interaction/search_compartment_test.clj @@ -9,7 +9,7 @@ [blaze.interaction.search.nav-spec] [blaze.interaction.search.params-spec] [blaze.interaction.search.util-spec] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.page-store-spec] @@ -105,19 +105,19 @@ ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction/search-compartment} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction/search-compartment} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test (testing "Returns an Error on Invalid Id" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "" :type "Observation"}})] @@ -132,7 +132,6 @@ (testing "Returns an Error on Invalid Type" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0" :type ""}})] @@ -150,7 +149,6 @@ (testing "returns error" (testing "normal result" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0" :type "Observation"} @@ -167,7 +165,6 @@ (testing "summary result" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0" :type "Observation"} @@ -473,7 +470,6 @@ (testing "Returns an empty Bundle on Non-Existing Compartment" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0" :type "Observation"}})] diff --git a/modules/interaction/test/blaze/interaction/search_system_test.clj b/modules/interaction/test/blaze/interaction/search_system_test.clj index a0ef4bb4a..e1b2414d5 100644 --- a/modules/interaction/test/blaze/interaction/search_system_test.clj +++ b/modules/interaction/test/blaze/interaction/search_system_test.clj @@ -8,7 +8,7 @@ [blaze.interaction.search.nav-spec] [blaze.interaction.search.params-spec] [blaze.interaction.search.util-spec] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.page-store-spec] @@ -107,19 +107,19 @@ ::reitit/match match)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction/search-system} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction/search-system} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test (testing "on empty database" (with-handler [handler] - [] (testing "Returns all existing resources" (let [{:keys [status body]} @(handler {})] @@ -296,7 +296,6 @@ (testing "Include Resources" (testing "invalid include parameter" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:headers {"prefer" "handling=strict"} diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index 568e8ec8e..bd855837d 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -9,7 +9,7 @@ [blaze.interaction.search.nav-spec] [blaze.interaction.search.params-spec] [blaze.interaction.search.util-spec] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] [blaze.page-store-spec] @@ -175,13 +175,14 @@ ::reitit/router router)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# :blaze.interaction/search-type} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# :blaze.interaction/search-type} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test @@ -189,7 +190,6 @@ (testing "with strict handling" (testing "returns error" (with-handler [handler] - [] (testing "normal result" (let [{:keys [status body]} @(handler @@ -467,7 +467,6 @@ (testing "on unsupported second sort parameter" (testing "returns error" (with-handler [handler] - [] (testing "normal result" (let [{:keys [status body]} @(handler @@ -499,7 +498,6 @@ (testing "on invalid date-time" (testing "returns error" (with-handler [handler] - [] (testing "normal result" (let [{:keys [status body]} @(handler @@ -533,7 +531,6 @@ (testing "on invalid token" (testing "returns error" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match patient-page-match @@ -551,7 +548,6 @@ (testing "on missing token" (testing "returns error" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match patient-page-match @@ -2175,7 +2171,6 @@ (testing "invalid include parameter" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {::reitit/match patient-match diff --git a/modules/interaction/test/blaze/interaction/test_util.clj b/modules/interaction/test/blaze/interaction/test_util.clj index 562381cf3..a85e2062e 100644 --- a/modules/interaction/test/blaze/interaction/test_util.clj +++ b/modules/interaction/test/blaze/interaction/test_util.clj @@ -8,3 +8,9 @@ (fn [request] (-> (handler request) (ac/exceptionally handler-util/error-response)))) + + +(defn extract-txs-body [more] + (if (vector? (first more)) + [(first more) (next more)] + [[] more])) diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj index 824870a2b..189834a1c 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj @@ -123,7 +123,25 @@ [0 0] := :put [0 1 :fhir/type] := :fhir/Patient [0 1 :id] := "id-214728" - [0 2] := 215150)) + [0 2] := [:if-match 215150])) + + (testing "conditional update" + (given + (bundle/tx-ops + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient + :id "id-214728"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"PUT" + :url #fhir/uri"Patient/id-214728" + :ifNoneMatch "*"}}]) + [0 count] := 3 + [0 0] := :put + [0 1 :fhir/type] := :fhir/Patient + [0 1 :id] := "id-214728" + [0 2] := [:if-none-match :any])) (testing "delete" (given diff --git a/modules/interaction/test/blaze/interaction/transaction_test.clj b/modules/interaction/test/blaze/interaction/transaction_test.clj index 3bf704f47..d2648a116 100644 --- a/modules/interaction/test/blaze/interaction/transaction_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction_test.clj @@ -14,7 +14,7 @@ [blaze.interaction.delete] [blaze.interaction.read] [blaze.interaction.search-type] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.interaction.transaction] [blaze.interaction.update] [blaze.interaction.util-spec] @@ -183,18 +183,18 @@ :batch-handler (batch-handler router))))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{handler# :blaze.interaction/transaction - router# ::router} system] - ~txs - (let [~handler-binding (-> handler# (wrap-defaults router#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{handler# :blaze.interaction/transaction + router# ::router} system] + ~txs + (let [~handler-binding (-> handler# (wrap-defaults router#) + wrap-error)] + ~@body)))) (deftest handler-test (with-handler [handler] - [] (testing "on missing body" (let [{:keys [status body]} @(handler {})] @@ -241,7 +241,6 @@ (testing (format "On %s bundle" type) (testing "empty bundle" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -272,7 +271,6 @@ (testing "without return preference" (with-handler [handler] - [] (let [{:keys [status body] {[{:keys [resource response]}] :entry} :body} @(handler @@ -302,7 +300,6 @@ (testing "with representation return preference" (with-handler [handler] - [] (let [{:keys [status body] {[{:keys [resource response]}] :entry} :body} @(handler @@ -426,7 +423,6 @@ (testing "without return preference" (with-handler [handler] - [] (let [{:keys [status body] {[{:keys [resource response]}] :entry} :body} @(handler @@ -456,7 +452,6 @@ (testing "with representation return preference" (with-handler [handler] - [] (let [{:keys [status body] {[{:keys [resource response]}] :entry} :body} @(handler @@ -492,8 +487,6 @@ (testing "and conditional create interaction" (testing "with empty property" (with-handler [handler] - [] - (let [{:keys [status]} @(handler {:body @@ -514,8 +507,6 @@ (testing "with ignorable _sort search parameter" (with-handler [handler] - [] - (let [{:keys [status]} @(handler {:body @@ -754,7 +745,6 @@ (testing "and read interaction" (testing "returns Not-Found on non-existing resource" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry :as body} :body} @(handler @@ -831,7 +821,6 @@ (testing "On transaction bundle" (testing "on missing request" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -852,7 +841,6 @@ (testing "on missing request url" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -874,7 +862,6 @@ (testing "on missing request method" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -898,7 +885,6 @@ (testing "on unknown method" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -923,7 +909,6 @@ (testing "on unsupported method" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -949,7 +934,6 @@ (testing "and update interaction" (testing "on missing type in URL" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -974,7 +958,6 @@ (testing "on unknown type" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -999,7 +982,6 @@ (testing "on missing resource type" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1026,7 +1008,6 @@ (testing "on type mismatch" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1056,7 +1037,6 @@ (testing "on missing ID" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1085,7 +1065,6 @@ (testing "on missing ID in URL" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1112,7 +1091,6 @@ (testing "on invalid ID" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1142,7 +1120,6 @@ (testing "on ID mismatch" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1203,7 +1180,6 @@ (testing "on duplicate resources" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1238,7 +1214,6 @@ (testing "on violated referential integrity" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:body @@ -1268,7 +1243,6 @@ (testing "and create interaction" (testing "creates sequential identifiers" (with-handler [handler] - [] (let [{:keys [body]} @(handler {:headers {"prefer" "return=representation"} @@ -1320,12 +1294,77 @@ :fhir/type := :fhir/OperationOutcome [:issue 0 :severity] := #fhir/code"error" [:issue 0 :code] := #fhir/code"conflict" - [:issue 0 :diagnostics] := "Conditional create of a Patient with query `birthdate=2020` failed because at least the two matches `Patient/0/_history/1` and `Patient/1/_history/1` were found."))))))) + [:issue 0 :diagnostics] := "Conditional create of a Patient with query `birthdate=2020` failed because at least the two matches `Patient/0/_history/1` and `Patient/1/_history/1` were found.")))))) + + (testing "and conditional update interaction" + (testing "with if-none-match *" + (testing "on non-existing resource" + (with-handler [handler] + (let [{:keys [status] + {[{:keys [resource response]}] :entry :as body} :body} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type #fhir/code"transaction" + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient :id "0"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"PUT" + :url #fhir/uri"Patient/0" + :ifNoneMatch "*"}}]}})] + + (testing "response status" + (is (= 200 status))) + + (testing "bundle" + (given body + :fhir/type := :fhir/Bundle + :id := "AAAAAAAAAAAAAAAA" + :type := #fhir/code"transaction-response")) + + (testing "entry resource" + (is (nil? resource))) + + (testing "entry response" + (given response + :status := "201" + :etag := "W/\"1\"" + :lastModified := Instant/EPOCH))))) + + (testing "on existing resource" + (with-handler [handler] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [status body]} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type #fhir/code"transaction" + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient :id "0"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"PUT" + :url #fhir/uri"Patient/0" + :ifNoneMatch "*"}}]}})] + + (testing "returns error" + (is (= 412 status)) + + (given body + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"conflict" + [:issue 0 :diagnostics] := "Resource `Patient/0` already exists.")))))))) (testing "On batch bundle" (testing "on missing request" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1351,7 +1390,6 @@ (testing "on missing request url" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1378,7 +1416,6 @@ (testing "on missing request method" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1407,7 +1444,6 @@ (testing "on unknown method" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1437,7 +1473,6 @@ (testing "on unsupported method" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1467,7 +1502,6 @@ (testing "on metadata" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [resource response]}] :entry} :body} @(handler {:body @@ -1494,7 +1528,6 @@ (testing "and update interaction" (testing "on invalid type-level URL" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1562,7 +1595,6 @@ (testing "without return preference" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [resource response]}] :entry} :body} @(handler {:body @@ -1592,7 +1624,6 @@ (testing "leading slash in URL is removed" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [resource response]}] :entry} :body} @(handler {:body @@ -1622,7 +1653,6 @@ (testing "with representation return preference" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [resource response]}] :entry} :body} @(handler {:headers {"prefer" "return=representation"} @@ -1658,7 +1688,6 @@ (testing "and create interaction" (testing "on not-found type-level URL" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1690,7 +1719,6 @@ (testing "on invalid instance-level URL" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1722,7 +1750,6 @@ (testing "on violated referential integrity" (with-handler [handler] - [] (let [{:keys [status] {[{:keys [response]}] :entry} :body} @(handler {:body @@ -1791,6 +1818,78 @@ [:issue 0 :diagnostics] := "Conditional create of a Patient with query `birthdate=2020` failed because at least the two matches `Patient/0/_history/1` and `Patient/1/_history/1` were found." [:issue 0 :expression 0] := "Bundle.entry[0]"))))))) + (testing "and conditional update interaction" + (testing "with if-none-match *" + (testing "on non-existing resource" + (with-handler [handler] + (let [{:keys [status] + {[{:keys [resource response]}] :entry :as body} :body} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type #fhir/code"batch" + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient :id "0"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"PUT" + :url #fhir/uri"Patient/0" + :ifNoneMatch "*"}}]}})] + + (testing "response status" + (is (= 200 status))) + + (testing "bundle" + (given body + :fhir/type := :fhir/Bundle + :id := "AAAAAAAAAAAAAAAA" + :type := #fhir/code"batch-response")) + + (testing "entry resource" + (is (nil? resource))) + + (testing "entry response" + (given response + :status := "201" + :etag := "W/\"1\"" + :lastModified := Instant/EPOCH))))) + + (testing "on existing resource" + (with-handler [handler] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [status] {[{:keys [response]}] :entry} :body} + @(handler + {:body + {:fhir/type :fhir/Bundle + :type #fhir/code"batch" + :entry + [{:fhir/type :fhir.Bundle/entry + :resource + {:fhir/type :fhir/Patient :id "0"} + :request + {:fhir/type :fhir.Bundle.entry/request + :method #fhir/code"PUT" + :url #fhir/uri"Patient/0" + :ifNoneMatch "*"}}]}})] + + (testing "response status" + (is (= 200 status))) + + (testing "returns error" + (testing "with status" + (is (= "412" (:status response)))) + + (testing "with outcome" + (given (:outcome response) + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"conflict" + [:issue 0 :diagnostics] := "Resource `Patient/0` already exists." + [:issue 0 :expression 0] := "Bundle.entry[0]")))))))) + (testing "and search-type interaction" (with-handler [handler] [[[:create {:fhir/type :fhir/Patient :id "0"}] diff --git a/modules/interaction/test/blaze/interaction/update_test.clj b/modules/interaction/test/blaze/interaction/update_test.clj index bf971d88e..098093143 100644 --- a/modules/interaction/test/blaze/interaction/update_test.clj +++ b/modules/interaction/test/blaze/interaction/update_test.clj @@ -11,7 +11,7 @@ [blaze.executors :as ex] [blaze.fhir.response.create-spec] [blaze.fhir.spec.type] - [blaze.interaction.test-util :refer [wrap-error]] + [blaze.interaction.test-util :as itu :refer [wrap-error]] [blaze.interaction.update] [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] @@ -104,18 +104,18 @@ ::reitit/router router)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{handler# :blaze.interaction/update} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (itu/extract-txs-body more)] + `(with-system-data [{handler# :blaze.interaction/update} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults wrap-error)] + ~@body)))) (deftest handler-test (testing "erros on" (testing "missing body" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -132,7 +132,6 @@ (testing "type mismatch" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -152,7 +151,6 @@ (testing "missing id" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -172,7 +170,6 @@ (testing "ID mismatch" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -213,7 +210,6 @@ (testing "violated referential integrity" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -233,7 +229,6 @@ (testing "on newly created resource" (testing "with no Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {:path-params {:id "0"} @@ -264,7 +259,6 @@ (testing "with return=minimal Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {:path-params {:id "0"} @@ -292,7 +286,6 @@ (testing "with return=representation Prefer header" (with-handler [handler] - [] (let [{:keys [status headers body]} @(handler {:path-params {:id "0"} @@ -413,4 +406,76 @@ :fhir/type := :fhir/Observation :id := "0" [:meta :versionId] := #fhir/id"1" - [:meta :lastUpdated] := Instant/EPOCH)))))) + [:meta :lastUpdated] := Instant/EPOCH))))) + + (testing "conditional update" + (testing "if-none-match" + (testing "*" + (testing "with existing resource" + (with-handler [handler] + [[[:create {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [status body]} + @(handler + {:path-params {:id "0"} + ::reitit/match patient-match + :headers {"if-none-match" "*"} + :body {:fhir/type :fhir/Patient :id "0"}})] + + (testing "returns error" + (is (= 412 status)) + + (given body + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"conflict" + [:issue 0 :diagnostics] := "Resource `Patient/0` already exists."))))) + + (testing "with no existing resource" + (with-handler [handler] + + (let [{:keys [status]} + @(handler + {:path-params {:id "0"} + ::reitit/match patient-match + :headers {"if-none-match" "*"} + :body {:fhir/type :fhir/Patient :id "0"}})] + + (testing "Returns 201" + (is (= 201 status))))))) + + (testing "W/\"1\"" + (testing "with existing resource" + (with-handler [handler] + [[[:create {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [status body]} + @(handler + {:path-params {:id "0"} + ::reitit/match patient-match + :headers {"if-none-match" "W/\"1\""} + :body {:fhir/type :fhir/Patient :id "0"}})] + + (testing "returns error" + (is (= 412 status)) + + (given body + :fhir/type := :fhir/OperationOutcome + [:issue 0 :severity] := #fhir/code"error" + [:issue 0 :code] := #fhir/code"conflict" + [:issue 0 :diagnostics] := "Resource `Patient/0` with version 1 already exists.")))))) + + (testing "W/\"2\"" + (testing "with existing resource" + (with-handler [handler] + [[[:create {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [status]} + @(handler + {:path-params {:id "0"} + ::reitit/match patient-match + :headers {"if-none-match" "W/\"2\""} + :body {:fhir/type :fhir/Patient :id "0"}})] + + (testing "Returns 200" + (is (= 200 status)))))))))) diff --git a/modules/interaction/test/blaze/interaction/util_spec.clj b/modules/interaction/test/blaze/interaction/util_spec.clj index dd47c35e9..3f97e02b1 100644 --- a/modules/interaction/test/blaze/interaction/util_spec.clj +++ b/modules/interaction/test/blaze/interaction/util_spec.clj @@ -9,7 +9,7 @@ (s/fdef iu/etag->t - :args (s/cat :etag (s/nilable string?)) + :args (s/cat :etag string?) :ret (s/nilable :blaze.db/t)) diff --git a/modules/interaction/test/blaze/interaction/util_test.clj b/modules/interaction/test/blaze/interaction/util_test.clj index ed35694b8..094a18c08 100644 --- a/modules/interaction/test/blaze/interaction/util_test.clj +++ b/modules/interaction/test/blaze/interaction/util_test.clj @@ -21,9 +21,6 @@ (deftest etag->t-test - (testing "accepts nil" - (is (nil? (iu/etag->t nil)))) - (testing "valid ETag" (is (= 1 (iu/etag->t "W/\"1\"")))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/test_util.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/test_util.clj index e5dd5ed68..6644eaf96 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/test_util.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/test_util.clj @@ -8,3 +8,9 @@ (fn [request] (-> (handler request) (ac/exceptionally handler-util/error-response)))) + + +(defn extract-txs-body [more] + (if (vector? (first more)) + [(first more) (next more)] + [[] more])) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index d7b2ddf83..ad533d8d8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -4,7 +4,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.executors :as ex] [blaze.fhir.operation.evaluate-measure :as evaluate-measure] - [blaze.fhir.operation.evaluate-measure.test-util :refer [wrap-error]] + [blaze.fhir.operation.evaluate-measure.test-util :as etu :refer [wrap-error]] [blaze.fhir.spec.type :as type] [blaze.metrics.spec] [blaze.middleware.fhir.db :refer [wrap-db]] @@ -154,20 +154,20 @@ ::reitit/router router)))) -(defmacro with-handler [[handler-binding] txs & body] - `(with-system-data [{node# :blaze.db/node - handler# ::evaluate-measure/handler} system] - ~txs - (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) - wrap-error)] - ~@body))) +(defmacro with-handler [[handler-binding] & more] + (let [[txs body] (etu/extract-txs-body more)] + `(with-system-data [{node# :blaze.db/node + handler# ::evaluate-measure/handler} system] + ~txs + (let [~handler-binding (-> handler# wrap-defaults (wrap-db node#) + wrap-error)] + ~@body)))) (deftest handler-test (testing "Returns Not Found on Non-Existing Measure" (testing "on instance endpoint" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:path-params {:id "0"} @@ -184,7 +184,6 @@ (testing "on type endpoint" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:params @@ -203,7 +202,6 @@ (testing "with missing measure parameter" (with-handler [handler] - [] (let [{:keys [status body]} @(handler {:params diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 2490bd43b..5b52256ec 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -52,12 +52,13 @@ :history-type :create :search-type]) - :versioning #fhir/code"versioned" + :versioning #fhir/code"versioned-update" :readHistory true :updateCreate true :conditionalCreate true :conditionalRead #fhir/code"not-supported" :conditionalUpdate false + :conditionalPatch false :conditionalDelete #fhir/code"not-supported" :referencePolicy (cond-> @@ -120,7 +121,8 @@ :date #fhir/dateTime"2022-11-12" :software {:name "Blaze" - :version version} + :version version + :releaseDate #fhir/dateTime"2022-11-12"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" From 3d22ea35628a6f0c9d6361f9aeaa8be5554f954a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 27 Nov 2022 19:42:55 +0100 Subject: [PATCH 062/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ deps.edn | 6 +++--- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 4 ++-- modules/cql/deps.edn | 2 +- modules/fhir-structure/deps.edn | 4 ++-- modules/http-client/deps.edn | 4 ++-- modules/page-store/deps.edn | 2 +- modules/test-util/deps.edn | 2 +- 9 files changed, 19 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c96b08587..501ce84e1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 @@ -649,7 +649,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 @@ -987,7 +987,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1189' + cli: '1.11.1.1200' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index 5062185f9..a4e778825 100644 --- a/deps.edn +++ b/deps.edn @@ -41,7 +41,7 @@ {:mvn/version "1.3.6"} org.slf4j/slf4j-nop - {:mvn/version "2.0.3"}} + {:mvn/version "2.0.5"}} :aliases {:depstar @@ -80,10 +80,10 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.1.939"} + {:mvn/version "2.2.962"} org.slf4j/slf4j-nop - {:mvn/version "2.0.3"}} + {:mvn/version "2.0.5"}} :main-opts ["-m" "antq.core" diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index a29b59f81..1927961bb 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -8,4 +8,4 @@ {:mvn/version "3.21.9"} com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.14.0"}}} + {:mvn/version "2.14.1"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index e2a025ab1..c1a143263 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -7,11 +7,11 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.14.0"} + {:mvn/version "2.14.1"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.84.Final"}} + {:mvn/version "4.1.85.Final"}} :aliases {:test diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index c3e8001fb..fbeb358be 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -5,7 +5,7 @@ {:local/root "../db"} com.fasterxml.jackson.module/jackson-module-jaxb-annotations - {:mvn/version "2.14.0"} + {:mvn/version "2.14.1"} info.cqframework/cql-to-elm {:mvn/version "1.5.10" diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 91e8b85de..929456093 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -14,13 +14,13 @@ {:local/root "../module-base"} com.github.ben-manes.caffeine/caffeine - {:mvn/version "3.1.1"} + {:mvn/version "3.1.2"} com.google.guava/guava {:mvn/version "31.1-jre"} com.fasterxml.jackson.dataformat/jackson-dataformat-cbor - {:mvn/version "2.14.0"} + {:mvn/version "2.14.1"} com.taoensso/timbre {:mvn/version "5.2.1"} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 98cdecb07..53a715f15 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -8,10 +8,10 @@ [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor]} com.fasterxml.jackson.core/jackson-core - {:mvn/version "2.14.0"} + {:mvn/version "2.14.1"} com.fasterxml.jackson.dataformat/jackson-dataformat-smile - {:mvn/version "2.14.0"} + {:mvn/version "2.14.1"} hato/hato {:mvn/version "0.9.0"}} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index 21e23d42d..433afc85a 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -11,7 +11,7 @@ {:local/root "../module-base"} com.github.ben-manes.caffeine/caffeine - {:mvn/version "3.1.1"} + {:mvn/version "3.1.2"} com.google.guava/guava {:mvn/version "31.1-jre"}} diff --git a/modules/test-util/deps.edn b/modules/test-util/deps.edn index 0434e2339..63cfcbd5b 100644 --- a/modules/test-util/deps.edn +++ b/modules/test-util/deps.edn @@ -25,4 +25,4 @@ {:mvn/version "1.1.1"} org.slf4j/slf4j-nop - {:mvn/version "2.0.3"}}} + {:mvn/version "2.0.5"}}} From 38b93e0e893db15b4c1b0b8150690f0c0f88194f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 27 Nov 2022 20:52:28 +0100 Subject: [PATCH 063/124] Remove Conditional Patch It's an R5 property. --- modules/rest-api/src/blaze/rest_api/capabilities.clj | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 5b52256ec..bc1ad24ae 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -58,7 +58,6 @@ :conditionalCreate true :conditionalRead #fhir/code"not-supported" :conditionalUpdate false - :conditionalPatch false :conditionalDelete #fhir/code"not-supported" :referencePolicy (cond-> From 2298e1ac73cf4ca8e4ceef057ce5d39342390053 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 28 Nov 2022 14:33:25 +0100 Subject: [PATCH 064/124] Add Chaining Without Referential Integrity Test: --- .../chaining-without-referential-integrity.sh | 15 +++++++++++ .github/workflows/build.yml | 26 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100755 .github/scripts/chaining-without-referential-integrity.sh diff --git a/.github/scripts/chaining-without-referential-integrity.sh b/.github/scripts/chaining-without-referential-integrity.sh new file mode 100755 index 000000000..b2d07db2d --- /dev/null +++ b/.github/scripts/chaining-without-referential-integrity.sh @@ -0,0 +1,15 @@ +#!/bin/bash -e + +BASE="http://localhost:8080/fhir" + +curl -sXPUT -d '{"resourceType": "Observation", "id": "0", "subject": {"reference": "Patient/0"}}' -H 'Content-Type: application/fhir+json' "$BASE/Observation/0" > /dev/null +curl -sXPUT -d '{"resourceType" : "Patient", "id": "0", "gender": "male"}' -H 'Content-Type: application/fhir+json' "$BASE/Patient/0" > /dev/null + +RESULT="$(curl -sH 'Prefer: handling=strict' -H 'Accept: application/fhir+json' "$BASE/Observation?patient.gender=male&_summary=count" | jq -r '.total')" + +if [ "$RESULT" = "1" ]; then + echo "Success: chaining works" +else + echo "Fail: chaining doesn't work" + exit 1 +fi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b2ea0829d..c5fc87391 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -607,6 +607,32 @@ jobs: - name: Test Include run: .github/scripts/include-without-referential-integrity.sh + chaining-without-referential-integrity-test: + needs: build + runs-on: ubuntu-20.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Run Blaze + run: docker run --rm -d -e JAVA_TOOL_OPTIONS=-Xmx1g -e ENFORCE_REFERENTIAL_INTEGRITY=false -p 8080:8080 blaze:latest + + - name: Wait for Blaze + run: .github/scripts/wait-for-url.sh http://localhost:8080/health + + - name: Test Chaining + run: .github/scripts/chaining-without-referential-integrity.sh + # Test that a transaction can create a transaction bundle with references that will be taken "as-is" and not tried to # resolve to existing resources bundle-with-references-test: From 4e6824dee4b88e58125dda69ccfac8daabc74e27 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 22 Nov 2022 12:57:52 +0100 Subject: [PATCH 065/124] Implement CQL ToRatio --- docs/conformance/cql.md | 4 +- .../src/blaze/elm/compiler/type_operators.clj | 11 +- modules/cql/src/blaze/elm/deps_infer.clj | 8 ++ modules/cql/src/blaze/elm/nil.clj | 6 + modules/cql/src/blaze/elm/normalizer.clj | 8 ++ modules/cql/src/blaze/elm/protocols.clj | 5 + modules/cql/src/blaze/elm/ratio.clj | 13 +- .../elm/compiler/type_operators_test.clj | 119 ++++++++++++------ modules/cql/test/blaze/elm/literal.clj | 10 ++ modules/cql/test/blaze/elm/literal_spec.clj | 66 ++++++++++ modules/cql/test/data_readers.clj | 2 + 11 files changed, 208 insertions(+), 44 deletions(-) diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index f318e5df9..a32981524 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -336,7 +336,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.11. | ConvertsToLong | ✓ | | | | 22.12. | ConvertsToInteger | ✓ | | | | 22.13. | ConvertsToQuantity | ✓ | | | -| 22.14. | ConvertsToRatio | ✗ | | | +| 22.14. | ConvertsToRatio | ✓ | | | | 22.15. | ConvertsToString | ✓ | | | | 22.16. | ConvertsToTime | ✓ | | | | 22.17. | Descendents | ✓ | | | @@ -351,7 +351,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.26. | ToList | ✓ | | | | 22.27. | ToLong | ✓ | | | | 22.28. | ToQuantity | ✓ | | | -| 22.29. | ToRatio | ✗ | | | +| 22.29. | ToRatio | ✓ | | | | 22.30. | ToString | ✓ | | | | 22.31. | ToTime | ✓ | | | diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index 85ea6911a..a0548512b 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -190,7 +190,11 @@ (some? (p/to-quantity operand)))) -;; TODO 22.14. ConvertsToRatio +;; 22.14. ConvertsToRatio +(defunop converts-to-ratio [operand] + (when (some? operand) + (some? (p/to-ratio operand)))) + ;; 22.15. ConvertsToString (defunop converts-to-string [operand] @@ -355,7 +359,10 @@ (p/to-quantity x)) -;; TODO 22.29. ToRatio +;; 22.29. ToRatio +(defunop to-ratio [x] + (p/to-ratio x)) + ;; 22.30. ToString (defunop to-string [x] diff --git a/modules/cql/src/blaze/elm/deps_infer.clj b/modules/cql/src/blaze/elm/deps_infer.clj index 08018f3d6..49d7ccd70 100644 --- a/modules/cql/src/blaze/elm/deps_infer.clj +++ b/modules/cql/src/blaze/elm/deps_infer.clj @@ -640,6 +640,10 @@ (derive :elm.deps.type/converts-to-quantity :elm.deps.type/unary-expression) +;; 22.14. ConvertsToRatio +(derive :elm.deps.type/converts-to-ratio :elm.deps.type/unary-expression) + + ;; 22.15. ConvertsToString (derive :elm.deps.type/converts-to-string :elm.deps.type/unary-expression) @@ -684,6 +688,10 @@ (derive :elm.deps.type/to-quantity :elm.deps.type/unary-expression) +;; 22.29. ToRatio +(derive :elm.deps.type/to-ratio :elm.deps.type/unary-expression) + + ;; 22.30. ToString (derive :elm.deps.type/to-string :elm.deps.type/unary-expression) diff --git a/modules/cql/src/blaze/elm/nil.clj b/modules/cql/src/blaze/elm/nil.clj index 82e17c558..83c824376 100644 --- a/modules/cql/src/blaze/elm/nil.clj +++ b/modules/cql/src/blaze/elm/nil.clj @@ -320,6 +320,12 @@ (to-quantity [_])) +;; 22.29. ToRatio +(extend-protocol p/ToRatio + nil + (to-ratio [_])) + + ;; 22.30. ToString (extend-protocol p/ToString nil diff --git a/modules/cql/src/blaze/elm/normalizer.clj b/modules/cql/src/blaze/elm/normalizer.clj index 5d65954b8..fa1656c91 100644 --- a/modules/cql/src/blaze/elm/normalizer.clj +++ b/modules/cql/src/blaze/elm/normalizer.clj @@ -450,6 +450,10 @@ (derive :elm.normalizer.type/converts-to-quantity :elm.normalizer.type/unary-expression) +;; 22.14. ConvertsToRatio +(derive :elm.normalizer.type/converts-to-ratio :elm.normalizer.type/unary-expression) + + ;; 22.15. ConvertsToString (derive :elm.normalizer.type/converts-to-string :elm.normalizer.type/unary-expression) @@ -494,6 +498,10 @@ (derive :elm.normalizer.type/to-quantity :elm.normalizer.type/unary-expression) +;; 22.29. ToRatio +(derive :elm.normalizer.type/to-ratio :elm.normalizer.type/unary-expression) + + ;; 22.30. ToString (derive :elm.normalizer.type/to-string :elm.normalizer.type/unary-expression) diff --git a/modules/cql/src/blaze/elm/protocols.clj b/modules/cql/src/blaze/elm/protocols.clj index 142909bd7..a2db8a127 100644 --- a/modules/cql/src/blaze/elm/protocols.clj +++ b/modules/cql/src/blaze/elm/protocols.clj @@ -305,6 +305,11 @@ (to-quantity [x])) +;; 22.29. ToRatio +(defprotocol ToRatio + (to-ratio [x])) + + ;; 22.30. ToString (defprotocol ToString (to-string [x])) diff --git a/modules/cql/src/blaze/elm/ratio.clj b/modules/cql/src/blaze/elm/ratio.clj index bd69ddba0..00ef8317e 100644 --- a/modules/cql/src/blaze/elm/ratio.clj +++ b/modules/cql/src/blaze/elm/ratio.clj @@ -3,7 +3,8 @@ Section numbers are according to https://cql.hl7.org/04-logicalspecification.html." (:require - [blaze.elm.protocols :as p])) + [blaze.elm.protocols :as p] + [clojure.string :as str])) (set! *warn-on-reflection* true) @@ -36,6 +37,16 @@ (p/divide (:denominator x) (:numerator x)))) +;; 22.29. ToRatio +(extend-protocol p/ToRatio + String + (to-ratio [s] + (let [[numerator denominator] (str/split s #":" 2)] + (when-let [numerator (p/to-quantity numerator)] + (when-let [denominator (p/to-quantity denominator)] + (ratio numerator denominator)))))) + + ;; 22.30. ToString (extend-protocol p/ToString Ratio diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 7a272efec..3d6e4fd01 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -15,6 +15,7 @@ [blaze.elm.protocols :as p] [blaze.elm.quantity :as quantity] [blaze.elm.quantity-spec] + [blaze.elm.ratio :as ratio] [blaze.fhir.spec.type.system :as system] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]])) @@ -744,7 +745,7 @@ (is (= '(converts-to-quantity (param-ref "x")) (core/-form expr)))))) -;; TODO 22.14. ConvertsToRatio +;; 22.14. ConvertsToRatio ;; ;; The ConvertsToRatio operator returns true if the value of its argument is or ;; can be converted to a Ratio value. The operator accepts strings using the @@ -760,6 +761,30 @@ ;; a valid Ratio value, the result is false. ;; ;; If the argument is null, the result is null. +(deftest compile-converts-to-ratio-test + (testing "String" + (are [x] (true? (tu/compile-unop elm/converts-to-ratio elm/string x)) + "-1'm':-1'm'" + "0'm':0'm'" + "1'm':1'm'") + + (are [x] (false? (tu/compile-unop elm/converts-to-ratio elm/string x)) + "" + "a" + "0'm';0'm'")) + + (testing "dynamic" + (are [x] (false? (tu/dynamic-compile-eval (elm/converts-to-ratio x))) + #elm/parameter-ref "A")) + + (tu/testing-unary-null elm/converts-to-ratio) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/converts-to-ratio #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(converts-to-ratio (param-ref "x")) (core/-form expr)))))) + ;; 22.15. ConvertsToString ;; @@ -1451,17 +1476,15 @@ ;; The operator is used to implement list promotion efficiently. (deftest compile-to-list-test (testing "Boolean" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-list elm/boolean x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-list elm/boolean x)) "false" [false])) (testing "Integer" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-list elm/integer x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-list elm/integer x)) "1" [1])) (testing "Null" - (is (= [] (core/-eval (c/compile {} #elm/to-list{:type "Null"}) {} nil nil)))) + (is (= [] (c/compile {} #elm/to-list{:type "Null"})))) (testing "form" (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} @@ -1552,9 +1575,7 @@ ;; If the argument is null, the result is null. (deftest compile-to-quantity-test (testing "String" - (are [x res] (p/equal res (core/-eval (tu/compile-unop elm/to-quantity - elm/string x) - {} nil nil)) + (are [x res] (p/equal res (tu/compile-unop elm/to-quantity elm/string x)) "-1" (quantity/quantity -1 "1") "1" (quantity/quantity 1 "1") @@ -1566,8 +1587,7 @@ "1.1 'm'" (quantity/quantity 1.1M "m")) - (are [x] (nil? (core/-eval (tu/compile-unop elm/to-quantity elm/string x) - {} nil nil)) + (are [x] (nil? (tu/compile-unop elm/to-quantity elm/string x)) (str (- decimal/min 1e-8M)) (str (+ decimal/max 1e-8M)) (str (- decimal/min 1e-8M) "'m'") @@ -1576,21 +1596,16 @@ "a")) (testing "Integer" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-quantity elm/integer x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-quantity elm/integer x)) "1" (quantity/quantity 1 "1"))) (testing "Decimal" - (are [x res] (p/equal res (core/-eval (tu/compile-unop elm/to-quantity - elm/decimal x) - {} nil nil)) + (are [x res] (p/equal res (tu/compile-unop elm/to-quantity elm/decimal x)) "1" (quantity/quantity 1 "1") "1.1" (quantity/quantity 1.1M "1"))) (testing "Ratio" - (are [x res] (p/equal res (core/-eval (tu/compile-unop elm/to-quantity - elm/ratio x) - {} nil nil)) + (are [x res] (p/equal res (tu/compile-unop elm/to-quantity elm/ratio x)) [[1] [1]] (quantity/quantity 1 "1") [[-1] [1]] (quantity/quantity -1 "1") @@ -1610,7 +1625,7 @@ (is (= '(to-quantity (param-ref "x")) (core/-form expr)))))) -;; TODO 22.29. ToRatio +;; 22.29. ToRatio ;; ;; The ToRatio operator converts the value of its argument to a Ratio value. ;; The operator accepts strings using the following format: @@ -1625,6 +1640,43 @@ ;; a valid Ratio value, the result is null. ;; ;; If the argument is null, the result is null. +(deftest compile-to-ratio-test + (testing "String" + (are [x res] (p/equal res (tu/compile-unop elm/to-ratio elm/string x)) + "-1:-1" (ratio/ratio (quantity/quantity -1 "1") (quantity/quantity -1 "1")) + "1:1" (ratio/ratio (quantity/quantity 1 "1") (quantity/quantity 1 "1")) + "1:100" (ratio/ratio (quantity/quantity 1 "1") (quantity/quantity 100 "1")) + "100:1" (ratio/ratio (quantity/quantity 100 "1") (quantity/quantity 1 "1")) + + "1'm':1'm'" (ratio/ratio (quantity/quantity 1 "m") (quantity/quantity 1 "m")) + "1 'm':1 'm'" (ratio/ratio (quantity/quantity 1 "m") (quantity/quantity 1 "m")) + "1 'm':1 'm'" (ratio/ratio (quantity/quantity 1 "m") (quantity/quantity 1 "m")) + + "2'm':1'm'" (ratio/ratio (quantity/quantity 2 "m") (quantity/quantity 1 "m")) + "1'm':2'm'" (ratio/ratio (quantity/quantity 1 "m") (quantity/quantity 2 "m")) + + "1'cm':1'm'" (ratio/ratio (quantity/quantity 1 "cm") (quantity/quantity 1 "m")) + "1'm':1'cm'" (ratio/ratio (quantity/quantity 1 "m") (quantity/quantity 1 "cm")) + + "10 'm':10 'm'" (ratio/ratio (quantity/quantity 10 "m") (quantity/quantity 10 "m")) + + "1.1 'm':1.1 'm'" (ratio/ratio (quantity/quantity 1.1M "m") (quantity/quantity 1.1M "m")))) + + (are [x] (nil? (tu/compile-unop elm/to-ratio elm/string x)) + ":" + "a" + "" + "1:" + ":1" + "1:1:1") + + (tu/testing-unary-null elm/to-ratio) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/to-ratio #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(to-ratio (param-ref "x")) (core/-form expr)))))) ;; 22.30. ToString @@ -1644,21 +1696,18 @@ ;; If the argument is null, the result is null. (deftest compile-to-string-test (testing "Boolean" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/boolean x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/boolean x)) "true" "true" "false" "false")) (testing "Integer" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/integer x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/integer x)) "-1" "-1" "0" "0" "1" "1")) (testing "Decimal" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/decimal x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/decimal x)) "-1" "-1" "0" "0" "1" "1" @@ -1676,35 +1725,27 @@ "0.000000005" "0.00000001")) (testing "Quantity" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/quantity - x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/quantity x)) [1 "m"] "1 'm'" [1M "m"] "1 'm'" [1.1M "m"] "1.1 'm'")) (testing "Date" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/date x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/date x)) "2019" "2019" "2019-01" "2019-01" "2019-01-01" "2019-01-01")) (testing "DateTime" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/date-time - x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/date-time x)) "2019-01-01T01:00" "2019-01-01T01:00")) (testing "Time" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/time x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/time x)) "01:00" "01:00")) (testing "Ratio" - (are [x res] (= res (core/-eval (tu/compile-unop elm/to-string elm/ratio - x) - {} nil nil)) + (are [x res] (= res (tu/compile-unop elm/to-string elm/ratio x)) [[1 "m"] [1 "m"]] "1 'm':1 'm'" [[1 "m"] [2 "m"]] "1 'm':2 'm'" [[1M "m"] [1M "m"]] "1 'm':1 'm'" diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 4ea6e3036..7b4e902da 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -871,6 +871,11 @@ {:type "ConvertsToQuantity" :operand operand}) +;; 22.14. ConvertsToRatio +(defn converts-to-ratio [operand] + {:type "ConvertsToRatio" :operand operand}) + + ;; 22.15. ConvertsToString (defn converts-to-string [operand] {:type "ConvertsToString" :operand operand}) @@ -936,6 +941,11 @@ {:type "ToQuantity" :operand operand}) +;; 22.29. ToRatio +(defn to-ratio [operand] + {:type "ToRatio" :operand operand}) + + ;; 22.30. ToString (defn to-string [operand] {:type "ToString" :operand operand}) diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index 48fb11181..dde543932 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -463,6 +463,66 @@ :ret :elm/expression) +;; 22.7. ConvertsToBoolean +(s/fdef elm/converts-to-boolean + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.8. ConvertsToDate +(s/fdef elm/converts-to-date + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.9. ConvertsToDateTime +(s/fdef elm/converts-to-date-time + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.10. ConvertsToDecimal +(s/fdef elm/converts-to-decimal + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.11. ConvertsToLong +(s/fdef elm/converts-to-long + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.12. ConvertsToInteger +(s/fdef elm/converts-to-integer + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.13. ConvertsToQuantity +(s/fdef elm/converts-to-quantity + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.14. ConvertsToRatio +(s/fdef elm/converts-to-ratio + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.15. ConvertsToString +(s/fdef elm/converts-to-string + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + +;; 22.16. ConvertsToTime +(s/fdef elm/converts-to-time + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + ;; 22.17. Descendents (s/fdef elm/descendents :args (s/cat :source :elm/expression) @@ -511,6 +571,12 @@ :ret :elm/expression) +;; 22.29. ToRatio +(s/fdef elm/to-ratio + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + ;; 22.30. ToString (s/fdef elm/to-string :args (s/cat :operand :elm/expression) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index ef674d5ac..59f390baa 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -81,6 +81,7 @@ elm/converts-to-long blaze.elm.literal/converts-to-long elm/converts-to-integer blaze.elm.literal/converts-to-integer elm/converts-to-quantity blaze.elm.literal/converts-to-quantity + elm/converts-to-ratio blaze.elm.literal/converts-to-ratio elm/converts-to-string blaze.elm.literal/converts-to-string elm/converts-to-time blaze.elm.literal/converts-to-time elm/children blaze.elm.literal/children @@ -95,5 +96,6 @@ elm/to-list blaze.elm.literal/to-list elm/to-long blaze.elm.literal/to-long elm/to-quantity blaze.elm.literal/to-quantity + elm/to-ratio blaze.elm.literal/to-ratio elm/to-string blaze.elm.literal/to-string elm/calculate-age-at blaze.elm.literal/calculate-age-at} From cd2080f51d1b8b17f1108cce5e90a5af1f9d1eb9 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 29 Nov 2022 15:29:49 +0100 Subject: [PATCH 066/124] Update Blazectl --- .github/scripts/install-blazectl.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh index 6ba3a961f..a9258e04b 100755 --- a/.github/scripts/install-blazectl.sh +++ b/.github/scripts/install-blazectl.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -VERSION=0.10.0 +VERSION=0.10.1 curl -sLO https://github.com/samply/blazectl/releases/download/v${VERSION}/blazectl-${VERSION}-linux-amd64.tar.gz tar xzf blazectl-${VERSION}-linux-amd64.tar.gz From d488230ff021ee73e2a477b885e4c598fdd52b64 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Thu, 1 Dec 2022 15:54:04 +0100 Subject: [PATCH 067/124] Implement CQL ConceptRef and Allow Concept in Retrieve --- .../blaze/elm/compiler/clinical_values.clj | 13 +- .../src/blaze/elm/compiler/external_data.clj | 24 ++- modules/cql/src/blaze/elm/spec.clj | 33 ++++- .../elm/compiler/clinical_values_test.clj | 73 ++++++++- .../blaze/elm/compiler/external_data_test.clj | 52 +++++++ modules/cql/test/blaze/elm/literal.clj | 9 +- modules/cql/test/blaze/elm/literal_spec.clj | 9 +- modules/cql/test/blaze/elm/ratio_spec.clj | 1 + modules/cql/test/data_readers.clj | 1 + .../evaluate_measure/measure_test.clj | 5 +- .../evaluate_measure/q48-concept.cql | 12 ++ .../evaluate_measure/q48-concept.json | 139 ++++++++++++++++++ 12 files changed, 352 insertions(+), 19 deletions(-) create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.cql create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.json diff --git a/modules/cql/src/blaze/elm/compiler/clinical_values.clj b/modules/cql/src/blaze/elm/compiler/clinical_values.clj index e6413c3c9..e91c5bc31 100644 --- a/modules/cql/src/blaze/elm/compiler/clinical_values.clj +++ b/modules/cql/src/blaze/elm/compiler/clinical_values.clj @@ -87,8 +87,17 @@ ;; 3.8. ConceptRef -;; -;; TODO +(defn- find-concept-def + "Returns the concept-def with `name` from `library` or nil if not found." + {:arglists '([library name])} + [{{concept-defs :def} :concepts} name] + (some #(when (= name (:name %)) %) concept-defs)) + +(defmethod core/compile* :elm.compiler.type/concept-ref + [{:keys [library] :as context} {:keys [name]}] + (when-let [{codes-refs :code} (find-concept-def library name)] + (->> (map #(core/compile* context (assoc % :type "CodeRef")) codes-refs) + (concept/to-concept)))) ;; 3.9. Quantity diff --git a/modules/cql/src/blaze/elm/compiler/external_data.clj b/modules/cql/src/blaze/elm/compiler/external_data.clj index 0693b3c5a..4148dcc99 100644 --- a/modules/cql/src/blaze/elm/compiler/external_data.clj +++ b/modules/cql/src/blaze/elm/compiler/external_data.clj @@ -7,9 +7,13 @@ [blaze.anomaly :as ba :refer [if-ok]] [blaze.db.api :as d] [blaze.elm.compiler.core :as core] + [blaze.elm.compiler.structured-values] [blaze.elm.spec] [blaze.elm.util :as elm-util] - [clojure.string :as str])) + [clojure.string :as str]) + (:import + [blaze.elm.compiler.structured_values SourcePropertyExpression] + [java.util List])) (set! *warn-on-reflection* true) @@ -35,6 +39,20 @@ (str system "|" code)) +(defprotocol ToClauses + (-to-clauses [x property])) + + +(extend-protocol ToClauses + List + (-to-clauses [codes property] + [(into [property] (map code->clause-value) codes)]) + + SourcePropertyExpression + (-to-clauses [codes property] + (-to-clauses (core/-eval codes nil nil nil) property))) + + (defn- code-expr "Returns an expression which, when evaluated, returns all resources of type `data-type` which have a code equivalent to `code` at `property` and are @@ -45,9 +63,9 @@ Example: * data-type - \"Observation\" * property - \"code\" - * code - (code/to-code \"http://loinc.org\" nil \"39156-5\")" + * codes - [(code/to-code \"http://loinc.org\" nil \"39156-5\")]" [node context data-type property codes] - (let [clauses [(into [property] (map code->clause-value) codes)] + (let [clauses (-to-clauses codes property) query (d/compile-compartment-query node context data-type clauses)] (->CompartmentQueryRetrieveExpression query data-type clauses))) diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index 4438e1c83..8047492fc 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -303,10 +303,14 @@ ;; 3.3. CodeRef -(defmethod expression :elm.spec.type/code-ref [_] +(s/def :elm/code-ref (s/keys :opt-un [:elm/name :elm/libraryName])) +(defmethod expression :elm.spec.type/code-ref [_] + :elm/code-ref) + + ;; 3.4. CodeSystemDef (s/def :elm/code-system-def (s/keys :req-un [:elm/name :elm/id] @@ -332,6 +336,24 @@ :opt-un [:elm.concept/display])) +;; 3.7. ConceptDef +(s/def :elm.concept-def/code + (s/coll-of :elm/code-ref)) + + +(s/def :elm/concept-def + (s/keys :req-un [:elm/name :elm.concept-def/code])) + + +;; 3.8. ConceptRef +(s/def :elm/concept-ref + (s/keys :opt-un [:elm/name :elm/libraryName])) + + +(defmethod expression :elm.spec.type/concept-ref [_] + :elm/concept-ref) + + ;; 3.9. Quantity (s/def :elm.quantity/type #{"Quantity"}) @@ -555,6 +577,14 @@ (s/keys :req-un [:elm.library.codes/def])) +(s/def :elm.library.concepts/def + (s/coll-of :elm/concept-def)) + + +(s/def :elm.library/concepts + (s/keys :req-un [:elm.library.concepts/def])) + + (s/def :elm.library.statements/def (s/coll-of :elm/expression-def)) @@ -567,6 +597,7 @@ (s/keys :req-un [:elm.library/identifier :elm.library/schemaIdentifier] :opt-un [:elm.library/codeSystems :elm.library/codes + :elm.library/concepts :elm.library/statements])) diff --git a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj index 714dd54f6..c811064e9 100644 --- a/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/clinical_values_test.clj @@ -145,7 +145,7 @@ {:codeSystems {:def [{:name "sys-def-115852" :id "system-115910"}]}}}] (given - (c/compile context #elm/concept [[["sys-def-115852" "code-115927"]]]) + (c/compile context #elm/concept [[#elm/code ["sys-def-115852" "code-115927"]]]) type := Concept [:codes 0 type] := Code [:codes 0 :system] := "system-115910" @@ -158,8 +158,8 @@ {:def [{:name "sys-def-115852" :id "system-115910"} {:name "sys-def-115853" :id "system-115911"}]}}}] (given - (c/compile context #elm/concept [[["sys-def-115852" "code-115927"] - ["sys-def-115853" "code-115928"]]]) + (c/compile context #elm/concept [[#elm/code ["sys-def-115852" "code-115927"] + #elm/code ["sys-def-115853" "code-115928"]]]) type := Concept [:codes 0 type] := Code [:codes 0 :system] := "system-115910" @@ -177,7 +177,7 @@ :id "system-120411" :version "version-120408"}]}}}] (given - (c/compile context #elm/concept [[["sys-def-120434" "code-115927"]]]) + (c/compile context #elm/concept [[#elm/code ["sys-def-120434" "code-115927"]]]) type := Concept [:codes 0 type] := Code [:codes 0 :system] := "system-120411" @@ -196,8 +196,8 @@ :id "system-115911" :version "version-115909"}]}}}] (given - (c/compile context #elm/concept [[["sys-def-120434" "code-115927"] - ["sys-def-115853" "code-115928"]]]) + (c/compile context #elm/concept [[#elm/code ["sys-def-120434" "code-115927"] + #elm/code ["sys-def-115853" "code-115928"]]]) type := Concept [:codes 0 type] := Code [:codes 0 :system] := "system-120411" @@ -209,6 +209,67 @@ [:codes 1 :code] := "code-115928")))) +;; 3.8. ConceptRef +;; +;; The ConceptRef expression allows a previously defined concept to be +;; referenced within an expression. +(deftest compile-concept-ref-test + (testing "with one code" + (let [context + {:library + {:codeSystems + {:def + [{:name "sys-def-125149" + :id "system-name-125213"}]} + :codes + {:def + [{:name "code-def-125054" + :id "code-125354" + :codeSystem {:name "sys-def-125149"}}]} + :concepts + {:def + [{:name "concept-def-125054" + :code + [{:name "code-def-125054"}]}]}}}] + (given (c/compile context #elm/concept-ref "concept-def-125054") + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-name-125213" + [:codes 0 :code] := "code-125354"))) + + (testing "with two codes" + (let [context + {:library + {:codeSystems + {:def + [{:name "sys-def-125149" + :id "system-name-125213"} + {:name "sys-def-162523" + :id "system-name-125214"}]} + :codes + {:def + [{:name "code-def-125054" + :id "code-125354" + :codeSystem {:name "sys-def-125149"}} + {:name "code-def-125055" + :id "code-125355" + :codeSystem {:name "sys-def-162523"}}]} + :concepts + {:def + [{:name "concept-def-125055" + :code + [{:name "code-def-125054"} + {:name "code-def-125055"}]}]}}}] + (given (c/compile context #elm/concept-ref "concept-def-125055") + type := Concept + [:codes 0 type] := Code + [:codes 0 :system] := "system-name-125213" + [:codes 0 :code] := "code-125354" + [:codes 1 type] := Code + [:codes 1 :system] := "system-name-125214" + [:codes 1 :code] := "code-125355")))) + + ;; 3.9. Quantity ;; ;; The Quantity type defines a clinical quantity. For example, the quantity 10 diff --git a/modules/cql/test/blaze/elm/compiler/external_data_test.clj b/modules/cql/test/blaze/elm/compiler/external_data_test.clj index 129077f8f..c6282120b 100644 --- a/modules/cql/test/blaze/elm/compiler/external_data_test.clj +++ b/modules/cql/test/blaze/elm/compiler/external_data_test.clj @@ -190,6 +190,58 @@ db (d/db node) patient (d/resource-handle db "Patient" "0")] + (given (core/-eval expr {:db db} patient nil) + count := 2 + [0 fhir-spec/fhir-type] := :fhir/Observation + [0 :id] := "1" + [1 fhir-spec/fhir-type] := :fhir/Observation + [1 :id] := "2")))) + + (testing "with one concept" + (with-system-data [{:blaze.db/keys [node]} mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Observation :id "0" + :subject + #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Observation :id "1" + :code + #fhir/CodeableConcept + {:coding + [#fhir/Coding + {:system #fhir/uri"system-192253" + :code #fhir/code"code-192300"}]} + :subject + #fhir/Reference{:reference "Patient/0"}}] + [:put {:fhir/type :fhir/Observation :id "2" + :code + #fhir/CodeableConcept + {:coding + [#fhir/Coding + {:system #fhir/uri"system-192253" + :code #fhir/code"code-140541"}]} + :subject + #fhir/Reference{:reference "Patient/0"}}]]] + + (let [context + {:node node + :eval-context "Patient" + :library + {:codeSystems + {:def + [{:name "sys-def-131750" + :id "system-192253"}]}}} + elm #elm/retrieve + {:type "Observation" + :codes + {:type "Property" + :path "codes" + :source #elm/concept + [[#elm/code ["sys-def-131750" "code-192300"] + #elm/code ["sys-def-131750" "code-140541"]]]}} + expr (c/compile context elm) + db (d/db node) + patient (d/resource-handle db "Patient" "0")] + (given (core/-eval expr {:db db} patient nil) count := 2 [0 fhir-spec/fhir-type] := :fhir/Observation diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 7b4e902da..d5d64d143 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -87,13 +87,16 @@ (defn concept [[codes display]] (cond-> {:type "Concept" - :codes (mapv (fn [[sys code]] {:type "Code" :system - {:type "CodeSystemRef", :name sys} - :code code}) codes)} + :codes codes} display (assoc :display display))) +;; 3.8. ConceptRef +(defn concept-ref [name] + {:type "ConceptRef" :name name}) + + ;; 3.9. Quantity (defn quantity [[value unit]] (cond-> diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index dde543932..a0aabe745 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -67,12 +67,17 @@ :args (s/cat :args (s/spec (s/cat - :codes (s/coll-of (s/spec (s/cat :system-name string? - :code string?))) + :codes (s/coll-of :elm/code) :display (s/? string?)))) :ret :elm/expression) +;; 3.8. ConceptRef +(s/fdef elm/concept-ref + :args (s/cat :name string?) + :ret :elm/expression) + + ;; 3.9. Quantity (s/fdef elm/quantity :args (s/cat :args (s/spec (s/cat :value number? :unit (s/? string?)))) diff --git a/modules/cql/test/blaze/elm/ratio_spec.clj b/modules/cql/test/blaze/elm/ratio_spec.clj index 89256d6fc..d77ad60da 100644 --- a/modules/cql/test/blaze/elm/ratio_spec.clj +++ b/modules/cql/test/blaze/elm/ratio_spec.clj @@ -1,4 +1,5 @@ (ns blaze.elm.ratio-spec + (:refer-clojure :exclude [ratio?]) (:require [blaze.anomaly-spec] [blaze.elm.quantity :as quantity] diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index 59f390baa..55d13146f 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -8,6 +8,7 @@ elm/code blaze.elm.literal/code elm/code-ref blaze.elm.literal/code-ref elm/concept blaze.elm.literal/concept + elm/concept-ref blaze.elm.literal/concept-ref elm/quantity blaze.elm.literal/quantity elm/ratio blaze.elm.literal/ratio elm/parameter-ref blaze.elm.literal/parameter-ref diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index c83f977a2..38f3e8ca8 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -438,7 +438,8 @@ "q44-tnm-t" 1 "q45-histology" 1 "q46-between-date" 1 - "q47-managing-organization" 1) + "q47-managing-organization" 1 + "q48-concept" 2) (let [result (evaluate "q1" "subject-list")] (testing "MeasureReport is valid" @@ -620,5 +621,5 @@ (comment (log/set-level! :debug) - (evaluate "q47-managing-organization") + (evaluate "q48-concept") ) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.cql b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.cql new file mode 100644 index 000000000..786e6634f --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.cql @@ -0,0 +1,12 @@ +library "q48-concept" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem icd10: 'http://hl7.org/fhir/sid/icd-10' +code "ICD-10: C61": 'C61' from icd10 +codesystem sct: 'http://snomed.info/sct' +code "SNOMED: 254900004": '254900004' from sct +concept prostata: {"ICD-10: C61", "SNOMED: 254900004"} + +define InInitialPopulation: + exists [Condition: prostata] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.json b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.json new file mode 100644 index 000000000..923affd78 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q48-concept.json @@ -0,0 +1,139 @@ +{ + "resourceType": "Bundle", + "type": "transaction", + "entry": [ + { + "resource": { + "resourceType": "Patient", + "id": "0" + }, + "request": { + "method": "PUT", + "url": "Patient/0" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "1" + }, + "request": { + "method": "PUT", + "url": "Patient/1" + } + }, + { + "resource": { + "resourceType": "Patient", + "id": "2" + }, + "request": { + "method": "PUT", + "url": "Patient/2" + } + }, + { + "request": { + "method": "PUT", + "url": "Condition/0" + }, + "resource": { + "code": { + "coding": [ + { + "system": "http://hl7.org/fhir/sid/icd-10", + "code": "C61" + } + ] + }, + "id": "0", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "resourceType": "Condition", + "subject": { + "reference": "Patient/0" + } + } + }, + { + "request": { + "method": "PUT", + "url": "Condition/1" + }, + "resource": { + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "254900004" + } + ] + }, + "id": "1", + "meta": { + "profile": [ + "https://fhir.bbmri.de/StructureDefinition/Condition" + ] + }, + "resourceType": "Condition", + "subject": { + "reference": "Patient/1" + } + } + }, + { + "resource": { + "resourceType": "Measure", + "id": "0", + "url": "0", + "status": "active", + "subjectCodeableConcept": { + "coding": [ + { + "system": "http://hl7.org/fhir/resource-types", + "code": "Patient" + } + ] + }, + "library": [ + "0" + ], + "scoring": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-scoring", + "code": "cohort" + } + ] + }, + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "criteria": { + "language": "text/cql-identifier", + "expression": "InInitialPopulation" + } + } + ] + } + ] + }, + "request": { + "method": "PUT", + "url": "Measure/0" + } + } + ] +} From d5bfff999c0fddc56af0319cd9fc2996b3492015 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 4 Dec 2022 22:00:41 +0100 Subject: [PATCH 068/124] Return CodeableConcepts as is for Strata Before stata values of every type would be converted to string und put into "text" of the CodeableConcept of the stratum value. However for CodeableConcepts themself, we now return the value as is. --- .../evaluate_measure/measure/stratifier.clj | 24 +- .../operation/evaluate_measure/cql_test.clj | 74 ++++-- .../measure/stratifier_test.clj | 226 +++++++++++------- 3 files changed, 196 insertions(+), 128 deletions(-) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj index db61a5f09..ecd88804b 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj @@ -7,8 +7,10 @@ (defn- value-concept [value] - (type/codeable-concept - {:text (type/string (if (nil? value) "null" (str value)))})) + (if (identical? :fhir/CodeableConcept (type/type value)) + value + (type/codeable-concept + {:text (type/string (if (nil? value) "null" (str value)))}))) (defn- stratum* [population value] @@ -17,7 +19,7 @@ :population [population]}) -(defn- stratum [context population-code [value handles]] +(defn- stratum [context population-code value handles] (-> (u/population context :fhir.MeasureReport.group.stratifier.stratum/population population-code handles) @@ -32,9 +34,9 @@ (defn- stratifier [{:keys [luids] :as context} code population-code strata] - (-> (reduce - (fn [{:keys [luids] :as ret} x] - (->> (stratum (assoc context :luids luids) population-code x) + (-> (reduce-kv + (fn [{:keys [luids] :as ret} value handles] + (->> (stratum (assoc context :luids luids) population-code value handles) (u/merge-result ret))) {:result [] :luids luids :tx-ops []} strata) @@ -46,7 +48,7 @@ (defn- calc-strata [{:keys [population-basis] :as context} name handles] - (if (= :boolean (or population-basis :boolean)) + (if (identical? :boolean (or population-basis :boolean)) (cql/calc-strata context name handles) (cql/calc-function-strata context name handles))) @@ -115,7 +117,7 @@ :population [population]}) -(defn- multi-component-stratum [context codes population-code [values result]] +(defn- multi-component-stratum [context codes population-code values result] (-> (u/population context :fhir.MeasureReport.group.stratifier.stratum/population population-code result) @@ -130,10 +132,10 @@ (defn- multi-component-stratifier [{:keys [luids] :as context} codes population-code strata] - (-> (reduce - (fn [{:keys [luids] :as ret} x] + (-> (reduce-kv + (fn [{:keys [luids] :as ret} values result] (->> (multi-component-stratum (assoc context :luids luids) codes - population-code x) + population-code values result) (u/merge-result ret))) {:result [] :luids luids :tx-ops []} strata) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index 104c2224b..b1481882b 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -264,6 +264,7 @@ (testing "failing eval" (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [{:keys [db] :as context} (context system library-gender)] (with-redefs [expr/eval (failing-eval "msg-221825")] (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) @@ -273,6 +274,7 @@ (testing "multiple values" (with-system-data [system mem-node-system] [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + (let [{:keys [db] :as context} (context system library-gender)] (with-redefs [expr/eval two-value-eval] (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) @@ -285,19 +287,29 @@ [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}] [:put {:fhir/type :fhir/Patient :id "3" :gender #fhir/code"male"}]]] - (let [{:keys [db] :as context} (context system library-gender)] - (given (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient"))) - [#(get % nil) 0 :subject-handle :id] := "0" - [#(get % nil) 0 :population-handle :id] := "0" - [#(get % nil) count] := 1 - [#(get % #fhir/code"male") 0 :subject-handle :id] := "1" - [#(get % #fhir/code"male") 0 :population-handle :id] := "1" - [#(get % #fhir/code"male") 1 :subject-handle :id] := "3" - [#(get % #fhir/code"male") 1 :population-handle :id] := "3" - [#(get % #fhir/code"male") count] := 2 - [#(get % #fhir/code"female") 0 :subject-handle :id] := "2" - [#(get % #fhir/code"female") 0 :population-handle :id] := "2" - [#(get % #fhir/code"female") count] := 1))))) + + (let [{:keys [db] :as context} (context system library-gender) + result (cql/calc-strata context "Gender" (mapv handle (d/type-list db "Patient")))] + + (testing "contains a nil entry for the patient with id 0" + (given (result nil) + count := 1 + [0 :subject-handle :id] := "0" + [0 :population-handle :id] := "0")) + + (testing "contains a male entry for the patients with id 1 and 3" + (given (result #fhir/code"male") + count := 2 + [0 :subject-handle :id] := "1" + [0 :population-handle :id] := "1" + [1 :subject-handle :id] := "3" + [1 :population-handle :id] := "3")) + + (testing "contains a female entry for the patient with id 2" + (given (result #fhir/code"female") + count := 1 + [0 :subject-handle :id] := "2" + [0 :population-handle :id] := "2")))))) (deftest calc-function-strata-test @@ -317,6 +329,7 @@ [:put {:fhir/type :fhir/Encounter :id "3" :status #fhir/code"finished" :subject #fhir/Reference{:reference "Patient/2"}}]]] + (let [{:keys [db] :as context} (context system library-encounter-status) handles [{:population-handle (d/resource-handle db "Encounter" "0") @@ -326,19 +339,28 @@ {:population-handle (d/resource-handle db "Encounter" "2") :subject-handle (d/resource-handle db "Patient" "1")} {:population-handle (d/resource-handle db "Encounter" "3") - :subject-handle (d/resource-handle db "Patient" "2")}]] - (given (cql/calc-function-strata context "Status" handles) - [#(get % nil) 0 :population-handle :id] := "0" - [#(get % nil) 0 :subject-handle :id] := "0" - [#(get % nil) count] := 1 - [#(get % #fhir/code"finished") 0 :population-handle :id] := "1" - [#(get % #fhir/code"finished") 0 :subject-handle :id] := "0" - [#(get % #fhir/code"finished") 1 :population-handle :id] := "3" - [#(get % #fhir/code"finished") 1 :subject-handle :id] := "2" - [#(get % #fhir/code"finished") count] := 2 - [#(get % #fhir/code"planned") 0 :population-handle :id] := "2" - [#(get % #fhir/code"planned") 0 :subject-handle :id] := "1" - [#(get % #fhir/code"planned") count] := 1)))) + :subject-handle (d/resource-handle db "Patient" "2")}] + result (cql/calc-function-strata context "Status" handles)] + + (testing "contains a nil entry for the encounter with id 0" + (given (result nil) + count := 1 + [0 :population-handle :id] := "0" + [0 :subject-handle :id] := "0")) + + (testing "contains a finished entry for the encounters with id 1 and 3" + (given (result #fhir/code"finished") + count := 2 + [0 :population-handle :id] := "1" + [0 :subject-handle :id] := "0" + [1 :population-handle :id] := "3" + [1 :subject-handle :id] := "2")) + + (testing "contains a planned entry for the encounter with id 2" + (given (result #fhir/code"planned") + count := 1 + [0 :population-handle :id] := "2" + [0 :subject-handle :id] := "1"))))) (testing "missing function" (with-system [system mem-node-system] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index abc485ee6..84218b2fd 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -8,7 +8,6 @@ [blaze.elm.compiler.library :as library] [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] [blaze.fhir.operation.evaluate-measure.measure.stratifier-spec] - [blaze.fhir.spec.type :as type] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] @@ -60,6 +59,17 @@ AgeInYears()") +(def library-observation-code + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define function Code(observation Observation): + observation.code") + + (def library-encounter-status-age "library Retrieve using FHIR version '4.0.0' @@ -85,6 +95,11 @@ :code #fhir/CodeableConcept{:text #fhir/string"gender"} :criteria (cql-expression "Gender")}) +(def observation-code-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :code #fhir/CodeableConcept{:text #fhir/string"code"} + :criteria (cql-expression "Code")}) + (def age-gender-stratifier {:fhir/type :fhir.Measure.group/stratifier @@ -122,53 +137,82 @@ (deftest evaluate (testing "one component" - (with-system-data [system mem-node-system] - [[[:put {:fhir/type :fhir/Patient :id "0"}] - [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] - [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}] - [:put {:fhir/type :fhir/Patient :id "3" :gender #fhir/code"male"}]]] - (let [{:keys [db] :as context} (context system library-age-gender) - evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] - - (testing "report-type population" - (given (stratifier/evaluate (assoc context :report-type "population") - evaluated-populations gender-stratifier) - [:result :fhir/type] := :fhir.MeasureReport.group/stratifier - [:result :code 0 :text type/value] := "gender" - [:result :stratum 0 :value :text type/value] := "female" - [:result :stratum 0 :population 0 :count type/value] := 1 - [:result :stratum 1 :value :text type/value] := "male" - [:result :stratum 1 :population 0 :count type/value] := 2 - [:result :stratum 2 :value :text type/value] := "null" - [:result :stratum 2 :population 0 :count type/value] := 1)) - - (testing "report-type subject-list" - (given (stratifier/evaluate - (assoc context - :luids ["L0" "L1" "L2"] - :report-type "subject-list") - evaluated-populations gender-stratifier) - [:result :fhir/type] := :fhir.MeasureReport.group/stratifier - [:result :code 0 :text type/value] := "gender" - [:result :stratum 0 :value :text type/value] := "female" - [:result :stratum 0 :population 0 :count type/value] := 1 - [:result :stratum 0 :population 0 :subjectResults :reference] := "List/L2" - [:result :stratum 1 :value :text type/value] := "male" - [:result :stratum 1 :population 0 :count type/value] := 2 - [:result :stratum 1 :population 0 :subjectResults :reference] := "List/L1" - [:result :stratum 2 :value :text type/value] := "null" - [:result :stratum 2 :population 0 :count type/value] := 1 - [:result :stratum 2 :population 0 :subjectResults :reference] := "List/L0" - [:tx-ops 0 0] := :create - [:tx-ops 0 1 :fhir/type] := :fhir/List - [:tx-ops 0 1 :id] := "L0" - [:tx-ops 0 1 :entry 0 :item :reference] := "Patient/0" - [:tx-ops 1 1 :id] := "L1" - [:tx-ops 1 1 :entry 0 :item :reference] := "Patient/1" - [:tx-ops 1 1 :entry 1 :item :reference] := "Patient/3" - [:tx-ops 2 1 :id] := "L2" - [:tx-ops 2 1 :entry 0 :item :reference] := "Patient/2" - [:tx-ops count] := 3))))) + (testing "gender" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Patient :id "1" :gender #fhir/code"male"}] + [:put {:fhir/type :fhir/Patient :id "2" :gender #fhir/code"female"}] + [:put {:fhir/type :fhir/Patient :id "3" :gender #fhir/code"male"}]]] + + (let [{:keys [db] :as context} (context system library-age-gender) + evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] + + (testing "report-type population" + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations gender-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text] := #fhir/string"gender" + [:result :stratum 0 :value :text] := #fhir/string"female" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 1 :value :text] := #fhir/string"male" + [:result :stratum 1 :population 0 :count] := #fhir/integer 2 + [:result :stratum 2 :value :text] := #fhir/string"null" + [:result :stratum 2 :population 0 :count] := #fhir/integer 1)) + + (testing "report-type subject-list" + (given (stratifier/evaluate + (assoc context + :luids ["L0" "L1" "L2"] + :report-type "subject-list") + evaluated-populations gender-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text] := #fhir/string"gender" + [:result :stratum 0 :value :text] := #fhir/string"female" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 0 :population 0 :subjectResults :reference] := "List/L2" + [:result :stratum 1 :value :text] := #fhir/string"male" + [:result :stratum 1 :population 0 :count] := #fhir/integer 2 + [:result :stratum 1 :population 0 :subjectResults :reference] := "List/L1" + [:result :stratum 2 :value :text] := #fhir/string"null" + [:result :stratum 2 :population 0 :count] := #fhir/integer 1 + [:result :stratum 2 :population 0 :subjectResults :reference] := "List/L0" + [:tx-ops 0 0] := :create + [:tx-ops 0 1 :fhir/type] := :fhir/List + [:tx-ops 0 1 :id] := "L0" + [:tx-ops 0 1 :entry 0 :item :reference] := "Patient/0" + [:tx-ops 1 1 :id] := "L1" + [:tx-ops 1 1 :entry 0 :item :reference] := "Patient/1" + [:tx-ops 1 1 :entry 1 :item :reference] := "Patient/3" + [:tx-ops 2 1 :id] := "L2" + [:tx-ops 2 1 :entry 0 :item :reference] := "Patient/2" + [:tx-ops count] := 3))))) + + (testing "CodeableConcept" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Observation :id "0" + :code #fhir/CodeableConcept + {:coding + [#fhir/Coding{:system #fhir/uri"http://loinc.org" + :code #fhir/code"17861-6"}]} + :subject #fhir/Reference{:reference "Patient/0"}}]]] + (let [{:keys [db] :as context} (context system library-observation-code) + evaluated-populations + {:handles + [[{:population-handle (d/resource-handle db "Observation" "0") + :subject-handle (d/resource-handle db "Patient" "0")}]]}] + + (testing "report-type population" + (given (stratifier/evaluate + (assoc context + :report-type "population" + :population-basis "Observation") + evaluated-populations observation-code-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text] := #fhir/string"code" + [:result :stratum 0 :value :coding 0 :system] := #fhir/uri"http://loinc.org" + [:result :stratum 0 :value :coding 0 :code] := #fhir/code"17861-6" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1)))))) (testing "two components" (testing "subject-based measure" @@ -190,22 +234,22 @@ (given (stratifier/evaluate (assoc context :report-type "population") evaluated-populations age-gender-stratifier) [:result :fhir/type] := :fhir.MeasureReport.group/stratifier - [:result :code 0 :text type/value] := "age" - [:result :code 1 :text type/value] := "gender" - [:result :stratum 0 :component 0 :code :text type/value] := "age" - [:result :stratum 0 :component 0 :value :text type/value] := "10" - [:result :stratum 0 :component 1 :code :text type/value] := "gender" - [:result :stratum 0 :component 1 :value :text type/value] := "female" - [:result :stratum 0 :population 0 :count type/value] := 1 - [:result :stratum 1 :component 0 :value :text type/value] := "10" - [:result :stratum 1 :component 1 :value :text type/value] := "male" - [:result :stratum 1 :population 0 :count type/value] := 1 - [:result :stratum 2 :component 0 :value :text type/value] := "20" - [:result :stratum 2 :component 1 :value :text type/value] := "male" - [:result :stratum 2 :population 0 :count type/value] := 1 - [:result :stratum 3 :component 0 :value :text type/value] := "null" - [:result :stratum 3 :component 1 :value :text type/value] := "null" - [:result :stratum 3 :population 0 :count type/value] := 1))))) + [:result :code 0 :text] := #fhir/string"age" + [:result :code 1 :text] := #fhir/string"gender" + [:result :stratum 0 :component 0 :code :text] := #fhir/string"age" + [:result :stratum 0 :component 0 :value :text] := #fhir/string"10" + [:result :stratum 0 :component 1 :code :text] := #fhir/string"gender" + [:result :stratum 0 :component 1 :value :text] := #fhir/string"female" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 1 :component 0 :value :text] := #fhir/string"10" + [:result :stratum 1 :component 1 :value :text] := #fhir/string"male" + [:result :stratum 1 :population 0 :count] := #fhir/integer 1 + [:result :stratum 2 :component 0 :value :text] := #fhir/string"20" + [:result :stratum 2 :component 1 :value :text] := #fhir/string"male" + [:result :stratum 2 :population 0 :count] := #fhir/integer 1 + [:result :stratum 3 :component 0 :value :text] := #fhir/string"null" + [:result :stratum 3 :component 1 :value :text] := #fhir/string"null" + [:result :stratum 3 :population 0 :count] := #fhir/integer 1))))) (testing "Encounter measure" (with-system-data [system mem-node-system] @@ -230,37 +274,37 @@ evaluated-populations {:handles [[{:population-handle (d/resource-handle db "Encounter" "0") - :subject-handle (d/resource-handle db "Patient" "0")} - {:population-handle (d/resource-handle db "Encounter" "1") - :subject-handle (d/resource-handle db "Patient" "0")} - {:population-handle (d/resource-handle db "Encounter" "2") - :subject-handle (d/resource-handle db "Patient" "1")} - {:population-handle (d/resource-handle db "Encounter" "3") - :subject-handle (d/resource-handle db "Patient" "2")}]]}] + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "1") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Encounter" "2") + :subject-handle (d/resource-handle db "Patient" "1")} + {:population-handle (d/resource-handle db "Encounter" "3") + :subject-handle (d/resource-handle db "Patient" "2")}]]}] (testing "report-type population" (given (stratifier/evaluate - (assoc context - :report-type "population" - :population-basis "Encounter") - evaluated-populations status-age-stratifier) + (assoc context + :report-type "population" + :population-basis "Encounter") + evaluated-populations status-age-stratifier) [:result :fhir/type] := :fhir.MeasureReport.group/stratifier - [:result :code 0 :text type/value] := "status" - [:result :code 1 :text type/value] := "age" - [:result :stratum 0 :component 0 :code :text type/value] := "status" - [:result :stratum 0 :component 0 :value :text type/value] := "finished" - [:result :stratum 0 :component 1 :code :text type/value] := "age" - [:result :stratum 0 :component 1 :value :text type/value] := "19" - [:result :stratum 0 :population 0 :count type/value] := 1 - [:result :stratum 1 :component 0 :value :text type/value] := "finished" - [:result :stratum 1 :component 1 :value :text type/value] := "20" - [:result :stratum 1 :population 0 :count type/value] := 1 - [:result :stratum 2 :component 0 :value :text type/value] := "null" - [:result :stratum 2 :component 1 :value :text type/value] := "null" - [:result :stratum 2 :population 0 :count type/value] := 1 - [:result :stratum 3 :component 0 :value :text type/value] := "planned" - [:result :stratum 3 :component 1 :value :text type/value] := "20" - [:result :stratum 3 :population 0 :count type/value] := 1))))) + [:result :code 0 :text] := #fhir/string"status" + [:result :code 1 :text] := #fhir/string"age" + [:result :stratum 0 :component 0 :code :text] := #fhir/string"status" + [:result :stratum 0 :component 0 :value :text] := #fhir/string"finished" + [:result :stratum 0 :component 1 :code :text] := #fhir/string"age" + [:result :stratum 0 :component 1 :value :text] := #fhir/string"19" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 1 :component 0 :value :text] := #fhir/string"finished" + [:result :stratum 1 :component 1 :value :text] := #fhir/string"20" + [:result :stratum 1 :population 0 :count] := #fhir/integer 1 + [:result :stratum 2 :component 0 :value :text] := #fhir/string"null" + [:result :stratum 2 :component 1 :value :text] := #fhir/string"null" + [:result :stratum 2 :population 0 :count] := #fhir/integer 1 + [:result :stratum 3 :component 0 :value :text] := #fhir/string"planned" + [:result :stratum 3 :component 1 :value :text] := #fhir/string"20" + [:result :stratum 3 :population 0 :count] := #fhir/integer 1))))) (testing "with unknown expression error" (with-system-data [system mem-node-system] From 64e8f53912041fb2ab8b79075b12335e06e44164 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 4 Dec 2022 22:05:54 +0100 Subject: [PATCH 069/124] Update Dependencies --- modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/rest-util/deps.edn | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 690f43e04..af48acb93 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.9"}} + {:mvn/version "3.21.10"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 1927961bb..578eddcae 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.9"} + {:mvn/version "3.21.10"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.14.1"}}} diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 929456093..1943d901d 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -29,7 +29,7 @@ {:mvn/version "2022.06.16-403"} metosin/jsonista - {:mvn/version "0.3.6"} + {:mvn/version "0.3.7"} org.clojure/alpha.spec {:git/url "https://github.com/alexanderkiel/spec-alpha2.git" diff --git a/modules/rest-util/deps.edn b/modules/rest-util/deps.edn index 2ff2fe1bb..b02b41358 100644 --- a/modules/rest-util/deps.edn +++ b/modules/rest-util/deps.edn @@ -9,7 +9,7 @@ {:local/root "../fhir-structure"} org.apache.httpcomponents/httpcore - {:mvn/version "4.4.15"} + {:mvn/version "4.4.16"} metosin/reitit-ring {:mvn/version "0.5.18"} From f122c88ebe9a5172d698fd9414353e6e86607f21 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 6 Dec 2022 15:42:47 +0100 Subject: [PATCH 070/124] Add a Backport of R5 Quantity Stratum Values In R5 stratum values can have different types. Quantity is one of them. This commit introduces the extension stratum-value that allows to output quantity values. The original value will still have a text component with a textual representation of the quantity. --- .../evaluate_measure/measure/stratifier.clj | 31 +++- .../measure/stratifier_test.clj | 150 +++++++++++++++--- 2 files changed, 154 insertions(+), 27 deletions(-) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj index ecd88804b..277a6334d 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj @@ -7,16 +7,33 @@ (defn- value-concept [value] - (if (identical? :fhir/CodeableConcept (type/type value)) - value - (type/codeable-concept - {:text (type/string (if (nil? value) "null" (str value)))}))) + (let [type (type/type value)] + (cond + (identical? :fhir/CodeableConcept type) + value + + (identical? :fhir/Quantity type) + (type/codeable-concept + {:text (cond-> (str (:value value)) (:code value) (str " " (:code value)))}) + + :else + (type/codeable-concept + {:text (type/string (if (nil? value) "null" (str value)))})))) + + +(defn- stratum-value-extension [value] + (type/extension + {:url "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + :value value})) (defn- stratum* [population value] - {:fhir/type :fhir.MeasureReport.group.stratifier/stratum - :value (value-concept value) - :population [population]}) + (cond-> {:fhir/type :fhir.MeasureReport.group.stratifier/stratum + :value (value-concept value) + :population [population]} + + (identical? :fhir/Quantity (type/type value)) + (assoc :extension [(stratum-value-extension value)]))) (defn- stratum [context population-code value handles] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index 84218b2fd..78ad80732 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -8,6 +8,7 @@ [blaze.elm.compiler.library :as library] [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] [blaze.fhir.operation.evaluate-measure.measure.stratifier-spec] + [blaze.test-util :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] @@ -70,6 +71,17 @@ observation.code") +(def library-observation-value + "library Retrieve + using FHIR version '4.0.0' + include FHIRHelpers version '4.0.0' + + context Patient + + define function QuantityValue(observation Observation): + observation.value as Quantity") + + (def library-encounter-status-age "library Retrieve using FHIR version '4.0.0' @@ -90,6 +102,14 @@ :expression expr}) +(def stratifier-with-missing-expression + {:fhir/type :fhir.Measure.group/stratifier + :code #fhir/CodeableConcept{:text #fhir/string"gender"} + :criteria + {:fhir/type :fhir/Expression + :language #fhir/code"text/cql-identifier"}}) + + (def gender-stratifier {:fhir/type :fhir.Measure.group/stratifier :code #fhir/CodeableConcept{:text #fhir/string"gender"} @@ -100,6 +120,24 @@ :code #fhir/CodeableConcept{:text #fhir/string"code"} :criteria (cql-expression "Code")}) +(def observation-value-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :code #fhir/CodeableConcept{:text #fhir/string"value"} + :criteria (cql-expression "QuantityValue")}) + + +(def multi-component-stratifier-with-missing-expression + {:fhir/type :fhir.Measure.group/stratifier + :component + [{:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"age"} + :criteria + {:fhir/type :fhir/Expression + :language #fhir/code"text/cql-identifier"}} + {:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"gender"} + :criteria (cql-expression "Gender")}]}) + (def age-gender-stratifier {:fhir/type :fhir.Measure.group/stratifier @@ -212,7 +250,72 @@ [:result :code 0 :text] := #fhir/string"code" [:result :stratum 0 :value :coding 0 :system] := #fhir/uri"http://loinc.org" [:result :stratum 0 :value :coding 0 :code] := #fhir/code"17861-6" - [:result :stratum 0 :population 0 :count] := #fhir/integer 1)))))) + [:result :stratum 0 :population 0 :count] := #fhir/integer 1))))) + + (testing "Quantity" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Observation :id "0" + :subject #fhir/Reference{:reference "Patient/0"} + :value #fhir/Quantity + {:value #fhir/decimal 1M + :code #fhir/code"kg"}}] + [:put {:fhir/type :fhir/Observation :id "1" + :subject #fhir/Reference{:reference "Patient/0"} + :value #fhir/Quantity + {:value #fhir/decimal 2M}}]]] + (let [{:keys [db] :as context} (context system library-observation-value) + evaluated-populations + {:handles + [[{:population-handle (d/resource-handle db "Observation" "0") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Observation" "1") + :subject-handle (d/resource-handle db "Patient" "0")}]]}] + + (testing "report-type population" + (given (stratifier/evaluate + (assoc context + :report-type "population" + :population-basis "Observation") + evaluated-populations observation-value-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text] := #fhir/string"value" + [:result :stratum 0 :extension 0 :url] := "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + [:result :stratum 0 :extension 0 :value :value] := #fhir/decimal 1M + [:result :stratum 0 :extension 0 :value :code] := #fhir/code"kg" + [:result :stratum 0 :value :text] := "1 kg" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 1 :extension 0 :url] := "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + [:result :stratum 1 :extension 0 :value :value] := #fhir/decimal 2M + [:result :stratum 1 :value :text] := "2" + [:result :stratum 1 :population 0 :count] := #fhir/integer 1))))) + + (testing "errors" + (testing "with expression" + (with-system [system mem-node-system] + (let [context (context system empty-library) + evaluated-populations {:handles [[]]}] + (given (stratifier/evaluate + (assoc context + :report-type "population" + :group-idx 1 + :stratifier-idx 2) + evaluated-populations + stratifier-with-missing-expression) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression." + :fhir/issue := "required" + :fhir.issue/expression := "Measure.group[1].stratifier[2].criteria")))) + + (testing "with unknown expression" + (with-system [system mem-node-system] + (let [context (context system empty-library) + evaluated-populations {:handles [[]]}] + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations gender-stratifier) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `Gender`." + :expression-name := "Gender")))))) (testing "two components" (testing "subject-based measure" @@ -306,22 +409,29 @@ [:result :stratum 3 :component 1 :value :text] := #fhir/string"20" [:result :stratum 3 :population 0 :count] := #fhir/integer 1))))) - (testing "with unknown expression error" - (with-system-data [system mem-node-system] - [[[:put {:fhir/type :fhir/Patient :id "0"}] - [:put {:fhir/type :fhir/Patient :id "1" - :gender #fhir/code"male" - :birthDate #fhir/date"1960"}] - [:put {:fhir/type :fhir/Patient :id "2" - :gender #fhir/code"female" - :birthDate #fhir/date"1960"}] - [:put {:fhir/type :fhir/Patient :id "3" - :gender #fhir/code"male" - :birthDate #fhir/date"1950"}]]] - (let [{:keys [db] :as context} (context system empty-library) - evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] - (given (stratifier/evaluate (assoc context :report-type "population") - evaluated-populations age-gender-stratifier) - ::anom/category := ::anom/incorrect - ::anom/message := "Missing expression with name `Age`." - :expression-name := "Age")))))) + (testing "errors" + (testing "with expression" + (with-system [system mem-node-system] + (let [context (context system empty-library) + evaluated-populations {:handles [[]]}] + (given (stratifier/evaluate + (assoc context + :report-type "population" + :group-idx 1 + :stratifier-idx 2) + evaluated-populations + multi-component-stratifier-with-missing-expression) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression." + :fhir/issue := "required" + :fhir.issue/expression := "Measure.group[1].stratifier[2].component[0].criteria")))) + + (testing "with unknown expression" + (with-system [system mem-node-system] + (let [context (context system empty-library) + evaluated-populations {:handles [[]]}] + (given (stratifier/evaluate (assoc context :report-type "population") + evaluated-populations age-gender-stratifier) + ::anom/category := ::anom/incorrect + ::anom/message := "Missing expression with name `Age`." + :expression-name := "Age"))))))) From 5271c49fa4850d6a480384158e998b60b949488f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 6 Dec 2022 16:11:46 +0100 Subject: [PATCH 071/124] Fix Jepsen Tests I forgot to init the structure definition repository. --- modules/jepsen/src/blaze/jepsen/register.clj | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/modules/jepsen/src/blaze/jepsen/register.clj b/modules/jepsen/src/blaze/jepsen/register.clj index b545efe0b..652bef144 100644 --- a/modules/jepsen/src/blaze/jepsen/register.clj +++ b/modules/jepsen/src/blaze/jepsen/register.clj @@ -5,9 +5,11 @@ [blaze.async.comp :as ac] [blaze.fhir-client :as fhir-client] [blaze.fhir.spec.type :as type] + [blaze.fhir.structure-definition-repo] [blaze.jepsen.util :as u] [clojure.tools.logging :refer [info]] [hato.client :as hc] + [integrant.core :as ig] [jepsen.checker :as checker] [jepsen.cli :as cli] [jepsen.client :as client] @@ -17,6 +19,9 @@ [knossos.model :as model])) +(ig/init {:blaze.fhir/structure-definition-repo {}}) + + (defn r [_ _] {:type :invoke :f :read :value nil}) From 9c20088eb7a7d6bd9568ff87230386cf4cdd7a4f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 6 Dec 2022 19:10:13 +0100 Subject: [PATCH 072/124] Update Jepsen --- modules/jepsen/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 0d1328bdf..3d07fe241 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-client"} jepsen/jepsen - {:mvn/version "0.2.7"}} + {:mvn/version "0.3.0"}} :aliases {:test From 48bb9f0f867eff3ce7c0b9249b49cb05a0e2897f Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 7 Dec 2022 20:22:29 +0100 Subject: [PATCH 073/124] Update CQL-to-ELM Translator --- deps.edn | 5 +- modules/cql/deps.edn | 30 +- .../resources/blaze/fhir-modelinfo-4.0.0.xml | 11692 ---------------- .../org/hl7/elm_modelinfo/r1/jaxb.properties | 1 - modules/cql/src/blaze/cql_translator.clj | 30 +- .../cql/src/blaze/elm/compiler/library.clj | 2 +- .../src/blaze/elm/compiler/reusing_logic.clj | 2 +- .../blaze/elm/compiler/external_data_test.clj | 6 +- .../blaze/elm/compiler/reusing_logic_test.clj | 10 +- .../elm/compiler/structured_values_test.clj | 18 +- modules/fhir-path/deps.edn | 2 +- .../operation/evaluate_measure/measure.clj | 2 +- 12 files changed, 54 insertions(+), 11746 deletions(-) delete mode 100644 modules/cql/resources/blaze/fhir-modelinfo-4.0.0.xml delete mode 100644 modules/cql/resources/org/hl7/elm_modelinfo/r1/jaxb.properties diff --git a/deps.edn b/deps.edn index a4e778825..21184dd8d 100644 --- a/deps.edn +++ b/deps.edn @@ -125,4 +125,7 @@ "-d" "modules/spec" "-d" "modules/terminology-service" "-d" "modules/test-util" - "-d" "modules/thread-pool-executor-collector"]}}} + "-d" "modules/thread-pool-executor-collector" + "--exclude" "com.taoensso/timbre" + "--exclude" "org.eclipse.jetty/jetty-server" + "--exclude" "org.clojure/alpha.spec"]}}} diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index fbeb358be..f0969ee5a 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -7,20 +7,24 @@ com.fasterxml.jackson.module/jackson-module-jaxb-annotations {:mvn/version "2.14.1"} + com.fasterxml.jackson.dataformat/jackson-dataformat-xml + {:mvn/version "2.14.1"} + info.cqframework/cql-to-elm - {:mvn/version "1.5.10" - :exclusions - [com.google.code.javaparser/javaparser - info.cqframework/qdm - junit/junit - xpp3/xpp3 - xpp3/xpp3_xpath - org.slf4j/jcl-over-slf4j - org.slf4j/slf4j-api - org.jvnet.jaxb2_commons/jaxb2-basics-tools]} - - javax.xml.bind/jaxb-api - {:mvn/version "2.4.0-b180830.0359"} + {:mvn/version "2.4.0" + :exclusions [xpp3/xpp3_xpath]} + + info.cqframework/elm-jackson + {:mvn/version "2.4.0"} + + info.cqframework/model-jackson + {:mvn/version "2.4.0"} + + info.cqframework/quick + {:mvn/version "2.4.0"} + + org.apache.commons/commons-text + {:mvn/version "1.10.0"} systems.uom/systems-quantity {:mvn/version "2.1"} diff --git a/modules/cql/resources/blaze/fhir-modelinfo-4.0.0.xml b/modules/cql/resources/blaze/fhir-modelinfo-4.0.0.xml deleted file mode 100644 index a4c9b6fdb..000000000 --- a/modules/cql/resources/blaze/fhir-modelinfo-4.0.0.xml +++ /dev/null @@ -1,11692 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/cql/resources/org/hl7/elm_modelinfo/r1/jaxb.properties b/modules/cql/resources/org/hl7/elm_modelinfo/r1/jaxb.properties deleted file mode 100644 index b2979f902..000000000 --- a/modules/cql/resources/org/hl7/elm_modelinfo/r1/jaxb.properties +++ /dev/null @@ -1 +0,0 @@ -javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory diff --git a/modules/cql/src/blaze/cql_translator.clj b/modules/cql/src/blaze/cql_translator.clj index d781ca959..a8f028691 100644 --- a/modules/cql/src/blaze/cql_translator.clj +++ b/modules/cql/src/blaze/cql_translator.clj @@ -2,36 +2,18 @@ (:require [blaze.anomaly :as ba] [blaze.elm.spec] - [clojure.java.io :as io] [jsonista.core :as j]) (:import [org.cqframework.cql.cql2elm - CqlTranslator CqlTranslator$Options - FhirLibrarySourceProvider LibraryManager ModelManager - ModelInfoProvider ModelInfoLoader] - [javax.xml.bind JAXB] - [org.hl7.elm_modelinfo.r1 ModelInfo])) + CqlTranslator CqlTranslatorOptions$Options LibraryManager ModelManager] + [org.cqframework.cql.cql2elm.quick FhirLibrarySourceProvider])) (set! *warn-on-reflection* true) -(defn- load-model-info [name] - (let [res (io/resource name) - ^ModelInfo modelInfo (JAXB/unmarshal res ^Class ModelInfo) - provider (reify ModelInfoProvider (load [_ _] modelInfo))] - (.registerModelInfoProvider (ModelInfoLoader.) provider))) - - -(defn- options [locators?] - (->> (cond-> [CqlTranslator$Options/EnableResultTypes] - locators? - (conj CqlTranslator$Options/EnableLocators)) - (into-array CqlTranslator$Options))) - - -;; Our special model info with Specimen context -(load-model-info "blaze/fhir-modelinfo-4.0.0.xml") +(def ^:private options + (into-array [CqlTranslatorOptions$Options/EnableResultTypes])) (def ^:private json-object-mapper @@ -45,11 +27,11 @@ Returns an anomaly with category :cognitect.anomalies/incorrect in case of errors." - [cql & {:keys [locators?]}] + [cql] (let [model-manager (ModelManager.) library-manager (LibraryManager. model-manager) _ (.registerProvider (.getLibrarySourceLoader library-manager) (FhirLibrarySourceProvider.)) - translator (CqlTranslator/fromText cql model-manager library-manager (options locators?))] + translator (CqlTranslator/fromText cql model-manager library-manager options)] (if-let [errors (seq (.getErrors translator))] (ba/incorrect (apply str (map ex-message errors)) diff --git a/modules/cql/src/blaze/elm/compiler/library.clj b/modules/cql/src/blaze/elm/compiler/library.clj index 573b1f408..d5d6b9022 100644 --- a/modules/cql/src/blaze/elm/compiler/library.clj +++ b/modules/cql/src/blaze/elm/compiler/library.clj @@ -44,7 +44,7 @@ (defn- expression-defs [context library] (transduce - (comp (filter (comp nil? :type)) + (comp (filter (comp #{"ExpressionDef"} :type)) (map (partial compile-expression-def context)) (halt-when ba/anomaly?)) (completing diff --git a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj index bf18f3868..60a90f59d 100644 --- a/modules/cql/src/blaze/elm/compiler/reusing_logic.clj +++ b/modules/cql/src/blaze/elm/compiler/reusing_logic.clj @@ -48,7 +48,7 @@ (defn- find-expression-def [library name] (when-let [def (find-def library name)] - (when (nil? (:type def)) + (when (= "ExpressionDef" (:type def)) def))) diff --git a/modules/cql/test/blaze/elm/compiler/external_data_test.clj b/modules/cql/test/blaze/elm/compiler/external_data_test.clj index c6282120b..8f8319d46 100644 --- a/modules/cql/test/blaze/elm/compiler/external_data_test.clj +++ b/modules/cql/test/blaze/elm/compiler/external_data_test.clj @@ -327,7 +327,8 @@ {:def [{:name "sys-def-174848" :id "system-174915"}]} :statements {:def - [{:name "name-174207" + [{:type "ExpressionDef" + :name "name-174207" :resultTypeName "{http://hl7.org/fhir}Patient"}]}} elm #elm/retrieve {:type "Observation" @@ -344,7 +345,8 @@ {:def [{:name "sys-def-174848" :id "system-174915"}]} :statements {:def - [{:name "name-174207" + [{:type "ExpressionDef" + :name "name-174207" :resultTypeName "{http://hl7.org/fhir}Patient"}]}} elm #elm/retrieve {:type "Observation" diff --git a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj index e16680f36..fba991445 100644 --- a/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj +++ b/modules/cql/test/blaze/elm/compiler/reusing_logic_test.clj @@ -47,17 +47,21 @@ :context := {})) (testing "Result Type" - (let [library {:statements {:def [{:name "name-170312" :resultTypeName "result-type-name-173029"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "name-170312" + :resultTypeName "result-type-name-173029"}]}} expr (c/compile {:library library} #elm/expression-ref "name-170312")] (is (= "result-type-name-173029" (:result-type-name (meta expr)))))) (testing "Eval" - (let [library {:statements {:def [{:name "name-170312"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "name-170312"}]}} expr (c/compile {:library library} #elm/expression-ref "name-170312")] (is (= ::result (core/-eval expr {:expression-defs {"name-170312" {:expression ::result}}} nil nil))))) (testing "form" - (let [library {:statements {:def [{:name "name-170312"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "name-170312"}]}} expr (c/compile {:library library} #elm/expression-ref "name-170312")] (is (= '(expr-ref "name-170312") (core/-form expr)))))) diff --git a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj index d6d75b9dd..99597fa8e 100644 --- a/modules/cql/test/blaze/elm/compiler/structured_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/structured_values_test.clj @@ -215,7 +215,8 @@ (testing "with source" (testing "Patient.identifier" (testing "with source-type" - (let [library {:statements {:def [{:name "Patient"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Patient"}]}} elm {:path "identifier" :source #elm/expression-ref "Patient" @@ -236,7 +237,8 @@ (is (= '(:identifier (expr-ref "Patient")) (core/-form expr)))))) (testing "without source-type" - (let [library {:statements {:def [{:name "Patient"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Patient"}]}} elm {:path "identifier" :source #elm/expression-ref "Patient" @@ -254,7 +256,8 @@ (testing "Patient.gender" (testing "with source-type" - (let [library {:statements {:def [{:name "Patient"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Patient"}]}} elm {:path "gender" :source #elm/expression-ref "Patient" @@ -268,7 +271,8 @@ (is (= #fhir/code"male" result)))) (testing "without source-type" - (let [library {:statements {:def [{:name "Patient"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Patient"}]}} elm {:path "gender" :source #elm/expression-ref "Patient" @@ -282,7 +286,8 @@ (testing "Observation.value" (testing "with source-type" - (let [library {:statements {:def [{:name "Observation"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Observation"}]}} elm {:path "value" :source #elm/expression-ref "Observation" @@ -296,7 +301,8 @@ (is (= "value-114318" result)))) (testing "without source-type" - (let [library {:statements {:def [{:name "Observation"}]}} + (let [library {:statements {:def [{:type "ExpressionDef" + :name "Observation"}]}} elm {:path "value" :source #elm/expression-ref "Observation" diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 7ce97700f..6bc99d8c9 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-structure"} info.cqframework/cql - {:mvn/version "1.5.10"}} + {:mvn/version "2.4.0"}} :aliases {:test diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj index 4147bdcfd..6c7cdca03 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj @@ -69,7 +69,7 @@ (defn- translate [cql-code] - (-> (cql-translator/translate cql-code :locators? true) + (-> (cql-translator/translate cql-code) (ba/exceptionally #(assoc % :fhir/issue "value" From 36201fbe0bb8a40915f9a4cb04097e944279c4b6 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 8 Dec 2022 11:36:08 +0100 Subject: [PATCH 074/124] Use Official FHIR Backport Mechanism for MeasureReport Stratum Values See also: https://hl7.org/fhir/versions.html#extensions --- .../evaluate_measure/measure/stratifier.clj | 17 +++-- .../measure/stratifier_test.clj | 69 +++++++++++++++++-- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj index 277a6334d..4900ceb81 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/stratifier.clj @@ -23,7 +23,7 @@ (defn- stratum-value-extension [value] (type/extension - {:url "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + {:url "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.value" :value value})) @@ -121,14 +121,23 @@ stratifier-components)) +(defn- stratum-component-value-extension [value] + (type/extension + {:url "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.component.value" + :value value})) + + (defn- multi-component-stratum* [population codes values] {:fhir/type :fhir.MeasureReport.group.stratifier/stratum :component (mapv (fn [code value] - {:fhir/type :fhir.MeasureReport.group.stratifier.stratum/component - :code code - :value (value-concept value)}) + (cond-> {:fhir/type :fhir.MeasureReport.group.stratifier.stratum/component + :code code + :value (value-concept value)} + + (identical? :fhir/Quantity (type/type value)) + (assoc :extension [(stratum-component-value-extension value)]))) codes values) :population [population]}) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index 78ad80732..0c2781c8e 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -71,7 +71,7 @@ observation.code") -(def library-observation-value +(def library-observation-value-age "library Retrieve using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' @@ -79,7 +79,10 @@ context Patient define function QuantityValue(observation Observation): - observation.value as Quantity") + observation.value as Quantity + + define function Age(observation Observation): + AgeInYearsAt(observation.effective)") (def library-encounter-status-age @@ -161,6 +164,17 @@ :criteria (cql-expression "Age")}]}) +(def observation-value-age-stratifier + {:fhir/type :fhir.Measure.group/stratifier + :component + [{:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"value"} + :criteria (cql-expression "QuantityValue")} + {:fhir/type :fhir.Measure.group.stratifier/component + :code #fhir/CodeableConcept{:text #fhir/string"age"} + :criteria (cql-expression "Age")}]}) + + (defn- context [{:blaze.db/keys [node] :blaze.test/keys [clock]} library] (let [{:keys [expression-defs function-defs]} (compile-library node library)] {:db (d/db node) @@ -264,7 +278,7 @@ :subject #fhir/Reference{:reference "Patient/0"} :value #fhir/Quantity {:value #fhir/decimal 2M}}]]] - (let [{:keys [db] :as context} (context system library-observation-value) + (let [{:keys [db] :as context} (context system library-observation-value-age) evaluated-populations {:handles [[{:population-handle (d/resource-handle db "Observation" "0") @@ -280,12 +294,12 @@ evaluated-populations observation-value-stratifier) [:result :fhir/type] := :fhir.MeasureReport.group/stratifier [:result :code 0 :text] := #fhir/string"value" - [:result :stratum 0 :extension 0 :url] := "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + [:result :stratum 0 :extension 0 :url] := "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.value" [:result :stratum 0 :extension 0 :value :value] := #fhir/decimal 1M [:result :stratum 0 :extension 0 :value :code] := #fhir/code"kg" [:result :stratum 0 :value :text] := "1 kg" [:result :stratum 0 :population 0 :count] := #fhir/integer 1 - [:result :stratum 1 :extension 0 :url] := "https://samply.github.io/blaze/fhir/StructureDefinition/stratum-value" + [:result :stratum 1 :extension 0 :url] := "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.value" [:result :stratum 1 :extension 0 :value :value] := #fhir/decimal 2M [:result :stratum 1 :value :text] := "2" [:result :stratum 1 :population 0 :count] := #fhir/integer 1))))) @@ -409,6 +423,51 @@ [:result :stratum 3 :component 1 :value :text] := #fhir/string"20" [:result :stratum 3 :population 0 :count] := #fhir/integer 1))))) + (testing "Quantity" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0" :birthDate #fhir/date"2000"}] + [:put {:fhir/type :fhir/Observation :id "0" + :subject #fhir/Reference{:reference "Patient/0"} + :effective #fhir/dateTime"2020" + :value #fhir/Quantity + {:value #fhir/decimal 1M + :code #fhir/code"kg"}}] + [:put {:fhir/type :fhir/Observation :id "1" + :subject #fhir/Reference{:reference "Patient/0"} + :effective #fhir/dateTime"2021" + :value #fhir/Quantity + {:value #fhir/decimal 2M}}]]] + (let [{:keys [db] :as context} (context system library-observation-value-age) + evaluated-populations + {:handles + [[{:population-handle (d/resource-handle db "Observation" "0") + :subject-handle (d/resource-handle db "Patient" "0")} + {:population-handle (d/resource-handle db "Observation" "1") + :subject-handle (d/resource-handle db "Patient" "0")}]]}] + + (testing "report-type population" + (given (stratifier/evaluate + (assoc context + :report-type "population" + :population-basis "Observation") + evaluated-populations observation-value-age-stratifier) + [:result :fhir/type] := :fhir.MeasureReport.group/stratifier + [:result :code 0 :text] := #fhir/string"value" + [:result :code 1 :text] := #fhir/string"age" + [:result :stratum 0 :component 0 :extension 0 :url] := "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.component.value" + [:result :stratum 0 :component 0 :extension 0 :value :value] := #fhir/decimal 1M + [:result :stratum 0 :component 0 :extension 0 :value :code] := #fhir/code"kg" + [:result :stratum 0 :component 0 :code :text] := #fhir/string"value" + [:result :stratum 0 :component 0 :value :text] := #fhir/string"1 kg" + [:result :stratum 0 :component 1 :code :text] := #fhir/string"age" + [:result :stratum 0 :component 1 :value :text] := #fhir/string"20" + [:result :stratum 0 :population 0 :count] := #fhir/integer 1 + [:result :stratum 1 :component 0 :extension 0 :url] := "http://hl7.org/fhir/5.0/StructureDefinition/extension-MeasureReport.group.stratifier.stratum.component.value" + [:result :stratum 1 :component 0 :extension 0 :value :value] := #fhir/decimal 2M + [:result :stratum 1 :component 0 :value :text] := #fhir/string"2" + [:result :stratum 1 :component 1 :value :text] := #fhir/string"21" + [:result :stratum 1 :population 0 :count] := #fhir/integer 1))))) + (testing "errors" (testing "with expression" (with-system [system mem-node-system] From ee99a91d2898b31cac5ef62ad47d259a07f3dea1 Mon Sep 17 00:00:00 2001 From: Martin Lablans Date: Thu, 8 Dec 2022 17:28:14 +0100 Subject: [PATCH 075/124] Decrease size of docker image --- Dockerfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index d0c41f0f7..88dad42aa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -2,7 +2,8 @@ FROM eclipse-temurin:17-jre RUN apt-get update && apt-get upgrade -y && \ apt-get purge wget libbinutils libctf0 libctf-nobfd0 libncurses6 -y && \ - apt-get autoremove -y && apt-get clean + apt-get autoremove -y && apt-get clean && \ + rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data COPY target/blaze-standalone.jar /app/ From ceb729d8227784cb4972e70933d0c40b092cd5f8 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 8 Dec 2022 17:31:38 +0100 Subject: [PATCH 076/124] Remove Resources Source Dir in Module CQL --- modules/cql/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index f0969ee5a..7115326b5 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -1,4 +1,4 @@ -{:paths ["src" "resources"] +{:paths ["src"] :deps {blaze/db From ec8e62396e6fa1e0c3893791fb35a9d619a20671 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 22 Sep 2022 18:37:18 +0200 Subject: [PATCH 077/124] Use Tools Build --- Dockerfile | 4 +- Makefile | 16 +++++--- build.clj | 41 +++++++++++++++++++ deps.edn | 10 ++--- docs/deployment/manual-deployment.md | 6 +-- modules/byte-string/deps.edn | 2 +- modules/cql/Makefile | 15 +++++-- modules/db-resource-store-cassandra/Makefile | 9 ++-- modules/db-resource-store/Makefile | 9 ++-- modules/db-tx-log-kafka/Makefile | 9 ++-- modules/db-tx-log/Makefile | 9 ++-- modules/db/Makefile | 9 ++-- .../resources => db/test}/data_readers.clj | 0 modules/interaction/Makefile | 9 ++-- modules/metrics/Makefile | 9 ++-- modules/metrics/build.clj | 12 ++++++ modules/metrics/deps.edn | 22 +++++++--- .../metrics/src/blaze/metrics/Collector.clj | 18 ++++++++ modules/metrics/src/blaze/metrics/core.clj | 7 +--- .../Makefile | 9 ++-- modules/page-store-cassandra/Makefile | 9 ++-- modules/page-store/Makefile | 9 ++-- modules/rest-api/Makefile | 9 ++-- modules/rest-util/Makefile | 9 ++-- modules/rocksdb/Makefile | 9 ++-- .../thread-pool-executor-collector/Makefile | 9 ++-- pom.xml | 24 ----------- src/blaze/core.clj | 3 +- 28 files changed, 209 insertions(+), 97 deletions(-) create mode 100644 build.clj rename modules/{byte-string/resources => db/test}/data_readers.clj (100%) create mode 100644 modules/metrics/build.clj create mode 100644 modules/metrics/src/blaze/metrics/Collector.clj delete mode 100644 pom.xml diff --git a/Dockerfile b/Dockerfile index 88dad42aa..e3574f899 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-standalone.jar /app/ +COPY target/blaze-0.18.4-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-standalone.jar", "-m", "blaze.core"] +CMD ["java", "-jar", "blaze-0.18.4-standalone.jar"] diff --git a/Makefile b/Makefile index 6a3dfc2af..dd2196dc3 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,10 @@ lint-root: lint: $(MODULES) lint-root -test-root: +prep: + clojure -X:deps prep + +test-root: prep clojure -M:test:kaocha --profile :ci test: $(MODULES) test-root @@ -20,13 +23,16 @@ clean-root: clean: $(MODULES) clean-root -uberjar: - clojure -X:depstar uberjar :jar target/blaze-standalone.jar +uberjar: prep + clojure -T:build uber outdated: clojure -M:outdated deps-tree: - clojure -Stree + clojure -X:deps tree + +deps-list: + clojure -X:deps list -.PHONY: $(MODULES) lint-root lint test-root test test-coverage clean-root clean uberjar outdated deps-tree +.PHONY: $(MODULES) lint-root lint prep test-root test test-coverage clean-root clean uberjar outdated deps-tree deps-list diff --git a/build.clj b/build.clj new file mode 100644 index 000000000..8f28a8d0d --- /dev/null +++ b/build.clj @@ -0,0 +1,41 @@ +(ns build + (:require [clojure.tools.build.api :as b])) + +(def lib 'samply/blaze) +(def version "0.18.4") +(def class-dir "target/classes") +(def basis (b/create-basis {:project "deps.edn"})) +(def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) + +(defn clean [_] + (b/delete {:path "target"})) + +(defn uber [_] + (clean nil) + (b/copy-dir {:src-dirs ["src" "resources"] + :target-dir class-dir}) + (b/compile-clj {:basis basis + :src-dirs ["src"] + :class-dir class-dir + :compile-opts + {:direct-linking true + :elide-meta [:doc :file :line :added]}}) + (b/uber {:class-dir class-dir + :uber-file uber-file + :basis basis + :main 'blaze.core + :exclude + ["^about.html" + "^META-INF/versions/\\d+/module-info.class" + "^HISTORY-JAVA.md" + "^dse_protocol_v\\d.spec" + "^native_protocol_v\\d.spec" + ".*-musl.so$" + ".*-ppc64le.so$" + ".*-s390x.so$" + ".*-linux32.so$" + ".*.dll$" + ".*.jnilib$"] + :conflict-handlers + {"META-INF/io.netty.versions.properties" :append + :default :warn}})) diff --git a/deps.edn b/deps.edn index 21184dd8d..6970f5e48 100644 --- a/deps.edn +++ b/deps.edn @@ -44,11 +44,11 @@ {:mvn/version "2.0.5"}} :aliases - {:depstar - {:replace-deps - {com.github.seancorfield/depstar - {:mvn/version "2.1.303"}} - :ns-default hf.depstar} + {:build + {:deps + {io.github.clojure/tools.build + {:git/tag "v0.8.5" :git/sha "9c738da"}} + :ns-default build} :test {:extra-paths ["dev" "test"] diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 09f9a7dce..2050b7ed4 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -7,7 +7,7 @@ Blaze runs on the JVM and comes as single JAR file. Download the most recent ver After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.4-standalone.jar -m blaze.core +java -jar blaze-0.18.4-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.4-standalone.jar -m blaze.core +STORAGE=standalone java -jar blaze-0.18.4-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.4-standalone.jar -m blaze.core +java -jar blaze-0.18.4-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 578eddcae..97f5f86de 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -1,4 +1,4 @@ -{:paths ["src" "resources"] +{:paths ["src"] :deps {com.google.guava/guava diff --git a/modules/cql/Makefile b/modules/cql/Makefile index d6fbd2a65..14c70c245 100644 --- a/modules/cql/Makefile +++ b/modules/cql/Makefile @@ -1,6 +1,9 @@ lint: clj-kondo --lint src test deps.edn +prep: + clojure -X:deps prep + cql-test: wget http://cql.hl7.org/tests.zip echo "0d48a7441c43b6ee46e71d73decfa0cf4ea81e2ce70951f20e9163c3bebfc49a tests.zip" | sha256sum --check --status @@ -9,13 +12,19 @@ cql-test: # See: https://github.com/HL7/cql/pull/69 sed -i.bak '277d' cql-test/CqlArithmeticFunctionsTest.xml -test: cql-test +test: cql-test prep clojure -M:test:kaocha --profile :ci -test-coverage: cql-test +test-coverage: cql-test prep clojure -M:test:coverage +deps-tree: + clojure -X:deps tree + +deps-list: + clojure -X:deps list + clean: rm -rf .clj-kondo/.cache .cpcache cql-test target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage deps-tree deps-list clean diff --git a/modules/db-resource-store-cassandra/Makefile b/modules/db-resource-store-cassandra/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/db-resource-store-cassandra/Makefile +++ b/modules/db-resource-store-cassandra/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/db-resource-store/Makefile b/modules/db-resource-store/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/db-resource-store/Makefile +++ b/modules/db-resource-store/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/db-tx-log-kafka/Makefile b/modules/db-tx-log-kafka/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/db-tx-log-kafka/Makefile +++ b/modules/db-tx-log-kafka/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/db-tx-log/Makefile b/modules/db-tx-log/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/db-tx-log/Makefile +++ b/modules/db-tx-log/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/db/Makefile b/modules/db/Makefile index 9810d3bfb..d6dff4670 100644 --- a/modules/db/Makefile +++ b/modules/db/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test test-perf deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/byte-string/resources/data_readers.clj b/modules/db/test/data_readers.clj similarity index 100% rename from modules/byte-string/resources/data_readers.clj rename to modules/db/test/data_readers.clj diff --git a/modules/interaction/Makefile b/modules/interaction/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/interaction/Makefile +++ b/modules/interaction/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/metrics/Makefile b/modules/metrics/Makefile index 196a53ceb..23d3127ff 100644 --- a/modules/metrics/Makefile +++ b/modules/metrics/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +build: + clojure -T:build compile + +test: build clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: build clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint build test test-coverage clean diff --git a/modules/metrics/build.clj b/modules/metrics/build.clj new file mode 100644 index 000000000..c5a0c72fb --- /dev/null +++ b/modules/metrics/build.clj @@ -0,0 +1,12 @@ +(ns build + (:refer-clojure :exclude [compile]) + (:require [clojure.tools.build.api :as b])) + + +(defn compile [_] + (b/compile-clj + {:basis (b/create-basis + {:project "deps.edn" + :compile-opts {:direct-linking true}}) + :class-dir "target/classes" + :ns-compile ['blaze.metrics.Collector]})) diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 114e6fc17..6c51fdf7c 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -1,15 +1,25 @@ -{:deps +{:paths ["src" "target/classes"] + + :deps {blaze/module-base {:local/root "../module-base"} - com.rpl/proxy-plus - {:mvn/version "0.0.8"} - io.prometheus/simpleclient_hotspot {:mvn/version "0.16.0"}} + :deps/prep-lib + {:alias :build + :fn compile + :ensure "target/classes"} + :aliases - {:test + {:build + {:deps + {io.github.clojure/tools.build + {:git/tag "v0.8.5" :git/sha "9c738da"}} + :ns-default build} + + :test {:extra-paths ["test"] :extra-deps @@ -29,4 +39,4 @@ {:mvn/version "1.2.4"}} :main-opts ["-m" "cloverage.coverage" "--codecov" "-p" "src" "-s" "test" - "-e" ".*spec$"]}}} + "-e" ".*spec$" -e "blaze.metrics.Collector"]}}} diff --git a/modules/metrics/src/blaze/metrics/Collector.clj b/modules/metrics/src/blaze/metrics/Collector.clj new file mode 100644 index 000000000..f082a0f86 --- /dev/null +++ b/modules/metrics/src/blaze/metrics/Collector.clj @@ -0,0 +1,18 @@ +(ns blaze.metrics.Collector + (:gen-class + :extends io.prometheus.client.Collector + :constructors {[Object] []} + :init init + :state fn + :main false)) + + +(set! *warn-on-reflection* true) + + +(defn -init [fn] + [[] fn]) + + +(defn -collect-void [this] + ((.-fn ^blaze.metrics.Collector this))) diff --git a/modules/metrics/src/blaze/metrics/core.clj b/modules/metrics/src/blaze/metrics/core.clj index 7a89bdff0..a77f1ec91 100644 --- a/modules/metrics/src/blaze/metrics/core.clj +++ b/modules/metrics/src/blaze/metrics/core.clj @@ -1,8 +1,7 @@ (ns blaze.metrics.core (:require [clojure.core.protocols :as p] - [clojure.datafy :as datafy] - [com.rpl.proxy-plus :refer [proxy+]]) + [clojure.datafy :as datafy]) (:import [io.prometheus.client Collector Collector$MetricFamilySamples Collector$MetricFamilySamples$Sample @@ -15,9 +14,7 @@ (defmacro collector [& body] - `(proxy+ [] - Collector - (~'collect [~'_] ~@body))) + `(blaze.metrics.Collector. (fn [] ~@body))) (defn collect diff --git a/modules/operation-measure-evaluate-measure/Makefile b/modules/operation-measure-evaluate-measure/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/operation-measure-evaluate-measure/Makefile +++ b/modules/operation-measure-evaluate-measure/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/page-store-cassandra/Makefile b/modules/page-store-cassandra/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/page-store-cassandra/Makefile +++ b/modules/page-store-cassandra/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/page-store/Makefile b/modules/page-store/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/page-store/Makefile +++ b/modules/page-store/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/rest-api/Makefile b/modules/rest-api/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/rest-api/Makefile +++ b/modules/rest-api/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/rest-util/Makefile b/modules/rest-util/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/rest-util/Makefile +++ b/modules/rest-util/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/rocksdb/Makefile b/modules/rocksdb/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/rocksdb/Makefile +++ b/modules/rocksdb/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/modules/thread-pool-executor-collector/Makefile b/modules/thread-pool-executor-collector/Makefile index 196a53ceb..8eb60f27a 100644 --- a/modules/thread-pool-executor-collector/Makefile +++ b/modules/thread-pool-executor-collector/Makefile @@ -1,13 +1,16 @@ lint: clj-kondo --lint src test deps.edn -test: +prep: + clojure -X:deps prep + +test: prep clojure -M:test:kaocha --profile :ci -test-coverage: +test-coverage: prep clojure -M:test:coverage clean: rm -rf .clj-kondo/.cache .cpcache target -.PHONY: lint test test-coverage clean +.PHONY: lint prep test test-coverage clean diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 1b3254d8f..000000000 --- a/pom.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - 4.0.0 - samply - blaze - 0.18.4 - blaze - - A FHIR Store with internal, fast CQL Evaluation Engine - https://github.com/samply/blaze - - - Apache License, Version 2.0 - http://www.apache.org/licenses/LICENSE-2.0 - - - - - - Alexander Kiel - - - - diff --git a/src/blaze/core.clj b/src/blaze/core.clj index c371b9064..000f90b5c 100644 --- a/src/blaze/core.clj +++ b/src/blaze/core.clj @@ -2,7 +2,8 @@ (:require [blaze.system :as system] [clojure.string :as str] - [taoensso.timbre :as log])) + [taoensso.timbre :as log]) + (:gen-class)) (defn- max-memory [] From 1eb3720d2a9ec9232041a11d4f118848802cf5db Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 12 Dec 2022 10:04:09 +0100 Subject: [PATCH 078/124] Rename blaze.metrics.Collector to Resolve Loading Issue At some unknown location, the namespace blaze.metrics.Collector was loaded in the lower-case form. So I renamed it to resolve this. --- modules/metrics/build.clj | 2 +- modules/metrics/deps.edn | 2 +- .../src/blaze/metrics/{Collector.clj => collector.clj} | 4 ++-- modules/metrics/src/blaze/metrics/core.clj | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) rename modules/metrics/src/blaze/metrics/{Collector.clj => collector.clj} (76%) diff --git a/modules/metrics/build.clj b/modules/metrics/build.clj index c5a0c72fb..2b91311a5 100644 --- a/modules/metrics/build.clj +++ b/modules/metrics/build.clj @@ -9,4 +9,4 @@ {:project "deps.edn" :compile-opts {:direct-linking true}}) :class-dir "target/classes" - :ns-compile ['blaze.metrics.Collector]})) + :ns-compile ['blaze.metrics.collector]})) diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 6c51fdf7c..9f36150be 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -39,4 +39,4 @@ {:mvn/version "1.2.4"}} :main-opts ["-m" "cloverage.coverage" "--codecov" "-p" "src" "-s" "test" - "-e" ".*spec$" -e "blaze.metrics.Collector"]}}} + "-e" ".*spec$" -e "blaze.metrics.collector"]}}} diff --git a/modules/metrics/src/blaze/metrics/Collector.clj b/modules/metrics/src/blaze/metrics/collector.clj similarity index 76% rename from modules/metrics/src/blaze/metrics/Collector.clj rename to modules/metrics/src/blaze/metrics/collector.clj index f082a0f86..3d506ef58 100644 --- a/modules/metrics/src/blaze/metrics/Collector.clj +++ b/modules/metrics/src/blaze/metrics/collector.clj @@ -1,4 +1,4 @@ -(ns blaze.metrics.Collector +(ns blaze.metrics.collector (:gen-class :extends io.prometheus.client.Collector :constructors {[Object] []} @@ -15,4 +15,4 @@ (defn -collect-void [this] - ((.-fn ^blaze.metrics.Collector this))) + ((.-fn ^blaze.metrics.collector this))) diff --git a/modules/metrics/src/blaze/metrics/core.clj b/modules/metrics/src/blaze/metrics/core.clj index a77f1ec91..89933f7b5 100644 --- a/modules/metrics/src/blaze/metrics/core.clj +++ b/modules/metrics/src/blaze/metrics/core.clj @@ -14,7 +14,7 @@ (defmacro collector [& body] - `(blaze.metrics.Collector. (fn [] ~@body))) + `(blaze.metrics.collector. (fn [] ~@body))) (defn collect From 043d427599384f887fb3fa2d61e19370b3506ade Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 1 Dec 2022 10:09:26 +0100 Subject: [PATCH 079/124] Add Documentation of using CQL with Blazectl --- .github/scripts/cql/q1.yml | 5 + .github/scripts/cql/q14.yml | 5 + .github/scripts/cql/q15.yml | 5 + .github/scripts/cql/q17.yml | 5 + .../scripts/cql/q19-stratifier-ageclass.csv | 11 + .../scripts/cql/q19-stratifier-ageclass.yml | 8 + .github/scripts/cql/q2.yml | 5 + .github/scripts/cql/q20-stratifier-city.csv | 68 ++++ .github/scripts/cql/q20-stratifier-city.yml | 8 + .../cql/q21-stratifier-city-of-only-women.csv | 41 +++ .../cql/q21-stratifier-city-of-only-women.yml | 8 + .github/scripts/cql/q26-stratifier-bmi.csv | 23 ++ .github/scripts/cql/q26-stratifier-bmi.yml | 8 + .../cql/q27-stratifier-calculated-bmi.csv | 74 +++++ .../cql/q27-stratifier-calculated-bmi.yml | 8 + .../cql/q32-stratifier-underweight.csv | 1 + .../cql/q32-stratifier-underweight.yml | 8 + .github/scripts/cql/q37-overlaps.yml | 5 + .github/scripts/cql/q4.yml | 5 + .github/scripts/cql/q46-between-date.yml | 5 + .github/scripts/cql/q7.yml | 5 + .../evaluate-measure-blazectl-stratifier.sh | 26 ++ .github/scripts/evaluate-measure-blazectl.sh | 14 + .../scripts/evaluate-measure-subject-list.sh | 4 +- .github/scripts/evaluate-measure.sh | 6 +- .github/scripts/install-blazectl.sh | 2 +- .github/workflows/build.yml | 170 ++++++++-- docs/cql-queries.md | 5 + docs/cql-queries/blazectl.md | 296 ++++++++++++++++++ docs/cql-queries/command-line.md | 7 +- docs/cql-queries/gender-male.cql | 2 +- docs/cql-queries/gender-male.yml | 5 + docs/cql-queries/stratifier-birth-year.cql | 11 + docs/cql-queries/stratifier-birth-year.jq | 3 + docs/cql-queries/stratifier-birth-year.yml | 8 + docs/cql-queries/stratifier-body-weight.cql | 14 + docs/cql-queries/stratifier-body-weight.jq | 4 + docs/cql-queries/stratifier-body-weight.yml | 8 + .../cql-queries/stratifier-condition-code.cql | 11 + docs/cql-queries/stratifier-condition-code.jq | 4 + .../cql-queries/stratifier-condition-code.yml | 8 + 41 files changed, 875 insertions(+), 44 deletions(-) create mode 100644 .github/scripts/cql/q1.yml create mode 100644 .github/scripts/cql/q14.yml create mode 100644 .github/scripts/cql/q15.yml create mode 100644 .github/scripts/cql/q17.yml create mode 100644 .github/scripts/cql/q19-stratifier-ageclass.csv create mode 100644 .github/scripts/cql/q19-stratifier-ageclass.yml create mode 100644 .github/scripts/cql/q2.yml create mode 100644 .github/scripts/cql/q20-stratifier-city.csv create mode 100644 .github/scripts/cql/q20-stratifier-city.yml create mode 100644 .github/scripts/cql/q21-stratifier-city-of-only-women.csv create mode 100644 .github/scripts/cql/q21-stratifier-city-of-only-women.yml create mode 100644 .github/scripts/cql/q26-stratifier-bmi.csv create mode 100644 .github/scripts/cql/q26-stratifier-bmi.yml create mode 100644 .github/scripts/cql/q27-stratifier-calculated-bmi.csv create mode 100644 .github/scripts/cql/q27-stratifier-calculated-bmi.yml create mode 100644 .github/scripts/cql/q32-stratifier-underweight.csv create mode 100644 .github/scripts/cql/q32-stratifier-underweight.yml create mode 100644 .github/scripts/cql/q37-overlaps.yml create mode 100644 .github/scripts/cql/q4.yml create mode 100644 .github/scripts/cql/q46-between-date.yml create mode 100644 .github/scripts/cql/q7.yml create mode 100755 .github/scripts/evaluate-measure-blazectl-stratifier.sh create mode 100755 .github/scripts/evaluate-measure-blazectl.sh create mode 100644 docs/cql-queries/blazectl.md create mode 100644 docs/cql-queries/gender-male.yml create mode 100644 docs/cql-queries/stratifier-birth-year.cql create mode 100644 docs/cql-queries/stratifier-birth-year.jq create mode 100644 docs/cql-queries/stratifier-birth-year.yml create mode 100644 docs/cql-queries/stratifier-body-weight.cql create mode 100644 docs/cql-queries/stratifier-body-weight.jq create mode 100644 docs/cql-queries/stratifier-body-weight.yml create mode 100644 docs/cql-queries/stratifier-condition-code.cql create mode 100644 docs/cql-queries/stratifier-condition-code.jq create mode 100644 docs/cql-queries/stratifier-condition-code.yml diff --git a/.github/scripts/cql/q1.yml b/.github/scripts/cql/q1.yml new file mode 100644 index 000000000..5090e655b --- /dev/null +++ b/.github/scripts/cql/q1.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q14.yml b/.github/scripts/cql/q14.yml new file mode 100644 index 000000000..a020b2cc2 --- /dev/null +++ b/.github/scripts/cql/q14.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q15.yml b/.github/scripts/cql/q15.yml new file mode 100644 index 000000000..091142b7f --- /dev/null +++ b/.github/scripts/cql/q15.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q15.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q17.yml b/.github/scripts/cql/q17.yml new file mode 100644 index 000000000..689103115 --- /dev/null +++ b/.github/scripts/cql/q17.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q19-stratifier-ageclass.csv b/.github/scripts/cql/q19-stratifier-ageclass.csv new file mode 100644 index 000000000..bb0b0f3d0 --- /dev/null +++ b/.github/scripts/cql/q19-stratifier-ageclass.csv @@ -0,0 +1,11 @@ +"0",7 +"10",15 +"100",3 +"20",13 +"30",10 +"40",13 +"50",19 +"60",15 +"70",16 +"80",2 +"90",7 diff --git a/.github/scripts/cql/q19-stratifier-ageclass.yml b/.github/scripts/cql/q19-stratifier-ageclass.yml new file mode 100644 index 000000000..04a63a48b --- /dev/null +++ b/.github/scripts/cql/q19-stratifier-ageclass.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: ageclass + expression: AgeClass diff --git a/.github/scripts/cql/q2.yml b/.github/scripts/cql/q2.yml new file mode 100644 index 000000000..5680bbd40 --- /dev/null +++ b/.github/scripts/cql/q2.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q20-stratifier-city.csv b/.github/scripts/cql/q20-stratifier-city.csv new file mode 100644 index 000000000..20e12f7b9 --- /dev/null +++ b/.github/scripts/cql/q20-stratifier-city.csv @@ -0,0 +1,68 @@ +"Abington",1 +"Acton",1 +"Acushnet",1 +"Adams",1 +"Amherst",1 +"Arlington",1 +"Attleboro",2 +"Auburn",1 +"Barnstable",2 +"Billerica",1 +"Boston",8 +"Boxborough",1 +"Brimfield",1 +"Brockton",1 +"Cambridge",1 +"Charlton",1 +"Chelsea",2 +"Concord",1 +"Dracut",2 +"East Douglas",7 +"East Sandwich",1 +"Easton",3 +"Everett",1 +"Fall River",1 +"Foxborough",1 +"Framingham",1 +"Grafton",1 +"Greenfield",1 +"Hampden",1 +"Harvard",1 +"Haverhill",1 +"Hingham",1 +"Hudson",1 +"Lancaster",1 +"Lawrence",1 +"Lexington",3 +"Ludlow",2 +"Marlborough",3 +"Medford",2 +"Methuen",1 +"Milford",1 +"Nantucket",1 +"New Bedford",1 +"Newton",4 +"North Andover",1 +"Norwood",3 +"Peabody",1 +"Plymouth",3 +"Pocasset",1 +"Quincy",1 +"Rehoboth",3 +"Sandwich",3 +"Shrewsbury",1 +"Somerville",3 +"Springfield",3 +"Stoughton",1 +"Swampscott",1 +"Taunton",3 +"Topsfield",1 +"Upton",1 +"Walpole",1 +"Waltham",2 +"Watertown",1 +"Weymouth",1 +"Williamstown",1 +"Winchendon",1 +"Winchester",1 +"Worcester",10 diff --git a/.github/scripts/cql/q20-stratifier-city.yml b/.github/scripts/cql/q20-stratifier-city.yml new file mode 100644 index 000000000..df622e9d1 --- /dev/null +++ b/.github/scripts/cql/q20-stratifier-city.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q20-stratifier-city.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: city + expression: City diff --git a/.github/scripts/cql/q21-stratifier-city-of-only-women.csv b/.github/scripts/cql/q21-stratifier-city-of-only-women.csv new file mode 100644 index 000000000..eb642f711 --- /dev/null +++ b/.github/scripts/cql/q21-stratifier-city-of-only-women.csv @@ -0,0 +1,41 @@ +"Acton",1 +"Acushnet",1 +"Adams",1 +"Amherst",1 +"Auburn",1 +"Barnstable",1 +"Billerica",1 +"Boston",5 +"Boxborough",1 +"Chelsea",1 +"Concord",1 +"East Douglas",7 +"Easton",3 +"Everett",1 +"Fall River",1 +"Foxborough",1 +"Framingham",1 +"Greenfield",1 +"Hampden",1 +"Harvard",1 +"Haverhill",1 +"Hingham",1 +"Hudson",1 +"Lancaster",1 +"Marlborough",1 +"New Bedford",1 +"Newton",1 +"Norwood",1 +"Peabody",1 +"Plymouth",2 +"Pocasset",1 +"Quincy",1 +"Rehoboth",3 +"Springfield",3 +"Stoughton",1 +"Taunton",2 +"Upton",1 +"Watertown",1 +"Winchendon",1 +"Winchester",1 +"Worcester",6 diff --git a/.github/scripts/cql/q21-stratifier-city-of-only-women.yml b/.github/scripts/cql/q21-stratifier-city-of-only-women.yml new file mode 100644 index 000000000..270a8d532 --- /dev/null +++ b/.github/scripts/cql/q21-stratifier-city-of-only-women.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q21-stratifier-city-of-only-women.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: city + expression: City diff --git a/.github/scripts/cql/q26-stratifier-bmi.csv b/.github/scripts/cql/q26-stratifier-bmi.csv new file mode 100644 index 000000000..bddbbcc68 --- /dev/null +++ b/.github/scripts/cql/q26-stratifier-bmi.csv @@ -0,0 +1,23 @@ +"15",4 +"16",5 +"17",4 +"18",2 +"19",2 +"20",3 +"21",4 +"22",5 +"23",3 +"24",3 +"25",3 +"26",3 +"27",11 +"28",22 +"29",26 +"30",8 +"31",5 +"32",1 +"35",1 +"39",2 +"40",1 +"41",1 +"null",1 diff --git a/.github/scripts/cql/q26-stratifier-bmi.yml b/.github/scripts/cql/q26-stratifier-bmi.yml new file mode 100644 index 000000000..562c6d242 --- /dev/null +++ b/.github/scripts/cql/q26-stratifier-bmi.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q26-stratifier-bmi.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: bmi + expression: Bmi diff --git a/.github/scripts/cql/q27-stratifier-calculated-bmi.csv b/.github/scripts/cql/q27-stratifier-calculated-bmi.csv new file mode 100644 index 000000000..78270f7cd --- /dev/null +++ b/.github/scripts/cql/q27-stratifier-calculated-bmi.csv @@ -0,0 +1,74 @@ +"15.0",1 +"15.6",1 +"15.7",1 +"16.1",1 +"16.2",1 +"16.7",1 +"16.9",2 +"17.0",1 +"17.7",1 +"17.8",1 +"17.9",1 +"18.3",1 +"18.8",1 +"19.3",1 +"19.4",1 +"19.8",1 +"19.9",1 +"21.2",2 +"21.4",1 +"21.9",1 +"22.6",1 +"22.7",1 +"23.1",1 +"23.2",2 +"23.8",1 +"24.1",1 +"24.3",1 +"24.7",1 +"24.9",1 +"25.4",2 +"25.8",1 +"26.2",1 +"26.3",1 +"26.4",1 +"26.5",1 +"27.2",2 +"27.3",2 +"27.4",6 +"27.5",4 +"27.6",3 +"27.7",2 +"27.8",8 +"27.9",3 +"28.0",2 +"28.1",1 +"28.2",3 +"28.4",1 +"28.5",1 +"28.6",1 +"28.7",1 +"28.8",2 +"29.0",2 +"29.1",1 +"29.7",2 +"29.8",1 +"29.9",1 +"30.0",1 +"30.1",2 +"30.2",5 +"30.3",5 +"30.4",3 +"30.5",4 +"30.6",1 +"30.8",1 +"30.9",1 +"31.5",1 +"31.7",1 +"34.1",1 +"34.2",1 +"35.8",1 +"38.5",1 +"38.6",1 +"40.1",1 +"41.4",1 diff --git a/.github/scripts/cql/q27-stratifier-calculated-bmi.yml b/.github/scripts/cql/q27-stratifier-calculated-bmi.yml new file mode 100644 index 000000000..23d5823a8 --- /dev/null +++ b/.github/scripts/cql/q27-stratifier-calculated-bmi.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q27-stratifier-calculated-bmi.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: bmi + expression: Bmi diff --git a/.github/scripts/cql/q32-stratifier-underweight.csv b/.github/scripts/cql/q32-stratifier-underweight.csv new file mode 100644 index 000000000..621fc16f5 --- /dev/null +++ b/.github/scripts/cql/q32-stratifier-underweight.csv @@ -0,0 +1 @@ +"false",120 diff --git a/.github/scripts/cql/q32-stratifier-underweight.yml b/.github/scripts/cql/q32-stratifier-underweight.yml new file mode 100644 index 000000000..e83e2f4e6 --- /dev/null +++ b/.github/scripts/cql/q32-stratifier-underweight.yml @@ -0,0 +1,8 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q32-stratifier-underweight.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: underweight + expression: Underweight diff --git a/.github/scripts/cql/q37-overlaps.yml b/.github/scripts/cql/q37-overlaps.yml new file mode 100644 index 000000000..00c043174 --- /dev/null +++ b/.github/scripts/cql/q37-overlaps.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q4.yml b/.github/scripts/cql/q4.yml new file mode 100644 index 000000000..2a943d46d --- /dev/null +++ b/.github/scripts/cql/q4.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q46-between-date.yml b/.github/scripts/cql/q46-between-date.yml new file mode 100644 index 000000000..6e6bcd29a --- /dev/null +++ b/.github/scripts/cql/q46-between-date.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q46-between-date.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/cql/q7.yml b/.github/scripts/cql/q7.yml new file mode 100644 index 000000000..c34ce1b45 --- /dev/null +++ b/.github/scripts/cql/q7.yml @@ -0,0 +1,5 @@ +library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/.github/scripts/evaluate-measure-blazectl-stratifier.sh b/.github/scripts/evaluate-measure-blazectl-stratifier.sh new file mode 100755 index 000000000..c388320d1 --- /dev/null +++ b/.github/scripts/evaluate-measure-blazectl-stratifier.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash + +BASE="http://localhost:8080/fhir" +NAME="$1" +EXPECTED_COUNT="$2" + +REPORT=$(blazectl --server "$BASE" evaluate-measure ".github/scripts/cql/$NAME.yml" 2> /dev/null) +COUNT=$(echo "$REPORT" | jq '.group[0].population[0].count') + +if [ "$COUNT" = "$EXPECTED_COUNT" ]; then + echo "Success: count ($COUNT) equals the expected count" +else + echo "Fail: count ($COUNT) != $EXPECTED_COUNT" + exit 1 +fi + +STRATIFIER_DATA=$(echo "$REPORT" | jq -r '.group[0].stratifier[0].stratum[] | [.value.text, .population[0].count] | @csv') +EXPECTED_STRATIFIER_DATA=$(cat ".github/scripts/cql/$NAME.csv") + +if [ "$STRATIFIER_DATA" = "$EXPECTED_STRATIFIER_DATA" ]; then + echo "Success: stratifier data equals the expected stratifier data" +else + echo "Fail: stratifier data differs" + echo "$STRATIFIER_DATA" + exit 1 +fi diff --git a/.github/scripts/evaluate-measure-blazectl.sh b/.github/scripts/evaluate-measure-blazectl.sh new file mode 100755 index 000000000..96ea962e1 --- /dev/null +++ b/.github/scripts/evaluate-measure-blazectl.sh @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +BASE="http://localhost:8080/fhir" +NAME="$1" +EXPECTED_COUNT="$2" + +COUNT=$(blazectl --server "$BASE" evaluate-measure ".github/scripts/cql/$NAME.yml" 2> /dev/null | jq '.group[0].population[0].count') + +if [ "$COUNT" = "$EXPECTED_COUNT" ]; then + echo "Success: count ($COUNT) equals the expected count" +else + echo "Fail: count ($COUNT) != $EXPECTED_COUNT" + exit 1 +fi diff --git a/.github/scripts/evaluate-measure-subject-list.sh b/.github/scripts/evaluate-measure-subject-list.sh index a346966b6..e5583c160 100755 --- a/.github/scripts/evaluate-measure-subject-list.sh +++ b/.github/scripts/evaluate-measure-subject-list.sh @@ -107,10 +107,10 @@ fetch-patients() { } BASE="http://localhost:8080/fhir" -FILE=$1 +NAME=$1 EXPECTED_COUNT=$2 -DATA=$(base64 "$FILE" | tr -d '\n') +DATA=$(base64 "modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/$NAME.cql" | tr -d '\n') LIBRARY_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') MEASURE_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') diff --git a/.github/scripts/evaluate-measure.sh b/.github/scripts/evaluate-measure.sh index 60ac5ece0..5020a851a 100755 --- a/.github/scripts/evaluate-measure.sh +++ b/.github/scripts/evaluate-measure.sh @@ -81,10 +81,10 @@ evaluate-measure() { } BASE="http://localhost:8080/fhir" -FILE=$1 -EXPECTED_COUNT=$2 +NAME="$1" +EXPECTED_COUNT="$2" -DATA=$(base64 "$FILE" | tr -d '\n') +DATA=$(base64 "modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/$NAME.cql" | tr -d '\n') LIBRARY_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') MEASURE_URI=$(uuidgen | tr '[:upper:]' '[:lower:]') diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh index a9258e04b..8adefb615 100755 --- a/.github/scripts/install-blazectl.sh +++ b/.github/scripts/install-blazectl.sh @@ -1,6 +1,6 @@ #!/bin/bash -e -VERSION=0.10.1 +VERSION=0.12.0 curl -sLO https://github.com/samply/blazectl/releases/download/v${VERSION}/blazectl-${VERSION}-linux-amd64.tar.gz tar xzf blazectl-${VERSION}-linux-amd64.tar.gz diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5fc87391..06596b223 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -397,58 +397,109 @@ jobs: run: .github/scripts/search-compartment.sh - name: Evaluate CQL Query 1 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 + run: .github/scripts/evaluate-measure.sh q1 56 + + - name: Evaluate CQL Query 1 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q1 56 - name: Evaluate CQL Query 1 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 + run: .github/scripts/evaluate-measure-subject-list.sh q1 56 - name: Evaluate CQL Query 1 on Individual Patients run: .github/scripts/evaluate-patient-q1-measure.sh - name: Evaluate CQL Query 2 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 + run: .github/scripts/evaluate-measure.sh q2 42 + + - name: Evaluate CQL Query 2 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q2 42 - name: Evaluate CQL Query 2 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 + run: .github/scripts/evaluate-measure-subject-list.sh q2 42 - name: Evaluate CQL Query 4 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 + run: .github/scripts/evaluate-measure.sh q4 0 + + - name: Evaluate CQL Query 4 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q4 0 - name: Evaluate CQL Query 4 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 + run: .github/scripts/evaluate-measure-subject-list.sh q4 0 - name: Evaluate CQL Query 7 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 + run: .github/scripts/evaluate-measure.sh q7 81 + + - name: Evaluate CQL Query 7 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q7 81 - name: Evaluate CQL Query 7 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 + run: .github/scripts/evaluate-measure-subject-list.sh q7 81 - name: Evaluate CQL Query 14 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 + run: .github/scripts/evaluate-measure.sh q14 96 + + - name: Evaluate CQL Query 14 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q14 96 - name: Evaluate CQL Query 14 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 + run: .github/scripts/evaluate-measure-subject-list.sh q14 96 + + - name: Evaluate CQL Query 15 + run: .github/scripts/evaluate-measure.sh q15 30 + + - name: Evaluate CQL Query 15 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q15 30 + + - name: Evaluate CQL Query 15 - Subject List + run: .github/scripts/evaluate-measure-subject-list.sh q15 30 - name: Evaluate CQL Query 17 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 + run: .github/scripts/evaluate-measure.sh q17 120 + + - name: Evaluate CQL Query 17 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q17 120 - name: Evaluate CQL Query 17 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 + run: .github/scripts/evaluate-measure-subject-list.sh q17 120 + + - name: Evaluate CQL Query 19 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q19-stratifier-ageclass 120 + + - name: Evaluate CQL Query 20 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q20-stratifier-city 120 + + - name: Evaluate CQL Query 21 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q21-stratifier-city-of-only-women 64 + + - name: Evaluate CQL Query 26 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q26-stratifier-bmi 120 + + - name: Evaluate CQL Query 27 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q27-stratifier-calculated-bmi 120 + + - name: Evaluate CQL Query 32 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q32-stratifier-underweight 120 - name: Evaluate CQL Query 36 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 + run: .github/scripts/evaluate-measure.sh q36-parameter 86 - name: Evaluate CQL Query 36 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 + run: .github/scripts/evaluate-measure-subject-list.sh q36-parameter 86 - name: Evaluate CQL Query 34 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + run: .github/scripts/evaluate-measure.sh q37-overlaps 24 + + - name: Evaluate CQL Query 34 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q37-overlaps 24 - name: Evaluate CQL Query 34 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + run: .github/scripts/evaluate-measure-subject-list.sh q37-overlaps 24 - name: Evaluate CQL Query 46 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure//q46-between-date.cql 19 + run: .github/scripts/evaluate-measure.sh q46-between-date 19 + + - name: Evaluate CQL Query 46 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q46-between-date 19 - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https @@ -901,58 +952,109 @@ jobs: run: .github/scripts/search-compartment.sh - name: Evaluate CQL Query 1 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 + run: .github/scripts/evaluate-measure.sh q1 56 + + - name: Evaluate CQL Query 1 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q1 56 - name: Evaluate CQL Query 1 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q1.cql 56 + run: .github/scripts/evaluate-measure-subject-list.sh q1 56 - name: Evaluate CQL Query 1 on Individual Patients run: .github/scripts/evaluate-patient-q1-measure.sh - name: Evaluate CQL Query 2 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 + run: .github/scripts/evaluate-measure.sh q2 42 + + - name: Evaluate CQL Query 2 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q2 42 - name: Evaluate CQL Query 2 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q2.cql 42 + run: .github/scripts/evaluate-measure-subject-list.sh q2 42 - name: Evaluate CQL Query 4 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 + run: .github/scripts/evaluate-measure.sh q4 0 + + - name: Evaluate CQL Query 4 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q4 0 - name: Evaluate CQL Query 4 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q4.cql 0 + run: .github/scripts/evaluate-measure-subject-list.sh q4 0 - name: Evaluate CQL Query 7 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 + run: .github/scripts/evaluate-measure.sh q7 81 + + - name: Evaluate CQL Query 7 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q7 81 - name: Evaluate CQL Query 7 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q7.cql 81 + run: .github/scripts/evaluate-measure-subject-list.sh q7 81 - name: Evaluate CQL Query 14 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 + run: .github/scripts/evaluate-measure.sh q14 96 + + - name: Evaluate CQL Query 14 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q14 96 - name: Evaluate CQL Query 14 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q14.cql 96 + run: .github/scripts/evaluate-measure-subject-list.sh q14 96 + + - name: Evaluate CQL Query 15 + run: .github/scripts/evaluate-measure.sh q15 30 + + - name: Evaluate CQL Query 15 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q15 30 + + - name: Evaluate CQL Query 15 - Subject List + run: .github/scripts/evaluate-measure-subject-list.sh q15 30 - name: Evaluate CQL Query 17 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 + run: .github/scripts/evaluate-measure.sh q17 120 + + - name: Evaluate CQL Query 17 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q17 120 - name: Evaluate CQL Query 17 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q17.cql 120 + run: .github/scripts/evaluate-measure-subject-list.sh q17 120 + + - name: Evaluate CQL Query 19 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q19-stratifier-ageclass 120 + + - name: Evaluate CQL Query 20 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q20-stratifier-city 120 + + - name: Evaluate CQL Query 21 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q21-stratifier-city-of-only-women 64 + + - name: Evaluate CQL Query 26 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q26-stratifier-bmi 120 + + - name: Evaluate CQL Query 27 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q27-stratifier-calculated-bmi 120 + + - name: Evaluate CQL Query 32 using Blazectl + run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q32-stratifier-underweight 120 - name: Evaluate CQL Query 36 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 + run: .github/scripts/evaluate-measure.sh q36-parameter 86 - name: Evaluate CQL Query 36 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q36-parameter.cql 86 + run: .github/scripts/evaluate-measure-subject-list.sh q36-parameter 86 - name: Evaluate CQL Query 34 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + run: .github/scripts/evaluate-measure.sh q37-overlaps 24 + + - name: Evaluate CQL Query 34 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q37-overlaps 24 - name: Evaluate CQL Query 34 - Subject List - run: .github/scripts/evaluate-measure-subject-list.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q37-overlaps.cql 24 + run: .github/scripts/evaluate-measure-subject-list.sh q37-overlaps 24 - name: Evaluate CQL Query 46 - run: .github/scripts/evaluate-measure.sh modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure//q46-between-date.cql 19 + run: .github/scripts/evaluate-measure.sh q46-between-date 19 + + - name: Evaluate CQL Query 46 using Blazectl + run: .github/scripts/evaluate-measure-blazectl.sh q46-between-date 19 - name: Forwarded Header HTTPS run: .github/scripts/forwarded-header.sh https diff --git a/docs/cql-queries.md b/docs/cql-queries.md index b3bacef39..cdfe68408 100644 --- a/docs/cql-queries.md +++ b/docs/cql-queries.md @@ -1,6 +1,11 @@ # CQL Queries ## Command Line +### Using Blazectl + +Blazectl can evaluate CQL queries, if you like to use it, please look into [this section](cql-queries/blazectl.md). + +### Shell Script If you like to use the command line, please look into [this section](cql-queries/command-line.md). diff --git a/docs/cql-queries/blazectl.md b/docs/cql-queries/blazectl.md new file mode 100644 index 000000000..fa10f9f17 --- /dev/null +++ b/docs/cql-queries/blazectl.md @@ -0,0 +1,296 @@ +# Evaluate a CQL Measure using the Command Line and Blazectl + +This section describes how to evaluate a CQL measure using the command line only. + +## Checkout the Project + +This section assumes, that you have checked out the project and open a command line in its directory. + +```sh +git clone https://github.com/samply/blaze.git +cd blaze +``` + +## Install Blazectl + +[Blazectl](https://github.com/samply/blazectl) is a command line utility that can, among other things, evaluate a CQL measure against a Blaze server available via HTTP. You'll find the installation instructions for your platform in its [README](https://github.com/samply/blazectl). + +## Run Blaze + +If you don't already have Blaze running, you can read about how to do it in [Deployment](../deployment/README.md). If you have Docker available just run: + +```sh +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +``` + +## Import some data + +If you just started Blaze without any data, you can import some using the [blazectl](https://github.com/samply/blazectl) command: + +```sh +blazectl upload --server http://localhost:8080/fhir .github/test-data/synthea +``` + +## Evaluate a Simple Measure Counting all Male Patients + +```sh +blazectl evaluate-measure docs/cql-queries/gender-male.yml --server http://localhost:8080/fhir +``` + +Blazectl will output a [MeasureReport](http://www.hl7.org/fhir/measurereport.html) resource. The important parts are: + +```json +{ + "resourceType": "MeasureReport", + "group": [ + { + "population": [ + { + "code": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/measure-population", + "code": "initial-population" + } + ] + }, + "count": 56 + } + ] + } + ] +} +``` + +You can use [jq](https://stedolan.github.io/jq) to extract the count from the MeasureReport: + +```sh +blazectl evaluate-measure docs/cql-queries/gender-male.yml --server http://localhost:8080/fhir | jq '.group[0].population[0].count' +``` + +Now the output should be: + +```text +Evaluate measure with canonical URL urn:uuid:73a6023d-5a91-4822-9e36-48ebc2a8ed09 on http://localhost:8080/fhir ... + +56 +``` + +### The Measure YAML + +Because evaluating a measure requires one to create a [Measure](http://www.hl7.org/fhir/measure.html) and a [Library](http://www.hl7.org/fhir/library.html) resource on Blaze and execute the [$evaluate-measure](https://www.hl7.org/fhir/operation-measure-evaluate-measure.html) operation, Blazectl takes a simplified Measure resource in YAML format. It looks like this: + +```yaml +library: docs/cql-queries/gender-male.cql +group: +- type: Patient + population: + - expression: InInitialPopulation +``` + +* you reference the CQL library file under the `library` key +* you can specify several groups were you can define populations based on a type. Currently only `Patient` is possible +* under `population` you specify the name of a CQL expression which has to be present in the CQL library file. Here the expression is called `InInitialPopulation`. + +### The CQL Library File + +The CQL library file looks like this: + +```text +library "gender-male" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + Patient.gender = 'male' +``` + +You can read more about CQL in the [Author's Guide](https://cql.hl7.org/02-authorsguide.html) and in the [CQL Reference](https://cql.hl7.org/09-b-cqlreference.html). The important bit here is the expression definition: + +```text +define InInitialPopulation: + Patient.gender = 'male' +``` + +In it, the expression `Patient.gender = 'male'` is given the name `InInitialPopulation` that can be used in the Measure YAML. + +## Evaluate a Measure Outputting the Distribution of all Patients Birth Years + +The goal is to write a Measure that will output the distribution of all patients birth years including a conversation into the CSV format for easy consumption of analysis tools. + +First try the command: + +```sh +blazectl evaluate-measure docs/cql-queries/stratifier-birth-year.yml --server http://localhost:8080/fhir | jq -rf docs/cql-queries/stratifier-birth-year.jq +``` + +The (shortened) output should be: + +```text +Evaluate measure with canonical URL urn:uuid:d1826406-431d-4993-ace0-6e5e96ee1b48 on http://localhost:8080/fhir ... + +"year","count" +"1919",3 +"1929",7 +"1939",1 +"1942",1 +"1943",2 +"1944",1 +"1945",2 +"1946",5 +"1947",1 +"1948",1 +``` + +Now lets look at the three parts, the Measure YAML, the CQL library file and the jq file: + +### The Measure YAML + +```yaml +library: docs/cql-queries/stratifier-birth-year.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: birth-year + expression: BirthYear +``` + +The first part of the Measure YAML looks exactly like the one above. The new part is the `stratifier`. Stratifiers group members of populations according to the specified expression. Here the population consists of patients and the expression is called `BirthYear`. So that stratifier will group patients by their birth years. + +### The CQL Library File + +The CQL library file looks like this: + +```text +library "stratifier-birth-year" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + true + +define BirthYear: + year from Patient.birthDate +``` + +Here the expression `InInitialPopulation` is defined as `true` in order to include all patients. The expression called `BirthYear` that is used as stratifier will take the birth date from the patient and return the year component of it. + +### The jq File + +The `jq` file doing the CSV conversation looks like this: + +```text +["year", "count"], +(.group[0].stratifier[0].stratum[] | [.value.text, .population[0].count]) +| @csv +``` + +Here `["year", "count"]` represents the CSV header and `(.group[0].stratifier[0].stratum[] | [.value.text, .population[0].count])` extracts the value and the count out of the strata of the MeasureReport. The syntax of `jq` is documented in its [manual](https://stedolan.github.io/jq/manual). + +## Evaluate a Measure Outputting the Distribution of all Condition Codes + +The goal is to write a Measure that will output the distribution of all condition codes including a conversation into the CSV format for easy consumption of analysis tools. + +First try the command: + +```sh +blazectl evaluate-measure docs/cql-queries/stratifier-condition-code.yml --server http://localhost:8080/fhir | jq -rf docs/cql-queries/stratifier-condition-code.jq +``` + +The (shortened) output should be: + +```text +Evaluate measure with canonical URL urn:uuid:4f8176a7-d37a-486f-9f66-5e3849e7013f on http://localhost:8080/fhir ... + +"system","code","display","count" +"http://snomed.info/sct","241929008","Acute allergic reaction",3 +"http://snomed.info/sct","75498004","Acute bacterial sinusitis (disorder)",8 +"http://snomed.info/sct","10509002","Acute bronchitis (disorder)",63 +"http://snomed.info/sct","132281000119108","Acute deep venous thrombosis (disorder)",2 +"http://snomed.info/sct","706870000","Acute pulmonary embolism (disorder)",9 +"http://snomed.info/sct","67782005","Acute respiratory distress syndrome (disorder)",3 +"http://snomed.info/sct","65710008","Acute respiratory failure (disorder)",14 +"http://snomed.info/sct","195662009","Acute viral pharyngitis (disorder)",69 +"http://snomed.info/sct","7200002","Alcoholism",1 +``` + +Now lets look at the three parts, the Measure YAML, the CQL library file and the jq file: + +### The Measure YAML + +```yaml +library: docs/cql-queries/stratifier-condition-code.cql +group: +- type: Condition + population: + - expression: InInitialPopulation + stratifier: + - code: code + expression: Code +``` + +The key difference to the former Measure YAML files is the group type of `Condition`. That type defines all populations of this group to consist of Condition resources instead of Patient resources. This also means that the population expressions defined in this group have to return Condition resources instead of a boolean value. We will see that in a moment. The stratifier looks the same as in former files, but its expression `Code` will not operate on Condition resources and not Patients. + +### The CQL Library File + +The CQL library file looks like this: + +```text +library "stratifier-condition-code" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + [Condition] + +define function Code(condition FHIR.Condition): + condition.code +``` + +Here we have our `InInitialPopulation` expression defined as `[Condition]`. The expression `[Condition]` retrieves all Condition resources of the current selected patient. Doing so will return the required type of Condition resources from the population expression, we discussed above. If you like to constrain the patients from which Condition resources are returned, you have to do it in the `InInitialPopulation` expression. + +Next we define a function called `Code` what will extract the code from a Condition resource. Here the expression `condition.code` is a [FHIRPath](http://hl7.org/fhirpath/) expression as CQL is a superset of FHIRPath. + +### The jq File + +The `jq` file doing the CSV conversation looks like this: + +```text +["system", "code", "display", "count"], +(.group[0].stratifier[0].stratum[] + | [.value.coding[0].system, .value.coding[0].code, .value.coding[0].display, .population[0].count]) +| @csv +``` + +Because we return a `CodeableConcept` from our stratifier expression `Code`, the stratum values will contain that `CodeableConcept`s directly. In the `jq` script, we extract the `system`, `code` and `display` parts of the first Coding using the expression `.value.coding[0].system` and others. If the Condition resources use more than one Coding, its easy to add columns with the later Codings. In the Synthea dataset that's not the case. + +## Evaluate a Measure Outputting the Distribution of all Body Weights + +```sh +blazectl evaluate-measure docs/cql-queries/stratifier-body-weight.yml --server http://localhost:8080/fhir | jq -rf docs/cql-queries/stratifier-body-weight.jq +``` + +The (shortened) output should be: + +```text +Evaluate measure with canonical URL urn:uuid:dbb406a8-e72e-47a2-8ce7-c970bb964a9a on http://localhost:8080/fhir ... + +"body-weight-value","body-weight-unit","count" +10.1,"kg",3 +10.2,"kg",3 +10.4,"kg",4 +10.7,"kg",1 +10.9,"kg",2 +100,"kg",11 +100.2,"kg",2 +100.5,"kg",1 +100.7,"kg",9 +``` diff --git a/docs/cql-queries/command-line.md b/docs/cql-queries/command-line.md index 02f1a5de6..2c0de785d 100644 --- a/docs/cql-queries/command-line.md +++ b/docs/cql-queries/command-line.md @@ -1,13 +1,14 @@ -# Evaluate a CQL Query using the Command Line +# Evaluate a CQL Measure using the Command Line -This section describes how to evaluate a CQL query using the command line only. +This section describes how to evaluate a CQL measure using the command line only. ## Checkout the Project -This section assumes, that you have checked out the project and open a command line inside it. +This section assumes, that you have checked out the project and open a command line in its directory. ```sh git clone https://github.com/samply/blaze.git +cd blaze ``` ## Run Blaze diff --git a/docs/cql-queries/gender-male.cql b/docs/cql-queries/gender-male.cql index 146b3a14d..89fffb8d4 100644 --- a/docs/cql-queries/gender-male.cql +++ b/docs/cql-queries/gender-male.cql @@ -1,4 +1,4 @@ -library Retrieve +library "gender-male" using FHIR version '4.0.0' include FHIRHelpers version '4.0.0' diff --git a/docs/cql-queries/gender-male.yml b/docs/cql-queries/gender-male.yml new file mode 100644 index 000000000..ff4bb9e22 --- /dev/null +++ b/docs/cql-queries/gender-male.yml @@ -0,0 +1,5 @@ +library: docs/cql-queries/gender-male.cql +group: +- type: Patient + population: + - expression: InInitialPopulation diff --git a/docs/cql-queries/stratifier-birth-year.cql b/docs/cql-queries/stratifier-birth-year.cql new file mode 100644 index 000000000..3fd7c4d23 --- /dev/null +++ b/docs/cql-queries/stratifier-birth-year.cql @@ -0,0 +1,11 @@ +library "stratifier-birth-year" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + true + +define BirthYear: + year from Patient.birthDate diff --git a/docs/cql-queries/stratifier-birth-year.jq b/docs/cql-queries/stratifier-birth-year.jq new file mode 100644 index 000000000..c67daf780 --- /dev/null +++ b/docs/cql-queries/stratifier-birth-year.jq @@ -0,0 +1,3 @@ +["year", "count"], +(.group[0].stratifier[0].stratum[] | [.value.text, .population[0].count]) +| @csv diff --git a/docs/cql-queries/stratifier-birth-year.yml b/docs/cql-queries/stratifier-birth-year.yml new file mode 100644 index 000000000..9d46c5b3d --- /dev/null +++ b/docs/cql-queries/stratifier-birth-year.yml @@ -0,0 +1,8 @@ +library: docs/cql-queries/stratifier-birth-year.cql +group: +- type: Patient + population: + - expression: InInitialPopulation + stratifier: + - code: birth-year + expression: BirthYear diff --git a/docs/cql-queries/stratifier-body-weight.cql b/docs/cql-queries/stratifier-body-weight.cql new file mode 100644 index 000000000..53b8eaa7c --- /dev/null +++ b/docs/cql-queries/stratifier-body-weight.cql @@ -0,0 +1,14 @@ +library "stratifier-body-weight" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +codesystem loinc: 'http://loinc.org' +code "Body Weight": '29463-7' from loinc + +context Patient + +define InInitialPopulation: + [Observation: "Body Weight"] + +define function QuantityValue(observation FHIR.Observation): + observation.value as Quantity diff --git a/docs/cql-queries/stratifier-body-weight.jq b/docs/cql-queries/stratifier-body-weight.jq new file mode 100644 index 000000000..3c6f9622a --- /dev/null +++ b/docs/cql-queries/stratifier-body-weight.jq @@ -0,0 +1,4 @@ +["body-weight-value", "body-weight-unit", "count"], +(.group[0].stratifier[0].stratum[] + | [.extension[0].valueQuantity.value, .extension[0].valueQuantity.code, .population[0].count]) +| @csv diff --git a/docs/cql-queries/stratifier-body-weight.yml b/docs/cql-queries/stratifier-body-weight.yml new file mode 100644 index 000000000..eadcec695 --- /dev/null +++ b/docs/cql-queries/stratifier-body-weight.yml @@ -0,0 +1,8 @@ +library: docs/cql-queries/stratifier-body-weight.cql +group: +- type: Observation + population: + - expression: InInitialPopulation + stratifier: + - code: value + expression: QuantityValue diff --git a/docs/cql-queries/stratifier-condition-code.cql b/docs/cql-queries/stratifier-condition-code.cql new file mode 100644 index 000000000..a743b2997 --- /dev/null +++ b/docs/cql-queries/stratifier-condition-code.cql @@ -0,0 +1,11 @@ +library "stratifier-condition-code" +using FHIR version '4.0.0' +include FHIRHelpers version '4.0.0' + +context Patient + +define InInitialPopulation: + [Condition] + +define function Code(condition FHIR.Condition): + condition.code diff --git a/docs/cql-queries/stratifier-condition-code.jq b/docs/cql-queries/stratifier-condition-code.jq new file mode 100644 index 000000000..4b4734e14 --- /dev/null +++ b/docs/cql-queries/stratifier-condition-code.jq @@ -0,0 +1,4 @@ +["system", "code", "display", "count"], +(.group[0].stratifier[0].stratum[] + | [.value.coding[0].system, .value.coding[0].code, .value.coding[0].display, .population[0].count]) +| @csv diff --git a/docs/cql-queries/stratifier-condition-code.yml b/docs/cql-queries/stratifier-condition-code.yml new file mode 100644 index 000000000..87b925cf3 --- /dev/null +++ b/docs/cql-queries/stratifier-condition-code.yml @@ -0,0 +1,8 @@ +library: docs/cql-queries/stratifier-condition-code.cql +group: +- type: Condition + population: + - expression: InInitialPopulation + stratifier: + - code: code + expression: Code From 095321d758d7dde99b36bde09becb9439ebe201e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 12 Dec 2022 15:59:06 +0100 Subject: [PATCH 080/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5fc87391..5005c8714 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 @@ -678,7 +678,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 @@ -1019,7 +1019,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1200' + cli: '1.11.1.1208' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index af48acb93..57a6906ae 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.10"}} + {:mvn/version "3.21.11"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 97f5f86de..39aeb3e56 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.10"} + {:mvn/version "3.21.11"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.14.1"}}} From fdace707f13d4fab32de6e5ff077178667056ff1 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 13 Dec 2022 17:08:47 +0100 Subject: [PATCH 081/124] Implement CQL toConcept --- docs/conformance/cql.md | 8 +++---- modules/cql/src/blaze/elm/code.clj | 8 +++++++ .../src/blaze/elm/compiler/type_operators.clj | 8 +++++-- modules/cql/src/blaze/elm/deps_infer.clj | 4 ++++ modules/cql/src/blaze/elm/list.clj | 8 +++++++ modules/cql/src/blaze/elm/nil.clj | 6 +++++ modules/cql/src/blaze/elm/protocols.clj | 5 ++++ .../elm/compiler/type_operators_test.clj | 24 ++++++++++++++++++- modules/cql/test/blaze/elm/literal.clj | 5 ++++ modules/cql/test/blaze/elm/literal_spec.clj | 6 +++++ modules/cql/test/data_readers.clj | 1 + 11 files changed, 76 insertions(+), 7 deletions(-) diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index a32981524..5c655dd70 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -27,9 +27,9 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 3.3. | CodeRef | ! | only inside same library | | | 3.4. | CodeSystemDef | ✓ | | | | 3.5. | CodeSystemRef | ! | only inside same library | | -| 3.6. | Concept | ✗ | | | -| 3.7. | ConceptDef | ✗ | | | -| 3.8. | ConceptRef | ✗ | | | +| 3.6. | Concept | ✓ | | | +| 3.7. | ConceptDef | ✓ | | | +| 3.8. | ConceptRef | ✓ | | | | 3.9. | Quantity | ✓ | | | | 3.10. | Ratio | ✓ | | | | 3.11. | ValueSetDef | ✗ | | | @@ -343,7 +343,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 22.18. | Is | ✓ | | | | 22.19. | ToBoolean | ✓ | | | | 22.20. | ToChars | ✓ | | | -| 22.21. | ToConcept | ✗ | | | +| 22.21. | ToConcept | ✓ | | | | 22.22. | ToDate | ✓ | | | | 22.23. | ToDateTime | ✓ | | | | 22.24. | ToDecimal | ✓ | | | diff --git a/modules/cql/src/blaze/elm/code.clj b/modules/cql/src/blaze/elm/code.clj index 3cd0dc960..15ac0b9e0 100644 --- a/modules/cql/src/blaze/elm/code.clj +++ b/modules/cql/src/blaze/elm/code.clj @@ -1,6 +1,7 @@ (ns blaze.elm.code "Implementation of the code type." (:require + [blaze.elm.concept :as concept] [blaze.elm.protocols :as p])) @@ -27,3 +28,10 @@ "Returns a CQL code with isn't the same as a FHIR code from the database." [system version code] (->Code system version code)) + + +;; 22.21. ToConcept +(extend-protocol p/ToConcept + Code + (to-concept [x] + (concept/to-concept [x]))) diff --git a/modules/cql/src/blaze/elm/compiler/type_operators.clj b/modules/cql/src/blaze/elm/compiler/type_operators.clj index a0548512b..d89f98f25 100644 --- a/modules/cql/src/blaze/elm/compiler/type_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/type_operators.clj @@ -297,12 +297,16 @@ (p/to-boolean x)) -;; TODO 22.20. ToChars +;; 22.20. ToChars (defunop to-chars [operand] (when (string? operand) (map str operand))) -;; TODO 22.21. ToConcept + +;; 22.21. ToConcept +(defunop to-concept [x] + (p/to-concept x)) + ;; 22.22. ToDate (defrecord ToDateOperatorExpression [operand] diff --git a/modules/cql/src/blaze/elm/deps_infer.clj b/modules/cql/src/blaze/elm/deps_infer.clj index 49d7ccd70..cf0dbfbf3 100644 --- a/modules/cql/src/blaze/elm/deps_infer.clj +++ b/modules/cql/src/blaze/elm/deps_infer.clj @@ -660,6 +660,10 @@ (derive :elm.deps.type/to-chars :elm.deps.type/unary-expression) +;; 22.21. ToConcept +(derive :elm.deps.type/to-concept :elm.deps.type/unary-expression) + + ;; 22.22. ToDate (derive :elm.deps.type/to-date :elm.deps.type/unary-expression) diff --git a/modules/cql/src/blaze/elm/list.clj b/modules/cql/src/blaze/elm/list.clj index f85a5bcbf..6e18b5871 100644 --- a/modules/cql/src/blaze/elm/list.clj +++ b/modules/cql/src/blaze/elm/list.clj @@ -2,6 +2,7 @@ "Implementation of the list type." (:require [blaze.anomaly :as ba :refer [throw-anom]] + [blaze.elm.concept :as concept] [blaze.elm.protocols :as p]) (:import [clojure.lang PersistentVector IReduceInit])) @@ -182,3 +183,10 @@ IReduceInit (singleton-from [list] (p/singleton-from (.reduce list ((take 2) conj) [])))) + + +;; 22.21. ToConcept +(extend-protocol p/ToConcept + PersistentVector + (to-concept [x] + (concept/to-concept x))) diff --git a/modules/cql/src/blaze/elm/nil.clj b/modules/cql/src/blaze/elm/nil.clj index 83c824376..57924e19a 100644 --- a/modules/cql/src/blaze/elm/nil.clj +++ b/modules/cql/src/blaze/elm/nil.clj @@ -284,6 +284,12 @@ (to-boolean [_])) +;; 22.21. ToConcept +(extend-protocol p/ToConcept + nil + (to-concept [_])) + + ;; 22.22. ToDate (extend-protocol p/ToDate nil diff --git a/modules/cql/src/blaze/elm/protocols.clj b/modules/cql/src/blaze/elm/protocols.clj index a2db8a127..dc2b26888 100644 --- a/modules/cql/src/blaze/elm/protocols.clj +++ b/modules/cql/src/blaze/elm/protocols.clj @@ -265,6 +265,11 @@ (to-boolean [x])) +;; 22.21. ToConcept +(defprotocol ToConcept + (to-concept [x])) + + ;; 22.22. ToDate (defprotocol ToDate "Converts an object into something usable as Date relative to `now`. diff --git a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj index 3d6e4fd01..e97b87764 100644 --- a/modules/cql/test/blaze/elm/compiler/type_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/type_operators_test.clj @@ -4,11 +4,13 @@ Section numbers are according to https://cql.hl7.org/04-logicalspecification.html." (:require + [blaze.elm.code :as code] [blaze.elm.compiler :as c] [blaze.elm.compiler.clinical-operators] [blaze.elm.compiler.core :as core] [blaze.elm.compiler.test-util :as tu] [blaze.elm.compiler.type-operators] + [blaze.elm.concept :as concept] [blaze.elm.decimal :as decimal] [blaze.elm.literal :as elm] [blaze.elm.literal-spec] @@ -1245,7 +1247,7 @@ expr (c/compile compile-ctx elm)] (is (= '(to-chars (param-ref "x")) (core/-form expr)))))) -;; TODO 22.21. ToConcept +;; 22.21. ToConcept ;; ;; The ToConcept operator converts a value of type Code to a Concept value with ;; the given Code as its primary and only Code. If the Code has a display @@ -1255,6 +1257,26 @@ ;; input Codes, and will not have a display value. ;; ;; If the argument is null, the result is null. +(deftest compile-to-concept-test + (testing "Code" + (are [x res] (= res (core/-eval (c/compile {} (elm/to-concept x)) + {:now tu/now} nil nil)) + + (tu/code "system-134534" "code-134551") + (concept/to-concept [(code/to-code "system-134534" nil "code-134551")]) + + (elm/list [(tu/code "system-134534" "code-134551") + (tu/code "system-134535" "code-134552")]) + (concept/to-concept [(code/to-code "system-134534" nil "code-134551") + (code/to-code "system-134535" nil "code-134552")]))) + + (tu/testing-unary-null elm/to-concept) + + (testing "form" + (let [compile-ctx {:library {:parameters {:def [{:name "x"}]}}} + elm #elm/to-concept #elm/parameter-ref "x" + expr (c/compile compile-ctx elm)] + (is (= '(to-concept (param-ref "x")) (core/-form expr)))))) ;; 22.22. ToDate diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index d5d64d143..92d96add0 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -909,6 +909,11 @@ {:type "ToChars" :operand operand}) +;; 22.21. ToConcept +(defn to-concept [operand] + {:type "ToConcept" :operand operand}) + + ;; 22.22. ToDate (defn to-date [operand] {:type "ToDate" :operand operand}) diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index a0aabe745..2bd9ac301 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -534,6 +534,12 @@ :ret :elm/expression) +;; 22.21. ToConcept +(s/fdef elm/to-concept + :args (s/cat :operand :elm/expression) + :ret :elm/expression) + + ;; 22.22. ToDate (s/fdef elm/to-date :args (s/cat :operand :elm/expression) diff --git a/modules/cql/test/data_readers.clj b/modules/cql/test/data_readers.clj index 55d13146f..6b25344ae 100644 --- a/modules/cql/test/data_readers.clj +++ b/modules/cql/test/data_readers.clj @@ -90,6 +90,7 @@ elm/is blaze.elm.literal/is elm/to-boolean blaze.elm.literal/to-boolean elm/to-chars blaze.elm.literal/to-chars + elm/to-concept blaze.elm.literal/to-concept elm/to-date blaze.elm.literal/to-date elm/to-date-time blaze.elm.literal/to-date-time elm/to-decimal blaze.elm.literal/to-decimal From a39ecd0281a1c49ce3b66fe93beb42d84c885159 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 14 Dec 2022 22:43:37 +0100 Subject: [PATCH 082/124] Improve Hashing Performance --- .../src/blaze/fhir/spec/type.clj | 14 +++--- .../src/blaze/fhir/spec/type/macros.clj | 6 +-- .../test-perf/blaze/fhir/hash_test_perf.clj | 45 +++++++++++++++++++ 3 files changed, 57 insertions(+), 8 deletions(-) create mode 100644 modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type.clj b/modules/fhir-structure/src/blaze/fhir/spec/type.clj index fffddb10f..a40d16fe1 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type.clj @@ -27,7 +27,7 @@ Instant LocalDate LocalDateTime LocalTime OffsetDateTime Year YearMonth ZoneOffset] [java.time.format DateTimeParseException] - [java.util List Map UUID] + [java.util Comparator List Map Map$Entry UUID] [jsonista.jackson KeywordKeyDeserializer PersistentHashMapDeserializer PersistentVectorDeserializer])) @@ -1098,10 +1098,14 @@ (-hash-into [m sink] (.putByte ^PrimitiveSink sink (byte 37)) (run! - (fn [k] - (p/-hash-into k sink) - (p/-hash-into (k m) sink)) - (sort (keys m)))) + (fn [^Map$Entry e] + (p/-hash-into (.getKey e) sink) + (p/-hash-into (.getValue e) sink)) + (sort + (reify Comparator + (compare [_ e1 e2] + (.compareTo ^Keyword (.getKey ^Map$Entry e1) (.getKey ^Map$Entry e2)))) + m))) (-references [m] ;; Bundle entries have no references, because Bundles itself are stored "as-is" (when-not (identical? :fhir.Bundle/entry (p/-type m)) diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type/macros.clj b/modules/fhir-structure/src/blaze/fhir/spec/type/macros.clj index 5c55ac388..70527a4ab 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type/macros.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type/macros.clj @@ -219,7 +219,7 @@ (when ~'extension (.putByte ~tagged-sink (byte ~extension-tag)) (p/-hash-into ~'extension ~'sink)) - (when (some? ~value-sym) + (when-not (nil? ~value-sym) (.putByte ~tagged-sink (byte ~value-tag)) (system/-hash-into ~value-sym ~'sink))) (~'-references [~'_] @@ -309,7 +309,7 @@ (defn write-field [generator field-sym] - `(when (some? ~field-sym) + `(when-not (nil? ~field-sym) ~@(cond (= 'String (:tag (meta field-sym))) `[(.writeFieldName ~(with-meta generator {:tag `JsonGenerator}) ~(field-name field-sym)) @@ -355,7 +355,7 @@ (.putByte ~sink-sym-tag (byte ~hash-num)) ~@(map-indexed (fn [idx field] - `(when (some? ~field) + `(when-not (nil? ~field) (.putByte ~sink-sym-tag (byte ~idx)) (~(if (= 'id field) `system/-hash-into `p/-hash-into) ~field ~sink-sym))) diff --git a/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj b/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj new file mode 100644 index 000000000..362359582 --- /dev/null +++ b/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj @@ -0,0 +1,45 @@ +(ns blaze.fhir.hash-test-perf + (:require + [blaze.fhir.hash :as hash] + [blaze.test-util :as tu] + [criterium.core :as criterium])) + + +(tu/init-fhir-specs) + + +(def observation + {:fhir/type :fhir/Observation + :id "DACG22233TWT7CK4" + :meta #fhir/Meta + {:versionId #fhir/id"481283" + :lastUpdated #fhir/instant"2022-04-20T11:58:38.070Z" + :profile [#fhir/canonical"http://hl7.org/fhir/StructureDefinition/bmi" + #fhir/canonical"http://hl7.org/fhir/StructureDefinition/vitalsigns"]} + :status #fhir/code"final" + :category + [#fhir/CodeableConcept + {:coding + [#fhir/Coding + {:system #fhir/uri"http://terminology.hl7.org/CodeSystem/observation-category" + :code #fhir/code"vital-signs" + :display "vital-signs"}]}] + :code #fhir/CodeableConcept + {:coding [#fhir/Coding{:system #fhir/uri"http://loinc.org" + :code #fhir/code"39156-5" + :display "Body Mass Index"}] + :text "Body Mass Index"} + :subject #fhir/Reference{:reference "Patient/DACG22233TWT7CKL"} + :effective #fhir/dateTime"2013-01-04T23:45:50Z" + :issued #fhir/instant"2013-01-04T23:45:50.072Z" + :value #fhir/Quantity + {:value 14.97M + :unit "kg/m2" + :system #fhir/uri"http://unitsofmeasure.org" + :code #fhir/code"kg/m2"}}) + + +(comment + (criterium/bench (hash/generate observation)) + + ) From 004c124f16eb819b7b68249b563b8ac044c2ad00 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 12 Dec 2022 18:17:35 +0100 Subject: [PATCH 083/124] Fix Date Search Closes: #412 --- dev/blaze/dev/decompiler.clj | 3 +- modules/byte-buffer/src/blaze/byte_buffer.clj | 3 + modules/db/src/blaze/db/impl/codec.clj | 123 +--- modules/db/src/blaze/db/impl/codec/date.clj | 127 ++++ .../src/blaze/db/impl/search_param/date.clj | 156 +++-- modules/db/test/blaze/db/api_test.clj | 546 ++++++++++++------ .../db/test/blaze/db/impl/codec/date_spec.clj | 38 ++ .../db/test/blaze/db/impl/codec/date_test.clj | 98 ++++ modules/db/test/blaze/db/impl/codec_spec.clj | 23 +- modules/db/test/blaze/db/impl/codec_test.clj | 84 +-- .../blaze/db/impl/search_param/date_test.clj | 71 +-- .../test/blaze/db/impl/search_param_test.clj | 10 +- .../blaze/db/node/resource_indexer_test.clj | 35 +- .../src/blaze/fhir/spec/type/system/spec.clj | 7 + 14 files changed, 815 insertions(+), 509 deletions(-) create mode 100644 modules/db/src/blaze/db/impl/codec/date.clj create mode 100644 modules/db/test/blaze/db/impl/codec/date_spec.clj create mode 100644 modules/db/test/blaze/db/impl/codec/date_test.clj diff --git a/dev/blaze/dev/decompiler.clj b/dev/blaze/dev/decompiler.clj index 896d3a823..254a80ad3 100644 --- a/dev/blaze/dev/decompiler.clj +++ b/dev/blaze/dev/decompiler.clj @@ -1,5 +1,4 @@ -(ns blaze.dev.decompiler - (:require [clojure.test :refer :all])) +(ns blaze.dev.decompiler) (comment diff --git a/modules/byte-buffer/src/blaze/byte_buffer.clj b/modules/byte-buffer/src/blaze/byte_buffer.clj index d4d618ff8..b4e6b2348 100644 --- a/modules/byte-buffer/src/blaze/byte_buffer.clj +++ b/modules/byte-buffer/src/blaze/byte_buffer.clj @@ -200,6 +200,9 @@ (defn get-byte! + "The 1-arity variant reads the byte at the current position of `byte-buffer` + and increments the position afterwards. The 2-arity variant uses absolute + `index` access." {:inline (fn ([byte-buffer] diff --git a/modules/db/src/blaze/db/impl/codec.clj b/modules/db/src/blaze/db/impl/codec.clj index 646a702e8..63888db63 100644 --- a/modules/db/src/blaze/db/impl/codec.clj +++ b/modules/db/src/blaze/db/impl/codec.clj @@ -4,13 +4,9 @@ [blaze.byte-string :as bs] [blaze.fhir.spec.type.system]) (:import - [blaze.fhir.spec.type.system DateTimeYear DateTimeYearMonth - DateTimeYearMonthDay] [com.github.benmanes.caffeine.cache CacheLoader Caffeine] [com.google.common.hash Hashing] [java.nio.charset StandardCharsets] - [java.time LocalDate LocalDateTime OffsetDateTime Year YearMonth - ZoneId ZoneOffset] [java.util Arrays])) @@ -26,7 +22,6 @@ (def ^:const ^long tid-size Integer/BYTES) (def ^:const ^long t-size Long/BYTES) (def ^:const ^long state-size Long/BYTES) -(def ^:const ^long tx-time-size Long/BYTES) (def ^:const ^long max-id-size 64) @@ -431,110 +426,20 @@ bs/from-byte-buffer!))))) -(defn- epoch-seconds ^long [^LocalDateTime date-time ^ZoneId zone-id] - (.toEpochSecond (.atZone date-time zone-id))) - - -(defprotocol DateLowerBound - (-date-lb [date-time zone-id])) - - -(extend-protocol DateLowerBound - Year - (-date-lb [year zone-id] - (number (epoch-seconds (.atStartOfDay (.atDay year 1)) zone-id))) - DateTimeYear - (-date-lb [year zone-id] - (number (epoch-seconds (.atStartOfDay (.atDay ^Year (.-year year) 1)) zone-id))) - YearMonth - (-date-lb [year-month zone-id] - (number (epoch-seconds (.atStartOfDay (.atDay year-month 1)) zone-id))) - DateTimeYearMonth - (-date-lb [year-month zone-id] - (number (epoch-seconds (.atStartOfDay (.atDay ^YearMonth (.-year_month year-month) 1)) zone-id))) - LocalDate - (-date-lb [date zone-id] - (number (epoch-seconds (.atStartOfDay date) zone-id))) - DateTimeYearMonthDay - (-date-lb [date zone-id] - (number (epoch-seconds (.atStartOfDay ^LocalDate (.date date)) zone-id))) - LocalDateTime - (-date-lb [date-time zone-id] - (number (epoch-seconds date-time zone-id))) - OffsetDateTime - (-date-lb [date-time _] - (number (.toEpochSecond date-time)))) - - -(defn date-lb - "Returns the lower bound of the implicit range the `date-time` value spans." - [zone-id date-time] - (-date-lb date-time zone-id)) - - -(defprotocol DateUpperBound - (-date-ub [date-time zone-id])) - - -(extend-protocol DateUpperBound - Year - (-date-ub [year zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusYears year 1) 1)) zone-id)))) - DateTimeYear - (-date-ub [year zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusYears ^Year (.year year) 1) 1)) zone-id)))) - YearMonth - (-date-ub [year-month zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusMonths year-month 1) 1)) zone-id)))) - DateTimeYearMonth - (-date-ub [year-month zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusMonths ^YearMonth (.-year_month year-month) 1) 1)) zone-id)))) - LocalDate - (-date-ub [date zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.plusDays date 1)) zone-id)))) - DateTimeYearMonthDay - (-date-ub [date zone-id] - (number (dec (epoch-seconds (.atStartOfDay (.plusDays ^LocalDate (.date date) 1)) zone-id)))) - LocalDateTime - (-date-ub [date-time zone-id] - (number (epoch-seconds date-time zone-id))) - OffsetDateTime - (-date-ub [date-time _] - (number (.toEpochSecond date-time)))) - - -(defn date-ub - "Returns the upper bound of the implicit range the `date-time` value spans." - [zone-id date-time] - (-date-ub date-time zone-id)) - - -(def date-min-bound - (date-lb (ZoneOffset/ofHours 0) (Year/of 1))) - - -(def date-max-bound - (date-ub (ZoneOffset/ofHours 0) (Year/of 9999))) - - -(defn date-lb-ub [lb ub] - (-> (bb/allocate (+ 2 (bs/size lb) (bs/size ub))) - (bb/put-byte-string! lb) - (bb/put-byte! 0) - (bb/put-byte-string! ub) - (bb/put-byte! (bs/size lb)) - bb/flip! - bs/from-byte-buffer!)) - - -(defn date-lb-ub->lb [lb-ub] - (bs/subs lb-ub 0 (bs/nth lb-ub (unchecked-dec-int (bs/size lb-ub))))) - - -(defn date-lb-ub->ub [lb-ub] - (let [lb-size-idx (unchecked-dec-int (bs/size lb-ub)) - start (unchecked-inc-int (int (bs/nth lb-ub lb-size-idx)))] - (bs/subs lb-ub start lb-size-idx))) +(defn decode-number [byte-string] + (let [bb (bs/as-read-only-byte-buffer byte-string) + header (bit-and (long (bb/get-byte! bb)) 0xFF) + mask (bit-and (bit-shift-right (unchecked-byte (bit-xor header 0x80)) 7) 0xFF) + n (bit-and (bit-xor (bit-shift-right header 3) mask) 0x0F)] + (loop [val (bit-shift-left (bit-and (bit-xor header mask) 0x07) (* 8 n)) + i 1] + (if (<= i n) + (let [byte (bit-and (long (bb/get-byte! bb)) 0xFF)] + (recur + (+ val (bit-shift-left (bit-xor byte mask) (* 8 (- n i)))) + (inc i))) + (let [final-mask (bit-shift-right (bit-shift-left mask 63) 63)] + (bit-xor val final-mask)))))) (defn quantity [unit value] diff --git a/modules/db/src/blaze/db/impl/codec/date.clj b/modules/db/src/blaze/db/impl/codec/date.clj new file mode 100644 index 000000000..0c8fa4f17 --- /dev/null +++ b/modules/db/src/blaze/db/impl/codec/date.clj @@ -0,0 +1,127 @@ +(ns blaze.db.impl.codec.date + (:require + [blaze.byte-buffer :as bb] + [blaze.byte-string :as bs] + [blaze.db.impl.codec :refer [number]] + [blaze.fhir.spec.type.system]) + (:import + [blaze.fhir.spec.type.system DateTimeYear DateTimeYearMonth + DateTimeYearMonthDay] + [java.time LocalDate LocalDateTime OffsetDateTime Year YearMonth + ZoneOffset])) + + +(set! *warn-on-reflection* true) + + +(defn- epoch-seconds ^long [^LocalDateTime date-time] + (.toEpochSecond (.atOffset date-time (ZoneOffset/UTC)))) + + +(defprotocol LowerBound + (-encode-lower-bound [date-time])) + + +(extend-protocol LowerBound + Year + (-encode-lower-bound [year] + (number (epoch-seconds (.atStartOfDay (.atDay year 1))))) + DateTimeYear + (-encode-lower-bound [year] + (number (epoch-seconds (.atStartOfDay (.atDay ^Year (.-year year) 1))))) + YearMonth + (-encode-lower-bound [year-month] + (number (epoch-seconds (.atStartOfDay (.atDay year-month 1))))) + DateTimeYearMonth + (-encode-lower-bound [year-month] + (number (epoch-seconds (.atStartOfDay (.atDay ^YearMonth (.-year_month year-month) 1))))) + LocalDate + (-encode-lower-bound [date] + (number (epoch-seconds (.atStartOfDay date)))) + DateTimeYearMonthDay + (-encode-lower-bound [date] + (number (epoch-seconds (.atStartOfDay ^LocalDate (.date date))))) + LocalDateTime + (-encode-lower-bound [date-time] + (number (epoch-seconds date-time))) + OffsetDateTime + (-encode-lower-bound [date-time] + (number (.toEpochSecond date-time)))) + + +(defn encode-lower-bound + "Encodes the lower bound of the implicit range of `date-time`." + [date-time] + (-encode-lower-bound date-time)) + + +(defprotocol UpperBound + (-encode-upper-bound [date-time])) + + +(extend-protocol UpperBound + Year + (-encode-upper-bound [year] + (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusYears year 1) 1)))))) + DateTimeYear + (-encode-upper-bound [year] + (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusYears ^Year (.year year) 1) 1)))))) + YearMonth + (-encode-upper-bound [year-month] + (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusMonths year-month 1) 1)))))) + DateTimeYearMonth + (-encode-upper-bound [year-month] + (number (dec (epoch-seconds (.atStartOfDay (.atDay (.plusMonths ^YearMonth (.-year_month year-month) 1) 1)))))) + LocalDate + (-encode-upper-bound [date] + (number (dec (epoch-seconds (.atStartOfDay (.plusDays date 1)))))) + DateTimeYearMonthDay + (-encode-upper-bound [date] + (number (dec (epoch-seconds (.atStartOfDay (.plusDays ^LocalDate (.date date) 1)))))) + LocalDateTime + (-encode-upper-bound [date-time] + (number (epoch-seconds date-time))) + OffsetDateTime + (-encode-upper-bound [date-time] + (number (.toEpochSecond date-time)))) + + +(defn encode-upper-bound + "Encodes the upper bound of the implicit range of `date-time`." + [date-time] + (-encode-upper-bound date-time)) + + +(defn- encode-range* [lower-bound upper-bound] + (-> (bb/allocate (+ 2 (bs/size lower-bound) (bs/size upper-bound))) + (bb/put-byte-string! lower-bound) + (bb/put-byte! 0) + (bb/put-byte-string! upper-bound) + (bb/put-byte! (bs/size lower-bound)) + bb/flip! + bs/from-byte-buffer!)) + + +(defn encode-range + "Encodes the implicit range of `date-time` or the explicit range from `start` + to `end`." + ([date-time] + (encode-range date-time date-time)) + ([start end] + (encode-range* (encode-lower-bound (or start (Year/of 1))) + (encode-upper-bound (or end (Year/of 9999)))))) + + +(defn lower-bound-bytes + "Returns the bytes of the lower bound from the encoded `date-range-bytes`." + [date-range-bytes] + (let [lower-bound-size-idx (unchecked-dec-int (bs/size date-range-bytes))] + (bs/subs date-range-bytes 0 (bs/nth date-range-bytes lower-bound-size-idx)))) + + +(defn upper-bound-bytes + "Returns the bytes of the upper bound from the encoded `date-range-bytes`." + [date-range-bytes] + (let [lower-bound-size-idx (unchecked-dec-int (bs/size date-range-bytes)) + start (unchecked-inc-int (int (bs/nth date-range-bytes lower-bound-size-idx)))] + (bs/subs date-range-bytes start lower-bound-size-idx))) diff --git a/modules/db/src/blaze/db/impl/search_param/date.clj b/modules/db/src/blaze/db/impl/search_param/date.clj index 89427b59f..e0a3c5d74 100644 --- a/modules/db/src/blaze/db/impl/search_param/date.clj +++ b/modules/db/src/blaze/db/impl/search_param/date.clj @@ -4,6 +4,7 @@ [blaze.byte-string :as bs] [blaze.coll.core :as coll] [blaze.db.impl.codec :as codec] + [blaze.db.impl.codec.date :as codec-date] [blaze.db.impl.index.resource-search-param-value :as r-sp-v] [blaze.db.impl.index.search-param-value-resource :as sp-vr] [blaze.db.impl.protocols :as p] @@ -14,25 +15,12 @@ [blaze.fhir.spec.type :as type] [blaze.fhir.spec.type.system :as system] [cognitect.anomalies :as anom] - [taoensso.timbre :as log]) - (:import - [java.time ZoneId])) + [taoensso.timbre :as log])) (set! *warn-on-reflection* true) -(def ^:private default-zone-id (ZoneId/systemDefault)) - - -(defn- date-lb [date-time] - (codec/date-lb default-zone-id date-time)) - - -(defn- date-ub [date-time] - (codec/date-ub default-zone-id date-time)) - - (defmulti index-entries "Returns index entries for `value` from a resource." {:arglists '([url value])} @@ -42,31 +30,25 @@ (defmethod index-entries :fhir/date [_ date] (when-let [value (type/value date)] - [[nil (codec/date-lb-ub (date-lb value) (date-ub value))]])) + [[nil (codec-date/encode-range value)]])) (defmethod index-entries :fhir/dateTime [_ date-time] (when-let [value (type/value date-time)] - [[nil (codec/date-lb-ub (date-lb value) (date-ub value))]])) + [[nil (codec-date/encode-range value)]])) (defmethod index-entries :fhir/instant [_ date-time] (when-let [value (type/value date-time)] - [[nil (codec/date-lb-ub (date-lb value) (date-ub value))]])) + [[nil (codec-date/encode-range value)]])) (defmethod index-entries :fhir/Period [_ {:keys [start end]}] [[nil - (codec/date-lb-ub - (if-let [start (type/value start)] - (date-lb start) - codec/date-min-bound) - (if-let [end (type/value end)] - (date-ub end) - codec/date-max-bound))]]) + (codec-date/encode-range (type/value start) (type/value end))]]) (defmethod index-entries :default @@ -87,18 +69,18 @@ (defn- eq-overlaps? "Returns true if the interval `v` overlaps with the interval `q`." - [v-lb v-ub q-lb q-ub] - (or (bs/<= q-lb v-lb q-ub) - (bs/<= q-lb v-ub q-ub) - (and (bs/< v-lb q-lb) (bs/< q-ub v-ub)))) + [value q-lb q-ub] + (let [v-lb (codec-date/lower-bound-bytes value) + v-ub (codec-date/upper-bound-bytes value)] + (or (bs/<= q-lb v-lb q-ub) + (bs/<= q-lb v-ub q-ub) + (and (bs/< v-lb q-lb) (bs/< q-ub v-ub))))) (defn- eq-filter [q-lb a-lb] (filter (fn [[value]] - (let [v-lb (codec/date-lb-ub->lb value) - v-ub (codec/date-lb-ub->ub value)] - (eq-overlaps? v-lb v-ub q-lb a-lb))))) + (eq-overlaps? value q-lb a-lb)))) (defn- all-keys! [{:keys [svri] :as context} c-hash tid start-id] @@ -125,16 +107,15 @@ (all-keys! context c-hash tid start-id)))) -(defn- ge-overlaps? [v-lb v-ub q-lb] - (or (bs/<= q-lb v-lb) (bs/<= q-lb v-ub))) +(defn- ge-overlaps? [lower-bound value] + (or (bs/<= lower-bound (codec-date/lower-bound-bytes value)) + (bs/<= lower-bound (codec-date/upper-bound-bytes value)))) -(defn- ge-filter [q-lb] +(defn- ge-filter [lower-bound] (filter (fn [[value]] - (let [v-lb (codec/date-lb-ub->lb value) - v-ub (codec/date-lb-ub->ub value)] - (ge-overlaps? v-lb v-ub q-lb))))) + (ge-overlaps? lower-bound value)))) (defn- ge-keys! @@ -151,16 +132,40 @@ (all-keys! context c-hash tid start-id)))) -(defn- le-overlaps? [v-lb v-ub q-ub] - (or (bs/<= v-ub q-ub) (bs/<= v-lb q-ub))) +(defn- gt-overlaps? [lower-bound value] + (or (bs/< lower-bound (codec-date/lower-bound-bytes value)) + (bs/< lower-bound (codec-date/upper-bound-bytes value)))) + + +(defn- gt-filter [lower-bound] + (filter + (fn [[value]] + (gt-overlaps? lower-bound value)))) + + +(defn- gt-keys! + "Returns a reducible collection of `[value id hash-prefix]` triples of all + keys with overlapping date/time intervals with the interval specified by + `lower-bound` and an infinite upper bound starting at `start-id` (optional)." + ([{:keys [svri]} c-hash tid lower-bound] + (coll/eduction + (gt-filter lower-bound) + (sp-vr/all-keys! svri c-hash tid))) + ([context c-hash tid lower-bound start-id] + (coll/eduction + (gt-filter lower-bound) + (all-keys! context c-hash tid start-id)))) + + +(defn- le-overlaps? [value upper-bound] + (or (bs/<= (codec-date/upper-bound-bytes value) upper-bound) + (bs/<= (codec-date/lower-bound-bytes value) upper-bound))) (defn- le-filter [q-ub] (filter (fn [[value]] - (let [v-lb (codec/date-lb-ub->lb value) - v-ub (codec/date-lb-ub->ub value)] - (le-overlaps? v-lb v-ub q-ub))))) + (le-overlaps? value q-ub)))) (defn- le-keys! @@ -177,6 +182,31 @@ (all-keys! context c-hash tid start-id)))) +(defn- lt-overlaps? [value upper-bound] + (or (bs/< (codec-date/upper-bound-bytes value) upper-bound) + (bs/< (codec-date/lower-bound-bytes value) upper-bound))) + + +(defn- lt-filter [upper-bound] + (filter + (fn [[value]] + (lt-overlaps? value upper-bound)))) + + +(defn- lt-keys! + "Returns a reducible collection of `[value id hash-prefix]` triples of all + keys with overlapping date/time intervals with the interval specified by + an infinite lower bound and `upper-bound` starting at `start-id` (optional)." + ([{:keys [svri]} c-hash tid upper-bound] + (coll/eduction + (lt-filter upper-bound) + (sp-vr/all-keys! svri c-hash tid))) + ([context c-hash tid lower-bound start-id] + (coll/eduction + (lt-filter lower-bound) + (all-keys! context c-hash tid start-id)))) + + (defn- invalid-date-time-value-msg [code value] (format "Invalid date-time value `%s` in search parameter `%s`." value code)) @@ -185,25 +215,29 @@ ([context c-hash tid {:keys [op lower-bound upper-bound]}] (case op :eq (eq-keys! context c-hash tid lower-bound upper-bound) - (:ge :gt) (ge-keys! context c-hash tid lower-bound) - (:le :lt) (le-keys! context c-hash tid upper-bound))) + :ge (ge-keys! context c-hash tid lower-bound) + :gt (gt-keys! context c-hash tid upper-bound) + :le (le-keys! context c-hash tid upper-bound) + :lt (lt-keys! context c-hash tid lower-bound))) ([context c-hash tid {:keys [op lower-bound upper-bound]} start-id] (case op :eq (eq-keys! context c-hash tid lower-bound upper-bound start-id) - (:ge :gt) (ge-keys! context c-hash tid lower-bound start-id) - (:le :lt) (le-keys! context c-hash tid upper-bound start-id)))) + :ge (ge-keys! context c-hash tid lower-bound start-id) + :gt (gt-keys! context c-hash tid upper-bound start-id) + :le (le-keys! context c-hash tid upper-bound start-id) + :lt (lt-keys! context c-hash tid lower-bound start-id)))) (defn- matches? [{:keys [rsvi]} c-hash resource-handle {:keys [op] q-lb :lower-bound q-ub :upper-bound}] (when-let [v (r-sp-v/next-value! rsvi resource-handle c-hash)] - (let [v-lb (codec/date-lb-ub->lb v) - v-ub (codec/date-lb-ub->ub v)] - (case op - :eq (eq-overlaps? v-lb v-ub q-lb q-ub) - (:ge :gt) (ge-overlaps? v-lb v-ub q-lb) - (:le :lt) (le-overlaps? v-lb v-ub q-ub))))) + (case op + :eq (eq-overlaps? v q-lb q-ub) + :ge (ge-overlaps? q-lb v) + :gt (gt-overlaps? q-ub v) + :le (le-overlaps? v q-ub) + :lt (lt-overlaps? v q-lb)))) (defrecord SearchParamDate [name url type base code c-hash expression] @@ -214,14 +248,20 @@ (case op :eq {:op op - :lower-bound (date-lb date-time-value) - :upper-bound (date-ub date-time-value)} - (:ge :gt) + :lower-bound (codec-date/encode-lower-bound date-time-value) + :upper-bound (codec-date/encode-upper-bound date-time-value)} + :ge + {:op op + :lower-bound (codec-date/encode-lower-bound date-time-value)} + :gt + {:op op + :upper-bound (codec-date/encode-upper-bound date-time-value)} + :le {:op op - :lower-bound (date-lb date-time-value)} - (:le :lt) + :upper-bound (codec-date/encode-upper-bound date-time-value)} + :lt {:op op - :upper-bound (date-ub date-time-value)} + :lower-bound (codec-date/encode-lower-bound date-time-value)} (ba/unsupported (u/unsupported-prefix-msg code op))) #(assoc % ::anom/message (invalid-date-time-value-msg code value))))) diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index 0900bf59d..dc289173c 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -1376,159 +1376,252 @@ ::anom/category := ::anom/unsupported ::anom/message := "Unsupported prefix `ne` in search parameter `birthdate`.")) - (testing "with ge/gt prefix" - (doseq [prefix ["ge" "gt"]] - (testing "with day precision" - (testing "overlapping four patients" - (testing "starting at the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]]) - count := 4 - [0 :id] := "id-2" - [1 :id] := "id-1" - [2 :id] := "id-0" - [3 :id] := "id-4") - - (testing "it is possible to start with the second patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-1") - count := 3 - [0 :id] := "id-1" - [1 :id] := "id-0" - [2 :id] := "id-4")) - - (testing "it is possible to start with the third patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-0") - count := 2 - [0 :id] := "id-0" - [1 :id] := "id-4")) - - (testing "it is possible to start with the fourth patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-4") - count := 1 - [0 :id] := "id-4"))) - - (testing "starting before the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-07")]]) - count := 4 - [0 :id] := "id-2" - [1 :id] := "id-1" - [2 :id] := "id-0" - [3 :id] := "id-4"))) + (testing "with ge prefix" + (testing "with day precision" + (testing "overlapping four patients" + (testing "starting at the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-08"]]) + count := 4 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-0" + [3 :id] := "id-4") - (testing "overlapping three patients" - (testing "starting after the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-09")]]) + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-08"]] "id-1") count := 3 - [0 :id] := "id-2" - [1 :id] := "id-1" + [0 :id] := "id-1" + [1 :id] := "id-0" [2 :id] := "id-4")) - (testing "starting at the last day of 2020-02" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-29")]]) - count := 3 - [0 :id] := "id-2" - [1 :id] := "id-1" - [2 :id] := "id-4"))) - - (testing "overlapping two patients" - (testing "starting at the first day of 2020-03" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-03-01")]]) + (testing "it is possible to start with the third patient" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-08"]] "id-0") count := 2 - [0 :id] := "id-2" + [0 :id] := "id-0" [1 :id] := "id-4")) - (testing "starting at the last day of 2020" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-12-31")]]) + (testing "it is possible to start with the fourth patient" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-08"]] "id-4") + count := 1 + [0 :id] := "id-4"))) + + (testing "starting before the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-07"]]) + count := 4 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-0" + [3 :id] := "id-4"))) + + (testing "overlapping three patients" + (testing "starting after the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-09"]]) + count := 3 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-4")) + + (testing "starting at the last day of 2020-02" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-02-29"]]) + count := 3 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-4"))) + + (testing "overlapping two patients" + (testing "starting at the first day of 2020-03" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-03-01"]]) + count := 2 + [0 :id] := "id-2" + [1 :id] := "id-4")) + + (testing "starting at the last day of 2020" + (given (pull-type-query node "Patient" [["birthdate" "ge2020-12-31"]]) + count := 2 + [0 :id] := "id-2" + [1 :id] := "id-4"))) + + (testing "overlapping one patient" + (testing "starting at the first day of 2021" + (given (pull-type-query node "Patient" [["birthdate" "ge2021-01-01"]]) + count := 1 + [0 :id] := "id-4"))) + + (testing "overlapping no patient" + (testing "starting at the first day of 2022" + (given (pull-type-query node "Patient" [["birthdate" "ge2022-01-01"]]) + count := 0))))) + + (testing "with gt prefix" + (testing "with day precision" + (testing "overlapping three patients" + (testing "starting at the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-08"]]) + count := 3 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-4") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-08"]] "id-1") count := 2 - [0 :id] := "id-2" - [1 :id] := "id-4"))) + [0 :id] := "id-1" + [1 :id] := "id-4")) - (testing "overlapping one patient" - (testing "starting at the first day of 2021" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2021-01-01")]]) + (testing "it is possible to start with the third patient" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-08"]] "id-4") count := 1 [0 :id] := "id-4"))) - (testing "overlapping no patient" - (testing "starting at the first day of 2022" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2022-01-01")]]) - count := 0)))))) - - (testing "with le/lt prefix" - (doseq [prefix ["le" "lt"]] - (testing "with day precision" - (testing "overlapping four patients" - (testing "starting at the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]]) - count := 4 - [0 :id] := "id-3" - [1 :id] := "id-2" - [2 :id] := "id-1" - [3 :id] := "id-0") - - (testing "it is possible to start with the second patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-2") - count := 3 - [0 :id] := "id-2" - [1 :id] := "id-1" - [2 :id] := "id-0")) - - (testing "it is possible to start with the third patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-1") - count := 2 - [0 :id] := "id-1" - [1 :id] := "id-0")) - - (testing "it is possible to start with the fourth patient" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-08")]] "id-0") - count := 1 - [0 :id] := "id-0"))) - - (testing "starting after the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-09")]]) - count := 4 - [0 :id] := "id-3" - [1 :id] := "id-2" - [2 :id] := "id-1" - [3 :id] := "id-0"))) - - (testing "overlapping three patients" - (testing "starting before the most specific birthdate" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-07")]]) - count := 3 - [0 :id] := "id-3" - [1 :id] := "id-2" - [2 :id] := "id-1")) + (testing "starting before the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-07"]]) + count := 4 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-0" + [3 :id] := "id-4"))) + + (testing "overlapping three patients" + (testing "starting after the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-09"]]) + count := 3 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-4")) - (testing "starting at the first day of 2020-02" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-02-01")]]) - count := 3 - [0 :id] := "id-3" - [1 :id] := "id-2" - [2 :id] := "id-1"))) + (testing "starting at the last day of 2020-02" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-02-29"]]) + count := 2 + [0 :id] := "id-2" + [1 :id] := "id-4"))) - (testing "overlapping two patients" - (testing "starting at the last day of 2020-01" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-01-31")]]) + (testing "overlapping two patients" + (testing "starting at the first day of 2020-03" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-03-01"]]) + count := 2 + [0 :id] := "id-2" + [1 :id] := "id-4")) + + (testing "starting at the last day of 2020" + (given (pull-type-query node "Patient" [["birthdate" "gt2020-12-31"]]) + count := 1 + [0 :id] := "id-4"))) + + (testing "overlapping one patient" + (testing "starting at the first day of 2021" + (given (pull-type-query node "Patient" [["birthdate" "gt2021-01-01"]]) + count := 1 + [0 :id] := "id-4"))) + + (testing "overlapping no patient" + (testing "starting at the first day of 2022" + (given (pull-type-query node "Patient" [["birthdate" "gt2022-01-01"]]) + count := 0))))) + + (testing "with lt prefix" + (testing "with day precision" + (testing "overlapping three patients" + (testing "starting at the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "lt2020-02-08"]]) + count := 3 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "lt2020-02-08"]] "id-2") count := 2 - [0 :id] := "id-3" - [1 :id] := "id-2")) + [0 :id] := "id-2" + [1 :id] := "id-1")) + + (testing "it is possible to start with the third patient" + (given (pull-type-query node "Patient" [["birthdate" "lt2020-02-08"]] "id-1") + count := 1 + [0 :id] := "id-1"))) - (testing "starting at the first day of 2020" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2020-01-01")]]) + (testing "starting after the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "lt2020-02-09"]]) + count := 4 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1" + [3 :id] := "id-0"))))) + + (testing "with le prefix" + (testing "with day precision" + (testing "overlapping four patients" + (testing "starting at the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-08"]]) + count := 4 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1" + [3 :id] := "id-0") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-08"]] "id-2") + count := 3 + [0 :id] := "id-2" + [1 :id] := "id-1" + [2 :id] := "id-0")) + + (testing "it is possible to start with the third patient" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-08"]] "id-1") count := 2 - [0 :id] := "id-3" - [1 :id] := "id-2"))) + [0 :id] := "id-1" + [1 :id] := "id-0")) - (testing "overlapping one patient" - (testing "starting at the last day of 2019" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2019-12-31")]]) + (testing "it is possible to start with the fourth patient" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-08"]] "id-0") count := 1 - [0 :id] := "id-3"))) + [0 :id] := "id-0"))) + + (testing "starting after the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-09"]]) + count := 4 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1" + [3 :id] := "id-0"))) + + (testing "overlapping three patients" + (testing "starting before the most specific birthdate" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-07"]]) + count := 3 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1")) + + (testing "starting at the first day of 2020-02" + (given (pull-type-query node "Patient" [["birthdate" "le2020-02-01"]]) + count := 3 + [0 :id] := "id-3" + [1 :id] := "id-2" + [2 :id] := "id-1"))) + + (testing "overlapping two patients" + (testing "starting at the last day of 2020-01" + (given (pull-type-query node "Patient" [["birthdate" "le2020-01-31"]]) + count := 2 + [0 :id] := "id-3" + [1 :id] := "id-2")) + + (testing "starting at the first day of 2020" + (given (pull-type-query node "Patient" [["birthdate" "le2020-01-01"]]) + count := 2 + [0 :id] := "id-3" + [1 :id] := "id-2"))) - (testing "overlapping no patient" - (testing "starting at the last day of 2018" - (given (pull-type-query node "Patient" [["birthdate" (str prefix "2018-12-31")]]) - count := 0))))))) + (testing "overlapping one patient" + (testing "starting at the last day of 2019" + (given (pull-type-query node "Patient" [["birthdate" "le2019-12-31"]]) + count := 1 + [0 :id] := "id-3"))) + + (testing "overlapping no patient" + (testing "starting at the last day of 2018" + (given (pull-type-query node "Patient" [["birthdate" "le2018-12-31"]]) + count := 0)))))) (testing "gender and birthdate" (given (pull-type-query node "Patient" [["gender" "male" "female"] @@ -1546,44 +1639,71 @@ [2 :id] := "id-2")) (testing "gender and birthdate with prefix" - (testing "with ge/gt prefix" - (doseq [prefix ["ge" "gt"]] - (given (pull-type-query node "Patient" [["gender" "male" "female"] - ["birthdate" (str prefix "2020")]]) - count := 3 - [0 :id] := "id-0" - [1 :id] := "id-1" - [2 :id] := "id-2") + (testing "with ge prefix" + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "ge2020"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2") - (given (pull-type-query node "Patient" [["gender" "male" "female"] - ["birthdate" (str prefix "2020-02-07")]]) - count := 3 - [0 :id] := "id-0" - [1 :id] := "id-1" - [2 :id] := "id-2"))) + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "ge2020-02-07"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2")) - (testing "with le/lt prefix" - (doseq [prefix ["le" "lt"]] - (given (pull-type-query node "Patient" [["gender" "male" "female"] - ["birthdate" (str prefix "2020")]]) - count := 3 - [0 :id] := "id-0" - [1 :id] := "id-1" - [2 :id] := "id-2") + (testing "with gt prefix" + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "gt2020"]]) + count := 0) - (given (pull-type-query node "Patient" [["gender" "male" "female"] - ["birthdate" (str prefix "2020-02")]]) - count := 3 - [0 :id] := "id-0" - [1 :id] := "id-1" - [2 :id] := "id-2") + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "gt2020-02-07"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2")) - (given (pull-type-query node "Patient" [["gender" "male" "female"] - ["birthdate" (str prefix "2021")]]) - count := 3 - [0 :id] := "id-0" - [1 :id] := "id-1" - [2 :id] := "id-2")))) + (testing "with le prefix" + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "le2020"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2") + + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "le2020-02"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2") + + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "le2021"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2")) + + (testing "with lt prefix" + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "lt2020"]]) + count := 0) + + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "lt2020-02"]]) + count := 1 + [0 :id] := "id-2") + + (given (pull-type-query node "Patient" [["gender" "male" "female"] + ["birthdate" "lt2021"]]) + count := 3 + [0 :id] := "id-0" + [1 :id] := "id-1" + [2 :id] := "id-2"))) (testing "deceased" (given (pull-type-query node "Patient" [["deceased" "true"]]) @@ -2923,6 +3043,98 @@ [0 :id] := "1")))))) +(deftest type-query-date-test + (testing "less than" + (testing "year precision" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"1990"}] + [:put {:fhir/type :fhir/Patient :id "1" + :birthDate #fhir/date"1989"}] + [:put {:fhir/type :fhir/Patient :id "2" + :birthDate #fhir/date"1988"}]]] + + (given (pull-type-query node "Patient" [["birthdate" "lt1990"]]) + count := 2 + [0 :id] := "2" + [1 :id] := "1") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "lt1990"]] "1") + count := 1 + [0 :id] := "1")))) + + (testing "day precision" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"2022-12-14"}] + [:put {:fhir/type :fhir/Patient :id "1" + :birthDate #fhir/date"2022-12-13"}]]] + + (given (pull-type-query node "Patient" [["birthdate" "lt2022-12-14"]]) + count := 1 + [0 :id] := "1"))) + + (testing "as second clause" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :gender #fhir/code"male" + :birthDate #fhir/date"2022-12-14"}] + [:put {:fhir/type :fhir/Patient :id "1" + :gender #fhir/code"male" + :birthDate #fhir/date"2022-12-13"}]]] + + (given (pull-type-query node "Patient" [["gender" "male"] + ["birthdate" "lt2022-12-14"]]) + count := 1 + [0 :id] := "1")))) + + (testing "greater than" + (testing "year precision" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"1990"}] + [:put {:fhir/type :fhir/Patient :id "1" + :birthDate #fhir/date"1991"}] + [:put {:fhir/type :fhir/Patient :id "2" + :birthDate #fhir/date"1992"}]]] + + (given (pull-type-query node "Patient" [["birthdate" "gt1990"]]) + count := 2 + [0 :id] := "1" + [1 :id] := "2") + + (testing "it is possible to start with the second patient" + (given (pull-type-query node "Patient" [["birthdate" "gt1990"]] "2") + count := 1 + [0 :id] := "2")))) + + (testing "day precision" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"2022-12-14"}] + [:put {:fhir/type :fhir/Patient :id "1" + :birthDate #fhir/date"2022-12-15"}]]] + + (given (pull-type-query node "Patient" [["birthdate" "gt2022-12-14"]]) + count := 1 + [0 :id] := "1"))) + + (testing "as second clause" + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :gender #fhir/code"male" + :birthDate #fhir/date"2022-12-14"}] + [:put {:fhir/type :fhir/Patient :id "1" + :gender #fhir/code"male" + :birthDate #fhir/date"2022-12-15"}]]] + + (given (pull-type-query node "Patient" [["gender" "male"] + ["birthdate" "gt2022-12-14"]]) + count := 1 + [0 :id] := "1"))))) + + (deftest type-query-forward-chaining-test (testing "Encounter" (with-system-data [{:blaze.db/keys [node]} system] diff --git a/modules/db/test/blaze/db/impl/codec/date_spec.clj b/modules/db/test/blaze/db/impl/codec/date_spec.clj new file mode 100644 index 000000000..19d583325 --- /dev/null +++ b/modules/db/test/blaze/db/impl/codec/date_spec.clj @@ -0,0 +1,38 @@ +(ns blaze.db.impl.codec.date-spec + (:require + [blaze.byte-string :refer [byte-string?]] + [blaze.byte-string-spec] + [blaze.db.api-spec] + [blaze.db.impl.codec.date :as codec-date] + [blaze.db.impl.codec.spec] + [blaze.fhir.spec] + [blaze.fhir.spec.type.system-spec] + [blaze.fhir.spec.type.system.spec] + [clojure.spec.alpha :as s] + [clojure.test.check])) + + +(s/fdef codec-date/encode-lower-bound + :args (s/cat :date-time :system/date-or-date-time) + :ret byte-string?) + + +(s/fdef codec-date/encode-upper-bound + :args (s/cat :date-time :system/date-or-date-time) + :ret byte-string?) + + +(s/fdef codec-date/encode-range + :args (s/cat :start (s/nilable :system/date-or-date-time) + :end (s/? (s/nilable :system/date-or-date-time))) + :ret byte-string?) + + +(s/fdef codec-date/lower-bound-bytes + :args (s/cat :date-range byte-string?) + :ret byte-string?) + + +(s/fdef codec-date/upper-bound-bytes + :args (s/cat :date-range byte-string?) + :ret byte-string?) diff --git a/modules/db/test/blaze/db/impl/codec/date_test.clj b/modules/db/test/blaze/db/impl/codec/date_test.clj new file mode 100644 index 000000000..09831c950 --- /dev/null +++ b/modules/db/test/blaze/db/impl/codec/date_test.clj @@ -0,0 +1,98 @@ +(ns blaze.db.impl.codec.date-test + (:require + [blaze.byte-string :as bs] + [blaze.db.impl.codec-spec] + [blaze.db.impl.codec.date :as codec-date] + [blaze.db.impl.index.search-param-value-resource-spec] + [blaze.test-util :refer [satisfies-prop]] + [clojure.spec.alpha :as s] + [clojure.spec.test.alpha :as st] + [clojure.test :as test :refer [are deftest testing]] + [clojure.test.check.properties :as prop]) + (:import + [java.time OffsetDateTime ZoneOffset])) + + +(set! *warn-on-reflection* true) +(st/instrument) + + +(defn- fixture [f] + (st/instrument) + (f) + (st/unstrument)) + + +(test/use-fixtures :each fixture) + + +(deftest encode-lower-bound-test + (testing "year" + (are [date hex] (= hex (bs/hex (codec-date/encode-lower-bound date))) + #system/date"1970" "80" + #system/date-time"1970" "80")) + + (testing "year-month" + (are [date hex] (= hex (bs/hex (codec-date/encode-lower-bound date))) + #system/date"1970-01" "80" + #system/date-time"1970-01" "80")) + + (testing "local-date" + (are [date hex] (= hex (bs/hex (codec-date/encode-lower-bound date))) + #system/date"1970-01-01" "80" + #system/date-time"1970-01-01" "80")) + + (testing "local-date-time" + (are [date hex] (= hex (bs/hex (codec-date/encode-lower-bound date))) + #system/date-time"1970-01-01T00:00" "80")) + + (testing "offset-date-time" + (are [date hex] (= hex (bs/hex (codec-date/encode-lower-bound date))) + (OffsetDateTime/of 1970 1 1 0 0 0 0 ZoneOffset/UTC) "80" + (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours 2)) "6FE3E0" + (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours 1)) "6FF1F0" + (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours -1)) "900E10" + (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours -2)) "901C20"))) + + +(deftest encode-upper-bound-test + (testing "year" + (are [date hex] (= hex (bs/hex (codec-date/encode-upper-bound date))) + #system/date"1969" "7F" + #system/date-time"1969" "7F")) + + (testing "year-month" + (are [date hex] (= hex (bs/hex (codec-date/encode-upper-bound date))) + #system/date"1969-12" "7F" + #system/date-time"1969-12" "7F")) + + (testing "local-date" + (are [date hex] (= hex (bs/hex (codec-date/encode-upper-bound date))) + #system/date"1969-12-31" "7F" + #system/date-time"1969-12-31" "7F")) + + (testing "local-date-time" + (are [date hex] (= hex (bs/hex (codec-date/encode-upper-bound date))) + #system/date-time"1969-12-31T23:59:59" "7F")) + + (testing "offset-date-time" + (are [date hex] (= hex (bs/hex (codec-date/encode-upper-bound date))) + (OffsetDateTime/of 1969 12 31 23 59 59 0 ZoneOffset/UTC) "7F" + (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours 2)) "6FE3DF" + (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours 1)) "6FF1EF" + (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours -1)) "900E0F" + (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours -2)) "901C1F"))) + + +(deftest encode-range-test + (testing "extract lower bound" + (satisfies-prop 100 + (prop/for-all [date (s/gen :system/date)] + (= (codec-date/lower-bound-bytes (codec-date/encode-range date)) + (codec-date/encode-lower-bound date))))) + + (testing "extract upper bound" + (satisfies-prop 100 + (prop/for-all [date (s/gen :system/date)] + (= (codec-date/upper-bound-bytes (codec-date/encode-range date)) + (codec-date/encode-upper-bound date)))))) diff --git a/modules/db/test/blaze/db/impl/codec_spec.clj b/modules/db/test/blaze/db/impl/codec_spec.clj index 8a0b6e6da..71ca65cc6 100644 --- a/modules/db/test/blaze/db/impl/codec_spec.clj +++ b/modules/db/test/blaze/db/impl/codec_spec.clj @@ -6,12 +6,10 @@ [blaze.db.impl.codec :as codec] [blaze.db.impl.codec.spec] [blaze.fhir.spec] - [blaze.fhir.spec.type.system :as system] [blaze.fhir.spec.type.system-spec] + [blaze.fhir.spec.type.system.spec] [clojure.spec.alpha :as s] - [clojure.test.check]) - (:import - [java.time ZoneId])) + [clojure.test.check])) @@ -59,23 +57,6 @@ :ret byte-string?) -(s/fdef codec/date-lb - :args (s/cat :zone-id #(instance? ZoneId %) - :date-time (s/or :date system/date? :date-time system/date-time?)) - :ret byte-string?) - - -(s/fdef codec/date-ub - :args (s/cat :zone-id #(instance? ZoneId %) - :date-time (s/or :date system/date? :date-time system/date-time?)) - :ret byte-string?) - - -(s/fdef codec/date-lb-ub - :args (s/cat :lb byte-string? :ub byte-string?) - :ret byte-string?) - - (s/fdef codec/number :args (s/cat :number number?) :ret byte-string?) diff --git a/modules/db/test/blaze/db/impl/codec_test.clj b/modules/db/test/blaze/db/impl/codec_test.clj index 89ecdb1b0..d12a405eb 100644 --- a/modules/db/test/blaze/db/impl/codec_test.clj +++ b/modules/db/test/blaze/db/impl/codec_test.clj @@ -11,8 +11,7 @@ [clojure.test.check.generators :as gen] [clojure.test.check.properties :as prop]) (:import - [java.nio.charset StandardCharsets] - [java.time OffsetDateTime ZoneOffset])) + [java.nio.charset StandardCharsets])) (set! *warn-on-reflection* true) @@ -67,83 +66,12 @@ (bs/to-string (apply codec/string [s]) StandardCharsets/UTF_8))))) -(def zo - (ZoneOffset/ofHours 0)) - - -(deftest date-lb-test - (testing "year" - (are [date hex] (= hex (bs/hex (codec/date-lb zo date))) - #system/date"1970" "80" - #system/date-time"1970" "80")) - - (testing "year-month" - (are [date hex] (= hex (bs/hex (codec/date-lb zo date))) - #system/date"1970-01" "80" - #system/date-time"1970-01" "80")) - - (testing "local-date" - (are [date hex] (= hex (bs/hex (codec/date-lb zo date))) - #system/date"1970-01-01" "80" - #system/date-time"1970-01-01" "80")) - - (testing "local-date-time" - (are [date hex] (= hex (bs/hex (codec/date-lb zo date))) - #system/date-time"1970-01-01T00:00" "80")) - - (testing "offset-date-time" - (are [date hex] (= hex (bs/hex (codec/date-lb zo date))) - (OffsetDateTime/of 1970 1 1 0 0 0 0 ZoneOffset/UTC) "80" - (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours 2)) "6FE3E0" - (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours 1)) "6FF1F0" - (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours -1)) "900E10" - (OffsetDateTime/of 1970 1 1 0 0 0 0 (ZoneOffset/ofHours -2)) "901C20"))) - - -(deftest date-ub-test - (testing "year" - (are [date hex] (= hex (bs/hex (codec/date-ub zo date))) - #system/date"1969" "7F" - #system/date-time"1969" "7F")) - - (testing "year-month" - (are [date hex] (= hex (bs/hex (codec/date-ub zo date))) - #system/date"1969-12" "7F" - #system/date-time"1969-12" "7F")) - - (testing "local-date" - (are [date hex] (= hex (bs/hex (codec/date-ub zo date))) - #system/date"1969-12-31" "7F" - #system/date-time"1969-12-31" "7F")) - - (testing "local-date-time" - (are [date hex] (= hex (bs/hex (codec/date-ub zo date))) - #system/date-time"1969-12-31T23:59:59" "7F")) - - (testing "offset-date-time" - (are [date hex] (= hex (bs/hex (codec/date-ub zo date))) - (OffsetDateTime/of 1969 12 31 23 59 59 0 ZoneOffset/UTC) "7F" - (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours 2)) "6FE3DF" - (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours 1)) "6FF1EF" - (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours -1)) "900E0F" - (OffsetDateTime/of 1969 12 31 23 59 59 0 (ZoneOffset/ofHours -2)) "901C1F"))) - - -(deftest date-lb-ub-test - (testing "extract lower bound" - (is (= - (codec/date-lb-ub->lb - (codec/date-lb-ub (codec/date-lb zo #system/date"2020") (codec/date-ub zo #system/date"2020"))) - (codec/date-lb zo #system/date"2020")))) - - (testing "extract upper bound" - (is (= - (codec/date-lb-ub->ub - (codec/date-lb-ub (codec/date-lb zo #system/date"2020") (codec/date-ub zo #system/date"2020"))) - (codec/date-ub zo #system/date"2020"))))) - - (deftest number-test + (testing "encode/decode" + (satisfies-prop 10000 + (prop/for-all [i (s/gen int?)] + (= i (codec/decode-number (codec/number i)))))) + (testing "long" (are [n hex] (= hex (bs/hex (codec/number n))) Long/MIN_VALUE "3F8000000000000000" diff --git a/modules/db/test/blaze/db/impl/search_param/date_test.clj b/modules/db/test/blaze/db/impl/search_param/date_test.clj index 9649c60c8..b1a274080 100644 --- a/modules/db/test/blaze/db/impl/search_param/date_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/date_test.clj @@ -3,6 +3,7 @@ [blaze.byte-buffer :as bb] [blaze.byte-string-spec] [blaze.db.impl.codec :as codec] + [blaze.db.impl.codec.date :as codec-date] [blaze.db.impl.index.search-param-value-resource-spec] [blaze.db.impl.index.search-param-value-resource-test-util :as sp-vr-tu] [blaze.db.impl.search-param :as search-param] @@ -22,7 +23,7 @@ [juxt.iota :refer [given]] [taoensso.timbre :as log]) (:import - [java.time LocalDate OffsetDateTime ZoneId ZoneOffset])) + [java.time Instant])) (set! *warn-on-reflection* true) @@ -69,15 +70,27 @@ (given (search-param/compile-values (birth-date-param search-param-registry) nil ["ne2020"]) ::anom/category := ::anom/unsupported - ::anom/message := "Unsupported prefix `ne` in search parameter `birthdate`.")))) + ::anom/message := "Unsupported prefix `ne` in search parameter `birthdate`.")) + + (testing "less than" + (given (search-param/compile-values + (birth-date-param search-param-registry) nil ["lt2020"]) + [0 :op] := :lt + [0 :lower-bound] := (codec-date/encode-lower-bound #system/date"2020"))))) -(defn- date-lb [date-time] - (codec/date-lb (ZoneId/systemDefault) date-time)) +(defn- lower-bound-instant [date-range-bytes] + (-> date-range-bytes + codec-date/lower-bound-bytes + codec/decode-number + Instant/ofEpochSecond)) -(defn- date-ub [date-time] - (codec/date-ub (ZoneId/systemDefault) date-time)) +(defn- upper-bound-instant [date-range-bytes] + (-> date-range-bytes + codec-date/upper-bound-bytes + codec/decode-number + Instant/ofEpochSecond)) (deftest index-entries-test @@ -96,9 +109,8 @@ (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "birthdate" :type := "Patient" - :v-hash := (codec/date-lb-ub - (date-lb (LocalDate/of 2020 2 4)) - (date-ub (LocalDate/of 2020 2 4))) + [:v-hash lower-bound-instant] := (Instant/parse "2020-02-04T00:00:00Z") + [:v-hash upper-bound-instant] := (Instant/parse "2020-02-04T23:59:59Z") :id := "id-142629" :hash-prefix := (hash/prefix hash))))) @@ -113,17 +125,12 @@ (sr/get search-param-registry "death-date" "Patient") [] hash patient)] - (testing "the entry is about both bounds of `2020-01-01T00:00:00Z`" + (testing "the entry is about both bounds of `2019-11-16T23:14:29Z`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "death-date" :type := "Patient" - :v-hash := (codec/date-lb-ub - (date-lb - (OffsetDateTime/of 2019 11 17 0 14 29 0 - (ZoneOffset/ofHours 1))) - (date-ub - (OffsetDateTime/of 2019 11 17 0 14 29 0 - (ZoneOffset/ofHours 1)))) + [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") + [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") :id := "id-142629" :hash-prefix := (hash/prefix hash)))))) @@ -146,13 +153,8 @@ (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "date" :type := "Encounter" - :v-hash := (codec/date-lb-ub - (date-lb - (OffsetDateTime/of 2019 11 17 0 14 29 0 - (ZoneOffset/ofHours 1))) - (date-ub - (OffsetDateTime/of 2019 11 17 0 44 29 0 - (ZoneOffset/ofHours 1)))) + [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") + [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:44:29Z") :id := "id-160224" :hash-prefix := (hash/prefix hash)))) @@ -173,9 +175,8 @@ (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "date" :type := "Encounter" - :v-hash := (codec/date-lb-ub - codec/date-min-bound - (date-ub (LocalDate/of 2019 11 17))) + [:v-hash lower-bound-instant] := (Instant/parse "0001-01-01T00:00:00Z") + [:v-hash upper-bound-instant] := (Instant/parse "2019-11-17T23:59:59Z") :id := "id-160224" :hash-prefix := (hash/prefix hash))))) @@ -196,11 +197,8 @@ (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "date" :type := "Encounter" - :v-hash := (codec/date-lb-ub - (date-lb - (OffsetDateTime/of 2019 11 17 0 14 29 0 - (ZoneOffset/ofHours 1))) - codec/date-max-bound) + [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") + [:v-hash upper-bound-instant] := (Instant/parse "9999-12-31T23:59:59Z") :id := "id-160224" :hash-prefix := (hash/prefix hash))))))) @@ -219,13 +217,8 @@ (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "issued" :type := "DiagnosticReport" - :v-hash := (codec/date-lb-ub - (date-lb - (OffsetDateTime/of 2019 11 17 0 14 29 917 - (ZoneOffset/ofHours 1))) - (date-ub - (OffsetDateTime/of 2019 11 17 0 14 29 917 - (ZoneOffset/ofHours 1)))) + [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") + [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") :id := "id-155607" :hash-prefix := (hash/prefix hash)))))) diff --git a/modules/db/test/blaze/db/impl/search_param_test.clj b/modules/db/test/blaze/db/impl/search_param_test.clj index 19d0082ee..7226e5c74 100644 --- a/modules/db/test/blaze/db/impl/search_param_test.clj +++ b/modules/db/test/blaze/db/impl/search_param_test.clj @@ -2,6 +2,7 @@ (:require [blaze.byte-buffer :as bb] [blaze.db.impl.codec :as codec] + [blaze.db.impl.codec.date :as codec-date] [blaze.db.impl.index.resource-search-param-value-test-util :as r-sp-v-tu] [blaze.db.impl.index.search-param-value-resource-spec] [blaze.db.impl.index.search-param-value-resource-test-util :as sp-vr-tu] @@ -11,15 +12,12 @@ [blaze.fhir.hash :as hash] [blaze.fhir.hash-spec] [blaze.fhir.spec.type] - [blaze.fhir.spec.type.system :as system] [blaze.fhir.structure-definition-repo] [blaze.test-util :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [integrant.core :as ig] - [juxt.iota :refer [given]]) - (:import - [java.time ZoneId])) + [juxt.iota :refer [given]])) (set! *warn-on-reflection* true) @@ -59,8 +57,8 @@ :upper-bound := upper-bound) "2020-10-30" :eq - (codec/date-lb (ZoneId/systemDefault) (system/parse-date-time "2020-10-30")) - (codec/date-ub (ZoneId/systemDefault) (system/parse-date-time "2020-10-30")))))) + (codec-date/encode-lower-bound #system/date-time"2020-10-30") + (codec-date/encode-upper-bound #system/date-time"2020-10-30"))))) (deftest index-entries-test diff --git a/modules/db/test/blaze/db/node/resource_indexer_test.clj b/modules/db/test/blaze/db/node/resource_indexer_test.clj index be707b928..b9d9803e3 100644 --- a/modules/db/test/blaze/db/node/resource_indexer_test.clj +++ b/modules/db/test/blaze/db/node/resource_indexer_test.clj @@ -3,6 +3,7 @@ [blaze.byte-string :as bs] [blaze.byte-string-spec] [blaze.db.impl.codec :as codec] + [blaze.db.impl.codec.date :as codec-date] [blaze.db.impl.index.compartment.resource-test-util :as cr-tu] [blaze.db.impl.index.compartment.search-param-value-resource-test-util :as c-sp-vr-tu] @@ -32,7 +33,7 @@ [integrant.core :as ig] [taoensso.timbre :as log]) (:import - [java.time Instant LocalDate ZoneId])) + [java.time Instant LocalDate])) (set! *warn-on-reflection* true) @@ -252,13 +253,7 @@ ["code" (codec/v-hash "code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "system-204435|code-204441")] - ["onset-date" (codec/date-lb-ub - (codec/date-lb - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)) - (codec/date-ub - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)))] + ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") @@ -281,13 +276,7 @@ ["code" (codec/v-hash "code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "system-204435|code-204441")] - ["onset-date" (codec/date-lb-ub - (codec/date-lb - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)) - (codec/date-ub - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)))] + ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") @@ -315,13 +304,7 @@ ["code" (codec/v-hash "code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "system-204435|code-204441")] - ["onset-date" (codec/date-lb-ub - (codec/date-lb - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)) - (codec/date-ub - (ZoneId/systemDefault) - (LocalDate/of 2020 1 30)))] + ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") @@ -398,13 +381,7 @@ (bs/concat (codec/v-hash "code-193824") (codec/quantity "http://unitsofmeasure.org|kg/m2" 23.42M))] - ["date" (codec/date-lb-ub - (codec/date-lb - (ZoneId/systemDefault) - (LocalDate/of 2005 6 17)) - (codec/date-ub - (ZoneId/systemDefault) - (LocalDate/of 2005 6 17)))] + ["date" (codec-date/encode-range (LocalDate/of 2005 6 17))] ["category" (codec/v-hash "system-193558|code-193603")] ["category" (codec/v-hash "system-193558|")] ["category" (codec/v-hash "code-193603")] diff --git a/modules/fhir-structure/src/blaze/fhir/spec/type/system/spec.clj b/modules/fhir-structure/src/blaze/fhir/spec/type/system/spec.clj index e17e57db5..31a06c1de 100644 --- a/modules/fhir-structure/src/blaze/fhir/spec/type/system/spec.clj +++ b/modules/fhir-structure/src/blaze/fhir/spec/type/system/spec.clj @@ -14,3 +14,10 @@ (s/gen (s/int-in 1 10000)) (s/gen (s/int-in 1 13)) (s/gen (s/int-in 1 29)))))) + + +(s/def :system/date-time system/date-time?) + + +(s/def :system/date-or-date-time + (s/or :date :system/date :date-time :system/date-time)) From 407294f45c9b817c8e2e0396ac32efe563f8c160 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 16 Dec 2022 23:52:51 +0100 Subject: [PATCH 084/124] Update Dependencies --- deps.edn | 6 +++--- modules/byte-buffer/deps.edn | 2 +- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/test-util/deps.edn | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deps.edn b/deps.edn index 6970f5e48..47ad85ccb 100644 --- a/deps.edn +++ b/deps.edn @@ -41,7 +41,7 @@ {:mvn/version "1.3.6"} org.slf4j/slf4j-nop - {:mvn/version "2.0.5"}} + {:mvn/version "2.0.6"}} :aliases {:build @@ -80,10 +80,10 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.2.962"} + {:mvn/version "2.2.970"} org.slf4j/slf4j-nop - {:mvn/version "2.0.5"}} + {:mvn/version "2.0.6"}} :main-opts ["-m" "antq.core" diff --git a/modules/byte-buffer/deps.edn b/modules/byte-buffer/deps.edn index 57a6906ae..252c1ce36 100644 --- a/modules/byte-buffer/deps.edn +++ b/modules/byte-buffer/deps.edn @@ -1,6 +1,6 @@ {:deps {com.google.protobuf/protobuf-java - {:mvn/version "3.21.11"}} + {:mvn/version "3.21.12"}} :aliases {:test diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index 39aeb3e56..d66b1cc74 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -5,7 +5,7 @@ {:mvn/version "31.1-jre"} com.google.protobuf/protobuf-java - {:mvn/version "3.21.11"} + {:mvn/version "3.21.12"} com.fasterxml.jackson.core/jackson-databind {:mvn/version "2.14.1"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index c1a143263..9b43478aa 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.85.Final"}} + {:mvn/version "4.1.86.Final"}} :aliases {:test diff --git a/modules/test-util/deps.edn b/modules/test-util/deps.edn index 63cfcbd5b..601b768af 100644 --- a/modules/test-util/deps.edn +++ b/modules/test-util/deps.edn @@ -25,4 +25,4 @@ {:mvn/version "1.1.1"} org.slf4j/slf4j-nop - {:mvn/version "2.0.5"}}} + {:mvn/version "2.0.6"}}} From 9b2a28c81b17411d26ba8d34639d9f7dfa090d61 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sat, 17 Dec 2022 16:39:13 +0100 Subject: [PATCH 085/124] Push Docker Image after Integration Tests --- .github/scripts/revinclude.sh | 2 +- .github/workflows/build.yml | 184 ++++++++++++++++++++++------------ 2 files changed, 122 insertions(+), 64 deletions(-) diff --git a/.github/scripts/revinclude.sh b/.github/scripts/revinclude.sh index c4ad7f0ff..0b87aac40 100755 --- a/.github/scripts/revinclude.sh +++ b/.github/scripts/revinclude.sh @@ -7,7 +7,7 @@ EXPECTED_NUM_CONDITIONS=$(curl -s "$BASE/Condition?_summary=count" | jq -r .tota EXPECTED_NUM_ENCOUNTERS=$(curl -s "$BASE/Encounter?_summary=count" | jq -r .total) EXPECTED_NUM_PROCEDURES=$(curl -s "$BASE/Procedure?_summary=count" | jq -r .total) -blazectl --server $BASE download Patient -q '_revinclude=Observation:subject&_revinclude=Condition:subject&_revinclude=Procedure:subject&_revinclude=Encounter:subject' -o output.ndjson +blazectl --server $BASE download Patient -q '_count=1&_revinclude=Observation:subject&_revinclude=Condition:subject&_revinclude=Procedure:subject&_revinclude=Encounter:subject' -o output.ndjson ACTUAL_NUM_PATIENTS=$(jq -r .resourceType output.ndjson | grep -c Patient) ACTUAL_NUM_OBSERVATIONS=$(jq -r .resourceType output.ndjson | grep -c Observation) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 3ffd7beaa..d27634a78 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -16,7 +16,7 @@ on: jobs: lint: - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Clojure @@ -73,7 +73,7 @@ jobs: - '11' - '17' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -104,7 +104,7 @@ jobs: needs: [ test ] - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -146,7 +146,7 @@ jobs: - '11' - '17' - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -174,7 +174,7 @@ jobs: build: needs: [ test, test-root ] - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -200,8 +200,11 @@ jobs: - name: Build Uberjar run: make uberjar - - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + - name: Upload Blaze Uberjar + uses: actions/upload-artifact@v3 + with: + name: blaze-uberjar + path: target/blaze-0.18.4-standalone.jar - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -213,9 +216,29 @@ jobs: tags: blaze:latest outputs: type=docker,dest=/tmp/blaze.tar + - name: Upload Blaze Image + uses: actions/upload-artifact@v3 + with: + name: blaze-image + path: /tmp/blaze.tar + + image-scan: + needs: build + runs-on: ubuntu-22.04 + + steps: + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + - name: Load Blaze Image run: docker load --input /tmp/blaze.tar + - name: Check out Git repository + uses: actions/checkout@v3 + - name: Run Trivy vulnerability scanner uses: aquasecurity/trivy-action@master with: @@ -229,51 +252,9 @@ jobs: with: sarif_file: trivy-results.sarif - - name: Upload Blaze Image - uses: actions/upload-artifact@v3 - with: - name: blaze-image - path: /tmp/blaze.tar - - - name: Login to GitHub Container Registry - uses: docker/login-action@v2 - with: - registry: ghcr.io - username: ${{ github.repository_owner }} - password: ${{ secrets.CR_PAT }} - - - name: Login to DockerHub - uses: docker/login-action@v2 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Docker meta - id: docker-meta - uses: docker/metadata-action@v4 - with: - images: | - samply/blaze - ghcr.io/samply/blaze - tags: | - type=schedule - type=ref,event=branch - type=ref,event=pr - type=semver,pattern={{version}} - type=semver,pattern={{major}}.{{minor}} - - - name: Build and push - uses: docker/build-push-action@v3 - with: - context: . - platforms: linux/amd64,linux/arm64 - push: true - tags: ${{ steps.docker-meta.outputs.tags }} - labels: ${{ steps.docker-meta.outputs.labels }} - integration-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -334,7 +315,7 @@ jobs: run: .github/scripts/download-resources-query.sh Observation "code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9" 2399 - name: Download Observation Resources with all LOINC Codes - run: .github/scripts/download-resources-query.sh Observation "code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9,http://loinc.org|1920-8,http://loinc.org|1960-4,http://loinc.org|1975-2,http://loinc.org|1988-5,http://loinc.org|19926-5,http://loinc.org|19994-3,http://loinc.org|2019-8,http://loinc.org|2028-9,http://loinc.org|20454-5,http://loinc.org|20505-4,http://loinc.org|20565-8,http://loinc.org|20570-8,http://loinc.org|2069-3,http://loinc.org|2075-0,http://loinc.org|2085-9,http://loinc.org|2093-3,http://loinc.org|21000-5,http://loinc.org|2157-6,http://loinc.org|2160-0,http://loinc.org|21905-5,http://loinc.org|21906-3,http://loinc.org|21907-1,http://loinc.org|21908-9,http://loinc.org|2276-4,http://loinc.org|2339-0,http://loinc.org|2345-7,http://loinc.org|2498-4,http://loinc.org|2500-7,http://loinc.org|2502-3,http://loinc.org|2514-8,http://loinc.org|2532-0,http://loinc.org|25428-4,http://loinc.org|2571-8,http://loinc.org|26881-3,http://loinc.org|2703-7,http://loinc.org|2708-6,http://loinc.org|2713-6,http://loinc.org|2744-1,http://loinc.org|2823-3,http://loinc.org|28245-9,http://loinc.org|2857-1,http://loinc.org|2885-2,http://loinc.org|29463-7,http://loinc.org|2947-0,http://loinc.org|2951-2,http://loinc.org|3094-0,http://loinc.org|32167-9,http://loinc.org|32207-3,http://loinc.org|32465-7,http://loinc.org|32623-1,http://loinc.org|33728-7,http://loinc.org|33756-8,http://loinc.org|33762-6,http://loinc.org|33914-3,http://loinc.org|33959-8,http://loinc.org|38208-5,http://loinc.org|38265-5,http://loinc.org|38483-4,http://loinc.org|39156-5,http://loinc.org|44667-4,http://loinc.org|44963-7,http://loinc.org|4544-3,http://loinc.org|4548-4,http://loinc.org|46240-8,http://loinc.org|46288-7,http://loinc.org|48065-7,http://loinc.org|49765-1,http://loinc.org|55277-8,http://loinc.org|5767-9,http://loinc.org|5770-3,http://loinc.org|5778-6,http://loinc.org|57905-2,http://loinc.org|5792-7,http://loinc.org|5794-3,http://loinc.org|5797-6,http://loinc.org|5799-2,http://loinc.org|5802-4,http://loinc.org|5803-2,http://loinc.org|5804-0,http://loinc.org|5811-5,http://loinc.org|5902-2,http://loinc.org|59032-3,http://loinc.org|5905-5,http://loinc.org|59408-5,http://loinc.org|59557-9,http://loinc.org|59576-9,http://loinc.org|6075-6,http://loinc.org|6082-2,http://loinc.org|6085-5,http://loinc.org|6095-4,http://loinc.org|6106-9,http://loinc.org|6158-0,http://loinc.org|6189-5,http://loinc.org|6206-7,http://loinc.org|6246-3,http://loinc.org|6248-9,http://loinc.org|6273-7,http://loinc.org|6276-0,http://loinc.org|6298-4,http://loinc.org|6299-2,http://loinc.org|6301-6,http://loinc.org|63513-6,http://loinc.org|65750-2,http://loinc.org|66519-0,http://loinc.org|66524-0,http://loinc.org|66529-9,http://loinc.org|66534-9,http://loinc.org|6690-2,http://loinc.org|6768-6,http://loinc.org|6833-8,http://loinc.org|6844-5,http://loinc.org|69453-9,http://loinc.org|704-7,http://loinc.org|706-2,http://loinc.org|711-2,http://loinc.org|713-8,http://loinc.org|718-7,http://loinc.org|71802-3,http://loinc.org|72106-8,http://loinc.org|72166-2,http://loinc.org|72514-3,http://loinc.org|7258-7,http://loinc.org|731-0,http://loinc.org|736-9,http://loinc.org|742-7,http://loinc.org|751-8,http://loinc.org|75325-1,http://loinc.org|76690-7,http://loinc.org|770-8,http://loinc.org|77606-2,http://loinc.org|777-3,http://loinc.org|785-6,http://loinc.org|786-4,http://loinc.org|787-2,http://loinc.org|788-0,http://loinc.org|789-8,http://loinc.org|80382-5,http://loinc.org|80383-3,http://loinc.org|8302-2,http://loinc.org|8310-5,http://loinc.org|8331-1,http://loinc.org|8478-0,http://loinc.org|85318-4,http://loinc.org|85319-2,http://loinc.org|85337-4,http://loinc.org|85339-0,http://loinc.org|85352-3,http://loinc.org|85354-9,http://loinc.org|88020-3,http://loinc.org|88021-1,http://loinc.org|88040-1,http://loinc.org|88262-1,http://loinc.org|8867-4,http://loinc.org|89579-7,http://loinc.org|91148-7,http://loinc.org|92130-4,http://loinc.org|92131-2,http://loinc.org|92134-6,http://loinc.org|92138-7,http://loinc.org|92139-5,http://loinc.org|92140-3,http://loinc.org|92141-1,http://loinc.org|92142-9,http://loinc.org|9279-1,http://loinc.org|94040-3,http://loinc.org|94531-1,http://loinc.org|9843-4,http://loinc.org|99999-0" 42929 + run: .github/scripts/download-resources-query.sh Observation "_count=500&code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9,http://loinc.org|1920-8,http://loinc.org|1960-4,http://loinc.org|1975-2,http://loinc.org|1988-5,http://loinc.org|19926-5,http://loinc.org|19994-3,http://loinc.org|2019-8,http://loinc.org|2028-9,http://loinc.org|20454-5,http://loinc.org|20505-4,http://loinc.org|20565-8,http://loinc.org|20570-8,http://loinc.org|2069-3,http://loinc.org|2075-0,http://loinc.org|2085-9,http://loinc.org|2093-3,http://loinc.org|21000-5,http://loinc.org|2157-6,http://loinc.org|2160-0,http://loinc.org|21905-5,http://loinc.org|21906-3,http://loinc.org|21907-1,http://loinc.org|21908-9,http://loinc.org|2276-4,http://loinc.org|2339-0,http://loinc.org|2345-7,http://loinc.org|2498-4,http://loinc.org|2500-7,http://loinc.org|2502-3,http://loinc.org|2514-8,http://loinc.org|2532-0,http://loinc.org|25428-4,http://loinc.org|2571-8,http://loinc.org|26881-3,http://loinc.org|2703-7,http://loinc.org|2708-6,http://loinc.org|2713-6,http://loinc.org|2744-1,http://loinc.org|2823-3,http://loinc.org|28245-9,http://loinc.org|2857-1,http://loinc.org|2885-2,http://loinc.org|29463-7,http://loinc.org|2947-0,http://loinc.org|2951-2,http://loinc.org|3094-0,http://loinc.org|32167-9,http://loinc.org|32207-3,http://loinc.org|32465-7,http://loinc.org|32623-1,http://loinc.org|33728-7,http://loinc.org|33756-8,http://loinc.org|33762-6,http://loinc.org|33914-3,http://loinc.org|33959-8,http://loinc.org|38208-5,http://loinc.org|38265-5,http://loinc.org|38483-4,http://loinc.org|39156-5,http://loinc.org|44667-4,http://loinc.org|44963-7,http://loinc.org|4544-3,http://loinc.org|4548-4,http://loinc.org|46240-8,http://loinc.org|46288-7,http://loinc.org|48065-7,http://loinc.org|49765-1,http://loinc.org|55277-8,http://loinc.org|5767-9,http://loinc.org|5770-3,http://loinc.org|5778-6,http://loinc.org|57905-2,http://loinc.org|5792-7,http://loinc.org|5794-3,http://loinc.org|5797-6,http://loinc.org|5799-2,http://loinc.org|5802-4,http://loinc.org|5803-2,http://loinc.org|5804-0,http://loinc.org|5811-5,http://loinc.org|5902-2,http://loinc.org|59032-3,http://loinc.org|5905-5,http://loinc.org|59408-5,http://loinc.org|59557-9,http://loinc.org|59576-9,http://loinc.org|6075-6,http://loinc.org|6082-2,http://loinc.org|6085-5,http://loinc.org|6095-4,http://loinc.org|6106-9,http://loinc.org|6158-0,http://loinc.org|6189-5,http://loinc.org|6206-7,http://loinc.org|6246-3,http://loinc.org|6248-9,http://loinc.org|6273-7,http://loinc.org|6276-0,http://loinc.org|6298-4,http://loinc.org|6299-2,http://loinc.org|6301-6,http://loinc.org|63513-6,http://loinc.org|65750-2,http://loinc.org|66519-0,http://loinc.org|66524-0,http://loinc.org|66529-9,http://loinc.org|66534-9,http://loinc.org|6690-2,http://loinc.org|6768-6,http://loinc.org|6833-8,http://loinc.org|6844-5,http://loinc.org|69453-9,http://loinc.org|704-7,http://loinc.org|706-2,http://loinc.org|711-2,http://loinc.org|713-8,http://loinc.org|718-7,http://loinc.org|71802-3,http://loinc.org|72106-8,http://loinc.org|72166-2,http://loinc.org|72514-3,http://loinc.org|7258-7,http://loinc.org|731-0,http://loinc.org|736-9,http://loinc.org|742-7,http://loinc.org|751-8,http://loinc.org|75325-1,http://loinc.org|76690-7,http://loinc.org|770-8,http://loinc.org|77606-2,http://loinc.org|777-3,http://loinc.org|785-6,http://loinc.org|786-4,http://loinc.org|787-2,http://loinc.org|788-0,http://loinc.org|789-8,http://loinc.org|80382-5,http://loinc.org|80383-3,http://loinc.org|8302-2,http://loinc.org|8310-5,http://loinc.org|8331-1,http://loinc.org|8478-0,http://loinc.org|85318-4,http://loinc.org|85319-2,http://loinc.org|85337-4,http://loinc.org|85339-0,http://loinc.org|85352-3,http://loinc.org|85354-9,http://loinc.org|88020-3,http://loinc.org|88021-1,http://loinc.org|88040-1,http://loinc.org|88262-1,http://loinc.org|8867-4,http://loinc.org|89579-7,http://loinc.org|91148-7,http://loinc.org|92130-4,http://loinc.org|92131-2,http://loinc.org|92134-6,http://loinc.org|92138-7,http://loinc.org|92139-5,http://loinc.org|92140-3,http://loinc.org|92141-1,http://loinc.org|92142-9,http://loinc.org|9279-1,http://loinc.org|94040-3,http://loinc.org|94531-1,http://loinc.org|9843-4,http://loinc.org|99999-0" 42929 - name: Download Observation Resources of male Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=male" 20466 @@ -346,7 +327,7 @@ jobs: run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "-_lastUpdated" 20466 - name: Download Observation Resources of female Patients - run: .github/scripts/download-resources-query.sh Observation "patient.gender=female" 22463 + run: .github/scripts/download-resources-query.sh Observation "_count=500&patient.gender=female" 22463 - name: Download Observation Resources of female Patients Sorted Ascending run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "_lastUpdated" 22463 @@ -548,7 +529,7 @@ jobs: not-enforcing-referential-integrity-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -593,7 +574,7 @@ jobs: # caused Jetty to close the stream. small-transactions-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -634,7 +615,7 @@ jobs: include-without-referential-integrity-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -660,7 +641,7 @@ jobs: chaining-without-referential-integrity-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -688,7 +669,7 @@ jobs: # resolve to existing resources bundle-with-references-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -717,7 +698,7 @@ jobs: jepsen-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -772,7 +753,7 @@ jobs: openid-auth-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -807,7 +788,7 @@ jobs: distributed-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Check out Git repository @@ -889,7 +870,7 @@ jobs: run: .github/scripts/download-resources-query.sh Observation "code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9" 2399 - name: Download Observation Resources with all LOINC Codes - run: .github/scripts/download-resources-query.sh Observation "code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9,http://loinc.org|1920-8,http://loinc.org|1960-4,http://loinc.org|1975-2,http://loinc.org|1988-5,http://loinc.org|19926-5,http://loinc.org|19994-3,http://loinc.org|2019-8,http://loinc.org|2028-9,http://loinc.org|20454-5,http://loinc.org|20505-4,http://loinc.org|20565-8,http://loinc.org|20570-8,http://loinc.org|2069-3,http://loinc.org|2075-0,http://loinc.org|2085-9,http://loinc.org|2093-3,http://loinc.org|21000-5,http://loinc.org|2157-6,http://loinc.org|2160-0,http://loinc.org|21905-5,http://loinc.org|21906-3,http://loinc.org|21907-1,http://loinc.org|21908-9,http://loinc.org|2276-4,http://loinc.org|2339-0,http://loinc.org|2345-7,http://loinc.org|2498-4,http://loinc.org|2500-7,http://loinc.org|2502-3,http://loinc.org|2514-8,http://loinc.org|2532-0,http://loinc.org|25428-4,http://loinc.org|2571-8,http://loinc.org|26881-3,http://loinc.org|2703-7,http://loinc.org|2708-6,http://loinc.org|2713-6,http://loinc.org|2744-1,http://loinc.org|2823-3,http://loinc.org|28245-9,http://loinc.org|2857-1,http://loinc.org|2885-2,http://loinc.org|29463-7,http://loinc.org|2947-0,http://loinc.org|2951-2,http://loinc.org|3094-0,http://loinc.org|32167-9,http://loinc.org|32207-3,http://loinc.org|32465-7,http://loinc.org|32623-1,http://loinc.org|33728-7,http://loinc.org|33756-8,http://loinc.org|33762-6,http://loinc.org|33914-3,http://loinc.org|33959-8,http://loinc.org|38208-5,http://loinc.org|38265-5,http://loinc.org|38483-4,http://loinc.org|39156-5,http://loinc.org|44667-4,http://loinc.org|44963-7,http://loinc.org|4544-3,http://loinc.org|4548-4,http://loinc.org|46240-8,http://loinc.org|46288-7,http://loinc.org|48065-7,http://loinc.org|49765-1,http://loinc.org|55277-8,http://loinc.org|5767-9,http://loinc.org|5770-3,http://loinc.org|5778-6,http://loinc.org|57905-2,http://loinc.org|5792-7,http://loinc.org|5794-3,http://loinc.org|5797-6,http://loinc.org|5799-2,http://loinc.org|5802-4,http://loinc.org|5803-2,http://loinc.org|5804-0,http://loinc.org|5811-5,http://loinc.org|5902-2,http://loinc.org|59032-3,http://loinc.org|5905-5,http://loinc.org|59408-5,http://loinc.org|59557-9,http://loinc.org|59576-9,http://loinc.org|6075-6,http://loinc.org|6082-2,http://loinc.org|6085-5,http://loinc.org|6095-4,http://loinc.org|6106-9,http://loinc.org|6158-0,http://loinc.org|6189-5,http://loinc.org|6206-7,http://loinc.org|6246-3,http://loinc.org|6248-9,http://loinc.org|6273-7,http://loinc.org|6276-0,http://loinc.org|6298-4,http://loinc.org|6299-2,http://loinc.org|6301-6,http://loinc.org|63513-6,http://loinc.org|65750-2,http://loinc.org|66519-0,http://loinc.org|66524-0,http://loinc.org|66529-9,http://loinc.org|66534-9,http://loinc.org|6690-2,http://loinc.org|6768-6,http://loinc.org|6833-8,http://loinc.org|6844-5,http://loinc.org|69453-9,http://loinc.org|704-7,http://loinc.org|706-2,http://loinc.org|711-2,http://loinc.org|713-8,http://loinc.org|718-7,http://loinc.org|71802-3,http://loinc.org|72106-8,http://loinc.org|72166-2,http://loinc.org|72514-3,http://loinc.org|7258-7,http://loinc.org|731-0,http://loinc.org|736-9,http://loinc.org|742-7,http://loinc.org|751-8,http://loinc.org|75325-1,http://loinc.org|76690-7,http://loinc.org|770-8,http://loinc.org|77606-2,http://loinc.org|777-3,http://loinc.org|785-6,http://loinc.org|786-4,http://loinc.org|787-2,http://loinc.org|788-0,http://loinc.org|789-8,http://loinc.org|80382-5,http://loinc.org|80383-3,http://loinc.org|8302-2,http://loinc.org|8310-5,http://loinc.org|8331-1,http://loinc.org|8478-0,http://loinc.org|85318-4,http://loinc.org|85319-2,http://loinc.org|85337-4,http://loinc.org|85339-0,http://loinc.org|85352-3,http://loinc.org|85354-9,http://loinc.org|88020-3,http://loinc.org|88021-1,http://loinc.org|88040-1,http://loinc.org|88262-1,http://loinc.org|8867-4,http://loinc.org|89579-7,http://loinc.org|91148-7,http://loinc.org|92130-4,http://loinc.org|92131-2,http://loinc.org|92134-6,http://loinc.org|92138-7,http://loinc.org|92139-5,http://loinc.org|92140-3,http://loinc.org|92141-1,http://loinc.org|92142-9,http://loinc.org|9279-1,http://loinc.org|94040-3,http://loinc.org|94531-1,http://loinc.org|9843-4,http://loinc.org|99999-0" 42929 + run: .github/scripts/download-resources-query.sh Observation "_count=500&code=http://loinc.org|10230-1,http://loinc.org|10480-2,http://loinc.org|10834-0,http://loinc.org|14804-9,http://loinc.org|14959-1,http://loinc.org|1742-6,http://loinc.org|1751-7,http://loinc.org|17861-6,http://loinc.org|18262-6,http://loinc.org|19123-9,http://loinc.org|1920-8,http://loinc.org|1960-4,http://loinc.org|1975-2,http://loinc.org|1988-5,http://loinc.org|19926-5,http://loinc.org|19994-3,http://loinc.org|2019-8,http://loinc.org|2028-9,http://loinc.org|20454-5,http://loinc.org|20505-4,http://loinc.org|20565-8,http://loinc.org|20570-8,http://loinc.org|2069-3,http://loinc.org|2075-0,http://loinc.org|2085-9,http://loinc.org|2093-3,http://loinc.org|21000-5,http://loinc.org|2157-6,http://loinc.org|2160-0,http://loinc.org|21905-5,http://loinc.org|21906-3,http://loinc.org|21907-1,http://loinc.org|21908-9,http://loinc.org|2276-4,http://loinc.org|2339-0,http://loinc.org|2345-7,http://loinc.org|2498-4,http://loinc.org|2500-7,http://loinc.org|2502-3,http://loinc.org|2514-8,http://loinc.org|2532-0,http://loinc.org|25428-4,http://loinc.org|2571-8,http://loinc.org|26881-3,http://loinc.org|2703-7,http://loinc.org|2708-6,http://loinc.org|2713-6,http://loinc.org|2744-1,http://loinc.org|2823-3,http://loinc.org|28245-9,http://loinc.org|2857-1,http://loinc.org|2885-2,http://loinc.org|29463-7,http://loinc.org|2947-0,http://loinc.org|2951-2,http://loinc.org|3094-0,http://loinc.org|32167-9,http://loinc.org|32207-3,http://loinc.org|32465-7,http://loinc.org|32623-1,http://loinc.org|33728-7,http://loinc.org|33756-8,http://loinc.org|33762-6,http://loinc.org|33914-3,http://loinc.org|33959-8,http://loinc.org|38208-5,http://loinc.org|38265-5,http://loinc.org|38483-4,http://loinc.org|39156-5,http://loinc.org|44667-4,http://loinc.org|44963-7,http://loinc.org|4544-3,http://loinc.org|4548-4,http://loinc.org|46240-8,http://loinc.org|46288-7,http://loinc.org|48065-7,http://loinc.org|49765-1,http://loinc.org|55277-8,http://loinc.org|5767-9,http://loinc.org|5770-3,http://loinc.org|5778-6,http://loinc.org|57905-2,http://loinc.org|5792-7,http://loinc.org|5794-3,http://loinc.org|5797-6,http://loinc.org|5799-2,http://loinc.org|5802-4,http://loinc.org|5803-2,http://loinc.org|5804-0,http://loinc.org|5811-5,http://loinc.org|5902-2,http://loinc.org|59032-3,http://loinc.org|5905-5,http://loinc.org|59408-5,http://loinc.org|59557-9,http://loinc.org|59576-9,http://loinc.org|6075-6,http://loinc.org|6082-2,http://loinc.org|6085-5,http://loinc.org|6095-4,http://loinc.org|6106-9,http://loinc.org|6158-0,http://loinc.org|6189-5,http://loinc.org|6206-7,http://loinc.org|6246-3,http://loinc.org|6248-9,http://loinc.org|6273-7,http://loinc.org|6276-0,http://loinc.org|6298-4,http://loinc.org|6299-2,http://loinc.org|6301-6,http://loinc.org|63513-6,http://loinc.org|65750-2,http://loinc.org|66519-0,http://loinc.org|66524-0,http://loinc.org|66529-9,http://loinc.org|66534-9,http://loinc.org|6690-2,http://loinc.org|6768-6,http://loinc.org|6833-8,http://loinc.org|6844-5,http://loinc.org|69453-9,http://loinc.org|704-7,http://loinc.org|706-2,http://loinc.org|711-2,http://loinc.org|713-8,http://loinc.org|718-7,http://loinc.org|71802-3,http://loinc.org|72106-8,http://loinc.org|72166-2,http://loinc.org|72514-3,http://loinc.org|7258-7,http://loinc.org|731-0,http://loinc.org|736-9,http://loinc.org|742-7,http://loinc.org|751-8,http://loinc.org|75325-1,http://loinc.org|76690-7,http://loinc.org|770-8,http://loinc.org|77606-2,http://loinc.org|777-3,http://loinc.org|785-6,http://loinc.org|786-4,http://loinc.org|787-2,http://loinc.org|788-0,http://loinc.org|789-8,http://loinc.org|80382-5,http://loinc.org|80383-3,http://loinc.org|8302-2,http://loinc.org|8310-5,http://loinc.org|8331-1,http://loinc.org|8478-0,http://loinc.org|85318-4,http://loinc.org|85319-2,http://loinc.org|85337-4,http://loinc.org|85339-0,http://loinc.org|85352-3,http://loinc.org|85354-9,http://loinc.org|88020-3,http://loinc.org|88021-1,http://loinc.org|88040-1,http://loinc.org|88262-1,http://loinc.org|8867-4,http://loinc.org|89579-7,http://loinc.org|91148-7,http://loinc.org|92130-4,http://loinc.org|92131-2,http://loinc.org|92134-6,http://loinc.org|92138-7,http://loinc.org|92139-5,http://loinc.org|92140-3,http://loinc.org|92141-1,http://loinc.org|92142-9,http://loinc.org|9279-1,http://loinc.org|94040-3,http://loinc.org|94531-1,http://loinc.org|9843-4,http://loinc.org|99999-0" 42929 - name: Download Observation Resources of male Patients run: .github/scripts/download-resources-query.sh Observation "patient.gender=male" 20466 @@ -901,7 +882,7 @@ jobs: run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=male" "-_lastUpdated" 20466 - name: Download Observation Resources of female Patients - run: .github/scripts/download-resources-query.sh Observation "patient.gender=female" 22463 + run: .github/scripts/download-resources-query.sh Observation "_count=500&patient.gender=female" 22463 - name: Download Observation Resources of female Patients Sorted Ascending run: .github/scripts/download-resources-query-sort.sh Observation "patient.gender=female" "_lastUpdated" 22463 @@ -1109,7 +1090,7 @@ jobs: jepsen-distributed-test: needs: build - runs-on: ubuntu-20.04 + runs-on: ubuntu-22.04 steps: - name: Setup Java @@ -1185,3 +1166,80 @@ jobs: - name: Docker Stats run: docker stats --no-stream + + push-image: + needs: + - test-coverage + - image-scan + - integration-test + - not-enforcing-referential-integrity-test + - small-transactions-test + - include-without-referential-integrity-test + - chaining-without-referential-integrity-test + - bundle-with-references-test + - jepsen-test + - openid-auth-test + - distributed-test + - jepsen-distributed-test + runs-on: ubuntu-22.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Download Blaze Uberjar + uses: actions/download-artifact@v3 + with: + name: blaze-uberjar + path: target/blaze-0.18.4-standalone.jar + + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Set up QEMU + uses: docker/setup-qemu-action@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Login to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.repository_owner }} + password: ${{ secrets.CR_PAT }} + + - name: Login to DockerHub + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_USERNAME }} + password: ${{ secrets.DOCKERHUB_TOKEN }} + + - name: Docker meta + id: docker-meta + uses: docker/metadata-action@v4 + with: + images: | + samply/blaze + ghcr.io/samply/blaze + tags: | + type=schedule + type=ref,event=branch + type=ref,event=pr + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: . + platforms: linux/amd64,linux/arm64 + push: true + tags: ${{ steps.docker-meta.outputs.tags }} + labels: ${{ steps.docker-meta.outputs.labels }} From d8eeb55f85613d6284492ce2803b2180d148fa5b Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sat, 17 Dec 2022 20:34:21 +0100 Subject: [PATCH 086/124] Release v0.18.5 --- .github/workflows/build.yml | 4 ++-- CHANGELOG.md | 18 ++++++++++++++++++ Dockerfile | 4 ++-- README.md | 4 ++-- build.clj | 2 +- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ .../src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 10 files changed, 37 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d27634a78..687f61009 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -204,7 +204,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.4-standalone.jar + path: target/blaze-0.18.5-standalone.jar - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -1191,7 +1191,7 @@ jobs: uses: actions/download-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.4-standalone.jar + path: target/blaze-0.18.5-standalone.jar - name: Download Blaze Image uses: actions/download-artifact@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ebd3717b..5bf46f3d3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,23 @@ # Changelog +## v0.18.5 + +### New Features + +* Support HTTP Header If-None-Match in Update Interactions ([#782](https://github.com/samply/blaze/issues/782)) +* Add a Backport of R5 Quantity Stratum Values ([#853](https://github.com/samply/blaze/pull/853)) +* Return CodeableConcepts as is for Strata ([#851](https://github.com/samply/blaze/pull/851)) +* Implement CQL ToRatio ([#840](https://github.com/samply/blaze/pull/840)) +* Implement CQL Concept Data Type ([#839](https://github.com/samply/blaze/pull/839)) + +### Bugfixes + +* Fix Date Search ([#864](https://github.com/samply/blaze/pull/864)) + +### Operation + +* Decrease Size of Docker Image ([#858](https://github.com/samply/blaze/pull/858)) + ## v0.18.4 ### Bugfixes diff --git a/Dockerfile b/Dockerfile index e3574f899..28f098a6e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.18.4-standalone.jar /app/ +COPY target/blaze-0.18.5-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.18.4-standalone.jar"] +CMD ["java", "-jar", "blaze-0.18.5-standalone.jar"] diff --git a/README.md b/README.md index efdee3c2e..5d8c2ee8c 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.4][5] +Latest release: [v0.18.5][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 8f28a8d0d..38df84cc8 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.18.4") +(def version "0.18.5") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 12140a159..e921695c5 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.4 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.5 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.4" + "version": "0.18.5" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 2050b7ed4..67d8fe115 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.4). Look for `blaze-0.18.4-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.5). Look for `blaze-0.18.5-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.4-standalone.jar +java -jar blaze-0.18.5-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.4-standalone.jar +STORAGE=standalone java -jar blaze-0.18.5-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.4-standalone.jar +java -jar blaze-0.18.5-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.4 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.5 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.4" + "version": "0.18.5" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index bc1ad24ae..bc353232e 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-11-12" + :date #fhir/dateTime"2022-12-17" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2022-11-12"} + :releaseDate #fhir/dateTime"2022-12-17"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 924cdf32a..c4de06c9e 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.4 + 0.18.5 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 0f330c57c..972bdea3a 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.4" + {:blaze/version "0.18.5" :blaze/clock {} From 36f1b19988453d597b0589f7efba3225f0d513ab Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 9 Jan 2023 18:20:29 +0100 Subject: [PATCH 087/124] Update Dependencies --- deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/rocksdb/deps.edn | 2 +- modules/server/deps.edn | 2 +- modules/spec/deps.edn | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/deps.edn b/deps.edn index 47ad85ccb..06da2d8cc 100644 --- a/deps.edn +++ b/deps.edn @@ -47,7 +47,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.8.5" :git/sha "9c738da"}} + {:git/tag "v0.9.0" :git/sha "8c93e0c"}} :ns-default build} :test diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 9f36150be..6a3a2492d 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -16,7 +16,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.8.5" :git/sha "9c738da"}} + {:git/tag "v0.9.0" :git/sha "8c93e0c"}} :ns-default build} :test diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index a67b74e1a..c3d8a84eb 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.7.3"}} + {:mvn/version "7.8.3"}} :aliases {:test diff --git a/modules/server/deps.edn b/modules/server/deps.edn index a6e5a8433..02c3ef742 100644 --- a/modules/server/deps.edn +++ b/modules/server/deps.edn @@ -6,7 +6,7 @@ {:local/root "../module-base"} org.eclipse.jetty/jetty-server - {:mvn/version "9.4.49.v20220914"} + {:mvn/version "9.4.50.v20221201"} ring/ring-jetty-adapter {:mvn/version "1.9.6" diff --git a/modules/spec/deps.edn b/modules/spec/deps.edn index 3232a6c0e..e7265026f 100644 --- a/modules/spec/deps.edn +++ b/modules/spec/deps.edn @@ -1,3 +1,3 @@ {:deps {clojure.java-time/clojure.java-time - {:mvn/version "1.1.0"}}} + {:mvn/version "1.2.0"}}} From ff7961040dd83df113dfa0b843e74d7366ad1b66 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 9 Jan 2023 18:11:28 +0100 Subject: [PATCH 088/124] Add Measure ID to Anomaly --- .../transaction/bundle/url_spec.clj | 2 +- .../fhir/operation/evaluate_measure/cql.clj | 17 ++--- .../operation/evaluate_measure/measure.clj | 65 +++++++++-------- .../evaluate_measure/measure/spec.clj | 3 +- .../evaluate_measure/measure_test.clj | 71 ++++++++++--------- 5 files changed, 80 insertions(+), 78 deletions(-) diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle/url_spec.clj b/modules/interaction/test/blaze/interaction/transaction/bundle/url_spec.clj index a9ccc5606..68e9dba24 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle/url_spec.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle/url_spec.clj @@ -8,5 +8,5 @@ (s/fdef url/match-url :args (s/cat :url string?) :ret (s/or :type-level (s/tuple :fhir.resource/type) - :instance-level (s/tuple :fhir.resource/type :blaze.resource/id) + :instance-level :blaze.fhir/local-ref-tuple :other nil?)) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj index bc4e8e8a0..28cee6bae 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj @@ -151,9 +151,7 @@ (defn- expression-def [{:keys [expression-defs]} name] - (if-let [def (get expression-defs name)] - def - (missing-expression-anom name))) + (or (get expression-defs name) (missing-expression-anom name))) (defn- check-context [subject-type {:keys [context name]}] @@ -302,9 +300,7 @@ (defn- function-def [{:keys [function-defs]} name] - (if-let [def (get function-defs name)] - def - (missing-function-anom name))) + (or (get function-defs name) (missing-function-anom name))) (defn calc-function-strata @@ -352,11 +348,10 @@ (defn- def [{:keys [expression-defs population-basis] :as context} name] - (if-let [def (get expression-defs name)] - def - (if (string? population-basis) - (function-def context name) - (missing-expression-anom name)))) + (or (get expression-defs name) + (if (string? population-basis) + (function-def context name) + (missing-expression-anom name)))) (defn- defs [context names] diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj index 6c7cdca03..3dd84f7da 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj @@ -1,6 +1,6 @@ (ns blaze.fhir.operation.evaluate-measure.measure (:require - [blaze.anomaly :as ba :refer [when-ok]] + [blaze.anomaly :as ba :refer [if-ok when-ok]] [blaze.coll.core :as coll] [blaze.cql-translator :as cql-translator] [blaze.db.api :as d] @@ -227,7 +227,8 @@ id subject-type (* duration 1e3))) -(defn- evaluate-groups [{:keys [subject-type] :as context} id groups] +(defn- evaluate-groups + [{:keys [subject-type] :as context} {:keys [id] groups :group}] (log/debug (format "Start evaluating Measure with ID `%s`..." id)) (let [timer (prom/timer evaluate-duration-seconds subject-type)] (when-ok [groups (evaluate-groups* context groups)] @@ -269,7 +270,8 @@ (defn- measure-report - [report-type subject-handle measure-ref now start end result duration] + [{:keys [now report-type subject-handle] :as context} measure + {[start end] :period} [{:keys [result]} duration]] (cond-> {:fhir/type :fhir/MeasureReport :extension [(eval-duration duration)] @@ -279,7 +281,7 @@ "population" #fhir/code"summary" "subject-list" #fhir/code"subject-list" "subject" #fhir/code"individual") - :measure (type/canonical measure-ref) + :measure (type/canonical (canonical context measure)) :date now :period (type/map->Period @@ -289,8 +291,8 @@ subject-handle (assoc :subject (type/map->Reference {:reference (local-ref subject-handle)})) - (seq (:result result)) - (assoc :group (:result result)))) + (seq result) + (assoc :group result))) (defn- now [clock] @@ -326,35 +328,36 @@ (subject-handle* db subject-type subject-ref))) +(defn- enhance-context + [{:keys [clock db] :as context} measure {:keys [report-type subject-ref]}] + (let [subject-type (subject-type measure)] + (when-ok [{:keys [expression-defs function-defs parameter-default-values]} (compile-primary-library db measure) + subject-handle (some->> subject-ref (subject-handle db subject-type))] + (cond-> + (assoc context + :db db + :now (now clock) + :expression-defs expression-defs + :function-defs function-defs + :parameters parameter-default-values + :subject-type subject-type + :report-type report-type + :luids (successive-luids context)) + subject-handle + (assoc :subject-handle subject-handle))))) + + (defn evaluate-measure "Evaluates `measure` inside `period` in `db` with evaluation time of `now`. Returns an already completed MeasureReport under :resource which isn't persisted and optional :tx-ops or an anomaly in case of errors." {:arglists '([context measure params])} - [{:keys [clock db] :as context} - {:keys [id] groups :group :as measure} - {:keys [report-type subject-ref] [start end] :period}] - (when-ok [{:keys [expression-defs function-defs parameter-default-values]} (compile-primary-library db measure) - now (now clock) - subject-type (subject-type measure) - subject-handle (some->> subject-ref (subject-handle db subject-type)) - context (cond-> - (assoc context - :db db - :now now - :expression-defs expression-defs - :function-defs function-defs - :parameters parameter-default-values - :subject-type subject-type - :report-type report-type - :luids (successive-luids context)) - subject-handle - (assoc :subject-handle subject-handle)) - [groups duration] (evaluate-groups context id groups)] + [context {:keys [id] :as measure} params] + (if-ok [context (enhance-context context measure params) + [{:keys [tx-ops]} :as result] (evaluate-groups context measure)] (cond-> - {:resource - (measure-report report-type subject-handle (canonical context measure) - now start end groups duration)} - (seq (:tx-ops groups)) - (assoc :tx-ops (:tx-ops groups))))) + {:resource (measure-report context measure params result)} + (seq tx-ops) + (assoc :tx-ops tx-ops)) + #(assoc % :measure-id id))) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj index f901bcae9..9a4bc8eec 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure/spec.clj @@ -2,6 +2,7 @@ (:require [blaze.db.spec] [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] + [blaze.fhir.spec.spec] [clojure.spec.alpha :as s])) @@ -11,7 +12,7 @@ (s/def ::measure/subject-ref (s/or :id :blaze.resource/id - :local-ref (s/tuple :fhir.resource/type :blaze.resource/id))) + :local-ref :blaze.fhir/local-ref-tuple)) (s/def ::measure/population-handle diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index 38f3e8ca8..4d9d4cb09 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -240,7 +240,8 @@ (let [db (d/db node) context {:clock clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} - measure {:fhir/type :fhir/Measure :id "0" + measure-id "measure-id-133021" + measure {:fhir/type :fhir/Measure :id measure-id :library [#fhir/canonical"0"] :group [{:fhir/type :fhir.Measure/group @@ -248,46 +249,47 @@ [{:fhir/type :fhir.Measure.group/population :code (population-concept "initial-population")}]}]} params {:period [#system/date"2000" #system/date"2020"] - :report-type "population" - :subject "Patient/0"}] + :report-type "population"}] (given (measure/evaluate-measure context measure params) ::anom/category := ::anom/incorrect ::anom/message := "Missing criteria." + :measure-id := measure-id :fhir/issue := "required" :fhir.issue/expression := "Measure.group[0].population[0]")))) (testing "single subject" - (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] - [[[:put {:fhir/type :fhir/Patient :id "0"}] - [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" - :content [(library-content library-gender)]}]]] + (doseq [subject-ref ["0" ["Patient" "0"]]] + (with-system-data + [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}] + [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" + :content [(library-content library-gender)]}]]] - (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db - :blaze/base-url "" ::reitit/router router} - measure {:fhir/type :fhir/Measure :id "0" - :library [#fhir/canonical"0"] - :group - [{:fhir/type :fhir.Measure/group - :population - [{:fhir/type :fhir.Measure.group/population - :code (population-concept "initial-population") - :criteria (cql-expression "InInitialPopulation")}]}]} - params {:period [#system/date"2000" #system/date"2020"] - :report-type "subject" - :subject-ref "0"}] - (given (:resource (measure/evaluate-measure context measure params)) - :fhir/type := :fhir/MeasureReport - :status := #fhir/code"complete" - :type := #fhir/code"individual" - :measure := #fhir/canonical"/0" - [:subject :reference] := "Patient/0" - :date := #system/date-time"1970-01-01T00:00Z" - :period := #fhir/Period{:start #system/date-time"2000" - :end #system/date-time"2020"} - [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" - [:group 0 :population 0 :count] := 1))) + (let [db (d/db node) + context {:clock clock :rng-fn fixed-rng-fn :db db + :blaze/base-url "" ::reitit/router router} + measure {:fhir/type :fhir/Measure :id "0" + :library [#fhir/canonical"0"] + :group + [{:fhir/type :fhir.Measure/group + :population + [{:fhir/type :fhir.Measure.group/population + :code (population-concept "initial-population") + :criteria (cql-expression "InInitialPopulation")}]}]} + params {:period [#system/date"2000" #system/date"2020"] + :report-type "subject" + :subject-ref subject-ref}] + (given (:resource (measure/evaluate-measure context measure params)) + :fhir/type := :fhir/MeasureReport + :status := #fhir/code"complete" + :type := #fhir/code"individual" + :measure := #fhir/canonical"/0" + [:subject :reference] := "Patient/0" + :date := #system/date-time"1970-01-01T00:00Z" + :period := #fhir/Period{:start #system/date-time"2000" + :end #system/date-time"2020"} + [:group 0 :population 0 :code :coding 0 :code] := #fhir/code"initial-population" + [:group 0 :population 0 :count] := 1)))) (testing "with stratifiers" (with-system-data @@ -583,7 +585,8 @@ (given (evaluate "q30-stratifier-with-missing-expression") ::anom/category := ::anom/incorrect, ::anom/message := "Missing expression with name `SampleMaterialTypeCategory`.", - :expression-name := "SampleMaterialTypeCategory") + :expression-name := "SampleMaterialTypeCategory" + :measure-id := "0") (given (first-stratifier-strata (evaluate "q31-stratifier-storage-temperature")) [0 :value :text type/value] := "temperature2to10" From 3925cb1b40ad9a591d91251ce3b221ca0d734caa Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 10 Jan 2023 16:25:16 +0100 Subject: [PATCH 089/124] Add Integration Test Uploading a Big Transaction That transaction contains 25.000 resources. --- ...188f6-12eb-419f-68a6-a0a245aa4b92.json.bz2 | Bin 0 -> 2390300 bytes .github/workflows/build.yml | 38 +++++++++++++++++- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 .github/test-data/big-tx/ff4188f6-12eb-419f-68a6-a0a245aa4b92.json.bz2 diff --git a/.github/test-data/big-tx/ff4188f6-12eb-419f-68a6-a0a245aa4b92.json.bz2 b/.github/test-data/big-tx/ff4188f6-12eb-419f-68a6-a0a245aa4b92.json.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..d5665f1173cd52925dd1cd8ce42df21963e744b6 GIT binary patch literal 2390300 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%0Ay{HJKr2@6SupptOd;2 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�_R8Ge+OwV{GDhOvh4a*pL^ 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�!h?u{EJ1d`A~htP{5AR>kUp_kBm?*ax0 zMGP1bBSk$x=uHT{cMuSzBZ3}6lh7oBN&pp(pyU7=5EZf9PwxBukN3m#>@P|7-fNA$ zk~K!wT=SaO@0{;@I<-{pD!c7g?oV=}f&XFfk>vE1oYD8UZP9yT1H~H#dz~#GvdSL2 zzN-GfbJgj|gO8Si3j(((F{-QEvya`rdtZF2tXY}=5QRC{rBM+TJ`j4&FXhfrzApp& z;D%&K_wUHejJ$CBH-Q$PN@Pa(EGyf1u5GmJIR3bB+fpFo&3D7)t}nS>=eJI4qQ9SA zdpo-x)4l$JIKlh!h>gvc?U$u>kC=td+wH5U(fIkxZ~C5#)mbMF8uR;q`F6*9(gvFN zj;bDVW=>=Kes`$5#C3Ih++2ma?(CjMdDD5dXmaV~+I(@OFRoz9Zd!wE_Q-&HkE~Jn z%AtHNt><-2i0$@umFX}mZNGRfglMmo1G%D1Dr8{ItJk3*e_fMzaPIn z-Lo?xy&5wHm+|-WY*EwYK}y#ea#7g5&}@|5=EkEh;CzkTtCG+BuNB)CrS6=yKqV1! z*gPV06@u&RLrE`UdlUiK_m+ASVZ<53wW0 zg06T%)rv+gR(Fhz&-%Jc`pQ9VoQ?XY(@K5t3*raQeWb|;d$^wtSqq;=P>=RF@@f=;>rC)I7&(s-a>!b6P>7}t7xX;$ZQWkxdM!jQ4jFv_4{PZO)iB5?S-mrLJ*RnwlNVFuf)w08<;&L8WXi2&dDp;+1ncw9E z*a-6I$}NfX(gBIaQ+C{!cAt0!c9MR|<*oV0QANYG;6KK=&U- z4jVeS0xoeiHZ=0DR4x%j0#83XVv)B3PZAkvOcPbLW$g-yTac+Y=;gRx-&!o5 z&Q$$Z_38D;CDXQV?54c4nq_AU0zO9abnlVo#T}&dKf?dxqtBgR=GR2_v4{O9%*gS1 zo{E(KJzbi|SE920FzO+C@UVd_Ney0Gonu?KRJ@k7nXXwX#HpQM!WbO;zwX%yws~UXnVzn8^8a_{|Nl^2rS}wkGT8C}u~GLN2g)mD5(2%m zyHM^5y=o!6k`5QW@b_Bt^3lGPIr7 z6~?lyo#ONS@Wo+SYoUT1#)1Uf!YeAHwCJr5dw{DQZ#|!k=Jw7ZH126@OL28qq49jl zEuMX_psZkDu7WB|zZBYRjjtsz(DT0?XgX@c$zDhg7W>y+*ufJv-R@P1@im79^>?-4 z*U~j|(Mo7?)kUvj*0NoG?R+D(uo;9I^~luZ@?eXy#_gHJ9t2zuehq$%Q~l z?ZPC{o25BbA7V8!BP}r6TxU4kI93{^A}s_~GBa%!9FkVfXe+TtVjEF~S*>Q7^3#w> zn?6W7NyuW5%pxqHSBeCS1OcU~f&xk$D=v`|4no?J{fah<(_;NoLdz<+NMV;uGPk@{ z^NM0H-h#snTR&}Q=7*&KwBbo9Nt32-K3Xf_6LvB~pPzh@#aG)L5$)@#8 z%#{aw6{G`{#kfetA&^r=iovBGSYMlM!VLAiVzMJS{3kD?kq^I(g33P)d8Z_Rl_USUICfo8p^teswCTcK3;nhIh^Yd zlI)tNQNqK$R&q}p&?HHMO{3_A5!8N3qOEpx$6R~!NMxBKyh0ll9K_=g$?HkLFDDJE zUi9=*l+p@HhXv(!{}(IFVh%f2hW(E+?9lRmq~R9yWfp9>xIv8+iB3-CQ|)^9Qe?1M zVOZoXuLlm6RuE}!X;nY#5n(ggC8||f+@9(vH063v11ao+<0TR6SNPB+{hca4wmqW3 z?FG080+B@sj`7}t*&bAok6o0X*F;#!**>k-0VLf{t;NpQ3g3dNK(rSQP7k1_Thm|U z_U5X!bl_=zRjRIqEUYlTwYUd{E^h3mB4;Led&&!XK&-E^o=y=NI2Wgt?N<`XOK!!G zl+MV{dd+A54=>E32N%DnsB~*BUidFrxOkq$8vY+wxS~b%vcrErSS${%MYi5wn)SGP zPNj%t7#Q46KsArMi#m{U&idJPZLUbbBl)uP%;1=-b6jtf1p0{U?ksuB$f4YlMCpx zjB^jUVf%9hN&fpX{dGz1yaq|hH^^rOsbTS#>6=_6Wxx5mT1Rh>PmW5uXm)!+kQLix z$v->{OZ8N{S>f;5TO#>p4qBe&Hcmj zXh6rUmV>PM@9CevA4+;J%DFSgY84gzXOJpa95`WM6mj17q}1;r{&_uV2n=eu2eF33MKgG^sdb_BwNk42Y&H3XQjHIU#Cs z$(lKAyehj%Y*H9&y|fQ(?P?$5lX6vltx zE@=g?j2T#t@9rWzWU49n8NC04wsS4B@11BAQbHK^)wM zsSdrC-G-I=P#`HPSBwvaUuE=w3mRhfXNIxV~-%TdfjTpYYHDZz2Y@}Kg!bMqTe~I_Nt9}3R|GGXsqY*4P`bT42J@nO3VSR z5XvK{NZ3eF%^By+0~L!#U$6?4>2 zeH3=AJ>^3_z!p+1V9BBiS-j0{r3>p4J(rc6io!t8onBf4yz+r0HsE>`hbDQ_^a>ahH45xl15I7Q2+-`DbiO zJdgDi`5pa|QUwVv1!GhoiEJfov7twNWVw?p-Uenv$d>1Gkrj`)eW+lNy|k93;-+Uu zfe^cNu^u#g^dZY+JU}-F+eBgC&eGG3<1x}eh=h4=t$UN2%g>fY!BR2X@i)17jgroKkgqm5*D@>vSIm8^X+2n^<-hSf6# z^|6=LLg_4BlKerIcxk@9Ml?U)8)+c8s5I3739wXt1;r=~Hb)K*@#Q-{5y84tnUiy~ z*b5zDx+s1)y(c)PT0mbVLP|WwLP`@-1-`1_m4_MDNn)s2?#{&e^axNU#G(p1W5Oz> zjf{*CP9(>ig6N>ttO>T{7(|U~MBmNyq}_5ulGO))NffsZZ@!bAW(9G;OZ zOtMO*&DHP35`xyPE}ZFw^A!cN(7OG)kjH{P!UPc0QTr=IB?z z(q=7X5wFa#m|)N1Bpi zbRaU?aS+xo>RA+g9?J9BuLx&Dp}MfmrBZr7yhKA6Wh*Mxwj0pRTqMGTSC_41ye?S1 zS_nOQ7ch~LL|iS<&;zBe7pnN{;%(`~ZM*6cHB2A2eIhs~ELmuQyIjR%yO5I9jtujl zvh&f&@p_TRGrL)wIfMI^#cHBh)7{;*rDU(Ld42g!l6xr*vqK6?Hgg7zZ$tW{P3!du z^kw2gWie4ejlh3?qH*DEKyjQGqb<1-w@C%Jr6e6CQjAQ4lG>_xSU;D_Lq4h0IWiJY?WweYcN2&&6OdB{9*->gdMM)IY^yK$)(VkWJyqV! zM+D0mJWNxbw{o=7i(>{+hQm;1{AZY0S>9GBb~T~%`CfUF0ic@`ixz}+6n(A1=%gKJhBG5iPs~CH1m@f8EK~s%7!m=i|1vR`lX!mNS8U%mCjgTFn&{7bz_W37> zibvl>%2t!3pB^?=ThW2>*kXi4R+s~~0oH}UoCPuSDlbW(P#zAaRGX@Z&84UwZzbP8 zVxRo}$WR%dLpdn95ieacK=f>E;}e~ecWgOs`#cj>F z(y3)(eBy!mz8oZ6MWxn4&vo2|{@)xp09BA@+ccOxR&;F>v zW3zqE3(74JX*sN%@{qS&Ts~%Z#ymsT82^b-9sd1T zrf%RY_xk2+T!oZgcbHV^9!G@s;@1Vv4`=Dg^{=j`FYMhIeD>gG@;LMJ5WTN+Y_9t= z;Ug$J;EPMa#5r{=7x5--)lDkw>-{H^i2S@S-q$hYF9B~k)cZw*Y;PiKZoD%9jji)O zQ2cmp?k27Kb>zPw#VBUMukv>Gtm8V(w>l=T~gTa0SJEa1G=SdGyHb z^dHhI@+081_i;)4nKe%bdV0@c#@pJvnsKa+Y^Yb&poX%TW{|O9nlbcI; zdoy6sptw!X#q`NP*$*z0#cM;(RiuZyvMF~hmgZTAq;+x4bF%hsDe$M03H2{W2QT%m zrw#opFc|UGY(J$~ZHgn>W*Hu6Crpr^th@lq%&s0{)tftt<7`bfBUe;aE#yz>+48PA z0s=V4h4vJ}P2U3eBr;kcgZwq=k(!mK!IjnuN^?@#bAw->TT-oeA&sspL*D z-lqipvWh}U!l67aB36N7PHSkjC@Mm=h*QmFL?}0D#4VRE-Dz?~!6w*sMEm~y?8f4e zKCk7Mj+)gLO;r~KHUaacbz0LH9ulWYtkO{#_j&nX-JT1V7WlMcqQBd$$rcis?=NFm zihnpgwT`~UC0(jDmKo*Fe*wLa0cuJsfnKfjGI%KEExL8|k)*vurGqmrwAyA|WBy8g zXz;?l`lAiSBQ99BdPMaN-F-{vgG6_Iwmbn~r2?L|=J2U7G(4ObGwwgT8NpWJ^61sy zYf0*^p(?%yRo=>gGs`KdRWeehkRsGiR_3BH0cqCj_6YIUS{!#)`iMV_H{bj8an?>Rqc) zch&fW4V-z;-Mzk5AJIO)#qLlUK;HswXV?Aff|P#9Jw^h*vaYL>eGzZ+$LrpZi2Hlg z*i4Rlxb+tE@zSvAoqn~Gpnc=EOXjc1d(`0b3mHz%T@-3kUtf5}Jm6E&YrKV_N=0f_K+Tb(#2-$lw9pF$=4r4hn)ugfGlfW6=x|1sTVKb;A-{f~R@1DB5uZQGbhD30^)>x0wc5DB|W zck8J+>+I3b?Mqxdn{Lh=5Z5{>`uIm0v(E~z#|AJA?owTi*}y?dCiOAKz{ZS>tut*I zTl+Bc!3%fCek((L&~YLWD19$DUB~3=8!yxO9lGE6mD2FLN*h(T)CpU^B{x)xv?iPO zkTec@3jag6+(qeOnZvE#2kD$=%^})qOw1gmsEiAU)O9I7<%=Zws#-QsQbAqM;mTZ*EG>yG6K zk9VxhJh|rW#=ox~$lhtQqR;)gyY(mT<>YcyW!ROAquc>k&vbkmi558SeY3rH%?P^U zAQ8ONe)4Aa<`LRA<&({Mf7p)!I&1*d>06Yg6fq&8=z3gK9f zq^aRE1>4-B?e9n5bvTahX%IPCf@I6l;4{sd%OuE57ek81kxOvsU1>K2yZ8LWsWsXN7A=j zO}CnUMkp))xcja#L`Veb(*u=4--=#I3bF`J^3PLHZhGBo!GO3F>>Qk09tivcZGcVd zt2OrEhfMeiV>Tu3KcA>b&-{gzL<^dQCEIdrkctLzd2GB=FSj#2H@A=B*Ml48eicYS zT%Y}6`(otzE&B&9lSNEjuKJ?UJs!S`V?nb=0S!{{z<^j>TOG7c2P9{nA?Re6FBy^uEO^==II|TdzG>MeP(webkYD_$v zfE?pj`F5pHf8v=v$Zpf^eWql8=kkn!KEE^>Sq$EPKF;5^;*(tlZp?6a#@x<~I+gQ< zAzbACzVlQH(Q)rv9X7-FcFfk24ySiPh1s8qZB*=3;rqkgcLf>n=TnwnX>G6WW`F?9 z&oQYga+cz+UwjTvwX4I}3S7$!INWhBHxu~hDi&xx2!>aZ&!8;cXc!oigjt6C%Rk=J z*(Ox-0~qangU%0I$FG9S8_$sn-lxkY?HdXj667$Z<$wmaD@nH#kp!2Yud?cr50m>2 z39)`0m~M|Y1W%oP+9lMt-;r#(1~Eyaf5UV<{=MGVX=xZ5UytjuqffeQQ411P?x;3x zoqH;m7WfYPOHa@cdk1!7j5TjgkM#9qQ=%lseiC*&bzYaf!13Sf*CJ$F{>7tbo1le{)ci8jhK0%)4DPlY(jHC1&pKzJ(>P@B(QQMyNiF7@yKO6=hQ@s&!$Gp zb^v?u^P6LqoiLOarQEYi3i%dkF#jGlZDKRx1S}dFKkEa9i(ApV}syaT55udB&y&CEJBc`AbfpZl^~(1SS@RW$H>W!iL@ z3u(v2dI&m^pl^FHea7;3y;4bcN2IOJO!1b9=zh zhUobbBz+ET-E1C~a*kCZwnH0g(RWX#zxJ@eE949CBWW-QU^>_)t`u@iYKR^KUV(CL^*0mW)$BU`#{wf@fsur;CGinGy2pFbJ@ssdo!9_6No4aRDW6`b z4+x}lTyVa-{`_j6(c_v+Q~ONuhxd#8-`Yy$J?}mZc>I2@4qexLqcTA3AV3A&uzxMy zH^Cp^bzd}IpI^L{@u=rz=v^`W=;%I3tp<0$TQk)p&@64ERGm9O&xFH?{R1SkBxbef zny@9T7mKO)9i~kPExyJ{_Vbmf3k2`en}XbwEoXG#QaDB@%5l6IKvCR(!&&Q7;4cn}CMpo5&_ZscE=nw;LkN^mEX7D%0(v~MjKd z(N6C!Wp|4BJOMv=-Wkp?w{SM>Nur+Ewt;!)7dK7(Z0DZ${PX3lPGa}r-px_fMbVGt zcZBKJK{GKn-8sju*Z0(whOr0yma`Qg_>;eVW;Z{JjOPO9UV+@jFy*|0qa2a(_)oTLH6Eslsp?G8FMr9k2nni&JXIiDvVo&+uLr7TL3i0A!E z;D7Eo(lnUaiz()%clVtLsYr+6J#1{Dkye6F&fKzFi$r?hx|nL5Ym)K(a>3Y5bU=?h z?R{f7XWpoE6*T{+F3uj%^lYhJjGt``DX33;Sv9x_(~gbYT5^~W;)g5Hmm-ovQ>vc; zLwX&2Bvpe7eCk~g7Vp^2%hEqTyw6omsC~j&RMZx>9VZ5U7VSirE=4=6?sLtJl zM9a*xwAt8G%Dz0NiJd=;tJh`B#5Df7ykX{bAVF8g6m6$`1ReV&5>eHR%Q<_enFsm9 zgnaZL6Sp5n@2=$Dcyi6>^Nqp1+yB0tzVVFX#{G}Fze`NSCIJxeCxxF|!Y`Z>{|)!5 zexI)rWYUo)Z}G>4F@eO!ZUV!nqv<)NxtHwa>_o9LAluqfND%^CXmu6G`*)y|P%c#< zKEjix%w4J%uSjbcb0|lu@LqaoB`FZEw%x9In##_}_du3M47w)hG~2Hz0j(6$b6U^| zo`gNoj1^QBkpD*T9WDanS8F?){*mEl8`lKVAM(|v?q1P+k#T#BnNX#|#5J^7?x2FL z&-{{IC{i_P`>{tG3sd4w#U$G`>+3Od8aJCZb-26XWtJ(G#;`=A2#Z6isBLX`LQtOKrxN9SYAE5X=A{tFPCaB7`!mI=?bqc5I8uE z8d+UpN*L*0n^%Y#qaC(y59vN@B^_ohTU}_*%3wRPC{s4(D71N!VU+{&eF`?f`^bk@ zG22Ng&W_w7x)HIQ>`pwA>c7y%=mcp_r}8o!gUS#~PEq(gf;g$;Bgfy71X*904rRYU zG{Qs85j=?H7fv&!s=k>nOj2`SS@>13Jp)NCwU!48$#Oxf($adUQxf7TLJ4{*N2hTi zj>T4O(q;k*jUjU=LVEUN#mOGfHi=`Ch-)ZwRCTPNW+ZNt8z~g)^q@wwsfwZrhuK=` z;xLQ-q8VcmwH1UZt47v)sba2F{EiG*p&nbPe{L}ONRi0m+X)4{8c>Fn~s-i3N#lBZO(x?%RZyU#VN~4Pt5AOa9wPegr>E z4+7ltUcyVN$f6Z(cDD;P`8{w@O3^1SAY*+gO9(Gjh$4b3s*-WDC1L%tgwny^v2I`()zkFm^pgOE}OifjY%+6Q&@SLhpK&8_0GDG zc|HNX?8p-Ly|3dN{FQtVXaJgC_?#>hdCD}EKXz;9mL}0m?Mk{Fp0L+E890{#0s`pD zudq!bbW^rfqJNV&&XeWg_&F5z7+!c${0@*^$qLW;Sl|{P3`N@-yPWL(V6>IxmeGwP z$Fh)k>RC@^$`SmQzC-dt>XSLtjQT$0nCWrCze0YC($gCHVZO=iX;CTfuiKecv)HCcxP6?isT&YPqg{@M?iBA$sY4 z2rNB7kh}i$gqGZBk&@~JK}Yk}@*CO^Hg?e>EhV&4RVncKHRHm#$k@|kX<=0WO5_e)76XL=1(~Hu z34!o-VW*lwUZ7&55t020LMFo!vCV=>;LcHSfy86f?*YSBu2zEuP zDqh`G-4O~@!_dcKLwouP8Zz4KMGLLft16+SBxa`Rq{3`S5m||ozbkFpbiI_bKvv*A zzT@6}?U;iUZ#YPEW29sLK&{(FX6hubMB#lWF8*Co`=;I-UHlL8%lI|Jyx_CBB z04xI(Y3(Tr6E}G!1@)t)z=QZ2;pl5^trSz{x(?|XhN{CjlL5uteeHa;EoyZXCbXCOc&g!v7BQh?S6+7DGS0yZpYf;jr-dwBPVOM~FDKb<#=dDX{2$>ji81 zvD2dm&_A~`5O&hFMUh7~@`GGesy@RL6rk1WlLt1%s<(Hy_0{>@TRCOQB0Z~)8@_+$ zL&WfBIL>EW0Lirx6IFa0J_Ons|Lvfomn(0Pbg7r3lQE&=;<=Gv)(1oR zfE1zcsYYir6?m*(6gS5)PNq&bWPJ)EVtlAxS1ooIlGop}bIz5@(;Ku-@H<&sF_Z2J zz-=dqbM9LLMK7RlZGht808-nve*|)MpK+nbfNe?=Mm?@_bqYKr8Zi2^?4h@3TIWmVFoA#7V=GeH7dbE8-eI^V-in-ofg2{kYFWZM z!5TTN&Dksy4ye-k6G#Vmweh!w9tcq_%q;gfSm5- zO_wZ9wH!!QgmfV~MoikU&e%-Q$u`x#Lp^2dCX`-V6uh*XY1AX90eLo!zm%0!=r+BI zR%E3L8;D~+J^*sD<{Z?XTOMBxoXp#bCW26HR*-v=c_MEbx1%DyB$FUM0x-5X$>Tm0 zC1hz{KvD7Rm5qc(?n~2G!k>HBp>3>2)~;TYIyYKd7fwHjRBA6MjffY5u#c_q8+=aa?GV2kLJTDm-x#P@B=7FyZJ20BTF*vCDR* zPM}{J?+7v0&`3O*IknXtKY3jZaj<$lVmy7l9Ct7hKFEJQAno7n<3bZak0cC>MOr-4 z;)b~>1~I#dw**DL!zB#Tc+m9=E$sQLK(@NEfxs6Bwz9=HncJgMr1xSE zpIN^EBdRoF-}IbO<15saf7wHedB!2F6+8e2^OD9thJ)Ax3NrjPv|@R&^y6}@MFm?q zaWbbj*HOs$b{73uSvP7};4s;!x|~;}`EEvYV6JSn2>V@dL0L?0h|21Sa1)0_sjqBB z%)IVD!eOV!w|RuPlwS)FiE=ywiKx@fQyYA@F%q%5y^OZZEXA)H*GYgfG25qD>iW=OU}=kUzl)7-ahR6<@7$b25W&-ei{pisbG` zthBqt%gafUqHn;SHMU;zsfsx`aqQfiK!2J@BFM@*ZYJrgt|lulPxGKGD*CW7D-kn0 z`-SqZnYIm-So%oK#ZsN(GZL6U*;=3y@Wn^)UCSlh^@VI{7^iHC;}t77jy8AQf=AFm z-|$vqut=QR!myiCtxMPpML0YxyBIkt2HlWW&zGtB&JSSjH+ea&r@jL)=%>(pyC+YE zWb z+Hx#^M{y!n)goz-XxU@-ds;(*5;UR%2CWaNe%(-j&LR^$4tkb|Gib~9-ca%9LEODY ziM(J=d^>lG{b;Rbye@pZDlCKI9t04))2&5blKHClWoLbGHB7Y3MCYzG7!($a*I?&> z&??rTMxm9*R^oxZ)#g8J>{aH&QI!3q{nvIC3yh9@I2)J%PBImc_nBnpFkzGDcyjS+ z&#Bq|-)GB)CuRK?!m^*3L&sa7)is8r>JBxEs<%9%(%$P?4WP0kf>0nLYk*eby1S&CY%%MD}roy{?{T79SX?yi2Y zG}y|f5NO(bF%vs%mYVNa8ObPYtNLc8Pz%L)mRv)Yd)*!vfUqI}c7Y5tB`A;4s6H{B z9m=kcI$2<9*)o6sed*q%wildg5h=a$w~Wqy-Dxkn zPc(sP-+XyV7E&aCdD!eTejI>k`KIWB`^KoESo3B59XP&&*_H(MF%C(@ChGCnwP0i} z1RtI6TcWqG@I0Rvln)Y<^y*wg@ihKPazk!OwrU zIkQ6h`#+mw#-i|hy?6Av3^T0xgOy}r3bD-9&eF?dP_=+s%;a?|O}z+$i;)q9Lem@1 z*;;d91fC&lRDKzkaV;?)sSXk%PR6+QrJou<((?IW zcR>EZrpGOXTPpYULvzcS&HD}zG>F8F2>+c>m>nTRV9!9x>1OtuzRl1qMdiGUz`l<& z9T6iGx-g3eV*JEdCsFIDR8Makf!oO%BDHOGA{B0y=D+!@+zQF1ZqnVd-rFS=Y*o#r zUvN&f1JdV|Ep0|qr8s5gQ+3plk6fGR11q%1b^_$G5vRCKxs$tyK zqWZRI#5cbD%=GepBmBIs;x^TqPYzmHftErZJE$AUgv2Oqf z_qafcnLw&SuQTt0U_=6wAb>ovq}`lQ4lr8;+_SicStgZQRF9S#@JOuW*UoChgD0AX zqO*!`+>05BlL5LfTW6TBquN3j*_$ytv9?WZjmiLQWoX6L>pLQ$Do>4`qWulZYW~jg zR8!cpLK=$4?cYx7u&}VY6Z_Nn%3|v$?~AV-<|cZl!jr#MEq{s~9<3ZCR^{7+HJ-@0 zw`yc`eo2l~6Zl$r#gFPz?o%@s!(p14vzmI!np<+_6Kw@rjPax?)3B+{!(-Zd3g1Q# zL?ld5&Gw?8?GxxSIG;}jRH+eT+vlOHi(Z|W5OTbj0Z*BH&C|Wxbi)BiO`{TnCde5W zYWL1g6-zd!8)ms27V0aewKL;SFOZL%euO{gA4gcvI>oshu?*+!)pG{UYY3`8a7erR zd__U|>PH3@_!|PS>KOaFs&6dDzZB6kdh0JI5)*lH+r&COxxUAH@5y|HSDQ7@I$!g16jD^gLLGp@HamPcUQ^NMVCFK9&_>KayXUqD~}%&7^joV zjexI(n<(RC{vh@YsBQTjAQAf1<+?-?X_Ptf6pYC59MY}%dG$owVDgyh=5Zi& z&Ps;2_U=RH2lG9|F_|YRb-*&{zpKYPUwOI}R~zsJnLY>mox)B$kBLm8M@NgjCV{oB z*+dSjNS}00b^6KwL|prJ4}BSw=Xc@xa9G?uSwVGQLpV`{5FDPI+z{*>oozg*BF9z2 zWsD5Fa_M4f3r{h6V>#12^b=f7`Uk{(>{N`WSmT&;vkCRlvV?-&-AM$$KdhM1*K$Z+ zrmQoF8SiAe5gbdy0w;mF85!i_R0_>%OMd&+Pc6$6O1G7=^#i^`m)pkr-1VQ5zcx-< z&`H8^SpVbg-5tcI3%HFB(qi&;&Js{Z3DnM#KY|z(>@j0xECs81s-b=6{nE|tleie( ztP9JSGxagQ;Ky4_UwSsatouJ0S-jCvbC%93_zBadRx+R+w_RbG1De4MoFFwTScd zrxo$@XC%zoj%|2T@}Rk8>ZUsk)^u5-EsK5Nx&RofQd!DEq_PT_Z>*>vd-S|d&x_)h zA`#-F=d&184MtHtGpokT8bmo<-P{_}S3DL%Zsj1qHZ|Qy2#euwxe~(G)cb(SnJddm z|EPQ>q&vtwkuB6EPBm?jq{|}-W2|&HjDypvwtF`fGR_a@8Zkr?caE3S`2uI8xXQg> zHB0t5){<3Xe{3rx5gq2rmav$az%P-kVBn1W32vLz2U=B{DNr1`(WB7TC_ri?{pYgdVs+e){kn>r4NuiRN8rN}%`aSV=u3dtSoJ032^2mG z?EOIgD3oE!Nfjd}m$Gww;kyp``K_S2L6HM;1M=3RO>rC16YEKLw{~!baEi%e#144C zoRzhDdWuU8Z5BmJ_N1ZSq{&Sw7>}`TBz0#lye}Pt=X8&$>wvqV4WMrau0112Pf&w!y|sDs@Xy$!A!N_6Vi8 zTeYj9BJ&7jMXz)2MV6^j4oP6PNj>?ooW$*II^+6lVFgHn&>i`MrsF%Jdd3E~^`f_7 zQeh`Sw~ns1rSUgxR3LS+=Orpt91NlKUfEO|V_kv}SE;MFzdN( zB)?FU^6+eB}C)t5zZoVXMdAA`1LUVF)gQ!?iQyV4Bs8N99;7|LCa zIXS56?@YU8+^@(qla@#_H69fdx(c{Hl!2I$u+}w?~%wu7dKjHcP5BOg+I!5`K#x zv$MI&82^op#ci`_E#u+g54eqf35n>(#vT2_ecRk6?fq%xB;I4k?&kw^HC<%Dq~9hD_2+~ftW;$8I(E<3lRCk2wSwfgwo zld<*!3bU}_>qtn7y5}s>mL{Hb{GEk?n5)jP;)jVu+)C9`IU()2*@swVK0Tkjch9z} zuPKOZDLvW~Bcw&PN#}ZmUnCuVd zm7v4ja(|>{A;qg<26H4Z=R(&UXB(@Jqk&&3x6D2Lxtrzo*_xk&%`?oj5R_hao=Xh- za(85ocmcr1=tFVvNMCcavQvS0-~Lw3KK=NUyHEkEm|df1R8gKwE8y_C&{x{Zx6{3@ zE4Qx%$Xt2gQG8WOtooz9HG3%LTwbzPxtg15@=}#u-;iGycxdxm?e*7lW} zB2Hs1lT@En=^9s|=X*4SdzB|EVTq1qUYw*Y&GS&eemzp&Mye?BlXMA^@Un+G0qQCi zy`>xs5EPE8eQS{P z36l)QX~N}GtE*!_j>KXDswdOd1e7kcF4oFAIaKSZj;Z^Ppq!l-e{FO^%p03G9(L8r zLLKS?Y~&1=ziwt~5Po|*Ln}I$ff#cJVoOsQKmFWku4eeUxxB?^V7TQ)IUgCZo|Y~3 z4c4a69k?pqh~NG(GJ=v{yD0Q*DR^GvSxhd@x^GtWA~0k+aQmJ_?5&8PKP9fTt#`Mh zCVGoAl2-xVjiDy|8SlT=aAds3Nz2LE=w5n|r3fLSBe{*F+W?H4^{)3O8&W<{a#~eq zW=sMX|40j?Z@EzR`W7z*-p%q>D&|m$-TXsggBCy?B_q@%YhF7-_?L($0mr-RZX8@* z#e7wKm6l>Q7zH+X4o5&H;P_LBLR#KhHMLj(#ueSoUpsS&S*= zOmCi)KCc$R^BzjwsPzkPey@WJBztSRe^jmHKm~Dn#x#-_+X!%sx$m-E#|FG z8SdRLUx&`{7xTM0vYlj(Ndc0A(w}vY!@%`Q=0}t5s!v6gOdPVjCGG#!dgbObJ&n$m z?~lp>G(~Aqe6)NzG+YOZRi=8HyZrp>4~7E|NKq`7oJQ++fGI z{`%p=svSpL{=(8BLFw)XLuU$7#I!{Lw$jly&B>Tl9>@mEtCoGNy$|PTtP@<9XNB+` zX8G%fYWMAUHY zCI%8jNa(%yCQU%PbO^nJ3K*(@G?88dp@Rs4&_P-#L8{V=p-L0!f)oMi(nOkIxp}|$ z``3Thy;+mVtf^-uGiT+Tv-f@+G`Xm z2K!eAGky-~2tS{*m#h0#d)#Ao@6kj+pcq@mV>mJQmyK9|f{nwA5y#*<9>XylBf2*D zTz*tW#I&%d<7;sD^HZF0jSZf|{6VrHiOrmkzIeEVig%?)y?8aHcOH|vhI zX9kaFLJ_yLOi7JP${vk3Hu`KaR7l`;TuMgKD#pAi#c0na#r>HBarXJSx99S#`D*uD`Li_R_sN$h%_u;-Ez#l}U%7Y8p zsA)qLU-K(wR^E;ZJc2o@-5WGM+CteLufsyG!ko4p+0KhKVCC0gh~V%i`S+3ZyG7%j zUpyzWJo!QhGPZBAqzA$@kypy|WR8CU2xh7k>r`z33*Z2hKu@8>;buAuFP7u|5%p)I zFPtl)v2swcyus7=^q@u>rMlPy>g&e<326tT`6Il3Lfkdz%*C51tQFqD%bL4>dLEY)v=|{i=P%*SY zHmX=WzR>E}kb6s2Go7$d{65sKU(Zg@E{6P0+%){CVF+}B;WFs_d_ znuZ)Hqki%9oQT5`pd671aRMk23_J%mp7Z?6d3DW#Tv&rFLv$+!flzdX)H!mwGpS?-SLOjE2wh0wr5_m)3; zhY90S_rOEMafIG;hCzo4>g!5f_&~UJEa?UB3yZc3VDcMigHmyr$};uxL*Sb03)Fnr zi0I6LW*@rUxGsKh&8s@0jg`Y86=ClcUTU+;7f-;3^Hh8QA;f(-6Z>k{)*z~#NOpiS zLj2dOV%TNL6ZyKb4eWT_tnl{$!f_jQ{TFOV88GtTzUBZFFAu;g(B20n8R;rDRRhN6Ga3ale_WpN0Q97?L7TwygPj$RO(=@uNT9nqJRwjlbd_xmbb7BJz+OyD^>(-r~?+rWMs>) z4bvp}@a~yje&yZTbp+)0pxrg?4~rGGZi+y_)D9vTI44|pH$JK4GG_YjbSvt`YBC}1 zmW}6b3Qb#7vC@aNh_cfMu1w|~$OTt2^J|*2aY!Le_ih_@)#CT=D=B7B@s#pFdV(yk z7n!6G(}NJfh;y-BJCBBO>-x`GjEQ0Ak9Ypd$+jfmt98G2jf!*&hyM>Od;UL2ZQNPy z&!%M2dRw~l+9Q{tvH8}CQIRg(`9sa@+W)ez3C!(UZ{Ly3G6HH_GFc*BYG}#PyD)$= zFx@`J+CG_1#QN=B{P_4ldK^VRBt!hgJvN)M++6fFqo`hP;jLP64}JK%-o|@~8bbo} zJLIjSa}ASero^M?6S7s?Qx2G`4n*Y|i$pLdc&P4x04sbz9NAAqOPXL-<|b0elzu1)`di-3IevA6|we=@BZ;AD}9eMi`t7 zGzlKfUREdnR1V!Tl4XU6GgJqE1n!8Fzj~xMiT;W60U=qSX%7gRGsO|HB)we_mfxNX zXo0Trq zskla4)F!vFU%hk5bi6FeZsh zQtHNt*yE|>SSVoOi%X`wI^u{Em8CUBMQTyErJ1SXWYc&g!R=#IDRhug@g^7hNj)A_ z#xYgw)4S$D?czfQ{y5I$T3j=d0VUev(qO`gnQ=ms*}i0beqX#-tqaZ zzg?n4^^e7W&`nlBF!Kc9GrpxI-{(!v<)QE~fDEfq_-?fakP%vCu661eP6m{6QdcZW zAj_cyMlz*e(Q!ICPNr!M0b0iEb_SF}55?yvrxvxz4Xq1h12hjrrq0gC?ukzD&?qWM znU<=5Xsr+-Z3AntDyBcGB!a$z78%eH#*tp8uIjb>te4!^XVal}Ae^srWSpIU3}>RdTzMm;}O`8O~Uq^6#ZqMwhaP74MuFNadSDc zVGfZoJY112TnNaU*h%nCRs1ZNg~|tX0NMd1{uO$ys}F+ncabC4o&(2k02`3@;~+Mx z_EmRB(QlTA`Lb-N(Q{e5uU;-kmHar-rt>L_$^8zyo2Sg#o%ik~YZb8FynE-b@TF0d z!NvF_@hia)T=wBQ&2no6Cq@?44!F(man%syqFQVJftXOuc2@5Mhnhl4nw?buL;uUI0ZKT8PtzG zkzSXGoK?h*{N($!d*pb#ferMKBSA+h*XK{eP=VJlz7k~ULlqiqeI7!rC z;1xP?Vqv?EWs^tm$Xg?b`qx`E$54{I!xHW^Ua&qF-2!Q@HX&bDCKvcxbp~K7 zkuEgGv6tTa5AooPBh5?&n-5fXSgN{>&(_)q8j>V8rM?&jrR zm-E){XOStZmt&5pXc}&wOL4G7;%l!Axz{eKr~W?&e?HuqFq~IYG#!37aG|h#R$saL zoXmHv*V(bK8s(=p2rSSN;o}GKl1Mlh)Ig%+MWc_R65OJ0)!BA%(HL7)Bi!w0qF<^m zVKr+AGEP1?)qu5>lb;4Nm7hl&`9zMCz#2_33oE58pW6aF|6beG211+$*bIB%BkfEYTz#u6P?@14t;>VcH= z2`aEC0svO$dtE6O12*~~wsy<+)GxAtkLy7^arbTqt5yET>sPao17#Hj!{qsMCBtmP z%Z%b3|Lnva$zc31KsaepXyv_`kX7WLSFbb;(%6g$PS(l9-{eHSzkX&5pZ!${MV_Ta z@F*ceRQ5X#!Or2<lG)*g!8IllZJiE$hb}DAT8v0sgExb4q&rIPV4hx2=gaIbmImtirw6UOV;i0QC zN7Lu4ou52IYTs0EY@D%(1p(H?L2SNL4j)xSh_FKF0Y}v%K6~fV;CuQkjU9G zJ1d=wMvg(0877G{nv6re!K|O3|0N?o6bd7wm2*`|kNzOCs;c$Lc0K(&&90RFZeHo` z6g{8EFk?@P<=_G)EL=fcb&t#TTwrRKXoMwTF#r*>9F9!-c8 zh4^Aw(|EMVM+Uy$+?n1|Y46kvr@sAU<3>M5dLCLK7_q@S8wRo*O3^u_em;FA z+B3P?eVHRN4FKj`PEgO{jhwB@-1pAPs4Yf1; z=*|*0;K&eC)grINvEKMi(mth+l~Gc4v-8#`{dniws0C$dnX4^)Vl;?~m^L?1i%v8{ z6Ey9T-vXI0SuCx!yO~6c1P6p%Qy-}r)SO>|XMvrioaEZ}`TaT(zs`D-RY)+5LrLX@ zV%OX5l|aSRzHHC00chw*&b|BVf@)O!LFp+G@0k_T5O`%p-rI`Qbi(H)*RmUga%aZG zL0aSZH3cp4e_t`A1spKcLqQ%o5Ta3kQ;8Jc!6^D^k5{T4*9UJa>Z5#988KX)LLml? z6<+!2K9ji>h+jJ;GI4EDFvj{yO@p_h0UvR%^mD0#{XXXRe$e{z4yLMInPtevN(IQ3 zba`pAIa;7bDenOjEmEEIgBjT`$Rjkku6;EcjWaU(VsbF@AyQ`=ouzf3RF|46;nZJ4 z72FZ&2!yj;7C1q<)9Z9$gr4)u$hQQ|7=*h195P^1Nzr?V;1{IKQ9=g{@6O1GYEPC0 zHgQ}q28kjT6w|$~tQ!>LiO}TmZke!CX4gV-_qDOTtXkGA0Tq#tRltpmeb6qj{57$@ z`OVj7Kjxo~Qg7+)V?z}fa~Fdj(-&q8@|TTaf>*^JPoIh!+R}Y8TMQL*uGlW5dwEpT z+~hoZ6q;RxQF5;U?U*EpU;}zDd#8Asc`bj?lSqi5(=?-#iHLt+;p0*ZsX`)@3+g|g zu-B_BXFv?~TS(;1AH}|U(QVM4BB_lja-I7!~Q-_((n>4#d?OJJd?Ogg70CQtLK z9n)^X_2BhUC6*v#`}3%u$ZIIV_4kMC5xpkNCWJ$IQaMc-^3}>lqYiN(BvsC@W?SRO zeTWJ+8-GZ2&XuZDcEh!+d6vFeUdixal}xBe%?Gn56*9fZ>rYjAtvaRQ`U|}wqvx#e ztM*99`Yz8a>kH(bsS%zWxh~vb9%3P5j+d?E&a;^GcqAJ=bs7FTB8GZDU&XD36lCm5 zUp#vLKC+_u`{j!t@5MT??9#fvapDq5d9e&bj9*@4y1F*|X%$ofh+e(pXPrDoIrKcT zoOH1MV)m_rfDOk;yH%L~UyOLuoXBX_|5;7g`ajU{|Iov;s$DFS!6J-$j2VpJQmb5= zM)SsZ3_1bra`I1{XKgPZm)>}NrgC0VA}wrF6tX_69^0E#T^bqINN>?1;kzx%fk4Xn zXhy{vrs}XrdXVSIi5PD!(hb}qPE8Oe$@lB(Cbxd;YTh>Iw<#xOzcfX$$c>7F5arXk z>TiKJza%8DAt97eN%LD3Mz{u=wJS`DQn_$cGunIq8SCU&VcamA?f2vFGI`30O#4XrwUJ zT9k4jv(9u_+iSNfPagTSeqRd&i|^+(sBzI62gR0I4z0WPQNF^5C<=sgFv@xOKuO+% zp7KHy*g83U0z!|qy)}Wp20u0rqfg;&no~ZzTS8k0ilL-9-;l|vXmAcIrBYCUK{bJd z-j58Dmz)(3J?_CH?Z?2!b%v`W%}>~GvlX!T9i9!t*K?G*@;J;7+HZji^S_dzW?JpJ zD*%-|xlKWG0r?~i0xUhON-qm?{SczIxddkWWYnHYdWE2i)`+~4Qogpv4iuWlWC#ak zcq7UtgA7RI=2KJGp)AVvVo#&i@zO%xKC$XU8g=?|9v7BfMXi3|i42kWjO@P3+9!sq z6O6Rbv7R(S$Qt;7{#iBz9{5QX61zL5tHyC?2UXS1(uXd~%OBrM_g}$$^?1>^?%S0R z`yHgOX(Uk`flyvk((ZyzGk{;cL*=kgJ%O7Q2ycd^5?Y_oV&&oo!DhQ4^plXs*sYnL zE-r4*9t{;);eLeF7A>J-_dVvmw=%MijG=zr7cxd+4CsBPq9auz={YT-x;E;e%ll#Y zj?W^6-T9s^E%R@ld+fay{3#Y^Z^>^2p0K-RNHCqK4?(<7WzHr?%U2YYP+F-8!qi6P zqq#mBX)1?ftqq-PvgS`r>w7jE$13Vmm)WEO7T(qdtsn*0v-qF}t?!F>Gpo24r`AWF zX1Of(h(njUVqt7!Ipo<6)+nu^G2RjJaPx<+zi>-xt+2F3wn-pgoskT6zTp-$0K`zJ z(!2Enf+f!;0l$N!PR=$TFiHEJuqhCfoZ^c=mMpbc8(r5H9|r+VNm1Lo@6i4V?#%dwAzT@~E*enss+ zAb2Pv(m$RxEW>z>O2j53$Jt2~Twh6P*awM7eOt{jxO*X7+q(PZtM|_X^HDAjhuXxj zr?XB>8oz-9%QhAjpH~qtrN4u7J)eDPscU^4`n{%R9$Pa%dfK&$gQtz_P*9R_e+`$v zdF^=g=X3q*+{442THhqz7M?KX>);8G6QttQ`gOkaGN&93wTkSK;yb09gXBz0m@?cPco5<5NLR^*O-UWdlLyd-< zog^K-@jLhY6t5J_v5Oip{{f!#Gi^bQl6iTcszY+Xjs(m^4SCpVio+KaSOP`c;KEDCt(DeFOJvT6ltWT0yjSJt>bhU27d?-S0ZQ(<~h{w`}xqw3Ly4!_-V$X33G1 zG_>$$c)Y@%Vh&!FXZp~TkZ9gd#DY}4~ zM}$StV}jhYhTi;%0rbH^Jr1W{haF!lJak_pHydx*OUw1&mw6wI^R4IEh@Yy|M87%; z5p^X5(hmU3%Jjx&`eigHbn@h7W=p1;Kow89c0(ZipnH06qd7)qS`L|;C0$wW10?Z# zB^h2{RkZ0tyN>+jWPAHY6So~lCShI7YB5M;biBq-h9Q9;$U(ZtKPI=4PW$ftZ@vCF<~!Ib+LLVTMcvi_GE zt;?C8FHKb%?#v`2O-W`_;P)>Q^R+7*l*R7#+JS&auX@GtOZfc&grYAQ^mVN|IolF5 zB^SNqURiHBiVtQ`bgPm)H5$gTJ3V=rF>+tCAL*_?gWpT@*mD>>yYSXnV3YO;$q5rR z=P_J>mg?c&*=jXIpG4XHJ{XGcX@6QU2fUr8|GSIcdZm*-wJ(E<6tAi!5IHVd%c!QDCk3p+2DRUXrs(Fu!FRvvC zU9sC@ep;KCDPuzP@|OPeU`iOLm5}BBVLvwo%@Id%DL)_zJQUe(D(?g^!&N0*ci6}~4Tda$6r2 z!LHt~Xs=+qk-&cet@}%sty8tlJ@a!+fId6+dfq-y|{UCud9vK5XwTW3^?!& zl2bSy<@k7U%atFF|Eo0umcm;vgt!zJPqh@0RlZcye32(zrvZIYsfAkRx0t`63n zHpZUPDc+TbCRbrccfyKK!5|@xMm+)M!cTIh``t}Ox;lf}&0GZ&Pru{Beq|{?9pBLA z*bMzVQQle=vt3_R6J0XHCA?88j@mG5f$nNHWqM6h@7wMLeCpOC z80<+aQ9&{m;&k{x(1@xGsC@#neY-@0uDp&Ia-B(A-zeBo@H;G0m~Q9 zGIMO;CJQK<$Z<89%yX8BTKdAI%LzUzzENT8y>9d%S9IO!qpQ1*cbDpW2~>26B!M9r z2?8XF#zad(OQJDJpg08$=h7j(;pqfj0@Z)m=x|9Mv_Z~BGKNQXvIRnQAasbM7Dz#H z3<{TbSmB`6=A-Cdi$!9ywjrFpC|3E*NGCI5aD)Z&BWlt@hLxwI7x^93Nb(y>@d8EF zrP|mb7|h9DVmACw?XO<$RiRF&(W36pa{f0*nzQuZuKqso{_yi}gkn$;t9VXi=*qS7 z!N5JK*g!6EEs81I(fva-u9kM&CeOZpH5gUu4}aGAH0rKV{zyjowp$WX-#p#8v+O2D zhy5$~?w)HvYRA~3sI?NiVr{aW zE?4Xd3G%qzGp>cTYKK8u4nOmfz4c*1>d&7wJ{hTJ@fg}FcEdO`vSOj|JSR#S9S+~d zP?yl7C(wzUwon0B;e43xi-O_8A~Xb2`6@>Byd(OJ{#(Kb5E%&dVWzSy1Jbk1$Vf?$GlRMl) zJkAe}+tlAR1`-B9Vu9%v2f0~e_Zf8_;sqrkoPkYbt67&Zg^V17nd`!8L~KFt(d8S4 z=H)%uTYtdIQj&8f z0jjxNAWPR$Ji2g*Tqm(ZGxb~4mN*NPqJ)>bV}`z9w**9?WN*sPc2P-RHt1ox|+2O4Y}bk%ma5kNHnsUWW?f&O6xV)xI17O7PuJ zb{(;Oq@-P4%4`flN|xY{sFM?AP;U!(ITN8dRY`2b20XdaPc;2Cnj4t8X2UkD+@Q22 zu-S#!;lWEK6ws>AD`NF7d4^>(D}HFtqFXFvIjv!C)SFVekI`Y@Yxo@6;EZ&694)GR zn&9ty_k_l{3BWmPz9eoa!!2~X zFyEQ(pmgO2_?fmvPfBaTwsi7Uw#?f&Su!hxp5$yOd^&~{V{9hb+Y)S_4(0$jE4uGm z{(fokZ^^>qtkyIC4XRcTPiCQDLj7Cyi}^}mHZjpZ;!~`j=mw0@7P$xBF|G2;t~$%m zWwKCw`C%uik_y^y9C3<01U=bgi49INW=VfMQW=Z$*xo-tRzViV& zmYR2vf5H=g*L$;;F$1Cby=yh1_t46s_PDxbi^-8|QPRD<1944dRU&$3mvNC(&i{hS zZNz+q)i1G6KsJYUBtXaEp-=&|M4d{Ok+h_|X6=o}8OIUyt=p4XEIX*dmK3v%+Kp=5 ze1XOU(2DtpNkYxbO7vD$=L_5`bt#V^H0j$V?7mY;!)2d@TB1hipZnc~?j^vb01j%Z zDs~^kB;h=09UYmq?JNTVf8D~06dSAODsG3Dr(vyvC2kTYDEr7om8O`#o`j7@IPMXK zg_99%d_09t)$_^zOQyE#N1y~&fc>4De2Kr>)~xOYfI|lJW2Fy`dhf`y7m7IiF+ZN@ z{N7IU7r|v@aIDlYKC*b^mLknlG%e_?^Nznbeho6D2~AVPN5mS$7ynW5s4kWj@-NMP z2lJUE^a50yoeMqTT*&^O)P^g<=i zD1;Kf&NQLJPUR}9*Ny|R386JWo&i^D<{-`HlH_nZ4u|T>chjZsQds>ehXZio{E{22 z{(22v1HIQmdV^NQ3{bUG3H6IPu{3D0gz0zI@6|LtCvrjsBoC}v=k(A|6zke#ftNK9 zhx8!<1>|G;cimv-n(0@>8`*_o3{v&L1nry-ok(9cFxsHkm7L-x3lcKug{Ak%?4*=| zKL`Z1Y!L(*s--ju`$}RV^0((|0c94sF(ZLryD3A`aDgonq3YyF>3+Uuxw* z=r;zALzvVleMNOk795b@5f3PQMEOftQirBgH(0i;o+EuRWyhd$(L2+1n?G@3F?WY; zL3MYG{fI3&!bZHZP5$!Zp_&6n#?x;stdprC^zI;9G5)of+KR8*QIz)#o;|ZbSN|Lx zu{=lyCY3pARqMK1qs4zxY9ieQ2|6L4)Jb*@1_;47OC(v2mxRf(n(pKxhlH3_W|Q_* zk)oOJvi5T%&B3bZCW}n16ZSsjEF)OM3}LMkB#SNkg_|{dL6OR5A?(+L!Enz%jyoxv z*1JF@5w%$3+%1_?a3P$(7dXq)hi6SXP$l#PC&lw5*dyJ4jb%HS&qCL+wkl7=SwL7l z9q6JBiF|)sPTO>WH36qGrR{bH;0?CWO0Wi{Fp$qZB5p$Gz;a@|iVFm_fRo91JN}$q zWkF$!NU1{PgV{exuZ`)yn_osvM{*xpW@dlpRV;Z73#oLk#+jXBAL?$T6{g%*|*7kL^DoHgbI;#X_sTo1|1MRYzJ-9N`=^NIRSD zV1sNm)ajLggm$yW`}AL0h%M5v3YSOH7#JI%tsdG}o4pul7pA0~(0#~h_{-Ydo7d;= z#Kjr6<`)8&gkM!*c|x+o(7D$mJ4(zX*gH4ZQRH2DXYZNnGS&{MK$F<@M)Lw!)n3*v zbb$FCg|16;W#Bo4D;U@7qen4li-4{6CcMBISS{GaHfn05&zgWaL?QW!s(*?)z3bM!Nv4#9Jv#vPXw*~_o(n`!c~3u{ zP&*V8y6}o4G?W3pK!TKO6ST`l5fbmmHYh@nDNwwiTtHwKK-$uV#S73hW}F9PN&|-c z{i)I2%6^XCoeXDWtlV$f%A6R;q8DxM4|}*J12QxJ_YK@k~jT_nwr8pw;ZJYWJhOlso7fMN5(@ zeIo886&8U4+jl)MjR6HbHTyQ{el-=D8N7bHy%zIB12Tm6ooWg&1x1E+)_lyBk|aUn zR4oloj~EQr{Y`5$o{Ea8b9}?%uF=4Liqesh)xZR2mOYhtp#Du5fjdBD*8A0~8i4$% zTB`LNCXY~!^e2#q)VesaH`&psC^1q7p*F6y6g$kUUvH);|09QVyz!#YiN-M|u}L&) z6632Ws)MbzoNm(areRLkJl0FwF7MzXWUX_((c`sy%c+O8Nk2jLkdGybpY>wzl8#_t zwa-iZ1+_qp<_EW9;%=iT?P1m(Xu5M=1vi`NO;4SoV4L!SUI#LBOVxCEn!U+5&R4cT zPd8uvVJ^cNt)s<#5ANF*T@1RcO{VKYd72DD?-{LyT6Mob4B&<*KFU9D7|;k-ueAq3 z>^Z19ObIjVr-!h1v)`sq)*uVnr0=7}813M~Z=ii`WG;@9j<>&A*twMd0r=rwV19sU zLX%*N=6tlu9hPh1uH7X+K-+qosJ1^G&7fZ3q{XVW#fjdF;*DzS$HLU$M zy6T?#3-a%x>#*0G?j*jA_DF`VAsbaI~=q*j}pX;LL~KWbG?oT=2bugtlZA-hB*$<1uF z1+#Vck+XjfWQWL;CF`K?4S6zTMpA0%@38GC+(JdO|j%1D^ZspJ@ z8BhZAE|kKRjWpv-u_)jrliP1*@j5K-^z_seZHhMg&KlbC#vgEnyh^)@+R=Lh9W>rV zT%ZbAab5clEyPg+X`3=u$VH+0aR`#tL2=I?Tg`7}E$PrPt}C@R5$)N7$^P4f|6#Z(fLYU>1N?Ir;UwmGG0&NgxAiG0EZ zCv)0MuB_?080u!xMn9spn1JFbgG820YHjuCicK2}$?_Cu`jj_S*;46A7Je#oB(t@< z+5#+lT7%8B4|13jzw(MAXX|bwM3U-fMRC=5T;ewLgPT9_BlR2WKW^OJ=3fN%!Mb&O zf?=`dhG*#=7LSq2#KVal1bN#K{MR#h{2Z%_w{ z5m;EmSn<*{gF}oL63le^CGaXbd^3BScmd8jm}HiKJH=5? zLaqw%zwyfan~++bMKg@>S=3npa#76Jw8yNEcsW_86~{MX7NihsJGj|Gmwx}rkX6(U z=XcPdR8aYQ6*fS4{DSx%?=}0PX{SoR^DM-vZqbg`%Kiv)0UWWx|KSLaLoS2aOdC)L z#a&q;KOVkR9%Uz+>L>8het4LPlq+4_=yco|trfjr?e-iu??YZf4s@0I<7zF6oLO9J zDWgzBUm3fHF``8%5+N704?@U*HX_vrU<2nxee9-{<6u~b{(mIyc;(o0X5dbweem9s z=On`qd=&R9R8x4#O03DSzQi9*+f2-RuEeYQihmf!Pov%uQy8KkMQ`CtULs~-?mCo!Lu7H4n1YQ+@iUxqvyaael?G_0Y zIYr=7=jX|z+5dI}66O-yIl!6KNdfZP01Ji%ny)gP^LYROu{Q#+*zL=P1d!79@Ii6S zo6sr~O~9}1UDNn{&@K}xNp+E9vDpBVz^zQkD&AlExC;O(*13DMYpl2cMY>lNhaLFd z3cn;^<#CWt4f4hz*SlDu^KveL0NF3^*AG!8-!xVJQwH$iBp?ldN<<8x>cY!m;jRl1mrv)k^=CO5x{LAMNTy8 zR8(2z%4D!_Gt25h$I$7HCQGI_sv4|inNxFQ>B7A&JmNSL9E84tn^hf{xOLn~=lD1=bX5+Frdu9U z)(!qGOD)y4xEZ*0Y$l!VaCIh~3uBx>8JJXpsVZrZ#)QzZNSG4-L!s9iYLThNwFZ1? zb+2`JST2L@YI16_BpYRj<4n{eq66f_Y5WH{uO&fA`5)T6z>vg$KHoB;u?hC@1cz7z zilPsfqE6z#pyO0St0mA#rrQw5nJFpYz+mpcNHJWUg}XaBXyF|TwoiAW8BcoSX+=nD z<^m9a^W2mal$4akU;g(ey47spnQvjZWD!v7i6fuPp%oDlG1ianOByD1M~6y>tO|%Ho!bOWeEVdi2vkx)9<3>~ zLyush^UZs~?yFhviLV61N9%vT>l(G?9nMOOwDK2g)VtG{MTnSBd`99gl0HBB{y^{c z+6b8gs?lJ!1^cg&0Gnq>c_f4t%-}Q8L}xJy)3oJxmn+Rh>eh{7eQkGNm=Xdy#uVMW z^`4$!|Bd~-x#zU4ccYN4j_tN`#C|rtP&~ew-oQ@&PTPFH+KRIp_%qNN{PkeVN^iC( zgjvvzZ6GvS#$-!FQlN!GKwRM8Bu;ET=RGR0UC(LUdh|_Wx5fO6*q)bwIw z8XL7_>>1kDQ|KOd_hlB8uVIrPwl*`~;rSK3Qxq7y6R*(q;-oAzKLE6YeRVQMFhB)5SecgISIpN$ns)NVo^|79IgEqWR=GDjBaEJG4 zT(g0q8;?@|O6yMhYjbC;QDTo+?vyy}WPh+8Z<_T<^u?vVk3)d&_ZQXq?0xY6Z2QFU ztCHn)^Y83iEYD`B&d^6TleM3rLjhLN*|btvY;pPe2-sj`a*{0K{C6OK9*K>w! zx!d*XZa?SBo-e6&kE0r8w9v<-OFG{X(y}0c=Z*Uq)P-uDb-#=mc+|dq>?75OPjr(S z@+jz}_wVrJ%ho+~C!M*yGF6cssIGOF&UB1xDA~8wCDW}|v&`^&n(wmh7yrJ2dt}p( z=8dyBakwUIv52|}xu$`jdzPAerc|5|;bwOlZL%cIG}9H5k$CsfskG7fW7QIkNn_TW zv-_i5E_dEU)$)5l28=$%DD`o)jcohXc44r~qmPe1x-6XD=Ht{VZz>nC%ye$IAdQQq zjdeG#(>KKx=Q*K8s&Q`+OO{Sa5-;C9%9-c&y3aFEV5qU=;PYIjpefdR(=9Jh z`(_{fcsH)|>0K?P9#MlH6*TH*2>4sV`zR~|b|f~k_xI-y!>eWC<{NUov$7|5fmi4V zicjg%C%N~lQC|ey$ydqhyD6y3+%3sEK8DHHX9tEFT*dp00&H}YOVY;Z5aYRV_BjEn zp6Yq+D=iP7_BY(z%5gax)a2r#+(`48+RHyWvXOdmS4aa$k>@_sGV!P@y5^cg`(q>H z;u1IM?iq*Y zbP6>$LhHRh_pjtIm;uiF@3{ak11}?jHVFva|4x@Dzq_d5GWRbk`@J>hYjpfxh#%c7 zY^K6_2-E-WrL#HzaSaXcItYKRQ}tYLl>p4-NgrWJyK(NgHaedD*%H*b^>66>IxqbJ zf9FXKL^|(chrgN0YR;5O`n#vgN76;i9oasfwB{R5mepEwMI8Ct0knISK;jti;s;r{#K%KMEq1v-8mC8{DtEYU z^@3H#32AmN>^${0D`HUjn`)&XnUbugY7&ujko?i(fr$}KeeKj6KrcN>YvZ=z<_75#2n)U4=iLh3g#rN9Q>Ck|AbaRgk)AVz7 z^Oh=kX>}*b>eEdjk_DvjRo ztd?s1Eca-ogl0c9W~5k|u2O<$+vmApe@d#IXKuhNi4K9RWnIY^iEn4kx0x%M-;@|s z|IGRm*uF{6Y*X0({3g#+f>DZ3Ct!BPEr)nS=;f&pY_Z+1wf$^ zN&6EkSifi`t^PTN&H}e{5Onf(lr8X5X|6$U~Fw9o~AC9V0 zs}jno;liOS1;%(Bd~ZDzt{tf6;>gK={z0Qa$1_^PaKyqwDlOft7R!<@o9_BSr<@{A zniXTAkrrznCv9vY++?Lu>Zw{Z(SXdOazfG=XEhdn5BXX(IoAGwZ$^4M{C>MR@38Rp zcq+)-_rT_CrvK=3m|~OK?&NYhilyN=R7_$_q~%6F?)#=VPI)FP)vZ{Ost};zG>ZkBpvD*tQ8w>*L^~JcZ#N%$=vJvtH8u6)n+Uju=A~ z1rN*=nAF}WcV_DZYhNDb6lyiMqTIz zK?6`QQQkbQT$7JIWNy-|5SA10TG3P}^zY14f7v^Ef6|~2h-3x;UwuOY@V$E`uuCQq zimI+EhNG7GueueXJFSLbymPC8f~ybO2a#UFop;r`zG>-xu59S-_BB~+wwX84+=6@n zRtna*O~PIZ$%Vb0yw0wqFU__)t`B~^9-cMYUNSuwCiX^xPm@O=(P*^Uwv3z1#U)t4 z|EwqFI7=UcUKHWOI1DvSV^hRO(=%uqUpfwi&C2UI3%(Vq)%`d*NPkVjj(>Hw{I?Hw zC=~giqCmPx;>ET2Vk7oe#g=Ve0$rPkN3=|2sZ&W~v$51W*{kG|TaUhp z>Q#;OX4PtV%6Q)8zUP$#(wAkTrA#$9Eh6#sJjVK~ghThNFr($i7>AnCX;y~#M(8ob zFQYo9?lX^~iGN8e@yLTYsH$&i~98yS5&ju4;s3Y&|C|%-5JcEXT#d&G z!H0;^8OHy=PSz{Vtip##!E409;}HLQ<^L(pDff9@CZ;UGQ;zj z6Xj@fWqgZe-%1=bbT@Pd!!A0me4i-?c0F6k4eCM!3TFouj`AfVbD_l&?O-&18JPV& zIxyGt+3SE}dX=kpE+&_-#d*2O`xY(Jfpd!uckIn3gwlg#16+d;igK>3D)nF$7wM2h zC+x+nx!_hclf=MP+vSc)ey296rcU2Rkw8+!RQtkJYi`5E{re69MbkK)VF&F)upj;|8+aj0kuNBdex=wL8Lw}$YExrW z_l8W%1gDK3p)sYm&Y@@Eeoe>X|3=bj+`8()XYJ$8>ozrb@y=ii|*Ir=zl8KnfXcq{sD6T_e z9gJCp5fvOURTz{a`%S!LvvvcC{uz1*4*x*M*YO=Er<=tM>cZ45#YVh z&tD{d0^K+_a8?FP+3W1pgS;r4W(lQRUN@T!x&G{VCEeJw_7YnI<_7@v0)(uU*pRT< z<`iVc^Y8h=J~9O8lvf(VM1jGulSI1Abp=_$0Cr)-O?!nG?L0v#=v%e~CU|?p>aA)t zg3m%`qrq9S24COFGQ|HGJi89Ocpdcu*<_mW&7XmFcd!1M`d`6MD^4RC^1gyz15QuFCm`;WZqsDk34J53!}zK~TnsUW=|-Iop1kN?j$ zZ<<##t$4wR&Z~y~&pV%2E%pCL7eaco|B2}fJ3UwIlHb>II-zFNMurS5e*l&C&i1a zzlkmYXmSS};%nwKTw`CO=L=God0iiZF!6S1XwEK@=xF2v5(RIWUN`r>&OT~?o&T0K z)f-tL(U0x1zRoT_tU@(Xu(Q7DZPLzWf-+F8?s@%jmDIQ2w|ltGlB!^;X(2TywX)yR z_a!%csKF2~JQuX)?y$aof8nihkRLaQgx5Ia-fv05e+gP#?c1+0r85;-e;axK^=N0) zbc502ZtXYgVVOVsZTE?AMTLe@vq{d0>(EEpcdC^ zrjorIh83{lZS07T_C&G~-G?r- z-&?;s)%YNueL8nv{b3T5IXY`>+-{(LLTcxE&ucY(27c=+^Aqv2Pq`nV7hoU0;DRu? z4#H+Hm_=~Dd(S)G`(^N((=AlxI8j-_TZooS+p0*DK6Fj%g~-YG0rbhLAGY?IvMQCf zapqU)>xkwq{YbZ=P*K-KCp=P3bbM_(xk#XuSa$BtqSn>)Yn;jV1BZx}_#U9d|+cPWtxO=qi>Cy)$QA zOWKtYX30YIm45VaL%cY+SP|NbvS}k-@-c?7=7TI!C66h7=4%Nm8^-|^6GtN4B1~s$ z$Pfw)$es2+({R?-J@@5kQ;7+sS)~s9l~- zR7Tys>{t0^7@8Kw7RPogryif*yhW36!IHU)ly9{`y zrmkvO$r>&k5e;=;uXLc(swg~Dz)j78@^HOcQZRG=a%IGuowq0 z^559FpcUt=@J4R0E$4VK;tVXwZ3+k1Q3Mcx@QMqN+{Jw;hbkPFi3lByC2t*fxMwA*XKdVO}Y z-j01uS=6J<{V_(xC=*lbxzsQRHBmw+G_R_mSgjQ)*}>D>1l>m4QDCO2BD7QmwcWb2 z-Z#$lGs88&$U{8wu>Napg)FT@@%2*E} zmr0D|z51c_brZEHui)MID0NS|yAqc|r@Mngfw@WSC7>@ax0N9!oifu!4l!+!*8p-W z$~f$EV*8 zW=iW~V8OmjZ1oofr-ZvT_NYtGwyI(Zu!nA1xpJo4b1KtZj)^siNWFM*D2I8Grt5@8ooV{cRh@F>#4mpnw zd{G)|ks;>AwdKM7o7+TOe8X;!7O8|6Cc=QhWBD2x6R3&gS%0#f70_h>g27l>vf*=q zE}YA~k?5o+(Gw;4T#)J#Imbvs`pM(#`U`OsI-5R^jN`~7x)kbv|BxX)6X(toyfsRVg`Wd zbZf*ImhlYf#TdJ*z|zdp=?P8DWvoRy82ZwXjj4=+%2;9Ao`4KobLB=JakCeq51jbF z#H*r0{fWT!#}LhSl^9ewrRpI$wGcjX>5irX#0<4r$ z8`3sOqDUGfF1^y1n8A~ z!fQ{1$?U-0&GJy><685h>lwQN<-1nku1o=e@y- z$cf+);TGVy!b0MVM+%B0;8q+S4pxnZdm1d$>z*vlQQBsG%hg~ZM+;;>KXd*VjgWQf zxck;&SKekw8+l+oyhlSW__ShS>&o{GvkB1{QD?o@+HX?H58IpHG>0a>s;P|XGm1`M z^Z;t9qI{IU|7X7V=hRH}M^x)42^?L14duY2I_gJ5Hr`sD^kL{Onrnp;r*wih4GoKK z`Kr1VRrYoSe=Vk+3+=&dS|I7z@32a%-kcWj>9Ko~nEB9DoEAqM3^kI~=&zJ<__l@N zCh#^*SB-R3>>%9}*ZX(<-J%_ner?VTEp2`DlM6YYJvMRl7WJ$;uZ~8_?purYRfiy` zvgg$SGCw72u5Z^N{+WHQK8#B>DY>(iFISNaDcjb5dX73wp86+{&neL)q^0jZxSBd*tr9jCy*^$V1JeP1ZHh8{l z-%^gVupOW^7O%P}^I99W>Q=DarJ>3D%`W}TjjIg}C&atW@#f4U>DP^gT(!6U3I2Xp zJH9OIdo@<5gWu(MvDsiG1zWTX;{O=f5PT{U`wtTL@yp=r1*!Qg;<|o&uMq<;X=0W8RL!mGQFG^k2a4);oTE@QjJDgI~7Ed zS^D`^9-?dxQ@dDYta{9CLAs6*jUr_Z&PpQRIsdk1g6?Y$E% zxq;Q|NqGNm{pm3;FNiCe%ct-h79r-QDC_??FG{D2MXtx}GA(VkZWQXK+ASz+qi%Sx zgz>KC@zKW4nime0{=O#BbE<9L5EUo+DSmmIH0e>Ij-u)~^DdvOsX~tsObx!Vd*d-D zdxbGBs0#m>NXod17SbQSIjbJaM?WW!9eC|o0!~k{J-#l&*ULBJp7~(EpW17)IJw&7 zo02VT$jx*C$&zwi^8f?*Mc7m@dT!IV$>}B8;Tu!pHB4`AC0VzA4`Xq~&pfp@hm(sT z=0wU()qe^rT+(4FYBlIDzTT?bWN3luo{dympp>m(5S3zC7KHA}G5*#pDZK`{cTXa$ z64@jTuYoS%YkO-O*Y(E zNb!@cYbmX1NWKfMJ+tgfgV?^dR`;s3WWI@PA^yu1JM_k$tsLRuZ@}FlXs=DokF`E< zZp7M-L@V;1qBrAfa;RVJ6#)*Ow`JzXlV(12Dhh*%xc8oNYY!s;&#GRUP>&k--r9Wd zUIJ1sFV;dC)|H~mey@CFM=UFB{@^!xVTO@d_0QHW-1)lqjX$N887=wm}T;sSPChzDhBWb@=O2k{>NnmR=awcv*tkdg;x}DG@^8&ka!$ zsmET%oE@WLFe3`7-Dl^czbcx^HZZ_QSH~L~S1i$7q6sd7JNGhZ7UTUabcj1+~f|_ti6D7AQOLua)CV?rFHrsbMahErOSsjRBDk$Z26Vv8a zjZi|)=dw@#MqO>;sqH-9l&^HL9dvQti58xBN%#CF+!zU(niv+G61w2W#KqO5M1KEN ze-%@LOz&5eY@D`LdYp%7v$SL0N5gaQJXZK98v2+lfb5CacqC3o7-}UHO z90@xP-|1Xd2&T+2q;|m$-Kld%)1budQVL8|W{UiZ1Gp*_nxURYSiZwBrVsL|t^O(X z2WbO78Kl$y$qIlS>Yb?;{}^&8p|@&Y_F6H_n8H1Ks{YQgw)Ini1$=LGMl~Ro>T0Xm z645W#6kh=|OGiJDyC*JZbLw}Uiy!3iRP?s#?thHKw-*^0{ummnu`tt5>ep^o;#Ji@ zGS6y?YQ2c4Km8lJyDZPC8%qhRY$`f_)%j|l;&ovKU6GrM%vtxCVL01>OUquy;5Hhn zQ+d^_;!nYtH;HmXHdU__q#X{_m}8Lk|83|1=I`jh`H(|8JpLEmpfkh&McatIaiz(p zgJ|jCnuW6u&tACk`Trh;iqw05ZMc#Al(sngTSf1Wc*=L5%G}^Jiiylnz`3Sm#l9z6 z0Ci&ioIj3Pf)(K3$U*yU4*rNa4#VM>pK4~S^X=+iadVd!A}S&7=li)vYN5Z3I9_G} z_@Z$~+h22wIv;^Gry%!kKB~H4!b!l**QTdp%=X%5~&sSN6vC0ufh!4FdWARlR4^hk{c1qQU%aV!x+>xrZkGN22 z7dE}{h^cw&-Quud&yLA@(aweRcd^HddNr2 ziQ^`Dq=q2|rmMP>CX*+OHdWxc}O}FDfG)UVne(dO8xHmzZ}&S4@A^ zx4A;#Z#Cd=lJ5H@$x#-F?1n<%Kc=s~u5i=8pqbCeMyhzd%SM`rn&+I|A~F#*ZDy$_ zu9Hidzl0!B&$Wg9o7R`RWe!Xa`Y}eP8cc?w%nFa}{valGl|=ueR5s7ick2Grn>=@s zx)KEvwW|HgJvOgf`vLV-m?utb+ztIl3GINPV{6sqzW@UNEr@#>p>!@|kyeOgGRH|L zgq8M6+7$z^BW}PhEs4ZFs+C7y`Ze6HCUy-waRh!rjIvC~smjU}1`Efi0u0hZz0{HR zGU$Pnf{!1EF_q~mfUe+Iw3jw+p)*0woK8LNiCa7M67ja8GapYEFEN}kVF`fR%gK-| zScbp0%)w6}HQ9vm+Cxn(t>hA%dD(cx3YM);6HrdwBz*{du~Kmky)JV)9wbqt+jqy| zXWaX)w_`h>FA_wv26_wz23%aUT+EWp3AF4#&aHL--nhgPqT95SGKN1N+(9Kd_8uxQ zCH7ChbK0u8XaY649_{1_r-^!B?jUML-2()g@H^d5SsS_f2W`wd?3v1)S7iwq)cm9a z=~MH&>USU{`+9pcVLQAa)g`Qd@yqM_DhUC0%yguOtCyOZ*Rx@Ga62DR4NBug!iq1s zmo~7!N-yP6aw<0=JR_}GQ%ILCZ-#|LM?(*FO$r^VPKAQ^NFaL5#Y%2W42Zp1xVT?f zO)Zj*5Ngtk!!z%Z<|_8C+csc?I9LoK5@sX?L{RpA<028!EI+&7N!mX737Tdt$&LzU z3gc24+OW31(V_c~MwjB(JsSc_pzLkJX47giQhQVWa*vR!#U~wX!&1S6PlcY|d;xl_ z!NCeCviF3?Djl$cHJ60MIyGWciImgu^SR%X16j1ySAKY4C_TXU-&s2hsif2Cb9HF= zk83Y0CPS+c`|~T}k3QJg(No~PM6z{E2q#+f*dMJ$|HSI?xp{0~Us%ZcB*!%i%g2K^ zo_kg0e!BhQMO`~r>*P% z$Oou3g;4%rNdI~9huVz9iEXiz*2ia?Q|juc&~X3rM;xZbJ@WUXwDU5brmv{6J-uyA z*$jQPxfmFt6ywM!=CO7pEo(O)z$5Ve!*yAY!L+;PfF^D1XsNo5jwB;5OW>uaSxF@~ zwjXy(BXeInt+Dnu@vBImc~_=!jDFU5=>JnY4@Unq0rd5?5ci$g&5G=o92bA3^EDpG zI1~M@0cdSAOF8_Ismx9HI0NS)iZVl~zbrwS_zIsf;*fQP2$+wZk0qN^x;s{fhr?iv zq*PMFn#{*mqGc!djYgT!=pm%<|V5EISz$(!%UxD$UZssD1#@Dx(B@I84TMJ%4RQX)pg)Pa}GL z`EJE#bg*y1j4J-HM0MqbJe zHhShMo0mFBgh%_L@y#3$xb^|83>hbJXL-{-~M6byq#m z(vEHpDt&%^buP3dBg;f7j()Z6yc=#x$^LtTP@tgeMfHAdhYML-BV79S-(;v2JAaDC z4c2~M*m!S2rl{J%UxXj<&Uvn7$C0@}dvgmk_~*`k2Jd(NtylH z^J7RgBx{Wd=M zYp)UV=^Nee0}7%=I3)H5D7RChqak)|VO(~w_YaJR;fBil;~vAjEt9Ti2>x7UxjCp_ z{h9XD>J=UP{*{%jlcbf1Hx2~f;~02=${fh}y4=VmdQps!oF@(9{ihAFE38}ti@(A= zeA~r7|I^$muQkpTvv`knDJ`_$DGq_p53kz$b&eQDqZaP+q! zw-W-#P>x@sK~a}DZ2FX}Sha}<7vEq@W>-_@6zV@(M?36nkWO~L;<2Jn3sO>g=V=qC z)cg;qaq7@tmv>4k|7b+2Akk!wnz7lj+w}8Y6)wXL2Ma=k4zK-ALz~GtsnEr?_>+zS zt_;?CZ1P(ia8=;C28lmPHN12nxv}HQKzLuWJX&mCeb5O@vWPXK$ z@r-$oG9a;Hh{1jA+WB$fa_^=Y*_*kX^sT`_g+QO|Q{}M+9wiROElm}LpApB?2Q#lA z!{NV;vL(Y2tIUlGtGk;!?OS{&haig8wadm$?=HA|$aBC&JNLf z=T*I>Ir>jQ#jDuWK;NKDo5{55POf`l9Ov<=g2ay;{qo~k>0k%KhmfNsCGxkN$BcaM z7h6VL2_ZR!GT|Oo3bQC?nOT-;NlV-cNR$*$kz~%W zU$x^hTK46unKWgZ&M<+G>t~x2uU{a-yYins7f7ntwiUCp6&-KhR;v!>NyjdLxCJEv zXNG{wxJOdl8T7I@YR#ur<=9tsIK)OSt?wcnJbfshh7S@^R=zx!^=vyF1X?!^agY|Lc$D5r_)W8vcR zOH=3X?KZ~W4o?w;64eS#Z>Tz%J#L~r$*~>agK#NUE@<`h*-+nnQkU+LozndL>gtj( zO`=ee61m?ov0s2XIh}29b9W5pT7`{<91_3L} zIPYR7-dSRjHkWtX3q9MYSi==^Z*dXsEQTW7VGBJv|pKANw=)Rj zQxmt{achx+mi*V}2+XzTWloKANC99?zK3yLY9GcHo4F!1UKWARkxwH zytVymFp1a@{jj9)C_LEW-k%l+_8TH8q-Rp`NW`{#oR0}UgW!y zmFy_MM!-*uGxNv;%Y?MJ*^Jj}42-EEejYkQvE>6?SjU0wba5&<)?< zEYI1eOI60*EyYSw-M!aijUP@LHs=y#;-$?-aGrS6BRFP zi`UbqMgxQ!CqBLc6n!R5PHVl*Th6teA^S-;p0xT$$b0BN^mivz;f@IKNQv`Ej>kbd zephB3JU39gGRU@`kOM00=RpXNgYw;Im^YM9Hsr|KQBJvHWvkHFOV61@I(2-{*I<07 z(l_trCQ~r&O-1=qQVHb3iaic;clkr~9@+oZ*azlBa z5?WDJxg4)}r=1_pOuW?u zKbyhE6S6}}Otx_pKjKG2lx3!F{1y>QNuXtBCNoPk|1JIyxcH2qAX=NRV0{5>FHaW| z5-P+j=-EX)ovKORPMM_cnl0><9xM8&I4c!iHK<;(a6m-cuyax^cHGl~XBzfDHvB#H zjCCmAn4(uyRCOU|2`=(5X6oHK^e9q{irTHy?ozP%feZ0!c4jUN=WH1QcPoV`gGAFb z2_RukCqhBiV$EcI68$anm+2ROg)=nN0HHw?*lLdgf*cvo*6Y>QioS5S$Vz?!K-b?1 z;TTy+_{b>O(GGzaiA`WSEGcf3!THG5C94|u#JgR)NGD-^t?L}vd4kW#ibGxp%f&Ra ze_xMeh-!9N>178*Y25yB+Utp}eVa^&4Ng0gqz_*si+}ra(F_YQv5BL167SN+#veoJ zKa+)Icv~9=LellJy!G)2!_C2mN)RlCT40qqV%{N$gz!cIpAzUD zLcadyF?21_#>)ZjqRIT|hmq>hD$x(ZDXZTPB4SniOgou|A#@X*|mg<@Qx{8UAE1s<1$suGh9Ip#1( zn2ayi&e_nSuZp6XKrvDii@fm582wMrjTut+GB$Qn>PHAjxelb})M-B|gK!|9d zmc-EENFoqnML{LNCi8!Rwui}2_V$Kii$C+YW1oPmzeNbzEq89=>*U#;s(Atk)6U?h zVxkOI@e8e5-RN=oJtdFx4h70iojGKEi5K>>NXej#Sx1>sL!u~On=4lO@Nm6QBlvVW zG<->G3qF;tL%;uF5&?}k=2Y@(_yc-sY5A(w7}oUDshi>H^HI~KGoY9rnachS<~;dp z>C9noiWmm?~xbND^qzx@t*}-OeoGRx$J_e#|=M zkD#<=KR`VMiBLP0NF+YM*QFnWul#~uxsXKiLoS?UQY_O6jJcSw)-dYcD;pjev}HUr z_<^&TEluCg@B<@{La&!h8M1Y1s{Y|YVbe+c&nuw{(vf-TT0IYW8upbq z7!A7w+RZSuGQZ2G?;PZ{$g36ofd<5Whk=%#nJN2}hRMf9svzp?+>7GdMln&8&YJ(A zLFWS`9mO14yPtO}6Z@DW%}Oxq!e3y5i6PJm@Eom^t`h3o zIjv$&uWHq7r41FZAh9G-zMq&-y=UL_Sgfh~I|*{sRAw0{gd7i@i@a19p@MT+7{y46 z8lQt+B{0$P-4aB_xXjJo_>*LKaLo_<_8gVZq_+&aed8h`cx5TjG494AX4qx~$LNTe zP^@~Q)s}ARG81T2_kh=n1DpBOFmVjIcrbx3JSmDAigG$T@<<7)RzBPfvia zaB#CGvuMO=<-#}yZG%&8>h(?%S0^tU8$8ZF_myS@rj>_UErQofVi~vEL#{yFFK>SW zQ&KbXm(YciN$Ei!tmoN_x+S(%_b~W0M|Ob7@O$TWVQrm5^jfb2eTcRK=smkSI-GqO zBJBUiA3}#cBm>@#klBD3fD~qA)8Z?4&UnLtIfeFy0yiv7HPn#GbijBU!V^T5+S?Yx z&0Ki;YD?t5${tKlfBqAp5*!tlZuH6uMmztl^FK}bqvvzixJ0WUS6T6bJ^RI0+Kf+3 zoF`SXKm~w&579*9RQYL9d08X*2o@nGx>3*+r$QY||D`SR=57pstTZo>Y3R?LiekS7 zWXSST4|3n=kbd(~&FHkXVd&aUfYSfC|}2q)_RrOefb>Bas1e; zQ8dZ<`JR62CF+zCm0})1mT*9uav>QLv~jTypolKh$;c+NZ#4}H_&3k17w0M8*x-3; z_v=zsnAO73PTjc82rY0Ln5c=~Ba{4cpkYSKgpF)dr7~@9 z>$!65)UYZbk|A-^uPo4=LY$YhBs+$bD@35f6Xt<#qTrGa)WQ-hVuu25N1C{2OqX8N zzjL!u=7d%SOO6zPwSioaOz*2le3nmq@)h*d@Rdc6KPf$Pzb@&=Oa9L@XFtsRl}mA7 zuJ_&N$OQ7s5(5#<=g({Pe6AMdD}2EiCPMhp%N3;gTgHZv4q!%xNY{h!*PsW$gbhrj zr5pI!o6nbYpNVK{3o&WREK%%o%j(RZr@wR2%!M7Gr|K7rl|pniJJoJot9K!+dD2KIFkCr84y|Sf9C$9>XJ`YrS74{9w|{Dwy{ixN2|)97e8_X zn>OP&&>$E3&?apqh48}zbRj#5TLUi0wOkYqKU%A&fI`{Vz&$Ljyet5wqE3K!68!~a zzPdi?9j{aVuRnk68JN}H=;4M!BlZqvZ%TK2aY36sgkRJ?J>^{L12*hO^gnT4`FsNJ z#}Q_`JFqu{78XK|Xt%-U}g4G^!U1%M4sL!Dp7|}#Ky^1UWUJUGQQwM$Z z7GZrJ>k4v#2fTbpf2d<{Q!{egk`CphhPLm;SnCZxx$iV-@4`PtFj+>dnv);uZremAuGN@PB~=53&qqc`W#kJjZzLGumAO2V{=4AZm_ z*o0Tj_roe|2CVoH;N!Vlsm$@z=Oua4d!5rnP+@#f=LIC$xs`pIS1U~WxA8TcUxMYZ zt6I3I?8(k@+Y_m`6UKS$nL7__A@l*TbWLc`=y&_mwVk2J+3>Y&hxJJ#%P}wS1aDT&8y9)Z z1xu0tQqoJROM_1w_KBV-0S*yuh#<`EppE27;tzCKCNKXYlGH>5SusG-c&ZT_q?Ob* zpJ+51humIi`10MEq`tnkGZS(c;@(uC39{MH z@n*|Cb$4$lJ%*T2Up*E(ZwZVULMfD5B~ss zFE8F6p*R~|i?#e}@GgrUmshV!>{XimU@$JtYX_GQ;gajIf6iwrB3I9$fZmXw&a1CNFR*h!t5Y>-k_PS<=Dz*R*q z`(854sHB9?i@je255>p$+w(4M*8|P^wX{JW6F*5_aIA|9wSTgzG#O@O3W+MR_X7Y{ zjk+kIwzf$WW&tQTscxxT*P+#VoOXu|5Md_ET<+yIEWiM7- zYK~|5xs##KGBH-bwBX}&87FB9<9n!EHK;F5ivUnd$;fIMW9NMkc;N2FkK<&MWnocq z#%a!Mft}>+*Zwf@Pqqrn#^x!xNhpMay420IUbtygct!=&N@n?BJ{4@T4wU;#yJ^s@ z$DdA$`Ep&czF1V-JM)?&#jnr7MqYZ2fGYYf$1%jxuk=8jD?8Tu@~q0ZqI4`4J1jB?7*M;v>9D-(q%ej@)sF<@1ZK5S zm;~LUhF$>s4UzYy1|r>FC)CN@&FhgsN*u-Pz%6w*VJVg2>at7a^OpPWX4piAjD~!ly@^{=6>%*{@>Dl#lr!XNx+a=#HBuCS5DHR}t$CbEc;et$e;XlbVGqh(t@v zZmRwZqZ!wPB5@Wgcvb&5L*v>HS-bqL&pqshV&5303#rMO!*E%Q5J472@o_cStn_l% z#wzEzIN@8>xZ9VUTaaG=gM;>Z1WI>juCAk6y1^xAxyI#&j)Cu9TUhyzPjbp~w3lkL zmxkaRl9Kvvu)5q?^MQ{fTLqJ9(?Y?%*M~v;0T=mhzsMX2yd>9uX_+*C3DXT=dI|)% zYKnwtz|?F^_ehqLg!1pinR3_B=T2^zw92D=m}?tZ^Zz$ zw9B+W6XqtwP{Iur?TKOSVJYJd-=VJ&bA$A1!N;k!-dTnOHC{dfxmEiVYO?)h2uUD? z{#H{9If}6UF{%mY{DuF7=d?an{Mx~4oZ5Gdh)){V7tDobr?H6M797!94f@mF{n$TO zy{Hy7J%xI56?&$P@;nZNi_!SdXUi6{=NsmVTYtL$AHxQVetw3Z)~&q$Pd6_WpQsKz zeqFF)DsjuLhO+Vyef;26r1sGFO!L0raZR7)E)DgjluU69!Lf z*WcYPU&GW`T#(UZ>=W}-G!;%lmeidBb)zUphv|ZFH|yJN*5=waQ4aG;EPDyQp5%KN zR$Vt~j*$NjoapWAT~Y;OLLX`<$3FzMzx@EPNKF#qJXy+CzJ8=@oO+MzN+Lk(L94Q0 z4mm9kcpX!{GEtppAX~>H*Admx0O@nwJUTr&e*l1XBM-RM)Y-e_5Z``5!b+yrTpUjB znH(XhpUPCm%fGQV^&iNFzvbr#*mZ3m4$Sro_cv_oP&s&-?it1~H)pvDwb|)Dc#Ivr zF1cT=>v85WG7y0%@D!`~C4MwJ_aw6YELX)sh`x6HPzG%7k2P)Lb(7;$>QE0dkH4H{ zSZF?7Euk(&v&_lHVJYWR`Oy%e^K$zV}X#yc_nX*Zwyk%29OkzQw}r^hCh;b)=yHb1_tT{c(9 z;{t1_ec!U!E*>FhcJ7M65~;)v{&JC%mPY}wB&MOYOB*iBuVAgA)L@S9EAqW_ zPaDF|M_yROP+sy|dPoyA?&(*gE2Y*8F#bqou~d~INv}^%Bmk~qmM`!BI3j+_wLUvI zKvPcIDg$FB1KsLv1HNs{CSsRUQjW4Mw)N0^n@4)FQIy}~_o!{(kLCPXDe9(hXk)pPOjz^MTu9C{+g5vs&Zaldf_DJFRB^GJ!*ma>%xCdpQh1> zqg#{mUS~_taWfv%=VtqFGy}|W%Q{se(V?8n--ZfPCv10fdhe0RNqc*$q1s@js9*%3){jmNl&%O9Z{ML*`U;VH z8KKkfYYg4+(%fqDZc8##){gAK{@~=&gyr3LU#uRc^eWau-A^Eh0x>sL1=pSwitbvw z1GCbdra?@PqGlAFvgsGD`;S-mueA`jm|(g|kOW?E^p&fOki=4ggBUd5YFRRWt8yXs zzmJR44_$Y3xlTHXs`r=PR7Xa%=Vutr2@l-AYZ2X?yqk}6Ys&9$>VDS#-E98OgXG9P ztdHb@g4dZIDFUp3vdP6>w90f{2E?DnbI`u#5|_KF)Hab*yqPb)Qy@`Fa4+BD^A@Z$ zktH$L#&BWlYFQHtA)6^jpx$Qfd&)E4f=1r_7#ui4-F*^iWjDO=DP_Y*TAj~awx=*r zUyWT))HiS0hbBc^)1;thaPdl~*=Cd3=gnfHk*x!2$|yv^%eoBQx}2kig}}`utci&> z5!0`8S8TiSBa?5N-wy8GwHv!EQgZOR|Ltw{;NP_~6~&8?k-O1t7K7+_y)&7X2T^E2 z>l#XLmUy@ZI~Riphz^)6F0ME0!+;`-fS4$R4+CG-$IoH?*C4K;gZ2Dp)87>nhL*zA zz~pTZPA`#~q5(33SWKtGca{AowtQzVsDUlapVX%hBdgrER#*1#JpA~(`T{s{spOM- z@4Jl1w7Ykjn|~F5n8gPvt$+i%U`yG#{^@VN^qFuzj*r>?Jo!wit?Q2AS6KdXi@Pv1 zEml3cwk4qXt|stm^~hlqneqFb_qV29KLqAS4+PNZ6*5ZO#+L@|cUF7+IZA-q*f`#C zU2QHJxZl*6E@U^4$PWZ@w-@C0Nw$ck2M+cItYSD6cLH
pLgoz=VXE#8#nb$ohm6N6NBR0loA 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 z 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

DhFB436)951+ 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

(SsC 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%0A$}3%wh|6<~@tw)f=Ai0_Mk8UIo3hpA$g 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�|U+6J=t!(3j23TdVfnN`QowNGy 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
G?C;Y{#jRa^0i+>d`I>I?^IT zd`nOst5~UMasBmPL%OMplw8uTG4r6&iST2uy6cq1em=onf--wSoJ!a7rpHOIC`65) z=BYlPAT+L4beGC>a2Fu|gf2T1fE3o*jn2sRY6(yqFE-5u2B)cI_D`rvemL6m3T)hv z=Xzfx5Wo~77u6?+Nhs1ytGZ}+H z?UxsD+WYwzLB-QeM0%zdx5YuyO$`d{ll6$bV#rJBRti_A4CNg-RC-hQ4HI#|za_0INK!j+#0fW$#gS>i(U& z|IPZ_AAjs?81AAD4h+0wSps#7DtP-TRb$X}%k#_2ZU`k%i_@`nL1Mfg`gw8ov{(*{ zFgD{?CaucQU!fnxFLqX4ewx1}`+4N+yYhIZWw+Tpc#duWEc2Hjv7xX=v}4c7s7Dy@ zbsDK9!6+b5E^qCNB5%BxnxM&{3v!BZI_m1s|y1 zoy5u8&eg6&Q&3C~L|TsM#oz07m!Q<~+eKGCnVK zRQU~OhYPK-6g&CGHNaGv(_a=N3GQy`Ow#D;6DM-kP#b|v=&S&{dbITXjl^dxg|^4>iPCG%AH?j3kjAg=<0dp(23PG%RQM$VopWC@t;}v6 zcrz!coVhzY-Y_Sy;xx~0_dC8KY26R7oRq{#X1=D6KL4m2I&jMwMw16LEUwC*zGdPR_nWsj_?{Zy;80=JBP=S9Q4D z7Mu3Jq4C5AgBq33YdvkW=|9Vo+3%>UX^cD_>F{~3TG_3%q$+6aGFB_XlZz&51y`;_LA(GaXG(N z!;+=^l#Vi0p&FdSO|qLn3Lp|9A0iGA`y-d~`#6{WEfsC-6xn|hpZUP*Z~qIg-)H${2KRgc@*SA3+Yi)VL7z~| zKeiUG1Wi5pTCXMHDYEcBi48)UNli`di(84wz7TI>a{&h+FNwE*Op|5{;BvkxD(W2I zVhr+K9r+;NTXOip_jTb=o^4c()Zcu+WZlDE8w2*wz&_w_!UD|c9H{g6yWtmKT&I_R zRn`pxn2{on+>?Yn2a~;mvumxD==TQJx>4LuoA3Sfq$Hyjz57ZAeJ=R*mS~5(xvXOT zdMaHE*?jhX2+{Ll;_A`D4uBnp5eGqZ0fIxRKdnB0n^Pcz@UJs7LpH3-%7n`@IMV_O z*y~4xG-Q5yv(3?~c}&i-Q|^3m5GSD)sG%1sM6`pxL#ni+4-{7*l{#Ox2o~KcG0MVd zbw2@)=OHKgk#_3Uw!Qfcu^ba4!ar*z&~dFXE*(EZ7s5;4%->};g($qf1bPl_fq^0o z{P`peDzfofdHbu7q8LJ`{AU>^=vtT6u9nrNusn6@W6yu!MBm%>s%E?qRA{K0*G$yg zr-qkbL_RS+DGQ{R7rpIH_b~8&BT_he0?TEdo69lDn=K~Iow}l(S^&vrQzUa2vel*Y zDJV>0n{q27n`se!K6J=s;H9&sa1A?6;0$-U9KQxq0BH&j#vm{mR^!8V6t2R;)pAJf z|8g`HWwj!$)S*xh1us)88r&X@JU`9k34o3l3 zqgE`uSXM%+D7{-k0uq5Rr}uWELE-nVh}byM?^;KmZoVIEF}xswmS2znU?*R87P+um z$q8%uQNGI&uN$zUR5JlP!60#)hx0cBMX8XqPIRQ1rs$}|c?lkLq_|b!M&IHicmLB5 zgkSR(1=#enr>>kn-xI`|K1`C}BjqH~8B|yh7zhy4u(3YX{&u&oSH@pQ?zB><^sfBV)zL*;x{u5<)?k$jff%(;S%kR<$s69&&P#XAUcR+3&dnb zjv@q~<(?F)jV4rCig^6E-yb$#ZTxn4d4Ocx?_i9BY5`}jDj55}Y_+$`kZ|bqy;r|- zPYr0|MMh|XM*~WcA`15*X_KPRTZ95_hrkzVxKdZuR(tV#hs^68mr6<2FB^NO#ING3 zPq*FLd)v`JHPPPwE~c7q@sww*&)$%U+P00>JTz7ZivZibY+Mq4kzL_ap>cnHsP7>Q zOS2;sZmEZmEsf*ji z&0F_m)z}A@>!AqAB@6_wVBei;MN<2g>Z6-Uz#C-^&fpn`Gap4mb!FWX1XN6;d*!Xw*a9zODmW(_94Q;j8U*ZT(EM3)9h zs)){s@r9gj@&OhAxiBX<+T}bvMh?*_#Z;;nj+8y4;$;+JZFqp-{Ms5 zs1@d{26t^B7^Gko29W?@&Yo1YFD_w82AQifs@Z7^&D;9ASH@&4uQD+NM>-UBhpFl4Okx6wMWNWglaUi0p*Or6R@2 zaH@)yyYT#7uaj2xAC^(e_K*A&-}xy5IxctQe`(C-|2)v_ch%Alzg{Meeof|9ei(bb zM|}YL&eN&PZ`osS@cL`NSgBanUt;!xN%tl$G!ER}f{-24h`w=i1l1sDx51_5BtGwyXg zTb`L#i(!p=a;X!<{d{d0^mAJ+ONmrIp(#ctAm6ap`rH~VQ7DZxN$msH&)bU!c!7b& zlZYku+Q& zwb20>&xnEvDt>*7=lhHoAZ?|tXX$y?9g|<)m&(5+S2ezz;g(Xo<#NwsDN*$v0vJ#j zK+ck5gBbW-3GH1Dd|Eo4xO^>^B;wh=@u5n$cPhg?F~QKm;rjdJ!)%6Ub?dCk46*rP z-4j3I2pLfJpw~w~oRq9aec8piYSdagdXnC^xKR<(cq3%*ccYrHV)@CX+Z|z>ZGk_Y zessT?Z0HxOrJk2;L_2ez4fzV^g~h@%B;_0Wem-$?c2UQ=m0C|1xWtw=ByV~(bHCHC z{@%3IdMUxVdNnjTF?wy|Z~qRfHlFvK8GWg+#yUmnL&eZ{fF_4DVO18RlpSYkOA}ms zyMOjW*q7w|iOpEp=pUEs41+>yQ}57=nZB;?eeoakRdrbuc+T|3MY(eJEY2+B<%!|* zos}JquJ;&MvasA__i`1o5Bh&l_b(zmM(;G^Q<@lDoC_6PM8vzLM_h?avT8nC!IE8y5Wy^unk|pZF zT|m=_6>kYKbObZnyH-a-NbP`LH#;{mqk*H*%QZC?)>;eedMFf4xtS2b#|9jN9KI*c z$X$c_X+?!Bv;oZ7eFUR6gwva7#j@1Q5#UtXM3(~gt0i|o6;Kr7R~VK<1y&Y^FVBJr zX~(yz9>Laq|3S0QuaB>uCl5`7O|ig4lX}Gpf({K6S2K6DQk?DmZ;#P%u;8A@b>;yfbKJ@ z(X$E4^LH~ub=4H+>LUyu$yphvL4AwhtPJjKH*YcJfGt%fZkgPYZb1pe<_kDDK(urt zg7LUz#@0G*U?)1PQ%5I!PbA8lQc!EAfLVx>b=i11NLH6Ol=TxSQ~&hUzIcnp$;e#S zFNr~J(A#DwXn1K3&)80MvthdUuGbXya+1edyZl#SET-xXg z47G5Omd?=$#tEbR)@9?hf$i_Gn+RHw!x}=eeF8~QY9=~bf|proyNbb5~-!g z-d{@cq-oRz5-wm}0)THM1E@hPPUrfq_Hk=1xL2)}PFU2AvtAs}gUt+l-ep%{dcwM^q3w{7~}?DX}C zhtW*j`YJMN56=@NjD}2Rq!S%psqasnIPJ3sfRwTT4JLjPEbK2Wv`+1e`nEIE=?34X z$&%-~qYw0}dHre)wJm|ZynYMl_%JDcH2wfTxmKYA#E$M-1HJnr)&W5c7#9<^1xBI# z?xGHEa)Vp43dJWSN$8@*><+{BQUNiM((|0LpwnVn3Fvs$@vd|U-WZW!A$^qJU`xY^ zQxgiD`4B1xWw}lXy0`0J9!4iA1ZCEl5`(MhnmAs`$`bC%eDeq#^n#XyEn%*#F?@UN zu^){cyEpAkw$Z>bpHrRr+erAm%&94))3B2^cZK~*c{HBByt@2c{}J9vZEJi!0k_aP z7psIg$%^buzsbd|tCro6*}Nz1U8anK*pGPFF$^B7n)MR{Cl}yMNnXG0)UA8bI41s5 z!-Qs88OcPueyUP#*liXqplI8}skUSG*g!Z8=SQ0{3CxuO3xK7xqFLP~$fve^FPcuL zDiy334vw#tXHO7->zp;*1JOyTCpesTw_1CadJs34(<7?7V-f+dE0~4!uc4uEy;vN? zm!D6g7-66J%EFO@Lt`0QQ>7a$)dxR}2Iorkt54Qx_Hg`NDh=jU?)O&`mvB<0((PCXbTbIteSs|tix?klz@&6b`E!@;-xDFD~He;7^xNS zXEXn$(m4_mqF^jmuuDe1|9tB>E0NQgKv0rv)DO3BjoF=^(16G6tlbUS*N_wyM`NR- zpceqxo1)VBHD*@sG$m3gje=;-6~zavwa$44Sy+Pri!d_Mmwqb3R_#6N55n1ge`!fGDPG&1(yFe$U3c63`;cLlR_6V=PLGiy5zR?KAMv?5 z`e^APCNyo+?;7Fr^4`Xrx7TIe5#-Xl#Pym*tHGfpsWaIewSAj=xVYEt|F-XgRZ-jpj@}6p^o5b;E8K>+`n6fd*{D81G6c9QLLc%Quq3Q|5kt>K7q5LT=~s5b*v?uy{Qj><*Sw7 z7V34Dp8o8$=lo0u^eBI~+P3zLW9lDV<(oGTuhl;U-j#C6qZGL=rf!&``QGt7QoCqw z$_artMSi*W^tRSv%%eSX7-eh3$m|nJ2yx5g(qdoq^u*Isk@aj#nq_*&$xkUOKx{|( z@X0S7e;hm7E@_8+L5{NDd+pjIG3aI=oVNmb&xlyXfGN3bXY-t2|Hk?}MbAf`+7z8{ zlXcR%q$(#|vYYraYxZZ)N!2!TYzvl5CVzX;wfg00<AUEIzF0Tos}RIar=jj_DKm%zOI;1n4GJkk5REFr{p7SFu8w%r-`yf=2jpQZR=0! z>GAoL#6az{C7Mj?I?+06xNK^O`n(=eSQ$4zry=bxUA;_MqbzF0H#}Uq>o{oahE`I} z3_Txi>=Nwrq4bN85z$`-{B@&CeB@MQuc;mEBf70Tt zUU`O2W$e;s&3|Hhfp#}}pUwPc{^;UKT%sG+PMcZH)TR49L_}XAb8w`aq}sukM6Na0 zdR6BLnCDoTuNA~dKeN%qOjt~v)Z@vjJo9ufc;VySY%AVqX#+zeDea4Si*xKtue9{z zkyQC!dQX86+v5oFa<-`Lg#?*B4k!mQ0cJ1~CnH^SV$;OJZYJU@&<{>{S2)aA`*I*o>0yB7OW8!NL1t8HJX zo?B?!WPR~W$KD7#%F%#P5^eYoZe9#Pip3=Oi6okXlzaHptYufp4Qo!sGq)W8mLDIj zhiE6B;^TX*%`}oIH+H-TBMy=EyQD=@IGrb&O#&nHoDlqo=pBe;DKu})Vi#?cE?rmX zN-cc=me5l6`ejNq*KrJ1HsEDDx#s#MW>-oC6!{*OmsfqxwsRdhUuR+F0?R8j;P8It zBMz5GdNnXNfZY}KXMh#y(Ffk^^q$yIi0ih(DU2_8ImGpVX9ls7uefHB2Kr}tl_u0# zkDp{x=>2BK3wO1-ON}(8v!G*Le;#sj%yt?M0AV&d5o?s$-=!|MZce1dM7)1sH^ylV z0>B_91-iyu=JART&o3Lwp2-!KOGMxB&tGYP_z(jQhTaT8r>DK|mo{aKAm`P7GGfkL z84CoKw|iJ2yY>CN;g5^{D}Db@wE&pxHCcPDYoyeZ8tC@8_AHtiXe_>l8j2# zpi|!Ea-B%OE{zk8vB5F8H|9n)Nfmz#4dp1?DB8;h5>Gw(J0YeTo`2K-tChx}I+gxR zx+P;?oLg_h`HpmS+z(Rg(L|C(^XqSTz9v}V*$1bO{C@T_&s^F*1FGlgz3R47$%RzS zuW-^fpaJFBD-o|Fo1QX36fc;GDF^2c+qtrqu`_b3hBD#?FJ%V{0{&%6h|Bgby}v5x zz)sd3Vq@1`=r$0M$UxqoL?IHq3fvjTDOqO^SxkiW8t^C%h9^wy4);+TrjDC!jWG|z;xpG{o2lg`QVc4 z=w4o>4w;v}oVMFQq@J+^4$s&A{msD(x2uTW+4FdQerl>ZeX_#nz8D|sc+YJg-j|Rf z2Cadl)itLw?FP4T1X(w2#Couscyomo)|)WuSaTjM-P34)?ib;|EC5^mjQLUOvqeB# zq(f5UTCE%+W%1#!-A!x0LcTjA2ig^vXZCArs`p^7pAJUn?uFXg1;$V7T`Q5C$oiPz z5dA4SPqzKbtrU=aX@RvMLN%d&-uR*$G=yKs#ebR+Z!J#p9U)E|giN z;TuIVrY&-7+t=8aG}-=W;O&kN>1{DLtKUOv#5J)I-xOeA&I%F_=?2t4yDULZIf}Kr z2>ETJz?o)@ANJK#6-DlNQDCY8vn>Q1z0P8ry^GS^z9MBPjN4|cXF^99h%4OV3WRC0 z$a{U!ye9Pmo0m!ZD>6?I7ul|z*Ey8UN>Y`6Mr_rVtTg;${@)48@jniIP1v(S5nv!D zmDut{^9K8lDnA%^Atn)l#Y$>ls%d&bPh#eqdXnG84#I?CL`m~786pfQSSMA!$TLW~ zk+yTp8{D(tSQBV6H;$U1UE50it1Lr_Rjex5`)hWcukzr>jr)8C$~zP$RN&s2xh>Gw zP$ti(B@VQm9&l_N{3j$G)-+jdloEFk*mRkd6AYyu{Kd-Db;)vz5?Wfq&zCt`-VR>M zpsw1pd34;d%KJ`2>b(;Mv2?r!uax9T8`; zocaeuBhHlMbD?H-cz~}HP$slj<{JDcWDH}YllF@GhEpSlEoX~8eK;AjZoa)X#((3& zoy-$&mmd}K=h1l?j4eXvMiDb9zBx~#sHIsG;@bf3+0 zjA^znBn#YpEt8Qiat8GA$ct1z`eSkM?Uy@(y;*N9+QaUT^nN6Foi)#L{yyC5N?o~F8Mj2wS_l>wJFcCCtpcP5sqTMQp_GvkK^gT9_Q4?89mmQMa(uhwQ}TXgndgr z)nNG|>6v`8&3gn~4zXBHP^+&*W#xHwUA*b@;E@mg(#ty!VLwiihWhQ|4e^Kmu=Mpe zAMtVSg{0C~O)gMdBu3fh0{KmVZ zG{g6TF+o|UGuWNjI@xZ7oe(yRNzqQYm^t=f%X_~(nzp}AGwT@!rH)5IY|(JZ^qM^Q z5E!rT*Ad99c@_HCj2O5&7#i|EIi=X~gZv5E+qu*}(Q}0|erPrNj|161;X4eOG`jqQ zE0&=gx5R>RQR|hn<1ssvU7U`0l=tR$^zmA*m_fK3;m12h`-1Lp8g z+FxRC4rvm|vV*ZuIAO9`@?3fDOOM>$Qkb3tslwTl&mCAOCq5io$LXC-o5g>>>l=Tx ziZ`uxXWScb)~a^*J_!K{a|zcS+!lp)prGy5ug<;+yg3Tdx^yqj>M^lA^y%M_;PCR~ zQ08C2vElDejenBdwo}Sw#J(&M31bZz|MJA|G*5FEJFbmK9Q+fBRi@3ca$w|IJ%R!v2g2`N0_cUTIOwg0*k!_LTtjR*RF0c7S<@ldPguv7Sz9jP%2rBkN~N_ zIsoRycl(ktcBUIh~6x#GNs8 z;`98Av$-D>rPv>83!c8pN2YFR09$0Y)NwlB6pBY~fBtxsBHdrhBkRWY-wC#h*r`g! zbJN?P`-HAokFiIdYnWq*<1U|1y009iVQcb__BoIDgR#0cu2sL*-M*wx<${{?(%buC zW-Ucnvb4n1x<2?$;@@*NM29uznHyp@hEeMWqO!~b=7Bf>v%4H;fPjb%o@0|{`x_nx zVV`(4+GF=loi_A7{wwF_ry0`1thYaG2KGcjCUBEl`jr^^oJc&`Zuwc=+HGi_&RLoP1!_F~fX1XZ* zI|lH3DMo!pf42{0#ibNNe+bos99cc0l_*08jNfUA)7Y0}FdX&A*r!i$ zt8R=Y!!wjAaE;L$;k(}hI-{-nZO4~tQah}`ynB2A{q$Fh zHYmNUCUns|ol{fmAfnnx>%UP+S7QdFTq&Tx!~YG3iOAoR!uOdcu+P``l{~SqdELP_ zd{!vw^I+;H5Hd=HjScgO*JMUqAf_9;^#LrR9u?W4cz^o6w~VBg4!4A)E;<~8W^pMX zytw&6YCltIvg)y#bLP$QWMF$uo`KGdI}3ANmJJGXmc+N%k@7e_btek$wPK&KJ0q0gXu)0q)Su<{JwzQutw$If9Qe7}tr)-h#onGk}ABL0&GA`l} zM-t0?Ay8z6|2ibiJ>9rq7;9+2&Em-9P4QA-fpt(jP{v9YR>Uv260NH|wLfv~or5Jv zk*uM=r_4+}MVm;So#>*HJfq&kYpW+jMAMhMu8ppJAz4Ofpn>LjIYWY6xJ#`HHK{?@ zOqL2(Ypn|>>IJqqw*eSK*&FL%6zPS4vE)rtmIH2cGLA=I_fp5PO9^7C^7Pr|r@7N- zb5-w@I*N*7gEU#~;K`8D_0MmMz5PG>>qjLF&|d6CS5IFUGFd72EB!gRFyZsPM=kX1 z6R;#vM<`2f(c41pLyIyuY>LH-p%+g+#N%hxBchfo@f{S;Q269I2Ac>fg4zWr>)LMU@63kK z^6=G7|6dh|d828rl9#3wSZ)9PA$)IZ=SXPhcN4%4-$I4uL#LzgqR z%43d_7A6L{mtsa?(p-qXhzi+p42}7l-mf`lgArUO*F$R3CY++2+dfQnS#+4&J}K*X zZ@pZ;2lN(Eld5LH(o>3S&q=dyZ!9nuYbhUHrh9#Qlq`EjZJqn;ubi1P13Av^B4niU z3?TuuhK6?Zv3q;qm9f%SQYCUn33j!YW}Fw4mFk9q(qEXi=U;68dWGmhTWWx;ykrSa z-(+<)c)Ur_KFszJHBH*A9=m&=KVJEbyB<8?pvzNVBLU7_ZQJh8-1V(CL>`d*Ne*8} zxt|#J25T20iKeG!0o>o|8mtA1xIV%SO|y{6$QzH3<*81TFt^cr$7W6+A`sqn7hY3z zyy=%|GSUCO-jcIu^*DI>%i0`8^CKvA`>sJB4x`7Z_9yt~d(o`hiR6~X1#|MSVW}R5 z{P`KHYwQhgnukl0;wqUssBt4S%nL7JSbYxbjytf1!a8yU5r+Msxq|SSmXWuB=e2t= zxR@k8!p!y><9;4GF}{tdudvO3QKrL|Gs7Q1>bW+vPv7YA7&Td*u#9bZoW8b?U;9A} zf{w9;206Y4yxug?-kfRp_U0r~8cci28xi*{zd|cMS~e^Ohy|l~WF)&)anRP2&pn#r zYf`&x65TV5Ry!9YIMV`KQ*kAuL1F=9vY2F3VrBg**yOX?jxk=1dgMcrRc48|$LFZp zFj!tyffrhrPc_PUhW#If1bPP=OC|LT4x^)vzuAvt+AO$sSM@+G`<*Ht8|mDS!k}iP z%tqY{<C@2`!u0W=GDTMs&E{ijLo8|`IAH))N$DAk2X)6ZW2gBUrym1EXtWAgzf!m^6&)Lttba#*9+=+-DY@$o{aRXnh05~C2{O4K*z}Kc-7+FE-6{CIqaFt4vr#P1#E8 zYb%2ya*XWq9IjP;$jyqT%vn%0f=bss9r&w9(!~s)8JXjTcsKWU#iS}Z3^<2>gjWIP zn(LnKQ$Ah;R!<7uH^)aDMN3^sBey7B;}cELkRT_Ye?!Ey;ENhKB`bD&Pyu&98TqkTnD7mGmx`F=|ijChT@$*XrSs!Q{@2$-sie0}jjf z6*Ji*BTsaUo|*0V&GkS|ys*ZNmq5Kho%LDY{zk1cTPs8Zj`8-h#_C+oK;8`R)TDqL zOwc}H6)$kBe8?`|KW7s0Cs{f9228v+V=yi;p~|8$Hh(KOxT%7@#?;)Xxdss^Cn^%m}yOh<3qMvk5f+(-dR+Z+E1W# z6EJh*CZ&|k%ARDN>TVru)Nn%7UfeA!%ESjN$pK|B*MkSSlAZiI5mc8GjQ~#skl2Q3 zq?aUpkI5qj5eYz>szHO^87cO(`~gr=Fwp1hUr55H_fV8qy8gPjs*XKy|@3~4=0hDztXd8xELSX z5YcbD$Vo$j{-vNCWnWK`k`F%G8JCJ4cY6jny3a0d?Ww!v-Fa>G2+Pme){VBn?s@lU zY|obF@8vv9MhEYBsl90^7`JK#L0A;=9xO!{I76>UifXbC2{0>0~KvCIfth- zcciT@96==?$Am>t`l*^E$H7GZ!PKf-N>RCe!LD*wU%AQ34jhG@yYtETpZXe;s@V-S zm5|WDoo3lX=I*7WpJJx6F(hTU)Q>mj`XSQ1A_Wmnsg*`16#V^{C>W9!1zc(}K~*jj+Eccy-O z9$d+C0f%@aYDxanRYH#K*%|>lNpPnmX!VL8N(VQn6nZm<9PWaB<#JMAs)VnBU7PK% zVang*8D$o~YzuCEzdCR3u}sICWt&fvejF73U^XCs=e??p2H);kDu@nVU_7{e zb7f`12)OmM^QvahJI)ol1mgJD&c5C2hwY&@2hSWGz0?^;$H@<6{N771)yME8Om!ON z){L&b54HC{(E=~Gu3|?fA&wWsim@}EMYnAfR=YaASP!vzG_wb7KRr$|>c-O-)@IFg zYn^-WO>s$j;Z{}V(lSj_G;y7X<&6RA2?Z65*o>g;p2tRgcX%4& zw~cFK$FVmVOL0m;ns{DAtS>XfwLNZ5h{UPy1svhO4F{yRQU0WNd}X%~Ri;;1$J-57 z_Qh#~Ikeyj0f`Y_#|wo^gjis@I8aImi~C~~amXw&Kk``;(}lP2!SbXD*pA6}p)uzd zd5`Rw8WLjW`?M}g^^4+&w1!}p0GP%pOd#kutro@oiIg+&{q#oeD@2%8<%C{{-ygA8 z`Zk+4kHlTt{Dgl-4$ziSW)f4gSG0m>j@V#qI$XT6C)v_~_t)W*X>QVmxjIzk>cjKj z9lEQHOA00S+e3|}A}f2un(>=73Ewy30_^VTXEi*pJshZMqb%bUuRWP@uXFh%sd>JR zt8+ZlM$S}FW5=sgb)G~x4@OFg$Pt5Ncb505F6V8l9;!0>V?&9r+2K*Fob$EqS$rgq zsIgF&_RSO1w)#){klX9dEa!vO4wI>`9go&S9q=AV+nvG{*sR`K0gw5ao11BfA$3l1 z&EC%zR!=yz%0btaanolR3_|94>iMY^LW{%HvXmGq%Ico)Qdrh9>qn^6lw$AR<=9GJa19A{{g}v6hseOZx_y)n)L6ts3m=NR+*Th z3F_;Jsc-maVdlC(R8D_#IgDsF7up9AN#v16t8br6HM;#>`IeNPid_`}x2(vm^C9}% z_4Z3%nH`(KdisXSD*?2ndWW=1psl*Z9SOkIiy6{d!OSH1pJ1oT=q*9|uWz?4B*^|! zj63n4{Ec#@jqZq_-n#ea%KqHU8f|tQcVI_vSo=5=_Maccsi8ZB&?4uN(^H!;0w}wF zcdfPb_NKXTvQVWGA+}j$4g8*evKo~PN4Y1$ouvKEzJIqjBXUf3r)Uo`kY&oQ56Sa3 z`}}t(XvDlwia0_B)C|={z|=1ke4q3VkB(yo_kI`y?)sLTX6hK=j<(iE6`DJCCl$;_ zcDB1X#L+NoT5S=Jp~ekvEs;lW9jRBig)Gu$OFxO!w>|b)FmEiuc|_-38o6bSM0?TYE?UsybR7`T%4l`rXf)sxSKC(Id*ahIF>10 z$Uyk+lk1IF4|?P`sXHrqT6kk~xVafGU(Q*vf+cU)OBX*pcqq{jpmTy(?!(J!6nX(%mdnJF=efA}O(-ZS9$(U#neTC5`db20Fid7?JW6(13NQv3~_9n+poH zY$m|i=!I0|Ad<29Kt@UmaD9PZ*z*`;^Dr(}A4SDGi$SCYz!kxJCZ)IA^QPHrRc7aj zkJ2SIlM^rMaINmLHhy_ZpHVru$a0z)=*Q^Z;OG6JPVY14FoA-fRNbr43<|IaPERy~H=iK$igzp}NYL%ZY**bc1r>oxV0mKT2gd{@>}y1@k{)NV2mx_5JDC=XP#1y`umZv&-E7BvjyttXxNOE;`Wf6!ahxO1_^;@te3p+>0 zUTR@4qHSCbiF4G@P*^kjnCu_*_4J8hq*dy~ejwK5SlA^Lp3nW{j=g3un1K7S{=>wM z<@y=ksM=PEEOC3&ROq(Uch~2`t(ks}z=`~R7mx0`LDf3;3=YB5B|d_(P9~;w_da)* zdy8*e!AN0IO(8u*9AtX2QUX9ywCRs#M(_%$Qs~6543Z8jah+HnT&@e0CZrZHqop!5 zmEW)st|t_z8pOJumRL#*2>ODpK~BK7n9{{^4?sNAQyJ0rYi(vl!#l@J#+Pn|uG)x6 zmSXT`mG;=MO2R0iaBjl2{zW@KGFrzF7eU)W9j-6$W`>lhjaa@r?dV-Dsmq5}UnQKL zo_g;i;Ll1&eC$IC21|hr(E8u(B|A1QZ)F`baoDRMm}QG~=)3v=%eScqlHcj{SR$ld zsy8kPLy2i#O{8(Tk%_g07r|B}OA}J$FKo0`lf2qbjniSv#fdHG{!)aA~jMKyDSd&DG4wp(0(kQIF_vud~mdK4n`}H^X+a zl$XFJ<7;e=m62&;vV^Q}dv`>#Y>ZG>Oe6c=PrPWg8QF>3S}XW=^kx=P{j$kd19h;l zu`{6wl3VL>;mPzV0uqhaRB>Tj%4TqKXnp=Clm6OxH6|oSLp3B^SjVBpRt!F)3#X+f z#D$x5QPP`?XU*zOs21Y6%en2)G8RUDTw}aF*j-uZiaOxhcD$4bZWygG-PeKe?W!lf z?~?J(HIU|yN5k=dP&*NkWtNs#?l0SLec#tL(u(58iE6ACTv=04a=ffbg;i@grnz*i zjnB@x;%z5l)$Pl+Lyj-~K19aB^8ISwXHgoOCygY?Na0{d0;!v)@^MVewf>72iTA0c zW}2sPNr%dATL$m|E@^H_f#hg2XY&t&afMQtF4@YDbK4)^Wn5Z@wIH%P<1Wtf>tVmS zX~_F5J=GtSG6W=U4F>h#((`Lv@iaJ=1t1&N#Q&H-e;iC(9VDzZ+e-sr?_EM)93`#7 zL3R#kqsnIx0{i7-JJrAcW#8ad6u)y@F8xa5t9rn;E7KrZ1fm`8)__YHlKObsMmq)l zFyM$XjGN{b$0cj%#U!Yieb787ss1$=#VeivK3}}TEU5mz(YKcaQ4!IzXmh5if0Sud%QTXF?zo1;&~@5efIu`E)2zRxcqWx%S-Lu} zQ51LMqebYud=~>44>5#i#Quxp+jnu$i)>d1zBWrw|^4NRZ7>graUf`8A?$15_`ttnwx;lUvF5q(S;_fAs zWn>RHyq+dPm8CIiqsQ;^&OG1VIUf`2sRp#t)n)maJ3ggL5O9S(AiEmz0=J%++=<8X z28L?UaT0oJlUr@+&E}3`l7`hsGZx&Wt(VjB(fEU{Rhm07w57H{OHF|1skCGPbhM(S zFtT)>IxUs7V3prilHIS z$(fga>(9?SrQhD3EDCOje=*RWEcE8l?Q=>k3CCrveXLDJFF*Im8kkiW`CQiz&ECs~ z{0aBI;&b==cij1U`I^Y<6FnKPznuz7nt3!CiYm<;D;o0UVB;MHa^|By&bAi`2J^cW zbCsK~pr72n=7Pv{XzI2p>3wvic1JX{VY2@YZ*+7b%m8_?Fr3Bc9#4!7pv9hO=;?`R z_KMmIzMFNhPAv*yzv~`-D6C;cdOqcE-LD?75NE$KH6?`xwo~nLkgMB_*+JJ@mlIPg z=c=I=)E@xcbV#GPX6{Zyq0+JCz!N_RiJZAN6!lK}YKCD7Ct6}In>l2m(#(P~r`i9U zL--v<_{wCwl%As8YOd6mBFwqun^Z1rlReH$INxNykyM=TE5l`^Rk)MyZy0Y>U@yB= zwq-XFjkTkiI?8p0c29rWbC68E!79zJt;g^EwhVZC{elmZqbGN?R_^PxPKtnRTToEv zHKq*pTR_m>#`5wvYk|>-68pl1((lBs|NAy7KuhV4_1l`I`Tz~~T7MI;3*T(W8j`hou=xfYxm?OrV&xpD8{%ow(>V($y&9^_(4TFS&tMIL zSG&^hzq+4ORip!)lDgyIQ(~wW4@=G#Qrl)==3GN-ADd9G`LN5UHjcw!J|zbdHLN;M zJco51OLMG!tX~l==6SR0%ZyQx4kC;&`pHTUvA2HEZ)pi*|2kM=5G+C1GDIc7=grIA zW+(6z!aD*98S zHl$h*Dvpdk6pX^pGY$^zmaB{;WQOmGpDS>ObKbgL4(6FToqCuttj&)JY)_r>iE0c} zL!a#CI=>&BaY|M3H#2KQ#h1ry&g-_zQ1tzPZjZ(NB)zi1_>nXPWs8@BwG(Zhuasd- z6_p!ZZYpbhiMhXY;Y;LY^a?2kmIt&DD+-<^rJKRi(r@R3AKE<8e-%;dzWV;wFBS-w z{-$!H`R@DtQN*9^w?C(qqAKBjhf@zK zjs1s)xaKQT!ae;fPxQXDC7`XIY*)rVc(DobGIOsI;JbBCD4JHPhx1 zD(C(VvHIJ|ik>FTj`w9l`K+RArSv1W3cbJQo0pCCVU^bqW|p|W@Yt@7G9?VtfSqB3a7eyWD?0F zeF&&R3NZY+tnGUEl4zN)pWh1kH54_OaK&T)e-7vj3=Ul}wKALBhO;Fa948#BCw%oR zj@n=_GSrHVkJc3ir@~SDv*WSzBukY2&tSbvVI8#h^4ZO5ml_r(zk)}i1AMo_t81TE zUwzY}>y0ldk*c6yPSSq?FS5Z@I5lxp|7dshcq(=8XM)dZexL9Ol}Ew%uK*FPY9ztH z>o%)C=#na%7b-Gz&@i;~@~Ro9`?<%WAS(4=!Yd0S@*FWpNxKjU&6)k(A>HlHstE1X@qPCL; zNQ)#m6bSAPrMNp3cPF?MXbKdkO>lQ8+Tu>p;?SVQix)3Y97=I(pH-&tvcL>^a z$if%z+TS!QAshJ#$}?_bL``9op=JlQWQLqoa7rp85RBmCn0Rs!+7slB5B$g01_F-5 zWIe!U6blRf(E>AH(rp(nSP>{%AC4Wb;~!Wx3+2ZR4$&mV|!ZiS}k z+s21XQrXG936F6@^W(F`^v5TVd7veG+`#m0B!6WuNSavLKh1uDC-N%;TWN5BCCb^L z4Y}W}2XT0C5l~nu``dM~^4jy$cZKH}Hzrnpahwn7?hJ3j|4mYX9-%#zHbawLsEoHP zkO-XI@eEWQ1o;N|2KXD;N>_*fcH1L=EP63Q={j`xj}Wv~)s3e@b8|zuur8j`a^r1X zo%A-@$sE%H-Uj;x;h!|4!Q?o+f0|EthcxS&fb%9EID#s<5YjiXc`5DF4=gmub+8cF1upYP8SR#;CM*mh{K8L(bJ#=^ z^5Ar?AZyXvolZ8?OlmW>=XM4@#yOUDVm`#fh5;~PGjzWtvW@^{i|2!#FA4(8$WB8Z zovGMmaU@pLPREDT6=|1qIWVbsnt>2st{-i&FX~3M%H`*VtP_NM)r(nGfb&=0hOE;d zSM(-n;nWl&EY@%fLKW zrykKSjKD!VL-HjQv;gbr(NfVt!)=gtIE?s)0IUOZ)x>V^QRy7;rLdjUnt@AL)Jz{! z2}s**P!S(0&8zP~^eni8*e33ar(n?LhH^&wdA}=y^WK!=Dc~Y^S{m)c5jp2d_+T+ZhlAT#(eBK z(|m7Y2?E^pJ(`ib0sjV0Lh8Iin+R6JEXy--(hF&3|H>}n^t4jJp(MY)_7A)y;I}&g z;0SDAebN2!_-Wz<-W=^8)`thXHBUvz#EFOfi%*}$L=nksyJj;V(11XI&9S3nV0Iv# zta+MC!>36p?AXsrwi-r;4xinx9*)&Y=!wY4vf>;apHXHOf%ajfThbx01Fj_%JxjEo z7&K(y3>B>$3-D)f3Fh48TA&!w&SYDF`v`%TLI;dzNeW}GO%k@r&L852FC+n%pVaty zH?5RlI08aA)E_hTOXOXobv~|OZ&ArhBgJErXAkl4@xT}bwYFDadNI@r1z1=Dx&9%7 zv<=YD6BP`6hfTH;T3)0rZdo>2QbKl#TDuyPpfin$=XF?#4D|g4k}Eb70VB;oNU=8X z1xVHhh#?iQkr>_u$-ea+DeU4cA-kW`^)o1Hh5mZE7aYEgd)Mn{ zNn9-48+Za5yQ6g~LDR1D%6i1u;(*9Jyu7RtROO4FrM9T15}J4{f=yYCwy4cz+w(g zg|~wT7a#|=oqcQt?-_<^@8RQ}r=V+)3kyXK6yFUJLn`@V^k;VUDaY=u(zPp8FF}al zE?|Qc--~k=s24(fvmF(CfnC5*fA3oOz-j%{cr_M(AaUBdmb-dn^v2!NaKnMz%C%*3 zI;|jP>C|L|yS*ht*I~1YN-s^|v*pW?znCSujyGVd=Wkxsjc|7!Tsn{k%wsC6^e^sF z!~#zEf^SMGe^|Oya9hwKHeSbVOgKIB^2$8jeU_W?n%D(xhK4-RGx{gYVNxuc zr~X}h)>1#e&&;a1w-@KG@$8(xZ1G<9bv){bP>LdMI5i(-Z#eglegf4rUo<}vjOD#_ zZy~W zAE~g`p(Gfc2J5`oe+yRP+`4&$9Wjzk#dErhoUTP9G)(#G`zLmOix<+!tnE>;xzz1WA zp@twz`2yzQWhm$#&XXzKtMGH|#Dnls>{4KfZhNNAq&apm<#f7pW*HiX-OQ$y1|Kns;PbIr1qFOqeXV|W5S*>AZRh5tog zdeN*f9(l^|fB+sO2+T#M2_B&-t1$MuxYsT8nljY!AQXOx=eQ>o=^v;|Hw!%g>*kB# z-EyTA!G%FxTZ2-Z&7c#!pF$Lu!7*>`d8rG3;f%cK5;m+eZv)oB%F4mlT)UuZs2}YK zEar>|Zl%pa*n*oNiIzZ5FYq-%PTbb(2+-@$9rYDnIS(j5<(ZMxW1&y>3$(~D zVEW$%;=uE?fTRGm#3o3T%o!fs2Z;2NyEhCZK2rD%YJ%9jK}7&(anNp1LILAU2+d>w zVGuWVy>jRhc=m2itSz&OG}BD}j5l2qVz;V3aZ$9v6^B~r* zIo7YGB-kLHI9R|36xBU*sWf2Vzi(Z`8k>A)a^Gpv2Mqo(db=xYw~)c^s6A!LSEw|> zCwca6J0f$!i^yX4nY+o@GJqC0#Lwl|Kb_F~zPcl~pc?ZIJcg~=KFy`p*M8rXYd~N& z$Kyd@+f>R=c>Q8q+wc%3kpi+rNQTXSg3uVoPI$`Hm*i=`y}spYy0QQhg-KAju5a6G zE>z)UQ?gG6AS}0rg$Z&ci6v)x`cl2MMn3-iNR5@#;`Z;`!`kt$ANa)F=Dr&ni}pZM zerV|XRISf_r&E5RspyS-hgB#v!StE;Q$dYh&c2>0z($egcJY zKWiBgu_u`yw|%}^gcd}1dv%Le3)ME|`;F5Fi4o7vO>?EfBOJ2Xo(lPP1;CbVeKm>qvH=Fq3<)wA9ZFsZ!8GTB}tPIS=)u^rAWOOa#&o<@%7w} z&bv+xDdd{M$gvD@MmyPx1&i4LjI=+Ig@xF|V8VU~8$pu-M@T}K2xmul$b62@$yO>n zOXM}lbT~{9>{G_P8vj{dj2Cfqab=KPd=&ZBeVTPB?ISRElkqDHXcG2eMKX_)bupr5 zG;7vni{|l#q-3fuBoUU~5-ej@HfRr%mhwF%X-pcnL6LUq3$H z1{lzybeS}r38v4~PzZ(J0VZMJx^%B-kj)r>=j096f!tpVD+Eb4WKhbtW_{4AD0yRp zR;ea3XUoSG$+gndzIo0B3Vi9WK)hHLF)l9Ft+3rJMki0c(g^d=#%mb)6=qa>B~ho^ zNbjNZfL<-?*^|POPIq%D>S;7W9}QOtolK9flxuA43F!pB@;uvCg7fu~y_IWSgwEQS z^ifu}@peo|QN-?d@qByHT>#GqN2!c1fsP%STtvXFzqan*L9{nkj>=^qQrvs@GM&M~!bD-3XG-x3Z461e zStz4g9suxmc-kpMVdc*Q{fj>(`~;}8E0|^mDi1_dVKh?ZP*NXdwXcbBya4yShMKZ1 zV0)V7P@o$D@G2DUT=IVQ9m>Vyqu$lKYHN;JYxd+_L!}4!v981z3Bl0bzvtr@kzYAK z(4dw%I}c}BnvQTr-O!SkhTq>5yycpf3QhU553!kvlH?@#;+2H>;=XQ%qaH{+MsE`) zLF6mNUzNQ;;cYQN8tHCFzd+gS2O1!Mg!a2FJ?xo_FtG#Q!a_Wt2l_g2i#7_~9?6B}e}FcC63iWIj$#$U~&Afgm>X<**a1} z2%^PUN#LnH_p%}6zU-8aHY-Q4RNHMc!6)I-u{OW98Ax8Ea(;Xmm0aUq7XOe(LL*g>9Ii*J3PIGQy#KwfCv(d<~9H6Pn?Pr5e(?0RZ%FYZrhy0gJ_lR zeAVsnY0w)OzJ;hHffi-~IFUfWWO6~*3RCQ2)?!#^ouw?$#qij~7vSGz%g1?400Ruq z;);iWa9-);d%Mf;79^Kvdhe4E9gGBogm2|QOr*nq|C|~!QSzr3WYiUlzxyblHk}r& z^@@+zny6eH13z9_Xe`opu(AXZnC4{AyN&rWoQ#HIuf2a?x--$kn4YFqrO&7FRB$TN zR;jPhW6(^@S>}hUY5p_LIZ+AUK=I%!CRU=Y62@2D;+&+_9%K7?yf^C?BE@o8*aWKy zRFSA>gKE=PZWQd}tU*S*=Bf3|#04+HEI0g+|px~D-P)2)! zUTa4^px>b((b7&PLSTR=c1%2afD0~T{zwF`oiA`M>nP}bO~att$%-ijzpwxK@oo3x z8)*nozLb@I3mTgge?*n%H0Yn|@qC9_W5MFHWT;p5_}U#x+m_?T~e31qJ~Kf|FKtxTmHY&FbYS7#=fZ@TTqCDmNnFjf8nTT-KNNi?*}VQI4x|65`3Ur)L+q5 z;PrWPY6U(y%C$N^*z2&1WLT%a;sM-Y*I6e|QuKZ_%S3ExqO{bTgLH!hf}Xs{uCxbL z-+w0F`S@%BC!yDu@yKZ1(`Ud8API^6Efo`Jvu6I z#(*%`5ZCCSCs*rSzw`T;GzslHC0$@zMLRKHZCBhDi zZt0!1~SP_KWh0fE$ zyJQ21+`tuwZ}Q?zy_@~FdD3_NrhQ=Y5j!TfLZ(e>PyUvaFs;VpM5dXP4ZRYL=R!&F z4rO^3;3D&J-|u=>cgy$@>OAS(R)5FsI?HAIs07Q9uiUGtGc1r;pvpYKhrH|kqA77^ zwY2=WqI%=V(0PxY0n~cF=P^0MdcmHHYpmm)QHH0rEG18QKA8KEV>hI$godM;f-T z6r`X2X%Z&SXbG~3O)y%hWzs-u%pqSrre>qPxL~G`I=_2ylHeE8lzqU1){w8 z*UI_Q$aQYz&a(0~(6&{BP-u~Kodc&k^Cv=!o@84kdO$cisc}oo;R87G@HUU753rFX zO#QJq8@#`9!`MEnoQHZK2tA=!Tzu%I)fAsqIdj=x5A}R1GmH~WL;NlyVNi8F(^T-p zKGK$e$AX;oh$bai&`tAblz$YP3bnYREdPlbCy^Gn0bw`q&=*=ZJ z=XBVJC<9{W(LG9>LYs&NINM(gD-Xy=&ZKUfr=}Gxi<4JNVmqwm7TB2UUgVUd6x8VX`;%rz#Ng-`Wy_ez{Lz+1Z)H;b5X?qn{=|?PV{O@k?A00)brAbu!$cL)xNdKVbi(R{K+IR{V zS+%@biYchn8gy=q`$3aOl`0XSb4lC-993v6;8wQi(4$d1y9y!jHzF z=e1?WcQhUt@4L!r=4*43;tml04f5Cy^c5Qg__*S$bX%r<_KN2m&+QYDOEf+4Qir>x z-m;T(=^U>W;EB~7;Ke)?;Fgi+U5%p@G1S=Oz-g*CE;Pq!(CFft;h<^elFnV>@PgB{ z)S#gx+u;QlkKS0t|8~#(ccx$od?1yZNrw-&yk4(vfwEX)HBut*xAZmSu)s&sgV*Rf z_&_WPgBKRmPPG33i_3C-r!Sl3t87V%uuoF$Q zxY0}Y{H^g`p|3;uRS0uV>!?@iy6I8HQ1obBbn7$fFG7k4X^E_tTZ&3CY*6?@8$oEw zld$nzkth6%CsaA@o+d?Yx~>*g&kDar=Fn{dyzlH+DvBoeE)SowFvj&A4kJ3~PgvJs zXzn9eXo_6Qgtd8Y4&5PA@^V?kp<_zuxPwRh1MhbU7~pRD-Qvw1qv@0|ofTC_stAz; zykPOC@PL)ph|HJzlXo;7nSOW_jmC2IjVfBd7bMGd=d}ba9cGHUVm-AxT3mE~s`PGcng8_$gM9nbBt~ zqU33&n=|RrXz~v6Sy~CK#RnQ3|Fx_y0#7;}-ZxXc?rdM-Rm7qny33VRcSLM(a+XvcCW zBt*n~yr&vf7@U}9hC^yqA{)gK9vh?iQ$}I2(xqF9KAuDMqmEi1VF|RoazF;jVlRBDEOZYK`zb9%a3HmzQ+OAKXcpl9;nVFEk2YkP% zuP~e@`*d%kS2kw*9~HrqCP~o%|9_7^Ovvv*4b0pIW5OL~*U#5-(igmN#`1C+#2kBk zR6d2|-vw*eyyqsf)+Sh9H1+a*0{N3($>rvxmBqs_HtRQY+Dbado!LDM#|V zHmfdy>(+3Z(DT|RC_i1juhvhnY!~Mr#+xrh_n0V?s1&D41D|cbT;UD5rrG7i7>2rK zVA8efEOsc!hubF3CN6_4hw<*kId`a`N;OT!-nvF&$J4B=RJNz7bP>s7Bf@695%Dw` z``;VpBKWWLy0|u4Y703vgpw&WPz=nCQ>RbQg30e?_-1~H);mepvX~>Oe;Iw$H~~yx_>3XBt~j5wvgTLkg+$#aXB-9UspLnh+&3qHP3CBt z482<4V6F3I)!(i9=QMc+siXM-A|`Ycl97=(OkUmjX;Qa#;_7Ko@X4R9kJzXFOP$&@ z*IC!O%jY*pU>(r%GWehDqjm5ZFaTI5QDF|Mqihid)dyVE)MbMVjONvUByLjx;~9d;05pvP2R*IUhi4cqAOG(;)+(8LqF;@9|V6??uvw$83N%L zYswL}NqbOKBlRW)BOml^RZESGJVZ;nGBWu%C^YxTuFpJty;f8Voj%_E z6fNrSkwe1W-IWCfD~?50C#>O;Vv@og<@g)X(S@JJQqX;&P&QpyYH+YhADj;pML3XI zleNl8ve_14ht7v3YDY7{;e8iRBf}FT2OUDciHQsoowP-6IF)KnJf-CIywcgu*Wsmu zXgO-M>F1xYp0y72EbtS0Bb@JYK0E4&o;9SE>@U~vKT-K$E9$SHQjbN`D#eK-K=f14 ze#c^C*pbduIuu;h(YWtv&rj*^YI+jMEO|~;udlVW$Oe9mO{<>HAf%8xFisj^N{q*k zKDk;!Y+aHru67$FX zJQ#I}cf5$$e8LlYE@-nq2t#RCn}<1cs6dTBM@8_7%_Qlzh^Pd4?}Cs~2{35yL{7J~ zG?lZY)HSSKrC_@aD<0Ix5&?OHya=+l$aJrJLhKWOEy(tDBXA&3m|KepD1W@2H!Kb6 znKYE7uTtqtuywG?ZWkkhq11CooV&Z9yQVjt1p*HP#%{2W3%jw%hZU5Q14~huc&`X2 z_?ce|j#8Zz`tk`ud0-l!pO~RKIw;~S=ShP`oM7Fcqoe)UnEfFCAh+F5HH&@o_W{ZP zaLjM_K@AXsWsmUsio-gU|8`IZ|=;43OkH_7-Z9%oIGM$82>yw z{A-Exm{zihi-@{A)7PWTU(%*=crw~fd96hVs_n!a5Bga^g4p^er=tQb_{rAS>+zHi zTD7=19O=bO7+v4P2o&7$$t$m~rVw;T_|phUMylh;6VYx%0cUxwY?m0vUf z04yW`U_Acng*DI5mwbhP-n;QOPA@O6Kp5wJL*K%HUEpWCM_E~EZjPqrOgt4BJDHV? zfk$T;4ULVuD%(3cDm&W$F*KfAyA2qW$31sGB@z|1nL0K&@?xg0iHb_0l@_yC?|BH- zse>o2BKuD6X7}G>*ao14KIJW0yOfRe&l>{k+{FPTPurnmB|bJvNHjmJ>Pl%PN^D62 z<&?|y33CNv^H2iP#Za!_J7 z{v=sY-@uqb;bvrIg%TgcS>ov#``G&Rd^ULNtE`=d1csa(?TLodI!=kn!9{?x5P&n$ zAk}|5X*1+`TC!^cz;R#|oQJQj)oe+Ben+&J^PEBag>m-}x-a`y>E{bYWKZJbbV+rU zCvRa!y|S@!=mq@8pdsiZ6LVY0cOlt?S9Y4u|~ z#R0W}Qy6Y(R*&KPIAs1w8yJG|bw(L^ZI^qz+4jTJ$_$OK zZ|BtGbr|g&tJBbAIpXtx=vV)70&20xn*4={SZx-lzW^S6qR!%EblBQjS>OA$(6J23 z#Eorh95s6K^sy+n%cw}Hht-fb;z(BFy^zMJZb3(+=h5@Wcp|(C1yikvfAK4OjlvWy zUK&eMG!32#uQz%+raB@+8wpmjE65~hLw$V`o!GPnK!3mdGOXxfL%cM}YMaV$zwzr~ ztqmvmkR7r8ltEv~Dvr!U_wwl1iYWWuR9n4%*ovcuzo)`a`rl)1f`?HUX5lDrAIpj& zGtQONKDL2{8Sf z&cZ4o%5dm?D*awGNbuP2SBvJ7=z7#@NUb)569#5GWkjok?e{au?Kuhe^XhLei1|<8 znQ+BWJ6k6=LTH)XvIvF{4Z|ocwwuVvCm-&XyQs>jmXi7$;O9%QnD@pu=5AqzQE7EiRDfyPev3quzCBSSWu8ph*!&*{_KaLV4IqeAN@Jg!GFZ9dz8a?yjungaWt_(4mliFhsth@ z`cQm_a)XLerwS%Tc;$xmF_}i51(BtR*iV~HxLvXlSE|B}XZTA}*Hl4PI66f5qTbH1 zHHb#`>UzPD$HlfE>s8;>dJ4u7KA3BNp`90Q9Gqt*l^l zI2G;ZsFS+vG`A~UBXT3u76;WQta{J70+3E4;(l7J41w-Z3*JYi z>E6&jm%@+*kK}b`NK4~r#gN)8hB*5TZERSQ6Nm+SOb(ZAutYk|Eazg6k41)C5v)Zw z5SgcYEGE~Zo!2`=oPPd|B6D?9I~61;#fS&!v#&6VvU`r-`0psHsWXbYO)^8jHWJhl zp@_<#<$A0HzU9+8wq;o7ww$SFA~5Z)Qy8)c#g;E~H?Q-caMToHRQQSYIQJ4J@feiq zsKHO+WBtU9EuNDL3vCTrob&i5HGd&l_#s_b!b18>@rO7<1>3||QI9&YvI0*F#iT4l zF@B8`@9^lwUu`H%y7MXjR-`S;_#2}bA^5%AJ^Bd~A8-6O)PCp@=m)2Y$w}yE62L4Y zqFkz~8~g8Lw5K|qK4247Y*@$3%nfdPa>^6xO1!FjUe$=>Sy{tT8l!I`4@b3K6!DKa zvT7*kmD}{x9?85sdUD2ij|y@)N0p6`_t@QU)9q;ey9UmKk_fUvN%#cl6(~l-S%vWc z4=x5oArA3UYS8O2LNBlm9oo0>AT|@0|3-XOwH^oMEe5{hm(cOhYFC)Il6?bQyUl~3 zC6KFTO81XFCTa4JKETFDI|rBr77(zGmxhCybEgz}q;yekHOE7C*dsMy&U1vSMMh0` zm5zEx;C2IUHH;OaHB4;GF@iAT#!UR%T-W12a*A0*ch=n^t zRJ%qjpC4Q+Jq+Pj0>dC-Dj|nHRV~V+cg^zm9@xh8f#32~c6iXvq5mB5I&*+gLgdI+ z!>iuf;)m;@>ad~Q^#S#MO&W?n;jm=S7q-`#ZV4|pEIo7NJ;7|GwPw@gL+)`UhQrC$ zbGjm^Iout^*Ghs45sD{5orxFVPkdVgxQDW?7{Z+9WpitowIqte=wR zJgEJ}BtD#rb>XoAHAT}O-NN`s zS2>>m7DzuT@GZMFAvMjI+8HfNTjBeZ`Ng=g2GOxW%0;(ku@Mi1hXpU`6q=gPSd~H{ z>;|j!!$L>G<1K=(`{~w3*$u0%EzKkC&eMcuMpR+#pgkq4%uWZX$WwmKM9||~o;>w3 z;7U48A^3UtPl{j##vux@Yq|G!qd+W1J=)N=cOd;yeH1xb`q9@7Tkbx}QrdPX{f-C0 zw(2e9yJsG*wqM`(uz8M5OIoCVzNf`|+hpUE5A1va6y|l1_R!kqiY3n9+GmH@Jw(63 zu#(v{$qS}aGyVqD4>C8fn%3q{Q~jnHFdqO1V&p1`A5p?~?tPZsn{&t;O|xwxsywHX zXyog$>jbpJF)wcq@VxLcTr7WzFP|V}+6etFpx`XzEkal+Uql$VRYi81hb)6zNL0r5 zNXYJhZ?I#kc7rs601F+%T7)jTzvVVpee2TElGc2gH;D)={^FIVU+QQT8K$N{m$ZD-6uov!IN0M%$9UNtw9j=B zfpaueZeZQXize{9AnSU((MIJ0!Ma3@i|4E_lDGy1oedl2$X1c6)YH>s+Wf zIp>+?c<+6}IzPAk1#C10D(Vf&QW?{o-@~Cl;34O&69?{-zA2pg&3+NO0QrzES4pjF zS^8-9s>YC|819=c^)*F%8oUSI`e)o_?BWd-;+n{#?QwY{Z#CPM-z%PW&CUMvy7$W@ ztDC~l3 zilUMi?MDqx>R}p|AT`<-Xdus4y3Vx1AxC={>bDnKmJ5p*xa?{ny)3490b3>t2r0nK zG+I=wvg~EGfPOPqP_2Zm@PbB<(YIon!s0sWJ#r92%L=e&NHtUtru@WHa(7<{c-Mo3 zQ<9U~Y-O^4?I$~=VyMSwC1<=vP8TdaT)L=@VbVY6-eB*+)-R)foYKPI1tSCSzD|PR z{15EcRR?mz-yP6Wxa$$X61;hQkT>jOC2FddbEqpX{|{>2^~_J{k{dh%r9eQEq3cE^ z68bedzFE4)v6$QTdRYO-Zj3Y6@`Y+W^IjW=|1!+yPrJGR1K!H|LIy$A-^c<;CROG* zbJfdSi?Ye{f5}&;Tf3PLEOiS|Ft%FKstR-AnvfIy9lv-gzwnu(g8-i&XYs|0m!=ui zE=5%R_&sj*>cROVRW8wR0mVhv&xR!GwmN;^)Wea^q<^O9k|fArXd5mBe~g2{4B-*p z4*QX%=`-%$hFj#~4XWjp2#X=o-M}0eqTkG;)S6kBgwX{adTJn2*wnjv1X_t{#Q`yJ z^pbNx#SYono9QHLp3IuCv7iVjao4zGuJ?(;Ti-rBjz7d(iiNw37{uZm3gL^I=+D>g z+m2P5sl$}Zsi$E!{^%WuA@HQI_BNZ2P(t=EF)WO)5R5&guL?Oqa9-}OSaI5n^SXgp zxlKvkIG5S|K&7zBQEia`~VdW(OEg^H~ zvyK~k_Kae_PcA}0W~B;Ox}Q2dN_<>K?T@y4i=lR%?xDI{hn$W6O^K=cKM_t&ary^9 z@cKKUtJKrV*vU%T6fcsK`(&$nIXlAY615n81l*AB+0A>;~XAILWxALRrYb%I$Z!P{)h% zCBDdMRzAnuxUoT@$~^d;+zyd%C%rGXP)q_a=A$>erTrOj4Z4L7s-wbrBFVxQaAIIJ zVt_Vfu6?@u-o;ENx6Y@mz$Y@~;knk7gwek7bzXijMp-(Juf&hT>TDZ4i_h4h(|asU zT8YUhKm;-?UV#pNl^b``pv084OWqVtU%k(|t})1j23jL%T}f+)twln7Lyr|!$eG`U z2idsj+#v7QeL8XE_Ahydq|QuihDN;+ObkuX@csV-%-Swf!ND3scS%QN)OLBDRS3hCy}>gu(VnenlC&bkYZtm zH^8xqzl_%@E(?~Um4)6U2j-xfISTm4tT!L%Jx#)g@Ie)ZVoD`4;+0uS>o^?L^*WwB zRKTr$iUHL!{~t>3S(%Th%`Nv665j5DW9)$+uC^ zf(0&weUxqfmw@E6f$IXg4{s6cc*udPkn4e!I*R1CY|F#6^&MM*ni;no?S8bcDV`5` zrtKT65%E*K85m(|>hsrPWogYO(1@iU1PsbW=+!ee%RjHgDOb)e!MEiusL*ch%0K!G ze9O?7zXka`L_KF<0=*8Eb$hL9xJByb{igq%PFAEceFc&q1i!>6astg2-`9Fxw7}?3 z4DMBZ3!dXrti(>KB4RzeaGxugrLAXv7+C25BHJi`Q|TZosR0)l@1=i9zvc~c*N{TI zya@-5rX74DS`OjR=@xB|G^_NEWgKcKFeL|W2`F~pWlPKY>zspaw=7lrmI!oR(^K(> z==>A%Eqjzfy#~8aViXu1>`MjgRYLOedG=LLO1xsT8VUpC#z`vh03#uoNjW9Ho_Lf9 zJa~r-OOSTHAnmYSg?pPw8b3D}Bq6JJGZ7E_#p}^zST-tqhJe!cE-7jU zoPV0DPuJ|_oN0o5UZ$u_pVl43&Pw*wr{V^wa&u*7DXCD%DP)~@EI+EnO=rs9;Yj)@ zkSxPg4LR}j$vgnNQn(hS&A=%F@NAE$LApi*6R3Q*SD+z9_;b=1r17c9p)Oq;&!PCR zyJ^H!PfYx|>73)s=M|++kX)^H_2b68Xdm9ZiFUtbT7iPn6gPKHGAafrfRa_nRlzOY z6pa7#d8SLv^BTv9VqaeiU&mc1@4OX6-t>XQ^X$QwX7itG%*LH*+fxw^?6)k&&%#gD z##L>Ir-!+@>r8Eo*{NKRLrsy@_Ao4_nC zyg<9q0z=UYr6sUy{+;aYWH5Uh&({%rpU{DTQ;kYEH<{a|H6Au(peKO5*YGZpEn1mV zD%n>lUkZ64dFuOV?zb8L^s($f8WaE*N)3AA4o=fo35R8l*~EBcEJUo&3EQU*Q4)z2 z{3K(U#Us;myP+V|%wWs_0r)8gewX8`c06jhlYi*1(_EW zvoSKI5vaTCiSFuXCN!pKv1qvn$c^HTl?tW`CTEeEWhw3AuwytxDbsojlE5ZZ@(<6nZDE z5@VeZdbL%R1w8q$fd>|-uO>46(0oXpjMe=m@qI|;2cJ3IW1`x1@ZMY5pl|&$aBAS{ zZBpkYdw@QNiaqCzv%0M zB28?9Ly=|W8SvQ*4@ZC6Uvr3Cb(9tQS~-W z)~-d$Nlnc>geyX8LGk_VqB!3h#mL1x^WAW8#rUcF3%3p8%HxETJb-CctQ?eYW03uB z;5G2V4Ced%2u(nVgKnyNbcCm_@y_0iXD+|{Yc=G26Z8}B5n7zdn^wx%+JsIpc?<`8 zjDYYD`Zn5`vdW7vco2Ko1I$d9x704vLt9=u$;eMPMw@SfZ)%9cUX7#IM&zy78k2G- z7o$uHRe#fce$2`bIpHS|OY;r&ykNI2Qk7iykh>+BBu8CM(;{oc!pC^%XHs%fKN}yY zOy_gneH*5zU|2x*S3S%r{;S6RN3VTB^qi{9ep&2|=@538AL znRt2I2$>ggf<5fBuDfD$<@|D$vFZls41_0s?FHWF$c$WYE8UOp=eeCJ-I+RqN zkdf4Rtxq;89a(sGe%wiL{=>I6I6(S@w)+l>pmn$&>UYJ)#i}GUKmvh;02C)Zy{fDn zkp7OXY(6;fmlFUi3jpWYSu3o~g`KI{s z-~37e1nOa#tbpvpO1(4#1B)g3Nbsr;$1&2d71^LMtV#}9+G`kr%k|0zGrNIoasJ5-^*T()vJUV+B~=zk55!@` zw1L072^g?-M4x21nE=3RYuHB(rMMadl`NsY0Ex73nh@tY;bnS2S2sx~XEM+*^toC? zGq58tur4YzK;9sl6_!mY{3{0lc?|77xv4D2Wgs<1{&$PJ|EmA55P%-*A^-1xjJ!RL zY>I3aYjX0wl(H-iauRcZDpMJYgNSw7{*uaB=>JYk>zC6h4#=E!9ujoP&i>y{AX}xL zVp+w(hq&m{QbD1i$7nzt4iW%}cw7!3T`{7)wt2YK+LeIX_{b!PVWoynxot$eS#mZME*W|h+ZURonHVZF*r(O0YuK2Qjy#ne zvo#zIGaojLsR~FJsi0J^9#k{@tU6unT8vP%aE<0nB;;T@tzfR*Ypv0l;zTRToP9YC z{&Mp0sco4>UGMPk%XfO*N)N98EX~`Sf0>W`QqrY}eVKM{w6Tgtf_-5t^uDiGzh=)n zI%X?Q^Q7k7Q+~ao_(Ob_vPYBbLUG+;`{#*m$7X-}K!{cm;Xh@Cg;l z^#i-TxgBLAr=UPAsh&RL$fE1o<-t9k>lgL!CtM9=o|YHlM4pF(4j+hKk$+pHc%b|D zOgR3#Jm2QA#VXIp(d#!AfwaC4wwo_WFH2 zO+~*75H>KIT(#xf#_g<;G52lF_$lDX66aBQC{6}DFfaSp=4fP-^$fpHaO?#{)RBa` ztB2TAaSH*XEh5|<&xmvM0Kt9<&BpL!fiOB zN+b#g^g5$9Ehe&Ks~1W3&G}3%aKCgZjI^dNcoe%(JmQ@-vs^Lc>a(kPa{+@EmlQ2+ ziff2>i_g2xyjXTO-}wAFSiAj^wTM*imZguSb%^^G$;8{4n25t+-2fslPIKzZ#u`83 zUh`Z!yHm>q*94MSZtrZ#A?t&dgR%N)2{nIR3L@e^oKzziz)QbA8T=VWTQMcV(4-FY zrcoB86%M3jD0B8!b7>Thnl9;b&JcUH4_wFge~!?Pwk!{ak3dv}Gj3 z+BP0F|4h)8$2r-7KvsY}-&8?~fH+&Jydk+j!9c*k0bgf0X28T?B&)&Ah`oHE!Bl-f zi8RN~w&=O*c%{3(yK*IWW#t@xzXGShfVuE|?YGaaYuBTPzP>@Vu-)X%n}o|YBHURT zXZ38K!MPIZxcCx;I#>L2k`5|YPBj(RX$3deIYB`cUsq;f!6gqCSUgufu~|lr%P{Xz zht{#8a8JF2=18=fYkxIanbz?yH3m=BUUQ~4^?v5*;;$OX%Wc@6qMMooWt!$BVCUED zMT*VlVaWtda*TTM7=D|_nr$Q?kJQ!573exd$(@|(CT;J5U6 zudSWO_Gr^mljwkl;Y@MXp=eBcsB=i1jyvJYHPfqerIzx*Ls+z#T1X6p;0rG971Zv6 z^!a(JRYVUn(`>?=fc3xtG^K8!>v01`s=ZuSZU52&m{*} z?cM}+#~OC;E^u-ixN;HM%I?uW)4@FWsvtBR=`l4F+~?nJiR|D(*)meFK{TAlr)whU z^_^5y^g|f`VL!UOZ~3ykcHm3rAY+$MbCmDsPb#I-`|qaL zuDasrH*Po}TkQwSvvSXs1b+#2?}MdNDIIMCd~ZA@&|f-{@!iPg7rQ+&f&GDE?`v<% z%Ff@nHP?Rq+Lvlg6ez@;;*n~e$EWVdTD<#w7!ywX@0XzIy!wPWhfb^`!=9WqQtXqb z8q@zA!PHDCx9_uUmn<3M(}gE) zs$)OA8gSN*HQS{NdiE?q`bLK4%J$slmWQVnJJyA#l9PpllZlawnTv;fRMCOCgt>pq z!GVQYiV|;T+)rTZYjpF&-`fv|uS-Q6_HM7!o28xdlCqUq^Z8}cw{-FoEK>35r`-~F zW9YsrsIYQ5cXar7)w@Pg(ZG*-eI2Y*ZF?$f9^+G@+#q8KK@6DJXAFx42YreX4$qb;b>m{nCWRGH4wkWAr6) z_eN{x@BZzwnX9^B=(g`S@vWCKP@c{$_g#j>HEZvFv;9}}JD)oWCC^KqGA#a-?L0HH z7IUqN&N}`j@zmlQCp4n0YU_=Wx8nd8#l)+YMJ8T7M3J7+x0&>yF;b=R#&Xh&krIIq z;=P|qUxk_a{va@nI$jHREw}~GEj=FFYZ1KtDeVpWo$5>7`v0hU52z-duzi%8P(tq^ z6hlWu48183LI*?dNC^>QKnzs`H3UNM9RvwTFVYcEBsA$#mCyt!0s?}9V*TBG|L=d# zx%VU|yR&6xcJ|%u%sbEfJj*it_=D;!0T-!OnW(8BEf0VXI^Qa;56NG?7VhqmP2rt& zyb^hL@|k|HmgT0C)DJ>1#J08Md{gW1<`1cN6E?QpISrw8INSEhWZX&*9zp-Z(59^6 z<@#L{>BuK9FHUoX=7ApH$EXxD(~r^{qHg-kp^3UV26|>*<_<=+_Nw8M26iK`?Zh`c zrc&YeK5k4qR;O_7?|**(Tv6!$`$*r3yu>T!N!l252$=73;^?xEPkvZ=XCVXo(S+q% zeTTOdg?1vNv)D8XW-O&LZ%x+ug=;3RWwj+Q%sh>-*p zZ7ZXp%1qbPRYyhhZcc=pyp^w99saSCp{=<4%TIkiW9QFY#y&lVjG0Wlt<*UWapAtb zpXHuqk~v2>+xg9t9ltg43H3g2GY|qh|J*VzA-`;D^uq4{w*9E-Hj>az!F>y~(N?Uw ztDk*M+1>0z&?)oO_76lBqCQ7U=(E~kd+xhTmhsgqkWbx-+@p1?2Ido{li`UyZSy6o z7Rv2HzW_9XI-WGZ)DLFbmvpouRwT4P83#|ik23HZFADKcY!7HxWS2V`yX6`J{i43s zvgr5h*H*O8-j-XcDs$E=Wh?Kz>&!xt;^H?*48nByze2K{obELuxBEl`IlrzP zcG-TRFp+`b~mJAb7`imq+F*D$1>NlEE4U2_I>fX$AreC3|D z$G06RZSz;-D{`iu_Uy7^t@t@SAN>!~F6l?480PHbnG~h>c(w7Q@B46w{jHmrKF1{~ zrpJDX0_)3_FA8jEu6Hgz1kQhOm^a7HTYIZGDBJ|4;9^e_kW3o>85cQ7rxuw?7AM6zCo_H#Q-pRBw`Xk!Hu8G4*YaT#e$5}r$Zdp zs3|@28-4cAei`3~8uJqDQbCrpp+-x*G5VgPhxnjE!?w=E*IC4=SEueKVlwv}`DE@n z$iH+!p3fZZhnGB4>=89|SJ8eTpz>b{d#*%%Yv#Cu;iJL-M4$HtxGbtIM&x(6u_Rr# z4jt~WZ%2E#qzpKCWnUgI@xK~ha(_{4&g1_4{pDl3&!+c3d4yWE=a+_lviod~@wk6i z=iPf;wTt;%t#5Uq&t86euJ!*-Xj|2H+crvlD!IQL>i$2u>3p7^ulxV!hO|1ITzPdX?;3$EO;R+CT`tV~gMJ#zI$+SrsA^pB1#H^)|aUD294?L%EO&R_VEs|6~erH`Rv)VRs$OwB%Q@OXV~xo@_f;C(Y1?5 za71vV1~a!TJrK~jphl_%1TtTk8*e$ ztOK{V5Rv0FrUI^wi;cCGzH))N@rn{S;SyyO3S%` zVKa%HNu}!9;A>M1xj2PtX*mm07GyErH04a<7%x+h5ys?Mtfc|eq8;4AJ7w1pz*pzU zFO`VGH*96{E)&m`@3SS0OT@7uKfymxK~pIsi1Bz9Fz=8egjWMO4o;2)KlAY8eJ2lC zoq1u+zn3iQS(%uLYGEz0FMlyJE+S_?K-?cukl(bgbgCPRy`J+v9Mg2CyQf1tELAJ5Ol>tJiLg&kuNhZ{n zCf*^bm6*{zv;71lKi*ir36Enh^#hY$fo!9s3ThkWz~)NHHGJ@2h!o_%)_SIYxemh^ zqCYFWoPAwwYi5hNFDSF)pOow3H6B5)WJ&Kl*&(M(DR$Rjl_{!l{u+M_(ebN|3aQT7 zu-}JOzR|zD6FFv!2(ok5x3sJ6Fxj+Muel441d}@0GTP&EUB^4uJO0NI8eQL){hu)) z_2(PrP_z}@0)ezI%aZry0mvRF8We;!^ZgTgm(10^q6IR z@9fY_$g{`V*MX6~ppk2-Emxca;Fi}?e6K*KoPEHTCSg6}E||uUUQAx+`KJfI0a9ui z-e!Y7AZ0ZX|E&JsrLC{Dh0-8M8AhDzM2=pzVf(KfO0l=U ztFKPVHA0T&A!kzcRpIh*v&uM^x+0fEX@mK7D_Zl1{j9iK1@@w4l=fY5jDdiTV zWZ4S&O8fhka?&|-MYhUj{+4o;$|_apoXP)9T1-*1q$cMIi){X9N6uWHKdT)~fs}ix z+ld!Lj190>1WAtPQ0x4Lr9JU3+zw_o*O-$ki?z=oQtjA>Wys>PtTzae%rxeWszR>8 z-6VzJ)Gzj#54S%TR?jJ}?%Dd4d7~E9M)wfraQD#naLMjD^Tv0ISv^_@J22^GAI@to zy**7E^!2@s?qk#lbE)_4p{rR2rgZMXuBt7e?}H?zR+_TdkH2=-qxWS#N(}o$Uwf@6 zPL3!G+Nb2E)D3$|{H%|nVkmS`QHQn88IuGUzn8~HSgN-)>au~4lUzB`%sw^dKuwzJZhjGxG(JzKvPrVu&@~{M4uL-81`VhToJfh6sn=~UKBOS)sR-+f zXu-{&}{Wv0$(AF`)X$tmxr8ibI;bd4Cy=j*f|oJ>;MfIY<51 z6f_I12@tSzwpq?Yqi0brlZ7y%_+1(bZD&oiVzh2?$objZE8D7fT_=yfJn?QlJKgtv zVyoE}_%R|=<;9)gurt)!$#9d$Zs5BM)oHFv6jq3tT}%md9Yl*KabxJoVdUCrJzGwVXecjQ7RMI7~o3 z^sG4}O4m|=`I8OxXe%ut`Bqd9d_}O8>V+i?Lo{6>&8K&D4e4m>-!^(Jv@p8>To0alX9L`ImrG}u|8&oVMNa3@s6QW@(B1LY9J)?fw0jQG(e zJ5Lvc4vr+r*J}+UNZj| zqk;@^@{5*QTfi6?*v3%MqM(;Zb&bv_3y5>!xTH7Q)%4@sU*!gUpAjv1p*G1VaMy|( zg|AnevTUGaMWR7&nvv48EwfAN?z!@ATRfd*n{9kYieqXgdl@Db6>X1CDsF?U_p2%nN$ z@nH282%o%lp!*=9bzGXZ#j{qBkF?^5E`i`cw6)cilj5}TG;5K5L)kI`<{6+&HRswc z#smO4x$RPRD_W?KeWF8Nh`l&NEAaa@*~QsT8P6F;0mA{HrO|OwFU%0fEiF=_5rUHM zZ-zm~VE1O@6_Rs3oeTMQ*SZx>;#fO_yf*2?_hHV7&=O*4>MKyg z6jtC4;sjXO(u^v6w=Qgb?&YvesOSPLtF!R3tJ9?$0p216xx!`$Ts(|pjMG{gZZj%C zhS8UPpg{|2DrlQkk1_(ZuuxY4C2^~rS%?P=R^3J{sRPojoFu1unKQ8`nNR?epvILN z|E&Rh5S4?1$Mn7?I$)_+;b=Cz%5d^ky8Z~rCdH*$&0?8L;cWJWP7rxuhzsla@Hekc;_bz<{sE%08jJB z?F22D+m@22uU6p91b;n!wLY#1((!;vU5&E8g)f{{X6|edP18U-)j4hWWlKxBX($7U zBgek11V%xAl+wV|f>5jwQ!!H;)=6{v!jAESsI%BZHFhn{qfUci zc-zh${aGdNNl|?Ad{twNEQAe^%4JF5-YMpncWZg0XhKX|q4(lx!zL?C6h{zj7+o)` z2b8M&>G#H4cuZ$H`mU+V+9h&Ji7s(zN2;-zHqqbJZ>wN85q=C}=uE0P|r(dCb@ZvHiSRM<5j<)*~WDQUNtv>~J` z=;t(^m{(<)7f6+&HUJvZGnBHW3NSGXVEy(8cnnIPPWml7YmW|?S_Mc5C+zXd2r?l) zj_pMtYPPc)MN7$V-ca&h8+WSp0VGSVQ}X4*w3tNHLY&4N7)2G#H8DXm_xAU@oAL7k zYtZhh8z@0n96a!PmG{*HOyVlzMZsYPj zHFbmBOXj<*MMYL|WodeDFUPg@{Ampk_Q+r%dSwBcWK+qU?P8wICC|HE4T@%312Zi? zyFIuLvQg@f+tOba;p4SbH=t+5&)i+R{1y571*ss?&gGxEwU;T3*V1Xq{wqI_nf!aM z_r!6Wx0T3?i(1fq{+m*8w^68QZY24)-K&XA`O%UV+n@604a>wi4w~FaHnZj)Ka|Nm z7LA?%8LtQ?`m$jEyU=IjKmxG<~B=d%uQSH-BN|X!bPc zrj78G`pw3GSI&3agkm!irKIj%zTI$ZGd+0WXR#dCeD?fzM`K`Ihgt5ClfC`gxU8<| z`gxIm)qG@K9f{@QN68(N`;SsjUx6p+Z{0OhET*SX*`X2aAIRN357!*o68Vf<66YKf zT>i>P&qdbqF0Xl124bT9bGl=3tI#mf40@{tP&~CH3a>iCiJtNSu&;}$=>VF5 z>3TyyXPoff3Rcr4@nS9z6?VEyHc~E~YJS;j&q{xZ^Wc0BN0;io6{i^S-Oudz+S)Mt zBqIg0vLQv2LYp{dB0U~QG-mhvT6veGrA&nW=9SSXGjoAY^3iS#U#+qWMSBB6zTfQz zlg+VZbioO-Y0JdX91S~TDBGYH)3K7FnQI15j`DlgqBu)DRu77fxc3Wn&cGjqkhVaZ zPTqO|Bk9GkW_SToKHN$X6~%ono;hZ0#j{zL@Q9G=${l&b(G$KA!U1|3 zkN!aSs;6d;VKk{7sfv(|eC~wST=KmX>O>3SceoW^J4ZGFT8rWPDSF zI@DlM*Xsy#3bWX9MpIvkawUS2O+iNw8HUAOj0qSZI5EzHqzsSMd;6qOyW*Zi?{_K6 z!5UHjY0+*XF0LA1S$*;XfED}4PrIon4!^yBap7FuCTQUU}B^E(cp0Iz7Du)Wc-ksv*xJ@Yv!*&z?!^b z5ls7rSo(a(>BY2Mk&R6W!nE0*wlM$w#^Xr4JxX)LD$K6znxgY^wTvyD&CXO!m?tvHoB!{pP<#O)qekH28>{2^fg^~jAIj@tY~_6?-?oKD zcgBOBfMuWZ&5)v_2OM{&t=8x9H|N5ZNKoa{z_G9G# zAWGx#=7l#zI%_Zsn6D1KMf7rInWy!}Y*YcA<}&Yl%#^}2zUw8%GVk-_t31h@l-tU1 zK-$|>S8dVz3=xYI1qhM(O0v_aE`)txe_oGrqKtMfE(=?XL|IY*h%{$F`fVf6Uo4E~ zr6MI?&o&ndg3gw-ZU~pArf}l*>bH=OSi~4t1yBc6QJ%sFLxdI_oBo2ZHx#=2Mg~Z` z(mpRU6D9snw?tL?bTv8mxF{Qt6@Ps|# zr#ySbg%e?jTdoBt!@ni@3V)oIuEGB8-Wrs$>|o*6AeV=j?Dgxy*aStFJJiOsyxqn; z_p_1MliDh&Q33J2ig{wKz#S-YY7){tvTaN&jmxn*E&L<#Z=M!guEOd@`a!1|;XA82 znp1rp%pD?4_Rk2ho2<7zvWaDMAVE=_+nlNoB<<>vzh40C#WiG|M{h)1-;i`GqF*T< zJJAp`fjnU#bf!}(R&Coyf9rsAbyac9qM{jK6vFLHJ>1*)W~$9S^FFbK&6R`Eq%tc1 zUksW))fD*Xx{94EuU!0BUgl{Poha1t$>AA?mm_fq<`;Ect6dfhzN##tto#sq*Enr^ zg?6(LkP1$^LmW3&^G+_BukTK_jBQDLj;`H z=gh~Wzpf<=a!+X}F4STHBO=QoK~9HNC4$3GdJ)YL!p$L(ll>YX?g$+P`^l-oii)ot zArH6+BSy!&583HmAv}e=5YM?BSztp@=Xh-zOpPg|>+}k^8p}E_1Lk!&A zM{IPX!Tr%y5EMze-`2~4wnF5g=*yz~z%W)Zwr}XsQ%XVNOQDO=*b|!T&?)|OG@0W~ zP}BoSkz84v3HyddTD6=R?uB^8-sv-<9+cK@@=QciD-s(8DtRWb6_aqm!2y@Mol=5d ztAL>qN=bcL*O|Rj;mu^FZ3uaPL1bPgEZwk_e(Pf>6IJ1~2an=9oE>hI%?j_J_)#A&zJ-0VvabvlALMI-t%$8O(# z%?Eg#T;+IamKaGZO0aDyjK4= zquyq3yz#LXu!6(irPGuL^gnb3xFil?StGgdcVz8_kw>MFgz4NFn1UGxLt%u}sZj zq)nw3C6Z5iY(hTHE|7xHuO?0uik7r%Am;9!6os9=#Bdm`d+*)>FJg7`#J2(H9GN`DKt>g(7vs>6i*2NPV%9w_S`}_=x(k$Oz7WVDF}*FpEEe; z;ZN>HU%5x(t2@6GpNP?($#4JsOjZh0zF9+_=b1;ZwENlpJ+Z`}mK%K#zQP(dGq1GC zxfya)F-Y^>bGG$aVwd>pym(uM^mNP{W7+M|=r{buKy8;Up~6@{3CV94=#n+HXdO2 z<*Hv&;ga-n<%VgSw?1N?G`QlLrT4R&*kE=2X>XbRAJ&ebKbUh}Vf&?iS--IvLTfYcTT0u2+b6kjP|}56@w^+V8Rqy*~d+`rzRvS7)sYf&Z5N; z-GC$1FO$PhF^%kI1mse8w{3acG<{2yq?7suvJfqCnxFENjxnhX$B`z~8tG?xrs1h8 z&4rGd8AFX;leJ@hmHg#e%j2E%D%T7u3ngVwcB#Rr={Yc5)Z->wKG9po(%wl28=(~| z@cQNh5_wxwEg1P90%WJdoAEjKUC}VnLTPfcHS0fnyWQl;N{D=Yq-TrZcu0zok?i&w zKlPrni1E57K^8R2*Wh@#W2sNa%o_>v#{Ix^<9B7-Yw^ehQA4xR-wsWI6~VNb%_GNBS%QnR5+q?+z*d-;E;Y7|ERUJRCpS|?ejH%a5 z`NKxrGDx#(^)zdjn7nEkn_*%8+1?=9{Rsh@Kkh$PdldaME2QZdmak5x_Gl}H*wssM z%jk`rzS=O@<|u5DJejeBzTyG30yh5qJ{la{4UW}_Kpt+k%AL}sdwH8@O*-X!s?fR+ z-#Q6KN3%8K1UyyIQ4yABxWi3VsNSBS25zWZ@5ibrajB1kANyLDG3GWoJh=}DzOKXrH>R=#}PK=SB4u8V*-!d^X z7)gP5zRO#*Fi!xSxENlZ2iEpJk#Dbli4P>gjE9ADUgs}>zCmY4n5*rh56qLDbL3c!&y{%6NDKJ(eMSb$X7Z6a9EJ1T( zQelwx8QGgn89MODPhz+u$n?^d_6lf>M~6jS5aC*&smx}P_>WO=w&gb;uxya9l>wdk zryZ-v)Ymg}y#O%U!G*D#DXsveC#XjS9bceuR)+rE`2}AsQpSMdhY-**L&$8c(iwsD z@HsdKuw`Z-s(Gu>f+4nGM0`Z)gmNbC`OcctZAMF5oBEL7#x<6>r{1*0Pj=5}U%i>i z<{TPv)(tR_!BcrwaF!F=1=2%0z~1Id`#kd}8vBLlf3ea*E1qFHnV-?aQD(7A5wS^Mt6G{V4ujDOgaX>rEE*>R0B{}<^ISTet#D1H6P>>z>6c+{fC zoWA~25ncmtOB0>udSU%X7jp)dy#=~*)mP3c`^gu^w5P&6=m@(4zwL7gb(H<4t6}$> zav(=E(cl{5`{&2lcc}FneA1TZ-^C0>=-~sBiQPJ03YiMsY(+Z2t10xmZw*b-5UevUK1GIS!*<}gxOsz{PAWmUC=-umV7dZ1vwOgQlaTvBB}NS$f~-2S zWcM)Nn(_`VIV%X+i}0IzVb1LE`<1Q^`+dhxZSy2tKr23qu%d8OEN4)=PjPe$Hyg-q zatsM&`pU;qW?W-5E+{_?r_Oo3nnd^eQTB@Ww2S+AuT9bJkT|MuqNnt!TBR&1k`Qs( zeqljQ?CiU$%}ocRbm?7DW_scq4tBw)>(T>zeC8cE9Cj6TjFdi^RW!h^O3!cwn(TqI zLfFWZ;8<{s^+eX>!BL{mhY-=raI&uSchqTd7TdUv4q(@;I~vH4p8fvQRZ(E6;b!Yw zqKOFa19tMt$dO5YWTeWBm}B22^fprtyDs0M$~|&(U1HdZp;6Nps(?)4g0bm*nCOa@ zYUBgWNSO3T&J2^pt)L5+9Bpfjef+29?Ag4l%(}YqZ!66q8j&2&R=Razo=4>O_W-+2 z$;K5kQQj7A5E%OHFk>o$KQ8Hnr+Uqv^W}IaAvrOaPDate|GPQN5G{b$N&1B3}% zZkI4pwpUh3=wd#V5?4Bw1l{N1QrfF?zp!E-Wm=sDd>SCvd!sjYIcHXj_5x?Kp~fRb zp)4KKT=~($+if)c6Jh@7Sqp^hpSCNSRahtS2V~?mtgIG!QxmGXj(iWQ`WEIIe0hM@|MnHRYeQ+Fv-FC z+b?-OMD{HaMOjrYl?Bd-vZp4Xm07aX#@>;L({JCL;5EKP!29oz?DN45DtPYdz98iW>vOr19=3(3T?t-Hc(h8J8(6+=6TBVjZ2@A=4s$-7Nj^Vwe`4wA9NpZVdZgV?nS4@eHBpqYp*#n>x55BlDN~dDb8?hyJ2#wG z(4#IOV&`pfAC~&q|MAjv|=FJHce2XqUCM`V2c6mzg|@7QMy zGGuB^$=iM(*7{C)ugY0}&qig8ey4e&ZLx9P4^ili{-XV!C#F5O!6N;JJ`KFI-td0M z*t44*_)i54C?n8YegNEu@D>;gR*PC1lTLFbvM{DUP3o}F(939t8D10$aCpJq#98zJ zI1nXyu#lrf_2!lK#91iFG2VRSxnLWY3QBSR&@i)Xij{Rf{PBqjr-I2ujMXwHkm0e$ ztTz;^pqt#4kE{lWQV2XWMe`4O;$VKv2x(lL)kSx z91@%rb;D;PY&CELUxwI8ScPP;h-vugDJ$;&ShWz=f`I$t#i^XyH>-vtSUQ4Xq05zm znn0hjqeDfUsBTpQ_l)ROgPWZejJY8@wr4f8#QcJiPTk* z)zj2g+Qxgo8R0pb{Hu;;oO=R@d+PdBqdPM@I#FBXrH~N#Nv<_>DTCN54x|T6ofNTQwzQaRsMCD97c31&`_grKL_d3H=}nZvf>L0Fiv)>HJ;u3`x5$#LjPms9t&qn6*yyY|@%xXZlDV#B;@ z((4)0pB&Z8{%&6#uH`useWi^||Iz<~;=d0W(zg-4(1EP!s}#cR_PxySAxqgX0WE1~ ze7J1=Uu-|gSWot)xQ;U0WKt~q^xOA~>>^B1CYDaL`)qx)zRx}x{dj2w)2@I+J9Nh* za``vU=YnL{{{+4ex6=~n4++{&@ZbAM$iv5Gc#S}{7(CXd^UF4h=O2ekb6gDsGpxkN z_wRM{bXFE~#5WZ(;Eyt=4LB)0UXB3fHjO9&#r}zOoA9cw%0V((Bk zNJvEtOpuoG8F>C_Hzi*;+TZ#T9iK>t_~wbE@0QWsxTmG!Ly7b!ZCOK4Ss>fXu3xXk z;_mg+$8GTk%mgBP0dGlY22<^aN~nT^urPG^%3R>UmwOR8I@X@`KV_Mc81(hdf%QMm zp0io0q)Kw5#r2m`sGn>tfPeOn!g5Qo)}W=}47oyf3$_QL-sGl;Ul4?P|jM z52@c(w7k*cOf`rTG1CkbUGhrUGoCaz9{&vN=y?TlS+TGkNaUAev~L^a7+X!~3A0!V zYg*2ohaFE4)X`Q21SBEsHkPeyNNp_hjZvyd29VK%rhHrYxutuiApOdSI3=+;aApaH z+nlW?G8ghs(#&SmcLf+Uu=FUldaa!rme5)A8fRB>=tQ&iUFVWtO5QIEdJesL`|cY_ zO`K8W@DvgO)S|t$T8`BsPGj8@5TxUFfNVu}Tt{Lc?z%D2aij36Xs*t#? z{KiJVZRVGd2oXO!F^)XiP1e8+HRmmI8|yNRMPUPGey z*I5gBVB-=rGop|}skiz^N3Dx9^9HN>jOQUZ<)8+^C`o7#nAX550eF`Y3rjmslkSdw^*i3#zsub7*j z2`LDyt(`TamS)bx!KGQ@VXz=__NN!h3A$>MXM!|mc{!Od=HgzSC|wRVRZrCDLoFU@ z^8B~Ktq&f~b6{_$bI~zu{zrbKi1w)sdpQ9dIW3W2%9NC^1&VNFp*t6lbS2z6op@&!@Re8Ep z5TDx2nTq5_wykv8$*(I`A8y{iimZfP(Hv$;cIg9Ju8$KwZ^9o;eSYwzBCLD-xcA-~ zWcB!Ha>X&QqHwy~J+SG0xNGOZ!B%f4x}&Zmw_(JgqxQUfPV?MHd)?r3(~r%!)_hUy zf@(NeuTPk9ig01OEWvn7*>~||vc6YFLMbXJ%t?L=LS>N!-tONS6vvz$E7`|q-GI$Pkg(C4BrNO>D9G2_kqZmW) zi|tH#((RxrSl(TTx~9IJ7!_DvkVc0LT7pb>(c zUs6`{BzSHF)k`GfMCqF1BA|-j1vKv~driGqovhKx2NyBlh~^Fuy#^(p9*+OoZnN#& zzU7(&FjZqiRQG(=-R)>_YPlmDyt3SJ1#FY`tP+-AXJ0eOI=)zrX9G}h>nkmuBzx7Vr<`MUM5#^^Dw&t z;K67q%&wsY+mQBC)E~9pn=!%j5C8#FnwamyEi#@E)V7AIiaW6FwiUa8r+wk$j|)^U zTj-K>%XaMKnL94OZw!E5cN<>NDs?eLa{)6WJbivNr>e# z$59f)4Msv){h3W1D>vXcs`$xMW5t~huIm!>F&l%~FHBDRn^oAK(xo4Z5pP1SwZsW26;?@Y83@lcU8=8_j|rbKrMagL6lwq<@EiS!|!af)0> zyTyUGy{-3cl+;#pJ(he@OrcEFQa*S7tlH(?^%*Jx>qhz!8Vu8KiM}BqBiIH2hKVA` zd8gFLRCBl0j&jM(m}8@us@+`iZ?wRh_~P2xTH5%pjBJDx-wedbH&AKJ&IkDXnZlrA zuw(zvi9xxJE!#oA8x;>?&6hcMZ_(f{B8~`fuQLsy5KnEz7U+Q=Nyd`)a7nAix_BQ} z)*o?KvrYG=F`n;?ZXEcI^K5Gd{^~7J7mSKj;ubG1pDII% z3ilLc6q9Ft_HrL;ZT#7zym=oVmy`!QY3af*soipl^rSkX32n$A_M7+@!N=1tqLr_e zEH2?=LNzli?K0Npm{q=)xqvQMs zR%ImveJJnbfJK|Kq$$+dCT9+8SE&*kYnWW+3P|N=l`Zn~Z)|whTF(+}HsSZ?y zFmbM=su%ELPYg!EGVa4BIi@pG8fmG9mhMZD{w7HpsKf6fJle9JD?nEhi%qzqPz&~# z$!QEW=1jlh+wGL`ET&i43@&~bn`I}GLuC9s4R$e+A2?|#@>J2RP+F8*RI_(eK*3Zj zdIP#xu@Wz_XF7WAp(j7azkb%I%x~#2%x@BEa*i+8oAq0et^I(p+T5xJLYnIIYE+FhU$p&SM`rDPaa zGzOGofM@EwM4#^%(~j6!T1ZkyuKW_;+;A^GZJt#|lYc(;t9O)IjVsB+b$JSS3o5!P z+-uA7oUIk`awZlK=q*HwS(G4})bKato+u~A4cwt(Q8=5&VU?Ws0H-GuoA=DU04t!q zsteVW#OnyeRJ~UQ{P`;{>)TwMSp3R6327e zQMXYQfTdWXrsBV+_5v;+C@)E7R%PHt>ZC<(cW;eJWioI;nee#Ucz}*hQ0pf9`!T-2NKV}L*q*9-2o(d#%I(=~dPFJizAgSj z-@%tKgT)11&#;i-0puBxlQAM7N5&U2kRkFR9`U4Z&(Af< zf>cc6_3KY61#)>h84{K%kl0Etbddt7u&`h4Sk#}<8=_*> zda`Y%gwEs)Kdksi&i!w1@#NWGxQ)HS2g56^Z<&B8OT`}abBR0~k(gBiED)l-#!6V> zyCAy^Pp9FRl6-lsM3Xx;BGrPN(KvXvV<&zjMn)gCB58OnH(hIAkp2MJe;VU=;8L@ncFfMlofxXD=`H2_LVktL^vo?!)kcg;>)>=@NuW{G`p`NHPtQ zUJzo+kc%2KRJ|(@H^;-N7Mmc)lk>?2mfwc>5RniA1Fahj#GpIxWLR^q7CJ&N&$iNR zfQhbrS_()Vjhfa#&j}xPQ-GeXH%OoV%9QG*=1t{tE2ex6-{SHskUaEaB=CKTIShyr zX=awT$O91zJ02O4JI5;twr{ylPc}2P$Ts4nHk;ivzndSty_Dxjr23c?LVhqT4*tQa zNVC0OnbA!YcIhmWw8x?`WQ=fmju03GZrLU}-hQ()P7kb>bWi5K#Tho#eZLDk47d#p)G}$?r zu>78xpQSf8vn3={xp#z!$FJ=6$;Eo1YYQ1l5y7AO%l3}fMvusI&TgMBW&gbfNZ&l= zB|P3bZA~9yYFBzl$W#7dL$W`-2s$40#uxN}bE07y_r+yV8m!>LUgfAjeh8!fLbm!_ z2^q&GZzckv6B4&dz!^v}l8wuDiq*5%rmxOVuuo7vFKjUP7ZkIUqlx;$j)8vF+Vod(*M?N_)<#5E znnX_&FIF>wf>yaP7R8-VJ&Aqek1yES3W3ucW(;FF-lO7?ZibY3xISa=d@$QsCMzMO zggN(t8mgh-c7=NSy4@{e0|Q@mQxe0NATVQfQ0Zv($2$9RX?(4+QgA3X=$IeJiyToK z<$9pYlJ=Me74`UHYcPX+FK8iiQd{SjBE`^b*fwi=S~w3EtcjH+bvJua{`ND8%JR#x zJ*8b}gI5P-tQwMHe8E~YYy4(O6@gW&t!gmO=DGb zxm)dCW)^ChlSxf=h};8rLqtlmqLrY&qAU*2Ry0p1@O0;PHVLe<+!< zt@3WQdpbd9lrp{E*>9AOpan-STdSfT>|S%?EfWJySO9|GRNONHOU?(S;YoRL2c{6W zC#jmQtDnmb)WTj#ahOR_xeiW{1H?G@Ix)$5UUhrR92E)SEEnWVI@ly9YP|A>j%?#T z=eN+cJV{BR1pnqrn$Y_lD^Z$ySX!mc2%yb1K{suWTAK1=1&W{f6CL0Azf=pj{Big(t ziM~rM3X|T}*}t2?y>s0p%z4zOYci8sKeRrHu}(|-cUpz+T=}@%y0!B`ZVcuE2a--K|@>Hn+4rQjhpul z?pR%nP4^Wqk6hGu%D_geSO~1x=oVM^$Gt+N9ym-p!caRgm$R1Y19;>9(yfn`?r3uz-l1^O; zR+$}XU)|L^d~c!Aoj=X~YyHQITf%EEOEx@1Hn2O6%J_lRUCdyxql7Wyp2}UX{*Xbv zgF!rfm$7p667D?eYV;k8k5eBc?^w1APkqy$SUh=k+NhkY9z`|ROD^7=v02>4A}e$L zK9*`~%HbX8Gjvz)`_Lr;SJ5sp%!+f;WiidjcvjfE-chUjc9`9!YgESGZ_g=uN6 zntFu5x!H0G0?bbQr^LCJ@7C`GQh6okS3mdmmb||=y?aDaTL~!hBzKYtfE8>&7tOat z0FQN6fV*?bSY1<{Ii%9t;07kXE?!^FkI& zBExyrU2DQWzK{*f4f2N@Xz?nMhW;f%AY4Jn4N@y{9E==h#|To_>mz-F&v)Tr2FYK}Lw;$`i(jSMeduNIL0i({ig0H72B zmw2Xy5RDuS*@uQs$P?slA`W@ZtB(A=peCmUy_orhi@%5w)3uCKPmT$&Yb6$nB#Fhu zkMliXHqNo%L%vB!&yk;-Nl`46iwhYp1Gz|4CDzPhGDC8-SiUd14m2UyNDi{mV&=+Q zg>TPtzr?xOX+Yh+*0(>OBMrmx@SICat?~b?TZyCX$>?z*>rkd)wzUwAnum5yiT7lq zE;%x`NTta{b5P(}@z(HjUQOBicGuvQa9%a00a6l#+LT=0!~>B}w7|LK8B#e>Hky%* z+uhfjI4-uG7{=`?>rHKN*?U}MxEEy8;Q&m%0c7~ckI7l_45UhSHXRlSM7Vs8cmTGy zl=ZH`Cja3Ip*DXd+pIr4)NY%!@KUgg8mL#0%CuZH%tmb_>SlI~a7`d`$Rp;pcM$Y5 zBFie~m7-DIrCN04DtvuYc@BLA5Q zQVYnrF$@o7%TYuAcTFsb$n>w~wL$zk=|`5kJS67^BYPaX6g&Hn3u1v(2~RRs28hgeT02~@@Nf7CJ)sdc$s-g@c$oCQd+v3F&gO-8KYyw=$wFbNh2Kt z21txH7%*zm4I&{REiE02NQZ(TqJEF>&*%Gn{QmfDJWjy9b9N4QT<5x8_w`J zuO$2NVdU$jVO!R^(7U_$K0xw*n0e5*u}l{(=&$Rqd%G+9JTZT*%}QF#2>w0XX|oP| zSRpfXPDz(d97pYFq043dlZbYIO=oV`QkU;R{`tDcmQ_ z-ccY30Zb>iFGB^AR|XL;LHsycAp5XAK(V32PRb0sRI8=J{Y69P;lTYZ%=w=4h1Ycz z(*Rk3&7j+-`mINQpG%5$ycZsoNCU|CuG49Z)2XgQC}xQSubwt9>xtI+e#yi;%2iS= zyu%Gl45aJ`WQv&e$<2L<%}vandV6IkDJvsT3AqRCjghK2XUOV#Nu5q2-Eo3FO&7+z z5a|dp6jdf=;|qi~d@75iD&%Xg+4cTOd<6V!{gEli40uxRa06r*a}0cAplUDw=A-;s z(yx04O{v0?bA$nvS{rn3#L%Ai)QFEm%!qpy8xP((+$w(-PivWYU=_u{;2uPsa58FA{zkrVsuQTcfbh=34ssp z-Zh5o5pZwCNe_ESi8EOiHQIxlsAK+q46D|!T#TRh3JT>I2mi|5`0`dEyL!I zs(;j+{yWzdaE6EmU<()Ch+?CZ$iPjSW$(cTDY??GnN8iQ1lKJgTMz=FUDzlKLkf~t z_uyAS-daI=jwo;G75C4Pr>08GupLYz^5c+hRw+S3_WJp>TMAoJ7p?M~Yyi-1 zT`@_yazOvP2HED>r!KQ$rB!LhWhG{c%*jF<#lV2R?cWWj_T}CNx+Pi}*b(gaKAWKV z0_MCj3YaY+{7(S~(P8Eco0EXcRr(oQR|3EB^@gp{kFo&82g$*@!5E;^{%@OBsxs6l z)cTGeG=3dlx8sXm|hLEGHKNf?Str4*dgp3 zYXzG@7SMwtv1G8H8?P}~%2kv$M5`HdLo0<@hy4UDCCpTrfTBdV1u}^_@q-=14uCKF zX*Q6u1=7GUw+-zC8pb$ zYQ3GO$f4ktN6Q19UZZFW8FU%bHv;K~%gX?&zo$li&_M{4GKNneV?@xff#y^foBYVx zNWWyxevP3})X$6l%o~1gEX{iborc8Q3w%XI3;5Q3kNX+VRQ2fUV)5DMx^Itvp6KJb z>A*h7aWht>hAny+T;Qvuw^&}b>zASGu*7xHVlWJh^iFemrZd!`$p=a~IY&88?IlzxLiC#Zui} zMoI0Xsdkcl8EV4fX_6vI3VkVrV~j?HKE*pt&qWcv!ClF0irZ8HuxTP5g4=iEe(H46 zNZEgn++9|hAtDw_&t$6e2$pSI-rBAF9UdG{rT7&wY8op3@MO2OBW|JZ4Xe;hC(z zCz|Vi6now`B@+&UALYZ;qk$N8Qvg#*txbW7uoWh265p_{_hygxAt3;)-rOCpClyUc ztd%~Yke~stdas=xy@NS~Sl(@5l)x*UzPCWprs>(Yx7oK6XMuiHZGgrK%8z5RjfY&Y zecSo$@V2~eGY=CD2WRPDDRQdbWsKgq>GLd?5$3QhQX3P~@F6C_k1(*YoIGp#d$pX>n-_;yBknAjE@}Z06OAiCoXqeCAw)=8< zDn?TXdsE2_gp>5tATr*mFl25gu+J@ zf8yEjl4&><$8u8LF)3MJR0gLpCpR8LX)tB~3E}uF(&tP>AGRDu_GBuS{4G$Y5}-fh ztao{8W<#C}usp`JY=f6N&oDRUI>@<*0HeK(h@^$VuoLCb=XEURaSelCLf0WYhgvM+ zXvZtIm-UCN1gx>-tE&YBx29V^TtrOyHbyc0M$>`f?hzVD-erH#3*^Rja)mKH=MS4lM$l1*xNCs=^l8s3@6)GCLAP+4%|!)qZ}+#k0}hY%L?J

)G3|!3!yPaGxcu+6>4Iqb;~s?jBQoxIsUwp&jV;zhT5E`gHFdF1@>>)_gEyBy!86ZDOk z9Qn)HnV>lQX8qmwo{xDXq!5IhmBgEI-A-g~@f;R)-5pJi)xs^B0*cRR@s)dy#oa+8N^GlFkJV2xm*>M&Y&H5dl6_GyinGayN}@ zVSpo!-iP^3P?Ya2h?>9A67eXP>U1f;77=Mq6ec4Y9tV%Mr8mEUFT3u$U0#Q@wp%qG zHB5ArOn=%;Hn>(#OwYfj!hQN%#y>>(IlD5&+U;D- z<xSwG0T{Nz$d(kW0E7^cXp7o1ci+OTz%O*N{5jc zWIkr|Bm&I7(l=w*|D&r8k$9Pe;k_ZaT|Hnl5ykNC@rmpM0gY(X=}(iGge$EkJkN)H z*;Uc5*AbKI3yju{yc7m8F~3!R!20U(lw7Y}+ERJgC4?yn{xl{sv+@R!r%St%6E_3} z{W{Iae?Tjx#ahO}s`3Uj&~UJr9K1v3szx>YU4z_ShwMXvjQ2KU!`;^#+LB>}HL-|s z8Jk09{A|LQz2gtDsU`vg!Av?7It&zSaT<5owhl{Nj258W#z{E@yZleDLL1A-ngs6a zF|`LA9Tj~VoCVU(KK@`h*64U!^FukiY=DjiYop{@alrYhX&hngb}}t^`j*EG?k_P$dI-jYG-vhc-;K+ zxfmp2=t5p7JSX8G(5{WBX5Qv`mec#M&QrtJBY{b3RDV=Yv$-m@yKY7pBwxg7xT7SG z?l!qn#r^E5IH2JV2$(@@w@mdtey6(H&`7bdqh5e`X3&?vi7H7Tk#z~1V`?8Ps48f{ z9W*SJXEL#6zpz`8uRq-C;GDbYDj#5FQ&zd{n|;7XGq@nU_=?(}xJCHkMG!4Q6&D1; z6{DIOA3uJ(va3ebRQkDThA=&u-rH}(6H-eklx z0_H*nS=Zz3C?mpsg1)nnx%?kjz$_qh{#Es>Qifabt0I{g&C~6Pp7du$&)3ptPJL_N zl}s-MD!a4yCxRj$b=;j%0Y3s|2iUd0P3qds!^dXAhkui1{Zuqn0Svko>}?$uti7HM ztrSmXiFc*n6T7SaZ2K8dAgq>Wvod`%`8olA6Ln?c)3ygWd;Ud!9Q_sjL8S*~A#h2q zLh_TDGekaF&^%0Y(%4P8A$ptO^J-K!GLiiSjX^=rA{>Y3P4S|QTvmqSR=rY~u!J0i zK|TX$SUgX3uta~UN!?Dum7YvNe5rH%sE>d~b&Jl4%GEDPyK3bLf`Z}Y9u))}NV32+ug zM^e5@y3MP=A4{O-L);_FUYIXVMe$sPY~vj-gnucX~kv_lN@n2 z!fl$n?nesICG@t2cAMzY*g>{KA1=0PcBui`0lQ|uAcGA8P8Luo!R@K`r%#=-RfveF z3CPk0@ynTj=@#tu%*_u^FRJ+8uU_l5CkJGgHLIL--EZx%Lt4%R+ai?q*%K(AYhu*C ziuFQ&O%g{+1u7~g;m$6aq5~pti(l=#2)A*o&=7rYiaXRF;+DNH>Zv~lYN`@cE2q5s z>~P}2lRL{qo~$|CH#bjBXZ=PPJ_*}X-kN@*t}D_v7VPxSnZsD4h)o=9jI}Ng^yd|KU=J!lxC+dNe17X_ft-a~`NGDcZd||Sz1HavSXE`V+Xg3_XjVQRubmUc%=$~h_gOTK1j11xt*jOTBdJN`K|KHZgJm{u9y(j zDd!HzECoq6X(Q2wi}r;p+uiqR5dQv>VNCtIxSjWPgET{9Nw3&@RKj?LZ%#*$sfKAU zX=I*SZt2&$Dc11;Rz4cD3m8LTrYZ?!uwSom_f=dC3q?jdUyeUgmKW5~Mt+m09M0rd z=g^FvzgBtHlqnUNEY0V3@Tl>;d8x^ut$J69RxFktcEyE8k#^6iT(kBUqRq}s639?= zCZzqZ(Qi;C2VLru8wRA={>q{EITb^~96fs>CeYs!)!>O@DVg2Qp2gwcA65fATE~+^ zD69x3l&SQjLQKc9<(xu-=*0u3PxBxCp3}*=TV^c<8c4EuDjNC4ppY$XgTq=@JJW$m z^u}%M{~n!)_2a5O(rFtsK@+@9shCNJ!?CZU5GE1_FjCM7Lzs zF|422tsV3k?E3$Sz9uPsnuPBZc*zjxO@AQ8Xv;L&EzB>B7 z{I%K7J__|!ST_DC*&|}rN0dPy!)ChYu`A>!g|8iM!FA`SN3}L~Mk6 zuIa2K7T~nw^#5Bq>q?F00^Iih1+?c#yZwW=|G)i01e0VRicpxzlE;W4f!f)$$(@n- zAi$=1zQUt(Hra%TY$O+dVxf$sr(GTA>sUp|teC#m>iYUt=A-S4B!}XqEOJ_ui>IBE zJ0*~a$WUFIfT_iMQ2I-*-)L%Cm*PgYs%AgeHY<@^(PoYq8@OO^FA$Np4}d;=qe{Dl$|h&&miNog zA}zC#CW5>-!R&BPq%#s-;w9Fm*VrxUFNc2J$U+0z(yX*vl%(cSmm7&2Neq&fC=Wf+ z-WU_d`nc05SI(>LA@#(Ve%NQcUH+|(%Hk;EI3A?TSAlmy(Li0><*I~tX!K=$dy;|l zjz>vH-j-QtDC!^+87V{?aW%AjB0f#F?0Aw`SDU8C%HAU{w^~G_I@NWXxBpS@M3$$4 zbdY+%@@h5>@dGI`mVmuk&J6vIl`R4OS)#Oudzoq?Y-pl{hXr`PZBIka)t4%YL%ztZ zW*E&9)@^8E@adI2x4Y=Y*nq&vxoeE-p8YE(4wYZ9)6Sd24cgFgl@px;F;Uw9Yov_^V}N11O< z-P{&vP2gCVzez33a(8!+e6|Abd&?AI- zCV>jvj6@>O#&j?2e$w9Rp)z6GyT|CwhN8@a$A=SNriYQcQin@s0-uRarM@J~j4>Ek zx4Ga)J!F0Z3NWQa@Wt3kAXZTt7f?pczm#gRHKp#X(_&f3Z?F^SPg9i~${Jug-MMHT z4)9S)M4JDEeXD#53MFB;A|Bk47#mC-a$)SAF#c6?BIZrjkmYF2ea)~q%8U+m_47^# zHLAREk;oPx8%b6FR5>#pz%1o!y=OxvE9+BGkSLr#oP^+XNMuYT))$TZFlpcYp(B?0 zF?H>1mR`t5wxH*EPU{;_zMQsLZ@CwlmbFU{y0>n-6r^ptmkgSn1y13e5>h$fo%p#L znjhaF)dWI^@aP<3sHv$nv{Lkv@9^VaoP7JK!raGvEZKU=K0pK}P@yFOaS&4ixdo5F z%g6+>wML}Sm}KR6>qG~n*JNEAGh)Zpqjb^#$aV=A)+$zi>TDb1}FId|24F)hqFy6%j?tW9v8S6g`v z{d9v@=|k$4w91u7t|+e7X;*0@Pfx2fi)OEeq-HZ|%cSvgMD&EVWT_4|Ss04OjDTC{ z_uEFW@Xz#>PnM{?>E|R&5%f}8TM*1$BX3QfEHepRMs)(<+z-<9;` z7=#9JTTUatM0FV*Y-5U}3J`Ud1&!pl1%3@pejr#Tm_3$~dEyOgYU+snG9HuQq9y6M zbQ|eJlEcQ9>EhHCJtgk$Sv3V+SxJ1)0;0LANT|QoLzJo>T3YQ_$vWLl3zfqFBl&_QJlz*_RFb0MB?qWEPE{4Ko z$nDoeEta-qKPQggXQ(hd7M?7KHoeKAH-z3gEINq)QnVMVon5pUn5j6rKPYO--xbkCfgW`9_w`)s3 zI*gAfs3uy|hO2}?J7hl6P$dj$epr51=14qh%m*5dDJ3Hz91&*SVG@6O`a;TfIOvpj zt-~yhvGJ)g_&g+F`(k-FlPHh>AqEuBEz2ijfRcZaMb0)(HJ2HT_kBhasyzwzZKJSF z&$mstW}{cQ&%bu4)Aq0_t9S`@)|f!5q_C(IrXqSC6qQ8nIi9`i3rOvsKEVHqWXgR& z))gMWAQ?8GuI-rFCxJesX_BSO{X$tcDe^FDy6~Ry&;VhB(3tKg@tkw18Zq0 zbk6E-jqQ)xqFKm?{i>sCy8^*|yg^FuVOv@`(^@6Oaw4<^@B?XawNQGZFJYeqEg=Xi zXjuWN=Tvc`Q&!eUq|8DS%q->Uuadi!bfGFlvsX=Wl=u$Qzcv!}$zG(scY=?Ul9pcf z6#P8=LvFUYW7gfLxd$X{-uqUkZGY;w_BCg($|jIh3W~RVGiNxrTC~eqSF!t|hq-R| zH-`)A;-X4|hEbBTZ|jEbZu~m4l+D^r3!9Ny&21sokylFXNL5 z5ai=;@=_t3bGsu-?(+rb4{rTwYBBriVQuf>Wxo4A8CJ!5-)?;Twy=@>ab~$r+WTtZ zLqzqr(39gbt7FEjXl zcHBvb<8%?v;p!f;F=dXW!-2Ajb1^v=cf;5sHL#@Ci)wTJwHvzYOeP4;vVa|kkq91U zh2cruTLPD&l7G6s&3*d!0Zj*kK>M{$?w)bF+qWEFV+D7D2x=Z04mE>)ws{>t>#TGZ zeEB!iQFnl(!zy9~>tX3voq4O+1O!rzA@N*BZ8&$7ZBCh*cL~x}V4ihP%~1p{dW&+N z{#Q@s71cg#Yh)2kVm6G48}%>u-^u;quNiQmYL$?|b@-gkV7{mbkh z`dabzHS@LpJo2#DS=f*{SqB&_>PApn0IDLPApvathc1_Z;%k%eW&vq#xwU}hzqeMF z7EtD2v2@-J5QT(Dr5{_$i)y$d4}e;s3&_*o!_3o3(2Rf&b7+rU5+nleotTDk^ZYUg zZT9#h)lC=opdTSXs)-;l?$j4EnMfBhwbV@=+W%}EH5vKsk4M3kLUK?~Gj25NnMr$| zsbSIdkMNh@x(IYq%AP@Qe4q=w@j|-R_8Q*}Up?3fty2jlt_d2p4DoQK|LD?!Yd~i^ z4E3EkK6I4$e%8tvRlPNWNML1jx7>P+gjC#lnJs3p{+ubmsnTIly@)Dm&U@;RfWD?k z9N{Y*NlF;k?`_i&qMGk?x;#JiCC22LkB`?lon*+W)Q`ouEK0@#ZwJwHFVHcCyR$M@ zUN1$7S&8`7;0;23V|CIm&ez}R8$3h&o=l+JlNoMxZ65OR^pzJxchcUW7aM{;ZSH<4 z5NLE-)2L-b-BDB`g5qOeG^>O>^t}pFKkA@YJwNTZ?~h$cu#%igLcb(qEqL>WHvCxl zd}q_Pkgha+X_BhpJ|*#U(KXCoUYeb>k}{Z_WgTOZtGYGc6dVaaQQ4SUodUdlsP`H` zy`M`d9q&2gU(wKpjE@n1>Q(gJW_g~Wn?#(1%Fy22+is|K-44P>(KhYLHkJ{yswgRN zhU7|VJ|pVwc=CBa?#Z+A+pV!WcX(m>$w9TOO`tiYr|wIY(w?j?MmRO>h;Tlo{CCcR zQwx>^*1R`dTYKi-y+#q-4`(45@!NyGg(< zZJ5RPL5YS=+28LdzsdT}Gb`m>-h5vgVoy&m)p7MgO7-_dDMUXAZl6*4?Iq<^dxi4ANyVltNwGWqU3yrQ9CkBz6*$!6$N9hs}TVWkVTVPVYzF};ywv`0?4 zSTJ({8h%UVdiQ&XTQVq(+J`ZF2f@7dTrx6wYoqsG2=2jrEvvTbcUib!qq?&~d^s&q z(o4VH3CNp`_-TB-j`}DtW-(QLWBuOe$Ba(>zq?aYUy=}(tv{!Js&vP0GWO0wdLXeU z|0-KkiQ473Bk@37g1-ez)`NQ=k@ya0U!}BW?-0MugkfcvT?VPOx|KUfB{=_5xpN+- zaMpA76VGSP8b7XOXD!5TXe&pT9G;$6u40Z19>nXux=TN>V)bO8>!lc1pvcNPK`C#= z474ls0CQ0pj?U~0t@O`ABx1Dtz}>oyI+2Z%NIH^ko$L6TjCK-B$YR#hiPjR4-B&s< zEc~(>MBJe=d`4N-Z7P;=68FhQ66vZzkK(R+q%U_K9npn=B7yXGNGxQX=Z`zb{9ihX ze?lEh??2fM$27zVSC|MyVG&4a@@Y>@C!q3i?Wl|_?Piec00n{qIzR!H0hOMZ(TsD3 zFhH=uEngXh(%}Gt%JP)~K!~}6p8FGcF>6K`wg){&+jW@5|CnjU?2}3;yL=?Z5!l5> z0!fpVvZ|H#IVQMUp(9US!@J!(6tM8fvC6s-qdD^%^n(n|Va*mmJyKu{bW&$PJc}82 zqb-7d@MMslZVk*&8)~kiVEUU)?JiQj(N&CD2!Gf2saPXE35SgM&(0j;g%rz1hxt&^k*lU zd^fTMu-OrbfY1(5r;u~oHQNhRQP*l&&(_BK=D-IN))*X8QN%WE zS{gK)16oqm-DmM{4|OLo>x$$lYufCWh!>>Q-(c6KGNG$;bV1sNUeImWHh9i5TJY780veMfZyOZ`?Qg92kZX2HvA8+jo-|Jq9uLy zK2YPX03}5Oq{9<-rbx{|K;dcwH|d7F1qiXbLXAiQ%5I6EnRLnOu3ZzyW4k9T6>neO z9|N=s7glxLy`{qn+G0X|^cVE~DzkUrjCy0ohrIn=#rfX4Ch)u1w6Pw%tMP&&C61*KLfUO1lfmXf?Xt^XH zUtu%qmnEB+&A_SeB*#kVikNLcHp0=sp_W(~ZmMW1&8O5X0m-7AFm9#k7~B>*5PH22 z{#gmgL*gS_N^IUsRUb(j*@i*@K_BZ&^mfn@7`I?ErL@}sp%#TcngXspkZ$0IKvo#( zwX4XkC>mFfGF32!XW_okp9S`0@^y8o>9n;_h?wv0)wUfWt#T|P?;@aVpu8>+@m>jm=oCklisFv;AEa z^_i=;)3llDNGKZjx(h`iZIUjLQtGJbMUXyT|qPb)Vy$}(@2?1|CCoDr}LWJlv@ z6-YvOMnl;sGjgzj**BR8X#G4jdbr_oOo9!u03YQs>=*3=+HZLq z>bAR@d*E+I@cZ}{DS9cdNSREHu0L01&b>A40CMDZBJWgRnZ7RHZLf^j+a$G>2prs_ zm3>}Hkiz!+Y%!Secc9RPPW7IG`KLHj?fRSr@hOo>iO+)Y31dqT+f}vr>sTMtR>dDB zX+VaH4!FR>;O~Ay*oiRndm(SsmqIVchZv`Uyb`CFRpZd;L$$QgetX`SCl&tHheDUI zQCxXqrK9$Wpd!pJy4(n;3~!-<#vhN(6uKA=jCY|Q=>k9zqa4Z$*s#)Ajx@3ayP5jV zXU4I|u<~Nu6!->IVhKRbJoN|giwrG)l@k9GNA^ zD#!)sDUmZJ-7I7rn*^W+Db(uZQh`+hSwI;JD4@hjy#Y|Drf`sOhBK_3Sqat5G9VHK z4VgLUQ`US0gPMifxej$Yb>0qA0{u&DT@56`^tWGFQp;4wr~%qu?NF%nxxK$wLjc>n zIlX%Oye0ez*ak6Yzp2&05C~6681$9q+(oTco75jxTSH4a&G%q?te~m@*iCuKOnGj6 z4T&X|GeN<3hbVGf-IVMC{F{XZL)9 zUpdtvAH6BN&f~U~m;vbtm59=r+j(&{ipSw+}+sFEce7cK`+zXG2Kq2qu2_h zhIdBw?SLIE@{V=g9cex*zW#zR(F%RCWIu%=kQ^5axQ;+G)S`%H*OnBQ#l4->0{1ji zOZx)%R<+yh5Ovlq5k_&3R$0=+?aILn`tq7@krCt{X&rYl7%QE3f*fu`d~-UINGAp- zetdB~3tccfR-w|wKjR4em4Saad(>P|KmkQ70dOS2MraAG9q#QzIhLVV}&No=by%+k?^w!c55jRR!f98`g(5kOu$4fUXRm)iwgRw@&&w1J6;mf%0LQU*HyQ8K8C-VS2`Yn!mOj_G-o<#_^fTP89M<2giE*X~ zfTEQ^?XY?HGzh?dF5*n3Av?>p%RjXd*j#sLilA^#YD0eGf=+FW3@{3&u!4Lso3Kkz zsP)d{9kiM3^kmQ+U=v{ZsS(#v$V zes6RfN2co!XiXDVAbh5NLMxBC{57dLVA+HElu~t6i?6>8hr&h?)A77;pqF+A#^#kJGWA9129OVlD3j`9o9i> z`oVjnm|t^prlE9vGt5G%mPUxOo9zR&EmM+B+wONYkiybNz2A83>LS(Va5B{s)4a~g zdpoexXkV;QH2CMP?YzzvU8wdcAg&&yJcZqSA&-x!W(Tv+-AO_P%K8(d{TLN{Y{J*V>Z z2zIm2i1}e^TY_1afPLY!%K`V$+L$WPs(_K7F#CXF6DWlR6yC8l+%|Kv|EzU;V}*HO?@gW?Kv8Vf|y>D z_<^tLsv3u;pTYr^*34ov&m->VS9G0AI-@u~@)%gBt4m@cI za#@K0h7CIH6673;R>4#Xa{~tqIVzEpKqo=!LRUBF~851V2z20O35lq2x;d|rQ|AQK$^=>^BVLqG#NNTI`) z^ajxG%^))&{>ZRI?&~T_d?XzOn58n1`_Di`S&I4KkCgAmY+Pijf9Fb~_A`1;L4O;$ zmmsbrEugVBE$BveN;i=mD z!0p#RcC`NghaJtF_jNv^)H7b(Qvy<6*ZsbGHDA(e^Va(H_4}0jb-}gaA3yeT;HlOq zY(!LHj`8qVBsq0e@w}jgg+w3%neQ1)7C^<#ar*L^0g&CJ>{1>AM3(ge&A&0p}x!J5kK})n8()Uc8(QYHusa@AY<^` zMK=xj4|fbzJeFFJPYY~sRZ`e{OHehbN-GA&ZtPiu#m|6sii6-B$15bhM|Dp_PYoe~c1v-W$t=Dg zOJjin)M}C>eQHT}FJ>n_6Xs{8XJi!^WeBIMRM<1v0Rho>h#-vyTo-(YL%lzNET2>g zM@{g@HG7`hU^n~s@Skc+?okUNN$@z~oS^;}zGTt??PPAZ=F~(8R~G!OWscM|U5-_p zPBZtMn^%#wZR?ol!b)qZ2GUqu(nz>5)yRnt?QAvE;wkO`;HpbfY5%QCsav3?o*oX1 zD~NgKDzlHaRaSiEcbVb!ZRHkBy24J9Ok`P-mE~ZaVMlj8jenf#RK&k!QmO^;hF4|u z330`m(CG{#s<9cPOk^2OdI^@?!%jNDHd*oOL}OuqVQuW}M$jyY_Cn-hn_E|mJv=OB zRx;Gpfo#0M;ubUUltxSaf47yuD|f-#I?&q1bP?XJp+lEZg+@D+gK(T>???yv!2@RE zy|o7Tt0fKKH5%`vfs`ReBWrFcbvNpMV;eUxemD(**gUV+pXLqy+v+*ac(~sc*XuV! ze~WydZv|T&2(R_*MYTlXe-wppylaVC;$RrG{#a9&wtrW&-Io{|ThwcF-G^X94@ik~Hi z^ukeoo>2}xmpwP*4QbVD0fK)mcXk40aUBEaCBFaWRAF2Q z;jJJM>{l;KDp!T2ztE`Re`afPXv~2nD;3n>x;Od?Q+9hjk2k;;YjEHWztWigfs4(% ztbXe}Xh*-zEZA!@qOXZdrNb`EQ)q6+Pv58&Z#t0m)F+|K-tmG{@}Rfvm$|6~-~Lsx z`Ks8lYV$ehAY$PruxaT5dJPiRJ#4oxDrI8XW;0}~S#Lpq5cA9M;{B87IsNTT;$zh_ zSG0e**Ou~~=iU&U35s&xJ0i>_jDJl=C#h#V+AqxIl$vW4ljKa+y3jbY;^yp$bM`#m zSshsYf)pzGvcjy-?L|==Ov;xzF)N&0rYTD=H6kNi#9z1Qy6!Wid7~YDSb*yDWp6&2)sx z$da1XMiZruG`xh{0otz6(ya%D6%seZF{g{Xw2rWvtbmpidK zUPrJhDs4!vV#2uk8gBlLHXa_)!x20-d#SiqV|2Mg@53Ucyu;x6t5N6?Zq}R`N6qSg zuX|aCpt<;5PKXC#wiz!he21CQ)kCC#!PVWiIo^VQR#=Bidj8FL<1b#^`}0VnZ>n$g zrNX;^MX`K2Qx;_yz50FQY0nR)J7uQrb<|k*jwu6bp%gUN3>KNZp9`IzAK5&f+;6&-L^GLIdny;B-RLww3uBB=@=5w69n-57+J{(JV z&ws#lep(g_nLT;*d9yNtZdjBcs^|Ajl=eTy;Xh!t*7kpVY9O}szdzqwF5U3RXQLiG zFZ6eju}-JSz>|>AE6DI+F?_xuFeUo)3ioUKU18XpS3iIL%0comxi0t#x=^7HOia-y z%!pip>V0Ujnw9MR6g-yNS&?(wPosBVcAk7#G{x-;VFyH5Uz9v)%4}%VzDrHpB48-G z%y|~3$#_@rz})4LY+J&7dvXk~#)|`fnK|#@f1iEWI)C=;{b{rD`^8twDjx+yUnT52 znqQ^-e!q#U@p$dC-75IHWrKF*+oJMzazE95mygHyAB;}wxSvETZn{0jnwKnAqEiJE@1loV_a9Mf4nZSt`oj`?$$9X5q zHU}Pd@wKNm_-yl}w(V$A>HC+ZH#6n~-@_2hb2S~0q6B}xKstuFvm|omyRad-7=x%1 zCU+*;DNs!0Y#&TIoD@`AOnaz9%DT_ZJLoQ$&<`XjM}F~9XOrjamGf|O3~mj(O7iZg zQPDk+{K6u0YedpjmbOa0=$gs;)m^OX=0FRo|H$vDyBqoGhDob?-R#X)13g0E+kw@E z^$(G@udPdDiOI63aHZowa>q3l&w`wM^IO((#bMy3QfDjr{#vt`*W!k;$W*5`qj%@? z=9DFqQ-8Ljx=s!&F89gi>zq^L~-CWuUNWZnB&}U(zMajeLNUY9KE~m!8Ut&jj_kBjXc(BcL zu~(k&y*9kRzjuD_Qux)YYs~h2ph(DJsi*6C3#nE8(btlU3jv&cURg_*bwQr1)oQAM zm*&$n-0Kg|V>%Eo7jP6FSsyqb<;Yqauha;*`^;V(RDF^>{8DpmvhJ~pcpBeSGq(J; z;ep9qpZ25GH_oFojj!QBLg!R=DUyOdqc6o)Y^)9+$cEXiE3|yI{T1{Q1*XLh-Vx$*UeqY-U_2!7Kg=9siK8`|;!mJLs|tA$ za9QIrS5jslIcV)RAL5w7Lqd68420aDyPD;_MtqI5rV?nG&G2I@*A{z4Dz#P~#iy8n@%H|VL^CjP(rst78Tif@o4{wjVgAQUwOa89W_`=>Uy%xVk3chJo zmZcKe4U#PTLi6;Zd+gCy5gn_AxrR613U9yHXhFqSu2~s&K+biD ztmOzis+*|`OuELqGWr9h(xD=`S*qL?%CAK>P?h52-8)}-Y@x$%_;K;ziR}B0wVnC_xoDe5QBi_E1B1rS zZrgH=we=C3h(}yXXTy-^8oeE!S14hP&r40UXSH1e8-l^fnaV;s>{lT+C(NhRLA6ug z1eeSvFYo^Wcg6<=Qx99v*#FEsw5PicZ1FN)@zF7#uxY3~@Hn-$TV7d~bXkUUd z(s%z6wA_`WFk^2YcnqMbFFP;)!(f+nA9v5c@GQLSyr?-k2(I}LalL-91~9Zw{%=75 z!X3UA4#2kml~tHo&g=FGxBd@%9bWej&E5U66F_hSAF6<_{?DP!0vkQn4;I?mYSvr+ z{|f%!qvy_bAA~Rehxz`0X8^d};|HbJoxCt84K3&+?#L@6B$c*$&{x_n_} zVP$2Z+%ng>z*(9%8>~|UY#-=*PvDGgQf9TV(L;=$W`mxKj6)W!;3DJlg?BJkKE9Mz z`u>sRVn8Aya@WH-*D}{y*UegIS+}OmqegPfvvq_QJ)X1NWp3?doKt`<2NXH~Ue3*} zZ)I~)_JJ);IgBl-uGLcWtyj4#3kw&m7sn#dw8|20?rB7~d-c&_Lj*dbnO@LA7@lC| z>uNQWDhSY}(L|43Pv2IrI=9Wh9Ht$hMW{8$|;=WWOVQUV&eW`UrjX0@z znp~UAHDfxNhY){2l~+BB@ive>i+3(*R9BB&53MdjT$t&Uti~zn(8tB(s-{Xpbw^t2 z7H_r*4U>3TGzoQKjIK5(ZL%b}j+Ls~)DTHkG#5eH9epiH^%yEub*geQ#yBmi6_a~j zrDmCUg!b=NX<17%S ztIUv8l`tepL+*XrNu74^B0s6GFM5qEF-ImbfuV*@Ul>d7Elt0z-N-xa2)B?FhUZF_ zeCE-SeRsRC%DQCrlQ3O>Zpx^c1$?4L&%<(5bh_E~qwkTdqRo_R<8iZ_%-Tv<%7NEo zMK4=)jf6|lv;YV`$trp)Rc}nPhQHbkCNo-OS@WZ&8p74dpD8X?*$zqbcGkFORfOqe zJ?3L3oElgGkKdCtbGCBj(SCF*h|4I-y+9IqZ7Ko(oirzvC?cpQ#F<9pN!=pYUqpO6h&%vw<>Tcyy{%bsS)zd%5iSRR|ImZPRUbG%96%@9a%^XQh%p31vQ}f-&$VlABbn0<&F3&+>EnY`0KvN0(N7OcP zDF9~N0yZf2A7ool8(lte|9^J1fn5oawiatTC$8$8uHWCXmW&8bO#&^9QX0{NR=2g% z!2OjoXhd$ZRH3#BuRcM18hErm6Ki>!tEEf|qH871!)s~U0((t6XkktOJj;-v8&h&E za~fN)9{R7dvUMzYJRez>jR`j9qMLLdx#>4xMFdkvM?K4#=meebIZF$AmSaKFWUaG8 zCQ{gH&$$Wu2@w;QWpwK(w9*m+@*sDt>7a4bn3|?>0pCC%zo@bs z?1`Wap`-aaNs!tNEzuba5s=o(Q!6Dj z1z(Ort%(%DO{zx$a2ky<8rCtRO)-ggT^zbj&D)*Zop$1uMyRG5Ew1jXb^zC z?XA~IcU=i_*GU3hbulP|bm`sKNhV1ytFDOlt+nd-wXJ;BQrm5B@LTZL;8->z zX04fPGTDh`6<^d_GZ`|T_?O0*3o6Q4A%GbsP?(ldvXPWa(F^mUPE=8pjD`kMjD|z# zr5RD6XcMNmwa` zX+sjUm5hqU3}q`7F&b5cVyguVQn6Nuh6-d<#U~11dY^k%n4 zTV<Cgv99gNo*j=;dnb zZfxMz;^OC8IykylN2S7^ZTy(rj)?myy5DklW3@Lmw5J-C@YNNus~b^O7S@W zhZ}pVF7-z?o{kYJ?DKD4hi3z8M6M*QJl;!-qZ&HO+34!ybd}OqWZ{P*&W#=2%R8Bd z?&!Ijx{?SDl%rNk(7IPUdyU?@JT6YItsPz4hjy)kj!rx-$_^LC8@>uQbkMLoYE{vp zab6p`91f=&o#n+UaJIU%ak;u%+qzv5#;&J(gstJbX6}W+y1AEIf-YMXW@UO|$wuVZ z90pCv2N*mkQCXlu4htL*4BZ1Zjo1sK+?!)VcNaTx9N1njHl=VlxtyMEj`s^A&_d2n z4y_ungR>&eO-sBMO_`aMAPF%r4BRqZvo=sD_3Ng@!scE+cG-6I7Y>a9n|C7Y1BJuGxv^%zAtr^w0`3U|R;K{WYSpWAGd9H?T9#_$g1B`Gy)wx0 zR^aT3;BaJv=YeuXPLEwZT%BB9Sm|TC8%{QjLfqN9-)P{wyds7Suq1JdfHWL(Xy`P2 z<&!2Y*cD-+u)D3o3!|cHWCKF)UDW4yZmwC-OQhRzr~NWnL3i8M0ZXhO-Uqr_|u_eJ{4w)v)gEzrO4bL!m z(8Hz^hQQ4`Oar8wVRCelpmOjihRPda z4Z<#r5GvG@Cm}|s9~5|P(G?NF*RNT!YBdi#Q0-lw4(=*Lv%8y|uY1e;BbKe zd}PUkjbAY~>5JBhB28P8HiEk_)wyEERZKl%P2h0L0}h=wU=%vVkupV}I6RkP`NIY- z-Zd-~D)&XpyIC`08Ym2oZ0J2a1dbd!^wHuAb8cI(GV$3~fYrMIVi+Vz!$%|>Hh2vQ zoi^>-QLykX3=S9|Y1lDf39!@$h2 zGBDXJL}Wy{fO6f5BdkH&a!pGy6sabT4w828(0I9*D>Ft=S7#ZzC_qH>gT~)5NuCD> zA2uT4E_i_^Mc6TTVe2;L3!EAYyC#mMTs3T1g05j8%*-U!Fyt)MiPJ$=WQ)FT_2D+l z$0iM`^C51WT-~kqt@m4_TYBA1ogMB=bH&N~ffOcY=6m6_*|1DHbZ%zJ`qg^u zDrM7x4uRQ2;$WCNeiwQ~m{se-e1Gs;M2QL6N0+ko?Mz2JVCp1Ck>ef&e07LY-M(6@F~=p zA|@WNAmp3kZW$UdH7?zumP04a14jt5EX=@gk;89TuUs2;8x6Z=t{*fy*x|#h&N*u2 z>w+%bkwheA(IX7pjt(8gbW6Gwb7)a6NTCHohHNx2>FE{?TY<*rLXFBZDnNE=kToLF z%hKzXM9MUH4~ql|1EYZk1m7Gu$eDyf2TU9Yon*i~=sM7dLGcqOoZYR)_X@j=erS29 zeG=tH2h<*_p{j@DMUsB_n^H8mR9JrTL^?MD4}g~wkq2j|%=)1z$SFF+6OW>tt!pkM z<=lcRanSze`sX#pt?O3>qA9Ie&GBaN+7O2KX+<}!t#tZMxxRGHuQ{d1GUbqY5{rpi zyJ=yiRI5(PQe%$<0wTRz>u!_M<4LZT(wWyu^Q(MGn3q*aB$QS`T_qGrq~=PEAQINE zREpm6^C>JPEsIRZFczjPPZPvj{1toQ1Fsho@*ZcD%!Ntu>NmIau8s{gcr{6p^#$R;4n z0sX&9N`NU0DnG&{5`Y8he$)wyC94+wvWr-qjDH{RVp)Ze1SOo}8O^bq$j(3jtS5;{ z1xm{I()JYt_@F|9$=D3%5fKskfXvv*=;>6|lD_8Iv?3;2W&+>{Kat?^3&KGzY z4!U~HnO83YObN0$V2hVW=S&*3p;rd3YhxlvD-IpYxw(YdFbiT0895Y6%Ejohc}a94 zyA0B`bD5ELF!sXb-qI%>Ymaw2x)_V_R6F|SYKqpqxbFtFs0)4cl`nIFxpTR(mz%}n z^J~(W1tc-7N<^h8M7D^VXD}MDfSChl!ReC?r8V=M1iSiceOaUw={LRfmPDv(U#_r z)6%?}i)+sd-soc6)Z%{W1@e{7sp9o%r#I6M&##`)<#K6Auq&{yP%9Zn%;G!Fvne^& zb*977yl@gbXs$~#VPV0}ARmVt9NsQ3hSr>ITV96(_qUImy_ZVqy!nbL@Pnc6#rQ6I z!MO=`M{ENI3`p$Z%f8}LkoCz7jmJi1TfPQPYw+3K;58;yf`#7ed_AvD2R+^H?$gPQ zmy-6OJ>`1MpO!gx958svIT1KM4xQJtC&1vdBeFykSnozo#^N7vM`=<{L;y1h3CGgs2O7kh3RuKNk_8Ut5!s|JkD zZr3-Tr-PH&BP4pRcXvB|bh*6=Jnp->XAXhs_=#&+BycXp&L%=IkLFqaJly_|i@R4_ zmFDE$+T3+gMBU-tvwQ9%lG@8kvK;tE0=I>MrcVfOvS~BPNZUcX7T>b-8Ty z9vHJPL>ttm)(SnQ$CtJ2dw6tnyS-k$-v!k6FOj{>qYh`M4Bk#km7!-Na&E}JqTDrS zy^O)o?K@2jo}GagvkXBI5JW@-K#>D@qgb!{LI1=ZVA8S=_N8PtD5xswOhigjmf^ETjRVu)bS!kDD<>vx+gkn+8M&Sl537aveuRx08y95!wm-yH z_7e|u7^1xuUuzuPZ!C5x)$6P!PTt>w7uPc|vvx#|Lx5G7Jv4U$&x?1LCIPU149`rQ z-ocZ}hK{cdo*h_wJNSBR4sL5F{UWU;oJ(2Ca-B*V6fo{;JT*h7H+}nP4$rKPUmaOG z9vi2HOWdy)ovV{q2b9*Gt}i=P(XFF%trsVoCrG%vH@X~L?Qb`#gTdRZZ#mO>e zS$!c3m437fCm$SSJv5SFNG@a?7HADwhYvz0hn0CmHVHcnℜ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

2Mg50JP1t$Q5Fr(8aU^a2Rl zaquPFk9r_|R%8~ly2gp$MR!sG<}SLT7Bp192qs|#bf7DokCx4zi^lBJJx1)`p?{?k zcWDpMeO9T3n*eaVUKPd8FAapo1_A8cMd2d%uJJbUFFY*Zjgj8$|0MHFM<7;hm?ua; zWrU#!{6b|brPU2f3Ged-!uRykCAh`zQj`f)xlL1)arshwr0dk)LN{s;u!9*67#euI zuv?WKqILMNW>$l<-v$Ga3(qJC;i!z6v9&fA*atra*|FapJ%=5~M(2k-$FRx?_C3NkN~14%IjaHTuX;6hcO&f^6v;0z6q?2{2uL^CU~Q->tBI_sc-1^s zn^h0z7^@7M#2)^ON!#4_&GAMzm! zK-Ih#L6A`p+WX5a$K#HmSZzXAmgKCLkF=ip;9$K9ZK+d;nfL&wpsmCkzBm;SnxL2H zdPwlVIyoOmYD<@a2PQ(J(rU{rO*2~Bmj9>@Q}#L#b2B5EGiIx=JT7aD6GD;f0=Le| zcZ8c+iFeTPFvrH~u5n@V9==KJ7xZ_;E)ZFLzs2}Kbyv&w9fOtj&rrb+MOi;511ESy zMTpqQ575s(bXQFy#qC7RzhUZ4LLrh;nRh6KdFmyB{n;p%bT9_7kH*uk1L3=vE7+x$ zjhozaO*ztePpmVCmLO)8C)7>;$)kBJgS0;~Y}>F>Ru8eL@)Pk3<6F1@bZ>)>OW6ll z5SQF_TDPuw)Ml%nXR+F-zD{|KDk|Op$^*#D1{mpwo`#DV;Jrstu9k7YTxPKnW~8_i zv*2*HtEJJk2mPQ1nKPr(ckU?d`35P9MPL#P3r!8a2*`z5G$ zPRRkcD3nfUz5g5fC+-1>q+)Mn7g?C&pKOP$%$3?p%Hq+Vx56F+migVU09bDNHXg9b zYkzqbkIp^B{(E#Cz|PJ7ni;z6*M!gsXfw7vG<^fSXz-z{q044lxnbGS-PM0DIUEt} zHht*o;t=C%nI;9aY^{wxWzx3P1wWe6l22M}QekSceAV&T;@eJ>k)FpQ{pyE@wmm&P zfoGowv{KN-5TZeEaTWDv%y$Im^JhB~_7AM)TPp6<6lwY0@oKp(Rs!dCgaA{|xl?RF z?!e!x>E~}t_@}KewUz4*K1fU;M<4sqyLht_?_l@BFl?5URvOUF6>jzZ7B>+>&Ig25a!dCQzE-SuvhEtT@ML06gz3$NwLIJ_yV8#t`cL{hDtvzHnJ36QFZ@F#@>>;o29P5I})UFDIvh%0y)zXFhP zUE&-24RKZP@stbkt=3K zdZUNI=Z^u@+!#1uDkdgS&BCZA&tzhGlm7%dOv>#)D%?gBf@+-9Hd*r1661q_pU%RuGL8;mf!)?+S zJnf>Mz^~bhs&T!vRlUJbe(}mH+FfkqOR=lj^&4xqekXWX+g1O0e9`3autZ1a+d}O9 zgG&^Lgo1e^Mor=*@rgf$IQO||hI8?NpFQz<9N#Y;8Gg@{fK~gsOQ>}>0~M>HrX1!d z9&hfdMJo#^1FR^DOi!1t>2B&EsxAa;Ea5OQG^ai&h~L|NBXy>N2c0`Sno4+srf@`4 z6#oLq-Eg+gjfAc?`kyc0Bo~||4)@|`@U1Ww#L?DPLy8M?zFfTpE4c~FZN6 zuM_!7t{vkuKdMar#h?pxL7u_@wF~3$uiw4`r6@%4dkWd<;_qxPDjGo0b>K)C$a3-{*{1 z_=}6>&E6?2iTLSb2BC#)6gBtIsFLg0%uP_Vq5nXKik=P)IlB~{U3Mfqx`c5!-kfJ# zoQlTrY)syb#_fBtKEYmps|vnx5GclC_the69wV zQULD#t6CDPto(=h1IsAuB*i$gwx z*&ZY!X#Lzaq^}riw`is07n>F9_Xf z;#1ekc3r%1^ma*o^Br+oxC$P6e?qZv|GPl}fOh`iGoO@NW#yjMBBz-?txmSY>@j%bnj&LqzqYpLUxDIgjHT51~YA?SWpD zXq;&-&9CVP=_m5yW9(VP7}qf@!kbF70TIcX{ z*nJ2QJ{%oheVSnNM;f*F;_8oQm^iGDOkLKkH zrrW_@)unM*e%DME2VX)o%}>tP^s*5Cf0@pazn{XQ3)tvNZhpTOEh*uNG5A=HxCY@5 zDjoi6Jp8Q`i7^KCyK#P|?HX+*xI!N_D02_j5UG(hcmxc8YvOZRYlC1yLqon}k~H5< zOh7#zB(QCr^v9ML?@gLy4}T!ZYeBk{(8Inn1(GW@8RO0o{;cwEvblG&uSmcf!3g;{ zou8y}^7W5VjZmIaH}mPjscHs`yZFQEcEkn+l78|rsP{8zGc)l%XwohHRB__2(EH)1 zdj_FHJ-Zq^hMpTnd@l_FX#z6YLR4Qiu zAkM2UeLDj=l8j98r9DX(rcmlM*$k+L0tJ2doY~4y6o{{_HnD<$S7HBmv{Y~Isc17L zMN|h%r8GVR4aDfTi=6E>iD3iocqlSQ4{TAqA#!J%d`|cf%A49ijJcPhJaPi~l*TG^mXUL*4g{Sne3*Rb5t5tE2T1oulGL1 zj)J1^wz*$-bDaL=B;UQ9!#5q=Zkm#oZy41WQjX5fV|#1CPvDUGGJTEkT_BWc#o(x$5DS3~^!C zp$<7WiA^w`oP>j|fSB6( zc_Jw5h2RSJ!r6rO8*s$vq~TsfeTd_wW&iYg+(5Rs*CnQ?HXc&2o7f5#9%du8U1pbc zRHh9Db20f<1{^NFf2BX%j_lni$(;815|@fnjUQf){Rp+C)bC7kYW1+-9~jNx9%AxX z-B@4S$Z*=2^xkDjlNR({?CL+@Lho;HPuj14*`8Tys#T~MxXr;*n%dR%DJ0wW;q$%S zlHSuvMm9!Ipr#`GGadlXHf`*Xhio*QcVyJBZhG^twf^&rm1izgunIO zPHR1gcp%r$El&6p5y}LjhM&R(-nV395phWh`QQPo;w(0=6q&$Y79L6=eyN6Ff@h@> z>zscfio4h&lbxz_;JhROdXq%DaF7b;RfGpcNwFn7F?!>D3ohA-)OR_V8RraY2p$GqaQw=*VuDokp<=1x@Wc`au42o#2w4=h-U& zZPqBKsz-)!2L#f>i=5`D-&6LX*ZKE&|9CENTjUPOQ`7$Tm`m|i4f4J^@*OV%)oIE% zBN$QWDbj3}n0HKXi5!QKzCn@fzo-gGCdSzc7}{|&__mTJUaP!lvVw;DdHqe{-)i=5 z3Px=73`9d-L`n2SCb54k(H~~37q+$E@K!SQ^1h_1g{Yl9NxI3TxqWnw3)mBcxi{e) zT~sU8ic|>J)Ygc|82YH<6{KVlgKpZj9G9fBN~kPZQ48!|am2f22}cX|MH$^YazSBi zO&<7l)ux*%Ycyej5N~zSC|l}h%knS6h^OqI;=-Ta1e&IbTJsdMFSWD0*0JtJA=IAz zD;1L!#nfBz&f2?*R;0r!J3zK}6$r69TLvgccFOsc;zbL{e}H<$JBt_Ye+D%iOdlB_ zNtd*MuyN#i4DhaV5HL};$=Gq&t^g_i|pDJhp$MkJ8 z)h*Ej*a4fUv)Xo5&_2*7i#Em5c1)stn?n(Y5mTS|z!gGuE=BVj5S7dawu>BuMc8=< zl#mwvU6OaDnIFTqtH59$?Ys`|2U|1#2BCede3xT5ghPcO zO>(RiHTL1Zofy5{d|;`bh*ynnM~?Dcj_{2wexcv4H*Z#5y}!Lb>-mO0+Q zH(cDyFiSE(3QBfcPMD5JJ&T^pz6cfbtjqWBL|!)}*Jrnh*GuP3EWt{Aaa8^dq?V^c zC2+1K=0?YICm1t&6X)CLf3)Z0CJYl?!VWLocAnBqw#3!sDzr~#GK@S>5P zynF`d#qBC=+6ThN*v!}r7Zrkqh*37lATGAt09Up=N##Q}S`?LKy)4+ih#@0?vWrGv zQ`sdc6Wl1s6nMM@m+%@$wqs($1whz3t-*r$+!6n=YJ1)jhb+^BYW8*|MPfYm!xiw4ht` zTYIAC)N>WaM(@GO_Lhto;d+H^gz4N+e) zeS#1=wG%_s{m?E7lO9^)j^zNGAHm&ULcXZ!v>N@o)vW~9jQ`DAAEuBz)7J18rr8h* zdw;&w|C`=pK#?%l-utyGG4*L zlSH)luuH~!=%#3+AO>+(RZmb^gWG=i)npbl!kHNh^MT>PUqXfyywi8l=kQSe*C|v; zuW6{pZ=49?bqkn;z5lE5QgJ4uY@E3AbL}U&MI4?ibEe0=muK6?ldw89%O8mD_2ZC%Rk^wPs;$|YHl|fHRW1%X` zwZ?i!eBw={rLkGM#Nt1CJ^gY zfc`Ez0Xuf=W3zoN`M%zsWGL1D^83&=m+F!@V(f5zcvl8t->(m7-DZ3hydw>Wy-Bsg z+tQ*8T=-?l@S^4{N(xfnp~Sp&Zza6MAykt!%YLsKgCA`v8Et(P5zkl76QAb1@VuXL zB~3#4c$JOV-Xw&CAR^-)??jIH4A<9lexIXw-e*fN?vKB(IX^EJo?l#=eGIT)^-{&( z))Rv$v$9BOihJQB^B%$77#)2wgZQ@(nWEKZZlnJ?m_^$?X9$iGP%nSLI1r=vCfn^d zMHU2mvs_9}f%S%5K&S$k_@u*}GU??ed43O2-u@BmOkD25J9#MMgWx!zle)JPn08Zo zM0X4roWD7JPwDW|`s*9=D544MOt>>8N6eDcfT+tx6DmW{*R%iT4B~f)^T}kqYqEQ0 z;dafvvfNhCr!p*vtr^^(p_(Zjszr(wT7q-A6puSDO~xz{qqXE^tZ~jOGeZtFkz@2@ zL%E`iGOl@StzgepV$g&^XmM8XUD0k*B6yo$-e>8Jqb)-Ag30-;A)=K7Q^h;d^U!5O*+D)$7M<_B#H3WyyFeSFY+ zMH=>7;o8ZBjUo@8wFHT8yr7{^tH)U6uzyc;a$K&auWArX&x}t-26ASkOw6;mZadU0TwBWBH zYLhBuz=%R8Y(nKAFb=2^hsXjw_=5&L`r1LybC>nV%bSV6Z4HkPL_%v+Qm8D-QDKh`}c=xkZXYd0iJWQm~^RtjdaaML4ik2 z0!N(F{+Bb%X6{tk)nX%!+u&r-O2)pmh&q}{G5 z>et)`7VKER!;*DLL43nwKJIw2z)-IRATg4R7{B|y(-CSHdJ*6O)Ff=AiiQK(cPByT zCMON1*e4n)rd{qos%rEZP)jHN7C+S+U!A%IPrHU0!IR3XkqX3Z!q4@|?>ogp&CRx-(4SP+ca<4a)^L)2yE>E#=9knn5-mP)e zfb9s5PVajK`oBe1YCI`2$fX z<68^$39SeBoLjSp(2eH%H%ip#9I^Kes~48u&EH9BO&A;N zBUa6!QPbgmWik>mgs#rT(wT?q5$87;KGI$SKn{9l6TrPBtt2Ze4IJpi8eAr8IsJ_=@mJhv?YGVtq{`w198}du4R^fpC}sbQg>BaA5)MWOaZYI>h#gpG_DpKHKi~5PIkK0sncw*46WQ_ z1;J#MdASx6@`C*z`?w=gLE&4IvLJPO^)XW7)N&l*g8xuwo-CCVYNG~GvuD~NVr#57 z+De{+9FG7+E0<8$YGJ3$!oLT8C96~>gurJG7&71M{j_jYikQ&c~wt*74Gy&W2S%HqHnLRH3?D>}r& z+7RSCkd+bvyGs`&RZ|7&?tEOhha>k6THB;U=ggc`iC#0=o)Ug)hPUlz#wf-7D;7b@$vu zx|YrPoU}z1M%6JV#(u_z*!xt#m&C)rNq8G}P+MU1#n-PQo~+wjJFJWhha%{KvLG z&=Yb7blHE4x~sEG3)jdZQ#OFP15afx&)M09GK`0G?fha1Y>M9QiPquEZc4p1auj$Z z@A?tzZ*J3ft|xWt{$paZ=jwHra;E+QGe&FMk9&j30XWWh*&tNKb;kEE}7JHE?Fd$W=)aiq2W`HjeKoEMJ*l_A7BVDyds6V< zMI2*40Ji&a$80xkPHAt8fVZY%wBFI2j$JrMDGD?sM6YW1DDakNN{hgQ^ z;~;SP&vgH%cyPY}E`aOK4P0*YRJZk8&Hc}GNBUQ*&{2ZW37J~HAIqUtH00&lnJz^6 z@9uE-?encwo(tUkA#CJruuWX7y3pw&vpys<=}*fMxdE0!m2F{NIt&9RlP8QPfJmIt z?4QpIy9`#1PQxSMOa%7fgh~X;7hRD@%!a6i`57xN>oU~KptISV=Y}L8b#=k^Loe!* zERDR5ni|m`k>dET1o!V)rItL%W@YxEb@tUO@^MbM6DWS#yIn$HKfdh4txb*E>R0!& zWu+Cjx<_guPhPx^k3pWV>~3En*wmVQwpa6eJS&yf@x=Asj1oSd>ixeD$8#OBVC%?w z=;>i8yuzXm^!KgKDGZtorIEdld}6=XyGt($ncN5%NpFLIxtD};4WT}5o|XqG(-zrD;s!8AO$*w*m)8a9_Chp zh{p$#*ha)3ID`dhf!)2X&5i!UqR7JR>wPE#A@J8Nv;Y8K?hL;0^N%0!oE7I5Qa~@T zC!4hX2rx-w1Ny;&C3Sc1WcVf(P}y4%+XN~=Z`CZvj4z4Gx}9$?m;6M~d;6TTvu21N zGQX5?-Wsys!`{PEbADEe13rb^#@Mn2xJ&?ZhUoe-L&+D_=j$+s<;RGUZ&MP&AN$BO zQYvE0^vNVeXW4LGS0tmc5yogRFPn6zwETCPV3{CpO8r0LZtOX4($1N{N$d%t0iode zh#06QlXE3>*~VN_vbjC&R6xx^x5)2d(&o|BXgQy%K6)7A3!qIWSph>9C#Liw&mpMq z@E3Q2DeEkyVJc0yAm?1^27mu2*7@nfF3MM=vTJu201&Z9fR({bT3ZZML=%pk?c8TL zxk>m=OA-_6qT?n^UWN;X7hF_VwwZ*|&1Fa6iAl@jjXkuJ2)sfq-Z{Gp#Bf$tI`san z`1C9L2Wi;M78V%83x+(chMj4?-NL>A6aAm-zAK?N4#If@l~*RyROt$Bhz?*N?-F{N zukC}L#g?fgmi9p*ic@it=tig(Oe+Afg?)u>h@Hg3{R;On`{+MO=uW7n%%or8Vw~9U zIOzC7*JR;VWK6m=ZW`M6@`3VqHFv(w>RFi8KjPgSLP@x%v4@U?36h*5et$S6X`{%w zvcFX1IY!6r$`Wv-`y+o&J|DC@d+PB0B`r(uAAU*r)Gc5*KLNG{l+BEBFM`kI2F1*2 z8QbH2V|>sFdAP7y7J!7`!TzBZPGd%_(*AXm!vtV!A(!IeQ=x@_ziM^f*enVgC=G;% z5U}0AtW-_5WuONtTX;=vO?T0|K(X2q?WMfyZrw&{rg^R8rNoHR_P}oC|3UAc?Fen?R)~jyGtVp;xVMcm41KD;DNZrr^;Va3khp%9Bc~`B{=i4H zqWRctC&8BDuB$6*Xd^pGtf6sXi~b9-&$_p<1_=ur9Yx{FZ@lqrg=KHDl2r0^RUq}! z-CDCBjdkwgTC^Fu;-)h8SLB)5`X@c$Z=%s`^EWEE%TEq?SP59o7<}>*7|RL0W#TC* zBGO8kP3_1WOUA&DWX97&t28g!5_~yr34SUq22S{x)QvP3Fq_dJ23$B zt_35z@x7Kw5EEzuFz*x{HvgFSYIOo@N+L$~(BNmS%MZBUEo;RWPL=pf;aJHmF|DAR z^D0H0OG-aK$V3l=k^z;|jdwskPO)S&A#_&^OsvX|%-T=q!`$tnuJHCN+{FHdJE|T1 zJQMq?oj)KYh4=xOx=aTKin_5aSD3&_M<{tNV$h)d04d@jOoe#A7fhb79o8pI&|PRnj*>`C6u3XkeWxlMHDd2_1wHypEW~c7R9&^;-sF#aS^S|Iwc#&)sC;0ci$~ zFxu{upeQC#8NF>;b!iJPgMCH)SAi=`SeZeUaf&RNP02`-U14?L;2sunY&=`9@s;Ok zF|?G;(-AuNvp}W3vK_HQksz>!?M@#z$Or6Yco_NMGXEojC((MTOSX@xW_C)30!_{Y z)?%tpbd}|3N>xUR5*QN7C5t?~{r7pPVDo}cNXOJ8i*=KjrgD;$M z*?8pJ2QpXAnYf=LS8oVn5$)(snhvvJ%z-j0<&>jxr|`NEsP%bLX&(br?(pZJj}Yfn zh(!=$fPSQQu{ZBA9`Hx+(5wV#7u*~q))f7-`!ff-1Z6ZY0^=( zS+j3C4{+S;JLrL;U!&;9`i{^UNKGv+tWt`PXCJEZpq_ZbdiFI6a8y~-9d^+_3ioN^ z56vTkAU~0Mb9~yugT@%&G95aRGQHUY#R2Y>W6U~wD0AdV0Roa{AV){K5l1{+aDgpb5a7C9E4uBEZgE8`U!xj(Q=4j&>1 zgtWU5f74>)Xa0$BwkVWeia}QhE^F#dIBzrJFkt*FhRH}m)4y7`(2FwC-N*sVhyo-X zOlzev;!5)$_s$t7Lv(s`EPxF>Ytn4vc5SMQ{tjt>SqnavuU@47MV`!M>@q`|V6cfC z$s{$Bej5bq0B;pIhB+3Wa4R^o#wmJarc{=tYoSz^C^O zf?R8@hEDx7<9)FE4R|0VVG*uNl@16RR+%<3zSTWylODS1%1+np2yp0 z%`$v7IS2OEe6Bv2Hf$QZDTCkaB;1Y;Zv`oB(d~%F07aRX{9(;3?58!6RI48JBlL(> z(5`|n;W5x2q zzI+}9od$E2oR@(HExv4X=5#n~k5|seI|JC6GX@pvXTdXVt&(VenmRy2m!&kJ1gDInJ?~5>iOI0Hc_XG6qv2`>kcS8ll=f z)!oB)Kzk;wh*lv!U$%&+j53os)yluf14^Z6SGr9-OqvCXhZTqsR%c{{_8l-f0O(katLCTe(eyjvrtRr60mccrqb zu5eGY%f%~gGJ{})KwU8Qym0Xn?xsE@8|{?`e1sHx~!iYmRTzFT+|d67Af{$>mh*%igELFcaAtRmKx_Oy=$ zwJ!xa_oRv}YRj;=e6_)`st^;F>YXR)CSfjHa*0ly4|%j_s;l>Gv;zly3D(PXkac$` z$hVBS47W^JlT)?Jo|qI%YI_@n>==bT{{OW1>ir@=q|~x@)j#e%)lIz2(>jeA>lDDY zbrUg*1lqytj1~F1)#AoWhPD9r{yOZSEBl%7t%fI$p7?#VeqysaagcvIfBsmfF4q5v z?A(sgMRk{-Yd z@{xL-ke3eP5)w2TaiSh2Z=bVr4*~l=tWR!m1?%p zw3fsocZwl}S-Nn79_|rP;7uIGLCdZTi=>p4n_)s{jZ!+Dx|itAyOdbDlqZSZm_`q5 zVt2GFBJ&|KsvI(~#KJ}SdSCqFtzim6dl(&hvNbbuA)$*cPK+TTU)vpA4gC?6uTvG2 z0eJ62Vh&(mCQ!6l;jxk15%iU1lIY#pHqd%k;Skxt^DWg*M5AhfDcUd{qm(cu zD1INuf{&A(^fL*oq6gQmMV9V$8@@w{rDBC^bI)243g06lKF zXe=_X8G!aI+{e<^ol~q-nFLP;q_9G2qRQ;9NG)I2Q^$9a1k16X)M-kA;HwkwQR1;RB7Wz~{4UBpjkP z0_WA6!L!Vm0H8=+5L;L3V5(81M{jC02rk78wM2j7s`Chi(~<|lJE5B#gCN8oH*xGy(GwGuUdPHWNZWMHFzq~``uvJSo?8YN zs;Q91ig|<{GaHF+r23RXX>x`0#6}jJCj9)sNzpAt+D+D??FBtG4-BFonx;Cqsy^jN zfXT!*{9q>kTgnQ5g7}3C;CC>d$9_dO%o|_4ZTvauSaF8l1g1+2FryP#5bFWRZ>C?$ zo;tG=+KDqGcCcx0PExfC$}EbyhKauyE`pWPJllX8V~RbBXFAh%4vqDT233Y7CPG4q zsuE&6<9M?JH_Gbz%0*nT>5YflOomKu+H2uMHI#_aGXgOdc<_G>4iXN>3T;Zwm$Rq9 zS?BjGEc`LLX&oC6Ucjyu4FNU4=;Cr*Xq-Zmi>}Gf<-+Nz3*crBl z?K3}RCBrP>}Cs??j%~emq!m(wilN@s=AqU>s4i|$z5f;>oJU(R@%JjCBHJ- zuj}JF$2ooO_21Xm|NUHNiGS^t(;`ud!rU5igKJrk!$POpVO6fU z37u95Cjo&?KZ$@ZI2?HLhpjgOfT{yXdXX*gD}=}PME<~CQ22ig`XqroaEE=Kfa>rZ z=(i#qB5+tYeO$;U(+fNdEZ_c88>0RYV|dP9wbfEbu@3n?W)gu~@m2z&~O zv>-1vNUPuuXX8J*hK zqJ+|$q=JQoLBzlyYp8r zEfgm)-@!Nv89IT;|2SG5ld*tKB9hN&B>6Y0;(Acm z982az;7{S*%5cpuTKh_uwAx*_SW9p^-NkIv>o+1S=PlmcxymPheU~EB)-vfE{pR9t zwdljAc-G0U8) zhd%LHW_NprsC~+M1u1T3+$Mu4rIV-g{`tvjq%6tmoMK#Il*L$=M^FZ!NRqUy}D|H+fsgZaQf0xKdQuPIN?J zxcZKKdjGiw-!NI(k+<-D2KCT_y(O=?Bh!bGb2VGP2%^Tnoh`nazc2o-N$k~pQge4= zd(GI}lyz)U5MdC}PP}K^!9D8$u7SICu!f%+PI>8lQj0Fr&D~W7zw0U}C_8mp7}8Cw zU9>{u?u5@$f(RWf4FR=JOY9biC%hL0!emf#jq1H>ZLHoi5))z)TJ>5mR&UWv8TQ>2 zKVEMv6=%LvIV=6BwnF&0ZZU5){-5oViW~EsQ zw423E)&EDyTfEn? zRA1i(e_g)-?I?Wx#!)V)=5AxLd4)5@m3kDwkR!dS;?hs-TIl2pA z+zFyhp|>)vZb@5ETz(PFFW(&( zi1O7}WlQFPRbR5S#`TC)&OJ!)gm6&1h$C^HBea zPT2qapnzBoE&s={d(HsW-SbmjIOAGlEdA|&uJY+{1-BlW7z`Tx`T9zaYhLAtSo9uY z-(x$vS=**;-eK-Ci$#P5Z z3**CbE1Ix5N!Dv0p$9L_^#B)CYOltg==2o`!d;9071-M@J?*s)n{F7nuH}=y`yp?U zxPm#i=g+;&Z*LhXrlKmm!P=vK!-g%;9@X$2UEv5EU=~e1i=h~Ee@*<~f=;%ESPt<~ zH20{1x%kZ2=~HXhAs<2aw`qT)EvMO?m;dvqTXRV%kC-<4AMASsX{S;=oA31H8`S1ejuam8`$QXM~!6Q+w3;XRP~UNV0Y&F1mGPQmLp&{B~pIMPC{mLg<`mrKjl~3%l+S;Dz zSKiXk!qEx|Jkmey88$A6_NeLlbM@=(lRg!{A-plnW3TIbKz2@{0rTGbl}`N;zltsU z4*CzPD*xmU)yar2x%ZVG-tPplJh8aAYE!yZI0W-N{iNEk1*+g-1SUK&INIS1M`Kr0 z3MVFtV%BBS9iQTwCFqpp65Kk#6=Ma{cd>gQn*MnqL682SuWF`PeBER1i2kh0)1Ai# z$K1M!`r@{N2(`kO=|1f=YOlS?A0m&_#}+(Dk0sJ|_OWHmG@HAh#8763%W|8#w-`Qc zYh~(BwQ(t_MZ_S4-3~dI?*SKnvMdtRQw}3=rCW#|UBsOJ z<6oVuURFyyp~G)nzfzx=eE%^TiENykX_cHfYm#(XGPp_i=a=hYv#zk zGZO+wNz`wH-NNOM(?u#F&m_G><4o3v%Sa$)A@LxgXui*rTtk^S0jkxu0{ZR9gmC`mcF>A9zcsWt&AU>(#N6D<#g8D$CNDy4%`&TI_hy;vl|C>> zW~KGYyV?OxK63{^p3PiH8860gvDferI94_a(TT-{QCSE)+F~Cmh<`> z`{Fe1dnt)6UWXZsHh^LGhBFRrw0<*f%p;e@(}bzPkvSo>+~~EUvxg7e--87n4d!$m zYFR#}r`y(;N!T0nH0go4zJ^0hf*Pe}>bNDmdun!dZ^~CcLQuIG-~Po=u}fof28%I> z5uoCKAmGo@?DuhRDGbz?+|Y2({CUuz^%RXl7<+?zb|J8!i4EZ|z^V zEw)mbL}-46__yc>G*B6&Ne&o@F%;{`y?FY(yXCC6`~Ihz;JbT>pvgmvMQre%Q81`b zV1QzHa0)m$(;Ye6j1)au`>(sQA4G&Z83_pgi1ZV+tjNtFJG!Ivd5j=G79L1^dZ4=8 z-sKp&64bIXR#MWnP*h7{ox5Pszm&K}n5YJ&=eRl-Dc-sT@r2sO zBPeusNn=}43wr6e63GVZBuVOyYkqV_X=yZL6ofhteJ%yyuF3xY85E$8S)o>p7d0{Y z{~h^%PG<1Bsy>LS$bf=#|KHM;6ocYsmKu!^ujoIDe%pkMd`tG zY2G}mc0P>sn5Soly`p5Y4xR|R-<6_juG-aXt1kUQctx%X4{UIZS*vXff>X{e+mNT&kY_mw zFiE`M&KOTK;oj64x)A8#T$`U?^nZWy{9G5`({i3Q2jvqg=1p#yq{9|hKR2ERJ(hmU zbzISA>{&Hig{zw7F1feboiFRr9vdLr;3BQjx&eDdzAD$gLv9I$>Llyw|X^i7krA5ZT0yw^Qw>d!3e;JI{5`}KRxe$B-}T^Hd*L`}ncPxG6L?edVa_J9GE%c< zzC29VI_(D@N{um@4|?Zwc3M-dGnGHN7u%y)`%7{nzk{_NL;Y0RLWtn(&3ww~D@2s> za{)e-O7#}0w2D(TSOJQ3{>hV@Z?h}>lq0S9f@ZAt+O1o6cmf&u&~_Ex|JbHezi#7< z^8v7RHkk(jXjSgSTYR!8rfBf^rLEQxU|a{=h$`9c>XBz?EfsmsX%#7 z`R|&)|4*ZngOZY*l!blnc%WbITlYsDjdQLcE8{^Hl!xKr|2$H66er>qxatGPrSjdb zDLH4#$^_=eHacd)oc;2bxe_8AL&+24u3alnrAnF|5@9@nz8?p<-gE*PNL@Yl%WTWi zV}KwYuSCnX{2P>M{G=@Ym(`wI1GUe6{eO7w|I2dEkup&nfY%OqH+JMb{=Hz_W(#SA zt`8J4#*HYWjnV-OCfSJ$^A3gvQVC$kTV^wgZ={tesVB$}u-@V*JTKXqzCFR)fjR{V z%=R5M;f&+GM_GDj7CF|ytI{PWt1TYh;d5{{XwSEA%ny>{xckr&;-{L+>!;F?J1NCe z`^Z7I=Ao4$<_=d;wFPU9s{QBOhZeb=7S2{d&C(6}t*Sr*g(uw&%rk!744|t80BHAVk#G&=>^u3SsOw^Q)%7O?*TxKsG;lrQ$sr_D8YS1ov@AT{yO*hX;H9W+~E zHsxxEX#;8=11mlOi&EgM6{-!CSG$jtceS{uqM>x*EygBx@pkaQmupSJADgJV7<{CQ z9l7Rh+oWonJQ~+JpY}R_asOh9IKXC`W&06lL*Egy-M_eb@3s4Wfi{TRTi(l7X*pOR z5{H8jo7fg?&px5x=`1lspz~dqa|nGH;@w`w0eOPb?6)`zRm-|9&Xe`vQ&jiJ>vXQv zAo$pF34Afv@ISFo*;`(b-=4wD{rnW6_KY$&9E3;GsFR&Cxj#3`C){n#iy82~5i_E* zlg}`t%xK}Mz?-dKV;8^|n_5A|N0m%PT~zeK7?@qm`8q4}mQ=lpgFzsea=g_IZwIz{ zlN%3ZZgKg+qEfwLQ93Zn`X*3jFFFW$o=o-;8vf|MYQfr5|yYz9*p~_eiCvu;f!=Z(-8p zS`xMrJdaXgFLAG+I3u7Yf5Q)rf3Ww*+X++}hZzGu#@fl1Za`Zld<&}lejx@uHrGZA`qs2&KPbq+@*Cte z+GjZmu$jYRY+1_5D2bWIs-kHF(}#<8^6U9m2XpfH_T@zep{3=&PFG_BAjDXxZHa2o zgB`Q1qgJv;;>2a9;}|#ZL@W- zAuz87g6ub-4a|yEaONG5_vZ5Ma3fm3$Z5Za7a1LMEDDtI?o#myl<~QzT7_Y`PT69; z5xc5Wld*)HFugM}UswckWT{m@aSH^YXj>r@ZHd8P zd??ah2VYjgTx+(1VXr@`rc^5)WbBSc;qJYjGUpB1&ZLTfeb%2#f_=p7U1xCH%i6uojd{A@SLzs^Ju%t_->4CL<(r`LeNnLHS@ z03(WO%6^|MF$&>fipcpLH0oe0L(rWY*+M-U%l>4iO*jOVIOzgm(Z2=-uV`V_^+vRs zvIXMc8|QLV))QEYn;2gcxG8P@fkigg_+IGtVFg)!E$B9)%OZZgvvGrLZv8U4}D9D8vY3` zHxWTjAB-IXT3^TJYJ~gl2m<2L*Q_)VWUEZQfVe3^MqVKJi-~ioGK?~XFg9~*M?-qR zow(FqGbLy>ru|-kV!|f~;ZZOvDWEn5Pu?&zUMptTytl=xu)Iqm;+(=_=OmwE6|a%Y zOWy-fH62I%@?&P=%RJ=Ciqif z@>`>2?Zk;3u(d#$cBgL$vyJrt{}Ue)gbrS%9u>Q(foDNcn<9(XE+K@VNHwaMQ~FqAlcPCeFFqDlAcy8S{n@C z5#{GW;%b}uu`NSG>19&_DIM+^&RU%y`JrKubvnEFeQ{)nTdOh^9h^NhbR9$=2NNjM z(Nb3A6U?A5koOxoUnU9NAEszPPW(3_sm?4bbGhVu0QV1hegdj$jbI{eY znZjxm$UJ#=X_pk2QL3%!J2Q*(Zgvybp#`A6m+)wS%oSk15H)qmLuNNdw@F-H5;Rwg z3}m(ePccy$2rTn5CD?f;Eo@u+<2Xu9ra(X^ZpBslZ|q8=#*A&DF)%ckyD08Q{sO?3YYTMYP1lmrw?XYA8tb z275tWw#md;u`gUr#65PMw>DW4himoQ#mwoU%vz~;l8ZrIkP1#5@EkR{lSSOZ^uk{2pq+%tp?7zhDia50_hm^< z-mv&PJ&|Dy7-0dqjB@w2bfQ`qggXLM7gi@Se#0`sag(?i87@pwb-9(6KtR?n+P!d| zo(-z{Gjy9!I1)jcHIyqV<5Pv^1K&UoY08Mj+I{>vplYkBI6(oRhljuzU{2NFgbsNy zGu}IHUnya2kRrUb(@+pfQmQ3SGNq>%y%mo|1Iq@j(Ka`k(ln*bs1QNkugA=V86mTYW3?fX1=rEY6Wz6nhVNkmLui?P^ z6zx$*<4QxczUPO4<^?&Fh5zTfA@6-|0^dJpG|oFVB(e0%xn7tdc2;I&(Q9_8>D#)M zgJB@H6!Gi>f33dMWM+-AOsK-jwlX9({2b5dR5$OT!{=&FFE!RE{jJ4at%&~9^*)8! zgyLnUJswj(TF1aT>+d^F22rig@(Z4Iuf6^p^d3^uk31kPKjp$JTAi8-ZtH(_p$T>w z4ZhH0_H$$n1x($&-R|L%^*jJnn}7sm-6ZGd3ckKOq_tD=x8teBzqb`=HiSg%2fR%s zdW8Oc<`dNkd*oa^QQHjKH$HI7X0%&n_{SydX$io$>64V(tO{qsXU6&@w#s1>uD4+{Yt(BO%3Ql z%?kFm0N~eriiPqS=ReFt53^0k`0v{^n&A;}4iAG*px{)kB+@UZ;V&gR*rr%25o#?> zXduF+`NfC$qRgX~eveHgZh6^oVfW~)mJD2r5a@pPT=8pN`zG2mTIU@|{|E|E;y7=o zLsJ0&9aopsvHWF(m18of#=Vj*UfeqbnMjL%6-TY&yH z-sfWV6+L6u-ru4Lyqko!Nm>-5^R+5qVdc(!E!S!Wsz@YfSd{_VR=xda0xY*H#i}UO zf=dqi_qTod`L&b2VGqwM!bMSw9~h~DFaM4$a38V4qP#G8HMH>q7p~+CpzbR}W{W>B zc4zaACKc5WCSywf3S{tqFboquI~3Kc^pWdXO0GEdtp``Y)umL z;TX>hVRGgO4cV$>)YRpEN(oDc2BA#UN5|Z=wyo8dQO~@Jm~t|0?mOZ18YS!Ad|7;J za))I%Uh-LN8?4ek?dyFRiN*ACrg1eveh5DR`*pnkgCHXZaOa(IVozqKAHag6f~jM^ z@h_SAzu0-&^MvHv7k9U8IJ`9+M3Of_!ncc=D@E)*ss3_h+|n3(ve#yK;WUK1x{dky zin*%3^)ILr3Qu2FM@5eVXynJv$di3zWUZIqL3!UAHUXYZBOvFU@Q`rBITAjMkj4MX zJx#EKIc9VgRxNh(vnj1Raa`!bX4VcB7jSxa5ZlgLeVzV;LvgGOoszh(2440m6D`VRu;#(GtID&E6Iz86dPcE&8QQFkJam% zvP-%OBh@r4TXR*GD++FHtyY`pYU63@o!zfA7Jxz6bjH5R2SIcYB4CMM5K^Wqbej5NsiDH|&sc7YpQM+{SHXK7H8Km$lp3}6%GHKE zlSC`)N#?2SY-#=eWyOV1nOw*#HGwdkqCGnj5=^Y$r82T;2KBmf}VD-`> z_vV7qW4XV*kJaNul_KTeAsF5#WMd)9TFcC0PNm<%JY2_~z@6Y{Nch58ryD z)Pdz}f%ldGq@4-fFY=H>xU{q7&zzg)t&gi%Q(0ZRzb32v9wF|QHH=#Cu|fiI+qyK% zoAwHunvs&6LW8eALpq{6bYH!teg1kzC3TT&o=x|Og=R%!*VN*D|#NmUzeZTrK zeG@f{2na!$|7O=^5h(aKCV)-*#Pd0o;CPbwSN(dc*)!!mTjrm(vMCbkyN8p z)DFYEbG@t6GglNb9J437U0WDGT4y>0%U`wD_%0e3Wn3)l2r!;nS$jN(MqjIM=L00( z89}fy&x9{Dpu3MQ!XJfX`c)$z?b#mo{H86ff$ziw1}vA%;*t1cE>;BoSkb*?m)2P) z9K~NTB69g0MO-IH2P>Vi`Ca&G`}@>Ult#+Lrrs6X!?=w8%NM>6Fzc*gs?1i4ymdq7 zyB9*BobtY-42E}3B4_C1h8e`=GqTZ;Q7=PZyrPBu^lN_f@JnNg-y%=Cb~`IPRuu9f zkq)MR)+I(bm$Go6HHwxxBJWpzIlrZnbzE*^R*QP%+;*D;3BVb$7094kVbxeoDG zFY6=<=Pv4tjb~@8jrndT&3UJN9eMezi3$L80o+Sk)K`V%g-7$V%rr`2B}`ui#a<%$ zKANuH78NDvyh_4%zrND)x-z!P^5W>BwsSyNS0ydJ$uRV>S*$*e@0d{JWMMK#qj!7X zwVplQ|2%Vx)$`t)UGW_Hn zMRv{QVyUpF=&^5_Oe&#*xl%v6BF{6*A2|Q3elf4hqN*B=vA)B0GdVFJU@&z4t-kn! z`X1xui-pg0$fNs9J6kx)uNEF?JGyGbg5U*wmaWZg!KSUe#W_AG3GF&{Y2o2_dR{bL=_eD z4Kx6H{_V*-LAmn$Lz(u#mZgQs@4xAVT==*Wv;zN>Fua_J=78ng-ld|~RzM=nq=|%) zyO&-iS1f-9u9<>y80FE6u;pu}i3RyBMNomYQ~@nURgph}0vTh9A5u zFDRU%aMDsv&G^MLvZsz}pqns%whl9(-6*|Sr+hwDnaM^UUlFDS)SGV;GXenVgyn73 z5QJ*6f-kazhsG(ilx6l^^rMER@6><&V;HZ^@Bu77FE~v$zFoM?fB!35{^yP|1-{P8 zN@GOXjad1bFoBJiLNe2jgB;hi|9wR1G17S<=SFPOx%u^6?MLbN;Fm5d-@O+vYYr~b zoFu7TAAhdbR>}G8DEGTb#o96|_i5h^V%r~=egpgDES5We(w;#7{hP_`3W~i_h@KvZ z0{zSuNy$;?Rbnn+j-?j6xih!AZg##ke#WCIDf;jWqjET7pH?ZbWWK~SOoHk}^kJ(b ze5prYwfT-_SRe?H`IO2(2@fv$j%#L%P*K$WY(;#MeBbjnVoo+H0mkJ`zi05asm&RM%_!S)uPo3xTCk-EVntT$U3nUa- zjxH-c9B^C`NS5h6>2M(RR{3gbI(>Y=VZzaPlaz~@y|_|jxngE~B@}-oZO{p`p@eAi&DyI$auhzd&zn@tT0Cr1<%CrSbAYC8+ z)90$)Hp#GYP7!16L|%T6Dmohk9$d{^Iq+`;CrExcEs=KaoAGi zL(o9SM%eLD@y!Kyf#Lw~x-Z}dt}e<5(dSeS=vyG2ABbTD4}%VuHm1C+yfkWV7X)Sg z0Qo=*@cj6d!LF{xO-U#CUIporQuSuK&#Ulo3%{h@kA)aL`-b4>MlKCTq0X!x0M@ja;S&HEssuHiD$hMKTx ztiS`BIvvis)AY7mrFfy~p5Uvfv#sx`GA=6Dnq20BR7<8|-5N)a9`bwOr7lz86H_!* za=jWl$-3XcwE+g>VM+ipUS@sn#b{Eu$;r*h=|%`QHeWxFAn@{fOab@$$gz9N}G z!%k15b)cvD3>xy62FT;JOlZ{*KOj2zgG`xQhVc3H5C9fCRJP15-7XG4IniQ=a{f~v z^Kch!HOP4h;Z~m9EVP9{(gjLYH4)HjzEcn&e>Q?M5@o)m2pfKusHC)(yiJp8i_=KE zhw_Qj42=qa({+P9nNqMxC%$VLZUS{1m|>D<;LJH`k93M-(_6SWh*J-1s(sl~ieWj9 zS=te|S}N(06B3HWt_~3`Zb+UMGSX7__I`a5cjQcnxL)!BAbu%QeYJWo%<)ZVpuI74CSU@CceyT7szB058%*ir7@*#Zw)_KKtzP-jIFpasknD&+?^^MfSD z;U2T(A<@bE!m7z$@%KcMMP6pfSO=Gm?0vRQ|Fnxi`(t3_g1S0aspHY3BF&hSf8XET z!jqtzsg%$^2{!B{7PQfdKR(7RFOOV2GB6=e^ku^?LM{xEZTKY6G>wh>%=qeVoeV8L z)XF&SF>rmix<$;e9zB3>+ncf4!i?|Y9gO(ES30WVA4q!Arhcclp=ToE( z0(mH!WCcK8^OktaewQxZ{gvx&Ap?J}M?*ZhA!jd6o%`LFwx1HG)VEPx`<%s(s>zq6T z>}$PtK5xD}zCqdpq6Z(>Zd*>K?;IQudKEGi!2Ed%AvtiSacnU9hFOTA8gpGu0rXJ& z?BO{Pn{RzEKqSUwtp+1Q)T0y@3aJ9dmv^)wIux%}ey(ugvr(mK?GW2@mqoETCI~-z z1N9$3wdzJ$S#iI>GiRf!;g)@m`;2@VTH@L)Kgpx#O>sO52lG1#aD$gOgq%y2kUuLR zGGe{cK^NchyXI3LJiizD!$o!R%hJjz1#n{gxQl+JdnkrvV9p}(L!u1(?Ihw6^x4|Y zZ!+iLlVAX2RfK>P@dKU zn;^Q;<-xYLNV{`Mp@(v*`62{0B)F`cDHTnrM-@Ux6p6Ej&;xo%X|A&KwB8X4V!64w zvnf!v#+0fo(kte-v#hR)#I+3+A!j&x=fHf4t{j%y+U=3yK!~7`St7vxeVn;j*GdQp z=gLsfcS}9@*Tp8#iuM`;aC)L8Z}H@wKlr7sDSqf5!8`ADdBhh?^`X21wC?J@1CNJ6 z_mY!@%3d+Ie9G{^AJ!P|+=sGLL6phkPFY#Iv$v9V8s%0KExS35F9t%^vCu66pk)yy zMUkl?%cvr;$(fsCtWA*I+^jEhacX80d0EFT0>ha}L5otYT;2~u~{|)@^X@mt7NydpDlv}i0 zl_&|i%G}O0diNjqDD&ILi*JhAzk(j2+O#s1pNzI>oo4DV^Z(< zT;gj5vh)kw1~kRVTZo?~CqV3L#v#*$j*{1}?b?#vO(_Me2s=qxt%0nfp(*K<7>n^4 zIuLvrGf}-eVAZzQ8Y);mF`%Iw3Mr0KOSKTS?-o&@&ViZ^8e6|)F+~lzY9a~Z2LBE|WP$X+BE~x(WB%agv@|jpDpC*XZ8p7nN z7y&N0+Mz(qGUxpuXx^{-q zyMM|1?BV*5C{tY1DmZid2k3xGS;Y6j3{@l#sGCGG^d8>b(L!DMj*7#b>lJBS_!P*k zKmC@kuIBvF$g7Z<@v|hKunN>@HHvx;tR!e;p}_ccD1J;hzHErjSO0a-yvX?(VHE2V zoW#UWJCR`M5Il3`E6FDkB9QE~FbgsIg zmp~VAUph*GS=`W{mQEIKH9I#qR`b%vH$*VO;~J^ARg^#q=|qf%IY-Py4E!AsU?>qC zpo*o6p<1WYpmX4Ox#oy~{qiadvA}tM2;sHZHUwD{T0x`#A8vrsImp`yI zkU!%M7bba>VzGckW5MjoB#WJ0cOB(G&)wdf*TfPSLjj!0eS#Mn$6tmGxY>D2a*fi+ zqCiP#5oXsc-oXUQZ@>LQ?K4&aSiQANxHz>>YT>VEcR`=&0gR|X!#BohA0#G6>r(1@ z9AOQtSLsB++-iQ>Bzg~%{Wi!|`<1nR^zY<3ePR~l0Lb4vR=a?&zs|-+0{DGGSzA*Y zOpTcfHJTo*1^;^a(i#o&8efkpsTz~xpOzY*&x zO`QhWRuESoO4l7gTC6%Cp+YVgv~C^M=xWk}Qyubaw}b3Lkylze3_qsn-`N*Pv9g}J zjpSg&3c3RYK#u`SljK6pTP%_6bkZkFI?{Ov^YLoS$)Y}XKQQylx_653hj_7Jn4eiF zc$6BAsmo46^o{mr28JSuOUp5+hqB}=*yOkv>DTBP@yq9=n}aRnQJSv?oyp0)(*KrA zEZK@2>E6HPKq67MEt^W9M?$UkvofRpn>{8p?Cn9V4&#Pwu922(9B+vBXG2R^th5-E z#MgI7Im=G?mVTYS9+8U>NiM!y{PoNbqnlJ`hG=0N7YK_X>l2W<36R?iMqJ$buaBUlP z{yle(n*0~_cOOTa+6>dKzVaA}(viM68d=uE*lx-@I^4AJrQn2paZ+X}7WP>oy%b=Y zA~8w+;9yJo#{o7S%s1yU=dwuQnv6d1WIhI%yN-u@>sH(>1Z%sK`)=})L-<0Nn;}WV zXN-f75yLG)t7r0rL~_YBd1JdM^@x!5@liZp3t?2{s2+wi#3)X#@WPljmjbyEj&s6x zS@^RYrPFg()b!2l6FVtOb8GVgpD&3MEKI{b@vNKpxVoE0$zk9XjHi$Xq#HF)fRyUe z76V=@PAG0|;U%h(n7#1<&m~2#qR=hD3Axm4(AP-qFjd6pA3bXO1m?s;n>T~8UhLV% z%Q_11GrJi(JpG&}Qr%NAO5@pq!hIe=8~0*GU$~X(-SeDQ?0a2Ser%rf1^lOFwZA-s zQs%z9bKrTgHI6&VQFt8wlBqa7HqKjIy9|_e9IA!*@5KnZ(t!s^d%K4Zpy$J)KEKhO z6g@2wCM5r}=XmqcrdD*AZ>qWQXX}^DN>r)hdoo&F%S}o#R05T%Tr4Xtv_=t0w~FpP zF?*dF*!%GxB|+m|-wJz482!C?eDIuq=BVk>Xz#7N&f01sF>UXxF3gwYm+TPXv!v>f zQce`kAz^HxH)gI?Ha$hV2R?%tX_PCkAsPPRzW$err(?8n#B zvyFUPP?xhS(apKfAoHtn7ZSqfIH@=81>8z4MfYD8YW3u~H=ELYI1WTMbG> zZ%r3X`-g*G*#Jqme+JDwkHA0XZH>AI_&zjn7EUSnf2EM4d-X33XH>(&BXp_#p6Nt$ zROY{gKCl5RkVEbY^A#_dwMX-;CtpHt%SJ&76;TR^kl73PM30(h;cY_?A*TOQH6`7T zm#oUy(zscrf1|ji?eVkI1$%_F}u4b3UZ5ul%&-nFf#c zg5}QK)L?ccz05<1!@-!5i}1bh8WlQmN{2bh0Rm&I+Jb$N15l&{_dLxYwsL4XvXKbJ)x}AK>5V>wJh4yX<$qd?@`k{1IX8n|O-( zEH&s_eLw#tnH&y|&4Nw8Sg!a?M~Z{vTXTM#-Pei`k7BtO6d`T@)>?p17ckg~!o}T* z3D-cO=42PhyA7zv{lgjHB+`mYi|xA_@3b4wrHk{13fGAjvu80|9`P++nkapEhOT`{nRfm_C<19<|`20hxHow=~>LGih&TyM5! z(gBjSx}b=kw&$cdzou5_qq$kVW4Atzlci3BRw|ZxmW-SIOMYUvHtMe>!$U=dwUj%& z8$YPshsO7~t!jQLTo=)Byl1)?;JVRhs{)b}ab!Ds5`N$PJ(}!B0@rJ6Kg+~X+Q&bOCXgMc#H!QO^3=uQk=F79fAXvRs(5Tvre`H4U~kTsI3iA??iSH9eS&-O_m; zq0BF6I}S7L*jy$QGkshNnB8BJ9(@i)&NhKfgFm5t5Y9C`(ed2K--f&27mLtfZjz^0 z1dPAz6(R_FsTvlbrzZLD*BtsO1#r3mA51VglVt!>PP2^OWv=sc*fHNf&g7WQN!*;$ z3GuB?WN)P`glIH%wG_^L_s@j?4d|t~sBFgU2tBy3owKL-a8Hbeg`G`Ql=606SZDtN*{G5{nc^Jhb@1NeD$^>bSNQUz zo>bDR)wF|hB>noSaVGepn87(q-ZD)pb=coucwyYtDD+|VQ4dNv=!sbV!KNzE2p<#8 z-v??B3Do~FQC99g31a??7*5FCX?sV+t`Z)k?`trw@3et{kNQViJYLM!S=yw2dIV`dCspWuz zuDU^!iDj+Z8T7#K`~0Pf44H%E9aUJ4CxKr>wVTpHq5Bq5AcN%n+KYKW?3^&$gn-^Uw&g@8;5Z>+YsnNVe>J&cOQS zfbw%F*oIzFQ%iQeCq?Z>QMUB%*;0k(^^!zObvo1t4qsPiHFZ^?)z7aYW4@^W;?5vj z-bzRVLTin%*80_D;oQw%Wxm5&i%QD%e&=0=){3Bo$Yu!}?&_~c-#9YZ%+2d8WJqHt zEPFFvn+B;hh)YX6m{u?JJ_mbcgP3s!F+~~Foy{jYfC>z30{Kl{M>DH1U`rH8YGH~9 z_`y7pAa9=I5SIipTEzsAotvC$r>SP}*n~!3KES<7v?mHl9POnc(z*fTOx&w5 ze|$w_xwO7vO6%C5Br+DHQ`#LKYT4(7FG#BE`tHHkdKNN@(ObgIk#bNrOgyq@SHE&F z7;$_-Ovu}zI@#FGl5bD1vxeuIT~QjhdhTk5N-xdwYrTu9#?%Q@GBQQ@T??}9!Z35j z;SAjTXlHZviD<3+NO%O$l$P^*%;m$QasO{uulP-G;@! z+_0*bgu>g8E&NhXep!N}539I{Qja39tA)w0R7#)*wvOf$t*0>zWi5tT)RhkmY;Nji zkjDgH_*AT?a!cFJ^?LTzNg3VwD%LffVekWA;7x7XP@=73sq8BxM_TnqeZ+skge86P zdDNtKeby5{Ry!GUJ>Ogl!bjlc^?i658G^E{Py?@ZPA(?Nrmwn)szJA60;k-JYCe2` zStjgUAR?cK+N235rY}Rfm?F>4TSLBY;|JpEK2N?D^*1mUq_MWJ-twr-P zSx6{H%W0!6+DhoODKs~LX|n_)@_l;Is{)2RvpYD(lPdNHXE~OsoTki@cYgSr+SHLQ z*7?atw6R2SPa!AjuVtt)Pw@bPP9R>%+Fi)VnmJ*D13uB`v48Zqxc^bpP1lK-7hF=$ zPRfv;H-w8I_4Non^N)ol8#VSe5>BCc1nkuNx6+KOh{f?oPWCJ!cdHAAreovwUpdW$ zBO*3UV!5+3=s)nO3*UUc=xG->^sT-fobmz$vtT-yD0ePq7Ie$Enq-fnyytQLCM-!- z8EXQ9a@6biv0vLSReT3RShzG%Gsh)&>-7|tiu`M*t;SpZ;vgJ0Zmop9E2yf#z*HwO|5X-^{MJ$nw>2FL4FMlRfWh){TX*pg#+drL;M_3 zpy65htur2VI&mvZa2#J!G(AtG)Zcz!pmslf^f42E>uw3Px3QIuCOCEz z6J~5}IdbREyRI5kv6RV_cppIR@N32tQK&!*wIn-<^)VM4tRN&FMkasXAB0T`)fmbb zF_uRpUy=#LBYlrv@t^GJqiOl-gorlHkq0#*xctIXm&=Tm*;Kt+7)dKe! zvbLc1mT_8ai|hbFUYZdEN)+8+y&Z~s z?S1|n0f!FX!oHX4WJkZsdG_2)obMSj;9^IpaeaF*W9^kq4Y|(yF0$sOD6?B@!0zh;2`%zSmWPTsRHOSe zP|wy-ZngzFmRQcbr&4wN=qxF|tRanScf~SuH?8AYdvItGQ6uxTsv@ZmzO-{)Q|@J- zEmJgLZda1gPbGGAlOBC5`^bKqseH|ST-A4S|Cl&~Pz;O{Y>(WVWlsXTw*H(OG*Ec-}zm#7Lr)1nC__KnT4^@4eU11tLvEM5Gsi&^uD435G7AgY;sk zf)we}4N7m)L7F$e|GnS&CSiAW&t{f$V0S0)Jo7$LJ%#KxG<+*tuCQmD?*6j}VV(Ql zOFU%UW=UIhMX7fsyzN7U7U>}gP{v`<-8}N1(l>aOIzMXD7cyo~V$F2jV`QtHMI#{! zx7ece6M-g33sjMW|!Z zAQ7CJGE;^@Ey`77iOxMjj*i48vGE3UBI&C0PA=*63NLsQJ{Osd7gbimYYJ884Mlrx z$DMl38bwsu3V{!zi^lJVCMaiy##`{F^lNg)X(Xs5eKQwSN%JwDZPcAJccdv(uPE87 zLeQ&J^Io)8m}Z+i;eOa&(M)B|&9&fnH;J8#fYUIPF_7_K=AD)NQCrii2LoJuUwQju zSktyY(K^;0(>v*az(#di%^`O&KBkssDu$!9w4Q@}YdP=3#qBk6SY2|29La`f?1eLy z85h>obJ*6-AA6MsEN298oHQ)7Kb;8JubJE}m#Td-B3DGtH5g*fVlS_WAKc;QmQ_>boP`CNnW@DVr560{ zZ@(^gUyXYzFdfY3ST_h~zVK)xBI%U%dMz<}-sUS45&5YL+}%wN4HKoIhlUdoZn92Y!D&nZopORvBc;folz3!p zLLL}ry6k;E_-*@@v#EZPk2{}@SKH6$++___^BQbqr12M4dkZ*g?N|FAD`)3_H`!7a zmPO7-#eC1-eAr!fKTUUT{`z2~n{8N_FDJgj^Q(joiDqwW*Ef^mNex@c;%D6{eWQ{} zG}C-!_3;&P1`%suglKw7bH6Ep7VB!A43~hOh~V=F_KT1k60Q= zv-QEPvvCm80p3(>I!_JRVXnNL%R1J~*f+jr*Sf;|MK785!>%OcmLPY%;P$rcYsV~e z3}owA3Ahy|2RKY3jq)VAM&H`SKmoS*udu&BfUOq;{K_O)7Z4x_&3uaZt(8O{GGaJJ zFHwm-7Xtxs;3N-F>?~A3s;-Lg0{{snx(pdH^2WIXQ3Avuq(n%)yl#X}CSs8Udy5Q~ zXH>8+^Mc>7(YImU`~iz30IUFs4AP~nh5>*hKn0;CG&6kb)UKiiV7KyP_z+o*71E7Y z4L~1q21mk3C4g^06CgL)8qs`-IJ}fSAC?76;rO*;(pv$}v<3uX-xh0)D@y141HLA~ z(#l>qfoZ@r5KZ=yT-G^t+c`-C5eup^qoVs`v1TkToq1`03p z#$3zez&Oc?sDFsh5a*I~QFrfU!uDX}LZlc_e)VS`_g?e)}DjD$W%m zz#u=nWP%d|Jtq|f$$Nn4L)s{%zkLa`OqZM%G?*x#SOpJAw4tz)SR{ib`U4d~i&148 z*B}1`{pL1GaShiq;2+Rg$X+@x>Q+7wkE>y2PiP?9Af%jt012>$8UJ^hB|&+9K`|cz zZ;T}YS6CcGow*l^3_?lDuY#f(x3dvDAbBS!izo0Bb&17_hxASL<6aCJbs6OwO~4=m z66o9&KiRj#K90{P;WqYVL9lJe?L25U`Pd++QX*swgm3c(B?(xC3V4S6g4|`4$BWlP z(4s(;6G@UBK+J`pnYzU0$HPqKF-Y*#Kb!i!>!um8g{R`rZ7$!aK6tG^NSi#RJ)dj! zbQ&=K(43U+VeTDy0ALI8rJ&Su6D042@d{a2m15VT6f_}7DZW@f=CGsbN~_IwiYC2p zUM~L^8qT0L0dXk{LbqUcK;g0g+efo?>GrQ71F&djBm-)U`DLZi4*MwKW;%bu(WS?e zL(sslvJijyb-M>%z=WT^+|M$Y31i&3wA)umGoJ82#kyeOe=CCE zF{*A|0@OES|Lsa%xPZA9K{s@a37$J3Q;9kTxB}dUe?*Eo?VMYi79FUp%FAh0-v5;P&!_%3OC1$ihhV0=0cQ?Z#WN^n)+09;fFEYe~k{EM1pz9)#NPNE?hUk7DU zFJ1*d%T;e4d$&nF2HFDM!OF-xkpQFSy3_kLy9FPwWB5?wzyV_5X-F|1$nu7J1CPVp zBvEc4d66+HJf;N@15NcyqXOfQ;vun_VbSyiiSkG)9FiX6Qih}f17ma2#Y38Dz*svx z{!Rnh0TttuhN5nxYe?`&plcYw1uR%&j247c5F;wFc-BjR7@rjp3>c%wAn5_KB=GmZ z*bFoj;19rxDd5|~A?ZXQnf$^?-o|&IS$;0o)Lc_*)VQFad6XKPwPT z1CF+2kz>K%WCmb{MYkw9G!<|e4BSOv@d1f1!V_gR%=nuE%&&%dycMzv>M#Phmi1vt zfZKlZUcg@B0Kgg08=VufsPqYnmIgSHU@x&dh+jBJ5;*n)U=?!W4sy@~NCK`u$m8>F z!|+!QBOp-T&nA-*?E%XFhi0G@1p!uXV{P2T+hKS31OwT-!wGHYe-D6)+9k%Pd5zS3yZ^NBGT@s8z z@BIB)^AxTYsC7Lp^7Qre_um&gBgrQ1dEKE}d?~G*Z9+3G8^a5iGK>6QcIbH8fF2ijD)1 z94eN45ViN-Ut3|@)n-V=PX*_|ZH4Zy8xM8KZxwVv9)i~*M|$|^CD?ij?l-!v;F4Jx zo>;d?IKtFm^u1Ift%xwYe?kf}w=xI?a(R;?Sw3IU$bqTn;w5+7k0~nYa z0Dph1_l47ZFZnt7FLs``41Y&6j<=lZT}iX^A(Mj#OFfaLYzg$_9B!*C7pVb3lJ`5# zhg$0GCa57K33&@e@ANsRK#|m_+M!UwdTMqi3E(3=2WB1FG-M8LdTG{`k`0UD`N<4o z!F4$z<0c#hDMTi992}hLzm*r1fAZhy^9(VpnY*imU1VEIZK-D|ThLeO@m>{^_IJV0 zkCYZTI&morP@sbn7FU9jSpWB!6+BJVqgV;@naSUjO?!6Oqt@?`YWJg-iz+%z zJvnV}uB^vI`$GqQdi89J5PiF}RE{`eaZ^nCL_J5q^W*`_pKSkKKdPPD#y~E zA0Iu1TZWS?Bcr|0#Y6@lA?fZy+NR|G;7@OH@uT`#NE+TeHo$MjEKdU|f`utd&HgIe zbqmA>+`)l1L8M3qd90w3d>|}|0ec0Qh2G=C36My@pQ5f&SJ*KIRKRzcy-sS4Js;7I zVL!g-V)VKFXUj7mhO0x%Y-ElXE7z?uRJzL1o!+8OurpUrVsa;!kyMXcOu=e$36N@Z z-R97}ONrfvF=0_y;K0{&ZZgB$VN8il$UA^2HTdhb4|tC;y?!v@tNhW0>p!LD^i|Ek zY068I{s}qC*m^4aSZ2vk(V$Lpy;6SuN%W0CFrcR%vibKRhs&+7Q;<%%VmHTz(ls4v zt!V$qau#zKUK&-ImyjTfYPDag35MW+{}ep|mp|q-nGofB#dX$kpZ`?hg(g{(o=R7E z3XJhf7gz66$l+KJa|wEv&iB4BJxSNvO^YAY=C3}*Cb)QM>BGkY)vmUB6V0BQC&7*( zS?;}~IgDS1^Gm)$yEx(}qwE}uW8_GdL|IZzBIxS0BzAvjDsE^nAU0|7n4JIV5Y%?Uhm8G|RpvwbM%_4;^Cu?97B5X$!4FK*B-c7ab zi)Un4&Ji7CBda7U{J|=!CTf-Yv50CSkYA-fzLn!;5sHT0Rtuw^NoLjhRADbxSGe)x ziMNrTU=Vu3yds)!tH6Dp!7EI6nl5_aD8Jo-@YGLB}Q zD-@+~2S-DEQdNM-hNITjI+P@m;$l3=!VKO~`m|OHch2RnZ|0naYD*+{ofq3kVkCW# zlaDhT^F!^)oQ)&*a_At+!ykt!?*LP6_eZrEX}w+kq1_P@PF6X^`TvT|Q@q`Dax!kd zG!J$~mN4Ln5~Zz_*I#G$K9(xj(n&L%(hG8?j-wCR%u@#khYIc6x?lvlAF`h%yKjjl z+Lf#gC%uYG01fPuSZ?2I~p7qkvyWRc;N#>qyhY_$J*QoGhE z(*}U79Q?%sd{_B)9isk91ciyJ#SUWbofr(MWgO;YkkHixhdI<2jD9`X-yAZ!xNF6} zP)s>)@*M*GPQaKuGWlJK=h~Ntir3DudaphMYfl_fJNJytab)ScC8a$w@-=isS3G)d zQB2w$E7jJ)61f(>vS(j;zmY`P1$T&67jSp|j7MMtNR=}9qln`uM19?9>|KoTC^-Xo zBuqDM8SXUHY}m*k-M}%D?EQy0&q_)rN>_>fen%@YR%0lGW#9x?s6S|57&h%Kpmw2gq&7@-ASU69n15yc_?W z@ugnC%XJxkt4;sivfYln?|u!(PxE|6OpT8%XRXf(avIp4E`9Ue+*bsVo{m2Cwz8OZx6yIap#482IcbOUJ6YfMrY12Sd zucky8YPu#fW`3w+J@NCaR)L>@J}Z=BuD-aa#+BbIZ7bg&7@X7&b}PCvr8+SP9ITWH zF8D5M6|eZ1Kbw2yk3Fq{j6rs+l}j-n5j0C!lIYUWvif!E2|jcNn-&*$e$agK8_+KZ zzTYN5a#?1A!j+xGeI^0UmRX{HZ81wc)BN#w{ITtW{*Q#o-k556riCs5Gf-{%FRU6Y z_Fd_YRRBWv#j=E~Uggi~EaLkpW0}P4c^M25WO%AH1k(RX- zK6i6=+bnBi88Y>N$F&I;YG*Y%c^<75*pG|7-%n(mm+)gFRVXYd&W-l=q!3}G5exo( z7m=xh!>vW7O|tgW%gqKjnXfLDtCsX)zpdm5hi)j8#4M2DbH;bw{A+jE+kNmXthD5v zs#PK=H4K#%THSwNVAnpYlq9`=q8|LUq_3;io0-ObbL(UU&x@O8yswrySw%-?PqBLn^HCZQl!Rl&lJ9yBrNX3!N)jCTeNIW<7--) z_^4#KltN^ytfVoXvHgQghQ0Bi0}NQ^k@AOl`A(wN2YQIhdnrh$3(60B3^-;vL7#*i zf*eunki($i=fmXd)Pxx?M*^&UQvS66sLYlNIiYLjoV&Fd<)cChE#5vq5;C}T==ulN z#SUD%4iCtP`MFHxv(m7PT_a3K)39$(Y0`y?aj-Gy3#yd#cCKz>Dgr?s@;hPA_3nP$ zCJ%JHaMdY0Jxx9LBe02zlE0R{!;{Cn4SUR8u%AcY?5PxGN8BI9;DAqLQ)PQ+?`eBS zPCMB{p;OtMXD-LOdKKVtRoq~o8SaK`^n>zkoXz%r5rDEf8W^iUJ_HUR*>KGW~OYe z!p7ac(~K4))stg|m6q>ZA(`gC)bBjLaM!-2`z&Wu!M}M+__0LytL~`wfWLNIwy^u! z2i=JcQ?IefV_A7Wvg2=hZZrr%zg+ZL#7RhfIM+rZ@=eklIL@JXIX&=&s=`<~5N$Vu z4>26R1ze!3^_in#pSU+bnmL~#ms4?rhF7RXSnh@K0+-=0C@w*TbCvJ3MgJ3_wBwjAe#6Om-cP2VVuSmk(UBj4ZxSNvO59U;SVGAEMCsq54DS@92dfHo!~snON2cc^KgSox`$MU?R~n- zT5_<-|2*Smj{h0PU;ID!xRFV=gBINUKO6b~D*wsH>q;s`zGZ7qfHdQ}5aty1NC%b` z&!LR_Mm0Ic=zUgCGp5*kxnK5NF8;NI>D<{JY^y=ggG72t_7V5QysZ*@B5~O9@tS9Y zM%cpe(8~EV?f2FoTitkJ__);%aPE)LKC3B$Jr#?q2c+b##AJNIhDC``oAV%*Sb+<5 z=aGDCn|G+`%`r)*fn8?v_e2D+a8mX)*2)=r1mLHoOqZ#f!#2?cuUQ^Ur_WM)`auFhE3EJcdcIh<-lC7@xAFgmIC zB(K!$>YqDkQO)7b$XKFlBORGSD`G)nO6bF-$kp$<1DX*bTlMvu{ymW@IT1`2_@~X^ z4L+m0P}8JM34i~$V(^trg`KTO)3p!D-F4{c>*hk)w37jsvt5q&n*=UkdCKZJ1Ko?X z)IwCPs{5;h`wo*VEjzXEE8|!ah;3zfJO6&z;L@dUxSu1HA_k)mt1QINKiwz6OO31f z65d(I;J?SG+T;6RvZCJhh)r4uiIo&ngrXk9>MG_e6dwm5mvQ;P__#dkRRKp3C%kkQ zAfr3N`c9l4C<>W93E2Z>(jm?;x-3ZgkYQNLW04MkgTel}d@HGE$T{2&Q};&BJm54}2l`i^ag79tJ4=M+KT_UqzAW&*^w~B&jGz7rde+HnD?>5z7lde zmXa3Y0>{G$ffwcaz~wg@nyRC?u8dTE7F_w@ZTDA~cm}zF)cY)lvlhaR(EFT&;e++&A89t(}X0|`wYVD9}Vx1mIG)NSQTwS@(MElV)z?QuX3DUH=O**-}%vH{MO>2 zU2VmxYn&`GGSyDWj?A_sh0bYhDAp)ifCdURM+Kq0d@;xgTH*alV<-d==$NhTxsAJ^sj>o8f zEIdY@cz?p;3;;&KY>k@fK}nV9BaoO2L}lG^rtkABOODQ_65dY@VKiOw_#pHvg?N0$ zj;0YkS^3KMv-7-`>U^z{h@~;R>U>GPz;Is{SfM)tiGz<5anglx8DriTzVI{54vQ8o zH^A$^37To3;J+rKeJ+;t&i$d|mJb?roaW1TT&OAxVl{Z3W_T;oRWPD63tr_<3<}~X zDiGKxmPpKNFj;&06NpT@Nvf={vT8&6%4AlLWQu2b34X&>pw z5ge|2#B#JzzfDy?$XQBBxCc=Nzsk-a%oJgeB3Sx(>^9fpK4L}VDoy9=x<6coes+_B zoCPe+G9^-%Y@i>tjLXmNHF;;yh-|%Kqz*7O?j`S$z5!fy)kKcRJgV-<%6+af=2a3G zaVQH?q-B0e@UyhPH-|}9O71Y&A0!4D3)X=y5kVdhC|0W&huM~pd>@N()LWV4D20{( zd`l_A*G9wXPfkS7DEUO>lSBXbUF4#4Aas;jO<6X{V}ya5D~2r4Pfl|%*`n9iJ(L+o zDC+2|A!hG8wv|-?&0@&SO$}r@pa+Si$YK@l`@X+c;nJiRaURdFwc}Z~8tGbz+UogJ ztM(XncO=@=eK@NyMVlH%%+M$vl$#acbl|4%2Yy}o(K?$>z@;Z6v~rc*4~nM{4opBF>pc0|KQ?zziE>hJ%QM!@aqUg4wngiZDrF76(arrvsb@17TDf)jT~ zQln{#ig{$RBqVvZLce7Nz)bs3}%Mq!a*)A%Gx53`Ol)0$c4l6^Q7dgjzho+D2e-+BxAA04=} zA2PPHyh9#nA<;9_?a*_gm$d`!eAEj53LB>n_t^an_zjcJcGC{S!j;|;=78WXFegd< zNbFgGHSUcuH@@fYX-Uvv9203mYpxNap~7J#G(0u(H{ewU{QcUBufOn<+ynn=spk#Y zU&rnJRdpvai5b*7zx`cHDr8@D?bn@M1^%#_U-6!A-OKsWK{8oyPllF#)w$K0G517=jtuxm*hXXRi`|(=f1@_DRHJsU z?U8i+oA4L2<3`=FVTSi3V*3+ z<8^T1fpfL!50OS33EJ&sdx*y%m8{?4z4mbY@W3#>3_0U%;r}Va|0|Y;4yjBB-W>!} z{?)wW0i33Js|V8Gg>be8awFywX(&gj;RWcFNF!^Lm5jL2LA- zu6oz^2+!EVYx!nxZ1*{t#F9og!q(fC|7@}aEzmeKQE)K7bNx2>%;N)l{9Vvi?UfIF z_F;|yKCw#m?Mt}B9U1Wa(?)Xzg8pwoe3=Rfm+Hky;WpI{&JZ^cL%-fyjkujBy z&7agPd;5$Sbun!%;Pb7l;oeU~SWdgm01sIH60cwi_~G03d`Ts?1{z+Pc;J$TwFEB0 zj5QNb`|I3Tj__U!b~nxH-$sEGy|vr~+|ezBHXi5($e*n+$&gQ?3Vqy)ZlPG0ba(Jc zxw@)$aaxlhlmfGwE~~ymr_xnx%-wl^gxaBcb6A+e-WG2J7sP9Gq6^|}<8A*}xzCpT ze+}SxZ35ZmYjcrXD}VpCPz?_-K0G(Rb?S!Fo9=b$w}BJu5=QeeT1wpswG**oZM z?hP4_B$>;}4JU&;oF+e5;rI$GC5Ug2gihM7V+XtiV1V5$xXbRvFz4x_pnU$;w^L$w z=w6tDT4`yGqj^_XsU16TZF9wf_5t5WPn<*mgOHe(EPk4U(-^MCd~?N!ABr11UEH0M zknmy1k;=R3`Q5d>mAX*cQ#ezR(3m5zJ2@zf{3IhqGmu>3n8kR-rTOmJm`ski52eax zmT5PQr~58q%zV(NQLlooUD;seKur4R(T~!mAMR=;BXkT@Y#B0=;7IBpdZm0%b3X`4 zx%(`>=rQ@~`sXzPR8MD^);uZ7H73iSb1N!9nXx#+AkY!XwojqMM9ap|K_7-sn)yX0 zfMjF{^I|C(M=;n?wH8ln;v$Og@4H4?Jqh4(aoA*|r*9MyLNX-jpoIe5p|KD(Be4o) z{M812*48!HBhb^;d5ALzO^C1YHcoLl5pyC@tlG<>7Do!~)g<>++d}VyYBaV^a!hEP zT)n9RO|hwJ*xl6aw!C`JqXEWjsd}DWPpeZg$tox`BZ;{aQft)EF>}!VIa5^Zih0N`opdkM|v6;hg1{Fda6T% z0}2RM`c34J2w=2Q=CV;vs(smS=mdcMxjjqKrF_=}z&Z|b@3({i*|^Yi7-cjl5< zIdksM72l1O6>|w?WFRM1L*rIgCE2EU#)@}USG>~+u{G2Qzi>-aYc6p2egCQZbua=0 zA6=$pqR8~igMB~mr+jS#%ezO54m5UaF0WdZg)XbOf z4*CR55^vQ8Vqq6}=w%j)fGJ90S0QH5ulRxD8Hhfke6SH<5i0K$G6Nn4F?_%-EtkdS zz@GvpN=4{EHT;-#nHLuMd$Ch61O34OsvkfTvMsHWS&`}%NMLM+i%k(ku6LU24EI8H%2f7To#yY`9?#{vv{1kheLz4R-hoB^yvH=*L zwh({~!!CfHA!vGx-Y^Ux&9Vb$7A-R_K2x~4A#%_EMR4`-(Ewx^<*69CrW?72`i0?D zW%si?2X2C*Nr1gPz-_~uh<_MkTMXu#u?L(Pgr?rxMpSlPps1zf=;bp zE>0-(`<+h}>IPBKisl6&K-Y$aP7JY638OfT?tIaT_mLZ8 zQZa0qDE~WdEcui8zelSbt-vzT4D8&nyfOB*J)@^Ji>*;(h#Zy?-IRE=Vpw?8v28{D zhI=3bDXB09f#@rZbt0OQCX7axD?-3Tv ziWi!zcNnDF30)Ew*PKMrOFrO>XuY{xwoPq;E8Yx?31Y2&M39VmR3JoWKb(~wUr(DH z$&27i3Z&p3<~y;D_$$Pv=FRmorL47e+n@{ZtJjC97EE+s7h0we;%2W%#~v`mRxJcw znQ7G83x5|-2Msq~fqVmhm--M|)vGm6)D2;aQlV~6|6xi|s-b@t7MpZX3~LmrsZkoz zYy_q7t&P(qZiQEXJR_&te0_H;W*RDA;PXrfTMR}fj2Fk4-g(bzsgTy;B+1G68FSH& zdy1M|1!G?**)w6~3O5iReQCgeL&R4Dify9o-RQQs3Mfl3Qh@094K3aQJ|HfRkI6QZ z{08)I=fT|1$o4@mcgt&FA8d+X`GG1WNnSic*>kxT{BK(56?Cx2}uZ#~&=tz9=fh9*PZdg&w1e5nL5|Bhz7bTqn&ii&VPcx-Wmm|r+r6Sc)0F{Y+x_^jl9&Lk#m4)uAP4;;SoP)d-oqLW1PSzU!x*O8u6V&L_e+( zz2efpX{yQ=n7G1aOEsV(gW8K6C@c~WIIVannz9vWKT}mTgc3aHQm5l zYVMZz66^9~_#d4~po7PFKmdGz+ld%Nssr2uZqnh=5@OH>2;fxtOMsyTCseN$}o#Ex$=L0AXuJGtE=}JAH9lJd=JN+luN;5`R<@hrsMY9ge(UQs zN)(Jvh+!-<;xajK;G95U85B@U-13c-9H1>ql5K>WI+F2Tds_QY*VyGJ6U+|m6oHlP zrKa8mop;pXb>C!q?1uA_hFKK1wiT3E3Xh-zS)80?`?nkXkZl?>Kmu?xZmpsDo=YP{ zCnQ-@F2+k)oWBee6rrbKIsySiVU>uybV=p3+Yx1+aTV5Rk_}EQlJVwnwk`YYk@IC*#Uzg!Uhv6l$1M}x+r&;ef;PFY zn5S7;X;>e|sb~1g0`|GAolR{+UEeESVv<_Qo6~1A)`>N@z#(amoi*kW9rvkNYq_jC zDZL(4k5+iA9Tluo>z8LTqiDW%Z&Uimp=4RGrj3OUesw69Ey8uWwhPEdq0NS;VW9@y zv2V`>K6enDR;1K0eJO(eRj$IchTan9p#)$P1SlDnAeOglKOpg*3Tp+uC1dtb1w8>q zK+s(|B(qR4mLwNx3B+R=i?G;Y(^lDk7?F&ZRi*C4T++D9Y%Skq_T{OJ2zbZ0T-HvU zG>co3@fonY=$7>~{mEEMQSQUHg|&Q%wpZO(cKJT+Z)~Y4Dm2$)-jrcJZid*Fx|<-Z zX$d9xxHU}GJDs_tOkZ$6d%^eV1}hndDr%(+DpZ^xQH|hzU~Wh&3p^5(J$y}1| z!Br!qEJUgIlk_5PznCPY)=Dr&cQtS)fuH>K>l|m3sU07RYK#Qy7GL&5LB0?- z&7F}?qD21LU|Zu%Vh1f&Zu{g=niPTXF_E~lj9mT>t_$w`F1|N2P?0n<*xxXDmu5=C zc23pB-WwZ=Mv5w|yViV0HfBr=UR+Z!=i~#bqh5tJb6}D>vF%O_cMkK@DZ8i%95!2X zS$g@nE9zKRI7Qig2d%aoELk@bLrvKY+>NPH8nxJ!JVE}P)+_D|<9xAMMsNqk8ng6m zdjro5&hxN#`YMrHe_(+{%3un!^DiPyI8ur%H$*52nMD)FDWmVDSh8m5J=GGIYX9k| zc;K;sSr~y9Foql$!tky1F*St~Z*fJWAI3cY_2+U*&1K?b=zOvp;R`kgm7uh`f~E(b zq1jwgUFR5^3gY0dBBJ_s*soi8SI95$cPu!`1>&XU1CVxuIS~_~n2}B8e-#h4zALuM z@1}PP;UAlQ?;rK2`*|jEy#=Nl&8FLYE~cfpjBtfa#m&5{fQ<5het`jh(R)EG4WRCH zt0#PG>HNM;p3ManmQ>WNRYku?Bi{a^FCO`+{CM--qd|J1I6nf5ZOyI3e7|igib7OP zEq5$?Yzsm9-6KP&-uraTeM9xdLX=)?mz>roDE7_vbCK2%FO8?(NmkMC6Z30CV&~jR z$3$O)+7SYDEbs5SG!qeQP;rS+e>Q*3(NMqqRlE(aFlbVYYs+0|^}D9s{b?s!INcr@EdaqJ@#BR3?fHaw>*>P7m6_5I0m!dRIF%2Ol$ zlzmHbc;GA)#+CWr)|8^sqK=qb-yf_nf-r}~m;zpK7lb2)NFto*Ajl_-s^&BTbZH2=k;(0P9GbYu2N^Jfbfp1%8=J3P-+0Di>65+K1~*emaK|n95iXu z^;pf)o=!#Tm!nAxBU6^sB!D9i>qI}5_QDSEOuSlzdaFuNa~#mNI7p~BO}a!V_2 zJ=#gBw}_b%wF91wohHqT%{JGsAU!D~fjcn}#j~60+?(qrY%wOABH1!c#|Hy$<=+~% zg#0k%pHo4s5L$6DV_{wAc%~f5TtNan3*ARVg*dQn7+9yI;Z@%9TcAzgmckTd3Nis9 z6%QFLt|O?S|H2|@geT9%iPrDiP$$EE3MP2J6*_aZGj3=2pQuhXC@%k__<~|`lZi)s z>4l)7W3ppX*zVF#ux2Rw%k%TMfIfV`9gM=GtthN0DD;n37r&6{IjGCPhXUZjkbk5dzXzKm3y(+t{Mk8o8 zpX%fh{L=_)C5{H(fA={K<-m&y0ATTWJZJ~81p?%;1OWW8tKjc55CF3ovj77MkBpDw zF+Jo9qiw{67)Y~p3W7)T(|bu!H!!iY;`P{T0wv&e*Se-XZ7h1w5bK~7%@=Nrjp2`{ zd5{JgF;#P8;sMnVgOnxkn8hjx#T@WF2?`JeVM*YDA}~%mcTf@?NS9L#RB3c-cs0$% zy%l)MF9X7)o5BC}amgK&>0K4bUEqyK^eP4o`u~m|)G9ZADw&AeG!33EH#e_npk_CC z6QlW?Gf~jg;!~rcB_ZUxkH9`l$06TWvze5V5d zfbIb3Gx6&&KxGYn#R;${!JD(A0ZeE3EeH$XB^tlEj08rCfqr0^obfyVD?2QJB*4Qz zwAlYP0`N;3GR=Gdzy;8a#-H^b(>_2_A0QuMhyt~=^WzVZMt&P{+-$(yv} z-I&a@_%I4#R>62>+kU|Z_%R~<@KC(1V03h2F{+yb#LgZ{3^wE(5Cntn(r^>dDq?NH zELeLQb)--@)&T^l8K=Va8n- z{*9`;vReqFb&sd05MBZ_XGv(3x^Rg`~_+3!S25-!c`os*g zw`Mss(y(J~$uV)d;8eBWUb*FjV`_URqYhx5xw4-U zxvJZ3x`lOd^Zu|~l|E|Wv#{jg*5!z|YQM@_Hs#JFjHmpE#=%|IOcI%2--+5W5-dW@ zOi5kMsL%4P?Nq4`#bj1ogsE)J`j4u*#tl{tm*t3s!48@ANGh@J(E`52-f@-5rN1(l_gOx z?_-F||Dm`is(eW`G+&OYUJn~hgtsO1iWs3v{dD*r#ZVSjx-+~(7Z)zOF$_z-^{RYH z_rk4U`KH|T>tVFRiNx*(ck@vBj_E|X4CF{0*ysPry5Pe%-h?Y*9&dg?4euyqHppS# z1K}pV?vPlhmWBA|>AE90B^7#X7#Evj;{eVAr_>P}W@)k65AeVRjlfU&WFs{sc;KxrWVSR& zIn?mtt9NlZO_7qmE_8p_edSSv0-AJbF?Q>7m3Tju*{Y#Mi@aqBBMCKJRkdmsr8&=< zEcz=&nIp=TMZ0-H=P5f>XpXHBok;>Mbd_SPAu{DLS#5h^)xeXeNzp>HM-A6(<(mx= z6k3c|_U2@XSa_fPrl1#!y(_1Q!CZe#G$Dx#3?BF?C_A?S+P%Db_xd?wQxQMR&sy|<*RCpU30DdxS9Yn9E z*V?@XUyiLW41GQTil7XrSs)iTV}Cp8F5=GH-%VE|h8O?6dpz1-`nk<(>O1+QI>0q+ zX`m_V-94TU>wnpj2N_bE`A%osR?TxetdEVpFb8G7Yw$k%&*rW1|K9i6QeHOyDFP5H ztt_hWMo+bG2;)D7e}8<&mSOqZiZt}GdQuI!>!cK8w8`{odF?i5^b^w0o>INsbX1kn zLS>%{e~$}`5F%#bih_s}!WiPE6b*u%M8JJ{06Ao5kxPQp?o z+>$~eEMu~L4*Bp+SovY{TCJpRKLd(ftP@bqT&GrlT7vI(K1w?2ZgVnrz>iu zxs(1KQ2y>Z_!063MqXH081-z?eAax~hjhHK9m+^|he2vI@wm6=d9AV5Z*JpWek-C? zcFJl^>U_VEN$oe!FlJvneyzKHo-CwdV20TFP(SdL6q7*U7Uzyy#bpxfjZ!J=az}rN zeYSwmh+{f~3x)a}g$9Nl1wV3@jQgX{6q1l4+zBeUP52?i|1XUlNQm$LQ+r0#qz0Cb zs=G=@p+=B|`5o`baeAt3ivit+6`!rUe_pyR ztM*c>Zc_)3oBQ*b=9 zXfAplzxc;xK5(WDnLTu{@%-hnAFh3X5P%%hlb|<4F0#jJJb4qZ6alZ>JV^q7V7Mku>sa6d|w7$uIYM>s% zy4XUYvGC}wREGP!y^qf;b>p^pTKAkLciep4L$NpSE1%GZkV^7Rcg=@JaI=5D=h~|} zz)Dr%y;mpT5K-pn~Ya(`^NB9rj7f)$o3i9QrAO&Lwo=B!;Zi@2#R)8f1rWfO}NjqQ$H z6~8Wa1YKT*(NDBYF~N(w0JJ)}o0pv;sy50-v-6y-+kdguJ(6~g3DGg3PgYCq3bveg z916*fo=m_?2IGY0J9v9vzAv^o?60A3kJKijc@b6d zmSr;x=we%LSldpMz7_V}XkznJaLdi#+Q%*@?75iO%iq0q07@S+=vx z)#K8CP`=eYe5xVU=fM5#zX(8{$`YlNF4kAm3-sK6_2Vf-KCu*;sEDn7cWyVe_;)*n zCd`rM`MtJRZ@qu~AD-R=s)^={`==(fB!Ki9dPKlbq_@z!Q~?DHEdoZ20Ymoz0tBQJ zdXrv7I#MizAQGBD5UENO1f+-vim1=;pXYu5=iQTYHhVUio!yz)bLZYW-%ml`@vt0s zpG?Sdx^2|0>py>eY%I+CKJ)BLMet?)y_x34{|*jxpKLkw6qN<{rE5G6SiPfZdpoc# zXR!m7W0Ko6Z|a(KQ6y9Lij|u+hq?3Z+w_Ija@!SAZ*}K=qTW?Bx~=`+LjL~}sV#?G z^ZufD8dj9%JBfFCmX+HI`)m$f_pGC~eeTn*Qh9&-{~h$zZx?=_z7wH%zs~uJxKv#k z@Bh1)N$z_(x*I#w{9iSxEuUMyG_5ROeAhbht*t5PRldLU)J4r!88s(+i$X4Cjg{Ni zghTA@Zip0USoffol~IMWU1$+aSw6GTQYweWTdT3rmS@lE>gu|z<>ch(xdO8F^-A#Q z*%(!dqfc}Ei01(N&=kxLQQn8H)>wFrTvO~QGxS+TY+qz z=aoBkbx)da*S9)r6a=@lc$y0N_O#Wbm%03f?kH+1YNC4`G4%q>zGx+QFk}3CW%F)- zA%8A9%iBdxH4{;bxag)>muF*rscrF~_y5AY=@p`X3g=f&KZ&RcocFq2D%FJF$@I5% z^Qm{+YJ2w9$2M~GHh(&@mZy`yq~{?OB^1LTkVx|2WK7lAnC(&WH}2uI*PsfGs&e@| z2F)cTJZwkt7XjDUH2xbUb{44zlJo1T)FQ7kRXwICWIWHqV`B|(kN92ca= za+?`ha*FXB+~yn>P_lC{=z2gpPi}KS8W(GVtRioSkS34SG@Lib3}nLP1c0+GolR|x<(o^OsA}Fe8D8F58I~keU2aA|XPO-=w}n8ShpL$w!-6vtqA!7O-U6lO z`gm&jlDU_s0H>T=gLcHjeb-?h50-FXHc_xcN2WE6N!nB#4?cB7rp&ML)L<@zh=%Lv04 z8+vi&UWcvT?}Fb2tN@@+I;FTQv2cTW4uixJj~&OqNi<8KVk&jsNL##7jOaRCR|W*JxIpdpYi^9 zzEOV{QgXvB-)OKkq!jPwV(pjkAJ4lQ4X|4Nr>c!ES5T;=7HHuVkdZ%u=aTjFRe}cz zX@Haw`17P-K;E#2ypT`})!t@_tKf=lVsqd{d&h?HEOz_xyMUt*P}Q>QTh~|D=I(rH zds^DM*tVrqXL$FI$f*y?*Dm zw=y$Fzh>}A!@R&-xBQmLV4MH=-7ct-|LEOxq_;JFua>{u5J-o7{|ELC2o^0PpsdVpX-O$)*%8j4+)OiD$VO4t^Z+(ZEKZWdLe!hi#2 zM~#(h6OUQ*>}xJ5HZaTm$Mha9vE>kUrrJMV=~?VqnQlQZX*Bezb>)bZ(nm}&N{JpQ zTJEW5_q0`4E3wE2)oZ#0s@8)_J?$?B+lJ6jD>`dT25LCf3tRLBrpU=dM@8vWZ~CaD z^S7JL>#xxrQ~`7(?Qr0w+w#J2N{VLyiO%rOpD%S$w+XhJzF4oWQEz{d&h-wqzgR*) zXvm+MN8wrmgar`!GEp9GB6w#}z9MERwPv*zq;|)(oHkOGAE0VU#!8d_Vaik|vePLw zK!^+tXy7uHN=t@|R#6jMhLQA9co9BQS}!neGSS>};a+H|_a$vT+uA3Cdrt;t)(36q z?*aRj1C^m3+@!N`_YLoL@z;0O*yUEb(`03Ha$iT>crw^`aOYj%?iR%URCwrEhxP#U&*vDCf@n&iGe;P5=0PP*?KBFSEro`8^yjvGH@tArvN`%%@ko zcC-u!2umU1lI)xu^v*ERoD(24&g@#VAd(PIkChj*(z}>3t9K7bvGn0W>abc%kVv|d z2FPYy&AR@YV#y^Zp_aL8@CH?X4!;IKLS84pxt0GKvn#!zGz;hQi?J=SZT343^{&q+ zN9p0sW^UWaMQQ#+{?gm)KZ~zxkro!qwq829c{}vFm}K={tD5HmAo7V_fOmGD4=2j6 zJFj^LKDTobTA;*_wkL?vL3KTG(`Hw(EX#G26*7{-&q}hAXhNNB2 zo#+&pC?rI{E3g$Vr&`t2$(RT0dRRt#`u85(D7zV4*3zWU{cyn1;_Z`=D%emT4>msY zdtGpEgH|zHvr@}!&g0{bi{j3%w`@HYN2?j^ri!mIyW=`~T)`83R3gF>bI?-rm1+Ie zl7GkUeb6phu^~`67v)rZExNBYo+IPP=3q$#z1-S|EX#+%DlwF*E2V>sU`ikc~Bdj?;ShzVK7oB6yqwJ zKBzLhsTFN*PV#doX}dARY(Y>Fd04217K#ko+7zi-2YaPtRzB>9GKcR-Fg@AfHzzk7 zRFJxILKkY~69tVsjiZ465V@5yd71*m0`I`)BwQRsX)US^V_h%iEWxQPIP#w#$)?Iy7k7;`rJ*-b&~y7mQY61lb_x{COIHmmq3d22!cFo(&8 zq%sDA(qy5c4i5084+x;)Yc1^h!tJ-_lDt`&p1iuj44;f>#G|V55KD$xO}ad8=Um}k zm8miSX&6m*FG?|U?rl+8_ovwX_+>P>BS zONP2lW+Y0AkU2vl93pU}#%0#&yjPVKVo!l#Ig_TC#3vwlXgO=Kq6mC;QpUnASy)>U z?LE|pDLqEdkx68-MIcj#wzxomP-rOTi0i!_ze8rKc8F=GRwGa)i|Gw}LG6%VVCJ-< zsUN|@q=9QlR3DZ>5rC28mgl5VGoLKBIFwTCG+`oj1$sR+tlRx?Z9JJz)><8n7iQ zU318oD8ShZhXBM%RE{>(4k4Er*3__qs8I9{slKFhvfHvDC9PZ=EP{7WbO2i>Zt9?d zN!=;065p^q6oHxcyY_p~I&m50c|g41)vFd9g&6e7=G>e@PPm7ySXs7;3F*FlrMSMn zzPc__C$t~%{YaqMGHr1SkXa6CB&;B(>khi zBBOs*Cxv*=!G}{<2V<2yNeZhGSGF#R^6FSB;nILDx7I3?iZLAa6lW46s~z(=a&r<# zBD>Tg3fsUw_5~@lNt|s*KsPF*vaCYnLaoX+;>ucg;oYka+brXX2=`hPorhbdrK=_X ztPktmTw{;eT2l=5Edjid8th^xDxDlHj~t(P#k=5(kX`*zz9Uw&xuII1JUgEbXIY0^ zEj}X8G;w%;eAz5ITsYDU=!D%H*3lw+LB0J_l zE4n71UGTb4j zfNszUC@WnvywO~oFH*&KE61}db^j>bi3FCg7A*}qnG#dS%q~$}!jQCaryYrhh2d6| zh(vNtmX|t~zVcr-$hDIaAAsSi6weq$du(cii+C~v?Muq?Lb(78&?WqRxM;qHFLm|` zd&e;?x4WB#nXZw~70;m^x5XTz9SsY<9@Cp>%#k4hn_eN|A(vM);lvcB_g z$lwkbwyQ#xP;lmx?N=SLB=?LBcpt&O6y(GnMOBH)8Kv3P|7H!fp%%Elrn-sGEWA!A zeRlqaf>6tqygK|hPC1c-mpw(5zYTf4K$+zrDYeE9z#!rzgM0F+G0MxyH$B>CWE8J5 zTV!+3hnTNiohs6Bey!zk%aihKAt6VQkBGS*P@#sei#a}sd0dm};?dxqxA2qJ=v^r{ zIoJ8;a?^@85|@I%Nt+ZE9QlXLD|DEB;daJ7c6RUlcY^WA9B37_k$rG!D*vXpV!Ows zBni)(E7zJN7V^n-8PtEe_FUdSaC38d702g14!4x~0POqUi@R;=%D1oitESrn_nm(h zNw-iOHX2WDR7gFdZtf3j2J(Y1vAzX35`<*Z6&+~+M52;w!|PYSRg3*LU9pIV?Ptxl zW##ST{0s44Sfi0yjuy>sA=hBqb$0;Lm8n2>$0bYH;`>(R@53yVT)9hkaeYg_`2Hz_ zwuASeDSbIr z{d;YvthHX>D+fMDvoM{0&?&s~q>slmFXnsct+M#)e;IvQLo3-ma}bh?%<6KEo03zH9oJvnH+H9OA=K}34fh8a%9?ZZ%hRT>t~>XR7B#8r)}5Tq z04WX)-e<*mttQsagWGw%8!fn`>`&Fauy&R!N^ueF68w759PCAW9wfd|eghjg5ZrHw zH#Tn8Oj^?iGU8dMuS9=Q4Pr~pX0e=c<2HEkq7d)~JcN;ePi^XkEYs%KbNgr{6H5_S zuWMuZmREk7nQrHNA0QO%5o#{r{gU!h?1t1KO^nqHJy!YkFs118P~`pqX?KqVHn9mH zb~Yf$>cpC)@|Ve&iUMT9WQTQ4$2lVblzsJOrJ<-k-1^t18GO{tj2potR{eAH0(|yJ z$3W{Y^@uin5t1cgU)DweydlRJ*#N6*;#g#vl*we&od=fG`2)MU%A16isoZ{pJiCSB zd&Ony5qNSU`y=R z;j!Qbj7RPf>038(!;Th%LWes|f=XDYE^xwS-Z@^X4J42q_$-szblb7{wkAK`<}}bJ zMo_pfSwSkrJXKTo+eqNqKeJWnjkES)0^O|r-&WK=JSgdf9m2_9BgHlR(GjisOf*u` z>(SNrUBYbWS6qsbd3j;lYcoL_@w-(kkvYz(-s>V$LMs7idXwtxUSN`eZlD%)T67 zOPnJU-O{m;@XNT)pPpCjU!yLMOs1$YHQ0VoEW96XNz zw7U$<>_&x7=AwNF4X#fz8`2lH`hZd^MuB-$HHeO%SRoM{&Lu{TqOUr~Meir35Dp@;+ zieE@&Q!_>{mB?FyH!CV{Jjn!@w1dV$tdiglwybM#k6hGV0L9t7VuoEv6$@q(?vhHJ z9<5aXkrm~oxdt36Q(>XtDPGq}t(k-LGdfCz zJA89F=xwVDZfxvOtXhj)%UE>w57;ZUOyi*{+Ow9q@p3@cdNu(>Rk(`s zDk}&er+_8Jk}4=e!aDM3T6h29@vIcBIew_y(k_j8;9m>_gw=-O@<~hFr!HAp;|5h} z-NPQX6m=gSM0wNd>z9FcyYGV#bA*?6kL2~g#CSM`=XJS*N>Qu!-c#Xp_&7R%XqKt6 z-hceEGPNYvsx1xrf_Bla|JGgSz#&$<6@Gmct$5V^Z3%w#19I6&AB

jsAfcig>RB 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 sU2}bAz>$UxPQ|lNhByA)jPBw61l6QlcCxq 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 Date: Tue, 10 Jan 2023 16:33:36 +0100 Subject: [PATCH 090/124] Remove Test Coverage Dependency from Push Image Job The Test Coverage job doesn't require a minimal test coverage. Instead it just upload the coverage results and Codecov will comment later in the PR. We can create the Docker image of all tests run successfully, irrespective of the coverage analysis. --- .github/workflows/build.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 687f61009..e4619fff7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1169,7 +1169,6 @@ jobs: push-image: needs: - - test-coverage - image-scan - integration-test - not-enforcing-referential-integrity-test From b981f232723e27c90fc470072c50b78c7ee8b285 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 10 Jan 2023 18:14:51 +0100 Subject: [PATCH 091/124] Update Copyright to 2023 --- LICENSE | 2 +- README.md | 2 +- modules/rest-api/src/blaze/rest_api/capabilities.clj | 2 +- modules/rest-api/test/blaze/rest_api/capabilities_test.clj | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/LICENSE b/LICENSE index 5ecef2b78..ed5943ceb 100644 --- a/LICENSE +++ b/LICENSE @@ -187,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2019 - 2022 The Samply Community + Copyright 2019 - 2023 The Samply Community Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 5d8c2ee8c..0de45b471 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ The developers of Blaze uses the YourKit profiler to optimize performance. YourK ## License -Copyright 2019 - 2022 The Samply Community +Copyright 2019 - 2023 The Samply Community Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index bc353232e..4aed5f868 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -115,7 +115,7 @@ :experimental false :publisher "The Samply Community" :copyright - #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." + #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" :date #fhir/dateTime"2022-12-17" :software diff --git a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj index 92901a1a9..11f06dfc8 100644 --- a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj +++ b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj @@ -25,7 +25,7 @@ (def ^:private copyright - #fhir/markdown"Copyright 2019 - 2022 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.") + #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.") (defn- search-param [name] From 40676ec324ff6cef6e8ac578cd840dacf80a162e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 12 Jan 2023 12:16:32 +0100 Subject: [PATCH 092/124] Enhance Development Docs --- DEVELOPMENT.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/DEVELOPMENT.md b/DEVELOPMENT.md index dec63e518..f9856a2c8 100644 --- a/DEVELOPMENT.md +++ b/DEVELOPMENT.md @@ -1,5 +1,31 @@ # Development +## Building Blaze + +The main build artefact of Blaze is a single Docker image. Apart from the Docker image, an uberjar is build, which can be used also. + +### Using GitHub CI + +The most reliable way to build Blaze is to use GitHub CI. If you create a PR, a Docker image with the label `pr-` is created. You can use that image after the pipeline ended successfully. + +### Using a Local Build Environment + +* install at least Java 11. Java 17 is preferred +* install Clojure by following this [guide](https://clojure.org/guides/install_clojure) +* install Make +* run `make uberjar` to create the uberjar that will be available under the `target` directory +* run `docker build .` to build the Docker image + +## Developing Blaze + +The recommended way to write new code for Blaze is to open a REPL in the module you like to work on. Blaze uses Clojures own build system [Deps](https://clojure.org/guides/deps_and_cli). You can run a REPL in the command line by starting the tool `clj` inside the module directory. + +The best way to use a REPL, is to use it from your IDE. If you use Intellij, there is a Plugin called [Cursive](https://cursive-ide.com). With Cursive you can create REPL's using the Deps build system. In such a REPL you can also execute the unit tests. + +Inside the REPL you should be able to discover and play with the functions and execute unit tests. Developing a new feature will always include writing unit tests. Code coverage is measured in CI and should only increase. The unit tests should already ensure that the feature is implemented correctly on a module level. In addition to that, integration tests can be added to the GitHub CI pipeline available in the file `.github/workflows/build.yml`. + +In addition to the REPL development inside a single module, it's possible to run a REPL were Blaze can be started as a system. Such a REPL should be started with the namespace `blaze.dev` loaded available in the file `dev/blaze/dev.clj`. In that namespace Blaze can be started by invoking the `init` function. The configuration of the development system is done with the same environment variables used in the production system. That variables are documented [here](docs/deployment/environment-variables.md). + ## Release Checklist * create a release branch called `release-v` like `release-v0.13.1` From 6ceb05ee3e9cf41d1401ce16b6698aaee5762888 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 16 Jan 2023 17:08:34 +0100 Subject: [PATCH 093/124] Update Dev Dependencies --- deps.edn | 2 +- modules/metrics/deps.edn | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/deps.edn b/deps.edn index 06da2d8cc..ac45a2be3 100644 --- a/deps.edn +++ b/deps.edn @@ -47,7 +47,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.0" :git/sha "8c93e0c"}} + {:git/tag "v0.9.1" :git/sha "27ff8a4"}} :ns-default build} :test diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 6a3a2492d..c79588eb0 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -16,7 +16,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.0" :git/sha "8c93e0c"}} + {:git/tag "v0.9.1" :git/sha "27ff8a4"}} :ns-default build} :test From 6f3550ac1d58b2a27904c2608b375fd823b32c52 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 23 Jan 2023 15:23:53 +0100 Subject: [PATCH 094/124] Remove Stratifier Ageclass Test The test depends on the current time, because it calculates the age of the patients. So it will fail if current time changes to make a difference in the age classes. Such tests will not work. --- .github/scripts/cql/q19-stratifier-ageclass.csv | 11 ----------- .github/scripts/cql/q19-stratifier-ageclass.yml | 8 -------- .github/workflows/build.yml | 6 ------ 3 files changed, 25 deletions(-) delete mode 100644 .github/scripts/cql/q19-stratifier-ageclass.csv delete mode 100644 .github/scripts/cql/q19-stratifier-ageclass.yml diff --git a/.github/scripts/cql/q19-stratifier-ageclass.csv b/.github/scripts/cql/q19-stratifier-ageclass.csv deleted file mode 100644 index bb0b0f3d0..000000000 --- a/.github/scripts/cql/q19-stratifier-ageclass.csv +++ /dev/null @@ -1,11 +0,0 @@ -"0",7 -"10",15 -"100",3 -"20",13 -"30",10 -"40",13 -"50",19 -"60",15 -"70",16 -"80",2 -"90",7 diff --git a/.github/scripts/cql/q19-stratifier-ageclass.yml b/.github/scripts/cql/q19-stratifier-ageclass.yml deleted file mode 100644 index 04a63a48b..000000000 --- a/.github/scripts/cql/q19-stratifier-ageclass.yml +++ /dev/null @@ -1,8 +0,0 @@ -library: modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/q19-stratifier-ageclass.cql -group: -- type: Patient - population: - - expression: InInitialPopulation - stratifier: - - code: ageclass - expression: AgeClass diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e4f98eb67..5a510ead5 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -443,9 +443,6 @@ jobs: - name: Evaluate CQL Query 17 - Subject List run: .github/scripts/evaluate-measure-subject-list.sh q17 120 - - name: Evaluate CQL Query 19 using Blazectl - run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q19-stratifier-ageclass 120 - - name: Evaluate CQL Query 20 using Blazectl run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q20-stratifier-city 120 @@ -1033,9 +1030,6 @@ jobs: - name: Evaluate CQL Query 17 - Subject List run: .github/scripts/evaluate-measure-subject-list.sh q17 120 - - name: Evaluate CQL Query 19 using Blazectl - run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q19-stratifier-ageclass 120 - - name: Evaluate CQL Query 20 using Blazectl run: .github/scripts/evaluate-measure-blazectl-stratifier.sh q20-stratifier-city 120 From fc002fbe682dcbc82ec4d80c7f4830fc4c5fcdc5 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 23 Jan 2023 17:58:42 +0100 Subject: [PATCH 095/124] Update Dependencies --- deps.edn | 5 +++-- modules/cassandra/deps.edn | 2 +- modules/db-tx-log-kafka/deps.edn | 2 +- modules/jepsen/deps.edn | 2 +- modules/metrics/deps.edn | 2 +- modules/rocksdb/deps.edn | 2 +- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/deps.edn b/deps.edn index ac45a2be3..69b45eec3 100644 --- a/deps.edn +++ b/deps.edn @@ -47,7 +47,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.1" :git/sha "27ff8a4"}} + {:git/tag "v0.9.2" :git/sha "fe6b140"}} :ns-default build} :test @@ -128,4 +128,5 @@ "-d" "modules/thread-pool-executor-collector" "--exclude" "com.taoensso/timbre" "--exclude" "org.eclipse.jetty/jetty-server" - "--exclude" "org.clojure/alpha.spec"]}}} + "--exclude" "org.clojure/alpha.spec" + "--exclude" "lambdaisland/kaocha"]}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 9b43478aa..dce2ab4c0 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.86.Final"}} + {:mvn/version "4.1.87.Final"}} :aliases {:test diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index fae37f62f..ab4a3e017 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.3.1"}} + {:mvn/version "3.3.2"}} :aliases {:test diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index 3d07fe241..e17efdbee 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-client"} jepsen/jepsen - {:mvn/version "0.3.0"}} + {:mvn/version "0.3.1"}} :aliases {:test diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index c79588eb0..134246821 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -16,7 +16,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.1" :git/sha "27ff8a4"}} + {:git/tag "v0.9.2" :git/sha "fe6b140"}} :ns-default build} :test diff --git a/modules/rocksdb/deps.edn b/modules/rocksdb/deps.edn index c3d8a84eb..d52f1267c 100644 --- a/modules/rocksdb/deps.edn +++ b/modules/rocksdb/deps.edn @@ -9,7 +9,7 @@ {:local/root "../module-base"} org.rocksdb/rocksdbjni - {:mvn/version "7.8.3"}} + {:mvn/version "7.9.2"}} :aliases {:test From 63f37bd2b0550aa69d0a6c389d6bcaee685fb2d5 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 24 Jan 2023 14:18:05 +0100 Subject: [PATCH 096/124] Release v0.18.6 --- .github/workflows/build.yml | 4 ++-- CHANGELOG.md | 8 ++++++++ Dockerfile | 4 ++-- README.md | 4 ++-- build.clj | 2 +- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 10 files changed, 27 insertions(+), 19 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5a510ead5..25b3005ee 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -204,7 +204,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.5-standalone.jar + path: target/blaze-0.18.6-standalone.jar - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -1220,7 +1220,7 @@ jobs: uses: actions/download-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.5-standalone.jar + path: target/blaze-0.18.6-standalone.jar - name: Download Blaze Image uses: actions/download-artifact@v3 diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bf46f3d3..998a9574c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.18.6 + +### Documentation + +* Enhance Development Docs ([#878](https://github.com/samply/blaze/issues/878)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/57?closed=1). + ## v0.18.5 ### New Features diff --git a/Dockerfile b/Dockerfile index 28f098a6e..e909bc8fd 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.18.5-standalone.jar /app/ +COPY target/blaze-0.18.6-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.18.5-standalone.jar"] +CMD ["java", "-jar", "blaze-0.18.6-standalone.jar"] diff --git a/README.md b/README.md index 0de45b471..77ab07ff7 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.5][5] +Latest release: [v0.18.6][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 38df84cc8..08260fb98 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.18.5") +(def version "0.18.6") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index e921695c5..d65b812c1 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.5 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.6 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.5" + "version": "0.18.6" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 67d8fe115..8c19d71a3 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.5). Look for `blaze-0.18.5-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.6). Look for `blaze-0.18.6-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.5-standalone.jar +java -jar blaze-0.18.6-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.5-standalone.jar +STORAGE=standalone java -jar blaze-0.18.6-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.5-standalone.jar +java -jar blaze-0.18.6-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.5 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.6 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.5" + "version": "0.18.6" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 4aed5f868..7d5b832b5 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2022-12-17" + :date #fhir/dateTime"2023-01-24" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2022-12-17"} + :releaseDate #fhir/dateTime"2023-01-24"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index c4de06c9e..9ff7f4f39 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.5 + 0.18.6 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 972bdea3a..ab457fb16 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.5" + {:blaze/version "0.18.6" :blaze/clock {} From f40de05e54782ae66a47e0571a58e0a44f67dbed Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 25 Jan 2023 19:22:28 +0100 Subject: [PATCH 097/124] Add Evaluate Measure Timeout The environment variable FHIR_OPERATION_EVALUATE_MEASURE_TIMEOUT can be used to set a evaluate measure timeout in milliseconds. The default value will be 1 hour in order to prevent overly long evaluations from slowing down Blaze. At the same time the default should not change the behaviour of normal evaluations. --- .github/scripts/evaluate-measure-timeout.sh | 13 ++++++ .github/workflows/build.yml | 41 ++++++++++++++++++- docs/cql-queries.md | 2 +- docs/deployment/environment-variables.md | 1 + .../fhir-search/simple-code-search.sh | 4 +- docs/performance/import.sh | 4 +- .../blaze/fhir/operation/evaluate_measure.clj | 12 +++++- .../fhir/operation/evaluate_measure/cql.clj | 26 ++++++++++-- .../operation/evaluate_measure/measure.clj | 12 ++++-- .../fhir/operation/evaluate_measure/spec.clj | 16 ++++++-- .../operation/evaluate_measure/cql/spec.clj | 31 ++++++++++++++ .../operation/evaluate_measure/cql_spec.clj | 31 ++++---------- .../operation/evaluate_measure/cql_test.clj | 14 ++++++- .../measure/population/spec.clj | 21 ++++++++++ .../measure/population_spec.clj | 18 +------- .../measure/stratifier/spec.clj | 19 +++++++++ .../measure/stratifier_spec.clj | 17 ++------ .../measure/stratifier_test.clj | 31 ++++++++++---- .../evaluate_measure/measure_test.clj | 28 +++++++++++++ .../fhir/operation/evaluate_measure_test.clj | 29 ++++++++++++- resources/blaze.edn | 6 ++- 21 files changed, 296 insertions(+), 80 deletions(-) create mode 100755 .github/scripts/evaluate-measure-timeout.sh create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql/spec.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population/spec.clj create mode 100644 modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier/spec.clj diff --git a/.github/scripts/evaluate-measure-timeout.sh b/.github/scripts/evaluate-measure-timeout.sh new file mode 100755 index 000000000..0875b29e1 --- /dev/null +++ b/.github/scripts/evaluate-measure-timeout.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +BASE="http://localhost:8080/fhir" +NAME="$1" + +DIAGNOSTICS=$(blazectl --server "$BASE" evaluate-measure ".github/scripts/cql/$NAME.yml" 2> /dev/null | grep Diagnostics | cut -d: -f2 | xargs) + +if [ "$DIAGNOSTICS" = "Timeout of 10 millis eclipsed while evaluating." ]; then + echo "Success: timeout happened" +else + echo "Fail: no timeout" + exit 1 +fi diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 25b3005ee..b20ef7a83 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - clj-kondo: '2022.10.05' + clj-kondo: '2023.01.20' - name: Check out Git repository uses: actions/checkout@v3 @@ -645,6 +645,44 @@ jobs: - name: Load Data run: blazectl --no-progress --server http://localhost:8080/fhir upload .github/test-data/big-tx + evaluate-measure-timeout-test: + needs: build + runs-on: ubuntu-22.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Install Blazectl + run: .github/scripts/install-blazectl.sh + + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Run Blaze + run: docker run --name blaze -d -e JAVA_TOOL_OPTIONS=-Xmx2g -e FHIR_OPERATION_EVALUATE_MEASURE_TIMEOUT=10 -p 8080:8080 -v blaze-data:/app/data blaze:latest + + - name: Wait for Blaze + run: .github/scripts/wait-for-url.sh http://localhost:8080/health + + - name: Docker Logs + run: docker logs blaze + + - name: Check Capability Statement + run: .github/scripts/check-capability-statement.sh + + - name: Load Data + run: blazectl --no-progress --server http://localhost:8080/fhir upload .github/test-data/synthea + + - name: Evaluate CQL Query 1 + run: .github/scripts/evaluate-measure-timeout.sh q1 + include-without-referential-integrity-test: needs: build runs-on: ubuntu-22.04 @@ -1203,6 +1241,7 @@ jobs: - not-enforcing-referential-integrity-test - small-transactions-test - big-transaction-test + - evaluate-measure-timeout-test - include-without-referential-integrity-test - chaining-without-referential-integrity-test - bundle-with-references-test diff --git a/docs/cql-queries.md b/docs/cql-queries.md index cdfe68408..a27272398 100644 --- a/docs/cql-queries.md +++ b/docs/cql-queries.md @@ -11,7 +11,7 @@ If you like to use the command line, please look into [this section](cql-queries ## API Documentation -If yopu like to use the CQL Evaluation API directly, please read the [CQL API Documentation](cql-queries/api.md). +If you'd like to use the CQL Evaluation API directly, please read the [CQL API Documentation](cql-queries/api.md). ## Install the Quality Reporting UI diff --git a/docs/deployment/environment-variables.md b/docs/deployment/environment-variables.md index a736cbb71..8b91d5c56 100644 --- a/docs/deployment/environment-variables.md +++ b/docs/deployment/environment-variables.md @@ -86,6 +86,7 @@ More information about distributed deployment are available [here](distributed.m | LOG_LEVEL | info | v0.6 | — | one of trace, debug, info, warn or error | | JAVA_TOOL_OPTIONS | — | — | — | JVM options \(Docker only\) | | FHIR_OPERATION_EVALUATE_MEASURE_THREADS | 4 | v0.8 | — | The maximum number of parallel $evaluate-measure executions. | +| FHIR_OPERATION_EVALUATE_MEASURE_TIMEOUT | 3600000 (1h) | v0.19 | — | Timeout in milliseconds for $evaluate-measure executions. | | OPENID_PROVIDER_URL | — | v0.11 | — | [OpenID Connect][4] provider URL to enable [authentication][5] | | ENFORCE_REFERENTIAL_INTEGRITY | true | v0.14 | — | Enforce referential integrity on resource create, update and delete. | | DB_SYNC_TIMEOUT | 10000 | v0.15 | — | Timeout in milliseconds for all reading FHIR interactions acquiring the newest database state. | diff --git a/docs/performance/fhir-search/simple-code-search.sh b/docs/performance/fhir-search/simple-code-search.sh index a2dfee04c..9f51c4d69 100644 --- a/docs/performance/fhir-search/simple-code-search.sh +++ b/docs/performance/fhir-search/simple-code-search.sh @@ -10,7 +10,7 @@ RESOURCE_HANDLE_CACHE_SIZE=30000000 start-blaze() { echo "Starting Blaze..." docker run --name blaze --rm -v "$VOLUME:/app/data" \ - -e JAVA_TOOL_OPTIONS="-Xmx${HEAP_SIZE}g -Dclojure.compiler.direct-linking=true" \ + -e JAVA_TOOL_OPTIONS="-Xmx${HEAP_SIZE}g" \ -e LOG_LEVEL=debug \ -e DB_BLOCK_CACHE_SIZE=$BLOCK_CACHE_SIZE \ -e DB_RESOURCE_CACHE_SIZE=$RESOURCE_CACHE_SIZE \ @@ -19,7 +19,7 @@ start-blaze() { -e DB_RESOURCE_INDEXER_THREADS=16 \ -p 8080:8080 \ -p 8081:8081 \ - -d samply/blaze:pr-678 + -d samply/blaze:0.18 ../../.github/scripts/wait-for-url.sh http://localhost:8080/health echo "Finished" diff --git a/docs/performance/import.sh b/docs/performance/import.sh index 20b21af1d..7d6db519f 100644 --- a/docs/performance/import.sh +++ b/docs/performance/import.sh @@ -5,14 +5,14 @@ C=8 import-once() { docker run --name blaze --rm -v blaze-data:/app/data \ - -e JAVA_TOOL_OPTIONS="-Xmx4g -Dclojure.compiler.direct-linking=true" \ + -e JAVA_TOOL_OPTIONS="-Xmx4g" \ -e LOG_LEVEL=debug \ -e DB_BLOCK_CACHE_SIZE=8192 \ -e DB_MAX_BACKGROUND_JOBS=16 \ -e DB_RESOURCE_INDEXER_THREADS=16 \ -p 8080:8080 \ -p 8081:8081 \ - -d samply/blaze:pr-678 + -d samply/blaze:0.18 ../../.github/scripts/wait-for-url.sh http://localhost:8080/health diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure.clj index 2b1d87a68..291fbe0dd 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure.clj @@ -19,6 +19,7 @@ [blaze.spec] [clojure.spec.alpha :as s] [integrant.core :as ig] + [java-time.api :as time] [reitit.core :as reitit] [ring.util.response :as ring] [taoensso.timbre :as log]) @@ -123,7 +124,8 @@ (defmethod ig/pre-init-spec ::handler [_] - (s/keys :req-un [:blaze.db/node ::executor :blaze/clock :blaze/rng-fn])) + (s/keys :req-un [:blaze.db/node ::executor :blaze/clock :blaze/rng-fn] + :opt-un [::timeout])) (defmethod ig/init-key ::handler [_ context] @@ -133,6 +135,14 @@ (wrap-observe-request-duration "operation-evaluate-measure"))) +(defmethod ig/pre-init-spec ::timeout [_] + (s/keys :req-un [:blaze.fhir.operation.evaluate-measure.timeout/millis])) + + +(defmethod ig/init-key ::timeout [_ {:keys [millis]}] + (time/millis millis)) + + (defmethod ig/pre-init-spec ::executor [_] (s/keys :opt-un [::num-threads])) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj index 28cee6bae..5e52b4e48 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/cql.clj @@ -6,9 +6,11 @@ [blaze.elm.util :as elm-util] [blaze.fhir.spec :as fhir-spec] [clojure.core.reducers :as r] + [cognitect.anomalies :as anom] [taoensso.timbre :as log]) (:import - [java.lang AutoCloseable])) + [java.lang AutoCloseable] + [java.time Duration])) (set! *warn-on-reflection* true) @@ -37,7 +39,7 @@ (ex-message e))) -(defn- evaluate-expression-1 [context subject-handle name expression] +(defn- evaluate-expression-1* [context subject-handle name expression] (try (expr/eval context expression subject-handle) (catch Exception e @@ -54,6 +56,24 @@ (merge ex-data)))))) +(defn- timeout-millis [{:keys [timeout]}] + (.toMillis ^Duration timeout)) + + +(defn- timeout-eclipsed-msg [context] + (format "Timeout of %d millis eclipsed while evaluating." + (timeout-millis context))) + + +(defn- evaluate-expression-1 + [{:keys [timeout-eclipsed?] :as context} subject-handle name expression] + (if (timeout-eclipsed?) + {::anom/category ::anom/interrupted + ::anom/message (timeout-eclipsed-msg context) + :timeout (:timeout context)} + (evaluate-expression-1* context subject-handle name expression))) + + (defn- close-batch-db! [{:keys [db]}] (.close ^AutoCloseable db)) @@ -250,7 +270,7 @@ (stratum-combine-op context) (fn [context {:keys [subject-handle] :as handle}] (if-ok [stratum (evaluate-stratum-expression context subject-handle - name expression)] + name expression)] (update context ::result stratum-result-reduce-op stratum handle) #(reduced (assoc context ::result %)))) handles)) diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj index 3dd84f7da..2a740128c 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/measure.clj @@ -13,6 +13,7 @@ [blaze.handler.fhir.util :as fhir-util] [blaze.luid :as luid] [clojure.string :as str] + [java-time.api :as time] [prometheus.alpha :as prom] [taoensso.timbre :as log]) (:import @@ -329,14 +330,19 @@ (defn- enhance-context - [{:keys [clock db] :as context} measure {:keys [report-type subject-ref]}] - (let [subject-type (subject-type measure)] + [{:keys [clock db timeout] :as context :or {timeout (time/hours 1)}} measure + {:keys [report-type subject-ref]}] + (let [subject-type (subject-type measure) + now (now clock) + timeout-instant (time/instant (time/plus now timeout))] (when-ok [{:keys [expression-defs function-defs parameter-default-values]} (compile-primary-library db measure) subject-handle (some->> subject-ref (subject-handle db subject-type))] (cond-> (assoc context :db db - :now (now clock) + :now now + :timeout-eclipsed? #(not (.isBefore (.instant ^Clock clock) timeout-instant)) + :timeout timeout :expression-defs expression-defs :function-defs function-defs :parameters parameter-default-values diff --git a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/spec.clj b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/spec.clj index e4f43d43d..d8f3c7a3f 100644 --- a/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/spec.clj +++ b/modules/operation-measure-evaluate-measure/src/blaze/fhir/operation/evaluate_measure/spec.clj @@ -1,12 +1,22 @@ (ns blaze.fhir.operation.evaluate-measure.spec (:require [blaze.executors :as ex] - [clojure.spec.alpha :as s])) + [blaze.fhir.operation.evaluate-measure :as-alias measure] + [clojure.spec.alpha :as s] + [java-time.api :as time])) -(s/def :blaze.fhir.operation.evaluate-measure/executor +(s/def ::measure/executor ex/executor?) -(s/def :blaze.fhir.operation.evaluate-measure/num-threads +(s/def ::measure/num-threads + pos-int?) + + +(s/def ::measure/timeout + time/duration?) + + +(s/def :blaze.fhir.operation.evaluate-measure.timeout/millis nat-int?) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql/spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql/spec.clj new file mode 100644 index 000000000..b7392daa4 --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql/spec.clj @@ -0,0 +1,31 @@ +(ns blaze.fhir.operation.evaluate-measure.cql.spec + (:require + [blaze.elm.compiler :as-alias compiler] + [blaze.fhir.operation.evaluate-measure.cql :as-alias cql] + [clojure.spec.alpha :as s] + [java-time.api :as time])) + + +(s/def ::cql/now + time/offset-date-time?) + + +(s/def ::cql/timeout-eclipsed? + ifn?) + + +(s/def ::cql/timeout + time/duration?) + + +(s/def ::cql/context + (s/keys :req-un [:blaze.db/db ::cql/now ::cql/timeout-eclipsed? ::cql/timeout + ::compiler/expression-defs])) + + +(s/def ::cql/parameters + (s/map-of string? any?)) + + +(s/def ::cql/individual-context + (s/merge ::cql/context (s/keys :opt-un [::cql/parameters]))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj index 5b9e9656f..69abbd465 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_spec.clj @@ -1,43 +1,26 @@ (ns blaze.fhir.operation.evaluate-measure.cql-spec (:require [blaze.db.spec] - [blaze.elm.compiler :as-alias compiler] [blaze.elm.compiler.library-spec] [blaze.elm.expression-spec] [blaze.fhir.operation.evaluate-measure.cql :as cql] + [blaze.fhir.operation.evaluate-measure.cql.spec] [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] [blaze.fhir.operation.evaluate-measure.measure.spec] [blaze.fhir.spec] [clojure.spec.alpha :as s] - [cognitect.anomalies :as anom] - [java-time.api :as time])) - - -(s/def ::now - time/offset-date-time?) - - -(s/def ::parameters - (s/map-of string? any?)) - - -(s/def ::context - (s/keys :req-un [:blaze.db/db ::now ::compiler/expression-defs])) - - -(s/def ::individual-context - (s/keys :req-un [:blaze.db/db ::now ::compiler/expression-defs] :opt-un [::parameters])) + [cognitect.anomalies :as anom])) (s/fdef cql/evaluate-expression - :args (s/cat :context ::context :name string? :subject-type :fhir.resource/type + :args (s/cat :context ::cql/context :name string? :subject-type :fhir.resource/type :population-basis (s/alt :subject-based #{:boolean} :other :fhir.resource/type)) :ret (s/or :handles ::measure/handles :anomaly ::anom/anomaly)) (s/fdef cql/evaluate-individual-expression - :args (s/cat :context ::individual-context + :args (s/cat :context ::cql/individual-context :subject-handle :blaze.db/resource-handle :name string?) :ret (s/or :value any? @@ -45,7 +28,7 @@ (s/fdef cql/calc-strata - :args (s/cat :context ::context + :args (s/cat :context ::cql/context :expression-name string? :handles ::measure/handles) :ret (s/or :strata (s/map-of any? ::measure/handles) @@ -53,7 +36,7 @@ (s/fdef cql/calc-function-strata - :args (s/cat :context ::context + :args (s/cat :context ::cql/context :function-name string? :handles ::measure/handles) :ret (s/or :strata (s/map-of any? ::measure/handles) @@ -61,7 +44,7 @@ (s/fdef cql/calc-multi-component-strata - :args (s/cat :context ::context + :args (s/cat :context ::cql/context :expression-names (s/coll-of string?) :handles ::measure/handles) :ret (s/or :strata (s/map-of (s/coll-of any?) ::measure/handles) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index b1481882b..08a37c888 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -17,6 +17,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] + [java-time.api :as time] [juxt.iota :refer [given]] [taoensso.timbre :as log]) (:import @@ -109,6 +110,8 @@ (let [{:keys [expression-defs function-defs]} (compile-library node library)] {:db (d/db node) :now (now clock) + :timeout-eclipsed? (constantly false) + :timeout (time/seconds 42) :expression-defs expression-defs :function-defs function-defs})) @@ -200,7 +203,16 @@ (with-redefs [expr/eval (failing-eval "msg-222453")] (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) ::anom/category := ::anom/fault - ::anom/message := "Error while evaluating the expression `InInitialPopulation`: msg-222453")))))) + ::anom/message := "Error while evaluating the expression `InInitialPopulation`: msg-222453"))))) + + (testing "timeout eclipsed" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (let [context (assoc (context system library-gender) :timeout-eclipsed? (constantly true))] + (given (cql/evaluate-expression context "InInitialPopulation" "Patient" :boolean) + ::anom/category := ::anom/interrupted + ::anom/message := "Timeout of 42000 millis eclipsed while evaluating."))))) (deftest evaluate-individual-expression-test diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population/spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population/spec.clj new file mode 100644 index 000000000..4fb89d24e --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population/spec.clj @@ -0,0 +1,21 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.population.spec + (:require + [blaze.db.spec] + [blaze.fhir.operation.evaluate-measure.cql :as-alias cql] + [blaze.fhir.operation.evaluate-measure.cql.spec] + [blaze.fhir.operation.evaluate-measure.measure.population :as-alias population] + [blaze.fhir.spec.spec] + [clojure.spec.alpha :as s])) + + +(s/def ::population/subject-type + :fhir.resource/type) + + +(s/def ::population/subject-handle + :blaze.db/resource-handle) + + +(s/def ::population/context + (s/merge ::cql/context + (s/keys :req-un [(or ::population/subject-type ::population/subject-handle)]))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj index 2d321e948..92ba49bae 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/population_spec.clj @@ -1,23 +1,9 @@ (ns blaze.fhir.operation.evaluate-measure.measure.population-spec (:require - [blaze.fhir.operation.evaluate-measure.cql-spec :as cql-spec] [blaze.fhir.operation.evaluate-measure.measure.population :as population] - [blaze.fhir.spec.spec] + [blaze.fhir.operation.evaluate-measure.measure.population.spec] [clojure.spec.alpha :as s])) -(s/def ::subject-type - :fhir.resource/type) - - -(s/def ::subject-handle - :blaze.db/resource-handle) - - -(s/def ::context - (s/merge (s/keys :req-un [(or ::subject-type ::subject-handle)]) - ::cql-spec/context)) - - (s/fdef population/evaluate - :args (s/cat :context ::context :idx nat-int? :population map?)) + :args (s/cat :context ::population/context :idx nat-int? :population map?)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier/spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier/spec.clj new file mode 100644 index 000000000..07dfdd78e --- /dev/null +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier/spec.clj @@ -0,0 +1,19 @@ +(ns blaze.fhir.operation.evaluate-measure.measure.stratifier.spec + (:require + [blaze.fhir.operation.evaluate-measure.cql :as-alias cql] + [blaze.fhir.operation.evaluate-measure.cql.spec] + [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] + [blaze.fhir.operation.evaluate-measure.measure.stratifier :as-alias stratifier] + [clojure.spec.alpha :as s])) + + +(s/def ::stratifier/handles + (s/coll-of ::measure/handles)) + + +(s/def ::stratifier/evaluated-populations + (s/keys :req-un [::handles])) + + +(s/def ::stratifier/context + (s/merge ::cql/context (s/keys :req-un [::measure/report-type]))) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj index 048bad110..02bd35a41 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_spec.clj @@ -1,25 +1,14 @@ (ns blaze.fhir.operation.evaluate-measure.measure.stratifier-spec (:require [blaze.fhir.operation.evaluate-measure.cql-spec] - [blaze.fhir.operation.evaluate-measure.measure :as-alias measure] [blaze.fhir.operation.evaluate-measure.measure.spec] [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] + [blaze.fhir.operation.evaluate-measure.measure.stratifier.spec] [blaze.fhir.operation.evaluate-measure.measure.util-spec] [clojure.spec.alpha :as s])) -(s/def ::handles - (s/coll-of ::measure/handles)) - - -(s/def ::evaluated-populations - (s/keys :req-un [::handles])) - - -(s/def ::context - (s/keys :req-un [::measure/report-type])) - - (s/fdef stratifier/evaluate - :args (s/cat :context ::context :evaluated-populations ::evaluated-populations + :args (s/cat :context ::stratifier/context + :evaluated-populations ::stratifier/evaluated-populations :stratifier map?)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index 0c2781c8e..ccc104fe9 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -12,6 +12,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] + [java-time.api :as time] [juxt.iota :refer [given]]) (:import [java.time Clock OffsetDateTime])) @@ -179,6 +180,8 @@ (let [{:keys [expression-defs function-defs]} (compile-library node library)] {:db (d/db node) :now (now clock) + :timeout-eclipsed? (constantly false) + :timeout (time/seconds 42) :expression-defs expression-defs :function-defs function-defs})) @@ -310,12 +313,12 @@ (let [context (context system empty-library) evaluated-populations {:handles [[]]}] (given (stratifier/evaluate - (assoc context - :report-type "population" - :group-idx 1 - :stratifier-idx 2) - evaluated-populations - stratifier-with-missing-expression) + (assoc context + :report-type "population" + :group-idx 1 + :stratifier-idx 2) + evaluated-populations + stratifier-with-missing-expression) ::anom/category := ::anom/incorrect ::anom/message := "Missing expression." :fhir/issue := "required" @@ -329,7 +332,21 @@ evaluated-populations gender-stratifier) ::anom/category := ::anom/incorrect ::anom/message := "Missing expression with name `Gender`." - :expression-name := "Gender")))))) + :expression-name := "Gender")))) + + (testing "gender" + (with-system-data [system mem-node-system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]]] + + (let [{:keys [db] :as context} (context system library-age-gender) + evaluated-populations {:handles [(mapv handle (d/type-list db "Patient"))]}] + + (given (stratifier/evaluate (assoc context + :report-type "population" + :timeout-eclipsed? (constantly true)) + evaluated-populations gender-stratifier) + ::anom/category := ::anom/interrupted + ::anom/message := "Timeout of 42000 millis eclipsed while evaluating.")))))) (testing "two components" (testing "subject-based measure" diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index 4d9d4cb09..a020ace49 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -15,6 +15,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) @@ -257,6 +258,33 @@ :fhir/issue := "required" :fhir.issue/expression := "Measure.group[0].population[0]")))) + (testing "evaluation timeout" + (with-system-data + [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" + :content [(library-content library-gender)]}]]] + + (let [db (d/db node) + context {:clock clock :rng-fn fixed-rng-fn + :db db :timeout (time/seconds 0) + :blaze/base-url "" ::reitit/router router} + measure-id "measure-id-132321" + measure {:fhir/type :fhir/Measure :id measure-id + :library [#fhir/canonical"0"] + :group + [{:fhir/type :fhir.Measure/group + :population + [{:fhir/type :fhir.Measure.group/population + :code (population-concept "initial-population") + :criteria (cql-expression "InInitialPopulation")}]}]} + params {:period [#system/date"2000" #system/date"2020"] + :report-type "population"}] + (given (measure/evaluate-measure context measure params) + ::anom/category := ::anom/interrupted + ::anom/message := "Timeout of 0 millis eclipsed while evaluating." + :measure-id := measure-id)))) + (testing "single subject" (doseq [subject-ref ["0" ["Patient" "0"]]] (with-system-data diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index ad533d8d8..2fbb14eb5 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -14,6 +14,7 @@ [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] + [java-time.api :as time] [juxt.iota :refer [given]] [reitit.core :as reitit] [taoensso.timbre :as log]) @@ -103,6 +104,32 @@ [:explain ::s/problems 3 :val] := ::invalid))) +(deftest timeout-init-test + (testing "nil config" + (given-thrown (ig/init {::evaluate-measure/timeout nil}) + :key := ::evaluate-measure/timeout + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `map?)) + + (testing "missing config" + (given-thrown (ig/init {::evaluate-measure/timeout {}}) + :key := ::evaluate-measure/timeout + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `(fn ~'[%] (contains? ~'% :millis)))) + + (testing "invalid millis" + (given-thrown (ig/init {::evaluate-measure/timeout {:millis ::invalid}}) + :key := ::evaluate-measure/timeout + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `nat-int? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "init" + (with-system [{::evaluate-measure/keys [timeout]} + {::evaluate-measure/timeout {:millis 154912}}] + (is (= (time/millis 154912) timeout))))) + + (deftest executor-init-test (testing "nil config" (given-thrown (ig/init {::evaluate-measure/executor nil}) @@ -114,7 +141,7 @@ (given-thrown (ig/init {::evaluate-measure/executor {:num-threads ::invalid}}) :key := ::evaluate-measure/executor :reason := ::ig/build-failed-spec - [:explain ::s/problems 0 :pred] := `nat-int? + [:explain ::s/problems 0 :pred] := `pos-int? [:explain ::s/problems 0 :val] := ::invalid)) (testing "with default num-threads" diff --git a/resources/blaze.edn b/resources/blaze.edn index b696db97e..cefedce07 100644 --- a/resources/blaze.edn +++ b/resources/blaze.edn @@ -144,7 +144,11 @@ {:node #blaze/ref :blaze.db/node :executor #blaze/ref :blaze.fhir.operation.evaluate-measure/executor :clock #blaze/ref :blaze/clock - :rng-fn #blaze/ref :blaze/rng-fn} + :rng-fn #blaze/ref :blaze/rng-fn + :timeout #blaze/ref :blaze.fhir.operation.evaluate-measure/timeout} + + :blaze.fhir.operation.evaluate-measure/timeout + {:millis #blaze/cfg ["FHIR_OPERATION_EVALUATE_MEASURE_TIMEOUT" nat-int? 3600000]} :blaze.fhir.operation.evaluate-measure/executor {:num-threads #blaze/cfg ["FHIR_OPERATION_EVALUATE_MEASURE_THREADS" pos-int? 4]} From 610bee5750cabd049be7b1abbe3281c42700814c Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 26 Jan 2023 17:06:06 +0100 Subject: [PATCH 098/124] Release v0.19.0 --- .github/workflows/build.yml | 11 +++++++++-- CHANGELOG.md | 10 +++++++++- Dockerfile | 4 ++-- README.md | 6 +++--- build.clj | 2 +- docker-compose.yml | 2 +- docs/authentication/docker-compose.yml | 2 +- docs/cql-queries.md | 2 +- docs/cql-queries/blazectl.md | 2 +- docs/cql-queries/command-line.md | 2 +- docs/data-sync/docker-compose.yml | 2 +- docs/database/migration.md | 2 +- docs/deployment/distributed.md | 4 ++-- docs/deployment/distributed/docker-compose.yml | 4 ++-- docs/deployment/docker-deployment.md | 8 ++++---- docs/deployment/manual-deployment.md | 12 ++++++------ docs/performance/fhir-search/simple-code-search.sh | 2 +- docs/performance/import.sh | 2 +- modules/rest-api/src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 21 files changed, 51 insertions(+), 36 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index b20ef7a83..7207e4eb3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -204,7 +204,7 @@ jobs: uses: actions/upload-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.6-standalone.jar + path: target/blaze-*-standalone.jar - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 @@ -246,6 +246,7 @@ jobs: format: sarif output: trivy-results.sarif severity: 'CRITICAL,HIGH' + timeout: '15m0s' - name: Upload Trivy scan results to GitHub Security tab uses: github/codeql-action/upload-sarif@v2 @@ -1259,7 +1260,7 @@ jobs: uses: actions/download-artifact@v3 with: name: blaze-uberjar - path: target/blaze-0.18.6-standalone.jar + path: target - name: Download Blaze Image uses: actions/download-artifact@v3 @@ -1311,3 +1312,9 @@ jobs: push: true tags: ${{ steps.docker-meta.outputs.tags }} labels: ${{ steps.docker-meta.outputs.labels }} + + - name: Release + uses: softprops/action-gh-release@v1 + if: startsWith(github.ref, 'refs/tags/') + with: + files: target/blaze-*-standalone.jar diff --git a/CHANGELOG.md b/CHANGELOG.md index 998a9574c..81149e770 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,10 +1,18 @@ # Changelog +## v0.19.0 + +### Documentation + +* Add Evaluate Measure Timeout ([#888](https://github.com/samply/blaze/pull/888)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/38?closed=1). + ## v0.18.6 ### Documentation -* Enhance Development Docs ([#878](https://github.com/samply/blaze/issues/878)) +* Enhance Development Docs ([#878](https://github.com/samply/blaze/pull/878)) The full changelog can be found [here](https://github.com/samply/blaze/milestone/57?closed=1). diff --git a/Dockerfile b/Dockerfile index e909bc8fd..fcd1268d9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.18.6-standalone.jar /app/ +COPY target/blaze-0.19.0-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.18.6-standalone.jar"] +CMD ["java", "-jar", "blaze-0.19.0-standalone.jar"] diff --git a/README.md b/README.md index 77ab07ff7..7bc57eee6 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.18.6][5] +Latest release: [v0.19.0][5] ## Quick Start @@ -25,7 +25,7 @@ In order to run Blaze just execute the following: ```sh docker volume create blaze-data -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.19 ``` Blaze will create multiple directories inside the `blaze-data` volume on its first start and use the same directories on subsequent starts. @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 08260fb98..8af30a865 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.18.6") +(def version "0.19.0") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docker-compose.yml b/docker-compose.yml index 0861b0c04..73c08ef69 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.2' services: blaze: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/authentication/docker-compose.yml b/docs/authentication/docker-compose.yml index ce7e07cf5..6e7f3ccd0 100644 --- a/docs/authentication/docker-compose.yml +++ b/docs/authentication/docker-compose.yml @@ -11,7 +11,7 @@ services: volumes: - "../../.github/openid-auth-test/realm.json:/tmp/realm.json" blaze: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/cql-queries.md b/docs/cql-queries.md index a27272398..5e31853d8 100644 --- a/docs/cql-queries.md +++ b/docs/cql-queries.md @@ -22,7 +22,7 @@ The most accessible way to create and execute CQL queries is to use the Quality If you don't already have Blaze running, you can read about how to do it in [Deployment](deployment/README.md). If you have Docker available just run: ``` -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.19 ``` Start the Quality Reporting UI. You should see an empty measure list. diff --git a/docs/cql-queries/blazectl.md b/docs/cql-queries/blazectl.md index fa10f9f17..30f704108 100644 --- a/docs/cql-queries/blazectl.md +++ b/docs/cql-queries/blazectl.md @@ -20,7 +20,7 @@ cd blaze If you don't already have Blaze running, you can read about how to do it in [Deployment](../deployment/README.md). If you have Docker available just run: ```sh -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.19 ``` ## Import some data diff --git a/docs/cql-queries/command-line.md b/docs/cql-queries/command-line.md index 2c0de785d..defedcdfd 100644 --- a/docs/cql-queries/command-line.md +++ b/docs/cql-queries/command-line.md @@ -16,7 +16,7 @@ cd blaze If you don't already have Blaze running, you can read about how to do it in [Deployment](../deployment/README.md). If you have Docker available just run: ```sh -docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +docker run -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.19 ``` ## Import some data diff --git a/docs/data-sync/docker-compose.yml b/docs/data-sync/docker-compose.yml index c2db92559..43cc90c39 100644 --- a/docs/data-sync/docker-compose.yml +++ b/docs/data-sync/docker-compose.yml @@ -1,7 +1,7 @@ version: '3.2' services: blaze: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/database/migration.md b/docs/database/migration.md index 6d9920cf6..240323b8e 100644 --- a/docs/database/migration.md +++ b/docs/database/migration.md @@ -22,7 +22,7 @@ backup of all the data Blaze has written to disk, **plan for a downtime**, delet Please start Blaze with a shell assuming that you use the volume `blaze-data`: ```sh -docker run -it -v blaze-data:/app/data samply/blaze:0.18 sh +docker run -it -v blaze-data:/app/data samply/blaze:0.19 sh ``` in that shell, go into `/app/data` and list all directories: diff --git a/docs/deployment/distributed.md b/docs/deployment/distributed.md index 01623ef02..3f73e4f49 100644 --- a/docs/deployment/distributed.md +++ b/docs/deployment/distributed.md @@ -172,7 +172,7 @@ docker-compose exec cassandra-1 cqlsh -u cassandra -p cassandra ```yaml blaze-1: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" hostname: "blaze-1" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" @@ -202,7 +202,7 @@ blaze-1: - cassandra-3 blaze-2: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" hostname: "blaze-2" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/deployment/distributed/docker-compose.yml b/docs/deployment/distributed/docker-compose.yml index f84d95b44..ffd043d23 100644 --- a/docs/deployment/distributed/docker-compose.yml +++ b/docs/deployment/distributed/docker-compose.yml @@ -72,7 +72,7 @@ services: HEAP_NEWSIZE: "200M" blaze-1: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" hostname: "blaze-1" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" @@ -102,7 +102,7 @@ services: - cassandra-3 blaze-2: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" hostname: "blaze-2" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index d65b812c1..71566773b 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -11,7 +11,7 @@ docker volume create blaze-data ## Blaze ```sh -docker run -d --name blaze -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.18 +docker run -d --name blaze -p 8080:8080 -v blaze-data:/app/data samply/blaze:0.19 ``` Blaze should log something like this: @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.6 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.0 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.6" + "version": "0.19.0" } ``` @@ -61,7 +61,7 @@ A Docker Compose file looks like this: version: '3.2' services: blaze: - image: "samply/blaze:0.18" + image: "samply/blaze:0.19" environment: BASE_URL: "http://localhost:8080" JAVA_TOOL_OPTIONS: "-Xmx2g" diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 8c19d71a3..647a7041a 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.18.6). Look for `blaze-0.18.6-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.0). Look for `blaze-0.19.0-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.18.6-standalone.jar +java -jar blaze-0.19.0-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.18.6-standalone.jar +STORAGE=standalone java -jar blaze-0.19.0-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.18.6-standalone.jar +java -jar blaze-0.19.0-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.18.6 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.0 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.18.6" + "version": "0.19.0" } ``` diff --git a/docs/performance/fhir-search/simple-code-search.sh b/docs/performance/fhir-search/simple-code-search.sh index 9f51c4d69..689ea05f3 100644 --- a/docs/performance/fhir-search/simple-code-search.sh +++ b/docs/performance/fhir-search/simple-code-search.sh @@ -19,7 +19,7 @@ start-blaze() { -e DB_RESOURCE_INDEXER_THREADS=16 \ -p 8080:8080 \ -p 8081:8081 \ - -d samply/blaze:0.18 + -d samply/blaze:0.19 ../../.github/scripts/wait-for-url.sh http://localhost:8080/health echo "Finished" diff --git a/docs/performance/import.sh b/docs/performance/import.sh index 7d6db519f..8526ffca2 100644 --- a/docs/performance/import.sh +++ b/docs/performance/import.sh @@ -12,7 +12,7 @@ import-once() { -e DB_RESOURCE_INDEXER_THREADS=16 \ -p 8080:8080 \ -p 8081:8081 \ - -d samply/blaze:0.18 + -d samply/blaze:0.19 ../../.github/scripts/wait-for-url.sh http://localhost:8080/health diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 7d5b832b5..11ab9dce5 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2023-01-24" + :date #fhir/dateTime"2023-01-26" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2023-01-24"} + :releaseDate #fhir/dateTime"2023-01-26"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 9ff7f4f39..a2bd285fc 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.18.6 + 0.19.0 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index ab457fb16..b6d67701c 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.18.6" + {:blaze/version "0.19.0" :blaze/clock {} From 00eff9f60aa0f93c3d74afe8214223ac8b61e897 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 31 Jan 2023 10:58:57 +0100 Subject: [PATCH 099/124] Fix Two Typos --- CHANGELOG.md | 2 +- modules/fhir-client/src/blaze/fhir_client.clj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81149e770..03e2011f0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,7 @@ ## v0.19.0 -### Documentation +### New Features * Add Evaluate Measure Timeout ([#888](https://github.com/samply/blaze/pull/888)) diff --git a/modules/fhir-client/src/blaze/fhir_client.clj b/modules/fhir-client/src/blaze/fhir_client.clj index 850aea6b4..c08bec00c 100644 --- a/modules/fhir-client/src/blaze/fhir_client.clj +++ b/modules/fhir-client/src/blaze/fhir_client.clj @@ -71,7 +71,7 @@ (defn search-type - "Returns a CompletableFuture that completes with all resource of `type` in + "Returns a CompletableFuture that completes with all resources of `type` in case of success or completes exceptionally with an anomaly in case of an error." [base-uri type & [opts]] From 1fba10bd5cf1d3303a3b73de31d1714b2c80a206 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 31 Jan 2023 11:03:42 +0100 Subject: [PATCH 100/124] Code Cosmetics --- modules/db/src/blaze/db/spec.clj | 6 +----- modules/db/test/blaze/db/node_test.clj | 3 ++- modules/executor/src/blaze/executors_spec.clj | 3 ++- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/modules/db/src/blaze/db/spec.clj b/modules/db/src/blaze/db/spec.clj index 3c63b8db6..c83ab4448 100644 --- a/modules/db/src/blaze/db/spec.clj +++ b/modules/db/src/blaze/db/spec.clj @@ -11,12 +11,8 @@ [com.github.benmanes.caffeine.cache Cache LoadingCache])) -(defn node? [x] - (satisfies? np/Node x)) - - (s/def :blaze.db/node - node?) + #(satisfies? np/Node %)) (s/def :blaze.db/resource-handle-cache diff --git a/modules/db/test/blaze/db/node_test.clj b/modules/db/test/blaze/db/node_test.clj index 5bd5a9b89..5ec874b4c 100644 --- a/modules/db/test/blaze/db/node_test.clj +++ b/modules/db/test/blaze/db/node_test.clj @@ -33,7 +33,8 @@ [integrant.core :as ig] [juxt.iota :refer [given]] [taoensso.timbre :as log]) - (:import [java.time Instant])) + (:import + [java.time Instant])) (set! *warn-on-reflection* true) diff --git a/modules/executor/src/blaze/executors_spec.clj b/modules/executor/src/blaze/executors_spec.clj index 013cb5a6d..2dee41341 100644 --- a/modules/executor/src/blaze/executors_spec.clj +++ b/modules/executor/src/blaze/executors_spec.clj @@ -2,7 +2,8 @@ (:require [blaze.executors :as ex] [clojure.spec.alpha :as s]) - (:import [java.util.concurrent TimeUnit])) + (:import + [java.util.concurrent TimeUnit])) (s/fdef ex/executor? From 3b3e2c6bdc2629c02d357cde5825e001f1aaab43 Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 31 Jan 2023 12:13:40 +0100 Subject: [PATCH 101/124] Implement CQL list operator Times --- .../src/blaze/elm/compiler/list_operators.clj | 11 +++- modules/cql/src/blaze/elm/normalizer.clj | 4 ++ modules/cql/src/blaze/elm/spec.clj | 4 ++ .../elm/compiler/list_operators_test.clj | 51 ++++++++++++++++++- modules/cql/test/blaze/elm/literal.clj | 2 +- modules/cql/test/blaze/elm/literal_spec.clj | 2 +- 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/modules/cql/src/blaze/elm/compiler/list_operators.clj b/modules/cql/src/blaze/elm/compiler/list_operators.clj index 1c53c2901..6a633d36e 100644 --- a/modules/cql/src/blaze/elm/compiler/list_operators.clj +++ b/modules/cql/src/blaze/elm/compiler/list_operators.clj @@ -7,7 +7,7 @@ [blaze.anomaly :as ba] [blaze.coll.core :as coll] [blaze.elm.compiler.core :as core] - [blaze.elm.compiler.macros :refer [defunop]] + [blaze.elm.compiler.macros :refer [defbinop defunop]] [blaze.elm.compiler.queries :as queries] [blaze.elm.protocols :as p] [cognitect.anomalies :as anom]) @@ -220,3 +220,12 @@ (->SortByDirectionExpression source (queries/comparator direction)))) source sort-by-items))) + + +;; 20.28. Times +(defbinop times [list1 list2] + (transduce + (mapcat #(eduction (map (partial merge %)) list1)) + (completing (fnil conj [])) + nil + list2)) diff --git a/modules/cql/src/blaze/elm/normalizer.clj b/modules/cql/src/blaze/elm/normalizer.clj index fa1656c91..922216a81 100644 --- a/modules/cql/src/blaze/elm/normalizer.clj +++ b/modules/cql/src/blaze/elm/normalizer.clj @@ -407,6 +407,10 @@ (derive :elm.normalizer.type/singleton-from :elm.normalizer.type/unary-expression) +;; 20.28. Times +(derive :elm.normalizer.type/times :elm.normalizer.type/binary-expression) + + ;; 22. Type Operators diff --git a/modules/cql/src/blaze/elm/spec.clj b/modules/cql/src/blaze/elm/spec.clj index 8047492fc..82f25401b 100644 --- a/modules/cql/src/blaze/elm/spec.clj +++ b/modules/cql/src/blaze/elm/spec.clj @@ -1672,6 +1672,10 @@ (s/keys :req-un [:elm.sort/by])) +;; 20.28. Times +(derive :elm.spec.type/times :elm.spec.type/binary-expression) + + ;; 21. Aggregate Operators diff --git a/modules/cql/test/blaze/elm/compiler/list_operators_test.clj b/modules/cql/test/blaze/elm/compiler/list_operators_test.clj index 17fb8db9f..73ca2b0b6 100644 --- a/modules/cql/test/blaze/elm/compiler/list_operators_test.clj +++ b/modules/cql/test/blaze/elm/compiler/list_operators_test.clj @@ -399,8 +399,55 @@ ;; component derived from the pairing of the source tuples. ;; ;; If either argument is null, the result is null. -;; -;; TODO: not implemented +(deftest compile-times-test + (are [x y res] (= res (tu/compile-binop elm/times elm/list x y)) + [#elm/tuple{"id" #elm/integer "1"}] [#elm/tuple{"name" #elm/string "john"}] + [{:id 1 :name "john"}] + + [#elm/tuple{"id" #elm/integer "1"} + #elm/tuple{"id" #elm/integer "2"}] + [#elm/tuple{"name" #elm/string "john"} + #elm/tuple{"name" #elm/string "hans"}] + [{:id 1 :name "john"} + {:id 2 :name "john"} + {:id 1 :name "hans"} + {:id 2 :name "hans"}] + + [#elm/tuple{"id" #elm/integer "1"} + #elm/tuple{"id" #elm/integer "2"} + #elm/tuple{"id" #elm/integer "3"}] + [#elm/tuple{"name" #elm/string "john"} + #elm/tuple{"name" #elm/string "hans"} + #elm/tuple{"name" #elm/string "tim"}] + [{:id 1 :name "john"} {:id 2 :name "john"} {:id 3 :name "john"} + {:id 1 :name "hans"} {:id 2 :name "hans"} {:id 3 :name "hans"} + {:id 1 :name "tim"} {:id 2 :name "tim"} {:id 3 :name "tim"}] + + [#elm/tuple{"id" #elm/integer "1"} + #elm/tuple{"id" #elm/integer "2"}] + [#elm/tuple{"given-name" #elm/string "john" + "family-name" #elm/string "doe"} + #elm/tuple{"given-name" #elm/string "hans" + "family-name" #elm/string "zimmer"}] + [{:id 1 :given-name "john" :family-name "doe"} + {:id 2 :given-name "john" :family-name "doe"} + {:id 1 :given-name "hans" :family-name "zimmer"} + {:id 2 :given-name "hans" :family-name "zimmer"}] + + [#elm/tuple{"id" #elm/integer "1" + "name" #elm/string "john"} + #elm/tuple{"id" #elm/integer "2" + "name" #elm/string "hans"}] + [#elm/tuple{"location" #elm/string "Frankfurt"} + #elm/tuple{"location" #elm/string "Berlin"}] + [{:id 1 :name "john" :location "Frankfurt"} + {:id 2 :name "hans" :location "Frankfurt"} + {:id 1 :name "john" :location "Berlin"} + {:id 2 :name "hans" :location "Berlin"}]) + + (tu/testing-binary-null elm/times #elm/list[#elm/tuple{"name" #elm/string "hans"}]) + + (tu/testing-binary-form elm/times)) ;; 20.29. Union diff --git a/modules/cql/test/blaze/elm/literal.clj b/modules/cql/test/blaze/elm/literal.clj index 92d96add0..647db0c35 100644 --- a/modules/cql/test/blaze/elm/literal.clj +++ b/modules/cql/test/blaze/elm/literal.clj @@ -741,7 +741,7 @@ ;; 20.28. Times (defn times [lists] - {:type "SingletonFrom" :operand lists}) + {:type "Times" :operand lists}) ;; 21.1. AllTrue diff --git a/modules/cql/test/blaze/elm/literal_spec.clj b/modules/cql/test/blaze/elm/literal_spec.clj index 2bd9ac301..b52d04117 100644 --- a/modules/cql/test/blaze/elm/literal_spec.clj +++ b/modules/cql/test/blaze/elm/literal_spec.clj @@ -344,7 +344,7 @@ :ret :elm/expression) -;; 19.13. Except +;; 19.10. Except (s/fdef elm/except :args (s/cat :ops (s/tuple :elm/expression :elm/expression)) :ret :elm/expression) From a8921164af860c0f9b14cabf11a734a2d3d308b4 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Tue, 31 Jan 2023 18:11:51 +0100 Subject: [PATCH 102/124] Wait at Maximum Two Minutes for Services in Tests --- .github/scripts/wait-for-url.sh | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.github/scripts/wait-for-url.sh b/.github/scripts/wait-for-url.sh index 672af8fc8..cd9072c55 100755 --- a/.github/scripts/wait-for-url.sh +++ b/.github/scripts/wait-for-url.sh @@ -1,5 +1,14 @@ #!/bin/bash -e URL=$1 +START_EPOCH="$(date +"%s")" -while [[ "$(curl -s -o /dev/null -w ''%{http_code}'' $URL)" != "200" ]]; do sleep 2; done +eclipsed() { + EPOCH="$(date +"%s")" + echo $((EPOCH - START_EPOCH)) +} + +# wait at maximum 120 seconds +while [[ ($(eclipsed) -lt 120) && ("$(curl -s -o /dev/null -w ''%{http_code}'' "$URL")" != "200") ]]; do + sleep 2 +done From 0ed41ef7c88263a48ea4dd8f713237690bf0b38d Mon Sep 17 00:00:00 2001 From: marlenaMyr Date: Tue, 31 Jan 2023 17:30:10 +0100 Subject: [PATCH 103/124] CQL add documentation --- docs/conformance/cql.md | 44 +++++++++++-------- .../cql/src/blaze/elm/compiler/queries.clj | 11 ----- .../test/blaze/elm/compiler/library_test.clj | 36 +++++++++++++++ .../test/blaze/elm/compiler/queries_test.clj | 15 ++++++- .../blaze/elm/compiler/simple_values_test.clj | 3 ++ 5 files changed, 79 insertions(+), 30 deletions(-) diff --git a/docs/conformance/cql.md b/docs/conformance/cql.md index 5c655dd70..2e0885206 100644 --- a/docs/conformance/cql.md +++ b/docs/conformance/cql.md @@ -53,6 +53,8 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 5.1. | Library | ✓ | | | | 5.2. | IncludeDef | ! | no custom includes, only FHIRHelpers | | | 5.3. | VersionedIdentifier | ✗ | | | +| 5.4. | ContextDef | ✗ | | | + ### 6. Data Model @@ -87,6 +89,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 9.2. | ExpressionRef | ! | only inside same library | | | 9.3. | FunctionDef | ✓ | | | | 9.4. | FunctionRef | ! | hard coded implementation of some functions | | +| 9.5. | OperandRef | ✓ | | | ### 10. Queries @@ -98,19 +101,22 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 10.4. | ByColumn | ✓ | | | | 10.5. | ByDirection | ✓ | | | | 10.6. | ByExpression | ✓ | | | -| 10.7. | LetClause | ✗ | | | -| 10.8. | QueryLetRef | ✗ | | | -| 10.9. | RelationshipClause | ✓ | | | -| 10.10. | ReturnClause | ! | always distinct | | -| 10.11. | SortClause | ✓ | | | -| 10.12. | With | ! | only equiv version | | -| 10.13. | Without | ✗ | | | +| 10.7. | IdentifierRef | ✓ | | | +| 10.8. | LetClause | ✗ | | | +| 10.9. | QueryLetRef | ✗ | | | +| 10.10. | RelationshipClause | ✓ | | | +| 10.11. | ReturnClause | ! | always distinct | | +| 10.12. | AggregateClause | ✗ | | | +| 10.13. | SortClause | ✓ | | | +| 10.14. | With | ! | only equiv version | | +| 10.15. | Without | ✗ | | | ### 11. External Data -| Num | Group | Expression | State | Notes | -|-------|----------|------------|----------------|-------| -| 11.1. | Retrieve | ! | no date ranges | | +| Num | Group | Expression | State | Notes | +|-------|----------------|------------|----------------|-------| +| 11.1. | Retrieve | ! | no date ranges | | +| 11.2. | IncludeElement | ✗ | | | ### 12. Comparison Operators @@ -176,7 +182,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 16.19. | Round | ✓ | | 16.20. | Subtract | ✓ | | 16.21. | Successor | ✓ | -| 16.12. | Truncate | ✓ | +| 16.22. | Truncate | ✓ | | 16.23. | TruncatedDivide | ✓ | ### 17. String Operators @@ -260,10 +266,11 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 19.25. | ProperIn | ✓ | | 19.26. | ProperIncludes | ✓ | | 19.27. | ProperIncludedIn | ✓ | -| 19.28. | Start | ✓ | -| 19.29. | Starts | ✓ | +| 19.28. | Size | ✗ | +| 19.29. | Start | ✓ | +| 19.30. | Starts | ✓ | | 19.31. | Union | ✓ | -| 19.31. | Width | ✓ | +| 19.32. | Width | ✓ | ### 20. List Operators @@ -296,7 +303,7 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 20.25. | SingletonFrom | ✓ | | | | 20.26. | Slice | ✓ | | | | 20.27. | Sort | ✓ | | | -| 20.28. | Times | ✗ | | | +| 20.28. | Times | ✓ | | | | 20.29. | Union | ✓ | | | ### 21. Aggregate Operators @@ -367,9 +374,10 @@ The section numbers refer to the documentation of the [ELM Specification](https: | 23.6. | Equivalent | ✗ | | 23.7. | InCodeSystem | ✗ | | 23.8. | InValueSet | ✗ | -| 23.9. | Not Equal | ✓ | -| 23.10. | SubsumedBy | ✗ | -| 23.11. | Subsumes | ✗ | +| 23.9. | ExpandValueSet | ✗ | +| 23.10. | Not Equal | ✓ | +| 23.11. | SubsumedBy | ✗ | +| 23.12. | Subsumes | ✗ | ### 24. Errors and Messages diff --git a/modules/cql/src/blaze/elm/compiler/queries.clj b/modules/cql/src/blaze/elm/compiler/queries.clj index dfba49f1e..7dd8203b6 100644 --- a/modules/cql/src/blaze/elm/compiler/queries.clj +++ b/modules/cql/src/blaze/elm/compiler/queries.clj @@ -239,10 +239,6 @@ ;; 10.1. Query -;; -;; The Query operator represents a clause-based query. The result of the query -;; is determined by the type of sources included, as well as the clauses used in -;; the query. (defmulti compile-sort-by-item (fn [_ {:keys [type]}] type)) @@ -304,9 +300,6 @@ ;; 10.3. AliasRef -;; -;; The AliasRef expression allows for the reference of a specific source within -;; the context of a query. (defrecord AliasRefExpression [key] core/Expression (-eval [_ _ _ scopes] @@ -327,10 +320,6 @@ ;; 10.14. With -;; -;; The With clause restricts the elements of a given source to only those -;; elements that have elements in the related source that satisfy the suchThat -;; condition. This operation is known as a semi-join in database languages. (defn- find-operand-with-alias "Finds the operand in `expression` that accesses entities with `alias`." [operands alias] diff --git a/modules/cql/test/blaze/elm/compiler/library_test.clj b/modules/cql/test/blaze/elm/compiler/library_test.clj index fc2cb5bc8..fa5cfc675 100644 --- a/modules/cql/test/blaze/elm/compiler/library_test.clj +++ b/modules/cql/test/blaze/elm/compiler/library_test.clj @@ -25,6 +25,42 @@ (test/use-fixtures :each fixture) +;; 5.1. Library +;; +;; 1. The identifier element defines a unique identifier for this library, and +;; optionally, a system (or namespace) and version. +;; +;; 2. This is the identifier of the XML schema (and its version) which governs +;; the structure of this Library. +;; +;; 3. Set of data models referenced in the Expression objects in this knowledge +;; artifact. +;; +;; 4. A reference to a data model that is used in the artifact, e.g., the Virtual +;; Medical Record. +;; +;; 5. Set of libraries referenced by this artifact. Components of referenced +;; libraries may be used within this artifact. +;; +;; 6. A reference to a library whose components can be used within the +;; artifact. +;; +;; 7. The parameters defined within this library. +;; +;; 8. The code systems defined within this library. +;; +;; 9. The value sets defined within this library. +;; +;; 10. The codes defined within this library. +;; +;; 11. The concepts defined within this library. +;; +;; 12. The contexts used within this library. +;; +;; 13. The statements section contains the expression and function definitions +;; for the library. +;; +;; A Library is an instance of a CQL-ELM library. (deftest compile-library-test (testing "empty library" (let [library (t/translate "library Test")] diff --git a/modules/cql/test/blaze/elm/compiler/queries_test.clj b/modules/cql/test/blaze/elm/compiler/queries_test.clj index 5843e623a..e2f2e5937 100644 --- a/modules/cql/test/blaze/elm/compiler/queries_test.clj +++ b/modules/cql/test/blaze/elm/compiler/queries_test.clj @@ -233,6 +233,9 @@ ;; 10.3. AliasRef +;; +;; The AliasRef expression allows for the reference of a specific source within +;; the scope of a query. (deftest compile-alias-ref-test (let [expr (c/compile {} {:type "AliasRef" :name "foo"})] (testing "eval" @@ -242,7 +245,7 @@ (is (= '(alias-ref foo) (core/-form expr)))))) -;; 10.7 IdentifierRef +;; 10.7. IdentifierRef ;; ;; The IdentifierRef type defines an expression that references an identifier ;; that is either unresolved, or has been resolved to an attribute in an @@ -256,7 +259,17 @@ (is (= '(:foo default) (core/-form expr)))))) +;; TODO 10.9. QueryLetRef +;; +;; The QueryLetRef expression allows for the reference of a specific let +;; definition within the scope of a query. + + ;; 10.14. With +;; +;; The With clause restricts the elements of a given source to only those +;; elements that have elements in the related source that satisfy the suchThat +;; condition. This operation is known as a semi-join in database languages. (deftest compile-with-clause-test (testing "Equiv With with two Observations comparing there subjects." (with-system-data [{:blaze.db/keys [node]} mem-node-system] diff --git a/modules/cql/test/blaze/elm/compiler/simple_values_test.clj b/modules/cql/test/blaze/elm/compiler/simple_values_test.clj index 06b57b343..59c3feac8 100644 --- a/modules/cql/test/blaze/elm/compiler/simple_values_test.clj +++ b/modules/cql/test/blaze/elm/compiler/simple_values_test.clj @@ -31,6 +31,9 @@ ;; 1.1 Literal +;; +;; The Literal type defines a single scalar value. For example, the literal 5, +;; the boolean value true or the string "antithrombotic". (deftest compile-literal-test (testing "Boolean Literal" (are [elm res] (= res (c/compile {} elm)) From 2a2c066339220d8393b0836a789cf66e9c0dde61 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 3 Feb 2023 10:27:57 +0100 Subject: [PATCH 104/124] Cleanup RocksDB Database Options Handling The database options should not be closed after creating the database and there is no need to close them after the database is closed, because they are GC'ed automatically. --- modules/rocksdb/src/blaze/db/kv/rocksdb.clj | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/modules/rocksdb/src/blaze/db/kv/rocksdb.clj b/modules/rocksdb/src/blaze/db/kv/rocksdb.clj index 397c08912..c1bcec3bb 100644 --- a/modules/rocksdb/src/blaze/db/kv/rocksdb.clj +++ b/modules/rocksdb/src/blaze/db/kv/rocksdb.clj @@ -12,7 +12,7 @@ [java.nio ByteBuffer] [java.util ArrayList] [org.rocksdb - RocksDB RocksIterator WriteOptions WriteBatch Options ColumnFamilyHandle + RocksDB RocksIterator WriteOptions WriteBatch ColumnFamilyHandle Statistics LRUCache CompactRangeOptions Snapshot ReadOptions StatsLevel Env Priority])) @@ -96,7 +96,7 @@ (-get-property store column-family name))) -(deftype RocksKvStore [^RocksDB db ^Options opts ^WriteOptions write-opts cfhs] +(deftype RocksKvStore [^RocksDB db ^WriteOptions write-opts cfhs] kv/KvStore (-new-snapshot [_] (let [snapshot (.getSnapshot db)] @@ -146,7 +146,6 @@ AutoCloseable (close [_] (.close db) - (.close opts) (.close write-opts))) @@ -207,15 +206,12 @@ (defmethod ig/init-key ::kv/rocksdb [_ {:keys [dir block-cache stats opts column-families]}] (log/info (init-log-msg dir opts)) - (let [db-options (impl/db-options stats opts) - cfds (map + (let [cfds (map (partial impl/column-family-descriptor block-cache) (merge {:default nil} column-families)) cfhs (ArrayList.) - db (try - (RocksDB/open db-options dir cfds cfhs) - (finally (.close db-options)))] - (->RocksKvStore db db-options (impl/write-options opts) + db (RocksDB/open (impl/db-options stats opts) dir cfds cfhs)] + (->RocksKvStore db (impl/write-options opts) (index-column-family-handles cfhs)))) From ea6cb7f56bd1c851e1fe4b3985763d58fda7eb75 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 6 Feb 2023 17:07:41 +0100 Subject: [PATCH 105/124] Update Dependencies --- .github/workflows/build.yml | 4 ++-- deps.edn | 4 ++-- modules/byte-string/deps.edn | 2 +- modules/cassandra/deps.edn | 2 +- modules/cql/deps.edn | 12 ++++++------ modules/fhir-path/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/http-client/deps.edn | 4 ++-- modules/metrics/deps.edn | 2 +- 9 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7207e4eb3..e0f751e89 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -210,7 +210,7 @@ jobs: uses: docker/setup-buildx-action@v2 - name: Build and Export to Docker - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . tags: blaze:latest @@ -1305,7 +1305,7 @@ jobs: type=semver,pattern={{major}}.{{minor}} - name: Build and push - uses: docker/build-push-action@v3 + uses: docker/build-push-action@v4 with: context: . platforms: linux/amd64,linux/arm64 diff --git a/deps.edn b/deps.edn index 69b45eec3..07701d826 100644 --- a/deps.edn +++ b/deps.edn @@ -47,7 +47,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.2" :git/sha "fe6b140"}} + {:git/tag "v0.9.3" :git/sha "e537cd1"}} :ns-default build} :test @@ -80,7 +80,7 @@ :outdated {:replace-deps {com.github.liquidz/antq - {:mvn/version "2.2.970"} + {:mvn/version "2.2.992"} org.slf4j/slf4j-nop {:mvn/version "2.0.6"}} diff --git a/modules/byte-string/deps.edn b/modules/byte-string/deps.edn index d66b1cc74..12187e474 100644 --- a/modules/byte-string/deps.edn +++ b/modules/byte-string/deps.edn @@ -8,4 +8,4 @@ {:mvn/version "3.21.12"} com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.14.1"}}} + {:mvn/version "2.14.2"}}} diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index dce2ab4c0..5d7c93793 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -7,7 +7,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core com.fasterxml.jackson.core/jackson-databind - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index 7115326b5..bc7543554 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -5,23 +5,23 @@ {:local/root "../db"} com.fasterxml.jackson.module/jackson-module-jaxb-annotations - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} com.fasterxml.jackson.dataformat/jackson-dataformat-xml - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} info.cqframework/cql-to-elm - {:mvn/version "2.4.0" + {:mvn/version "2.5.0" :exclusions [xpp3/xpp3_xpath]} info.cqframework/elm-jackson - {:mvn/version "2.4.0"} + {:mvn/version "2.5.0"} info.cqframework/model-jackson - {:mvn/version "2.4.0"} + {:mvn/version "2.5.0"} info.cqframework/quick - {:mvn/version "2.4.0"} + {:mvn/version "2.5.0"} org.apache.commons/commons-text {:mvn/version "1.10.0"} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index 6bc99d8c9..a5b8725d4 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-structure"} info.cqframework/cql - {:mvn/version "2.4.0"}} + {:mvn/version "2.5.0"}} :aliases {:test diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 1943d901d..7b86f2e32 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -20,7 +20,7 @@ {:mvn/version "31.1-jre"} com.fasterxml.jackson.dataformat/jackson-dataformat-cbor - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} com.taoensso/timbre {:mvn/version "5.2.1"} diff --git a/modules/http-client/deps.edn b/modules/http-client/deps.edn index 53a715f15..14099381a 100644 --- a/modules/http-client/deps.edn +++ b/modules/http-client/deps.edn @@ -8,10 +8,10 @@ [com.fasterxml.jackson.dataformat/jackson-dataformat-cbor]} com.fasterxml.jackson.core/jackson-core - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} com.fasterxml.jackson.dataformat/jackson-dataformat-smile - {:mvn/version "2.14.1"} + {:mvn/version "2.14.2"} hato/hato {:mvn/version "0.9.0"}} diff --git a/modules/metrics/deps.edn b/modules/metrics/deps.edn index 134246821..951f821df 100644 --- a/modules/metrics/deps.edn +++ b/modules/metrics/deps.edn @@ -16,7 +16,7 @@ {:build {:deps {io.github.clojure/tools.build - {:git/tag "v0.9.2" :git/sha "fe6b140"}} + {:git/tag "v0.9.3" :git/sha "e537cd1"}} :ns-default build} :test From f769481930d0eb93cee54bc2ebd2d8e2d8366a9a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 9 Feb 2023 11:23:54 +0100 Subject: [PATCH 106/124] Update Dependencies --- modules/db-tx-log-kafka/deps.edn | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/db-tx-log-kafka/deps.edn b/modules/db-tx-log-kafka/deps.edn index ab4a3e017..9a58cef2e 100644 --- a/modules/db-tx-log-kafka/deps.edn +++ b/modules/db-tx-log-kafka/deps.edn @@ -15,7 +15,7 @@ {:local/root "../module-base"} org.apache.kafka/kafka-clients - {:mvn/version "3.3.2"}} + {:mvn/version "3.4.0"}} :aliases {:test From d44780de71e60cbe7ed96419e03f43c90330c7b8 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 9 Feb 2023 15:59:22 +0100 Subject: [PATCH 107/124] Release v0.19.1 --- CHANGELOG.md | 9 +++++++++ Dockerfile | 4 ++-- README.md | 4 ++-- build.clj | 2 +- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/cql/src/blaze/cql_translator_spec.clj | 2 +- modules/rest-api/src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 10 files changed, 27 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 03e2011f0..ad1f6c805 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## v0.19.1 + +### Security + +* Update Dependencies ([#898](https://github.com/samply/blaze/pull/898)) +* Update Dependencies ([#899](https://github.com/samply/blaze/pull/899)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/58?closed=1). + ## v0.19.0 ### New Features diff --git a/Dockerfile b/Dockerfile index fcd1268d9..dea069b8c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.19.0-standalone.jar /app/ +COPY target/blaze-0.19.1-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.19.0-standalone.jar"] +CMD ["java", "-jar", "blaze-0.19.1-standalone.jar"] diff --git a/README.md b/README.md index 7bc57eee6..be49f392b 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.19.0][5] +Latest release: [v0.19.1][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 8af30a865..06314591d 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.19.0") +(def version "0.19.1") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 71566773b..2872c7be5 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.0 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.1 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.0" + "version": "0.19.1" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 647a7041a..0c7df6438 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.0). Look for `blaze-0.19.0-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.1). Look for `blaze-0.19.1-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.19.0-standalone.jar +java -jar blaze-0.19.1-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.19.0-standalone.jar +STORAGE=standalone java -jar blaze-0.19.1-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.19.0-standalone.jar +java -jar blaze-0.19.1-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.0 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.1 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.0" + "version": "0.19.1" } ``` diff --git a/modules/cql/src/blaze/cql_translator_spec.clj b/modules/cql/src/blaze/cql_translator_spec.clj index a4f3c4193..30546b3c5 100644 --- a/modules/cql/src/blaze/cql_translator_spec.clj +++ b/modules/cql/src/blaze/cql_translator_spec.clj @@ -8,5 +8,5 @@ (s/fdef cql-translator/translate - :args (s/cat :cql string? :opts (s/* some?)) + :args (s/cat :cql string?) :ret (s/or :library :elm/library :anomaly ::anom/anomaly)) diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 11ab9dce5..6df6682ac 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2023-01-26" + :date #fhir/dateTime"2023-02-09" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2023-01-26"} + :releaseDate #fhir/dateTime"2023-02-09"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index a2bd285fc..6c169f5d9 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.19.0 + 0.19.1 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index b6d67701c..5461122a2 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.19.0" + {:blaze/version "0.19.1" :blaze/clock {} From 946e35d6386dc5f5751702808b9d2cfc3ce53bd0 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 10 Feb 2023 14:16:11 +0100 Subject: [PATCH 108/124] Refactor Database Node Init Tests --- .../src/blaze/db/resource_store/spec.clj | 6 +- .../db-tx-log/src/blaze/db/tx_log/spec.clj | 12 ++- .../blaze/db/search_param_registry/spec.clj | 6 +- modules/db/src/blaze/db/spec.clj | 12 ++- .../blaze/db/node/resource_indexer_test.clj | 7 +- modules/db/test/blaze/db/node_test.clj | 81 ++++++++++++++----- .../db/test/blaze/db/resource_cache_test.clj | 3 +- .../blaze/db/search_param_registry_test.clj | 4 +- .../fhir/structure_definition_repo/spec.clj | 6 +- 9 files changed, 102 insertions(+), 35 deletions(-) diff --git a/modules/db-resource-store/src/blaze/db/resource_store/spec.clj b/modules/db-resource-store/src/blaze/db/resource_store/spec.clj index e3b969e8d..edcae1f4d 100644 --- a/modules/db-resource-store/src/blaze/db/resource_store/spec.clj +++ b/modules/db-resource-store/src/blaze/db/resource_store/spec.clj @@ -5,5 +5,9 @@ [clojure.spec.alpha :as s])) +(defn resource-store? [x] + (satisfies? rs/ResourceStore x)) + + (s/def :blaze.db/resource-store - #(satisfies? rs/ResourceStore %)) + resource-store?) diff --git a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj index 9a8622e5f..a8b56e74e 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj @@ -7,12 +7,20 @@ [clojure.spec.alpha :as s])) +(defn tx-log? [x] + (satisfies? tx-log/TxLog x)) + + (s/def :blaze.db/tx-log - #(satisfies? tx-log/TxLog %)) + tx-log?) + + +(defn queue? [x] + (satisfies? tx-log/Queue x)) (s/def :blaze.db.tx-log/queue - #(satisfies? tx-log/Queue %)) + queue?) (s/def :blaze.db.tx-cmd/op diff --git a/modules/db/src/blaze/db/search_param_registry/spec.clj b/modules/db/src/blaze/db/search_param_registry/spec.clj index 0bb90693e..830458e3e 100644 --- a/modules/db/src/blaze/db/search_param_registry/spec.clj +++ b/modules/db/src/blaze/db/search_param_registry/spec.clj @@ -5,8 +5,12 @@ [clojure.spec.alpha :as s])) +(defn search-param-registry? [x] + (satisfies? sr/SearchParamRegistry x)) + + (s/def :blaze.db/search-param-registry - #(satisfies? sr/SearchParamRegistry %)) + search-param-registry?) (s/def :blaze.db/search-param diff --git a/modules/db/src/blaze/db/spec.clj b/modules/db/src/blaze/db/spec.clj index c83ab4448..8cd5c788f 100644 --- a/modules/db/src/blaze/db/spec.clj +++ b/modules/db/src/blaze/db/spec.clj @@ -15,12 +15,20 @@ #(satisfies? np/Node %)) +(defn cache? [x] + (instance? Cache x)) + + (s/def :blaze.db/resource-handle-cache - #(instance? Cache %)) + cache?) + + +(defn loading-cache? [x] + (instance? LoadingCache x)) (s/def :blaze.db/tx-cache - #(instance? LoadingCache %)) + loading-cache?) (s/def :blaze.db/resource-cache diff --git a/modules/db/test/blaze/db/node/resource_indexer_test.clj b/modules/db/test/blaze/db/node/resource_indexer_test.clj index b9d9803e3..ffe01640d 100644 --- a/modules/db/test/blaze/db/node/resource_indexer_test.clj +++ b/modules/db/test/blaze/db/node/resource_indexer_test.clj @@ -17,7 +17,8 @@ [blaze.db.node.resource-indexer-spec] [blaze.db.resource-store :as rs] [blaze.db.resource-store.kv :as rs-kv] - [blaze.db.search-param-registry :as sr] + [blaze.db.resource-store.spec :refer [resource-store?]] + [blaze.db.search-param-registry.spec :refer [search-param-registry?]] [blaze.executors :as ex] [blaze.fhir-path :as fhir-path] [blaze.fhir.hash :as hash] @@ -83,7 +84,7 @@ [:explain ::s/problems 0 :pred] := `(fn ~'[%] (contains? ~'% :kv-store)) [:explain ::s/problems 1 :pred] := `(fn ~'[%] (contains? ~'% :search-param-registry)) [:explain ::s/problems 2 :pred] := `(fn ~'[%] (contains? ~'% :executor)) - [:explain ::s/problems 3 :pred] := `(fn ~'[%] (satisfies? rs/ResourceStore ~'%)) + [:explain ::s/problems 3 :pred] := `resource-store? [:explain ::s/problems 3 :val] := ::invalid)) (testing "invalid search-param-registry" @@ -93,7 +94,7 @@ [:explain ::s/problems 0 :pred] := `(fn ~'[%] (contains? ~'% :kv-store)) [:explain ::s/problems 1 :pred] := `(fn ~'[%] (contains? ~'% :resource-store)) [:explain ::s/problems 2 :pred] := `(fn ~'[%] (contains? ~'% :executor)) - [:explain ::s/problems 3 :pred] := `(fn ~'[%] (satisfies? sr/SearchParamRegistry ~'%)) + [:explain ::s/problems 3 :pred] := `search-param-registry? [:explain ::s/problems 3 :val] := ::invalid)) (testing "invalid executor" diff --git a/modules/db/test/blaze/db/node_test.clj b/modules/db/test/blaze/db/node_test.clj index 5ec874b4c..f597f0d46 100644 --- a/modules/db/test/blaze/db/node_test.clj +++ b/modules/db/test/blaze/db/node_test.clj @@ -16,11 +16,14 @@ [blaze.db.node.version :as version] [blaze.db.resource-handle-cache] [blaze.db.resource-store :as rs] + [blaze.db.resource-store.spec :refer [resource-store?]] [blaze.db.search-param-registry] + [blaze.db.search-param-registry.spec :refer [search-param-registry?]] + [blaze.db.spec :refer [cache? loading-cache?]] [blaze.db.test-util :refer [system]] - [blaze.db.tx-log :as tx-log] [blaze.db.tx-log-spec] [blaze.db.tx-log.local-spec] + [blaze.db.tx-log.spec :refer [tx-log?]] [blaze.executors :as ex] [blaze.fhir.structure-definition-repo] [blaze.log] @@ -114,33 +117,67 @@ [:explain ::s/problems 7 :pred] := `(fn ~'[%] (contains? ~'% :search-param-registry)))) (testing "invalid tx-log" - (given-thrown (ig/init {:blaze.db/node {:tx-log ::invalid}}) + (given-thrown (ig/init (assoc-in system [:blaze.db/node :tx-log] ::invalid)) :key := :blaze.db/node :reason := ::ig/build-failed-spec - [:explain ::s/problems 0 :pred] := `(fn ~'[%] (contains? ~'% :resource-handle-cache)) - [:explain ::s/problems 1 :pred] := `(fn ~'[%] (contains? ~'% :tx-cache)) - [:explain ::s/problems 2 :pred] := `(fn ~'[%] (contains? ~'% :indexer-executor)) - [:explain ::s/problems 3 :pred] := `(fn ~'[%] (contains? ~'% :kv-store)) - [:explain ::s/problems 4 :pred] := `(fn ~'[%] (contains? ~'% :resource-indexer)) - [:explain ::s/problems 5 :pred] := `(fn ~'[%] (contains? ~'% :resource-store)) - [:explain ::s/problems 6 :pred] := `(fn ~'[%] (contains? ~'% :search-param-registry)) - [:explain ::s/problems 7 :pred] := `(fn ~'[%] (satisfies? tx-log/TxLog ~'%)) - [:explain ::s/problems 7 :val] := ::invalid)) + [:explain ::s/problems 0 :pred] := `tx-log? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid resource-handle-cache" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :resource-handle-cache] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `cache? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid tx-cache" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :tx-cache] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `loading-cache? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid indexer-executor" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :indexer-executor] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `ex/executor? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid kv-store" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :kv-store] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `kv/store? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid resource-indexer" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :resource-indexer] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `map? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid resource-store" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :resource-store] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `resource-store? + [:explain ::s/problems 0 :val] := ::invalid)) + + (testing "invalid search-param-registry" + (given-thrown (ig/init (assoc-in system [:blaze.db/node :search-param-registry] ::invalid)) + :key := :blaze.db/node + :reason := ::ig/build-failed-spec + [:explain ::s/problems 0 :pred] := `search-param-registry? + [:explain ::s/problems 0 :val] := ::invalid)) (testing "invalid enforce-referential-integrity" - (given-thrown (ig/init {:blaze.db/node {:enforce-referential-integrity ::invalid}}) + (given-thrown (ig/init (assoc-in system [:blaze.db/node :enforce-referential-integrity] ::invalid)) :key := :blaze.db/node :reason := ::ig/build-failed-spec - [:explain ::s/problems 0 :pred] := `(fn ~'[%] (contains? ~'% :tx-log)) - [:explain ::s/problems 1 :pred] := `(fn ~'[%] (contains? ~'% :resource-handle-cache)) - [:explain ::s/problems 2 :pred] := `(fn ~'[%] (contains? ~'% :tx-cache)) - [:explain ::s/problems 3 :pred] := `(fn ~'[%] (contains? ~'% :indexer-executor)) - [:explain ::s/problems 4 :pred] := `(fn ~'[%] (contains? ~'% :kv-store)) - [:explain ::s/problems 5 :pred] := `(fn ~'[%] (contains? ~'% :resource-indexer)) - [:explain ::s/problems 6 :pred] := `(fn ~'[%] (contains? ~'% :resource-store)) - [:explain ::s/problems 7 :pred] := `(fn ~'[%] (contains? ~'% :search-param-registry)) - [:explain ::s/problems 8 :pred] := `boolean? - [:explain ::s/problems 8 :val] := ::invalid)) + [:explain ::s/problems 0 :pred] := `boolean? + [:explain ::s/problems 0 :val] := ::invalid)) (testing "incompatible version" (given-thrown (ig/init (with-index-store-version system -1)) diff --git a/modules/db/test/blaze/db/resource_cache_test.clj b/modules/db/test/blaze/db/resource_cache_test.clj index 4c79fe41b..9a6f6bd60 100644 --- a/modules/db/test/blaze/db/resource_cache_test.clj +++ b/modules/db/test/blaze/db/resource_cache_test.clj @@ -7,6 +7,7 @@ [blaze.db.resource-store :as rs] [blaze.db.resource-store-spec] [blaze.db.resource-store.kv :as rs-kv] + [blaze.db.resource-store.spec :refer [resource-store?]] [blaze.fhir.hash :as hash] [blaze.fhir.hash-spec] [blaze.test-util :as tu :refer [given-thrown with-system]] @@ -67,7 +68,7 @@ (given-thrown (ig/init {:blaze.db/resource-cache {:resource-store ::invalid}}) :key := :blaze.db/resource-cache :reason := ::ig/build-failed-spec - [:explain ::s/problems 0 :pred] := `(fn ~'[%] (satisfies? rs/ResourceStore ~'%)) + [:explain ::s/problems 0 :pred] := `resource-store? [:explain ::s/problems 0 :val] := ::invalid)) (testing "invalid max-size" diff --git a/modules/db/test/blaze/db/search_param_registry_test.clj b/modules/db/test/blaze/db/search_param_registry_test.clj index 8332f6fb7..08739c439 100644 --- a/modules/db/test/blaze/db/search_param_registry_test.clj +++ b/modules/db/test/blaze/db/search_param_registry_test.clj @@ -5,7 +5,7 @@ [blaze.fhir-path :as fhir-path] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.fhir.structure-definition-repo.protocols :as p] + [blaze.fhir.structure-definition-repo.spec :refer [structure-definition-repo?]] [blaze.test-util :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -46,7 +46,7 @@ (given-thrown (ig/init {:blaze.db/search-param-registry {:structure-definition-repo ::invalid}}) :key := :blaze.db/search-param-registry :reason := ::ig/build-failed-spec - [:explain ::s/problems 0 :pred] := `(fn ~'[%] (satisfies? p/StructureDefinitionRepo ~'%)) + [:explain ::s/problems 0 :pred] := `structure-definition-repo? [:explain ::s/problems 0 :val] := ::invalid))) diff --git a/modules/fhir-structure/src/blaze/fhir/structure_definition_repo/spec.clj b/modules/fhir-structure/src/blaze/fhir/structure_definition_repo/spec.clj index 5fa93f2db..c3ebb443b 100644 --- a/modules/fhir-structure/src/blaze/fhir/structure_definition_repo/spec.clj +++ b/modules/fhir-structure/src/blaze/fhir/structure_definition_repo/spec.clj @@ -4,5 +4,9 @@ [clojure.spec.alpha :as s])) +(defn structure-definition-repo? [x] + (satisfies? p/StructureDefinitionRepo x)) + + (s/def :blaze.fhir/structure-definition-repo - #(satisfies? p/StructureDefinitionRepo %)) + structure-definition-repo?) From 3fa494b518dcbfa50050b2474dd9320e26281c07 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 12 Feb 2023 18:24:04 +0100 Subject: [PATCH 109/124] Fix _lastUpdated Search Returning a Resource more than Once Searching resources by _lastUpdated can return a resource more than once. The problem with the meta.lastUpdated property is that it doesn't contribute to the content hash of a resource because it's not part of the resource content. This results in multiple entries into the SearchParamValueResource index having the same content hash. If that content hash is equal to the current one, the resource is returned multiple times. The fix moves the _lastUpdated search clause away from the first position because the first clause uses the SearchParamValueResource index. Closes: #882 --- modules/db-stub/src/blaze/db/api_stub.clj | 4 +- modules/db/src/blaze/db/impl/batch_db.clj | 17 +++-- .../db/src/blaze/db/impl/search_param/all.clj | 25 ++++++++ .../src/blaze/db/impl/search_param/date.clj | 64 +++++++++++-------- .../blaze/db/impl/search_param/quantity.clj | 10 ++- .../src/blaze/db/impl/search_param/util.clj | 15 +++-- modules/db/src/blaze/db/node.clj | 28 +++++++- .../db/test-perf/blaze/db/api_test_perf.clj | 4 +- modules/db/test/blaze/db/api_test.clj | 55 +++++++++++++++- modules/db/test/blaze/db/test_util.clj | 5 +- .../db/test/blaze/db/tx_log/local_test.clj | 8 +-- .../fhir-structure/src/blaze/fhir/hash.clj | 1 + .../test/blaze/interaction/create_test.clj | 2 +- .../interaction/history/instance_test.clj | 2 +- .../blaze/interaction/history/system_test.clj | 2 +- .../blaze/interaction/history/type_test.clj | 2 +- .../interaction/search_compartment_test.clj | 2 +- .../blaze/interaction/search_system_test.clj | 2 +- .../blaze/interaction/search_type_test.clj | 2 +- .../blaze/interaction/transaction_test.clj | 6 +- .../operation/evaluate_measure/cql_test.clj | 4 +- .../measure/stratifier_test.clj | 4 +- .../evaluate_measure/measure_test.clj | 36 +++++------ .../fhir/operation/evaluate_measure_test.clj | 2 +- modules/test-util/src/blaze/test_util.clj | 7 +- test/blaze/system_test.clj | 8 +-- 26 files changed, 225 insertions(+), 92 deletions(-) create mode 100644 modules/db/src/blaze/db/impl/search_param/all.clj diff --git a/modules/db-stub/src/blaze/db/api_stub.clj b/modules/db-stub/src/blaze/db/api_stub.clj index 9b259d8a1..25b61118f 100644 --- a/modules/db-stub/src/blaze/db/api_stub.clj +++ b/modules/db-stub/src/blaze/db/api_stub.clj @@ -36,10 +36,10 @@ ::tx-log/local {:kv-store (ig/ref :blaze.db/transaction-kv-store) - :clock (ig/ref :blaze.test/clock)} + :clock (ig/ref :blaze.test/fixed-clock)} [::kv/mem :blaze.db/transaction-kv-store] {:column-families {}} - :blaze.test/clock {} + :blaze.test/fixed-clock {} :blaze.db/resource-handle-cache {} diff --git a/modules/db/src/blaze/db/impl/batch_db.clj b/modules/db/src/blaze/db/impl/batch_db.clj index 6df2ba0ab..484c972f8 100644 --- a/modules/db/src/blaze/db/impl/batch_db.clj +++ b/modules/db/src/blaze/db/impl/batch_db.clj @@ -17,6 +17,7 @@ [blaze.db.impl.index.type-as-of :as tao] [blaze.db.impl.index.type-stats :as type-stats] [blaze.db.impl.protocols :as p] + [blaze.db.impl.search-param.all :as search-param-all] [blaze.db.impl.search-param.util :as u] [blaze.db.kv :as kv]) (:import @@ -230,11 +231,17 @@ (defn- decode-clauses [clauses] - (mapv - (fn [[search-param modifier values]] - (if (#{"asc" "desc"} modifier) - [:sort (:code search-param) (keyword modifier)] - (into [(cond-> (:code search-param) modifier (str ":" modifier))] values))) + (into + [] + (keep + (fn [[search-param modifier values]] + (cond + (= search-param-all/search-param search-param) + nil + (#{"asc" "desc"} modifier) + [:sort (:code search-param) (keyword modifier)] + :else + (into [(cond-> (:code search-param) modifier (str ":" modifier))] values)))) clauses)) diff --git a/modules/db/src/blaze/db/impl/search_param/all.clj b/modules/db/src/blaze/db/impl/search_param/all.clj new file mode 100644 index 000000000..843b2159e --- /dev/null +++ b/modules/db/src/blaze/db/impl/search_param/all.clj @@ -0,0 +1,25 @@ +(ns blaze.db.impl.search-param.all + "A internal search parameter returning all resources of a type. + + This search param is used to put the date search param on _lastUpdated into + second position if no other search param is available for the first position. + + The date search param on _lastUpdated can't be in first position, because it + will return resources more than once if multiple updates with the same hash + are index with different lastUpdate times." + (:require + [blaze.db.impl.index.resource-as-of :as rao] + [blaze.db.impl.protocols :as p])) + + +(def search-param + (reify p/SearchParam + (-compile-value [_ _ _]) + + (-resource-handles [_ context tid _ _] + (rao/type-list context tid)) + + (-resource-handles [_ context tid _ _ start-id] + (rao/type-list context tid start-id)) + + (-index-values [_ _ _]))) diff --git a/modules/db/src/blaze/db/impl/search_param/date.clj b/modules/db/src/blaze/db/impl/search_param/date.clj index e0a3c5d74..4a634f062 100644 --- a/modules/db/src/blaze/db/impl/search_param/date.clj +++ b/modules/db/src/blaze/db/impl/search_param/date.clj @@ -93,17 +93,23 @@ (resource-value! context c-hash tid start-id) start-id)) +(def ^:private drop-value + (map #(subvec % 1))) + + (defn- eq-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of all + "Returns a reducible collection of `[id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by `lower-bound` and `upper-bound` starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid lower-bound upper-bound] (coll/eduction - (eq-filter lower-bound upper-bound) + (comp (eq-filter lower-bound upper-bound) + drop-value) (sp-vr/all-keys! svri c-hash tid))) ([context c-hash tid lower-bound upper-bound start-id] (coll/eduction - (eq-filter lower-bound upper-bound) + (comp (eq-filter lower-bound upper-bound) + drop-value) (all-keys! context c-hash tid start-id)))) @@ -119,16 +125,18 @@ (defn- ge-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of all + "Returns a reducible collection of `[id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by `lower-bound` and an infinite upper bound starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid lower-bound] (coll/eduction - (ge-filter lower-bound) + (comp (ge-filter lower-bound) + drop-value) (sp-vr/all-keys! svri c-hash tid))) ([context c-hash tid lower-bound start-id] (coll/eduction - (ge-filter lower-bound) + (comp (ge-filter lower-bound) + drop-value) (all-keys! context c-hash tid start-id)))) @@ -144,16 +152,18 @@ (defn- gt-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of all + "Returns a reducible collection of `[id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by `lower-bound` and an infinite upper bound starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid lower-bound] (coll/eduction - (gt-filter lower-bound) + (comp (gt-filter lower-bound) + drop-value) (sp-vr/all-keys! svri c-hash tid))) ([context c-hash tid lower-bound start-id] (coll/eduction - (gt-filter lower-bound) + (comp (gt-filter lower-bound) + drop-value) (all-keys! context c-hash tid start-id)))) @@ -169,16 +179,18 @@ (defn- le-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of all + "Returns a reducible collection of `[id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by an infinite lower bound and `upper-bound` starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid upper-bound] (coll/eduction - (le-filter upper-bound) + (comp (le-filter upper-bound) + drop-value) (sp-vr/all-keys! svri c-hash tid))) ([context c-hash tid upper-bound start-id] (coll/eduction - (le-filter upper-bound) + (comp (le-filter upper-bound) + drop-value) (all-keys! context c-hash tid start-id)))) @@ -194,16 +206,18 @@ (defn- lt-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of all + "Returns a reducible collection of `[id hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by an infinite lower bound and `upper-bound` starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid upper-bound] (coll/eduction - (lt-filter upper-bound) + (comp (lt-filter upper-bound) + drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid lower-bound start-id] + ([context c-hash tid upper-bound start-id] (coll/eduction - (lt-filter lower-bound) + (comp (lt-filter upper-bound) + drop-value) (all-keys! context c-hash tid start-id)))) @@ -267,32 +281,26 @@ (-resource-handles [_ context tid _ value] (coll/eduction - (comp - (map (fn [[_value id hash-prefix]] [id hash-prefix])) - (u/resource-handle-mapper context tid)) + (u/resource-handle-mapper context tid) (resource-keys! context c-hash tid value))) (-resource-handles [_ context tid _ value start-id] (coll/eduction - (comp - (map (fn [[_value id hash-prefix]] [id hash-prefix])) - (u/resource-handle-mapper context tid)) + (u/resource-handle-mapper context tid) (resource-keys! context c-hash tid value start-id))) (-sorted-resource-handles [_ context tid direction] (coll/eduction - (comp - (map (fn [[_value id hash-prefix]] [id hash-prefix])) - (u/resource-handle-mapper context tid)) + (comp drop-value + (u/resource-handle-mapper context tid)) (if (= :asc direction) (sp-vr/all-keys! (:svri context) c-hash tid) (sp-vr/all-keys-prev! (:svri context) c-hash tid)))) (-sorted-resource-handles [_ context tid direction start-id] (coll/eduction - (comp - (map (fn [[_value id hash-prefix]] [id hash-prefix])) - (u/resource-handle-mapper context tid)) + (comp drop-value + (u/resource-handle-mapper context tid)) (if (= :asc direction) (all-keys! context c-hash tid start-id) (all-keys-prev! context c-hash tid start-id)))) diff --git a/modules/db/src/blaze/db/impl/search_param/quantity.clj b/modules/db/src/blaze/db/impl/search_param/quantity.clj index 91249e913..d7da54bd7 100644 --- a/modules/db/src/blaze/db/impl/search_param/quantity.clj +++ b/modules/db/src/blaze/db/impl/search_param/quantity.clj @@ -86,6 +86,10 @@ (take-while (fn [[prefix]] (bs/<= prefix prefix-key))))) +(def ^:private drop-value + (map #(subvec % 1))) + + (defn- eq-keys! "Returns a reducible collection of `[id hash-prefix]` tuples of values between `lower-bound` and `upper-bound` starting at `start-id` (optional). @@ -98,14 +102,14 @@ (coll/eduction (comp (take-while-less-equal c-hash tid upper-bound) - (map (fn [[_prefix id hash-prefix]] [id hash-prefix]))) + drop-value) (sp-vr/keys! svri (sp-vr/encode-seek-key c-hash tid lower-bound)))) ([{:keys [svri] :as context} c-hash tid lower-bound-prefix upper-bound start-id] (coll/eduction (comp (take-while-less-equal c-hash tid upper-bound) - (map (fn [[_prefix id hash-prefix]] [id hash-prefix]))) + drop-value) (sp-vr/keys! svri (id-start-key! context c-hash tid lower-bound-prefix start-id))))) @@ -224,7 +228,7 @@ (coll/eduction (comp (take-while-compartment-less-equal compartment c-hash tid upper-bound) - (map (fn [[_prefix id hash-prefix]] [id hash-prefix]))) + drop-value) (c-sp-vr/keys! csvri (c-sp-vr/encode-seek-key compartment c-hash tid lower-bound)))) diff --git a/modules/db/src/blaze/db/impl/search_param/util.clj b/modules/db/src/blaze/db/impl/search_param/util.clj index 119142ce4..9ed952f0c 100644 --- a/modules/db/src/blaze/db/impl/search_param/util.clj +++ b/modules/db/src/blaze/db/impl/search_param/util.clj @@ -49,14 +49,17 @@ (defn- resource-handle-mapper* [{:keys [resource-handle]} tid] (keep - (fn [tuples] - (let [id (-> tuples (coll/nth 0) (coll/nth 0))] - (when-let [handle (resource-handle tid id)] - (when (some (contains-hash-prefix-pred handle) tuples) - handle)))))) + (fn [[[id] :as tuples]] + (when-let [handle (resource-handle tid id)] + (when (some (contains-hash-prefix-pred handle) tuples) + handle))))) -(defn resource-handle-mapper [context tid] +(defn resource-handle-mapper + "Transducer which groups `[id hash-prefix]` tuples by `id` and maps them to + a resource handle with `tid` if there is a current one with matching hash + prefix." + [context tid] (comp by-id-grouper (resource-handle-mapper* context tid))) diff --git a/modules/db/src/blaze/db/node.clj b/modules/db/src/blaze/db/node.clj index ba7acffb4..c738b4a4b 100644 --- a/modules/db/src/blaze/db/node.clj +++ b/modules/db/src/blaze/db/node.clj @@ -12,6 +12,7 @@ [blaze.db.impl.index.tx-success :as tx-success] [blaze.db.impl.protocols :as p] [blaze.db.impl.search-param :as search-param] + [blaze.db.impl.search-param.all :as search-param-all] [blaze.db.impl.search-param.chained :as spc] [blaze.db.kv :as kv] [blaze.db.node.protocols :as np] @@ -107,13 +108,38 @@ (s/conform :blaze.db.query/clause clause)) -(defn- resolve-search-params [registry type clauses lenient?] +(defn- resolve-search-params* [registry type clauses lenient?] (reduce #(resolve-search-param registry type %1 (conform-clause %2) lenient?) [] clauses)) +(defn- type-priority [type] + (case type + "token" 0 + 1)) + + +(defn- order-clauses + "Orders clauses by specificity so that the clause constraining the resources + the most will come first." + [clauses] + (sort-by (comp type-priority :type first) clauses)) + + +(defn- fix-last-updated [[[first-search-param first-modifier] :as clauses]] + (if (and (= "_lastUpdated" (:code first-search-param)) + (not (#{"asc" "desc"} first-modifier))) + (into [[search-param-all/search-param nil [""] [""]]] clauses) + clauses)) + + +(defn- resolve-search-params [registry type clauses lenient?] + (when-ok [clauses (resolve-search-params* registry type clauses lenient?)] + (-> clauses order-clauses fix-last-updated))) + + (defn- db-future "Adds a watcher to `node` and returns a CompletableFuture that will complete with the database value of at least the point in time `t` if `t` is reached or diff --git a/modules/db/test-perf/blaze/db/api_test_perf.clj b/modules/db/test-perf/blaze/db/api_test_perf.clj index 88b9f38a1..3f184124e 100644 --- a/modules/db/test-perf/blaze/db/api_test_perf.clj +++ b/modules/db/test-perf/blaze/db/api_test_perf.clj @@ -39,10 +39,10 @@ ::tx-log/local {:kv-store (ig/ref :blaze.db/transaction-kv-store) - :clock (ig/ref :blaze.test/clock)} + :clock (ig/ref :blaze.test/fixed-clock)} [::kv/mem :blaze.db/transaction-kv-store] {:column-families {}} - :blaze.test/clock {} + :blaze.test/fixed-clock {} :blaze.db/resource-handle-cache {:max-size 1000000} diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index dc289173c..238c55fd2 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -16,6 +16,7 @@ [blaze.db.resource-store :as rs] [blaze.db.search-param-registry] [blaze.db.test-util :refer [system with-system-data]] + [blaze.db.tx-log :as tx-log] [blaze.db.tx-log-spec] [blaze.db.tx-log.local-spec] [blaze.fhir.spec :as fhir-spec] @@ -786,12 +787,16 @@ @(d/pull-many node handles)))) +(defn- with-system-clock [system] + (assoc-in system [::tx-log/local :clock] (ig/ref :blaze.test/system-clock))) + + (deftest type-query-test (with-system [{:blaze.db/keys [node]} system] (testing "a new node has no patients" (is (coll/empty? (d/type-query (d/db node) "Patient" [["gender" "male"]])))) - (testing "sort clauses are anly allowed at first position" + (testing "sort clauses are only allowed at first position" (given (d/type-query (d/db node) "Patient" [["gender" "male"] [:sort "_lastUpdated" :desc]]) ::anom/category := ::anom/incorrect @@ -927,6 +932,23 @@ [0 :fhir/type] := :fhir/Patient [0 :id] := "0"))) + ;; TODO: fix this https://github.com/samply/blaze/issues/904 + #_(testing "sorting by _lastUpdated returns only the newest version of the patient" + (with-system-data [{:blaze.db/keys [node]} (with-system-clock system)] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]]] + + ;; we have to sleep more than one second here because dates are index only with second resolution + (Thread/sleep 2000) + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + + (doseq [dir [:asc :desc]] + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" dir]]) + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "0" + [0 :active] := false)))) + (testing "a node with three patients in one transaction" (with-system-data [{:blaze.db/keys [node]} system] [[[:put {:fhir/type :fhir/Patient :id "0" :active true}] @@ -1015,6 +1037,22 @@ [0 :id] := "0" [1 :id] := "3"))))) + (testing "special case of _lastUpdated date search parameter" + (testing "inequality searches do return every resource only once" + (with-system-data [{:blaze.db/keys [node]} (with-system-clock system)] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]]] + + ;; we have to sleep more than one second here because dates are index only with second resolution + (Thread/sleep 2000) + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + + (given (pull-type-query node "Patient" [["_lastUpdated" "ge2000-01-01"]]) + count := 2) + + (given (pull-type-query node "Patient" [["_lastUpdated" "lt3000-01-01"]]) + count := 2)))) + (testing "Special Search Parameter _has" (with-system-data [{:blaze.db/keys [node]} system] [[[:put {:fhir/type :fhir/Patient :id "0" @@ -3048,6 +3086,8 @@ (testing "year precision" (with-system-data [{:blaze.db/keys [node]} system] [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"1970"}]] + [[:put {:fhir/type :fhir/Patient :id "0" :birthDate #fhir/date"1990"}] [:put {:fhir/type :fhir/Patient :id "1" :birthDate #fhir/date"1989"}] @@ -3341,6 +3381,19 @@ [0 :fhir/type] := :fhir/Patient [0 :id] := "0")) + (testing "token clauses are ordered before date clauses" + (given (-> (d/compile-type-query node "Patient" [["_lastUpdated" "lt3000-01-01"] + ["active" "true"]]) + (d/query-clauses)) + [0] := ["active" "true"] + [1] := ["_lastUpdated" "lt3000-01-01"])) + + (testing "special all clause is removed" + (given (-> (d/compile-type-query node "Patient" [["_lastUpdated" "lt3000-01-01"]]) + (d/query-clauses)) + count := 1 + [0] := ["_lastUpdated" "lt3000-01-01"])) + (testing "an unknown search-param errors" (given (d/compile-type-query node "Patient" [["foo" "bar"] ["active" "true"]]) diff --git a/modules/db/test/blaze/db/test_util.clj b/modules/db/test/blaze/db/test_util.clj index 82497b9e1..e7f082417 100644 --- a/modules/db/test/blaze/db/test_util.clj +++ b/modules/db/test/blaze/db/test_util.clj @@ -30,12 +30,13 @@ ::tx-log/local {:kv-store (ig/ref :blaze.db/transaction-kv-store) - :clock (ig/ref :blaze.test/clock)} + :clock (ig/ref :blaze.test/fixed-clock)} [::kv/mem :blaze.db/transaction-kv-store] {:column-families {}} - :blaze.test/clock {} + :blaze.test/fixed-clock {} + :blaze.test/system-clock {} :blaze.db/resource-handle-cache {} diff --git a/modules/db/test/blaze/db/tx_log/local_test.clj b/modules/db/test/blaze/db/tx_log/local_test.clj index f22d4d1fe..aab86b258 100644 --- a/modules/db/test/blaze/db/tx_log/local_test.clj +++ b/modules/db/test/blaze/db/tx_log/local_test.clj @@ -82,10 +82,10 @@ (def system {::tx-log/local {:kv-store (ig/ref :blaze.db/transaction-kv-store) - :clock (ig/ref :blaze.test/clock)} + :clock (ig/ref :blaze.test/fixed-clock)} [::kv/mem :blaze.db/transaction-kv-store] {:column-families {}} - :blaze.test/clock {}}) + :blaze.test/fixed-clock {}}) (defn- assoc-kv-store-init-data [system init-data] @@ -95,9 +95,9 @@ (def failing-kv-store-system {::tx-log/local {:kv-store (ig/ref ::failing-kv-store) - :clock (ig/ref :blaze.test/clock)} + :clock (ig/ref :blaze.test/fixed-clock)} ::failing-kv-store {} - :blaze.test/clock {}}) + :blaze.test/fixed-clock {}}) (deftest init-test diff --git a/modules/fhir-structure/src/blaze/fhir/hash.clj b/modules/fhir-structure/src/blaze/fhir/hash.clj index a212ae34b..edb42be63 100644 --- a/modules/fhir-structure/src/blaze/fhir/hash.clj +++ b/modules/fhir-structure/src/blaze/fhir/hash.clj @@ -88,6 +88,7 @@ (defn prefix + "Returns the first 4 bytes of `hash`." {:inline (fn [hash] `(.prefix ~(with-meta hash {:tag `Hash})))} diff --git a/modules/interaction/test/blaze/interaction/create_test.clj b/modules/interaction/test/blaze/interaction/create_test.clj index 497159853..5621eda9b 100644 --- a/modules/interaction/test/blaze/interaction/create_test.clj +++ b/modules/interaction/test/blaze/interaction/create_test.clj @@ -83,7 +83,7 @@ :blaze.interaction/create {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.test/executor) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.test/executor {} :blaze.test/fixed-rng-fn {})) diff --git a/modules/interaction/test/blaze/interaction/history/instance_test.clj b/modules/interaction/test/blaze/interaction/history/instance_test.clj index 7378b4dc4..8a0189a7b 100644 --- a/modules/interaction/test/blaze/interaction/history/instance_test.clj +++ b/modules/interaction/test/blaze/interaction/history/instance_test.clj @@ -83,7 +83,7 @@ (assoc mem-node-system :blaze.interaction.history/instance {:node (ig/ref :blaze.db/node) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.test/fixed-rng-fn {})) diff --git a/modules/interaction/test/blaze/interaction/history/system_test.clj b/modules/interaction/test/blaze/interaction/history/system_test.clj index dac934b6b..b98258c74 100644 --- a/modules/interaction/test/blaze/interaction/history/system_test.clj +++ b/modules/interaction/test/blaze/interaction/history/system_test.clj @@ -85,7 +85,7 @@ (assoc mem-node-system :blaze.interaction.history/system {:node (ig/ref :blaze.db/node) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.test/fixed-rng-fn {})) diff --git a/modules/interaction/test/blaze/interaction/history/type_test.clj b/modules/interaction/test/blaze/interaction/history/type_test.clj index 5aedea317..4d47aeb89 100644 --- a/modules/interaction/test/blaze/interaction/history/type_test.clj +++ b/modules/interaction/test/blaze/interaction/history/type_test.clj @@ -86,7 +86,7 @@ (assoc mem-node-system :blaze.interaction.history/type {:node (ig/ref :blaze.db/node) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.test/fixed-rng-fn {})) diff --git a/modules/interaction/test/blaze/interaction/search_compartment_test.clj b/modules/interaction/test/blaze/interaction/search_compartment_test.clj index 6ac139c32..fd53fbae7 100644 --- a/modules/interaction/test/blaze/interaction/search_compartment_test.clj +++ b/modules/interaction/test/blaze/interaction/search_compartment_test.clj @@ -88,7 +88,7 @@ (def system (assoc mem-node-system :blaze.interaction/search-compartment - {:clock (ig/ref :blaze.test/clock) + {:clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref :blaze.page-store/local)} :blaze.test/fixed-rng-fn {} diff --git a/modules/interaction/test/blaze/interaction/search_system_test.clj b/modules/interaction/test/blaze/interaction/search_system_test.clj index e1b2414d5..6c08865fa 100644 --- a/modules/interaction/test/blaze/interaction/search_system_test.clj +++ b/modules/interaction/test/blaze/interaction/search_system_test.clj @@ -90,7 +90,7 @@ (assoc mem-node-system :blaze.interaction/search-system {:node (ig/ref :blaze.db/node) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref :blaze.page-store/local)} :blaze.test/fixed-rng-fn {} diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index bd855837d..36c7bee19 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -159,7 +159,7 @@ (def system (assoc mem-node-system :blaze.interaction/search-type - {:clock (ig/ref :blaze.test/clock) + {:clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref :blaze.page-store/local)} :blaze.test/fixed-rng-fn {} diff --git a/modules/interaction/test/blaze/interaction/transaction_test.clj b/modules/interaction/test/blaze/interaction/transaction_test.clj index d2648a116..995db7674 100644 --- a/modules/interaction/test/blaze/interaction/transaction_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction_test.clj @@ -133,18 +133,18 @@ :blaze.interaction/transaction {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.interaction.transaction/executor) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.interaction/create {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.test/executor) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.interaction/search-type {:node (ig/ref :blaze.db/node) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref :blaze.page-store/local)} diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index 08a37c888..8cb3eae52 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -106,10 +106,10 @@ (fn [_ _ _] (throw (Exception. ^String msg)))) -(defn- context [{:blaze.db/keys [node] :blaze.test/keys [clock]} library] +(defn- context [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock]} library] (let [{:keys [expression-defs function-defs]} (compile-library node library)] {:db (d/db node) - :now (now clock) + :now (now fixed-clock) :timeout-eclipsed? (constantly false) :timeout (time/seconds 42) :expression-defs expression-defs diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index ccc104fe9..038173160 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -176,10 +176,10 @@ :criteria (cql-expression "Age")}]}) -(defn- context [{:blaze.db/keys [node] :blaze.test/keys [clock]} library] +(defn- context [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock]} library] (let [{:keys [expression-defs function-defs]} (compile-library node library)] {:db (d/db node) - :now (now clock) + :now (now fixed-clock) :timeout-eclipsed? (constantly false) :timeout (time/seconds 42) :expression-defs expression-defs diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index a020ace49..e418e12e6 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -96,11 +96,11 @@ (evaluate name "population")) ([name report-type] (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [(tx-ops (:entry (read-data name)))] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} period [#system/date"2000" #system/date"2020"]] (measure/evaluate-measure context @@ -180,7 +180,7 @@ (deftest evaluate-measure-test (testing "Encounter population basis" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}] [:put {:fhir/type :fhir/Encounter :id "0-0" :subject #fhir/Reference{:reference "Patient/0"}}] [:put {:fhir/type :fhir/Patient :id "1"}] @@ -191,7 +191,7 @@ :content [(library-content library-encounter)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] @@ -234,12 +234,12 @@ (testing "missing criteria" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure-id "measure-id-133021" measure {:fhir/type :fhir/Measure :id measure-id @@ -260,13 +260,13 @@ (testing "evaluation timeout" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}]] [[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :timeout (time/seconds 0) :blaze/base-url "" ::reitit/router router} measure-id "measure-id-132321" @@ -288,13 +288,13 @@ (testing "single subject" (doseq [subject-ref ["0" ["Patient" "0"]]] (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] @@ -321,13 +321,13 @@ (testing "with stratifiers" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] @@ -361,12 +361,12 @@ (testing "invalid subject" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] @@ -385,12 +385,12 @@ (testing "missing subject" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] @@ -409,14 +409,14 @@ (testing "deleted subject" (with-system-data - [{:blaze.db/keys [node] :blaze.test/keys [clock fixed-rng-fn]} system] + [{:blaze.db/keys [node] :blaze.test/keys [fixed-clock fixed-rng-fn]} system] [[[:put {:fhir/type :fhir/Patient :id "0"}] [:put {:fhir/type :fhir/Library :id "0" :url #fhir/uri"0" :content [(library-content library-gender)]}]] [[:delete "Patient" "0"]]] (let [db (d/db node) - context {:clock clock :rng-fn fixed-rng-fn :db db + context {:clock fixed-clock :rng-fn fixed-rng-fn :db db :blaze/base-url "" ::reitit/router router} measure {:fhir/type :fhir/Measure :id "0" :library [#fhir/canonical"0"] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index 2fbb14eb5..339a2bfd3 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -167,7 +167,7 @@ ::evaluate-measure/handler {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.test/executor) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.test/executor {} :blaze.test/fixed-rng-fn {})) diff --git a/modules/test-util/src/blaze/test_util.clj b/modules/test-util/src/blaze/test_util.clj index 09b6ff8b7..8f309fad8 100644 --- a/modules/test-util/src/blaze/test_util.clj +++ b/modules/test-util/src/blaze/test_util.clj @@ -42,11 +42,16 @@ (ig/halt! system#))))) -(defmethod ig/init-key :blaze.test/clock +(defmethod ig/init-key :blaze.test/fixed-clock [_ _] (Clock/fixed Instant/EPOCH (ZoneId/of "UTC"))) +(defmethod ig/init-key :blaze.test/system-clock + [_ _] + (Clock/systemUTC)) + + (defmethod ig/init-key :blaze.test/fixed-rng-fn [_ {:keys [n] :or {n 0}}] #(proxy [Random] [] diff --git a/test/blaze/system_test.clj b/test/blaze/system_test.clj index 287a727f0..7130b6617 100644 --- a/test/blaze/system_test.clj +++ b/test/blaze/system_test.clj @@ -102,22 +102,22 @@ :blaze.interaction/transaction {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.test/executor) - :clock (ig/ref :blaze.test/clock) + :clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn)} :blaze.interaction/read {} :blaze.interaction/delete {:node (ig/ref :blaze.db/node) :executor (ig/ref :blaze.test/executor)} :blaze.interaction/search-system - {:clock (ig/ref :blaze.test/clock) + {:clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref ::page-store)} :blaze.interaction/search-type - {:clock (ig/ref :blaze.test/clock) + {:clock (ig/ref :blaze.test/fixed-clock) :rng-fn (ig/ref :blaze.test/fixed-rng-fn) :page-store (ig/ref ::page-store)} :blaze.test/executor {} - :blaze.test/clock {} + :blaze.test/fixed-clock {} :blaze.test/fixed-rng-fn {} ::page-store {})) From 47a62a137524ca39a0a374ba594fd67e0e392cf4 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 12 Feb 2023 21:02:22 +0100 Subject: [PATCH 110/124] Update Dependencies --- .github/workflows/build.yml | 12 ++++++------ deps.edn | 4 ++-- modules/cassandra/deps.edn | 2 +- modules/fhir-structure/deps.edn | 2 +- modules/page-store/deps.edn | 2 +- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e0f751e89..c5d329942 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -85,7 +85,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 @@ -116,7 +116,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 @@ -158,7 +158,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 @@ -186,7 +186,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 @@ -781,7 +781,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 @@ -1170,7 +1170,7 @@ jobs: - name: Setup Clojure uses: DeLaGuardo/setup-clojure@master with: - cli: '1.11.1.1208' + cli: '1.11.1.1224' - name: Check out Git repository uses: actions/checkout@v3 diff --git a/deps.edn b/deps.edn index 07701d826..c780e8cb3 100644 --- a/deps.edn +++ b/deps.edn @@ -61,7 +61,7 @@ {:mvn/version "0.4.6"} org.clojure/tools.namespace - {:mvn/version "1.3.0"}}} + {:mvn/version "1.4.0"}}} :kaocha {:extra-deps @@ -75,7 +75,7 @@ :extra-deps {org.clojure/tools.namespace - {:mvn/version "1.3.0"}}} + {:mvn/version "1.4.0"}}} :outdated {:replace-deps diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index 5d7c93793..cd82460db 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.87.Final"}} + {:mvn/version "4.1.88.Final"}} :aliases {:test diff --git a/modules/fhir-structure/deps.edn b/modules/fhir-structure/deps.edn index 7b86f2e32..58eb999b3 100644 --- a/modules/fhir-structure/deps.edn +++ b/modules/fhir-structure/deps.edn @@ -14,7 +14,7 @@ {:local/root "../module-base"} com.github.ben-manes.caffeine/caffeine - {:mvn/version "3.1.2"} + {:mvn/version "3.1.3"} com.google.guava/guava {:mvn/version "31.1-jre"} diff --git a/modules/page-store/deps.edn b/modules/page-store/deps.edn index 433afc85a..5fb5cbc3e 100644 --- a/modules/page-store/deps.edn +++ b/modules/page-store/deps.edn @@ -11,7 +11,7 @@ {:local/root "../module-base"} com.github.ben-manes.caffeine/caffeine - {:mvn/version "3.1.2"} + {:mvn/version "3.1.3"} com.google.guava/guava {:mvn/version "31.1-jre"}} From 82baf239d711d4aba5f61edec241dd4ae39a13c0 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 13 Feb 2023 08:59:37 +0100 Subject: [PATCH 111/124] Release v0.19.2 --- CHANGELOG.md | 8 ++++++++ Dockerfile | 4 ++-- README.md | 4 ++-- build.clj | 2 +- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 9 files changed, 25 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ad1f6c805..5b5f6f90b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## v0.19.2 + +### Bugfixes + +* Fix _lastUpdated Search Returning a Resource more than Once ([#882](https://github.com/samply/blaze/issues/882)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/60?closed=1). + ## v0.19.1 ### Security diff --git a/Dockerfile b/Dockerfile index dea069b8c..1d55605f2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.19.1-standalone.jar /app/ +COPY target/blaze-0.19.2-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.19.1-standalone.jar"] +CMD ["java", "-jar", "blaze-0.19.2-standalone.jar"] diff --git a/README.md b/README.md index be49f392b..a1ec61a94 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.19.1][5] +Latest release: [v0.19.2][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 06314591d..0880a6ea7 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.19.1") +(def version "0.19.2") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 2872c7be5..57315c564 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.1 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.2 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.1" + "version": "0.19.2" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 0c7df6438..28b91fe61 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.1). Look for `blaze-0.19.1-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.2). Look for `blaze-0.19.2-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.19.1-standalone.jar +java -jar blaze-0.19.2-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.19.1-standalone.jar +STORAGE=standalone java -jar blaze-0.19.2-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.19.1-standalone.jar +java -jar blaze-0.19.2-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.1 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.2 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.1" + "version": "0.19.2" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 6df6682ac..0f065c30c 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2023-02-09" + :date #fhir/dateTime"2023-02-13" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2023-02-09"} + :releaseDate #fhir/dateTime"2023-02-13"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 6c169f5d9..9f382b4bd 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.19.1 + 0.19.2 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index 5461122a2..a6849ca00 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.19.1" + {:blaze/version "0.19.2" :blaze/clock {} From 313c6ffb6ed5026338a9b9c0a4dd36221bae30be Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 15 Feb 2023 12:03:06 +0100 Subject: [PATCH 112/124] Move Test Fixture into Test Util Namespace Also initialize FHIR specs in the test util namespace. --- modules/anomaly/test/blaze/anomaly_test.clj | 9 +-- modules/async/test/blaze/async/comp_test.clj | 10 +--- modules/async/test/blaze/async/flow_test.clj | 9 +-- .../test/blaze/byte_buffer_test.clj | 10 +--- .../test/blaze/cassandra/config_test.clj | 11 +--- .../test/blaze/cassandra/session_test.clj | 15 ++--- .../cassandra/test/blaze/cassandra_test.clj | 10 +--- modules/coll/deps.edn | 6 +- modules/coll/test/blaze/coll/core_test.clj | 9 +-- .../cql/test/blaze/cql_translator_test.clj | 9 +-- .../blaze/elm/equiv_relationships_test.clj | 9 +-- modules/cql/test/blaze/elm/list_test.clj | 9 +-- .../cql/test/blaze/elm/normalizer_test.clj | 9 +-- modules/cql/test/blaze/elm/quantity_test.clj | 9 +-- modules/cql/test/blaze/elm/spec_test.clj | 11 +--- modules/cql/test/blaze/elm/util_test.clj | 9 +-- .../cassandra/statement_test.clj | 9 +-- .../db/resource_store/cassandra_test.clj | 9 +-- .../blaze/db/resource_store/cbor_test.clj | 9 +-- .../test/blaze/db/resource_store/kv_test.clj | 9 +-- .../test/blaze/db/tx_log/kafka/codec_test.clj | 10 +--- .../blaze/db/tx_log/kafka/config_test.clj | 9 +-- .../test/blaze/db/tx_log/kafka/util_test.clj | 9 +-- .../test/blaze/db/tx_log/kafka_test.clj | 9 +-- .../test/blaze/db/tx_log/spec_test.clj | 9 +-- .../db-tx-log/test/blaze/db/tx_log_test.clj | 9 +-- .../impl/index/resource_handle_test_perf.clj | 9 +-- modules/db/test/blaze/db/api_test.clj | 34 +++++------ .../db/test/blaze/db/cache_collector_test.clj | 10 +--- .../db/test/blaze/db/impl/codec/date_test.clj | 10 +--- modules/db/test/blaze/db/impl/codec_test.clj | 10 +--- .../db/impl/index/resource_handle_test.clj | 9 +-- .../search_param_value_resource/impl_test.clj | 10 +--- .../search_param_value_resource_test.clj | 10 +--- .../blaze/db/impl/index/t_by_instant_test.clj | 10 +--- .../blaze/db/impl/index/tx_error_test.clj | 10 +--- .../blaze/db/impl/index/tx_success_test.clj | 10 +--- .../db/test/blaze/db/impl/iterators_test.clj | 10 +--- .../db/impl/search_param/composite_test.clj | 10 +--- .../blaze/db/impl/search_param/date_test.clj | 10 +--- .../blaze/db/impl/search_param/list_test.clj | 10 +--- .../db/impl/search_param/number_test.clj | 10 +--- .../db/impl/search_param/quantity_test.clj | 10 +--- .../db/impl/search_param/string_test.clj | 10 +--- .../blaze/db/impl/search_param/token_test.clj | 10 +--- .../blaze/db/impl/search_param/util_test.clj | 9 +-- .../test/blaze/db/impl/search_param_test.clj | 10 +--- .../blaze/db/node/resource_indexer_test.clj | 10 +--- .../test/blaze/db/node/transaction_test.clj | 9 +-- .../blaze/db/node/tx_indexer/verify_test.clj | 10 +--- .../db/test/blaze/db/node/validation_test.clj | 9 +-- modules/db/test/blaze/db/node_test.clj | 10 +--- .../db/test/blaze/db/resource_cache_test.clj | 9 +-- .../blaze/db/resource_handle_cache_test.clj | 10 +--- .../blaze/db/search_param_registry_test.clj | 10 +--- modules/db/test/blaze/db/tx_cache_test.clj | 10 +--- .../test/blaze/db/tx_log/local/codec_test.clj | 9 +-- .../db/test/blaze/db/tx_log/local_test.clj | 9 +-- modules/executor/deps.edn | 4 +- .../executor/test/blaze/executors_test.clj | 10 +--- .../blaze/terminology_service/extern_test.clj | 9 +-- .../test/blaze/fhir_client_test.clj | 9 +-- .../fhir-path/test/blaze/fhir_path_test.clj | 9 +-- .../test-perf/blaze/fhir/hash_test_perf.clj | 5 +- .../blaze/fhir/spec/type_test_mem.clj | 5 +- .../test-perf/blaze/fhir/spec_test_perf.clj | 5 +- .../test/blaze/fhir/hash_test.clj | 9 +-- .../test/blaze/fhir/spec/impl/intern_test.clj | 11 +--- .../test/blaze/fhir/spec/impl_test.clj | 10 +--- .../test/blaze/fhir/spec/type/json_test.clj | 10 +--- .../test/blaze/fhir/spec/type/system_test.clj | 13 ++--- .../test/blaze/fhir/spec/type_test.clj | 10 +--- .../test/blaze/fhir/spec_test.clj | 9 +-- .../test/blaze/http_client_test.clj | 12 +--- .../test/blaze/interaction/create_test.clj | 9 +-- .../test/blaze/interaction/delete_test.clj | 9 +-- .../interaction/history/instance_test.clj | 9 +-- .../blaze/interaction/history/system_test.clj | 9 +-- .../blaze/interaction/history/type_test.clj | 9 +-- .../blaze/interaction/history/util_test.clj | 9 +-- .../test/blaze/interaction/read_test.clj | 9 +-- .../blaze/interaction/search/include_test.clj | 9 +-- .../blaze/interaction/search/nav_test.clj | 9 +-- .../search/params/include_test.clj | 9 +-- .../blaze/interaction/search/params_test.clj | 10 +--- .../interaction/search_compartment_test.clj | 9 +-- .../blaze/interaction/search_system_test.clj | 9 +-- .../blaze/interaction/search_type_test.clj | 9 +-- .../transaction/bundle/links_test.clj | 9 +-- .../transaction/bundle/url_test.clj | 9 +-- .../interaction/transaction/bundle_test.clj | 9 +-- .../blaze/interaction/transaction_test.clj | 9 +-- .../test/blaze/interaction/update_test.clj | 9 +-- .../test/blaze/interaction/util_test.clj | 11 +--- modules/jepsen/deps.edn | 6 +- .../test/blaze/jepsen/register_test.clj | 9 +-- modules/kv/test/blaze/db/kv/mem_test.clj | 10 +--- modules/luid/deps.edn | 4 +- modules/luid/test/blaze/luid_test.clj | 9 +-- .../metrics/test/blaze/metrics/core_test.clj | 9 +-- .../test/blaze/metrics/handler_test.clj | 10 +--- .../test/blaze/metrics/registry_test.clj | 4 +- .../test/blaze/openid_auth/impl_test.clj | 9 +-- .../test/blaze/openid_auth_test.clj | 10 +--- .../operation/evaluate_measure/cql_test.clj | 10 +--- .../measure/stratifier_test.clj | 10 +--- .../evaluate_measure/measure/util_test.clj | 10 +--- .../evaluate_measure/measure_test.clj | 9 +-- .../middleware/params_test.clj | 9 +-- .../fhir/operation/evaluate_measure_test.clj | 10 +--- .../blaze/page_store/cassandra/codec_test.clj | 10 +--- .../test/blaze/page_store/cassandra_test.clj | 10 +--- .../test/blaze/page_store/local_test.clj | 10 +--- .../test/blaze/rest_api/capabilities_test.clj | 10 +--- .../rest_api/middleware/auth_guard_test.clj | 9 +-- .../middleware/batch_handler_test.clj | 9 +-- .../blaze/rest_api/middleware/cors_test.clj | 9 +-- .../rest_api/middleware/forwarded_test.clj | 31 +++++----- .../blaze/rest_api/middleware/log_test.clj | 9 +-- .../blaze/rest_api/middleware/output_test.clj | 9 +-- .../rest_api/middleware/resource_test.clj | 9 +-- .../test/blaze/rest_api/routes_test.clj | 19 +++---- modules/rest-api/test/blaze/rest_api_test.clj | 10 +--- .../test/blaze/fhir/response/create_test.clj | 9 +-- .../test/blaze/handler/fhir/util_test.clj | 9 +-- .../test/blaze/handler/util_test.clj | 12 +--- .../rest-util/test/blaze/http/util_test.clj | 9 +-- .../test/blaze/middleware/fhir/error_test.clj | 9 +-- .../blaze/middleware/fhir/metrics_test.clj | 9 +-- .../test/blaze/db/kv/rocksdb/impl_test.clj | 57 +++++++++---------- .../test/blaze/db/kv/rocksdb/metrics_test.clj | 11 +--- .../rocksdb/test/blaze/db/kv/rocksdb_test.clj | 10 +--- .../scheduler/test/blaze/scheduler_test.clj | 10 +--- modules/server/test/blaze/server_test.clj | 10 +--- modules/test-util/src/blaze/test_util.clj | 10 +++- .../thread_pool_executor_collector_test.clj | 10 +--- test/blaze/handler/app_test.clj | 10 +--- test/blaze/handler/health_test.clj | 10 +--- test/blaze/system_test.clj | 10 +--- 139 files changed, 320 insertions(+), 1081 deletions(-) diff --git a/modules/anomaly/test/blaze/anomaly_test.clj b/modules/anomaly/test/blaze/anomaly_test.clj index 8dd940e96..1d81e5038 100644 --- a/modules/anomaly/test/blaze/anomaly_test.clj +++ b/modules/anomaly/test/blaze/anomaly_test.clj @@ -2,6 +2,7 @@ (:require [blaze.anomaly :as ba :refer [if-ok when-ok]] [blaze.anomaly-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -13,13 +14,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest anomaly?-test diff --git a/modules/async/test/blaze/async/comp_test.clj b/modules/async/test/blaze/async/comp_test.clj index 6d7dbb20a..38326438d 100644 --- a/modules/async/test/blaze/async/comp_test.clj +++ b/modules/async/test/blaze/async/comp_test.clj @@ -4,7 +4,7 @@ [blaze.async.comp :as ac :refer [do-sync]] [blaze.async.comp-spec] [blaze.executors :as ex] - [blaze.test-util :refer [given-failed-future]] + [blaze.test-util :as tu :refer [given-failed-future]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom]) @@ -16,13 +16,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest completed-future-test diff --git a/modules/async/test/blaze/async/flow_test.clj b/modules/async/test/blaze/async/flow_test.clj index d537748f6..ced00d63b 100644 --- a/modules/async/test/blaze/async/flow_test.clj +++ b/modules/async/test/blaze/async/flow_test.clj @@ -2,6 +2,7 @@ (:require [blaze.async.flow :as flow] [blaze.async.flow-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]]) (:import @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest processor-test diff --git a/modules/byte-buffer/test/blaze/byte_buffer_test.clj b/modules/byte-buffer/test/blaze/byte_buffer_test.clj index 77caa7a64..0990f8a43 100644 --- a/modules/byte-buffer/test/blaze/byte_buffer_test.clj +++ b/modules/byte-buffer/test/blaze/byte_buffer_test.clj @@ -1,7 +1,7 @@ (ns blaze.byte-buffer-test (:require [blaze.byte-buffer :as bb] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [clojure.test.check.generators :as gen] @@ -11,13 +11,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest limit-test diff --git a/modules/cassandra/test/blaze/cassandra/config_test.clj b/modules/cassandra/test/blaze/cassandra/config_test.clj index e41f65cfb..ab61d6aec 100644 --- a/modules/cassandra/test/blaze/cassandra/config_test.clj +++ b/modules/cassandra/test/blaze/cassandra/config_test.clj @@ -1,8 +1,9 @@ (ns blaze.cassandra.config-test (:require [blaze.cassandra.config :as config] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [deftest are testing]] + [clojure.test :as test :refer [are deftest testing]] [java-time.api :as time]) (:import [com.datastax.oss.driver.api.core.config OptionsMap TypedDriverOption] @@ -13,13 +14,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest options-test diff --git a/modules/cassandra/test/blaze/cassandra/session_test.clj b/modules/cassandra/test/blaze/cassandra/session_test.clj index ed512fe06..26f87fbb7 100644 --- a/modules/cassandra/test/blaze/cassandra/session_test.clj +++ b/modules/cassandra/test/blaze/cassandra/session_test.clj @@ -2,28 +2,23 @@ (:require [blaze.cassandra.session :as session] [blaze.cassandra.session-spec] + [blaze.test-util :as tu] [clojure.core.protocols :as p] [clojure.datafy :as datafy] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] [juxt.iota :refer [given]]) (:import - [com.datastax.oss.driver.api.core CqlSessionBuilder CqlIdentifier] - [com.datastax.oss.driver.api.core.session SessionBuilder] - [com.datastax.oss.driver.api.core.metadata EndPoint])) + [com.datastax.oss.driver.api.core CqlIdentifier CqlSessionBuilder] + [com.datastax.oss.driver.api.core.metadata EndPoint] + [com.datastax.oss.driver.api.core.session SessionBuilder])) (set! *warn-on-reflection* true) (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- get-field diff --git a/modules/cassandra/test/blaze/cassandra_test.clj b/modules/cassandra/test/blaze/cassandra_test.clj index 79fed4797..ca2e5280f 100644 --- a/modules/cassandra/test/blaze/cassandra_test.clj +++ b/modules/cassandra/test/blaze/cassandra_test.clj @@ -5,7 +5,7 @@ [blaze.byte-buffer :as bb] [blaze.cassandra :as cass] [blaze.cassandra-spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [clojure.test.check.generators :as gen] @@ -29,13 +29,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest prepare-test diff --git a/modules/coll/deps.edn b/modules/coll/deps.edn index 2af1d55af..6d752b19f 100644 --- a/modules/coll/deps.edn +++ b/modules/coll/deps.edn @@ -3,7 +3,11 @@ :aliases {:test - {:extra-paths ["test"]} + {:extra-paths ["test"] + + :extra-deps + {blaze/test-util + {:local/root "../test-util"}}} :kaocha {:extra-deps diff --git a/modules/coll/test/blaze/coll/core_test.clj b/modules/coll/test/blaze/coll/core_test.clj index 7a6e0805d..acecef718 100644 --- a/modules/coll/test/blaze/coll/core_test.clj +++ b/modules/coll/test/blaze/coll/core_test.clj @@ -1,6 +1,7 @@ (ns blaze.coll.core-test (:require [blaze.coll.core :as coll] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]])) @@ -8,13 +9,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest first-test diff --git a/modules/cql/test/blaze/cql_translator_test.clj b/modules/cql/test/blaze/cql_translator_test.clj index fdd17ef31..3bbf75bc7 100644 --- a/modules/cql/test/blaze/cql_translator_test.clj +++ b/modules/cql/test/blaze/cql_translator_test.clj @@ -2,6 +2,7 @@ (:require [blaze.cql-translator :refer [translate]] [blaze.cql-translator-spec] + [blaze.test-util :as tu] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmacro given-translation [cql & body] diff --git a/modules/cql/test/blaze/elm/equiv_relationships_test.clj b/modules/cql/test/blaze/elm/equiv_relationships_test.clj index e1827f054..a60002da0 100644 --- a/modules/cql/test/blaze/elm/equiv_relationships_test.clj +++ b/modules/cql/test/blaze/elm/equiv_relationships_test.clj @@ -4,6 +4,7 @@ [blaze.elm.equiv-relationships-spec] [blaze.elm.literal :as elm] [blaze.elm.literal-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]])) @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest split-by-first-equal-expression-test diff --git a/modules/cql/test/blaze/elm/list_test.clj b/modules/cql/test/blaze/elm/list_test.clj index 6b1f2b104..42a895a0d 100644 --- a/modules/cql/test/blaze/elm/list_test.clj +++ b/modules/cql/test/blaze/elm/list_test.clj @@ -4,6 +4,7 @@ [blaze.elm.compiler] [blaze.elm.list] [blaze.elm.protocols :as p] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]])) @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) ;; 12.1. Equal diff --git a/modules/cql/test/blaze/elm/normalizer_test.clj b/modules/cql/test/blaze/elm/normalizer_test.clj index 1b838c166..906de5051 100644 --- a/modules/cql/test/blaze/elm/normalizer_test.clj +++ b/modules/cql/test/blaze/elm/normalizer_test.clj @@ -6,6 +6,7 @@ [blaze.elm.literal-spec] [blaze.elm.normalizer :refer [normalize]] [blaze.elm.normalizer-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]])) @@ -14,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def expression-1 diff --git a/modules/cql/test/blaze/elm/quantity_test.clj b/modules/cql/test/blaze/elm/quantity_test.clj index da90fef3d..702aee904 100644 --- a/modules/cql/test/blaze/elm/quantity_test.clj +++ b/modules/cql/test/blaze/elm/quantity_test.clj @@ -2,6 +2,7 @@ (:require [blaze.elm.protocols :as p] [blaze.elm.quantity :as quantity] + [blaze.test-util :as tu] [clojure.java.io :as io] [clojure.spec.test.alpha :as st] [clojure.string :as str] @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest quantity-test diff --git a/modules/cql/test/blaze/elm/spec_test.clj b/modules/cql/test/blaze/elm/spec_test.clj index 2d1331e4c..0510d3b88 100644 --- a/modules/cql/test/blaze/elm/spec_test.clj +++ b/modules/cql/test/blaze/elm/spec_test.clj @@ -3,6 +3,7 @@ [blaze.elm.literal] [blaze.elm.literal-spec] [blaze.elm.spec] + [blaze.test-util :as tu] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest literal-test @@ -87,7 +82,7 @@ (testing "valid" (are [x] (s/valid? :elm/expression x) #elm/instance ["{urn:hl7-org:elm-types:r1}Code" - {"system" #elm/string "foo" "code" #elm/string "bar"}])) + {"system" #elm/string "foo" "code" #elm/string "bar"}])) (testing "invalid" (given (s/explain-data :elm/expression {:type "Instance"}) diff --git a/modules/cql/test/blaze/elm/util_test.clj b/modules/cql/test/blaze/elm/util_test.clj index e3a4386c2..791574912 100644 --- a/modules/cql/test/blaze/elm/util_test.clj +++ b/modules/cql/test/blaze/elm/util_test.clj @@ -2,6 +2,7 @@ (:require [blaze.elm.util :as elm-util] [blaze.elm.util-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]])) @@ -9,13 +10,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest parse-qualified-name-test diff --git a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra/statement_test.clj b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra/statement_test.clj index a84932140..49373a663 100644 --- a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra/statement_test.clj +++ b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra/statement_test.clj @@ -1,6 +1,7 @@ (ns blaze.db.resource-store.cassandra.statement-test (:require [blaze.db.resource-store.cassandra.statement :as statement] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest are]]) (:import @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest put-statement-test diff --git a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj index 1d0c84c07..66deb3bf1 100644 --- a/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj +++ b/modules/db-resource-store-cassandra/test/blaze/db/resource_store/cassandra_test.clj @@ -36,17 +36,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn hash [s] diff --git a/modules/db-resource-store/test/blaze/db/resource_store/cbor_test.clj b/modules/db-resource-store/test/blaze/db/resource_store/cbor_test.clj index 02afc73da..b4b09dd70 100644 --- a/modules/db-resource-store/test/blaze/db/resource_store/cbor_test.clj +++ b/modules/db-resource-store/test/blaze/db/resource_store/cbor_test.clj @@ -3,6 +3,7 @@ encoding for the Resource Store." (:require [blaze.fhir.spec] + [blaze.test-util :as tu] [clj-cbor.core :as cbor] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] @@ -14,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private cbor-object-mapper diff --git a/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj b/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj index 9b35170ec..52f6ecc4b 100644 --- a/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj +++ b/modules/db-resource-store/test/blaze/db/resource_store/kv_test.clj @@ -29,17 +29,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- hash diff --git a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/codec_test.clj b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/codec_test.clj index efaddf666..746950c8c 100644 --- a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/codec_test.clj +++ b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/codec_test.clj @@ -2,7 +2,7 @@ (:require [blaze.db.tx-log.kafka.codec :as codec] [blaze.db.tx-log.spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -13,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- serialize [tx-cmds] diff --git a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/config_test.clj b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/config_test.clj index 9894e34dc..d5f8c8d88 100644 --- a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/config_test.clj +++ b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/config_test.clj @@ -2,6 +2,7 @@ (:require [blaze.db.tx-log.kafka.config :as c] [blaze.fhir.hash-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]])) @@ -10,13 +11,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest producer-config-test diff --git a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/util_test.clj b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/util_test.clj index b84412a34..268d672b9 100644 --- a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/util_test.clj +++ b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka/util_test.clj @@ -18,17 +18,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def hash-patient-0 (hash/generate {:fhir/type :fhir/Patient :id "0"})) diff --git a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj index 83deced4f..06de182a3 100644 --- a/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj +++ b/modules/db-tx-log-kafka/test/blaze/db/tx_log/kafka_test.clj @@ -29,17 +29,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def bootstrap-servers "bootstrap-servers-182741") diff --git a/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj b/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj index fb7ab9186..c3a8615e9 100644 --- a/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj +++ b/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj @@ -11,17 +11,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest t-test (are [x] (s/valid? :blaze.db/t x) diff --git a/modules/db-tx-log/test/blaze/db/tx_log_test.clj b/modules/db-tx-log/test/blaze/db/tx_log_test.clj index 8e41ab0a5..78f271bdf 100644 --- a/modules/db-tx-log/test/blaze/db/tx_log_test.clj +++ b/modules/db-tx-log/test/blaze/db/tx_log_test.clj @@ -15,16 +15,9 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def patient-hash-0 (hash/generate {:fhir/type :fhir/Patient :id "0"})) diff --git a/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj b/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj index 1b04d145d..c37fde9f5 100644 --- a/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj +++ b/modules/db/test-perf/blaze/db/impl/index/resource_handle_test_perf.clj @@ -2,6 +2,7 @@ (:require [blaze.byte-buffer :as bb] [blaze.db.impl.index.resource-handle :as rh] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] [cuerdas.core :as c-str]) @@ -13,13 +14,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- total-size [& xs] diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index 238c55fd2..190e04e3b 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -23,7 +23,7 @@ [blaze.fhir.spec.type :as type] [blaze.fhir.structure-definition-repo] [blaze.log] - [blaze.test-util :refer [given-failed-future with-system]] + [blaze.test-util :as tu :refer [given-failed-future with-system]] [clojure.math :as math] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] @@ -40,13 +40,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmethod ig/init-key ::slow-resource-store [_ {:keys [resource-store]}] @@ -934,20 +928,20 @@ ;; TODO: fix this https://github.com/samply/blaze/issues/904 #_(testing "sorting by _lastUpdated returns only the newest version of the patient" - (with-system-data [{:blaze.db/keys [node]} (with-system-clock system)] - [[[:put {:fhir/type :fhir/Patient :id "0"}]] - [[:put {:fhir/type :fhir/Patient :id "1"}]]] + (with-system-data [{:blaze.db/keys [node]} (with-system-clock system)] + [[[:put {:fhir/type :fhir/Patient :id "0"}]] + [[:put {:fhir/type :fhir/Patient :id "1"}]]] - ;; we have to sleep more than one second here because dates are index only with second resolution - (Thread/sleep 2000) - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + ;; we have to sleep more than one second here because dates are index only with second resolution + (Thread/sleep 2000) + @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - (doseq [dir [:asc :desc]] - (given (pull-type-query node "Patient" [[:sort "_lastUpdated" dir]]) - count := 2 - [0 :fhir/type] := :fhir/Patient - [0 :id] := "0" - [0 :active] := false)))) + (doseq [dir [:asc :desc]] + (given (pull-type-query node "Patient" [[:sort "_lastUpdated" dir]]) + count := 2 + [0 :fhir/type] := :fhir/Patient + [0 :id] := "0" + [0 :active] := false)))) (testing "a node with three patients in one transaction" (with-system-data [{:blaze.db/keys [node]} system] diff --git a/modules/db/test/blaze/db/cache_collector_test.clj b/modules/db/test/blaze/db/cache_collector_test.clj index d0908d275..e7f2b00a0 100644 --- a/modules/db/test/blaze/db/cache_collector_test.clj +++ b/modules/db/test/blaze/db/cache_collector_test.clj @@ -2,7 +2,7 @@ (:require [blaze.db.cache-collector] [blaze.metrics.core :as metrics] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] @@ -17,13 +17,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^Cache cache (-> (Caffeine/newBuilder) (.recordStats) (.build))) diff --git a/modules/db/test/blaze/db/impl/codec/date_test.clj b/modules/db/test/blaze/db/impl/codec/date_test.clj index 09831c950..1b73cbead 100644 --- a/modules/db/test/blaze/db/impl/codec/date_test.clj +++ b/modules/db/test/blaze/db/impl/codec/date_test.clj @@ -4,7 +4,7 @@ [blaze.db.impl.codec-spec] [blaze.db.impl.codec.date :as codec-date] [blaze.db.impl.index.search-param-value-resource-spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] @@ -17,13 +17,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest encode-lower-bound-test diff --git a/modules/db/test/blaze/db/impl/codec_test.clj b/modules/db/test/blaze/db/impl/codec_test.clj index d12a405eb..3d614c489 100644 --- a/modules/db/test/blaze/db/impl/codec_test.clj +++ b/modules/db/test/blaze/db/impl/codec_test.clj @@ -4,7 +4,7 @@ [blaze.db.impl.codec :as codec] [blaze.db.impl.codec-spec] [blaze.db.impl.index.search-param-value-resource-spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] @@ -18,13 +18,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmacro check diff --git a/modules/db/test/blaze/db/impl/index/resource_handle_test.clj b/modules/db/test/blaze/db/impl/index/resource_handle_test.clj index 60be894b8..931785444 100644 --- a/modules/db/test/blaze/db/impl/index/resource_handle_test.clj +++ b/modules/db/test/blaze/db/impl/index/resource_handle_test.clj @@ -12,16 +12,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private hash diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj index 73d7e1457..a7e74a45d 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj @@ -5,7 +5,7 @@ [blaze.db.impl.index.search-param-value-resource :as sp-vr] [blaze.db.impl.index.search-param-value-resource-spec] [blaze.db.impl.index.search-param-value-resource.impl :as impl] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest id-size-test diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj index b1e8851d7..d93d7bf72 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj @@ -6,7 +6,7 @@ [blaze.db.impl.index.search-param-value-resource :as sp-vr] [blaze.db.impl.index.search-param-value-resource-spec] [blaze.fhir.hash :as hash] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] @@ -17,13 +17,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- create-prefix [c-hash tid value] diff --git a/modules/db/test/blaze/db/impl/index/t_by_instant_test.clj b/modules/db/test/blaze/db/impl/index/t_by_instant_test.clj index 155d6409c..114fa83d4 100644 --- a/modules/db/test/blaze/db/impl/index/t_by_instant_test.clj +++ b/modules/db/test/blaze/db/impl/index/t_by_instant_test.clj @@ -4,7 +4,7 @@ [blaze.db.kv :as kv] [blaze.db.kv.mem] [blaze.db.kv.mem-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]]) (:import @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/impl/index/tx_error_test.clj b/modules/db/test/blaze/db/impl/index/tx_error_test.clj index a0e0c1184..17753c2f1 100644 --- a/modules/db/test/blaze/db/impl/index/tx_error_test.clj +++ b/modules/db/test/blaze/db/impl/index/tx_error_test.clj @@ -5,7 +5,7 @@ [blaze.db.kv :as kv] [blaze.db.kv.mem] [blaze.db.kv.mem-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/impl/index/tx_success_test.clj b/modules/db/test/blaze/db/impl/index/tx_success_test.clj index dafc7f97a..809b975c2 100644 --- a/modules/db/test/blaze/db/impl/index/tx_success_test.clj +++ b/modules/db/test/blaze/db/impl/index/tx_success_test.clj @@ -6,7 +6,7 @@ [blaze.db.kv.mem] [blaze.db.kv.mem-spec] [blaze.db.tx-cache] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] @@ -19,13 +19,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/impl/iterators_test.clj b/modules/db/test/blaze/db/impl/iterators_test.clj index 64ccb2317..4477d20b4 100644 --- a/modules/db/test/blaze/db/impl/iterators_test.clj +++ b/modules/db/test/blaze/db/impl/iterators_test.clj @@ -7,7 +7,7 @@ [blaze.db.kv :as kv] [blaze.db.kv.mem] [blaze.db.kv.mem-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]])) @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/impl/search_param/composite_test.clj b/modules/db/test/blaze/db/impl/search_param/composite_test.clj index 8a3e9737f..b262c5966 100644 --- a/modules/db/test/blaze/db/impl/search_param/composite_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/composite_test.clj @@ -16,7 +16,7 @@ [blaze.fhir.hash-spec] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] [cognitect.anomalies :as anom] @@ -31,13 +31,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn code-value-quantity-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/date_test.clj b/modules/db/test/blaze/db/impl/search_param/date_test.clj index b1a274080..ce1df21f0 100644 --- a/modules/db/test/blaze/db/impl/search_param/date_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/date_test.clj @@ -15,7 +15,7 @@ [blaze.fhir.hash :as hash] [blaze.fhir.hash-spec] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -31,13 +31,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn birth-date-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/list_test.clj b/modules/db/test/blaze/db/impl/search_param/list_test.clj index 3025de6d0..57b8106b7 100644 --- a/modules/db/test/blaze/db/impl/search_param/list_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/list_test.clj @@ -4,7 +4,7 @@ [blaze.db.impl.search-param-spec] [blaze.db.search-param-registry :as sr] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] [integrant.core :as ig] @@ -16,13 +16,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn list-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/number_test.clj b/modules/db/test/blaze/db/impl/search_param/number_test.clj index 551e8ef7f..12ec6017b 100644 --- a/modules/db/test/blaze/db/impl/search_param/number_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/number_test.clj @@ -15,7 +15,7 @@ [blaze.fhir.hash-spec] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn probability-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj index 60724a682..6fc36651d 100644 --- a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj @@ -15,7 +15,7 @@ [blaze.fhir.hash-spec] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/impl/search_param/string_test.clj b/modules/db/test/blaze/db/impl/search_param/string_test.clj index 8dcae54fc..83dcd949f 100644 --- a/modules/db/test/blaze/db/impl/search_param/string_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/string_test.clj @@ -14,7 +14,7 @@ [blaze.fhir.hash :as hash] [blaze.fhir.hash-spec] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clj-fuzzy.phonetics :as phonetics] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn phonetic-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/token_test.clj b/modules/db/test/blaze/db/impl/search_param/token_test.clj index d8b48137a..c3b5eeffa 100644 --- a/modules/db/test/blaze/db/impl/search_param/token_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/token_test.clj @@ -15,7 +15,7 @@ [blaze.fhir.hash-spec] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn code-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/util_test.clj b/modules/db/test/blaze/db/impl/search_param/util_test.clj index 35f91f33c..0a2c4a434 100644 --- a/modules/db/test/blaze/db/impl/search_param/util_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/util_test.clj @@ -2,6 +2,7 @@ (:require [blaze.db.impl.search-param.util :as util] [blaze.db.impl.search-param.util-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is]] [taoensso.timbre :as log])) @@ -11,13 +12,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest separate-op-test diff --git a/modules/db/test/blaze/db/impl/search_param_test.clj b/modules/db/test/blaze/db/impl/search_param_test.clj index 7226e5c74..b59da92a6 100644 --- a/modules/db/test/blaze/db/impl/search_param_test.clj +++ b/modules/db/test/blaze/db/impl/search_param_test.clj @@ -13,7 +13,7 @@ [blaze.fhir.hash-spec] [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [integrant.core :as ig] @@ -24,13 +24,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn birthdate [search-param-registry] diff --git a/modules/db/test/blaze/db/node/resource_indexer_test.clj b/modules/db/test/blaze/db/node/resource_indexer_test.clj index ffe01640d..84d094b92 100644 --- a/modules/db/test/blaze/db/node/resource_indexer_test.clj +++ b/modules/db/test/blaze/db/node/resource_indexer_test.clj @@ -26,7 +26,7 @@ [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] [blaze.metrics.spec] - [blaze.test-util :refer [given-failed-future given-thrown with-system]] + [blaze.test-util :as tu :refer [given-failed-future given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -42,13 +42,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/db/test/blaze/db/node/transaction_test.clj b/modules/db/test/blaze/db/node/transaction_test.clj index 4a8a8615a..df5a141af 100644 --- a/modules/db/test/blaze/db/node/transaction_test.clj +++ b/modules/db/test/blaze/db/node/transaction_test.clj @@ -13,16 +13,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def context diff --git a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj index 1648989bf..971aa59f1 100644 --- a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj +++ b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj @@ -29,7 +29,7 @@ [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] [blaze.log] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [clojure.walk :as walk] @@ -42,13 +42,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def tid-patient (codec/tid "Patient")) diff --git a/modules/db/test/blaze/db/node/validation_test.clj b/modules/db/test/blaze/db/node/validation_test.clj index 0f9e7958d..8701d7a19 100644 --- a/modules/db/test/blaze/db/node/validation_test.clj +++ b/modules/db/test/blaze/db/node/validation_test.clj @@ -2,6 +2,7 @@ (:require [blaze.db.node.validation :as validation] [blaze.db.node.validation-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest validate-ops-test diff --git a/modules/db/test/blaze/db/node_test.clj b/modules/db/test/blaze/db/node_test.clj index f597f0d46..6c21144a1 100644 --- a/modules/db/test/blaze/db/node_test.clj +++ b/modules/db/test/blaze/db/node_test.clj @@ -28,7 +28,7 @@ [blaze.fhir.structure-definition-repo] [blaze.log] [blaze.metrics.spec] - [blaze.test-util :refer [given-failed-future given-thrown with-system]] + [blaze.test-util :as tu :refer [given-failed-future given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -45,13 +45,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmethod ig/init-key ::resource-store-failing-on-get [_ _] diff --git a/modules/db/test/blaze/db/resource_cache_test.clj b/modules/db/test/blaze/db/resource_cache_test.clj index 9a6f6bd60..52e7b5e3d 100644 --- a/modules/db/test/blaze/db/resource_cache_test.clj +++ b/modules/db/test/blaze/db/resource_cache_test.clj @@ -19,17 +19,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def patient-0 {:fhir/type :fhir/Patient :id "0"}) diff --git a/modules/db/test/blaze/db/resource_handle_cache_test.clj b/modules/db/test/blaze/db/resource_handle_cache_test.clj index 8ae5490d1..73b6a1bfd 100644 --- a/modules/db/test/blaze/db/resource_handle_cache_test.clj +++ b/modules/db/test/blaze/db/resource_handle_cache_test.clj @@ -1,7 +1,7 @@ (ns blaze.db.resource-handle-cache-test (:require [blaze.db.resource-handle-cache] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -15,13 +15,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/search_param_registry_test.clj b/modules/db/test/blaze/db/search_param_registry_test.clj index 08739c439..14a0edf83 100644 --- a/modules/db/test/blaze/db/search_param_registry_test.clj +++ b/modules/db/test/blaze/db/search_param_registry_test.clj @@ -6,7 +6,7 @@ [blaze.fhir.spec.type] [blaze.fhir.structure-definition-repo] [blaze.fhir.structure-definition-repo.spec :refer [structure-definition-repo?]] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] @@ -20,13 +20,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/db/test/blaze/db/tx_cache_test.clj b/modules/db/test/blaze/db/tx_cache_test.clj index 05b6a8f98..755e54ee0 100644 --- a/modules/db/test/blaze/db/tx_cache_test.clj +++ b/modules/db/test/blaze/db/tx_cache_test.clj @@ -3,7 +3,7 @@ [blaze.db.kv :as kv] [blaze.db.kv.mem] [blaze.db.tx-cache] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -18,13 +18,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/db/test/blaze/db/tx_log/local/codec_test.clj b/modules/db/test/blaze/db/tx_log/local/codec_test.clj index df00ca526..3b77bcef9 100644 --- a/modules/db/test/blaze/db/tx_log/local/codec_test.clj +++ b/modules/db/test/blaze/db/tx_log/local/codec_test.clj @@ -2,6 +2,7 @@ (:require [blaze.byte-buffer :as bb] [blaze.db.tx-log.local.codec :as codec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]] @@ -14,13 +15,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def t diff --git a/modules/db/test/blaze/db/tx_log/local_test.clj b/modules/db/test/blaze/db/tx_log/local_test.clj index aab86b258..343c35a01 100644 --- a/modules/db/test/blaze/db/tx_log/local_test.clj +++ b/modules/db/test/blaze/db/tx_log/local_test.clj @@ -30,17 +30,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private cbor-object-mapper diff --git a/modules/executor/deps.edn b/modules/executor/deps.edn index f533e4541..d20337169 100644 --- a/modules/executor/deps.edn +++ b/modules/executor/deps.edn @@ -3,8 +3,8 @@ {:extra-paths ["test"] :extra-deps - {org.clojars.akiel/iota - {:mvn/version "0.1"}}} + {blaze/test-util + {:local/root "../test-util"}}} :kaocha {:extra-deps diff --git a/modules/executor/test/blaze/executors_test.clj b/modules/executor/test/blaze/executors_test.clj index 6cb90112c..8d432513a 100644 --- a/modules/executor/test/blaze/executors_test.clj +++ b/modules/executor/test/blaze/executors_test.clj @@ -2,6 +2,7 @@ (:require [blaze.executors :as ex] [blaze.executors-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]]) (:import @@ -9,15 +10,10 @@ (set! *warn-on-reflection* true) +(st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest executor-test diff --git a/modules/extern-terminology-service/test/blaze/terminology_service/extern_test.clj b/modules/extern-terminology-service/test/blaze/terminology_service/extern_test.clj index faa01703a..28220f44f 100644 --- a/modules/extern-terminology-service/test/blaze/terminology_service/extern_test.clj +++ b/modules/extern-terminology-service/test/blaze/terminology_service/extern_test.clj @@ -16,17 +16,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmethod ig/init-key ::http-client [_ _] diff --git a/modules/fhir-client/test/blaze/fhir_client_test.clj b/modules/fhir-client/test/blaze/fhir_client_test.clj index 02a74d99b..76d703178 100644 --- a/modules/fhir-client/test/blaze/fhir_client_test.clj +++ b/modules/fhir-client/test/blaze/fhir_client_test.clj @@ -17,17 +17,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest metadata-test diff --git a/modules/fhir-path/test/blaze/fhir_path_test.clj b/modules/fhir-path/test/blaze/fhir_path_test.clj index eb6186f4b..8ad24c670 100644 --- a/modules/fhir-path/test/blaze/fhir_path_test.clj +++ b/modules/fhir-path/test/blaze/fhir_path_test.clj @@ -16,17 +16,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private resolver diff --git a/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj b/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj index 362359582..59fbac950 100644 --- a/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj +++ b/modules/fhir-structure/test-perf/blaze/fhir/hash_test_perf.clj @@ -1,13 +1,10 @@ (ns blaze.fhir.hash-test-perf (:require [blaze.fhir.hash :as hash] - [blaze.test-util :as tu] + [blaze.test-util] [criterium.core :as criterium])) -(tu/init-fhir-specs) - - (def observation {:fhir/type :fhir/Observation :id "DACG22233TWT7CK4" diff --git a/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj b/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj index 778c1f9b3..106e679e5 100644 --- a/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj +++ b/modules/fhir-structure/test-perf/blaze/fhir/spec/type_test_mem.clj @@ -5,14 +5,11 @@ [clojure.test :refer [are deftest is testing]] [cuerdas.core :as c-str] [clojure.alpha.spec :as s2] - [blaze.test-util :as tu]) + [blaze.test-util]) (:import [java.time Instant ZoneOffset])) -(tu/init-fhir-specs) - - (deftest mem-test (are [x size] (= (mem/total-size x) size) #fhir/integer 1 16 diff --git a/modules/fhir-structure/test-perf/blaze/fhir/spec_test_perf.clj b/modules/fhir-structure/test-perf/blaze/fhir/spec_test_perf.clj index 9c3d41060..f3cc463bf 100644 --- a/modules/fhir-structure/test-perf/blaze/fhir/spec_test_perf.clj +++ b/modules/fhir-structure/test-perf/blaze/fhir/spec_test_perf.clj @@ -1,14 +1,11 @@ (ns blaze.fhir.spec-test-perf (:require [blaze.fhir.spec :as fhir-spec] - [blaze.test-util :as tu] + [blaze.test-util] [clojure.alpha.spec :as s2] [criterium.core :as criterium])) -(tu/init-fhir-specs) - - (defn- bench-unform-json [x] (apply format "%.3f µs <> %.3f µs" (map #(* % 1e6) (second (:mean (criterium/benchmark (fhir-spec/unform-json x) {})))))) diff --git a/modules/fhir-structure/test/blaze/fhir/hash_test.clj b/modules/fhir-structure/test/blaze/fhir/hash_test.clj index 656d95c31..1fcba44f1 100644 --- a/modules/fhir-structure/test/blaze/fhir/hash_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/hash_test.clj @@ -14,16 +14,9 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest from-hex diff --git a/modules/fhir-structure/test/blaze/fhir/spec/impl/intern_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/impl/intern_test.clj index 80aef82fc..311b4ac08 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/impl/intern_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/impl/intern_test.clj @@ -2,23 +2,18 @@ (:require [blaze.executors :as ex] [blaze.fhir.spec.impl.intern :as intern] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]]) (:import - [java.util.concurrent TimeUnit CountDownLatch])) + [java.util.concurrent CountDownLatch TimeUnit])) (set! *warn-on-reflection* true) (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defrecord TestType [x]) diff --git a/modules/fhir-structure/test/blaze/fhir/spec/impl_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/impl_test.clj index 50d9f6b03..cca106ee3 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/impl_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/impl_test.clj @@ -8,7 +8,7 @@ [blaze.fhir.spec.impl.xml-spec] [blaze.fhir.spec.type :as type] [blaze.fhir.structure-definition-repo :as u] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.alpha.spec :as s2] [clojure.data.xml.name :as xml-name] [clojure.data.xml.node :as xml-node] @@ -26,13 +26,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- regexes->str diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type/json_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type/json_test.clj index 50e65a973..b8f27d1a6 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type/json_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type/json_test.clj @@ -1,7 +1,7 @@ (ns blaze.fhir.spec.type.json-test (:require [blaze.fhir.spec.type.json :as json] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [clojure.test.check.generators :as gen] @@ -14,13 +14,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest field-name-test diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj index 3f59b5e00..d93c5e623 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type/system_test.clj @@ -2,27 +2,22 @@ (:require [blaze.fhir.spec.type.system :as system] [blaze.fhir.spec.type.system-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] [java-time.api :as time]) (:import [com.google.common.hash Hashing] - [java.time LocalDate LocalDateTime Year YearMonth OffsetDateTime - ZoneOffset LocalTime])) + [java.time LocalDate LocalDateTime LocalTime OffsetDateTime Year + YearMonth ZoneOffset])) (set! *warn-on-reflection* true) (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn murmur3 [x] diff --git a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj index 41ec16691..00fc1af4b 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec/type_test.clj @@ -7,7 +7,7 @@ [blaze.fhir.spec.type.protocols :as p] [blaze.fhir.spec.type.system :as system] [blaze.fhir.spec.type.system.spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.data.xml.name :as xml-name] [clojure.data.xml.node :as xml-node] [clojure.data.xml.prxml :as prxml] @@ -34,13 +34,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn murmur3 [x] diff --git a/modules/fhir-structure/test/blaze/fhir/spec_test.clj b/modules/fhir-structure/test/blaze/fhir/spec_test.clj index 50f0817f3..e1354a453 100644 --- a/modules/fhir-structure/test/blaze/fhir/spec_test.clj +++ b/modules/fhir-structure/test/blaze/fhir/spec_test.clj @@ -28,16 +28,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest parse-json-test diff --git a/modules/http-client/test/blaze/http_client_test.clj b/modules/http-client/test/blaze/http_client_test.clj index 7858ec33d..cb349e6f2 100644 --- a/modules/http-client/test/blaze/http_client_test.clj +++ b/modules/http-client/test/blaze/http_client_test.clj @@ -2,7 +2,7 @@ (:require [blaze.http-client] [blaze.http-client.spec] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.core.protocols :refer [Datafiable]] [clojure.datafy :refer [datafy]] [clojure.spec.alpha :as s] @@ -22,13 +22,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (extend-protocol Datafiable @@ -65,7 +59,7 @@ (testing "with 2 seconds connect timeout" (with-system [{:blaze/keys [http-client]} {:blaze/http-client {:connect-timeout 2000}}] (given (datafy http-client) - :connect-timeout := (time/millis 2000))))) + :connect-timeout := (time/millis 2000))))) (deftest spec-test diff --git a/modules/interaction/test/blaze/interaction/create_test.clj b/modules/interaction/test/blaze/interaction/create_test.clj index 5621eda9b..6da134eba 100644 --- a/modules/interaction/test/blaze/interaction/create_test.clj +++ b/modules/interaction/test/blaze/interaction/create_test.clj @@ -27,17 +27,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-134418") diff --git a/modules/interaction/test/blaze/interaction/delete_test.clj b/modules/interaction/test/blaze/interaction/delete_test.clj index a8762c11f..198612d6b 100644 --- a/modules/interaction/test/blaze/interaction/delete_test.clj +++ b/modules/interaction/test/blaze/interaction/delete_test.clj @@ -17,17 +17,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/interaction/test/blaze/interaction/history/instance_test.clj b/modules/interaction/test/blaze/interaction/history/instance_test.clj index 8a0189a7b..ea1cbd839 100644 --- a/modules/interaction/test/blaze/interaction/history/instance_test.clj +++ b/modules/interaction/test/blaze/interaction/history/instance_test.clj @@ -26,17 +26,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-135814") diff --git a/modules/interaction/test/blaze/interaction/history/system_test.clj b/modules/interaction/test/blaze/interaction/history/system_test.clj index b98258c74..7bae30be0 100644 --- a/modules/interaction/test/blaze/interaction/history/system_test.clj +++ b/modules/interaction/test/blaze/interaction/history/system_test.clj @@ -25,17 +25,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-135844") diff --git a/modules/interaction/test/blaze/interaction/history/type_test.clj b/modules/interaction/test/blaze/interaction/history/type_test.clj index 4d47aeb89..ce6d42863 100644 --- a/modules/interaction/test/blaze/interaction/history/type_test.clj +++ b/modules/interaction/test/blaze/interaction/history/type_test.clj @@ -25,17 +25,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-144600") diff --git a/modules/interaction/test/blaze/interaction/history/util_test.clj b/modules/interaction/test/blaze/interaction/history/util_test.clj index 90d46de59..6ef56c1b4 100644 --- a/modules/interaction/test/blaze/interaction/history/util_test.clj +++ b/modules/interaction/test/blaze/interaction/history/util_test.clj @@ -14,16 +14,9 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest since-test diff --git a/modules/interaction/test/blaze/interaction/read_test.clj b/modules/interaction/test/blaze/interaction/read_test.clj index 27acd7994..4f82d2982 100644 --- a/modules/interaction/test/blaze/interaction/read_test.clj +++ b/modules/interaction/test/blaze/interaction/read_test.clj @@ -23,17 +23,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/interaction/test/blaze/interaction/search/include_test.clj b/modules/interaction/test/blaze/interaction/search/include_test.clj index ba44222e5..ec54e9f67 100644 --- a/modules/interaction/test/blaze/interaction/search/include_test.clj +++ b/modules/interaction/test/blaze/interaction/search/include_test.clj @@ -12,16 +12,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def non-ref-int-system diff --git a/modules/interaction/test/blaze/interaction/search/nav_test.clj b/modules/interaction/test/blaze/interaction/search/nav_test.clj index 9b76fa808..0e76396e0 100644 --- a/modules/interaction/test/blaze/interaction/search/nav_test.clj +++ b/modules/interaction/test/blaze/interaction/search/nav_test.clj @@ -4,6 +4,7 @@ [blaze.interaction.search.nav :as nav] [blaze.interaction.search.nav-spec] [blaze.page-store.protocols :as p] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cuerdas.core :as c-str])) @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def match diff --git a/modules/interaction/test/blaze/interaction/search/params/include_test.clj b/modules/interaction/test/blaze/interaction/search/params/include_test.clj index ef96c04e5..4afb7419a 100644 --- a/modules/interaction/test/blaze/interaction/search/params/include_test.clj +++ b/modules/interaction/test/blaze/interaction/search/params/include_test.clj @@ -2,6 +2,7 @@ (:require [blaze.interaction.search.params.include :as include] [blaze.interaction.search.params.include-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest include-defs-test diff --git a/modules/interaction/test/blaze/interaction/search/params_test.clj b/modules/interaction/test/blaze/interaction/search/params_test.clj index 2350bffb2..0727280f1 100644 --- a/modules/interaction/test/blaze/interaction/search/params_test.clj +++ b/modules/interaction/test/blaze/interaction/search/params_test.clj @@ -4,7 +4,7 @@ [blaze.interaction.search.params :as params] [blaze.interaction.search.params-spec] [blaze.page-store.protocols :as p] - [blaze.test-util :refer [given-failed-future]] + [blaze.test-util :as tu :refer [given-failed-future]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def page-store diff --git a/modules/interaction/test/blaze/interaction/search_compartment_test.clj b/modules/interaction/test/blaze/interaction/search_compartment_test.clj index fd53fbae7..86d273769 100644 --- a/modules/interaction/test/blaze/interaction/search_compartment_test.clj +++ b/modules/interaction/test/blaze/interaction/search_compartment_test.clj @@ -26,17 +26,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-114238") diff --git a/modules/interaction/test/blaze/interaction/search_system_test.clj b/modules/interaction/test/blaze/interaction/search_system_test.clj index 6c08865fa..2bbf00e8b 100644 --- a/modules/interaction/test/blaze/interaction/search_system_test.clj +++ b/modules/interaction/test/blaze/interaction/search_system_test.clj @@ -27,17 +27,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-114650") diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index 36c7bee19..c3993bb34 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -29,17 +29,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :info) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-113047") diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle/links_test.clj b/modules/interaction/test/blaze/interaction/transaction/bundle/links_test.clj index c666d58cd..95e887536 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle/links_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle/links_test.clj @@ -10,16 +10,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest resolve-entry-links-test diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle/url_test.clj b/modules/interaction/test/blaze/interaction/transaction/bundle/url_test.clj index 6c2926a7a..1dc9a0b04 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle/url_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle/url_test.clj @@ -2,6 +2,7 @@ (:require [blaze.interaction.transaction.bundle.url :as url] [blaze.interaction.transaction.bundle.url-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]])) @@ -9,13 +10,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest match-url-test diff --git a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj index 189834a1c..51a9cb789 100644 --- a/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction/bundle_test.clj @@ -9,16 +9,9 @@ (st/instrument) -(tu/init-fhir-specs) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest tx-ops-test diff --git a/modules/interaction/test/blaze/interaction/transaction_test.clj b/modules/interaction/test/blaze/interaction/transaction_test.clj index 995db7674..661f1b6de 100644 --- a/modules/interaction/test/blaze/interaction/transaction_test.clj +++ b/modules/interaction/test/blaze/interaction/transaction_test.clj @@ -39,17 +39,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def operation-outcome diff --git a/modules/interaction/test/blaze/interaction/update_test.clj b/modules/interaction/test/blaze/interaction/update_test.clj index 098093143..ca59ab131 100644 --- a/modules/interaction/test/blaze/interaction/update_test.clj +++ b/modules/interaction/test/blaze/interaction/update_test.clj @@ -26,17 +26,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-url "base-url-134013") diff --git a/modules/interaction/test/blaze/interaction/util_test.clj b/modules/interaction/test/blaze/interaction/util_test.clj index 094a18c08..fc7e7e609 100644 --- a/modules/interaction/test/blaze/interaction/util_test.clj +++ b/modules/interaction/test/blaze/interaction/util_test.clj @@ -2,6 +2,7 @@ (:require [blaze.interaction.util :as iu] [blaze.interaction.util-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [cognitect.anomalies :as anom] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest etag->t-test @@ -107,7 +102,7 @@ (testing "sort param comes always first" (is (= [[:sort "a" :asc] ["b" "c"]] (iu/clauses {"_sort" "a" "b" "c"}) - (iu/clauses {"b" "c" "_sort" "a" })))) + (iu/clauses {"b" "c" "_sort" "a"})))) (testing "with two parts is unsupported" (given (iu/clauses {"_sort" "a,b" "c" "d"}) diff --git a/modules/jepsen/deps.edn b/modules/jepsen/deps.edn index e17efdbee..55d36ee95 100644 --- a/modules/jepsen/deps.edn +++ b/modules/jepsen/deps.edn @@ -7,7 +7,11 @@ :aliases {:test - {:extra-paths ["test"]} + {:extra-paths ["test"] + + :extra-deps + {blaze/test-util + {:local/root "../test-util"}}} :kaocha {:extra-deps diff --git a/modules/jepsen/test/blaze/jepsen/register_test.clj b/modules/jepsen/test/blaze/jepsen/register_test.clj index 614c58291..fa2367c92 100644 --- a/modules/jepsen/test/blaze/jepsen/register_test.clj +++ b/modules/jepsen/test/blaze/jepsen/register_test.clj @@ -4,6 +4,7 @@ [blaze.async.comp :as ac] [blaze.fhir-client :as fhir-client] [blaze.jepsen.register :as register] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is]])) @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def base-uri "base-uri-143457") diff --git a/modules/kv/test/blaze/db/kv/mem_test.clj b/modules/kv/test/blaze/db/kv/mem_test.clj index e5aad508b..f4a19b341 100644 --- a/modules/kv/test/blaze/db/kv/mem_test.clj +++ b/modules/kv/test/blaze/db/kv/mem_test.clj @@ -7,7 +7,7 @@ [blaze.db.kv.mem] [blaze.db.kv.mem-spec] [blaze.log] - [blaze.test-util :refer [bytes= given-thrown with-system]] + [blaze.test-util :as tu :refer [bytes= given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -21,13 +21,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/luid/deps.edn b/modules/luid/deps.edn index af7e3b8e0..e415222da 100644 --- a/modules/luid/deps.edn +++ b/modules/luid/deps.edn @@ -10,8 +10,8 @@ {:extra-paths ["test"] :extra-deps - {org.clojars.akiel/iota - {:mvn/version "0.1"}}} + {blaze/test-util + {:local/root "../test-util"}}} :kaocha {:extra-deps diff --git a/modules/luid/test/blaze/luid_test.clj b/modules/luid/test/blaze/luid_test.clj index 7241e8e2a..d4fc6a914 100644 --- a/modules/luid/test/blaze/luid_test.clj +++ b/modules/luid/test/blaze/luid_test.clj @@ -2,6 +2,7 @@ (:require [blaze.luid :as luid] [blaze.luid-spec] + [blaze.test-util :as tu] [clojure.math :as math] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -17,13 +18,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest luid-test diff --git a/modules/metrics/test/blaze/metrics/core_test.clj b/modules/metrics/test/blaze/metrics/core_test.clj index 658ca92ac..85ae77535 100644 --- a/modules/metrics/test/blaze/metrics/core_test.clj +++ b/modules/metrics/test/blaze/metrics/core_test.clj @@ -2,6 +2,7 @@ (:require [blaze.metrics.core :as metrics] [blaze.metrics.core-spec] + [blaze.test-util :as tu] [clojure.datafy :as datafy] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest collect-test diff --git a/modules/metrics/test/blaze/metrics/handler_test.clj b/modules/metrics/test/blaze/metrics/handler_test.clj index c1bc0b49e..b11989445 100644 --- a/modules/metrics/test/blaze/metrics/handler_test.clj +++ b/modules/metrics/test/blaze/metrics/handler_test.clj @@ -3,7 +3,7 @@ [blaze.metrics.handler] [blaze.metrics.registry] [blaze.metrics.spec :as spec] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.string :as str] @@ -17,13 +17,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/metrics/test/blaze/metrics/registry_test.clj b/modules/metrics/test/blaze/metrics/registry_test.clj index a1a7d5475..89e668aeb 100644 --- a/modules/metrics/test/blaze/metrics/registry_test.clj +++ b/modules/metrics/test/blaze/metrics/registry_test.clj @@ -2,7 +2,7 @@ (:require [blaze.metrics.core :as metrics] [blaze.metrics.registry] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.datafy :as datafy] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -26,7 +26,7 @@ (st/unstrument)) -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/openid-auth/test/blaze/openid_auth/impl_test.clj b/modules/openid-auth/test/blaze/openid_auth/impl_test.clj index 6dd6fa063..4cdae373d 100644 --- a/modules/openid-auth/test/blaze/openid_auth/impl_test.clj +++ b/modules/openid-auth/test/blaze/openid_auth/impl_test.clj @@ -1,6 +1,7 @@ (ns blaze.openid-auth.impl-test (:require [blaze.openid-auth.impl :as impl] + [blaze.test-util :as tu] [buddy.auth.middleware :as middleware] [buddy.sign.jwt :as jwt] [clojure.spec.test.alpha :as st] @@ -17,13 +18,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) ;; The following json has been taken from https://samples.auth0.com/.well-known/jwks.json diff --git a/modules/openid-auth/test/blaze/openid_auth_test.clj b/modules/openid-auth/test/blaze/openid_auth_test.clj index c0f9cc803..b35ecc50a 100644 --- a/modules/openid-auth/test/blaze/openid_auth_test.clj +++ b/modules/openid-auth/test/blaze/openid_auth_test.clj @@ -2,7 +2,7 @@ (:require [blaze.openid-auth :as openid-auth] [blaze.openid-auth.spec] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [buddy.auth.protocols :as p] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -18,13 +18,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defmethod ig/init-key ::http-client [_ _] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj index 8cb3eae52..8fbcbf983 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/cql_test.clj @@ -13,7 +13,7 @@ [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type] [blaze.fhir.spec.type.system :as system] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] @@ -29,13 +29,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- now [clock] diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj index 038173160..cb82c7e74 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/stratifier_test.clj @@ -8,7 +8,7 @@ [blaze.elm.compiler.library :as library] [blaze.fhir.operation.evaluate-measure.measure.stratifier :as stratifier] [blaze.fhir.operation.evaluate-measure.measure.stratifier-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] @@ -22,13 +22,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- now [clock] (OffsetDateTime/now ^Clock clock)) diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj index 36ea66da3..d6eb758c9 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure/util_test.clj @@ -3,7 +3,7 @@ [blaze.anomaly-spec] [blaze.fhir.operation.evaluate-measure.measure.util :as u] [blaze.fhir.operation.evaluate-measure.measure.util-spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [clojure.test.check.generators :as gen] @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest expression-test diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj index e418e12e6..2713eeccb 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/measure_test.clj @@ -10,6 +10,7 @@ [blaze.fhir.spec :as fhir-spec] [blaze.fhir.spec.type :as type] [blaze.log] + [blaze.test-util :as tu] [clojure.java.io :as io] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -29,13 +30,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def router diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj index 490fb2d53..c8274284d 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure/middleware/params_test.clj @@ -3,6 +3,7 @@ [blaze.async.comp :as ac] [blaze.fhir.operation.evaluate-measure.middleware.params :as params] [blaze.fhir.operation.evaluate-measure.test-util :refer [wrap-error]] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [juxt.iota :refer [given]] @@ -13,13 +14,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def operation-outcome-uri diff --git a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj index 339a2bfd3..33e8d87f6 100644 --- a/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj +++ b/modules/operation-measure-evaluate-measure/test/blaze/fhir/operation/evaluate_measure_test.clj @@ -9,7 +9,7 @@ [blaze.metrics.spec] [blaze.middleware.fhir.db :refer [wrap-db]] [blaze.middleware.fhir.db-spec] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -27,13 +27,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private base-url "base-url-144638") diff --git a/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj index c9e9a786e..6bcdcbf77 100644 --- a/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj +++ b/modules/page-store-cassandra/test/blaze/page_store/cassandra/codec_test.clj @@ -2,7 +2,7 @@ (:require [blaze.page-store.cassandra.codec :as codec] [blaze.spec] - [blaze.test-util :refer [satisfies-prop]] + [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] @@ -13,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def token (c-str/repeat "A" 32)) diff --git a/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj b/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj index dde3cf6cb..d02b31808 100644 --- a/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj +++ b/modules/page-store-cassandra/test/blaze/page_store/cassandra_test.clj @@ -9,7 +9,7 @@ [blaze.page-store.cassandra.codec :as codec] [blaze.page-store.cassandra.codec-spec] [blaze.page-store.cassandra.statement :as statement] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -24,13 +24,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/page-store/test/blaze/page_store/local_test.clj b/modules/page-store/test/blaze/page_store/local_test.clj index 5af0c85f7..06adb1a0a 100644 --- a/modules/page-store/test/blaze/page_store/local_test.clj +++ b/modules/page-store/test/blaze/page_store/local_test.clj @@ -4,7 +4,7 @@ [blaze.page-store :as page-store] [blaze.page-store-spec] [blaze.page-store.local] - [blaze.test-util :refer [given-failed-future given-thrown with-system]] + [blaze.test-util :as tu :refer [given-failed-future given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -18,13 +18,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj index 11f06dfc8..138ffed5e 100644 --- a/modules/rest-api/test/blaze/rest_api/capabilities_test.clj +++ b/modules/rest-api/test/blaze/rest_api/capabilities_test.clj @@ -4,7 +4,7 @@ [blaze.fhir.structure-definition-repo] [blaze.rest-api.capabilities :as capabilities] [blaze.rest-api.capabilities-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [integrant.core :as ig] @@ -15,13 +15,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def ^:private copyright diff --git a/modules/rest-api/test/blaze/rest_api/middleware/auth_guard_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/auth_guard_test.clj index e92024ec8..a7834db8d 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/auth_guard_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/auth_guard_test.clj @@ -2,6 +2,7 @@ (:require [blaze.async.comp :as ac] [blaze.rest-api.middleware.auth-guard :refer [wrap-auth-guard]] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn handler [_] diff --git a/modules/rest-api/test/blaze/rest_api/middleware/batch_handler_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/batch_handler_test.clj index aa25715ef..9e94d57ff 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/batch_handler_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/batch_handler_test.clj @@ -1,6 +1,7 @@ (ns blaze.rest-api.middleware.batch-handler-test (:require [blaze.rest-api.middleware.batch-handler :refer [wrap-batch-handler]] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is]])) @@ -8,13 +9,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest wrap-batch-handler-test diff --git a/modules/rest-api/test/blaze/rest_api/middleware/cors_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/cors_test.clj index 1349f9e77..6f238efcc 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/cors_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/cors_test.clj @@ -1,6 +1,7 @@ (ns blaze.rest-api.middleware.cors-test (:require [blaze.rest-api.middleware.cors :refer [wrap-cors]] + [blaze.test-util :as tu] [blaze.test-util.ring :refer [call]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] @@ -10,13 +11,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest wrap-cors-test diff --git a/modules/rest-api/test/blaze/rest_api/middleware/forwarded_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/forwarded_test.clj index 78af392e9..e23174da8 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/forwarded_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/forwarded_test.clj @@ -1,6 +1,7 @@ (ns blaze.rest-api.middleware.forwarded-test (:require [blaze.rest-api.middleware.forwarded :refer [wrap-forwarded]] + [blaze.test-util :as tu] [blaze.test-util.ring :refer [call]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] @@ -12,13 +13,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- handler [request respond _] @@ -32,49 +27,49 @@ (testing "X-Forwarded-Host header" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"x-forwarded-host" "blaze.de"}}) + {:headers {"x-forwarded-host" "blaze.de"}}) :blaze/base-url := "http://blaze.de")) (testing "X-Forwarded-Host header" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"x-forwarded-host" "blaze.de"}}) + {:headers {"x-forwarded-host" "blaze.de"}}) :blaze/base-url := "http://blaze.de")) (testing "X-Forwarded-Host header with port" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"x-forwarded-host" "localhost:8081"}}) + {:headers {"x-forwarded-host" "localhost:8081"}}) :blaze/base-url := "http://localhost:8081")) (testing "X-Forwarded-Host and X-Forwarded-Proto header" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers - {"x-forwarded-host" "blaze.de" - "x-forwarded-proto" "https"}}) + {:headers + {"x-forwarded-host" "blaze.de" + "x-forwarded-proto" "https"}}) :blaze/base-url := "https://blaze.de")) (testing "Forwarded header" (testing "with host" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"forwarded" "host=blaze.de"}}) + {:headers {"forwarded" "host=blaze.de"}}) :blaze/base-url := "http://blaze.de")) (testing "with host and port" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"forwarded" "host=localhost:8081"}}) + {:headers {"forwarded" "host=localhost:8081"}}) :blaze/base-url := "http://localhost:8081")) (testing "with host and proto" (testing "host first" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"forwarded" "host=blaze.de;proto=https"}}) + {:headers {"forwarded" "host=blaze.de;proto=https"}}) :blaze/base-url := "https://blaze.de")) (testing "proto first" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"forwarded" "proto=https;host=blaze.de"}}) + {:headers {"forwarded" "proto=https;host=blaze.de"}}) :blaze/base-url := "https://blaze.de")) (testing "extra for" (given (call (wrap-forwarded handler "http://localhost:8080") - {:headers {"forwarded" "for=127.0.0.1;host=blaze.de;proto=https"}}) + {:headers {"forwarded" "for=127.0.0.1;host=blaze.de;proto=https"}}) :blaze/base-url := "https://blaze.de"))))) diff --git a/modules/rest-api/test/blaze/rest_api/middleware/log_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/log_test.clj index af6aaa22c..88338fccd 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/log_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/log_test.clj @@ -1,6 +1,7 @@ (ns blaze.rest-api.middleware.log-test (:require [blaze.rest-api.middleware.log :refer [wrap-log]] + [blaze.test-util :as tu] [blaze.test-util.ring :refer [call]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -11,13 +12,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- handler [_ respond _] diff --git a/modules/rest-api/test/blaze/rest_api/middleware/output_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/output_test.clj index 3cb055f7a..d3834e44a 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/output_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/output_test.clj @@ -15,17 +15,10 @@ (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def resource-handler diff --git a/modules/rest-api/test/blaze/rest_api/middleware/resource_test.clj b/modules/rest-api/test/blaze/rest_api/middleware/resource_test.clj index c20bf9e1b..4ffcba23b 100644 --- a/modules/rest-api/test/blaze/rest_api/middleware/resource_test.clj +++ b/modules/rest-api/test/blaze/rest_api/middleware/resource_test.clj @@ -16,17 +16,10 @@ (set! *warn-on-reflection* true) (st/instrument) -(tu/init-fhir-specs) (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn wrap-error [handler] diff --git a/modules/rest-api/test/blaze/rest_api/routes_test.clj b/modules/rest-api/test/blaze/rest_api/routes_test.clj index 17cb94a8f..33c1a3127 100644 --- a/modules/rest-api/test/blaze/rest_api/routes_test.clj +++ b/modules/rest-api/test/blaze/rest_api/routes_test.clj @@ -3,6 +3,7 @@ [blaze.db.impl.search-param] [blaze.rest-api.routes :as routes] [blaze.rest-api.routes-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]] @@ -12,13 +13,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest resource-route-test @@ -27,11 +22,11 @@ (routes/resource-route {:node ::node} [#:blaze.rest-api.resource-pattern - {:type :default - :interactions - {:read - #:blaze.rest-api.interaction - {:handler (fn [_] ::read)}}}] + {:type :default + :interactions + {:read + #:blaze.rest-api.interaction + {:handler (fn [_] ::read)}}}] {:kind "resource" :name "Patient"}) [0] := "/Patient" [1 :fhir.resource/type] := "Patient" diff --git a/modules/rest-api/test/blaze/rest_api_test.clj b/modules/rest-api/test/blaze/rest_api_test.clj index 8d8047d20..261781568 100644 --- a/modules/rest-api/test/blaze/rest_api_test.clj +++ b/modules/rest-api/test/blaze/rest_api_test.clj @@ -9,7 +9,7 @@ [blaze.handler.util :as handler-util] [blaze.metrics.spec] [blaze.rest-api :as rest-api] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [blaze.test-util.ring :refer [call]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- handler [key] diff --git a/modules/rest-util/test/blaze/fhir/response/create_test.clj b/modules/rest-util/test/blaze/fhir/response/create_test.clj index 510869fe6..7236571e1 100644 --- a/modules/rest-util/test/blaze/fhir/response/create_test.clj +++ b/modules/rest-util/test/blaze/fhir/response/create_test.clj @@ -4,6 +4,7 @@ [blaze.db.api-stub :refer [mem-node-system with-system-data]] [blaze.fhir.response.create :refer [build-response]] [blaze.fhir.response.create-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [reitit.core :as reitit] @@ -14,13 +15,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def router diff --git a/modules/rest-util/test/blaze/handler/fhir/util_test.clj b/modules/rest-util/test/blaze/handler/fhir/util_test.clj index 71e21450b..7a4846947 100644 --- a/modules/rest-util/test/blaze/handler/fhir/util_test.clj +++ b/modules/rest-util/test/blaze/handler/fhir/util_test.clj @@ -1,6 +1,7 @@ (ns blaze.handler.fhir.util-test (:require [blaze.handler.fhir.util :as fhir-util] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] [reitit.core :as reitit])) @@ -9,13 +10,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest to-seq-test diff --git a/modules/rest-util/test/blaze/handler/util_test.clj b/modules/rest-util/test/blaze/handler/util_test.clj index 2bcc0287e..e393810f7 100644 --- a/modules/rest-util/test/blaze/handler/util_test.clj +++ b/modules/rest-util/test/blaze/handler/util_test.clj @@ -2,7 +2,7 @@ (:require [blaze.async.comp-spec] [blaze.handler.util :as handler-util] - [blaze.test-util :refer [given-failed-future]] + [blaze.test-util :as tu :refer [given-failed-future]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest testing]] [cognitect.anomalies :as anom] @@ -12,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest preference-test @@ -82,7 +76,7 @@ (deftest method-not-allowed-handler-test (given (handler-util/method-not-allowed-handler - {:uri "/Patient" :request-method :put}) + {:uri "/Patient" :request-method :put}) :status := 405 [:body :fhir/type] := :fhir/OperationOutcome [:body :issue 0 :severity] := #fhir/code"error" diff --git a/modules/rest-util/test/blaze/http/util_test.clj b/modules/rest-util/test/blaze/http/util_test.clj index c32dee443..3249ca356 100644 --- a/modules/rest-util/test/blaze/http/util_test.clj +++ b/modules/rest-util/test/blaze/http/util_test.clj @@ -2,6 +2,7 @@ (:require [blaze.http.util :as hu] [blaze.http.util-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] [juxt.iota :refer [given]])) @@ -10,13 +11,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest parse-header-value-test diff --git a/modules/rest-util/test/blaze/middleware/fhir/error_test.clj b/modules/rest-util/test/blaze/middleware/fhir/error_test.clj index eb8f44294..0113beb67 100644 --- a/modules/rest-util/test/blaze/middleware/fhir/error_test.clj +++ b/modules/rest-util/test/blaze/middleware/fhir/error_test.clj @@ -2,6 +2,7 @@ (:refer-clojure :exclude [error-handler]) (:require [blaze.middleware.fhir.error :refer [wrap-error]] + [blaze.test-util :as tu] [blaze.test-util.ring :refer [call]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -11,13 +12,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- identity-handler [request respond _] diff --git a/modules/rest-util/test/blaze/middleware/fhir/metrics_test.clj b/modules/rest-util/test/blaze/middleware/fhir/metrics_test.clj index 80ca186d4..79ced0a21 100644 --- a/modules/rest-util/test/blaze/middleware/fhir/metrics_test.clj +++ b/modules/rest-util/test/blaze/middleware/fhir/metrics_test.clj @@ -2,6 +2,7 @@ (:require [blaze.async.comp :as ac] [blaze.middleware.fhir.metrics :refer [wrap-observe-request-duration]] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]])) @@ -10,13 +11,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def interaction-name "interaction-name-112524") diff --git a/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj b/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj index 65761eb65..08b9e3d43 100644 --- a/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj +++ b/modules/rocksdb/test/blaze/db/kv/rocksdb/impl_test.clj @@ -4,6 +4,7 @@ [blaze.db.kv.rocksdb.impl :as impl] [blaze.db.kv.rocksdb.impl-spec] [blaze.metrics.core-spec] + [blaze.test-util :as tu] [clojure.core.protocols :as p] [clojure.datafy :as datafy] [clojure.spec.test.alpha :as st] @@ -15,22 +16,16 @@ [java.nio.file Files] [java.nio.file.attribute FileAttribute] [org.rocksdb - BlockBasedTableConfig ColumnFamilyDescriptor ColumnFamilyOptions - CompressionType DBOptions LRUCache Statistics RocksDB WriteBatchInterface - ColumnFamilyHandle WriteOptions])) + BlockBasedTableConfig ColumnFamilyDescriptor ColumnFamilyHandle + ColumnFamilyOptions CompressionType DBOptions LRUCache RocksDB Statistics + WriteBatchInterface WriteOptions])) (set! *warn-on-reflection* true) (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- from-hex [s] @@ -375,27 +370,27 @@ [cfh-2 "03" "04"]])) (testing "delete" - (are [entries state-val] - (let [state (atom [])] - (impl/write-wb! - {:cf-1 cfh-1 - :cf-2 cfh-2} - (cf-delete-wb state) - entries) - (is (= state-val @state))) - - [[:delete :cf-1 (from-hex "01")]] - [[cfh-1 "01"]] - - [[:delete :cf-1 (from-hex "01")] - [:delete :cf-1 (from-hex "02")]] - [[cfh-1 "01"] - [cfh-1 "02"]] - - [[:delete :cf-1 (from-hex "01")] - [:delete :cf-2 (from-hex "02")]] - [[cfh-1 "01"] - [cfh-2 "02"]]))))) + (are [entries state-val] + (let [state (atom [])] + (impl/write-wb! + {:cf-1 cfh-1 + :cf-2 cfh-2} + (cf-delete-wb state) + entries) + (is (= state-val @state))) + + [[:delete :cf-1 (from-hex "01")]] + [[cfh-1 "01"]] + + [[:delete :cf-1 (from-hex "01")] + [:delete :cf-1 (from-hex "02")]] + [[cfh-1 "01"] + [cfh-1 "02"]] + + [[:delete :cf-1 (from-hex "01")] + [:delete :cf-2 (from-hex "02")]] + [[cfh-1 "01"] + [cfh-2 "02"]]))))) (testing "with missing column family" (let [entries [[:put :cf-1 (byte-array 0) (byte-array 0)]]] diff --git a/modules/rocksdb/test/blaze/db/kv/rocksdb/metrics_test.clj b/modules/rocksdb/test/blaze/db/kv/rocksdb/metrics_test.clj index b98f65cd0..0cb58cbb1 100644 --- a/modules/rocksdb/test/blaze/db/kv/rocksdb/metrics_test.clj +++ b/modules/rocksdb/test/blaze/db/kv/rocksdb/metrics_test.clj @@ -3,23 +3,18 @@ [blaze.db.kv.rocksdb.metrics :refer [stats-collector]] [blaze.metrics.core :as metrics] [blaze.metrics.core-spec] + [blaze.test-util :as tu] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]]) (:import - [org.rocksdb Statistics RocksDB])) + [org.rocksdb RocksDB Statistics])) (set! *warn-on-reflection* true) (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (RocksDB/loadLibrary) diff --git a/modules/rocksdb/test/blaze/db/kv/rocksdb_test.clj b/modules/rocksdb/test/blaze/db/kv/rocksdb_test.clj index 8b5edd81f..ffd268303 100644 --- a/modules/rocksdb/test/blaze/db/kv/rocksdb_test.clj +++ b/modules/rocksdb/test/blaze/db/kv/rocksdb_test.clj @@ -7,7 +7,7 @@ [blaze.db.kv.rocksdb :as rocksdb] [blaze.db.kv.rocksdb-spec] [blaze.db.kv.rocksdb.impl-spec] - [blaze.test-util :refer [bytes= given-thrown with-system]] + [blaze.test-util :as tu :refer [bytes= given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] @@ -21,13 +21,7 @@ (st/instrument) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (defn- ba [& bytes] diff --git a/modules/scheduler/test/blaze/scheduler_test.clj b/modules/scheduler/test/blaze/scheduler_test.clj index e751891c2..dafbb15af 100644 --- a/modules/scheduler/test/blaze/scheduler_test.clj +++ b/modules/scheduler/test/blaze/scheduler_test.clj @@ -3,7 +3,7 @@ [blaze.executors :as ex] [blaze.scheduler :as sched] [blaze.scheduler-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] [integrant.core :as ig] @@ -16,13 +16,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest schedule-at-fixed-rate-test diff --git a/modules/server/test/blaze/server_test.clj b/modules/server/test/blaze/server_test.clj index e89938af2..139273a28 100644 --- a/modules/server/test/blaze/server_test.clj +++ b/modules/server/test/blaze/server_test.clj @@ -3,7 +3,7 @@ (:require [blaze.anomaly :as ba] [blaze.server] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest testing]] @@ -22,13 +22,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/modules/test-util/src/blaze/test_util.clj b/modules/test-util/src/blaze/test_util.clj index 8f309fad8..99223740f 100644 --- a/modules/test-util/src/blaze/test_util.clj +++ b/modules/test-util/src/blaze/test_util.clj @@ -4,6 +4,7 @@ [blaze.byte-buffer :as bb] [blaze.executors :as ex] [blaze.fhir.structure-definition-repo] + [clojure.spec.test.alpha :as st] [clojure.test :refer [is]] [clojure.test.check :as tc] [integrant.core :as ig] @@ -96,5 +97,10 @@ (Arrays/equals a b)) -(defn init-fhir-specs [] - (ig/init {:blaze.fhir/structure-definition-repo {}})) +(ig/init {:blaze.fhir/structure-definition-repo {}}) + + +(defn fixture [f] + (st/instrument) + (f) + (st/unstrument)) diff --git a/modules/thread-pool-executor-collector/test/blaze/thread_pool_executor_collector_test.clj b/modules/thread-pool-executor-collector/test/blaze/thread_pool_executor_collector_test.clj index d994d3f86..7b1b20204 100644 --- a/modules/thread-pool-executor-collector/test/blaze/thread_pool_executor_collector_test.clj +++ b/modules/thread-pool-executor-collector/test/blaze/thread_pool_executor_collector_test.clj @@ -2,7 +2,7 @@ (:require [blaze.executors :as ex] [blaze.metrics.core :as metrics] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [blaze.thread-pool-executor-collector] [blaze.thread-pool-executor-collector.spec :as spec] [clojure.spec.alpha :as s] @@ -20,13 +20,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/test/blaze/handler/app_test.clj b/test/blaze/handler/app_test.clj index fcb06ca80..a19d5454e 100644 --- a/test/blaze/handler/app_test.clj +++ b/test/blaze/handler/app_test.clj @@ -1,7 +1,7 @@ (ns blaze.handler.app-test (:require [blaze.handler.app] - [blaze.test-util :refer [given-thrown with-system]] + [blaze.test-util :as tu :refer [given-thrown with-system]] [blaze.test-util.ring :refer [call]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] @@ -16,13 +16,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest init-test diff --git a/test/blaze/handler/health_test.clj b/test/blaze/handler/health_test.clj index 0b00f43a4..ef9aa0cb4 100644 --- a/test/blaze/handler/health_test.clj +++ b/test/blaze/handler/health_test.clj @@ -1,7 +1,7 @@ (ns blaze.handler.health-test (:require [blaze.handler.health] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [blaze.test-util.ring :refer [call]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest]] @@ -13,13 +13,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (def system diff --git a/test/blaze/system_test.clj b/test/blaze/system_test.clj index 7130b6617..231b48f1c 100644 --- a/test/blaze/system_test.clj +++ b/test/blaze/system_test.clj @@ -11,7 +11,7 @@ [blaze.rest-api] [blaze.system :as system] [blaze.system-spec] - [blaze.test-util :refer [with-system]] + [blaze.test-util :as tu :refer [with-system]] [blaze.test-util.ring :refer [call]] [buddy.auth.protocols :as ap] [clojure.spec.alpha :as s] @@ -28,13 +28,7 @@ (log/set-level! :trace) -(defn- fixture [f] - (st/instrument) - (f) - (st/unstrument)) - - -(test/use-fixtures :each fixture) +(test/use-fixtures :each tu/fixture) (deftest resolve-config-test From 718a45015164648debabc6e7523e19065f0d909d Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Wed, 15 Feb 2023 16:05:38 +0100 Subject: [PATCH 113/124] Restart Blaze on Unavailable Cassandra Database --- .github/distributed-test/docker-compose.yml | 2 ++ docs/consistency/docker-compose.yml | 6 ++++-- docs/deployment/distributed/docker-compose.yml | 2 ++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/distributed-test/docker-compose.yml b/.github/distributed-test/docker-compose.yml index 345a0fc51..9e1ad6a4d 100644 --- a/.github/distributed-test/docker-compose.yml +++ b/.github/distributed-test/docker-compose.yml @@ -92,6 +92,7 @@ services: - kafka-topic-creator - cassandra-1 - cassandra-2 + restart: unless-stopped blaze-2: image: "blaze:latest" @@ -121,6 +122,7 @@ services: - kafka-topic-creator - cassandra-1 - cassandra-2 + restart: unless-stopped ingress: image: "haproxy:2.3" diff --git a/docs/consistency/docker-compose.yml b/docs/consistency/docker-compose.yml index 1247b7231..77d8e27ac 100644 --- a/docs/consistency/docker-compose.yml +++ b/docs/consistency/docker-compose.yml @@ -149,7 +149,7 @@ services: HEAP_NEWSIZE: "200M" blaze-1: - image: "samply/blaze:jepsen" + image: "samply/blaze:0.19" hostname: "blaze-1" environment: JAVA_TOOL_OPTIONS: "-Xmx4g -Dclojure.server.repl='{:address,\"0.0.0.0\",:port,5555,:accept,clojure.core.server/repl}'" @@ -176,9 +176,10 @@ services: - cassandra-1 - cassandra-2 - cassandra-3 + restart: unless-stopped blaze-2: - image: "samply/blaze:jepsen" + image: "samply/blaze:0.19" hostname: "blaze-2" environment: JAVA_TOOL_OPTIONS: "-Xmx4g" @@ -205,6 +206,7 @@ services: - cassandra-1 - cassandra-2 - cassandra-3 + restart: unless-stopped ingress: image: "haproxy:2.3" diff --git a/docs/deployment/distributed/docker-compose.yml b/docs/deployment/distributed/docker-compose.yml index ffd043d23..59f27c34b 100644 --- a/docs/deployment/distributed/docker-compose.yml +++ b/docs/deployment/distributed/docker-compose.yml @@ -100,6 +100,7 @@ services: - cassandra-1 - cassandra-2 - cassandra-3 + restart: unless-stopped blaze-2: image: "samply/blaze:0.19" @@ -130,6 +131,7 @@ services: - cassandra-1 - cassandra-2 - cassandra-3 + restart: unless-stopped ingress: image: "haproxy:2.4" From 909ce2ae79c2b4167ba22f832039fef8407e3f5a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 16 Feb 2023 13:22:09 +0100 Subject: [PATCH 114/124] Add more Linked Compartments Tests --- .../db/test/blaze/db/search_param_registry_test.clj | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/modules/db/test/blaze/db/search_param_registry_test.clj b/modules/db/test/blaze/db/search_param_registry_test.clj index 14a0edf83..7f877e8c3 100644 --- a/modules/db/test/blaze/db/search_param_registry_test.clj +++ b/modules/db/test/blaze/db/search_param_registry_test.clj @@ -9,7 +9,7 @@ [blaze.test-util :as tu :refer [given-thrown with-system]] [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [deftest testing]] + [clojure.test :as test :refer [deftest is testing]] [cognitect.anomalies :as anom] [integrant.core :as ig] [juxt.iota :refer [given]] @@ -120,6 +120,16 @@ count := 1 [0] := ["Patient" "1"])) + (testing "a simple Patient has no compartments" + (is (empty? (sr/linked-compartments + search-param-registry + {:fhir/type :fhir/Patient :id "0"})))) + + (testing "a simple Medication has no compartments" + (is (empty? (sr/linked-compartments + search-param-registry + {:fhir/type :fhir/Medication :id "0"})))) + (testing "with FHIRPath eval error" (with-redefs [fhir-path/eval (fn [_ _ _] From aee19414e481450fdcfb9108f1f199777223d48a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 16 Feb 2023 13:28:24 +0100 Subject: [PATCH 115/124] Fix System Search Paging --- .github/scripts/download-all-resources.sh | 12 ++++++++++++ .github/workflows/build.yml | 6 ++++++ .../src/blaze/interaction/search_system.clj | 2 +- modules/rest-api/src/blaze/rest_api/routes.clj | 2 +- 4 files changed, 20 insertions(+), 2 deletions(-) create mode 100755 .github/scripts/download-all-resources.sh diff --git a/.github/scripts/download-all-resources.sh b/.github/scripts/download-all-resources.sh new file mode 100755 index 000000000..720c04e52 --- /dev/null +++ b/.github/scripts/download-all-resources.sh @@ -0,0 +1,12 @@ +#!/bin/bash -e + +SCRIPT_DIR="$(dirname "$(readlink -f "$0")")" +. "$SCRIPT_DIR/util.sh" + +BASE="http://localhost:8080/fhir" +EXPECTED_SIZE=$(curl -s "$BASE?_summary=count" | jq -r .total) + +FILE_NAME=$(uuidgen) +blazectl --no-progress --server $BASE download "" -o "$FILE_NAME".ndjson + +test "download size" "$(wc -l "$FILE_NAME".ndjson | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c5d329942..38fbaea50 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -297,6 +297,9 @@ jobs: - name: Count Resources run: blazectl count-resources --server http://localhost:8080/fhir + - name: Download All Resources + run: .github/scripts/download-all-resources.sh + - name: Download Patient Resources run: .github/scripts/download-resources.sh Patient @@ -922,6 +925,9 @@ jobs: - name: Count Resources run: blazectl count-resources --server http://localhost:8080/fhir + - name: Download All Resources + run: .github/scripts/download-all-resources.sh + - name: Download Patient Resources run: .github/scripts/download-resources.sh Patient diff --git a/modules/interaction/src/blaze/interaction/search_system.clj b/modules/interaction/src/blaze/interaction/search_system.clj index b4c888027..41d225596 100644 --- a/modules/interaction/src/blaze/interaction/search_system.clj +++ b/modules/interaction/src/blaze/interaction/search_system.clj @@ -45,7 +45,7 @@ {:fhir/type :fhir.Bundle/link :relation "self" :url (type/uri (nav/url base-url match params [] (iu/t db) - (self-link-offset entries)))}) + (self-link-offset entries)))}) (defn- next-link-offset [entries] diff --git a/modules/rest-api/src/blaze/rest_api/routes.clj b/modules/rest-api/src/blaze/rest_api/routes.clj index 074d43ad6..8780df22c 100644 --- a/modules/rest-api/src/blaze/rest_api/routes.clj +++ b/modules/rest-api/src/blaze/rest_api/routes.clj @@ -250,7 +250,7 @@ (assoc :get {:middleware [[wrap-db node db-sync-timeout]] :handler history-system-handler}))] ["/__page" - (cond-> {} + (cond-> {:name :page} (some? search-system-handler) (assoc :get {:middleware [[wrap-db node db-sync-timeout]] From 8e0c5da94d36edc24409580af615ba15fb95113e Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 16 Feb 2023 17:27:22 +0100 Subject: [PATCH 116/124] Update Dependencies --- deps.edn | 4 ++-- modules/cassandra/deps.edn | 2 +- modules/cql/deps.edn | 8 ++++---- modules/fhir-path/deps.edn | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/deps.edn b/deps.edn index c780e8cb3..0952670f1 100644 --- a/deps.edn +++ b/deps.edn @@ -61,7 +61,7 @@ {:mvn/version "0.4.6"} org.clojure/tools.namespace - {:mvn/version "1.4.0"}}} + {:mvn/version "1.4.1"}}} :kaocha {:extra-deps @@ -75,7 +75,7 @@ :extra-deps {org.clojure/tools.namespace - {:mvn/version "1.4.0"}}} + {:mvn/version "1.4.1"}}} :outdated {:replace-deps diff --git a/modules/cassandra/deps.edn b/modules/cassandra/deps.edn index cd82460db..fc4eaf028 100644 --- a/modules/cassandra/deps.edn +++ b/modules/cassandra/deps.edn @@ -11,7 +11,7 @@ ;; current version of transitive dependency of com.datastax.oss/java-driver-core io.netty/netty-handler - {:mvn/version "4.1.88.Final"}} + {:mvn/version "4.1.89.Final"}} :aliases {:test diff --git a/modules/cql/deps.edn b/modules/cql/deps.edn index bc7543554..5f240448b 100644 --- a/modules/cql/deps.edn +++ b/modules/cql/deps.edn @@ -11,17 +11,17 @@ {:mvn/version "2.14.2"} info.cqframework/cql-to-elm - {:mvn/version "2.5.0" + {:mvn/version "2.6.0" :exclusions [xpp3/xpp3_xpath]} info.cqframework/elm-jackson - {:mvn/version "2.5.0"} + {:mvn/version "2.6.0"} info.cqframework/model-jackson - {:mvn/version "2.5.0"} + {:mvn/version "2.6.0"} info.cqframework/quick - {:mvn/version "2.5.0"} + {:mvn/version "2.6.0"} org.apache.commons/commons-text {:mvn/version "1.10.0"} diff --git a/modules/fhir-path/deps.edn b/modules/fhir-path/deps.edn index a5b8725d4..d6caca7b4 100644 --- a/modules/fhir-path/deps.edn +++ b/modules/fhir-path/deps.edn @@ -3,7 +3,7 @@ {:local/root "../fhir-structure"} info.cqframework/cql - {:mvn/version "2.5.0"}} + {:mvn/version "2.6.0"}} :aliases {:test From b38743de67110962dc5b792d79ebbad8c48e16b3 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 16 Feb 2023 17:37:37 +0100 Subject: [PATCH 117/124] Update Blazectl --- .github/scripts/download-all-resources.sh | 4 ++-- .github/scripts/download-resources.sh | 4 ++-- .github/scripts/install-blazectl.sh | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/.github/scripts/download-all-resources.sh b/.github/scripts/download-all-resources.sh index 720c04e52..c1a06a827 100755 --- a/.github/scripts/download-all-resources.sh +++ b/.github/scripts/download-all-resources.sh @@ -7,6 +7,6 @@ BASE="http://localhost:8080/fhir" EXPECTED_SIZE=$(curl -s "$BASE?_summary=count" | jq -r .total) FILE_NAME=$(uuidgen) -blazectl --no-progress --server $BASE download "" -o "$FILE_NAME".ndjson +blazectl --no-progress --server "$BASE" download -o "$FILE_NAME.ndjson" -test "download size" "$(wc -l "$FILE_NAME".ndjson | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" +test "download size" "$(wc -l "$FILE_NAME.ndjson" | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" diff --git a/.github/scripts/download-resources.sh b/.github/scripts/download-resources.sh index 3b8850011..ef4f2cc30 100755 --- a/.github/scripts/download-resources.sh +++ b/.github/scripts/download-resources.sh @@ -8,6 +8,6 @@ TYPE=$1 EXPECTED_SIZE=$(curl -s "$BASE/${TYPE}?_summary=count" | jq -r .total) FILE_NAME=$(uuidgen) -blazectl --no-progress --server $BASE download "$TYPE" -o "$FILE_NAME".ndjson +blazectl --no-progress --server "$BASE" download "$TYPE" -o "$FILE_NAME.ndjson" -test "download size" "$(wc -l "$FILE_NAME".ndjson | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" +test "download size" "$(wc -l "$FILE_NAME.ndjson" | xargs | cut -d ' ' -f1)" "$EXPECTED_SIZE" diff --git a/.github/scripts/install-blazectl.sh b/.github/scripts/install-blazectl.sh index 8adefb615..5f561bd4f 100755 --- a/.github/scripts/install-blazectl.sh +++ b/.github/scripts/install-blazectl.sh @@ -1,8 +1,8 @@ #!/bin/bash -e -VERSION=0.12.0 +VERSION="0.13.0" -curl -sLO https://github.com/samply/blazectl/releases/download/v${VERSION}/blazectl-${VERSION}-linux-amd64.tar.gz -tar xzf blazectl-${VERSION}-linux-amd64.tar.gz -rm blazectl-${VERSION}-linux-amd64.tar.gz +curl -sLO "https://github.com/samply/blazectl/releases/download/v$VERSION/blazectl-$VERSION-linux-amd64.tar.gz" +tar xzf "blazectl-$VERSION-linux-amd64.tar.gz" +rm "blazectl-$VERSION-linux-amd64.tar.gz" sudo mv ./blazectl /usr/local/bin/blazectl From 790a002e0e0a29141110e76abcc3100d97f2de6a Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Thu, 16 Feb 2023 17:18:24 +0100 Subject: [PATCH 118/124] Extend Documentation of Data Sync Added copying data from one Blaze to another and saving all resources from a Blaze server. --- .github/distributed-test/docker-compose.yml | 1 - .../docker-compose.override.yml | 6 + .github/openid-auth-test/docker-compose.yml | 1 - .github/workflows/build.yml | 45 ++++ docker-compose.yml | 1 - docs/authentication/docker-compose.yml | 1 - docs/consistency/docker-compose.yml | 1 - docs/data-sync.md | 76 +++++- docs/data-sync/copy/docker-compose.yml | 28 +++ docs/data-sync/docker-compose.yml | 40 ---- .../data-sync/subscription/docker-compose.yml | 24 ++ .../subscription-bundle.json | 0 .../deployment/distributed/docker-compose.yml | 1 - scripts/copy-data.sh | 35 +++ scripts/save-data.sh | 21 ++ test-scripts/patient.json | 3 - test-scripts/system-history-paging.json | 220 ----------------- test-scripts/type-history-paging.json | 221 ------------------ 18 files changed, 232 insertions(+), 493 deletions(-) create mode 100644 .github/doc-copy-data-test/docker-compose.override.yml create mode 100644 docs/data-sync/copy/docker-compose.yml delete mode 100644 docs/data-sync/docker-compose.yml create mode 100644 docs/data-sync/subscription/docker-compose.yml rename docs/data-sync/{ => subscription}/subscription-bundle.json (100%) create mode 100755 scripts/copy-data.sh create mode 100755 scripts/save-data.sh delete mode 100644 test-scripts/patient.json delete mode 100644 test-scripts/system-history-paging.json delete mode 100644 test-scripts/type-history-paging.json diff --git a/.github/distributed-test/docker-compose.yml b/.github/distributed-test/docker-compose.yml index 9e1ad6a4d..4f038c5c6 100644 --- a/.github/distributed-test/docker-compose.yml +++ b/.github/distributed-test/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: zookeeper: image: "docker.io/bitnami/zookeeper:3" diff --git a/.github/doc-copy-data-test/docker-compose.override.yml b/.github/doc-copy-data-test/docker-compose.override.yml new file mode 100644 index 000000000..07857b45e --- /dev/null +++ b/.github/doc-copy-data-test/docker-compose.override.yml @@ -0,0 +1,6 @@ +services: + src: + image: "blaze:latest" + + dst: + image: "blaze:latest" diff --git a/.github/openid-auth-test/docker-compose.yml b/.github/openid-auth-test/docker-compose.yml index 091cdf758..39d646a9f 100644 --- a/.github/openid-auth-test/docker-compose.yml +++ b/.github/openid-auth-test/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: keycloak: image: "jboss/keycloak:15.0.2" diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 38fbaea50..4fe4a8419 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -860,6 +860,50 @@ jobs: - name: Authenticated Request run: .github/scripts/authenticated-request.sh + doc-copy-data-test: + needs: build + runs-on: ubuntu-22.04 + + steps: + - name: Check out Git repository + uses: actions/checkout@v3 + + - name: Install Blazectl + run: .github/scripts/install-blazectl.sh + + - name: Download Blaze Image + uses: actions/download-artifact@v3 + with: + name: blaze-image + path: /tmp + + - name: Load Blaze Image + run: docker load --input /tmp/blaze.tar + + - name: Run Test Setup + run: docker-compose -f docs/data-sync/copy/docker-compose.yml -f .github/doc-copy-data-test/docker-compose.override.yml up -d + + - name: Wait for Source Blaze + run: .github/scripts/wait-for-url.sh http://localhost:8080/health + + - name: Load Data Into Source Blaze + run: blazectl --no-progress --server http://localhost:8080/fhir upload .github/test-data/synthea + + - name: Wait for Destination Blaze + run: .github/scripts/wait-for-url.sh http://localhost:8082/health + + - name: Copy All Resources from Source to Destination + run: scripts/copy-data.sh http://localhost:8080/fhir http://localhost:8082/fhir + + - name: Download Source Patients + run: blazectl download --server http://localhost:8080/fhir Patient | jq -c 'del(.meta.versionId) | del(.meta.lastUpdated)' > src-patients.ndjson + + - name: Download Destination Patients + run: blazectl download --server http://localhost:8082/fhir Patient | jq -c 'del(.meta.versionId) | del(.meta.lastUpdated)' > dst-patients.ndjson + + - name: Compare Source and Destination Patients + run: diff src-patients.ndjson dst-patients.ndjson + distributed-test: needs: build runs-on: ubuntu-22.04 @@ -1254,6 +1298,7 @@ jobs: - bundle-with-references-test - jepsen-test - openid-auth-test + - doc-copy-data-test - distributed-test - jepsen-distributed-test runs-on: ubuntu-22.04 diff --git a/docker-compose.yml b/docker-compose.yml index 73c08ef69..f6a1cf81d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.2' services: blaze: image: "samply/blaze:0.19" diff --git a/docs/authentication/docker-compose.yml b/docs/authentication/docker-compose.yml index 6e7f3ccd0..47772a10e 100644 --- a/docs/authentication/docker-compose.yml +++ b/docs/authentication/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: keycloak: image: "jboss/keycloak:15.0.2" diff --git a/docs/consistency/docker-compose.yml b/docs/consistency/docker-compose.yml index 77d8e27ac..25ddc6779 100644 --- a/docs/consistency/docker-compose.yml +++ b/docs/consistency/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: zookeeper-1: image: "docker.io/bitnami/zookeeper:3" diff --git a/docs/data-sync.md b/docs/data-sync.md index 62d68c173..dcc6183e7 100644 --- a/docs/data-sync.md +++ b/docs/data-sync.md @@ -1,14 +1,16 @@ # Sync Resources from Another FHIR Server to Blaze +## Using Subscriptions + If you want to facilitate the CQL engine or other features of Blaze, but you can't or don't like to use Blaze as your primary FHIR server, you can configure your primary FHIR server to automatically sync every change to Blaze by using the [subscription][1] mechanism. In this example we use [HAPI][2] as our primary FHIR server. In the `docs/data-sync` directory, you can find a Docker Compose file with a setup of a HAPI and a Blaze server. Please start the containers by running: ```sh -docker-compose up +docker-compose -f docs/data-sync/subscription/docker-compose.yml up ``` -after both servers are up and running, you can create two subscriptions, one for Patient resources and one for Observations. Please run: +After both servers are up and running, you can create two subscriptions, one for Patient resources and one for Observations. Please run: ```sh curl -H 'Content-Type: application/fhir+json' -d @subscription-bundle.json http://localhost:8090/fhir @@ -16,8 +18,76 @@ curl -H 'Content-Type: application/fhir+json' -d @subscription-bundle.json http: After you created the subscriptions, you can import or change data on the HAPI server, and it will be synced automatically to the Blaze server. -One problem, you may encounter is that if you issue transactions against HAPI with resources referencing each other, HAPI will not send them in the right order to Blaze, so that Blaze is complaining about violated referential integrity. +Because the subscription mechanism doesn't send the resources in the right order to satisfy referential integrity, Blaze is started with `ENFORCE_REFERENTIAL_INTEGRITY` set to `false`. + + +## Create a Full Clone of a Blaze Server + +Another use-case would be to copy all data from one Blaze server to another. That can be useful to either: + +* remove the history from a Blaze server, +* create a snapshot of all resources, +* migrate from Blaze to another FHIR server or the other way around. + +### Setup Test Environment + +In order to test copying all data from one Blaze server to another, start the following Docker Compose project: + +```sh +docker-compose -f docs/data-sync/copy/docker-compose.yml up +``` + +You should see a `src` server started at port 8080 and a `dst` server started at port 8082. + +### Load Data into the Source Server + +Next, load some data into the source server: + +```sh +blazectl upload --server http://localhost:8080/fhir .github/test-data/synthea +``` + +After that finishes, you can use `blazectl count-resources` to ensure that the source server has data and the destination server hasn't: + +```sh +blazectl count-resources --server http://localhost:8080/fhir +blazectl count-resources --server http://localhost:8082/fhir +``` +### Copy All Resources from Source to Destination + +The `copy-data.sh` script uses [GNU Parallel][3]. You may have to install that first. + +```sh +scripts/copy-data.sh http://localhost:8080/fhir http://localhost:8082/fhir +``` + +The script outputs `Successfully send transaction bundle` for each transaction bundle send to the destination server. + +You can use `blazectl count-resources` to see whether the resource counts of the destination server equals the resource counts of the source server: + +```sh +blazectl count-resources --server http://localhost:8080/fhir +blazectl count-resources --server http://localhost:8082/fhir +``` + +You can also compare the resource contents between the source and the destination server by downloading all resources (of a type), removing the `Meta.versionId` and `Meta.lastUpdated` values that will be different on the destination server: + +```sh +blazectl download --server http://localhost:8080/fhir Patient | jq -c 'del(.meta.versionId) | del(.meta.lastUpdated)' > src-patients.ndjson +blazectl download --server http://localhost:8082/fhir Patient | jq -c 'del(.meta.versionId) | del(.meta.lastUpdated)' > dst-patients.ndjson +diff src-patients.ndjson dst-patients.ndjson +``` + +### Save All Resources from the Source Server + +If you don't like to copy the data into the destination server immediately, you can also save the transaction bundles on disk and use `blazectl upload` later to upload them to the destination server. + +```sh +mkdir dst +scripts/save-data.sh http://localhost:8080/fhir dst +``` [1]: [2]: +[3]: diff --git a/docs/data-sync/copy/docker-compose.yml b/docs/data-sync/copy/docker-compose.yml new file mode 100644 index 000000000..d538e258f --- /dev/null +++ b/docs/data-sync/copy/docker-compose.yml @@ -0,0 +1,28 @@ +services: + src: + image: "samply/blaze:0.19" + environment: + BASE_URL: "http://localhost:8080" + JAVA_TOOL_OPTIONS: "-Xmx2g" + LOG_LEVEL: "debug" + ports: + - "8080:8080" + volumes: + - "blaze-data-src:/app/data" + + dst: + image: "samply/blaze:0.19" + environment: + BASE_URL: "http://localhost:8082" + SERVER_PORT: "8082" + JAVA_TOOL_OPTIONS: "-Xmx2g" + ENFORCE_REFERENTIAL_INTEGRITY: "false" + LOG_LEVEL: "debug" + ports: + - "8082:8082" + volumes: + - "blaze-data-dst:/app/data" + +volumes: + blaze-data-src: + blaze-data-dst: diff --git a/docs/data-sync/docker-compose.yml b/docs/data-sync/docker-compose.yml deleted file mode 100644 index 43cc90c39..000000000 --- a/docs/data-sync/docker-compose.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '3.2' -services: - blaze: - image: "samply/blaze:0.19" - environment: - BASE_URL: "http://localhost:8080" - JAVA_TOOL_OPTIONS: "-Xmx4g" - LOG_LEVEL: debug - ports: - - "8080:8080" - volumes: - - "blaze-data:/app/data" - - hapi: - image: "hapiproject/hapi:v5.4.1" - ports: - - "8090:8080" - environment: - CATALINA_OPTS: "-Xmx4g" - SPRING_DATASOURCE_URL: "jdbc:postgresql://hapi-db:5432/fhir?currentSchema=public" - SPRING_DATASOURCE_USERNAME: "postgres" - SPRING_DATASOURCE_PASSWORD: "postgres" - SPRING_DATASOURCE_DRIVERCLASSNAME: "org.postgresql.Driver" - SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT: "org.hibernate.dialect.PostgreSQL10Dialect" - HAPI_FHIR_SERVER_ADDRESS: "http://localhost:8090/fhir" - HAPI_FHIR_SUBSCRIPTION_RESTHOOK_ENABLED: "true" - depends_on: - - hapi-db - - hapi-db: - image: "postgres:12.4-alpine" - environment: - POSTGRES_PASSWORD: "postgres" - POSTGRES_DB: "fhir" - volumes: - - "hapi-data:/var/lib/postgresql/data" - -volumes: - blaze-data: - hapi-data: diff --git a/docs/data-sync/subscription/docker-compose.yml b/docs/data-sync/subscription/docker-compose.yml new file mode 100644 index 000000000..2c400e91c --- /dev/null +++ b/docs/data-sync/subscription/docker-compose.yml @@ -0,0 +1,24 @@ +services: + blaze: + image: "samply/blaze:0.19" + environment: + BASE_URL: "http://localhost:8080" + JAVA_TOOL_OPTIONS: "-Xmx2g" + ENFORCE_REFERENTIAL_INTEGRITY: "false" + LOG_LEVEL: "debug" + ports: + - "8080:8080" + volumes: + - "blaze-data:/app/data" + + hapi: + image: "hapiproject/hapi:latest" + ports: + - "8090:8080" + environment: + CATALINA_OPTS: "-Xmx2g" + HAPI_FHIR_SERVER_ADDRESS: "http://localhost:8090/fhir" + HAPI_FHIR_SUBSCRIPTION_RESTHOOK_ENABLED: "true" + +volumes: + blaze-data: diff --git a/docs/data-sync/subscription-bundle.json b/docs/data-sync/subscription/subscription-bundle.json similarity index 100% rename from docs/data-sync/subscription-bundle.json rename to docs/data-sync/subscription/subscription-bundle.json diff --git a/docs/deployment/distributed/docker-compose.yml b/docs/deployment/distributed/docker-compose.yml index 59f27c34b..51519f67a 100644 --- a/docs/deployment/distributed/docker-compose.yml +++ b/docs/deployment/distributed/docker-compose.yml @@ -1,4 +1,3 @@ -version: '3.7' services: zookeeper: image: "docker.io/bitnami/zookeeper:3" diff --git a/scripts/copy-data.sh b/scripts/copy-data.sh new file mode 100755 index 000000000..59db8864d --- /dev/null +++ b/scripts/copy-data.sh @@ -0,0 +1,35 @@ +#!/bin/bash -e + +# ### DISCLAIMER ### +# +# The error handling in this script is very basic. You have to verify +# that all resources are successfully transferred to your destination +# server after this script ends. +# + +# Usage: copy-data.sh + +SRC_BASE_URI="$1" +DST_BASE_URI="$2" +PAGE_SIZE=1000 +TRANSACTION_BUNDLE_SIZE=1000 +NUM_TRANSACTION_JOBS=2 + +transact() { + RESULT=$(jq -sc '{resourceType: "Bundle", type: "transaction", entry: .}' |\ + curl -s -w ''%{http_code}'' -o /dev/null -H 'Content-Type: application/fhir+json' -d @- "$1") + + if [ "$RESULT" = "200" ]; then + echo "Successfully send transaction bundle $2" + else + echo "Error while sending transaction bundle $2" + fi +} + +export -f transact + +echo "Copy all resources from $SRC_BASE_URI to $DST_BASE_URI..." + +blazectl download --server "$SRC_BASE_URI" -q "_count=$PAGE_SIZE" 2>/dev/null |\ + jq -c '{resource: ., request: {method: "PUT", url: (.resourceType + "/" + .id)}}' |\ + parallel --pipe -n "$TRANSACTION_BUNDLE_SIZE" -j "$NUM_TRANSACTION_JOBS" transact "$DST_BASE_URI" "{#}" diff --git a/scripts/save-data.sh b/scripts/save-data.sh new file mode 100755 index 000000000..37fd9382b --- /dev/null +++ b/scripts/save-data.sh @@ -0,0 +1,21 @@ +#!/bin/bash -e + +# Usage: save-data.sh + +SRC_BASE_URI="$1" +DST_DIR="$2" +PAGE_SIZE=1000 +NUM_JOBS=2 + +save-bundle() { + jq -sc '{resourceType: "Bundle", type: "transaction", entry: .}' | gzip > "$1/transaction-$2.json.gz" + echo "Successfully saved transaction bundle $2" +} + +export -f save-bundle + +echo "Save all resources from $SRC_BASE_URI into the directory $DST_DIR..." + +blazectl download --server "$SRC_BASE_URI" -q "_count=$PAGE_SIZE" 2>/dev/null |\ + jq -c '{resource: ., request: {method: "PUT", url: (.resourceType + "/" + .id)}}' |\ + parallel --pipe -n "$TRANSACTION_BUNDLE_SIZE" -j "$NUM_JOBS" save-bundle "$DST_DIR" "{#}" diff --git a/test-scripts/patient.json b/test-scripts/patient.json deleted file mode 100644 index 77dd37764..000000000 --- a/test-scripts/patient.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "resourceType": "Patient" -} diff --git a/test-scripts/system-history-paging.json b/test-scripts/system-history-paging.json deleted file mode 100644 index cea8a8932..000000000 --- a/test-scripts/system-history-paging.json +++ /dev/null @@ -1,220 +0,0 @@ -{ - "resourceType": "TestScript", - "url": "http://localhost:8080/foo", - "name": "SystemHistoryPaging", - "title": "System History Paging", - "status": "draft", - "fixture": [ - { - "id": "patient", - "autocreate": false, - "autodelete": false, - "resource": { - "reference": "patient.json" - } - } - ], - "variable": [ - { - "name": "OriginalHistorySelfURL", - "description": "The URL from the self link of the original history response.", - "expression": "Bundle.link.where(relation = 'self').url", - "sourceId": "OriginalHistory" - }, - { - "name": "OriginalHistoryNextURL", - "description": "The URL from the next link of the original history response.", - "expression": "Bundle.link.where(relation = 'next').url", - "sourceId": "OriginalHistory" - }, - { - "name": "OriginalHistoryTotal", - "description": "The bundle total value of the original history response.", - "expression": "Bundle.total", - "sourceId": "OriginalHistory" - } - ], - "setup": { - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "accept": "json", - "contentType": "json", - "encodeRequestUrl": false, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - }, - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "accept": "json", - "contentType": "json", - "encodeRequestUrl": false, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - } - ] - }, - "test": [ - { - "name": "Ensure System History Not Empty", - "description": "Ensure that the system history contains at least one entry.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "accept": "json", - "encodeRequestUrl": false, - "params": "/_history?_count=1", - "responseId": "OriginalHistory" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is greater then zero", - "expression": "Bundle.total > 0", - "warningOnly": false - } - } - ] - }, - { - "name": "Create another Patient", - "description": "Creates another Patient in order to a a new history entry.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - } - ] - }, - { - "name": "Ensure Original System History Still Reports the Same Total", - "description": "Ensure that the system history accessible from the self link of the original invocation reports still the same total value.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "accept": "json", - "encodeRequestUrl": false, - "url": "${OriginalHistorySelfURL}" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is the same as in the previous history", - "path": "$.total", - "value": "${OriginalHistoryTotal}", - "warningOnly": false - } - } - ] - }, - { - "name": "Ensure Next Page of Original History Still Reports the Same Total", - "description": "Ensure that the system history accessible from the next link of the original invocation reports still the same total value.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "accept": "json", - "encodeRequestUrl": false, - "url": "${OriginalHistoryNextURL}" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is the same as in the previous history", - "path": "$.total", - "value": "${OriginalHistoryTotal}", - "warningOnly": false - } - } - ] - } - ] -} diff --git a/test-scripts/type-history-paging.json b/test-scripts/type-history-paging.json deleted file mode 100644 index ee338d49c..000000000 --- a/test-scripts/type-history-paging.json +++ /dev/null @@ -1,221 +0,0 @@ -{ - "resourceType": "TestScript", - "url": "http://localhost:8080/foo", - "name": "TypeHistoryPaging", - "title": "Type History Paging", - "status": "draft", - "fixture": [ - { - "id": "patient", - "autocreate": false, - "autodelete": false, - "resource": { - "reference": "patient.json" - } - } - ], - "variable": [ - { - "name": "OriginalHistorySelfURL", - "description": "The URL from the self link of the original history response.", - "expression": "Bundle.link.where(relation = 'self').url", - "sourceId": "OriginalHistory" - }, - { - "name": "OriginalHistoryNextURL", - "description": "The URL from the next link of the original history response.", - "expression": "Bundle.link.where(relation = 'next').url", - "sourceId": "OriginalHistory" - }, - { - "name": "OriginalHistoryTotal", - "description": "The bundle total value of the original history response.", - "expression": "Bundle.total", - "sourceId": "OriginalHistory" - } - ], - "setup": { - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "accept": "json", - "contentType": "json", - "encodeRequestUrl": false, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - }, - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "accept": "json", - "contentType": "json", - "encodeRequestUrl": false, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - } - ] - }, - "test": [ - { - "name": "Ensure Type History Not Empty", - "description": "Ensure that the type history contains at least one entry.", - "action": [ - { - "operation": { - "type": { - "type": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "resource": "Patient", - "accept": "json", - "encodeRequestUrl": false, - "params": "/_history?_count=1", - "responseId": "OriginalHistory" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is greater then zero", - "expression": "Bundle.total > 0", - "warningOnly": false - } - } - ] - }, - { - "name": "Create another Patient", - "description": "Creates another Patient in order to a a new history entry.", - "action": [ - { - "operation": { - "type": { - "type": "http://hl7.org/fhir/testscript-operation-codes", - "code": "create" - }, - "sourceId": "patient" - } - }, - { - "assert": { - "description": "status code is 201", - "response": "created", - "warningOnly": false - } - } - ] - }, - { - "name": "Ensure Original Type History Still Reports the Same Total", - "description": "Ensure that the type history accessible from the self link of the original invocation reports still the same total value.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "accept": "json", - "encodeRequestUrl": false, - "url": "${OriginalHistorySelfURL}" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is the same as in the previous history", - "path": "$.total", - "value": "${OriginalHistoryTotal}", - "warningOnly": false - } - } - ] - }, - { - "name": "Ensure Next Page of Original History Still Reports the Same Total", - "description": "Ensure that the type history accessible from the next link of the original invocation reports still the same total value.", - "action": [ - { - "operation": { - "type": { - "system": "http://hl7.org/fhir/testscript-operation-codes", - "code": "history" - }, - "accept": "json", - "encodeRequestUrl": false, - "url": "${OriginalHistoryNextURL}" - } - }, - { - "assert": { - "description": "status code is 200", - "response": "okay", - "warningOnly": false - } - }, - { - "assert": { - "description": "the response contains a bundle", - "resource": "Bundle", - "warningOnly": false - } - }, - { - "assert": { - "description": "Bundle.total is the same as in the previous history", - "path": "$.total", - "value": "${OriginalHistoryTotal}", - "warningOnly": false - } - } - ] - } - ] -} From 7084e867561c3dec9a9c250994e43eaa40328fb6 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 17 Feb 2023 10:20:56 +0100 Subject: [PATCH 119/124] Release v0.19.3 --- CHANGELOG.md | 12 ++++++++++++ Dockerfile | 4 ++-- README.md | 4 ++-- build.clj | 2 +- docs/deployment/docker-deployment.md | 4 ++-- docs/deployment/manual-deployment.md | 12 ++++++------ modules/rest-api/src/blaze/rest_api/capabilities.clj | 4 ++-- perf-test/gatling/pom.xml | 2 +- src/blaze/system.clj | 2 +- 9 files changed, 29 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b5f6f90b..9c428dd6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## v0.19.3 + +### Bugfixes + +* Fix System Search Paging ([#910](https://github.com/samply/blaze/pull/910)) + +### Documentation + +* Extend Documentation of Data Sync ([#911](https://github.com/samply/blaze/pull/911)) + +The full changelog can be found [here](https://github.com/samply/blaze/milestone/61?closed=1). + ## v0.19.2 ### Bugfixes diff --git a/Dockerfile b/Dockerfile index 1d55605f2..f18206d3e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,7 +6,7 @@ RUN apt-get update && apt-get upgrade -y && \ rm -rf /var/lib/apt/lists/ RUN mkdir -p /app/data && chown 1001:1001 /app/data -COPY target/blaze-0.19.2-standalone.jar /app/ +COPY target/blaze-0.19.3-standalone.jar /app/ WORKDIR /app USER 1001 @@ -16,4 +16,4 @@ ENV INDEX_DB_DIR="/app/data/index" ENV TRANSACTION_DB_DIR="/app/data/transaction" ENV RESOURCE_DB_DIR="/app/data/resource" -CMD ["java", "-jar", "blaze-0.19.2-standalone.jar"] +CMD ["java", "-jar", "blaze-0.19.3-standalone.jar"] diff --git a/README.md b/README.md index a1ec61a94..e9d503687 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ The goal of this project is to provide a FHIR® Store with an internal CQL Evalu Blaze passes all [Touchstone FHIR 4.0.1 Basic Tests][12] and almost all [CQL Tests][3]. Please refer to the [Conformance](docs/conformance.md) section and report any issues you encounter during evaluation. -Latest release: [v0.19.2][5] +Latest release: [v0.19.3][5] ## Quick Start @@ -73,7 +73,7 @@ Unless required by applicable law or agreed to in writing, software distributed [3]: [4]: -[5]: +[5]: [6]: [7]: [8]: diff --git a/build.clj b/build.clj index 0880a6ea7..6287bfab8 100644 --- a/build.clj +++ b/build.clj @@ -2,7 +2,7 @@ (:require [clojure.tools.build.api :as b])) (def lib 'samply/blaze) -(def version "0.19.2") +(def version "0.19.3") (def class-dir "target/classes") (def basis (b/create-basis {:project "deps.edn"})) (def uber-file (format "target/%s-%s-standalone.jar" (name lib) version)) diff --git a/docs/deployment/docker-deployment.md b/docs/deployment/docker-deployment.md index 57315c564..b624bb9cd 100644 --- a/docs/deployment/docker-deployment.md +++ b/docs/deployment/docker-deployment.md @@ -27,7 +27,7 @@ Blaze should log something like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.2 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.3 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -47,7 +47,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.2" + "version": "0.19.3" } ``` diff --git a/docs/deployment/manual-deployment.md b/docs/deployment/manual-deployment.md index 28b91fe61..59d487755 100644 --- a/docs/deployment/manual-deployment.md +++ b/docs/deployment/manual-deployment.md @@ -2,12 +2,12 @@ The installation works under Windows, Linux and macOS. The only dependency is an installed OpenJDK 11 or 17 with 17 recommended. Blaze is tested with [Eclipse Temurin][1]. -Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.2). Look for `blaze-0.19.2-standalone.jar`. +Blaze runs on the JVM and comes as single JAR file. Download the most recent version [here](https://github.com/samply/blaze/releases/tag/v0.19.3). Look for `blaze-0.19.3-standalone.jar`. After the download, you can start blaze with the following command (Linux, macOS): ```sh -java -jar blaze-0.19.2-standalone.jar +java -jar blaze-0.19.3-standalone.jar ``` Blaze will run with an in-memory, volatile database for testing and demo purposes. @@ -17,14 +17,14 @@ Blaze can be run with durable storage by setting the environment variables `STOR Under Linux/macOS: ```sh -STORAGE=standalone java -jar blaze-0.19.2-standalone.jar +STORAGE=standalone java -jar blaze-0.19.3-standalone.jar ``` Under Windows, you need to set the Environment variables in the PowerShell before starting Blaze: ```powershell $Env:STORAGE="standalone" -java -jar blaze-0.19.2-standalone.jar +java -jar blaze-0.19.3-standalone.jar ``` This will create three directories called `index`, `transaction` and `resource` inside the current working directory, one for each database part used. @@ -42,7 +42,7 @@ The output should look like this: 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:64] - JVM version: 16.0.2 2021-06-27T11:02:37.834Z ee086ef908c1 main INFO [blaze.core:65] - Maximum available memory: 1738 MiB 2021-06-27T11:02:37.835Z ee086ef908c1 main INFO [blaze.core:66] - Number of available processors: 8 -2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.2 in 8.2 seconds +2021-06-27T11:02:37.836Z ee086ef908c1 main INFO [blaze.core:67] - Successfully started Blaze version 0.19.3 in 8.2 seconds ``` In order to test connectivity, query the health endpoint: @@ -62,7 +62,7 @@ that should return: ```json { "name": "Blaze", - "version": "0.19.2" + "version": "0.19.3" } ``` diff --git a/modules/rest-api/src/blaze/rest_api/capabilities.clj b/modules/rest-api/src/blaze/rest_api/capabilities.clj index 0f065c30c..23e867e4d 100644 --- a/modules/rest-api/src/blaze/rest_api/capabilities.clj +++ b/modules/rest-api/src/blaze/rest_api/capabilities.clj @@ -117,11 +117,11 @@ :copyright #fhir/markdown"Copyright 2019 - 2023 The Samply Community\n\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at\n\nhttp://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License." :kind #fhir/code"instance" - :date #fhir/dateTime"2023-02-13" + :date #fhir/dateTime"2023-02-17" :software {:name "Blaze" :version version - :releaseDate #fhir/dateTime"2023-02-13"} + :releaseDate #fhir/dateTime"2023-02-17"} :implementation {:description "Blaze"} :fhirVersion #fhir/code"4.0.1" diff --git a/perf-test/gatling/pom.xml b/perf-test/gatling/pom.xml index 9f382b4bd..b123362f6 100644 --- a/perf-test/gatling/pom.xml +++ b/perf-test/gatling/pom.xml @@ -5,7 +5,7 @@ samply.blaze gatling - 0.19.2 + 0.19.3 1.8 diff --git a/src/blaze/system.clj b/src/blaze/system.clj index a6849ca00..973553316 100644 --- a/src/blaze/system.clj +++ b/src/blaze/system.clj @@ -85,7 +85,7 @@ (def ^:private root-config - {:blaze/version "0.19.2" + {:blaze/version "0.19.3" :blaze/clock {} From 276159c286b9e66c99cba140daddb6c14c983e3d Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 17 Feb 2023 10:15:30 +0100 Subject: [PATCH 120/124] Refactor Verify Test --- .../src/blaze/db/node/tx_indexer/verify.clj | 17 +- .../impl/index/resource_as_of_test_util.clj | 39 +- .../db/impl/index/system_as_of_test_util.clj | 35 +- .../db/impl/index/system_stats_test_util.clj | 21 +- .../db/impl/index/type_as_of_test_util.clj | 35 +- .../db/impl/index/type_stats_test_util.clj | 23 +- .../blaze/db/node/tx_indexer/verify_test.clj | 451 ++++++++---------- 7 files changed, 277 insertions(+), 344 deletions(-) diff --git a/modules/db/src/blaze/db/node/tx_indexer/verify.clj b/modules/db/src/blaze/db/node/tx_indexer/verify.clj index a8212df41..95af94e61 100644 --- a/modules/db/src/blaze/db/node/tx_indexer/verify.clj +++ b/modules/db/src/blaze/db/node/tx_indexer/verify.clj @@ -115,7 +115,7 @@ Throws an anomaly on conflicts." {:arglists '([db-before t res cmd])} - (fn [_ _ _ {:keys [op]}] op)) + (fn [_db-before _t _res {:keys [op]}] op)) (defn- verify-tx-cmd-create-msg [type id] @@ -135,6 +135,9 @@ (rts/index-entries tid (codec/id-byte-string id) t hash num-changes op)) +(def ^:private inc-0 (fnil inc 0)) + + (defmethod verify-tx-cmd "create" [db-before t res {:keys [type id hash]}] (log/trace (verify-tx-cmd-create-msg type id)) @@ -143,8 +146,8 @@ (let [tid (codec/tid type)] (-> (update res :entries into (index-entries tid id t hash 1 :create)) (update :new-resources conj [type id]) - (update-in [:stats tid :num-changes] (fnil inc 0)) - (update-in [:stats tid :total] (fnil inc 0)))))) + (update-in [:stats tid :num-changes] inc-0) + (update-in [:stats tid :total] inc-0))))) (defn- verify-tx-cmd-put-msg [type id if-match if-none-match] @@ -202,9 +205,9 @@ (cond-> (-> (update res :entries into (index-entries tid id t hash (inc num-changes) :put)) (update :new-resources conj [type id]) - (update-in [:stats tid :num-changes] (fnil inc 0))) + (update-in [:stats tid :num-changes] inc-0)) (or (nil? old-t) (identical? :delete op)) - (update-in [:stats tid :total] (fnil inc 0))))))) + (update-in [:stats tid :total] inc-0)))))) (defmethod verify-tx-cmd "delete" @@ -217,13 +220,13 @@ (cond-> (-> (update res :entries into (index-entries tid id t hash/deleted-hash (inc num-changes) :delete)) (update :del-resources conj [type id]) - (update-in [:stats tid :num-changes] (fnil inc 0))) + (update-in [:stats tid :num-changes] inc-0)) (and op (not (identical? :delete op))) (update-in [:stats tid :total] (fnil dec 0)))))) (defmethod verify-tx-cmd :default - [_ _ res _] + [_db-before _t res _tx-cmd] res) diff --git a/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj index d39284785..3afb8681e 100644 --- a/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj @@ -10,26 +10,19 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human - ([] (bb/allocate-direct 128)) - ([buf] - (let [tid (bb/get-int! buf) - id-size (- (bb/remaining buf) codec/t-size)] - {:type (codec/tid->type tid) - :id (codec/id-string (bs/from-byte-buffer! buf id-size)) - :t (codec/descending-long (bb/get-long! buf))}))) - - -(defn decode-value-human - ([] (bb/allocate-direct (+ hash/size Long/BYTES))) - ([buf] - (let [hash (bs/from-byte-buffer! buf hash/size) - state (bb/get-long! buf)] - {:hash hash - :num-changes (rh/state->num-changes state) - :op (rh/state->op state)}))) - - -(defn decode-index-entry [[k v]] - [(decode-key-human (bb/wrap k)) - (decode-value-human (bb/wrap v))]) +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array) + tid (bb/get-int! buf) + id-size (- (bb/remaining buf) codec/t-size)] + {:type (codec/tid->type tid) + :id (codec/id-string (bs/from-byte-buffer! buf id-size)) + :t (codec/descending-long (bb/get-long! buf))})) + + +(defn decode-val [byte-array] + (let [buf (bb/wrap byte-array) + hash (hash/from-byte-buffer! buf) + state (bb/get-long! buf)] + {:hash hash + :num-changes (rh/state->num-changes state) + :op (rh/state->op state)})) diff --git a/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj index 7f8c3356e..fd8db7ce8 100644 --- a/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj @@ -10,24 +10,17 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human - ([] (bb/allocate-direct 128)) - ([buf] - {:t (codec/descending-long (bb/get-long! buf)) - :type (codec/tid->type (bb/get-int! buf)) - :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) - - -(defn decode-value-human - ([] (bb/allocate-direct (+ hash/size Long/BYTES))) - ([buf] - (let [hash (bs/from-byte-buffer! buf hash/size) - state (bb/get-long! buf)] - {:hash hash - :num-changes (rh/state->num-changes state) - :op (rh/state->op state)}))) - - -(defn decode-index-entry [[k v]] - [(decode-key-human (bb/wrap k)) - (decode-value-human (bb/wrap v))]) +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array)] + {:t (codec/descending-long (bb/get-long! buf)) + :type (codec/tid->type (bb/get-int! buf)) + :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) + + +(defn decode-val [byte-array] + (let [buf (bb/wrap byte-array) + hash (hash/from-byte-buffer! buf) + state (bb/get-long! buf)] + {:hash hash + :num-changes (rh/state->num-changes state) + :op (rh/state->op state)})) diff --git a/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj b/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj index 2cb07ff77..001b12f9d 100644 --- a/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj @@ -7,19 +7,12 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human - ([] (bb/allocate-direct codec/t-size)) - ([buf] - {:t (codec/descending-long (bb/get-long! buf))})) +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array)] + {:t (codec/descending-long (bb/get-long! buf))})) -(defn decode-value-human - ([] (bb/allocate-direct (+ Long/BYTES Long/BYTES))) - ([buf] - {:total (bb/get-long! buf) - :num-changes (bb/get-long! buf)})) - - -(defn decode-index-entry [[k v]] - [(decode-key-human (bb/wrap k)) - (decode-value-human (bb/wrap v))]) +(defn decode-val [byte-array] + (let [buf (bb/wrap byte-array)] + {:total (bb/get-long! buf) + :num-changes (bb/get-long! buf)})) diff --git a/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj index 525bdf2d1..bd8e7f89f 100644 --- a/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj @@ -10,24 +10,17 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human - ([] (bb/allocate-direct 128)) - ([buf] - {:type (codec/tid->type (bb/get-int! buf)) - :t (codec/descending-long (bb/get-long! buf)) - :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) - - -(defn decode-value-human - ([] (bb/allocate-direct (+ hash/size Long/BYTES))) - ([buf] - (let [hash (bs/from-byte-buffer! buf hash/size) - state (bb/get-long! buf)] - {:hash hash - :num-changes (rh/state->num-changes state) - :op (rh/state->op state)}))) - - -(defn decode-index-entry [[k v]] - [(decode-key-human (bb/wrap k)) - (decode-value-human (bb/wrap v))]) +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array)] + {:type (codec/tid->type (bb/get-int! buf)) + :t (codec/descending-long (bb/get-long! buf)) + :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) + + +(defn decode-val [byte-array] + (let [buf (bb/wrap byte-array) + hash (hash/from-byte-buffer! buf) + state (bb/get-long! buf)] + {:hash hash + :num-changes (rh/state->num-changes state) + :op (rh/state->op state)})) diff --git a/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj b/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj index e3bf442e0..b5932fbfc 100644 --- a/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj @@ -7,20 +7,13 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human - ([] (bb/allocate-direct (+ codec/tid-size codec/t-size))) - ([buf] - {:type (codec/tid->type (bb/get-int! buf)) - :t (codec/descending-long (bb/get-long! buf))})) +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array)] + {:type (codec/tid->type (bb/get-int! buf)) + :t (codec/descending-long (bb/get-long! buf))})) -(defn decode-value-human - ([] (bb/allocate-direct (+ Long/BYTES Long/BYTES))) - ([buf] - {:total (bb/get-long! buf) - :num-changes (bb/get-long! buf)})) - - -(defn decode-index-entry [[k v]] - [(decode-key-human (bb/wrap k)) - (decode-value-human (bb/wrap v))]) +(defn decode-val [byte-array] + (let [buf (bb/wrap byte-array)] + {:total (bb/get-long! buf) + :num-changes (bb/get-long! buf)})) diff --git a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj index 971aa59f1..cc0dab231 100644 --- a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj +++ b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj @@ -1,18 +1,11 @@ (ns blaze.db.node.tx-indexer.verify-test (:require - [blaze.byte-string :as bs] [blaze.db.api :as d] [blaze.db.impl.codec :as codec] - [blaze.db.impl.index.resource-as-of :as rao] [blaze.db.impl.index.resource-as-of-test-util :as rao-tu] - [blaze.db.impl.index.rts-as-of :as rts] - [blaze.db.impl.index.system-as-of :as sao] [blaze.db.impl.index.system-as-of-test-util :as sao-tu] - [blaze.db.impl.index.system-stats :as system-stats] [blaze.db.impl.index.system-stats-test-util :as ss-tu] - [blaze.db.impl.index.type-as-of :as tao] [blaze.db.impl.index.type-as-of-test-util :as tao-tu] - [blaze.db.impl.index.type-stats :as type-stats] [blaze.db.impl.index.type-stats-test-util :as ts-tu] [blaze.db.kv.mem] [blaze.db.kv.mem-spec] @@ -21,7 +14,7 @@ [blaze.db.node.tx-indexer.verify-spec] [blaze.db.resource-handle-cache] [blaze.db.search-param-registry] - [blaze.db.test-util :refer [system]] + [blaze.db.test-util :refer [system with-system-data]] [blaze.db.tx-cache] [blaze.db.tx-log.local] [blaze.fhir.hash :as hash] @@ -32,7 +25,6 @@ [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [deftest is testing]] - [clojure.walk :as walk] [cognitect.anomalies :as anom] [juxt.iota :refer [given]] [taoensso.timbre :as log])) @@ -50,272 +42,239 @@ (def patient-0 {:fhir/type :fhir/Patient :id "0"}) (def patient-0-v2 {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"}) (def patient-1 {:fhir/type :fhir/Patient :id "1"}) -(def patient-2 {:fhir/type :fhir/Patient :id "2"}) -(def patient-3 {:fhir/type :fhir/Patient :id "3" +(def patient-2 {:fhir/type :fhir/Patient :id "2" :identifier [#fhir/Identifier{:value "120426"}]}) -(defn bytes->vec [x] - (if (bytes? x) (vec x) x)) - - -(defmacro is-entries= [a b] - `(is (= (walk/postwalk bytes->vec ~a) (walk/postwalk bytes->vec ~b)))) - - -(def ^:private deleted-hash - "The hash of a deleted version of a resource." - (bs/from-byte-array (byte-array 32))) - - (deftest verify-tx-cmds-test (testing "adding one patient to an empty store" - (with-system [{:blaze.db/keys [node]} system] - (is-entries= - (verify/verify-tx-cmds - (d/db node) 1 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0)}]) - (let [value (rts/encode-value (hash/generate patient-0) 1 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 1) - value] - [:type-as-of-index - (tao/encode-key tid-patient 1 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 1 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 1 {:total 1 :num-changes 1}) - (system-stats/index-entry 1 {:total 1 :num-changes 1})]))) - - (testing "using if-none-match of `*`" - (with-system [{:blaze.db/keys [node]} system] - (is-entries= - (verify/verify-tx-cmds - (d/db node) 1 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) - :if-none-match "*"}]) - (let [value (rts/encode-value (hash/generate patient-0) 1 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 1) - value] - [:type-as-of-index - (tao/encode-key tid-patient 1 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 1 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 1 {:total 1 :num-changes 1}) - (system-stats/index-entry 1 {:total 1 :num-changes 1})]))))) + (let [hash (hash/generate patient-0)] + (doseq [op [:create :put] + if-none-match [nil "*"]] + (with-system [{:blaze.db/keys [node]} system] + (given (verify/verify-tx-cmds + (d/db node) 1 + [(cond-> {:op (name op) :type "Patient" :id "0" :hash hash} + if-none-match + (assoc :if-none-match if-none-match))]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 1} + [0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 1} + [3 2 ts-tu/decode-val] := {:total 1 :num-changes 1} + + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 1} + [4 2 ss-tu/decode-val] := {:total 1 :num-changes 1}))))) (testing "adding a second version of a patient to a store containing it already" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (is-entries= - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0-v2)}]) - (let [value (rts/encode-value (hash/generate patient-0-v2) 2 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 2) - value] - [:type-as-of-index - (tao/encode-key tid-patient 2 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 2 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 2 {:total 1 :num-changes 2}) - (system-stats/index-entry 2 {:total 1 :num-changes 2})]))) - - (testing "using matching if-match" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (is-entries= - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0-v2) - :if-match 1}]) - (let [value (rts/encode-value (hash/generate patient-0-v2) 2 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 2) - value] - [:type-as-of-index - (tao/encode-key tid-patient 2 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 2 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 2 {:total 1 :num-changes 2}) - (system-stats/index-entry 2 {:total 1 :num-changes 2})]))))) + (let [hash (hash/generate patient-0-v2)] + (doseq [if-match [nil 1]] + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [(cond-> {:op "put" :type "Patient" :id "0" :hash hash} + if-match + (assoc :if-match if-match))]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} + [0 2 rao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [3 2 ts-tu/decode-val] := {:total 1 :num-changes 2} + + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 2} + [4 2 ss-tu/decode-val] := {:total 1 :num-changes 2}))))) (testing "deleting a patient from an empty store" (with-system [{:blaze.db/keys [node]} system] (given (verify/verify-tx-cmds (d/db node) 1 [{:op "delete" :type "Patient" :id "0"}]) - [0 #(drop 1 %) rao-tu/decode-index-entry] := - [{:type "Patient" :id "0" :t 1} - {:hash deleted-hash :num-changes 1 :op :delete}] + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 1} + [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - [1 #(drop 1 %) tao-tu/decode-index-entry] := - [{:type "Patient" :t 1 :id "0"} - {:hash deleted-hash :num-changes 1 :op :delete}] + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - [2 #(drop 1 %) sao-tu/decode-index-entry] := - [{:t 1 :type "Patient" :id "0"} - {:hash deleted-hash :num-changes 1 :op :delete}] + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - [3 #(drop 1 %) ts-tu/decode-index-entry] := - [{:type "Patient" :t 1} - {:total 0 :num-changes 1}] + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 1} + [3 2 ts-tu/decode-val] := {:total 0 :num-changes 1} - [4 #(drop 1 %) ss-tu/decode-index-entry] := - [{:t 1} - {:total 0 :num-changes 1}]))) + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 1} + [4 2 ss-tu/decode-val] := {:total 0 :num-changes 1}))) (testing "deleting an already deleted patient" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:delete "Patient" "0"]]) - - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "delete" :type "Patient" :id "0"}]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:delete "Patient" "0"]]] - [0 #(drop 1 %) rao-tu/decode-index-entry] := - [{:type "Patient" :id "0" :t 2} - {:hash deleted-hash :num-changes 2 :op :delete}] + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "delete" :type "Patient" :id "0"}]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} + [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [1 #(drop 1 %) tao-tu/decode-index-entry] := - [{:type "Patient" :t 2 :id "0"} - {:hash deleted-hash :num-changes 2 :op :delete}] + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [2 #(drop 1 %) sao-tu/decode-index-entry] := - [{:t 2 :type "Patient" :id "0"} - {:hash deleted-hash :num-changes 2 :op :delete}] + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [3 #(drop 1 %) ts-tu/decode-index-entry] := - [{:type "Patient" :t 2} - {:total 0 :num-changes 2}] + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} - [4 #(drop 1 %) ss-tu/decode-index-entry] := - [{:t 2} - {:total 0 :num-changes 2}]))) + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 2} + [4 2 ss-tu/decode-val] := {:total 0 :num-changes 2}))) (testing "deleting an existing patient" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "delete" :type "Patient" :id "0"}]) - - [0 #(drop 1 %) rao-tu/decode-index-entry] := - [{:type "Patient" :id "0" :t 2} - {:hash deleted-hash :num-changes 2 :op :delete}] + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "delete" :type "Patient" :id "0"}]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} + [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [1 #(drop 1 %) tao-tu/decode-index-entry] := - [{:type "Patient" :t 2 :id "0"} - {:hash deleted-hash :num-changes 2 :op :delete}] + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [2 #(drop 1 %) sao-tu/decode-index-entry] := - [{:t 2 :type "Patient" :id "0"} - {:hash deleted-hash :num-changes 2 :op :delete}] + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} - [3 #(drop 1 %) ts-tu/decode-index-entry] := - [{:type "Patient" :t 2} - {:total 0 :num-changes 2}] + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} - [4 #(drop 1 %) ss-tu/decode-index-entry] := - [{:t 2} - {:total 0 :num-changes 2}]))) + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 2} + [4 2 ss-tu/decode-val] := {:total 0 :num-changes 2}))) (testing "adding a second patient to a store containing already one" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (is-entries= - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "1" :hash (hash/generate patient-1)}]) - (let [value (rts/encode-value (hash/generate patient-1) 1 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "1") 2) - value] - [:type-as-of-index - (tao/encode-key tid-patient 2 (codec/id-byte-string "1")) - value] - [:system-as-of-index - (sao/encode-key 2 tid-patient (codec/id-byte-string "1")) - value] - (type-stats/index-entry tid-patient 2 {:total 2 :num-changes 2}) - (system-stats/index-entry 2 {:total 2 :num-changes 2})])))) + (let [hash (hash/generate patient-1)] + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "1" :hash hash}]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "1" :t 2} + [0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "1"} + [1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "1"} + [2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [3 2 ts-tu/decode-val] := {:total 2 :num-changes 2} + + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 2} + [4 2 ss-tu/decode-val] := {:total 2 :num-changes 2})))) (testing "update conflict" (testing "using non-matching if-match" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) - :if-match 0}]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" + :hash (hash/generate patient-0) + :if-match 0}]) ::anom/category := ::anom/conflict ::anom/message := "Precondition `W/\"0\"` failed on `Patient/0`." :http/status := 412))) (testing "using if-none-match of `*`" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) - :if-none-match "*"}]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" + :hash (hash/generate patient-0) + :if-none-match "*"}]) ::anom/category := ::anom/conflict ::anom/message := "Resource `Patient/0` already exists." :http/status := 412))) (testing "using matching if-none-match" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]]) - - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "put" :type "Patient" :id "0" :hash (hash/generate patient-0) - :if-none-match 1}]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "put" :type "Patient" :id "0" + :hash (hash/generate patient-0) + :if-none-match 1}]) ::anom/category := ::anom/conflict ::anom/message := "Resource `Patient/0` with version 1 already exists." :http/status := 412)))) (testing "conditional create" (testing "conflict" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0" - :birthDate #fhir/date"2020"}] - [:put {:fhir/type :fhir/Patient :id "1" - :birthDate #fhir/date"2020"}]]) - - (given - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "create" :type "Patient" :id "foo" - :hash (hash/generate patient-0) - :if-none-exist [["birthdate" "2020"]]}]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put {:fhir/type :fhir/Patient :id "0" + :birthDate #fhir/date"2020"}] + [:put {:fhir/type :fhir/Patient :id "1" + :birthDate #fhir/date"2020"}]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "create" :type "Patient" :id "foo" + :hash (hash/generate patient-0) + :if-none-exist [["birthdate" "2020"]]}]) ::anom/category := ::anom/conflict ::anom/message := "Conditional create of a Patient with query `birthdate=2020` failed because at least the two matches `Patient/0/_history/1` and `Patient/1/_history/1` were found." :http/status := 412))) (testing "match" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put patient-3]]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-2]]] (is (empty? @@ -326,38 +285,44 @@ :if-none-exist [["identifier" "120426"]]}]))))) (testing "conflict because matching resource is deleted" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put patient-3]]) + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-2]]] (given (verify/verify-tx-cmds (d/db node) 2 - [{:op "delete" :type "Patient" :id "3"} + [{:op "delete" :type "Patient" :id "2"} {:op "create" :type "Patient" :id "0" :hash (hash/generate patient-0) :if-none-exist [["identifier" "120426"]]}]) ::anom/category := ::anom/conflict - ::anom/message := "Duplicate transaction commands `create Patient?identifier=120426 (resolved to id 3)` and `delete Patient/3`."))) + ::anom/message := "Duplicate transaction commands `create Patient?identifier=120426 (resolved to id 2)` and `delete Patient/2`."))) (testing "on recreation" - (with-system [{:blaze.db/keys [node]} system] - @(d/transact node [[:put patient-0]]) - @(d/transact node [[:delete "Patient" "0"]]) - - (is-entries= - (verify/verify-tx-cmds - (d/db node) 3 - [{:op "put" :type "Patient" :id "0" - :hash (hash/generate patient-0)}]) - (let [value (rts/encode-value (hash/generate patient-0) 3 :put)] - [[:resource-as-of-index - (rao/encode-key tid-patient (codec/id-byte-string "0") 3) - value] - [:type-as-of-index - (tao/encode-key tid-patient 3 (codec/id-byte-string "0")) - value] - [:system-as-of-index - (sao/encode-key 3 tid-patient (codec/id-byte-string "0")) - value] - (type-stats/index-entry tid-patient 3 {:total 1 :num-changes 3}) - (system-stats/index-entry 3 {:total 1 :num-changes 3})])))))) + (let [hash (hash/generate patient-0)] + (with-system-data [{:blaze.db/keys [node]} system] + [[[:put patient-0]] + [[:delete "Patient" "0"]]] + + (given (verify/verify-tx-cmds + (d/db node) 3 + [{:op "put" :type "Patient" :id "0" :hash hash}]) + [0 0] := :resource-as-of-index + [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 3} + [0 2 rao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} + + [1 0] := :type-as-of-index + [1 1 tao-tu/decode-key] := {:type "Patient" :t 3 :id "0"} + [1 2 tao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} + + [2 0] := :system-as-of-index + [2 1 sao-tu/decode-key] := {:t 3 :type "Patient" :id "0"} + [2 2 sao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} + + [3 0] := :type-stats-index + [3 1 ts-tu/decode-key] := {:type "Patient" :t 3} + [3 2 ts-tu/decode-val] := {:total 1 :num-changes 3} + + [4 0] := :system-stats-index + [4 1 ss-tu/decode-key] := {:t 3} + [4 2 ss-tu/decode-val] := {:total 1 :num-changes 3})))))) From 548133c283d0a7d3f17d94660c1c9c948b143dad Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Fri, 17 Feb 2023 17:51:50 +0100 Subject: [PATCH 121/124] Switch CI to develop-db-v1 --- .github/workflows/build.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4fe4a8419..7d3d85f35 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,13 +6,13 @@ on: push: branches: - master - - develop + - develop-db-v1 tags: - 'v*.*.*' pull_request: branches: - master - - develop + - develop-db-v1 jobs: lint: From 17797f5ba62c8fa4734b41b8f06ed3a6702955eb Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sat, 4 Jun 2022 17:37:41 +0200 Subject: [PATCH 122/124] Increase V-Hash Size from 32 Bit to 64 Bit In case we have 1 million different identifiers, we will have v-hash collisions. So we have to increase the v-hash size from 32 bit to 64 bit. --- modules/db/src/blaze/db/impl/codec.clj | 4 +- modules/db/src/blaze/db/node.clj | 17 ++-- modules/db/src/blaze/db/node/version.clj | 15 +++- modules/db/test/blaze/db/api_test.clj | 22 +++--- modules/db/test/blaze/db/impl/codec_test.clj | 6 ++ .../db/impl/search_param/composite_test.clj | 2 +- .../blaze/db/node/resource_indexer_test.clj | 79 ++++++++++--------- .../db/test/blaze/db/node/version_spec.clj | 19 +++++ modules/db/test/blaze/db/node_test.clj | 19 +++-- 9 files changed, 111 insertions(+), 72 deletions(-) create mode 100644 modules/db/test/blaze/db/node/version_spec.clj diff --git a/modules/db/src/blaze/db/impl/codec.clj b/modules/db/src/blaze/db/impl/codec.clj index 63888db63..7e805ba26 100644 --- a/modules/db/src/blaze/db/impl/codec.clj +++ b/modules/db/src/blaze/db/impl/codec.clj @@ -18,7 +18,7 @@ ;; ---- Sizes of Byte Arrays -------------------------------------------------- (def ^:const ^long c-hash-size Integer/BYTES) -(def ^:const ^long v-hash-size Integer/BYTES) +(def ^:const ^long v-hash-size Long/BYTES) (def ^:const ^long tid-size Integer/BYTES) (def ^:const ^long t-size Long/BYTES) (def ^:const ^long state-size Long/BYTES) @@ -299,7 +299,7 @@ (defn v-hash [value] - (-> (Hashing/murmur3_32_fixed) + (-> (Hashing/farmHashFingerprint64) (.hashString value StandardCharsets/UTF_8) (.asBytes) bs/from-byte-array)) diff --git a/modules/db/src/blaze/db/node.clj b/modules/db/src/blaze/db/node.clj index c738b4a4b..acc335abe 100644 --- a/modules/db/src/blaze/db/node.clj +++ b/modules/db/src/blaze/db/node.clj @@ -445,11 +445,7 @@ [:blaze.db/enforce-referential-integrity])) -(def ^:private expected-kv-store-version 0) - - -(defn- kv-store-version [kv-store] - (or (some-> (kv/get kv-store version/key) version/decode-value) 0)) +(def ^:private expected-kv-store-version 1) (def ^:private incompatible-kv-store-version-msg @@ -469,13 +465,14 @@ {:actual-version actual-version :expected-version expected-version})) -(defn- check-version! [kv-store] - (when (tx-success/last-t kv-store) - (let [actual-kv-store-version (kv-store-version kv-store)] +(defn- check-and-set-version! [kv-store] + (if (tx-success/last-t kv-store) + (let [actual-kv-store-version (version/get kv-store)] (if (= actual-kv-store-version expected-kv-store-version) (log/info "Index store version is" actual-kv-store-version) (throw (incompatible-kv-store-version-ex actual-kv-store-version - expected-kv-store-version)))))) + expected-kv-store-version)))) + (version/set! kv-store expected-kv-store-version))) (defmethod ig/init-key :blaze.db/node @@ -484,7 +481,7 @@ :or {poll-timeout (time/seconds 1)} :as config}] (init-msg config) - (check-version! kv-store) + (check-and-set-version! kv-store) (let [node (->Node (ctx config) tx-log resource-handle-cache tx-cache kv-store resource-store search-param-registry resource-indexer (atom (initial-state kv-store)) diff --git a/modules/db/src/blaze/db/node/version.clj b/modules/db/src/blaze/db/node/version.clj index 001532381..00ec0d3d0 100644 --- a/modules/db/src/blaze/db/node/version.clj +++ b/modules/db/src/blaze/db/node/version.clj @@ -1,7 +1,8 @@ (ns blaze.db.node.version - (:refer-clojure :exclude [key]) + (:refer-clojure :exclude [get key]) (:require - [blaze.byte-buffer :as bb]) + [blaze.byte-buffer :as bb] + [blaze.db.kv :as kv]) (:import [java.nio.charset StandardCharsets])) @@ -19,5 +20,13 @@ (bb/array))) -(defn decode-value [bytes] +(defn- decode-value [bytes] (bb/get-int! (bb/wrap bytes))) + + +(defn get [store] + (or (some-> (kv/get store key) decode-value) 0)) + + +(defn set! [store version] + (kv/put! store key (encode-value version))) diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index 190e04e3b..c335daf24 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -2428,29 +2428,29 @@ (:kv-store node) :type :id :hash-prefix :code :v-hash) [["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "value-quantity" #blaze/byte-string"0000000080"] + "value-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "value-quantity" #blaze/byte-string"5C38E45A80"] + "value-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "value-quantity" #blaze/byte-string"9B780D9180"] + "value-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "combo-value-quantity" #blaze/byte-string"0000000080"] + "combo-value-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "combo-value-quantity" #blaze/byte-string"5C38E45A80"] + "combo-value-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "combo-value-quantity" #blaze/byte-string"9B780D9180"] + "combo-value-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" - "_id" #blaze/byte-string"165494C5"] + "_id" #blaze/byte-string"490E5C1C8B04CCEC"] ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" "_lastUpdated" #blaze/byte-string"80008001"] ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" - "context-quantity" #blaze/byte-string"0000000080"] + "context-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" - "context-quantity" #blaze/byte-string"5C38E45A80"] + "context-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" - "context-quantity" #blaze/byte-string"9B780D9180"] + "context-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" - "_id" #blaze/byte-string"165494C5"] + "_id" #blaze/byte-string"490E5C1C8B04CCEC"] ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" "_lastUpdated" #blaze/byte-string"80008001"]]))) diff --git a/modules/db/test/blaze/db/impl/codec_test.clj b/modules/db/test/blaze/db/impl/codec_test.clj index 3d614c489..1feeaab75 100644 --- a/modules/db/test/blaze/db/impl/codec_test.clj +++ b/modules/db/test/blaze/db/impl/codec_test.clj @@ -48,6 +48,12 @@ (apply codec/descending-long [(apply codec/descending-long [t])]))))) +(deftest v-hash-test + (testing "no collisions" + (let [n (long 1e7)] + (is (= n (count (into #{} (map (comp codec/v-hash str)) (repeatedly n random-uuid)))))))) + + (deftest tid-test (check `codec/tid)) diff --git a/modules/db/test/blaze/db/impl/search_param/composite_test.clj b/modules/db/test/blaze/db/impl/search_param/composite_test.clj index b262c5966..693e767ff 100644 --- a/modules/db/test/blaze/db/impl/search_param/composite_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/composite_test.clj @@ -57,7 +57,7 @@ (defn- split-value [bs] - [(bs/subs bs 0 4) (bs/subs bs 4)]) + [(bs/subs bs 0 codec/v-hash-size) (bs/subs bs codec/v-hash-size)]) (defn compile-code-quantity-value [search-param-registry value] diff --git a/modules/db/test/blaze/db/node/resource_indexer_test.clj b/modules/db/test/blaze/db/node/resource_indexer_test.clj index 84d094b92..297f02e50 100644 --- a/modules/db/test/blaze/db/node/resource_indexer_test.clj +++ b/modules/db/test/blaze/db/node/resource_indexer_test.clj @@ -241,19 +241,20 @@ kv-store :type :id :hash-prefix))) (is (= (sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] + ["patient" (codec/v-hash "id-145552")] ["patient" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["patient" (codec/v-hash "id-145552")] - ["code" (codec/v-hash "code-204441")] - ["code" (codec/v-hash "system-204435|")] + ["code" (codec/v-hash "system-204435|code-204441")] + ["code" (codec/v-hash "system-204435|")] + ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] + ["subject" (codec/v-hash "id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["subject" (codec/v-hash "id-145552")] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]]))) @@ -264,19 +265,19 @@ kv-store :type :id :hash-prefix))) (is (= (r-sp-v-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] + ["patient" (codec/v-hash "id-145552")] ["patient" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["patient" (codec/v-hash "id-145552")] - ["code" (codec/v-hash "code-204441")] - ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "system-204435|code-204441")] + ["code" (codec/v-hash "system-204435|")] + ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] + ["subject" (codec/v-hash "id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["subject" (codec/v-hash "id-145552")] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]]))) @@ -292,19 +293,19 @@ kv-store :compartment :type :id :hash-prefix))) (is (= (c-sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] + ["patient" (codec/v-hash "id-145552")] ["patient" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["patient" (codec/v-hash "id-145552")] - ["code" (codec/v-hash "code-204441")] - ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "system-204435|code-204441")] + ["code" (codec/v-hash "system-204435|")] + ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] + ["subject" (codec/v-hash "id-145552")] ["subject" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-145552"))] - ["subject" (codec/v-hash "id-145552")] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]])))))) @@ -355,18 +356,6 @@ kv-store :type :id :hash-prefix))) (is (= (sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["code-value-quantity" - #blaze/byte-string"82821D0F00000000900926"] - ["code-value-quantity" - #blaze/byte-string"82821D0F32690DC8900926"] - ["code-value-quantity" - #blaze/byte-string"82821D0FA3C37576900926"] - ["code-value-quantity" - #blaze/byte-string"9F7C9B9400000000900926"] - ["code-value-quantity" - #blaze/byte-string"9F7C9B9432690DC8900926"] - ["code-value-quantity" - #blaze/byte-string"9F7C9B94A3C37576900926"] - ["code-value-quantity" (bs/concat (codec/v-hash "code-193824") (codec/quantity "" 23.42M))] ["code-value-quantity" @@ -376,50 +365,62 @@ (bs/concat (codec/v-hash "code-193824") (codec/quantity "http://unitsofmeasure.org|kg/m2" 23.42M))] + ["code-value-quantity" + #blaze/byte-string"B02358E02AD0942D4F40902F3B6AE19A900926"] + ["code-value-quantity" + #blaze/byte-string"B02358E02AD0942DE95B25E4B02F01AF900926"] + ["code-value-quantity" + #blaze/byte-string"B02358E02AD0942DF35972C2DDEDDFE6900926"] + ["code-value-quantity" + #blaze/byte-string"D47C56F6D0C25BA34F40902F3B6AE19A900926"] + ["code-value-quantity" + #blaze/byte-string"D47C56F6D0C25BA3E95B25E4B02F01AF900926"] + ["code-value-quantity" + #blaze/byte-string"D47C56F6D0C25BA3F35972C2DDEDDFE6900926"] ["date" (codec-date/encode-range (LocalDate/of 2005 6 17))] - ["category" (codec/v-hash "system-193558|code-193603")] ["category" (codec/v-hash "system-193558|")] ["category" (codec/v-hash "code-193603")] + ["category" (codec/v-hash "system-193558|code-193603")] ["patient" (codec/v-hash "id-180857")] ["patient" (codec/tid-id (codec/tid "Patient") (codec/id-byte-string "id-180857"))] ["patient" (codec/v-hash "Patient/id-180857")] + ["code" (codec/v-hash "code-193824")] ["code" (codec/v-hash "system-193821|")] ["code" (codec/v-hash "system-193821|code-193824")] - ["code" (codec/v-hash "code-193824")] ["value-quantity" (codec/quantity "" 23.42M)] ["value-quantity" (codec/quantity "kg/m2" 23.42M)] ["value-quantity" (codec/quantity "http://unitsofmeasure.org|kg/m2" 23.42M)] + ["combo-code" (codec/v-hash "code-193824")] ["combo-code" (codec/v-hash "system-193821|")] ["combo-code" (codec/v-hash "system-193821|code-193824")] - ["combo-code" (codec/v-hash "code-193824")] ["combo-value-quantity" - #blaze/byte-string"00000000900926"] + #blaze/byte-string"4F40902F3B6AE19A900926"] ["combo-value-quantity" - #blaze/byte-string"32690DC8900926"] + #blaze/byte-string"E95B25E4B02F01AF900926"] ["combo-value-quantity" - #blaze/byte-string"A3C37576900926"] + #blaze/byte-string"F35972C2DDEDDFE6900926"] ["combo-code-value-quantity" - #blaze/byte-string"82821D0F00000000900926"] + #blaze/byte-string"825F9E2AAE526A184F40902F3B6AE19A900926"] ["combo-code-value-quantity" - #blaze/byte-string"82821D0F32690DC8900926"] + #blaze/byte-string"825F9E2AAE526A18E95B25E4B02F01AF900926"] ["combo-code-value-quantity" - #blaze/byte-string"82821D0FA3C37576900926"] + #blaze/byte-string"825F9E2AAE526A18F35972C2DDEDDFE6900926"] ["combo-code-value-quantity" - #blaze/byte-string"9F7C9B9400000000900926"] + #blaze/byte-string"B02358E02AD0942D4F40902F3B6AE19A900926"] ["combo-code-value-quantity" - #blaze/byte-string"9F7C9B9432690DC8900926"] + #blaze/byte-string"B02358E02AD0942DE95B25E4B02F01AF900926"] ["combo-code-value-quantity" - #blaze/byte-string"9F7C9B94A3C37576900926"] + #blaze/byte-string"B02358E02AD0942DF35972C2DDEDDFE6900926"] ["combo-code-value-quantity" - #blaze/byte-string"A75DEC9D00000000900926"] + #blaze/byte-string"D47C56F6D0C25BA34F40902F3B6AE19A900926"] ["combo-code-value-quantity" - #blaze/byte-string"A75DEC9D32690DC8900926"] + #blaze/byte-string"D47C56F6D0C25BA3E95B25E4B02F01AF900926"] ["combo-code-value-quantity" - #blaze/byte-string"A75DEC9DA3C37576900926"] + #blaze/byte-string"D47C56F6D0C25BA3F35972C2DDEDDFE6900926"] ["subject" (codec/v-hash "id-180857")] ["subject" (codec/tid-id (codec/tid "Patient") diff --git a/modules/db/test/blaze/db/node/version_spec.clj b/modules/db/test/blaze/db/node/version_spec.clj new file mode 100644 index 000000000..45e823657 --- /dev/null +++ b/modules/db/test/blaze/db/node/version_spec.clj @@ -0,0 +1,19 @@ +(ns blaze.db.node.version-spec + (:require + [blaze.db.kv.spec] + [blaze.db.node.version :as version] + [clojure.spec.alpha :as s])) + + +(s/fdef version/encode-value + :args (s/cat :version nat-int?) + :ret bytes?) + + +(s/fdef version/get + :args (s/cat :store :blaze.db/kv-store) + :ret (s/nilable nat-int?)) + + +(s/fdef version/set! + :args (s/cat :store :blaze.db/kv-store :version nat-int?)) diff --git a/modules/db/test/blaze/db/node_test.clj b/modules/db/test/blaze/db/node_test.clj index 6c21144a1..213850611 100644 --- a/modules/db/test/blaze/db/node_test.clj +++ b/modules/db/test/blaze/db/node_test.clj @@ -14,6 +14,7 @@ [blaze.db.node.resource-indexer :as resource-indexer] [blaze.db.node.tx-indexer :as-alias tx-indexer] [blaze.db.node.version :as version] + [blaze.db.node.version-spec] [blaze.db.resource-handle-cache] [blaze.db.resource-store :as rs] [blaze.db.resource-store.spec :refer [resource-store?]] @@ -86,8 +87,9 @@ (defn- with-index-store-version [system version] (assoc-in system [[::kv/mem :blaze.db/index-kv-store] :init-data] - [[version/key (version/encode-value version)] - (tx-success/index-entry 1 Instant/EPOCH)])) + (cond-> [(tx-success/index-entry 1 Instant/EPOCH)] + (pos? version) + (conj [version/key (version/encode-value version)])))) (deftest init-test @@ -174,11 +176,11 @@ [:explain ::s/problems 0 :val] := ::invalid)) (testing "incompatible version" - (given-thrown (ig/init (with-index-store-version system -1)) + (given-thrown (ig/init (with-index-store-version system 0)) :key := :blaze.db/node :reason := ::ig/build-threw-exception - [:cause-data :expected-version] := 0 - [:cause-data :actual-version] := -1))) + [:cause-data :expected-version] := 1 + [:cause-data :actual-version] := 0))) (deftest duration-seconds-collector-init-test @@ -272,5 +274,10 @@ (deftest existing-data-with-compatible-version - (with-system [{:blaze.db/keys [node]} (with-index-store-version system 0)] + (with-system [{:blaze.db/keys [node]} (with-index-store-version system 1)] (is node))) + + +(deftest sets-db-version-on-startup + (with-system [{kv-store [::kv/mem :blaze.db/index-kv-store]} system] + (is (= 1 (version/get kv-store))))) From 5c18a11fe151b02a899f0c50d3387e868029c4b2 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Mon, 6 Jun 2022 14:26:10 +0200 Subject: [PATCH 123/124] Document Database Migration in Kubernetes --- docs/database/migration.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/database/migration.md b/docs/database/migration.md index 240323b8e..cd84238dd 100644 --- a/docs/database/migration.md +++ b/docs/database/migration.md @@ -39,6 +39,20 @@ backup! Exit the shell und start Blaze normally. +### On Kubernetes + +You can use an init container to delete the index store on Kubernetes: + +```yaml +initContainers: +- name: delete-index + image: busybox + command: [ 'sh', '-c', "rm -r /data/index" ] + volumeMounts: + - name: data + mountPath: /data +``` + ## Index Store Migration at Start If you start Blaze without an index store, it will use the transaction log and the resource store to recreate the index From 4adc195286174822a1bf3c07204088bb2676c333 Mon Sep 17 00:00:00 2001 From: Alexander Kiel Date: Sun, 12 Jun 2022 22:30:53 +0200 Subject: [PATCH 124/124] [WIP] Switch to Internal Resource Identifier in the Index --- docs/implementation/database.md | 112 ++++--- docs/performance/fhir-search.md | 2 +- modules/byte-buffer/src/blaze/byte_buffer.clj | 29 +- .../test/blaze/byte_buffer_test.clj | 56 +--- .../src/blaze/db/impl/protocols.clj | 8 +- modules/db-stub/src/blaze/db/api_stub.clj | 1 + .../db-tx-log/src/blaze/db/tx_log/spec.clj | 17 +- .../test/blaze/db/tx_log/spec_test.clj | 2 +- modules/db/NOTES.md | 125 ------- modules/db/src/blaze/db/api.clj | 41 +-- modules/db/src/blaze/db/impl/batch_db.clj | 72 ++-- modules/db/src/blaze/db/impl/codec.clj | 54 +-- modules/db/src/blaze/db/impl/db.clj | 8 +- modules/db/src/blaze/db/impl/index.clj | 14 +- .../db/impl/index/compartment/resource.clj | 70 ++-- .../search_param_value_resource.clj | 65 ++-- .../blaze/db/impl/index/resource_as_of.clj | 315 ++++++++---------- .../blaze/db/impl/index/resource_handle.clj | 91 +++-- .../src/blaze/db/impl/index/resource_id.clj | 34 ++ .../index/resource_search_param_value.clj | 79 +++-- .../db/src/blaze/db/impl/index/rts_as_of.clj | 22 +- .../index/search_param_value_resource.clj | 132 ++++---- .../search_param_value_resource/impl.clj | 15 - .../src/blaze/db/impl/index/system_as_of.clj | 60 ++-- .../src/blaze/db/impl/index/system_stats.clj | 4 +- .../db/src/blaze/db/impl/index/type_as_of.clj | 58 ++-- .../db/src/blaze/db/impl/index/type_stats.clj | 6 +- modules/db/src/blaze/db/impl/search_param.clj | 43 +-- .../db/src/blaze/db/impl/search_param/all.clj | 6 +- .../blaze/db/impl/search_param/chained.clj | 9 +- .../db/impl/search_param/composite/common.clj | 10 +- .../search_param/composite/token_quantity.clj | 10 +- .../search_param/composite/token_token.clj | 10 +- .../src/blaze/db/impl/search_param/date.clj | 76 ++--- .../db/src/blaze/db/impl/search_param/has.clj | 24 +- .../src/blaze/db/impl/search_param/list.clj | 51 +-- .../src/blaze/db/impl/search_param/number.clj | 12 +- .../blaze/db/impl/search_param/quantity.clj | 94 +++--- .../src/blaze/db/impl/search_param/string.clj | 25 +- .../src/blaze/db/impl/search_param/token.clj | 63 ++-- .../src/blaze/db/impl/search_param/util.clj | 20 +- modules/db/src/blaze/db/node.clj | 17 +- .../db/src/blaze/db/node/resource_indexer.clj | 74 ++-- .../src/blaze/db/node/tx_indexer/verify.clj | 60 ++-- .../db/test-perf/blaze/db/api_test_perf.clj | 3 +- modules/db/test/blaze/db/api_test.clj | 41 +-- modules/db/test/blaze/db/impl/codec/spec.clj | 18 +- modules/db/test/blaze/db/impl/codec_spec.clj | 18 +- modules/db/test/blaze/db/impl/codec_test.clj | 15 +- modules/db/test/blaze/db/impl/db_spec.clj | 1 + .../impl/index/compartment/resource_spec.clj | 4 +- .../index/compartment/resource_test_util.clj | 7 +- .../search_param_value_resource_spec.clj | 2 +- .../search_param_value_resource_test_util.clj | 29 +- .../db/impl/index/resource_as_of_spec.clj | 12 +- .../db/impl/index/resource_as_of_test.clj | 25 ++ .../impl/index/resource_as_of_test_util.clj | 14 +- .../db/impl/index/resource_handle_spec.clj | 11 +- .../db/impl/index/resource_handle_test.clj | 58 ++-- .../blaze/db/impl/index/resource_id_spec.clj | 17 + .../db/impl/index/resource_id_test_util.clj | 20 ++ .../resource_search_param_value_spec.clj | 20 +- .../resource_search_param_value_test_util.clj | 9 +- .../blaze/db/impl/index/rts_as_of_spec.clj | 14 +- .../search_param_value_resource/impl_test.clj | 29 -- .../search_param_value_resource_spec.clj | 23 +- .../search_param_value_resource_test.clj | 32 +- .../search_param_value_resource_test_util.clj | 13 +- .../blaze/db/impl/index/system_as_of_spec.clj | 2 +- .../db/impl/index/system_as_of_test_util.clj | 8 +- .../db/impl/index/system_stats_test_util.clj | 2 +- .../blaze/db/impl/index/type_as_of_spec.clj | 2 +- .../db/impl/index/type_as_of_test_util.clj | 8 +- .../db/impl/index/type_stats_test_util.clj | 2 +- modules/db/test/blaze/db/impl/index_spec.clj | 2 +- .../db/impl/search_param/composite_test.clj | 19 +- .../blaze/db/impl/search_param/date_test.clj | 34 +- .../db/impl/search_param/number_test.clj | 17 +- .../db/impl/search_param/quantity_spec.clj | 2 +- .../db/impl/search_param/quantity_test.clj | 63 ++-- .../test/blaze/db/impl/search_param/spec.clj | 2 +- .../db/impl/search_param/string_test.clj | 33 +- .../blaze/db/impl/search_param/token_spec.clj | 2 +- .../blaze/db/impl/search_param/token_test.clj | 146 ++++---- .../blaze/db/impl/search_param/util_spec.clj | 6 + .../test/blaze/db/impl/search_param_spec.clj | 8 +- .../test/blaze/db/impl/search_param_test.clj | 66 ++-- .../blaze/db/node/resource_indexer_test.clj | 64 ++-- .../blaze/db/node/tx_indexer/verify_spec.clj | 3 +- .../blaze/db/node/tx_indexer/verify_test.clj | 305 +++++++++-------- modules/db/test/blaze/db/node_test.clj | 6 +- modules/db/test/blaze/db/test_util.clj | 4 +- .../blaze/interaction/search/include_test.clj | 4 +- .../blaze/interaction/search_type_test.clj | 26 +- profiling/blaze/profiling.clj | 1 + resources/blaze.edn | 13 + 96 files changed, 1685 insertions(+), 1696 deletions(-) delete mode 100644 modules/db/NOTES.md create mode 100644 modules/db/src/blaze/db/impl/index/resource_id.clj delete mode 100644 modules/db/src/blaze/db/impl/index/search_param_value_resource/impl.clj create mode 100644 modules/db/test/blaze/db/impl/index/resource_as_of_test.clj create mode 100644 modules/db/test/blaze/db/impl/index/resource_id_spec.clj create mode 100644 modules/db/test/blaze/db/impl/index/resource_id_test_util.clj delete mode 100644 modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj diff --git a/docs/implementation/database.md b/docs/implementation/database.md index dc5425598..73161c913 100644 --- a/docs/implementation/database.md +++ b/docs/implementation/database.md @@ -38,20 +38,25 @@ There are two different sets of indices, ones which depend on the database value ### Indices depending on t -| Name | Key Parts | Value | -|--------------|-----------|-------------------------------| -| ResourceAsOf | type id t | content-hash, num-changes, op | -| TypeAsOf | type t id | content-hash, num-changes, op | -| SystemAsOf | t type id | content-hash, num-changes, op | -| TxSuccess | t | instant | -| TxError | t | anomaly | -| TByInstant | instant | t | -| TypeStats | type t | total, num-changes | -| SystemStats | t | total, num-changes | +| Name | Key Parts | Value | +|--------------|-----------|-----------------------------------| +| ResourceId | tid id | did | +| ResourceAsOf | tid did t | content-hash, num-changes, op, id | +| TypeAsOf | tid t did | content-hash, num-changes, op, id | +| SystemAsOf | t tid did | content-hash, num-changes, op, id | +| TxSuccess | t | instant | +| TxError | t | anomaly | +| TByInstant | instant | t | +| TypeStats | tid t | total, num-changes | +| SystemStats | t | total, num-changes | + +#### ResourceId + +The `ResourceId` index maps the external resource identifier represented by the tuple `(tid, id)`, where `tid` is a 4-byte hash of the resource type and `id` is the [logical id][8] of the resource, to the id part of the internal resource identifier `did`. The term `did` stands for database identifier. #### ResourceAsOf -The `ResourceAsOf` index is the primary index which maps the resource identifier `(type, id)` together with the `t` to the `content-hash` of the resource version. In addition to that, the index contains the number of changes `num-changes` to the resource and the operator `op` of the change leading to the index entry. +The `ResourceAsOf` index is the primary index which maps the internal resource identifier `(tid, did)` together with the `t` to the `content-hash` of the resource version. In addition to that, the index contains the number of changes `num-changes` to the resource and the operator `op` of the change leading to the index entry. The `ResourceAsOf` index is used to access the version of a resource at a particular point in time `t`. In other words, given a point in time `t`, the database value with that `t`, allows to access the resource version at that point in time by its identifier. Because the index only contains entries with `t` values of changes to each resource, the most current resource version is determined by querying the index for the greatest `t` less or equal to the `t` of the database value. @@ -59,16 +64,16 @@ The `ResourceAsOf` index is used to access the version of a resource at a partic The following `ResourceAsOf` index: -| Key (type, id, t) | Value (content-hash, num-changes, op) | -|-------------------|---------------------------------------| -| Patient, 0, 4 | -, 3, delete | -| Patient, 0, 3 | b7e3e5f8, 2, update | -| Patient, 0, 1 | ba9c9b24, 1, create | -| Patient, 1, 2 | 6744ed32, 1, create | +| Key (tid, did, t) | Value (content-hash, num-changes, op, id) | +|-------------------|-------------------------------------------| +| Patient, 0, 4 | --------, 3, delete, 0 | +| Patient, 0, 3 | b7e3e5f8, 2, update, 0 | +| Patient, 0, 1 | ba9c9b24, 1, create, 0 | +| Patient, 1, 2 | 6744ed32, 1, create, 1 | provides the basis for the following database values: -| t | type | id | content-hash | +| t | type | did | content-hash | |-----|---------|-----|--------------| | 1 | Patient | 0 | ba9c9b24 | | 2 | Patient | 0 | ba9c9b24 | @@ -77,17 +82,17 @@ provides the basis for the following database values: | 3 | Patient | 1 | 6744ed32 | | 4 | Patient | 1 | 6744ed32 | -The database value with `t=1` contains one patient with `id=0` and content hash `ba9c9b24`, because the second patient was created later at `t=2`. The index access algorithm will not find an entry for the patient with `id=1` on a database value with `t=1` because there is no index key with `type=Patient`, `id=1` and `t<=1`. However, the database value with `t=2` will contain the patient with `id=1` and additionally contains the patient with `id=0` because there is a key with `type=Patient`, `id=0` and `t<=2`. Next, the database value with `t=3` still contains the same content hash for the patient with `id=1` and reflects the update on patient with `id=0` because the key `(Patient, 0, 3)` is now the one with the greatest `t<=3`, resulting in the content hash `b7e3e5f8`. Finally, the database value with `t=4` doesn't contain the patient with `id=0` anymore, because it was deleted. As can be seen in the index, deleting a resource is done by adding the information that it was deleted at some point in time. +The database value with `t=1` contains one patient with `did=0` and content hash `ba9c9b24`, because the second patient was created later at `t=2`. The index access algorithm will not find an entry for the patient with `did=1` on a database value with `t=1` because there is no index key with `type=Patient`, `did=1` and `t<=1`. However, the database value with `t=2` will contain the patient with `did=1` and additionally contains the patient with `did=0` because there is a key with `type=Patient`, `did=0` and `t<=2`. Next, the database value with `t=3` still contains the same content hash for the patient with `did=1` and reflects the update on patient with `did=0` because the key `(Patient, 0, 3)` is now the one with the greatest `t<=3`, resulting in the content hash `b7e3e5f8`. Finally, the database value with `t=4` doesn't contain the patient with `did=0` anymore, because it was deleted. As can be seen in the index, deleting a resource is done by adding the information that it was deleted at some point in time. In addition to direct resource lookup, the `ResourceAsOf` index is used for listing all versions of a particular resource, listing all resources of a particular type and listing all resources at all. Listings are done by scanning through the index and for the non-history case, skipping versions not appropriate for the `t` of the database value. #### TypeAsOf -The `TypeAsOf` index contains the same information as the `ResourceAsOf` index with the difference that the components of the key are ordered `type`, `t` and `id` instead of `type`, `id` and `t`. The index is used for listing all versions of all resources of a particular type. Such history listings start with the `t` of the database value going into the past. This is done by not only choosing the resource version with the latest `t` less or equal the database values `t` but instead using all older versions. Such versions even include deleted versions because in FHIR it is allowed to bring back a resource to a new life after it was already deleted. The listing is done by simply scanning through the index in reverse. Because the key is ordered by `type`, `t` and `id`, the entries will be first ordered by time, newest first, and second by resource identifier. +The `TypeAsOf` index contains the same information as the `ResourceAsOf` index with the difference that the components of the key are ordered `type`, `t` and `did` instead of `type`, `did` and `t`. The index is used for listing all versions of all resources of a particular type. Such history listings start with the `t` of the database value going into the past. This is done by not only choosing the resource version with the latest `t` less or equal the database values `t` but instead using all older versions. Such versions even include deleted versions because in FHIR it is allowed to bring back a resource to a new life after it was already deleted. The listing is done by simply scanning through the index in reverse. Because the key is ordered by `type`, `t` and `did`, the entries will be first ordered by time, newest first, and second by resource identifier. #### SystemAsOf -In the same way the `TypeAsOf` index uses a different key ordering in comparison to the `ResourceAsOf` index, the `SystemAsOf` index will use the key order `t`, `type` and `id` in order to provide a global time axis order by resource type and by identifier secondarily. +In the same way the `TypeAsOf` index uses a different key ordering in comparison to the `ResourceAsOf` index, the `SystemAsOf` index will use the key order `t`, `type` and `did` in order to provide a global time axis order by resource type and by identifier secondarily. #### TxSuccess @@ -115,23 +120,26 @@ The `SystemStats` index keeps track of the total number of resources, and the nu The indices not depending on `t` directly point to the resource versions by their content hash. -| Name | Key Parts | Value | -|-------------------------------------|--------------------------------------------------------------|-------| -| SearchParamValueResource | search-param, type, value, id, content-hash | - | -| ResourceSearchParamValue | type, id, content-hash, search-param, value | - | -| CompartmentSearchParamValueResource | co-c-hash, co-res-id, sp-c-hash, tid, value, id, hash-prefix | - | -| CompartmentResource | co-c-hash, co-res-id, tid, id | - | -| SearchParam | code, tid | id | -| ActiveSearchParams | id | - | +| Name | Key Parts | Value | +|-------------------------------------|----------------------------------------------------------------|-------| +| SearchParamValueResource | sp-c-hash, tid, value, did, hash-prefix | - | +| ResourceSearchParamValue | tid, did, hash-prefix, sp-c-hash, value | - | +| CompartmentSearchParamValueResource | co-c-hash, co-res-did, sp-c-hash, tid, value, did, hash-prefix | - | +| CompartmentResource | co-c-hash, co-res-did, tid, did | - | +| SearchParam | code, tid | id | +| ActiveSearchParams | id | - | #### SearchParamValueResource -The `SearchParamValueResource` index contains all values from resources that are reachable from search parameters. The components of its key are: -* `search-param` - a 4-byte hash of the search parameters code used to identify the search parameter -* `type` - a 4-byte hash of the resource type -* `value` - the encoded value of the resource reachable by the search parameters FHIRPath expression. The encoding depends on the search parameters type. -* `id` - the logical id of the resource -* `content-hash` - a 4-byte prefix of the content-hash of the resource version +The `SearchParamValueResource` index contains all values from resources that are reachable from search parameters. + +The components of its key are: + +* `sp-c-hash` - a 4-byte hash of the search parameters code used to identify the search parameter +* `tid` - a 4-byte hash of the resource type +* `value` - the encoded value of the resource reachable by the search parameters FHIRPath expression. The encoding depends on the search parameters type +* `did` - the internal id (database id) of the resource +* `hash-prefix` - a 4-byte prefix of the content-hash of the resource version The way the `SearchParamValueResource` index is used, depends on the type of the search parameter. The following sections will explain this in detail for each type: @@ -169,19 +177,19 @@ In order to facilitate different forms of searches specified in the [FHIR Spec][ * `|code` - the code if the resource doesn't specify a system * `system|` - the system independent of the code, used to find all resources with any code in that system -After concatenation, the strings are hashed with the [Murmur3][7] algorithm in its 32-bit variant, yielding a 4-byte wide value. The hashing is done to save space and ensure that all values are of the same length. +After concatenation, the strings are hashed with [FarmHash's Fingerprint64][7] algorithm, yielding an 8-byte wide value. The hashing is done to save space and ensure that all values are of the same length. ###### Example For this example, we don't use the hashed versions of the key parts except for the content-hash. -| Key (search-param, type, value, id, content-hash) | -|---| -| gender, Patient, female, 1, 6744ed32 | -| gender, Patient, female, 2, b7e3e5f8 | -| gender, Patient, male, 0, ba9c9b24 | +| Key (sp-c-hash, tid, value, did, hash-prefix) | +|-----------------------------------------------| +| gender, Patient, female, 1, 6744ed32 | +| gender, Patient, female, 2, b7e3e5f8 | +| gender, Patient, male, 0, ba9c9b24 | -In case one searches for female patients, Blaze will seek into the index with the key prefix (gender, Patient, female) and scan over it while the prefix stays the same. The result will be the `[id, hash]` tuples: +In case one searches for female patients, Blaze will seek into the index with the key prefix (gender, Patient, female) and scan over it while the prefix stays the same. The result will be the `[did, hash]` tuples: * `[1, 6744ed32]` and * `[2, b7e3e5f8]`. @@ -207,11 +215,25 @@ That tuples are further processed against the `ResourceAsOf` index in order to c **TODO: continue...** +#### CompartmentSearchParamValueResource + +Same as the `SearchParamValueResource` index but prefixed with a compartment the resource belongs to. This index is used in [variant searches][9] and in CQL evaluation within the Patient context. In the CQL Patient context all retrieves are relative to one patient. Using that patient as compartment in the `CompartmentSearchParamValueResource` index allows for efficient implementation of that retrieves. + +The components of its key are: + +* `co-c-hash` - a 4-byte hash of the code of the compartment +* `co-res-did` - the internal id (database id) of the resource of the compartment +* `sp-c-hash` - a 4-byte hash of the search parameters code used to identify the search parameter +* `tid` - a 4-byte hash of the resource type +* `value` - the encoded value of the resource reachable by the search parameters FHIRPath expression. The encoding depends on the search parameters type +* `did` - the internal id (database id) of the resource +* `hash-prefix` - a 4-byte prefix of the content-hash of the resource version + ## Transaction Handling * a transaction bundle is POST'ed to one arbitrary node * this node submits the transaction commands to the central transaction log -* all nodes (inkl. the transaction submitter) receive the transaction commands from the central transaction log +* all nodes (incl. the transaction submitter) receive the transaction commands from the central transaction log **TODO: continue...** @@ -221,4 +243,6 @@ That tuples are further processed against the `ResourceAsOf` index in order to c [4]: [5]: [6]: -[7]: +[7]: +[8]: +[9]: diff --git a/docs/performance/fhir-search.md b/docs/performance/fhir-search.md index 46b1693b9..7e4d751af 100644 --- a/docs/performance/fhir-search.md +++ b/docs/performance/fhir-search.md @@ -97,7 +97,7 @@ The result is a dataset which consists only of the resource types Patient, Obser ## Controlling and Monitoring the Caches -The size of the resource cache and the resource handle cache can be set by their respective environment variables `DB_RESOURCE_CACHE_SIZE` and `DB_RESOURCE_HANDLE_CACHE_SIZE`. The size denotes the number of resources / resource handles. Because one has to specify a number of resources / resource handles, it's important to know how many bytes a resource / resource handle allocates on the heap. For resource handles, it can be said that they allocate between 272 and 328 bytes depending on the size of the resource id. For resources, the size varies widely. Monitoring of the heap usage is critical. +The size of the resource cache and the resource handle cache can be set by their respective environment variables `DB_RESOURCE_CACHE_SIZE` and `DB_RESOURCE_HANDLE_CACHE_SIZE`. The size denotes the number of resources / resource handles. Because one has to specify a number of resources / resource handles, it's important to know how many bytes a resource / resource handle allocates on the heap. For resource handles, it can be said that they allocate between 152 and 208 bytes depending on the size of the resource id. For resources, the size varies widely. Monitoring of the heap usage is critical. ### Monitoring diff --git a/modules/byte-buffer/src/blaze/byte_buffer.clj b/modules/byte-buffer/src/blaze/byte_buffer.clj index b4e6b2348..9525b7bf6 100644 --- a/modules/byte-buffer/src/blaze/byte_buffer.clj +++ b/modules/byte-buffer/src/blaze/byte_buffer.clj @@ -78,6 +78,12 @@ (.putInt ^ByteBuffer byte-buffer x)) +(defn put-5-byte-long! + [byte-buffer ^long x] + (put-byte! byte-buffer (bit-shift-right (unchecked-long x) 32)) + (put-int! byte-buffer x)) + + (defn put-long! {:inline (fn [byte-buffer x] @@ -223,6 +229,11 @@ (.getInt ^ByteBuffer byte-buffer)) +(defn get-5-byte-long! [byte-buffer] + (+ (bit-shift-left (bit-and (get-byte! byte-buffer) 0xFF) 32) + (bit-and (get-int! byte-buffer) 0xFFFFFFFF))) + + (defn get-long! {:inline (fn [byte-buffer] @@ -246,24 +257,6 @@ (.get ^ByteBuffer byte-buffer ^bytes byte-array offset length))) -(defn size-up-to-null [byte-buffer] - (when (pos? (remaining byte-buffer)) - (mark! byte-buffer) - (loop [byte (bit-and (long (get-byte! byte-buffer)) 0xFF) - size 0] - (cond - (zero? byte) - (do (reset! byte-buffer) - size) - - (pos? (remaining byte-buffer)) - (recur (bit-and (long (get-byte! byte-buffer)) 0xFF) (inc size)) - - :else - (do (reset! byte-buffer) - nil))))) - - (defn mismatch "Finds and returns the relative index of the first mismatch between `a` and `b`. diff --git a/modules/byte-buffer/test/blaze/byte_buffer_test.clj b/modules/byte-buffer/test/blaze/byte_buffer_test.clj index 0990f8a43..f9230bdaf 100644 --- a/modules/byte-buffer/test/blaze/byte_buffer_test.clj +++ b/modules/byte-buffer/test/blaze/byte_buffer_test.clj @@ -3,7 +3,7 @@ [blaze.byte-buffer :as bb] [blaze.test-util :as tu :refer [satisfies-prop]] [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [deftest is testing]] + [clojure.test :as test :refer [are deftest]] [clojure.test.check.generators :as gen] [clojure.test.check.properties :as prop])) @@ -20,41 +20,19 @@ (= capacity (bb/limit (bb/allocate capacity)))))) -(deftest size-up-to-null-test - (testing "empty buffer" - (let [buf (bb/allocate 0)] - (is (nil? (bb/size-up-to-null buf))))) - - (testing "buffer with only one null byte" - (let [buf (bb/allocate 1)] - (bb/put-byte! buf 0) - (bb/flip! buf) - (is (zero? (bb/size-up-to-null buf))))) - - (testing "buffer with only one non-null byte" - (let [buf (bb/allocate 1)] - (bb/put-byte! buf 1) - (bb/flip! buf) - (is (nil? (bb/size-up-to-null buf))))) - - (testing "buffer with one non-null and one null byte" - (let [buf (bb/allocate 2)] - (bb/put-byte! buf 1) - (bb/put-byte! buf 0) - (bb/flip! buf) - (is (= 1 (bb/size-up-to-null buf))))) - - (testing "buffer with two null bytes" - (let [buf (bb/allocate 2)] - (bb/put-byte! buf 0) - (bb/put-byte! buf 0) - (bb/flip! buf) - (is (zero? (bb/size-up-to-null buf))))) - - (testing "buffer with two non-null and one null byte" - (let [buf (bb/allocate 3)] - (bb/put-byte! buf 1) - (bb/put-byte! buf 2) - (bb/put-byte! buf 0) - (bb/flip! buf) - (is (= 2 (bb/size-up-to-null buf)))))) +(defn- transcode-5-byte-long [x] + (let [buf (bb/allocate 5)] + (bb/put-5-byte-long! buf x) + (bb/flip! buf) + (= x (bb/get-5-byte-long! buf)))) + + +(deftest transcode-5-byte-long-test + (are [x] (transcode-5-byte-long x) + 0 + 0xFFFFFFFF + 0xFFFFFFFFFF) + + (satisfies-prop 100000 + (prop/for-all [x (gen/choose 0 0xFFFFFFFFFF)] + (transcode-5-byte-long x)))) diff --git a/modules/db-protocols/src/blaze/db/impl/protocols.clj b/modules/db-protocols/src/blaze/db/impl/protocols.clj index d151bb64c..60ef1be5b 100644 --- a/modules/db-protocols/src/blaze/db/impl/protocols.clj +++ b/modules/db-protocols/src/blaze/db/impl/protocols.clj @@ -71,17 +71,17 @@ (-compile-value [search-param modifier value] "Can return an anomaly.") (-resource-handles [search-param context tid modifier compiled-value] - [search-param context tid modifier compiled-value start-id] + [search-param context tid modifier compiled-value start-did] "Returns a reducible collection.") (-sorted-resource-handles [search-param context tid direction] - [search-param context tid direction start-id] + [search-param context tid direction start-did] "Returns a reducible collection.") (-compartment-keys [search-param context compartment tid compiled-value]) (-matches? [search-param context resource-handle modifier compiled-values]) (-compartment-ids [_ resolver resource]) - (-index-values [_ resolver resource]) - (-index-value-compiler [_])) + (-index-values [_ resource-id resolver resource]) + (-index-value-compiler [_ resource-id])) (defprotocol Pull diff --git a/modules/db-stub/src/blaze/db/api_stub.clj b/modules/db-stub/src/blaze/db/api_stub.clj index 25b61118f..ca9500b1e 100644 --- a/modules/db-stub/src/blaze/db/api_stub.clj +++ b/modules/db-stub/src/blaze/db/api_stub.clj @@ -58,6 +58,7 @@ :tx-success-index {:reverse-comparator? true} :tx-error-index nil :t-by-instant-index {:reverse-comparator? true} + :resource-id-index nil :resource-as-of-index nil :type-as-of-index nil :system-as-of-index nil diff --git a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj index a8b56e74e..3945c0d0f 100644 --- a/modules/db-tx-log/src/blaze/db/tx_log/spec.clj +++ b/modules/db-tx-log/src/blaze/db/tx_log/spec.clj @@ -4,7 +4,8 @@ [blaze.db.tx-log :as tx-log] [blaze.fhir.spec] [blaze.spec] - [clojure.spec.alpha :as s])) + [clojure.spec.alpha :as s] + [clojure.spec.gen.alpha :as gen])) (defn tx-log? [x] @@ -35,8 +36,20 @@ (s/coll-of :blaze.fhir/local-ref-tuple)) +(def ^:private ^:const ^long max-t 0xFFFFFFFFFF) + + +;; With a 5 byte long `t`, we can create one transaction each millisecond +;; for 34 years. Alone the t-values would need a storage of 5 TB. +(comment + (let [millis-per-year (* 1000 3600 24 365) + five-bytes (long (Math/pow 2 40))] + (double (/ five-bytes millis-per-year)))) + + +;; The point in time `t` of a database value. (s/def :blaze.db/t - (s/and int? #(<= 0 % 0xFFFFFFFFFFFFFF))) + (s/with-gen (s/and int? #(<= 0 % max-t)) #(gen/choose 0 max-t))) (s/def :blaze.db.tx-cmd/if-none-exist diff --git a/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj b/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj index c3a8615e9..250ad6e05 100644 --- a/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj +++ b/modules/db-tx-log/test/blaze/db/tx_log/spec_test.clj @@ -20,7 +20,7 @@ (are [x] (s/valid? :blaze.db/t x) 0 1 - 0xFFFFFFFFFFFFFF)) + 0xFFFFFFFFFF)) (def patient-hash-0 (hash/generate {:fhir/type :fhir/Patient :id "0"})) diff --git a/modules/db/NOTES.md b/modules/db/NOTES.md deleted file mode 100644 index dee7125e5..000000000 --- a/modules/db/NOTES.md +++ /dev/null @@ -1,125 +0,0 @@ -# Blaze - -## Features - -### Versioned read of resources - -* I need to get to a particular version of a resource -* versionId could be the content-hash - -### Normal read returning the last known Version of a Resource - -* need to get the content-hash of a resource given a t -* can be done with the ResourceAsOf index - -### Search - -* stable search also in recent past (at given t) -* - -## Principles - -* don't optimize for deleted resources because deleting a resource is not common - -## Indices - -### Independent from t - -| Name | Key Parts | Value | -|---|---|---| -| SVR | c-hash tid value id hash-prefix | - | -| RSV | tid id hash-prefix c-hash value | - | -| CSVR | co-c-hash co-res-id sp-c-hash tid value id hash-prefix | - | -| CompartmentResource | co-c-hash co-res-id tid id | - | -| SearchParam | code tid | id | -| ActiveSearchParams | id | - | - -### Depend on t - -| Name | Key Parts | Value | -|---|---|---| -| TxSuccess | t | transaction | -| TxError | t | anomaly | -| TByInstant | inst-ms (desc) | t | -| ResourceAsOf | tid id t | hash, state | -| TypeAsOf | tid t id | hash, state | -| SystemAsOf | t tid id | hash, state | -| TypeStats | tid t | total, num-changes | -| SystemStats | t | total, num-changes | - -We can make hashes in SearchParam indices shorter (4-bytes) because we only need to differentiate between the versions of a resource. The odds of a hash collision is 1 out of 10000 for about 1000 versions. In case of a hash collision we would produce a false positive query hit. So we would return more resources instead of less, which is considered fine in FHIR. - -### Search param Value Resource version (SVR) - -The key consists of: - -* c-hash - a 4-byte hash of the code of the search parameter -* tid - the 4-byte type id -* value - the value encoded depending on the search parameter -* id - the logical id of the resource -* hash-prefix - a 4-byte prefix of the resource content hash - -The total size of the key is 4 + 4 + value-size + id-size + 4 = 12 + value-size + id-size bytes. - -The value is empty. - -The key contains the id of the resource for two reasons, first we can skip to the next resource by seeking with max-hash, not having to test all versions of a resource against ResourceAsOf and second, going into ResourceAsOf will be local because it is sorted by id. - -The SVR index is comparable to the AVET index in Datomic. Search parameters are the equivalent of indexed attributes in Datomic. - -### Resource version Search param Value (RSV) - - - -### Compartment Search-param Value Resource (CSVR) - -Same as the SVR index but prefixed with a compartment the resource belongs to. This index is used in [variant searches][2] and in CQL evaluation within the Patient context. In the CQL Patient context all retrieves are relative to one patient. Using that patient as compartment in the CSVR index allows for efficient implementation of that retrieves. - -The key consists of: - -* co-c-hash - a 4-byte hash of the code of the compartment -* co-res-id - the logical id of the resource of the compartment -* c-hash - a 4-byte hash of the code of the search parameter -* tid - the 4-byte type id -* value - the value encoded depending on the search parameter -* id - the logical id of the resource -* hash-prefix - a 4-byte prefix of the resource content hash - -The total size of the key is 4 + co-res-id-size 4 + 4 + value-size + id-size + 4 = 16 + co-res-id-size 4 + value-size + id-size bytes. - -The value is empty. - -### TByInstant - -Provides access to t's by instant (point in time). It encodes the instant as milliseconds since epoch as descending long from Long/MAX_VALUE so that TODO WHY??? - -### ResourceAsOf - -The key consists of: - -* tid - the 4-byte type id -* id - the variable length id (max 64 byte) - - -### TxSuccess - -### TxError - -### TypeStats / SystemStats - -total = number of non-deleted resources -num-changes = total number of changes (creates, updates, deletes) - -## Search - -The FHIR search parameters have different types. The search implementation depends on that types. The following sections describe the implementation by type. - -### Date - -The date search parameter type is used for the data types date, dateTime, instant, Period and Timing. The search is always performed against a range. Both the value given in the search and the target value in resources have either an implicit or an explicit range. For example the range of a date like 2020-02-09 starts at 2020-02-09T00:00:00.000 and ends at 2020-02-09T23:59:59.999. - -By default the search is an equal search were the range of the search value have to fully contain the range of the target value. In addition to the equal search, other search operators are possible. - - -[1]: -[2]: diff --git a/modules/db/src/blaze/db/api.clj b/modules/db/src/blaze/db/api.clj index ac564e819..025c8c3b1 100644 --- a/modules/db/src/blaze/db/api.clj +++ b/modules/db/src/blaze/db/api.clj @@ -105,7 +105,7 @@ Please use `pull` to obtain the full resource." [db type id] (log/trace "fetch resource handle of" (str type "/" id)) - (p/-resource-handle db (codec/tid type) (codec/id-byte-string id))) + (p/-resource-handle db (codec/tid type) id)) (defn resource-handle? [x] @@ -124,7 +124,7 @@ ([db type] (p/-type-list db (codec/tid type))) ([db type start-id] - (p/-type-list db (codec/tid type) (codec/id-byte-string start-id)))) + (p/-type-list db (codec/tid type) start-id))) (defn type-total @@ -186,7 +186,7 @@ ([db] (p/-system-list db)) ([db start-type start-id] - (p/-system-list db (codec/tid start-type) (codec/id-byte-string start-id)))) + (p/-system-list db (codec/tid start-type) start-id))) (defn system-total @@ -221,10 +221,6 @@ ;; ---- Compartment-Level Functions ------------------------------------------- -(defn- compartment [code id] - [(codec/c-hash code) (codec/id-byte-string id)]) - - (defn list-compartment-resource-handles "Returns a reducible collection of all resource handles of `type` in `db` linked to the compartment with `code` and `id`. @@ -240,10 +236,9 @@ Please use `pull-many` to obtain the full resources." ([db code id type] - (p/-compartment-resource-handles db (compartment code id) (codec/tid type))) + (p/-compartment-resource-handles db [code id] (codec/tid type))) ([db code id type start-id] - (p/-compartment-resource-handles db (compartment code id) (codec/tid type) - (codec/id-byte-string start-id)))) + (p/-compartment-resource-handles db [code id] (codec/tid type) start-id))) (defn compartment-query @@ -321,13 +316,11 @@ History entries are resource handles. Please use `pull-many` to obtain the full resources." ([db type id] - (p/-instance-history db (codec/tid type) (codec/id-byte-string id) nil nil)) + (p/-instance-history db (codec/tid type) id nil nil)) ([db type id start-t] - (p/-instance-history db (codec/tid type) (codec/id-byte-string id) start-t - nil)) + (p/-instance-history db (codec/tid type) id start-t nil)) ([db type id start-t since] - (p/-instance-history db (codec/tid type) (codec/id-byte-string id) start-t - since))) + (p/-instance-history db (codec/tid type) id start-t since))) (defn total-num-of-instance-changes @@ -337,11 +330,9 @@ Optionally a `since` instant can be given to define a point in the past where the calculation should start." ([db type id] - (p/-total-num-of-instance-changes db (codec/tid type) - (codec/id-byte-string id) nil)) + (p/-total-num-of-instance-changes db (codec/tid type) id nil)) ([db type id since] - (p/-total-num-of-instance-changes db (codec/tid type) - (codec/id-byte-string id) since))) + (p/-total-num-of-instance-changes db (codec/tid type) id since))) @@ -362,11 +353,9 @@ ([db type start-t] (p/-type-history db (codec/tid type) start-t nil nil)) ([db type start-t start-id] - (p/-type-history db (codec/tid type) start-t - (some-> start-id codec/id-byte-string) nil)) + (p/-type-history db (codec/tid type) start-t start-id nil)) ([db type start-t start-id since] - (p/-type-history db (codec/tid type) start-t - (some-> start-id codec/id-byte-string) since))) + (p/-type-history db (codec/tid type) start-t start-id since))) (defn total-num-of-type-changes @@ -401,11 +390,9 @@ ([db start-t start-type] (p/-system-history db start-t (some-> start-type codec/tid) nil nil)) ([db start-t start-type start-id] - (p/-system-history db start-t (some-> start-type codec/tid) - (some-> start-id codec/id-byte-string) nil)) + (p/-system-history db start-t (some-> start-type codec/tid) start-id nil)) ([db start-t start-type start-id since] - (p/-system-history db start-t (some-> start-type codec/tid) - (some-> start-id codec/id-byte-string) since))) + (p/-system-history db start-t (some-> start-type codec/tid) start-id since))) (defn total-num-of-system-changes diff --git a/modules/db/src/blaze/db/impl/batch_db.clj b/modules/db/src/blaze/db/impl/batch_db.clj index 484c972f8..aa0d0684c 100644 --- a/modules/db/src/blaze/db/impl/batch_db.clj +++ b/modules/db/src/blaze/db/impl/batch_db.clj @@ -10,6 +10,7 @@ [blaze.db.impl.index.compartment.resource :as cr] [blaze.db.impl.index.resource-as-of :as rao] [blaze.db.impl.index.resource-handle :as rh] + [blaze.db.impl.index.resource-id :as ri] [blaze.db.impl.index.search-param-value-resource :as sp-vr] [blaze.db.impl.index.system-as-of :as sao] [blaze.db.impl.index.system-stats :as system-stats] @@ -42,7 +43,8 @@ ;; ---- Instance-Level Functions -------------------------------------------- (-resource-handle [_ tid id] - ((:resource-handle context) tid id)) + (when-let [did ((:resource-id context) tid id)] + ((:resource-handle context) tid did))) @@ -52,7 +54,8 @@ (rao/type-list context tid)) (-type-list [_ tid start-id] - (rao/type-list context tid start-id)) + (when-let [start-did ((:resource-id context) tid start-id)] + (rao/type-list context tid start-did))) (-type-total [_ tid] (let [{:keys [snapshot t]} context] @@ -67,7 +70,8 @@ (rao/system-list context)) (-system-list [_ start-tid start-id] - (rao/system-list context start-tid start-id)) + (when-let [start-did ((:resource-id context) start-tid start-id)] + (rao/system-list context start-tid start-did))) (-system-total [_] (let [{:keys [snapshot t]} context] @@ -78,11 +82,14 @@ ;; ---- Compartment-Level Functions ----------------------------------------- - (-compartment-resource-handles [_ compartment tid] - (cr/resource-handles! context compartment tid)) + (-compartment-resource-handles [_ [code id] tid] + (when-let [did ((:resource-id context) (codec/tid code) id)] + (cr/resource-handles! context [(codec/c-hash code) did] tid))) - (-compartment-resource-handles [_ compartment tid start-id] - (cr/resource-handles! context compartment tid start-id)) + (-compartment-resource-handles [_ [code id] tid start-id] + (when-let [did ((:resource-id context) (codec/tid code) id)] + (when-let [start-did ((:resource-id context) tid start-id)] + (cr/resource-handles! context [(codec/c-hash code) did] tid start-did)))) @@ -99,28 +106,32 @@ ;; ---- Instance-Level History Functions ------------------------------------ (-instance-history [_ tid id start-t since] - (let [{:keys [snapshot raoi t]} context + (let [{:keys [snapshot resource-id raoi t]} context start-t (if (some-> start-t (<= t)) start-t t) end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0)] - (rao/instance-history raoi tid id start-t end-t))) + (when-let [did (resource-id tid id)] + (rao/instance-history raoi tid did start-t end-t)))) (-total-num-of-instance-changes [_ tid id since] - (let [{:keys [snapshot resource-handle t]} context + (let [{:keys [snapshot resource-id resource-handle t]} context end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0)] - (rao/num-of-instance-changes resource-handle tid id t end-t))) + (if-let [did (resource-id tid id)] + (rao/num-of-instance-changes resource-handle tid did t end-t) + 0))) ;; ---- Type-Level History Functions ---------------------------------------- (-type-history [_ tid start-t start-id since] - (let [{:keys [snapshot t]} context + (let [{:keys [snapshot t resource-id]} context start-t (if (some-> start-t (<= t)) start-t t) - end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0)] + end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0) + start-did (some->> start-id (resource-id tid))] (reify IReduceInit (reduce [_ rf init] (with-open [taoi (kv/new-iterator snapshot :type-as-of-index)] - (reduce rf init (tao/type-history taoi tid start-t start-id end-t))))))) + (reduce rf init (tao/type-history taoi tid start-t start-did end-t))))))) (-total-num-of-type-changes [_ type since] (let [{:keys [snapshot t]} context @@ -136,13 +147,14 @@ ;; ---- System-Level History Functions -------------------------------------- (-system-history [_ start-t start-tid start-id since] - (let [{:keys [snapshot t]} context + (let [{:keys [snapshot t resource-id]} context start-t (if (some-> start-t (<= t)) start-t t) - end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0)] + end-t (or (some->> since (t-by-instant/t-by-instant snapshot)) 0) + start-did (some->> start-id (resource-id start-tid))] (reify IReduceInit (reduce [_ rf init] (with-open [saoi (kv/new-iterator snapshot :system-as-of-index)] - (reduce rf init (sao/system-history saoi start-t start-tid start-id end-t))))))) + (reduce rf init (sao/system-history saoi start-t start-tid start-did end-t))))))) (-total-num-of-system-changes [_ since] (let [{:keys [snapshot t]} context @@ -249,8 +261,9 @@ p/Query (-execute [_ context] (index/type-query context tid clauses)) - (-execute [_ context start-id] - (index/type-query context tid clauses (codec/id-byte-string start-id))) + (-execute [_ {:keys [resource-id] :as context} start-id] + (when-let [start-did (resource-id tid start-id)] + (index/type-query context tid clauses start-did))) (-clauses [_] (decode-clauses clauses))) @@ -259,8 +272,9 @@ p/Query (-execute [_ context] (rao/type-list context tid)) - (-execute [_ context start-id] - (rao/type-list context tid (codec/id-byte-string start-id))) + (-execute [_ {:keys [resource-id] :as context} start-id] + (when-let [start-did (resource-id tid start-id)] + (rao/type-list context tid start-did))) (-clauses [_])) @@ -270,19 +284,20 @@ (index/system-query context clauses))) -(defrecord CompartmentQuery [c-hash tid clauses] +(defrecord CompartmentQuery [c-hash c-tid tid clauses] p/Query - (-execute [_ context arg1] - (index/compartment-query context [c-hash (codec/id-byte-string arg1)] - tid clauses)) + (-execute [_ {:keys [resource-id] :as context} compartment-id] + (when-let [c-res-did (resource-id c-tid compartment-id)] + (index/compartment-query context [c-hash c-res-did] tid clauses))) (-clauses [_] (decode-clauses clauses))) -(defrecord EmptyCompartmentQuery [c-hash tid] +(defrecord EmptyCompartmentQuery [c-hash c-tid tid] p/Query - (-execute [_ context arg1] - (cr/resource-handles! context [c-hash (codec/id-byte-string arg1)] tid)) + (-execute [_ {:keys [resource-id] :as context} compartment-id] + (when-let [c-res-did (resource-id c-tid compartment-id)] + (cr/resource-handles! context [c-hash c-res-did] tid))) (-clauses [_])) @@ -300,6 +315,7 @@ basis-t (let [raoi (kv/new-iterator snapshot :resource-as-of-index)] {:snapshot snapshot + :resource-id (ri/resource-id kv-store) :raoi raoi :resource-handle (rao/resource-handle rh-cache raoi t) :svri (kv/new-iterator snapshot :search-param-value-index) diff --git a/modules/db/src/blaze/db/impl/codec.clj b/modules/db/src/blaze/db/impl/codec.clj index 7e805ba26..c70f3e24b 100644 --- a/modules/db/src/blaze/db/impl/codec.clj +++ b/modules/db/src/blaze/db/impl/codec.clj @@ -20,7 +20,8 @@ (def ^:const ^long c-hash-size Integer/BYTES) (def ^:const ^long v-hash-size Long/BYTES) (def ^:const ^long tid-size Integer/BYTES) -(def ^:const ^long t-size Long/BYTES) +(def ^:const ^long t-size 5) +(def ^:const ^long did-size Long/BYTES) (def ^:const ^long state-size Long/BYTES) (def ^:const ^long max-id-size 64) @@ -207,50 +208,29 @@ ;; ---- Identifier Functions -------------------------------------------------- -(defn id-byte-string - {:inline - (fn [id] - `(bs/from-string ~id StandardCharsets/ISO_8859_1))} - [id] - (bs/from-string id StandardCharsets/ISO_8859_1)) - - -(defn id-string - "Converts the byte-string representation of a resource id into it's string - representation." - {:inline - (fn [id-byte-string] - `(bs/to-string ~id-byte-string StandardCharsets/ISO_8859_1))} - [id-byte-string] - (bs/to-string id-byte-string StandardCharsets/ISO_8859_1)) +(defn id-from-byte-buffer [buf] + (let [id-bytes (byte-array (bb/remaining buf))] + (bb/copy-into-byte-array! buf id-bytes) + (String. id-bytes StandardCharsets/ISO_8859_1))) -(defn id - {:inline - (fn [id-bytes offset length] - `(String. ~id-bytes ~offset ~length StandardCharsets/ISO_8859_1))} - [^bytes id-bytes ^long offset ^long length] - (String. id-bytes offset length StandardCharsets/ISO_8859_1)) +(defn did [t idx] + (+ (bit-shift-left (unchecked-long t) 24) (unchecked-long idx))) ;; ---- Key Functions --------------------------------------------------------- (defn descending-long - "Converts positive longs so that they decrease from 0xFFFFFFFFFFFFFF. + "Converts positive longs so that they decrease from 0xFFFFFFFFFF. This function is used for the point in time `t` value, which is always ordered - descending in indices. The value 0xFFFFFFFFFFFFFF has 7 bytes, so the first - byte will be always the zero byte. This comes handy in indices, because the - zero byte terminates ordering of index segments preceding the `t` value. - - 7 bytes are also plenty for the `t` value because with 5 bytes one could carry - out a transaction every millisecond for 20 years." + descending in indices." {:inline (fn [l] - `(bit-and (bit-not (unchecked-long ~l)) 0xFFFFFFFFFFFFFF))} + `(bit-and (bit-not (unchecked-long ~l)) 0xFFFFFFFFFF))} [l] - (bit-and (bit-not (unchecked-long l)) 0xFFFFFFFFFFFFFF)) + (bit-and (bit-not (unchecked-long l)) 0xFFFFFFFFFF)) (defn c-hash [code] @@ -305,12 +285,12 @@ bs/from-byte-array)) -(defn tid-id - "Returns a byte string with `tid` followed by `id`." - [tid id] - (-> (bb/allocate (unchecked-add-int tid-size (bs/size id))) +(defn tid-did + "Returns a byte string with `tid` followed by `did`." + [tid did] + (-> (bb/allocate (+ tid-size did-size)) (bb/put-int! tid) - (bb/put-byte-string! id) + (bb/put-long! did) bb/flip! bs/from-byte-buffer!)) diff --git a/modules/db/src/blaze/db/impl/db.clj b/modules/db/src/blaze/db/impl/db.clj index 2b9f6ab0c..f8c22fa21 100644 --- a/modules/db/src/blaze/db/impl/db.clj +++ b/modules/db/src/blaze/db/impl/db.clj @@ -3,6 +3,7 @@ (:require [blaze.db.impl.batch-db :as batch-db] [blaze.db.impl.index.resource-as-of :as rao] + [blaze.db.impl.index.resource-id :as ri] [blaze.db.impl.macros :refer [with-open-coll]] [blaze.db.impl.protocols :as p] [blaze.db.kv :as kv]) @@ -35,9 +36,10 @@ (-resource-handle [_ tid id] (let [{:keys [kv-store rh-cache]} node] - (with-open [snapshot (kv/new-snapshot kv-store) - raoi (kv/new-iterator snapshot :resource-as-of-index)] - ((rao/resource-handle rh-cache raoi t) tid id)))) + (when-let [did ((ri/resource-id kv-store) tid id)] + (with-open [snapshot (kv/new-snapshot kv-store) + raoi (kv/new-iterator snapshot :resource-as-of-index)] + ((rao/resource-handle rh-cache raoi t) tid did))))) diff --git a/modules/db/src/blaze/db/impl/index.clj b/modules/db/src/blaze/db/impl/index.clj index 528775f65..c7ba4c87a 100644 --- a/modules/db/src/blaze/db/impl/index.clj +++ b/modules/db/src/blaze/db/impl/index.clj @@ -44,15 +44,15 @@ search-param context tid modifier values)) (resource-handles search-param context tid modifier values)))) - ([context tid clauses start-id] + ([context tid clauses start-did] (let [[[search-param modifier _ values] & other-clauses] clauses] (if (seq other-clauses) (coll/eduction (other-clauses-filter context other-clauses) (resource-handles - search-param context tid modifier values start-id)) + search-param context tid modifier values start-did)) (resource-handles - search-param context tid modifier values start-id))))) + search-param context tid modifier values start-did))))) (defn system-query [_ _] @@ -83,12 +83,12 @@ {:arglists '([context resource-handle code] [context resource-handle code target-tid])} - ([{:keys [rsvi] :as context} {:keys [tid id hash]} code] + ([{:keys [rsvi] :as context} {:keys [tid did hash]} code] (coll/eduction (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code))) - ([{:keys [rsvi] :as context} {:keys [tid id hash]} code target-tid] + (r-sp-v/prefix-keys! rsvi tid did hash code))) + ([{:keys [rsvi] :as context} {:keys [tid did hash]} code target-tid] (coll/eduction (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash code + (r-sp-v/prefix-keys! rsvi tid did hash code (codec/tid-byte-string target-tid))))) diff --git a/modules/db/src/blaze/db/impl/index/compartment/resource.clj b/modules/db/src/blaze/db/impl/index/compartment/resource.clj index 3c1d5a599..316830d10 100644 --- a/modules/db/src/blaze/db/impl/index/compartment/resource.clj +++ b/modules/db/src/blaze/db/impl/index/compartment/resource.clj @@ -13,29 +13,19 @@ (set! *unchecked-math* :warn-on-boxed) -(def ^:private ^:const ^long max-key-size - (+ codec/c-hash-size codec/max-id-size 1 codec/tid-size codec/max-id-size)) +(def ^:private ^:const ^long seek-key-size + (+ codec/c-hash-size codec/did-size codec/tid-size)) -(def ^:private ^:const ^long except-co-res-id-prefix-size - (+ codec/c-hash-size 1 codec/tid-size)) - - -(defn- key-prefix-size - {:inline - (fn [co-res-id] - `(unchecked-add-int ~except-co-res-id-prefix-size (bs/size ~co-res-id)))} - [co-res-id] - (unchecked-add-int except-co-res-id-prefix-size (bs/size co-res-id))) +(def ^:private ^:const ^long key-size + (+ seek-key-size codec/did-size)) (defn- decode-key - ([] (bb/allocate-direct max-key-size)) + ([] (bb/allocate-direct key-size)) ([buf] - (bb/set-position! buf (unchecked-add-int (bb/position buf) codec/c-hash-size)) - (let [id-size (long (bb/size-up-to-null buf))] - (bb/set-position! buf (+ (bb/position buf) id-size 1 codec/tid-size)) - (bs/from-byte-buffer! buf)))) + (bb/set-position! buf seek-key-size) + (bb/get-long! buf))) (def ^:private remove-deleted-xf @@ -50,29 +40,23 @@ (defn- encode-seek-key "Encodes the key without the id used for seeking to the start of scans." - [compartment tid] - (let [co-c-hash (coll/nth compartment 0) - co-res-id (coll/nth compartment 1)] - (-> (bb/allocate (key-prefix-size co-res-id)) - (bb/put-int! co-c-hash) - (bb/put-byte-string! co-res-id) - (bb/put-byte! 0) - (bb/put-int! tid) - bb/flip! - bs/from-byte-buffer!))) + [[co-c-hash co-res-did] tid] + (-> (bb/allocate seek-key-size) + (bb/put-int! co-c-hash) + (bb/put-long! co-res-did) + (bb/put-int! tid) + bb/flip! + bs/from-byte-buffer!)) (defn- encode-key-buf "Encodes the full key." - [compartment tid id] - (let [co-c-hash (coll/nth compartment 0) - co-res-id (coll/nth compartment 1)] - (-> (bb/allocate (unchecked-add-int (key-prefix-size co-res-id) (bs/size id))) - (bb/put-int! co-c-hash) - (bb/put-byte-string! co-res-id) - (bb/put-byte! 0) - (bb/put-int! tid) - (bb/put-byte-string! id)))) + [[co-c-hash co-res-did] tid did] + (-> (bb/allocate key-size) + (bb/put-int! co-c-hash) + (bb/put-long! co-res-did) + (bb/put-int! tid) + (bb/put-long! did))) (defn- encode-key @@ -85,32 +69,32 @@ "Returns a reducible collection of all resource handles of type with `tid` linked to `compartment`. - An optional `start-id` can be given. + An optional `start-did` can be given. Changes the state of `cri`. Consuming the collection requires exclusive access to `cri`. Doesn't close `cri`." {:arglists '([context compartment tid] - [context compartment tid start-id])} + [context compartment tid start-did])} ([{:keys [cri resource-handle]} compartment tid] (let [seek-key (encode-seek-key compartment tid)] (coll/eduction (resource-handles-xf resource-handle tid) (i/prefix-keys! cri seek-key decode-key seek-key)))) - ([{:keys [cri resource-handle]} compartment tid start-id] + ([{:keys [cri resource-handle]} compartment tid start-did] (coll/eduction (resource-handles-xf resource-handle tid) (i/prefix-keys! cri (encode-seek-key compartment tid) decode-key - (encode-key compartment tid start-id))))) + (encode-key compartment tid start-did))))) (defn index-entry "Returns an entry of the CompartmentResource index build from `compartment`, - `tid` and `id`." - [compartment tid id] + `tid` and `did`." + [compartment tid did] [:compartment-resource-type-index - (bb/array (encode-key-buf compartment tid id)) + (bb/array (encode-key-buf compartment tid did)) bytes/empty]) diff --git a/modules/db/src/blaze/db/impl/index/compartment/search_param_value_resource.clj b/modules/db/src/blaze/db/impl/index/compartment/search_param_value_resource.clj index 15073c634..5c8210919 100644 --- a/modules/db/src/blaze/db/impl/index/compartment/search_param_value_resource.clj +++ b/modules/db/src/blaze/db/impl/index/compartment/search_param_value_resource.clj @@ -3,7 +3,6 @@ (:require [blaze.byte-buffer :as bb] [blaze.byte-string :as bs] - [blaze.coll.core :as coll] [blaze.db.impl.bytes :as bytes] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.search-param-value-resource :as sp-vr] @@ -15,7 +14,7 @@ (defn keys! - "Returns a reducible collection of `[prefix id hash-prefix]` triples starting + "Returns a reducible collection of `[prefix did hash-prefix]` triples starting at `start-key`. Changes the state of `iter`. Consuming the collection requires exclusive @@ -24,28 +23,25 @@ (i/keys! iter sp-vr/decode-key start-key)) -(defn- key-size ^long [co-res-id value] - (+ codec/c-hash-size (bs/size co-res-id) 1 +(defn- key-size ^long [value] + (+ codec/c-hash-size codec/did-size codec/c-hash-size codec/tid-size (bs/size value))) (defn encode-seek-key - [compartment sp-c-hash tid value] - (let [co-c-hash (coll/nth compartment 0) - co-res-id (coll/nth compartment 1)] - (-> (bb/allocate (key-size co-res-id value)) - (bb/put-int! co-c-hash) - (bb/put-byte-string! co-res-id) - (bb/put-byte! 0) - (bb/put-int! sp-c-hash) - (bb/put-int! tid) - (bb/put-byte-string! value) - bb/flip! - bs/from-byte-buffer!))) + [[co-c-hash co-res-did] sp-c-hash tid value] + (-> (bb/allocate (key-size value)) + (bb/put-int! co-c-hash) + (bb/put-long! co-res-did) + (bb/put-int! sp-c-hash) + (bb/put-int! tid) + (bb/put-byte-string! value) + bb/flip! + bs/from-byte-buffer!)) (defn prefix-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples starting at + "Returns a reducible collection of `[did hash-prefix]` tuples starting at `value` and ending when `value` is no longer the prefix of the values processed. @@ -53,32 +49,27 @@ access to `iter`. Doesn't close `iter`." [iter compartment c-hash tid value] (let [seek-key (encode-seek-key compartment c-hash tid value)] - (i/prefix-keys! iter seek-key sp-vr/decode-id-hash-prefix seek-key))) + (i/prefix-keys! iter seek-key sp-vr/decode-did-hash-prefix seek-key))) (defn- encode-key - [compartment sp-c-hash tid value id hash] - (let [co-c-hash (coll/nth compartment 0) - co-res-id (coll/nth compartment 1)] - (-> (bb/allocate (+ (key-size co-res-id value) - (bs/size id) 2 hash/prefix-size)) - (bb/put-int! co-c-hash) - (bb/put-byte-string! co-res-id) - (bb/put-byte! 0) - (bb/put-int! sp-c-hash) - (bb/put-int! tid) - (bb/put-byte-string! value) - (bb/put-byte! 0) - (bb/put-byte-string! id) - (bb/put-byte! (bs/size id)) - (hash/prefix-into-byte-buffer! (hash/prefix hash)) - bb/array))) + [[co-c-hash co-res-did] sp-c-hash tid value did hash] + (-> (bb/allocate (+ (key-size value) 1 codec/did-size hash/prefix-size)) + (bb/put-int! co-c-hash) + (bb/put-long! co-res-did) + (bb/put-int! sp-c-hash) + (bb/put-int! tid) + (bb/put-byte-string! value) + (bb/put-byte! 0) + (bb/put-long! did) + (hash/prefix-into-byte-buffer! (hash/prefix hash)) + bb/array)) (defn index-entry "Returns an entry of the CompartmentSearchParamValueResource index build from - `compartment`, `c-hash`, `tid`, `value`, `id` and `hash`." - [compartment c-hash tid value id hash] + `compartment`, `c-hash`, `tid`, `value`, `did` and `hash`." + [compartment c-hash tid value did hash] [:compartment-search-param-value-index - (encode-key compartment c-hash tid value id hash) + (encode-key compartment c-hash tid value did hash) bytes/empty]) diff --git a/modules/db/src/blaze/db/impl/index/resource_as_of.clj b/modules/db/src/blaze/db/impl/index/resource_as_of.clj index ade5e8d1c..c7f726def 100644 --- a/modules/db/src/blaze/db/impl/index/resource_as_of.clj +++ b/modules/db/src/blaze/db/impl/index/resource_as_of.clj @@ -19,16 +19,16 @@ (set! *unchecked-math* :warn-on-boxed) -(def ^:private ^:const ^long max-key-size - (+ codec/tid-size codec/max-id-size codec/t-size)) +(def ^:private ^:const ^long tid-did-size + (+ codec/tid-size codec/did-size)) -(def ^:private ^:const ^long except-id-key-size - (+ codec/tid-size codec/t-size)) +(def ^:private ^:const ^long key-size + (+ codec/tid-size codec/did-size codec/t-size)) -(def ^:private ^:const ^long value-size - (+ hash/size codec/state-size)) +(def ^:private ^:const ^long max-value-size + (+ hash/size codec/state-size codec/max-id-size)) (defn- key-reader [iter kb] @@ -37,58 +37,28 @@ (kv/key! iter kb))) -(defn- focus-id! - "Reduces the limit of `kb` in order to hide the t and focus on id solely." - [kb] - (bb/set-limit! kb (- (bb/limit kb) codec/t-size))) +(defn- did-marker + "Compares the did part of the current key buffer with the did volatile that + may contain previously seen dids. - -(defn- copy-id! - "Copies the id bytes from the key buffer into the id buffer." - [kb ib] - (let [id-size (bb/remaining kb)] - (bb/set-limit! ib id-size) - (bb/put-byte-buffer! ib kb) - (bb/flip! ib) - (bb/rewind! ib)) - (bb/set-limit! kb (unchecked-add-int (bb/limit kb) codec/t-size))) - - -(defn- skip-id! - "Does the same to `position` and `limit` of `kb` as `copy-id!` but doesn't - copy anything." - [kb ib] - (bb/set-position! kb (unchecked-add-int (bb/position kb) (bb/remaining ib))) - (bb/set-limit! kb (unchecked-add-int (bb/limit kb) codec/t-size))) - - -(defn- id-marker - "Compares the id part of the current key buffer with the id buffer that may - contain previously seen ids. - - Returns true if the id changed over the previously seen one. Keeps the id - buffer up to date." - [kb ib] + Returns true if the did changed over the previously seen one. Keeps the did + volatile up to date." + [kb did-box] (fn [_] - (focus-id! kb) - (cond - (zero? (bb/limit ib)) + (if (nil? @did-box) (do - (copy-id! kb ib) + (vreset! did-box (bb/get-long! kb)) false) - (= kb ib) - (do - (skip-id! kb ib) - false) - - :else - (do - (copy-id! kb ib) - true)))) + (let [did (bb/get-long! kb)] + (if (= did @did-box) + false + (do + (vreset! did-box did) + true)))))) -(defn- tid-marker [kb tid-box ib id-marker] +(defn- tid-marker [kb tid-box did-box id-marker] (fn [x] (let [tid (bb/get-int! kb) last-tid @tid-box] @@ -104,15 +74,15 @@ :else (do (vreset! tid-box tid) - (bb/set-limit! ib 0) + (vreset! did-box nil) (id-marker x) true))))) (defn- new-entry! "Creates a new resource handle entry." - [tid ib vb t] - (rh/resource-handle tid (codec/id (bb/array ib) 0 (bb/remaining ib)) t vb)) + [tid did-box vb t] + (rh/resource-handle tid @did-box t vb)) (defn- type-entry-creator @@ -121,28 +91,29 @@ Uses `iter` to read the `hash` and `state` when needed. Supplies `tid` to the created entry." - [tid iter kb ib base-t] - (let [vb (bb/allocate-direct value-size)] - #(let [t (codec/descending-long (bb/get-long! kb))] - (when (<= t ^long base-t) + [tid iter kb did-box base-t] + (let [vb (bb/allocate-direct max-value-size)] + #(let [t (codec/descending-long (bb/get-5-byte-long! kb))] + (when (<= t (unchecked-long base-t)) (bb/clear! vb) (kv/value! iter vb) - (new-entry! tid ib vb t))))) + (new-entry! tid did-box vb t))))) (defn- system-entry-creator - [tid-box iter kb ib base-t] - (let [vb (bb/allocate-direct value-size)] - #(let [t (codec/descending-long (bb/get-long! kb))] - (when (<= t ^long base-t) + [tid-box iter kb did-box base-t] + (let [vb (bb/allocate-direct max-value-size)] + #(let [t (codec/descending-long (bb/get-5-byte-long! kb))] + (when (<= t (unchecked-long base-t)) (bb/clear! vb) (kv/value! iter vb) - (new-entry! @tid-box ib vb t))))) + (new-entry! @tid-box did-box vb t))))) (defn- group-by-id - "Returns a stateful transducer which takes flags from `id-marker` and supplies - resource handle entries to the reduce function after id changes happen." + "Returns a stateful transducer which takes flags from `did-marker` and + supplies resource handle entries to the reduce function after did changes + happen." [entry-creator] (let [state (volatile! nil) search-entry! #(when-let [e (entry-creator)] @@ -175,17 +146,17 @@ result)))))))) -(defn- encode-key-buf [tid id t] - (-> (bb/allocate (unchecked-add-int except-id-key-size (bs/size id))) +(defn- encode-key-buf [tid did t] + (-> (bb/allocate key-size) (bb/put-int! tid) - (bb/put-byte-string! id) - (bb/put-long! (codec/descending-long t)))) + (bb/put-long! did) + (bb/put-5-byte-long! (codec/descending-long t)))) (defn encode-key "Encodes the key of the ResourceAsOf index from `tid`, `id` and `t`." - [tid id t] - (bb/array (encode-key-buf tid id t))) + [tid did t] + (bb/array (encode-key-buf tid did t))) (defn- starts-with-tid? [^long tid kb] @@ -197,13 +168,13 @@ (defn- type-list-xf [{:keys [raoi t]} tid] - (let [kb (bb/allocate-direct max-key-size) - ib (bb/set-limit! (bb/allocate codec/max-id-size) 0) - entry-creator (type-entry-creator tid raoi kb ib t)] + (let [kb (bb/allocate-direct key-size) + did-box (volatile! nil) + entry-creator (type-entry-creator tid raoi kb did-box t)] (comp (map (key-reader raoi kb)) (take-while (starts-with-tid? tid kb)) - (map (id-marker kb ib)) + (map (did-marker kb did-box)) (group-by-id entry-creator) remove-deleted-xf))) @@ -211,49 +182,49 @@ (defn- start-key ([tid] (-> (Ints/toByteArray tid) bs/from-byte-array)) - ([tid start-id t] - (-> (encode-key-buf tid start-id t) + ([tid start-did t] + (-> (encode-key-buf tid start-did t) bb/flip! bs/from-byte-buffer!))) (defn type-list "Returns a reducible collection of all resource handles of type with `tid` - ordered by resource id. + ordered by resource did. - The list starts at the optional `start-id`. + The list starts at the optional `start-did`. - The ResourceAsOf index consists of keys with three parts: `tid`, `id` and - `t`. The `tid` is a 4-byte hash of the resource type, the `id` a variable - length byte array of the resource id and `t` is an 8-byte long of the - transaction number. The value of the ResourceAsOf index contains two parts: - `hash` and `state`. The `hash` is a 32-byte content hash of the resource and - the `state` is an 8-byte long encoding create, put, delete state and a local - version counter of the resource. + The ResourceAsOf index consists of keys with three parts: `tid`, `did` and + `t`. The `tid` is a 4-byte hash of the resource type, the `did` a 8-byte long + of the resource did and `t` is an 8-byte long of the transaction number. The + value of the ResourceAsOf index contains three parts: `hash`, `state` and + `id`. The `hash` is a 32-byte content hash of the resource, the `state` is an + 8-byte long encoding create, put, delete state and a local version counter of + the resource and the `id` is the resource id. The ResourceAsOf index contains one entry for each resource version. For the type list, only that versions not newer than `t` are returned. For example, an index containing two versions of the same resource looks like this: - < tid-0, id-0, t=2 > < hash-2, state-2 > - < tid-0, id-0, t=1 > < hash-1, state-1 > + < tid-0, did-0, t=2 > < hash-2, state-2, id-0 > + < tid-0, did-0, t=1 > < hash-1, state-1, id-0 > - Here the `tid` and `id` are the same, because the resource is the same and + Here the `tid` and `did` are the same, because the resource is the same and only the versions differ. The newer version has a `t` of `2` and the older version a `t` of `1`. `t` values are simply an incrementing transaction number. The content hashes and states also differ. A `type-list` call with a - `t` of two should return the newest version of the resource, were a call with + `t` of `2` should return the newest version of the resource, were a call with a `t` of `1` should return the older version. The implementation iterates over the ResourceAsOf index, starting with `tid` - and possible `start-id`. It goes from higher `t` values to lower `t` values + and possible `start-did`. It goes from higher `t` values to lower `t` values because they are encoded in descending order. For each entry in the index, the following things are done: * check if the end of the index is reached * check if the first 4 bytes are still the same `tid` as given - * for each `id` bytes seen over multiple entries, return that entry with + * for each `did` bytes seen over multiple entries, return that entry with `t` less than or equal to the `t` given A non-optimized implementation would use the following transducer, assuming @@ -263,72 +234,65 @@ (comp (map decode-entry) (take-while tid-valid?) - (partition-by id) + (partition-by did) (map pick-entry-according-to-t)) First, the whole entry consisting of its key and value are decoded completely into an immutable data structure. Than the `tid` is tested against the given `tid` in order to stop iterating before hitting the next type. Third, all - entries are partitioned by id which each partition containing a list of - entries with the same id. Last, the entry with the right `t` is picked. + entries are partitioned by did which each partition containing a list of + entries with the same did. Last, the entry with the right `t` is picked. This non-optimized implementation has several disadvantages. First, each entry is decoded fully but the `t`, `hash` and `state` part is only needed from - fewer entries. Even the `id` has only to be compared to a reference `id`, but - not fully decoded, for non-matching entries. Second `partition-by` creates an - vector of all entries with the same id. This leads to more object allocation - and time spend. + fewer entries. Second `partition-by` creates an vector of all entries with the + same sid. This leads to more object allocation and time spend. The implementation used here avoids excessive object allocation altogether. - Uses three byte buffers to avoid object allocation as much as + Uses two byte buffers and one volatile to avoid object allocation as much as possible. The first buffer is an off-heap key buffer. Each key is read into - the key buffer. The second buffer is an heap allocated id buffer. The id bytes - of the first key are copied into the id buffer and later copied only on id - change. To detect id changes, the id part of the key buffer and the id buffer - are compared. When a resource is created the heap allocated byte array of the - id buffer is fed into the string constructor. The string constructor will copy - the bytes from the id buffer for immutability. So for each returned resource - handle, a String and the internal byte array, it used, are allocated. The - second byte array which is allocated for each resource handle is the byte - array of the hash. No further byte arrays are allocated during the whole - iteration. The state and t which are both longs are read from the off-heap key - and value buffer. The hash and state which are read from the value buffer are - only read once for each resource handle." + the key buffer. To detect did changes, the did is parsed from the key buffer + and compared with the did from the volatile. The second byte array which is + allocated for each resource handle is the byte array of the hash. No further + byte arrays are allocated during the whole iteration. The state and t which + are both longs are read from the off-heap key and value buffer. The hash and + state which are read from the value buffer are only read once for each + resource handle." ([{:keys [raoi] :as context} tid] (coll/eduction (type-list-xf context tid) (i/iter! raoi (start-key tid)))) - ([{:keys [raoi t] :as context} tid start-id] + ([{:keys [raoi t] :as context} tid start-did] (coll/eduction (type-list-xf context tid) - (i/iter! raoi (start-key tid start-id t))))) + (i/iter! raoi (start-key tid start-did t))))) (defn- system-list-xf [{:keys [raoi t]} start-tid] - (let [kb (bb/allocate-direct max-key-size) + (let [kb (bb/allocate-direct key-size) tid-box (volatile! start-tid) - ib (bb/set-limit! (bb/allocate codec/max-id-size) 0)] + did-box (volatile! nil)] (comp (map (key-reader raoi kb)) - (map (tid-marker kb tid-box ib (id-marker kb ib))) - (group-by-id (system-entry-creator tid-box raoi kb ib t)) + (map (tid-marker kb tid-box did-box (did-marker kb did-box))) + (group-by-id (system-entry-creator tid-box raoi kb did-box t)) remove-deleted-xf))) (defn system-list - "Returns a reducible collection of all resource handles ordered by resource - tid and resource id. + "Returns a reducible collection of all resource handles ordered by tid and + did. - The list starts at the optional `start-tid` and `start-id`." + The list starts at the optional `start-tid` and `start-did`." ([{:keys [raoi] :as context}] (coll/eduction (system-list-xf context nil) (i/iter! raoi))) - ([{:keys [raoi t] :as context} start-tid start-id] + ([{:keys [raoi t] :as context} start-tid start-did] (coll/eduction (system-list-xf context start-tid) - (i/iter! raoi (start-key start-tid start-id t))))) + (i/iter! raoi (start-key start-tid start-did t))))) (defn decoder @@ -346,45 +310,42 @@ Both byte buffers are changed during decoding and have to be reset accordingly after decoding." [] - (let [ib (byte-array codec/max-id-size)] - (fn - ([] - [(bb/allocate-direct max-key-size) - (bb/allocate-direct value-size)]) - ([kb vb] - (rh/resource-handle - (bb/get-int! kb) - (let [id-size (- (bb/remaining kb) codec/t-size)] - (bb/copy-into-byte-array! kb ib 0 id-size) - (codec/id ib 0 id-size)) - (codec/descending-long (bb/get-long! kb)) - vb))))) - - -(defn- instance-history-key-valid? [^long tid id ^long end-t] + (fn + ([] + [(bb/allocate-direct key-size) + (bb/allocate-direct max-value-size)]) + ([kb vb] + (rh/resource-handle + (bb/get-int! kb) + (bb/get-long! kb) + (codec/descending-long (bb/get-5-byte-long! kb)) + vb)))) + + +(defn- instance-history-key-valid? [^long tid ^long did ^long end-t] (fn [resource-handle] (and (= (rh/tid resource-handle) tid) - (= (rh/id resource-handle) id) + (= (rh/did resource-handle) did) (< end-t (rh/t resource-handle))))) (defn instance-history "Returns a reducible collection of all versions between `start-t` (inclusive) - and `end-t` (exclusive) of the resource with `tid` and `id`. + and `end-t` (exclusive) of the resource with `tid` and `did`. Versions are resource handles." - [raoi tid id start-t end-t] + [raoi tid did start-t end-t] (coll/eduction - (take-while (instance-history-key-valid? tid (codec/id-string id) end-t)) - (i/kvs! raoi (decoder) (start-key tid id start-t)))) + (take-while (instance-history-key-valid? tid did end-t)) + (i/kvs! raoi (decoder) (start-key tid did start-t)))) -(defn- resource-handle** [raoi tb kb vb tid id t] +(defn- resource-handle* [raoi tb kb vb tid did t] ;; fill target buffer (bb/clear! tb) (bb/put-int! tb tid) - (bb/put-byte-string! tb id) - (bb/put-long! tb (codec/descending-long t)) + (bb/put-long! tb did) + (bb/put-5-byte-long! tb (codec/descending-long t)) ;; flip target buffer to be ready for seek (bb/flip! tb) (kv/seek-buffer! raoi tb) @@ -396,41 +357,39 @@ ;; would find the next resource ;; focus target buffer on tid and id (bb/rewind! tb) - (bb/set-limit! tb (unchecked-subtract-int (bb/limit tb) codec/t-size)) + (bb/set-limit! tb tid-did-size) ;; focus key buffer on tid and id - (bb/set-limit! kb (unchecked-subtract-int (bb/limit kb) codec/t-size)) + (bb/set-limit! kb tid-did-size) (when (= tb kb) ;; focus key buffer on t - (let [limit (bb/limit kb)] - (bb/set-position! kb limit) - (bb/set-limit! kb (unchecked-add-int limit codec/t-size))) + (bb/set-position! kb tid-did-size) + (bb/set-limit! kb key-size) ;; read value (bb/clear! vb) (kv/value! raoi vb) ;; create resource handle (rh/resource-handle tid - (codec/id-string id) - (codec/descending-long (bb/get-long! kb)) + did + (codec/descending-long (bb/get-5-byte-long! kb)) vb)))) ;; For performance reasons, we use that special Key class instead of a a simple ;; triple vector -(deftype Key [^long tid id ^long t] +(deftype Key [^long tid ^long did ^long t] Object - (equals [key x] - (or (identical? key x) - (and (instance? Key x) - (= tid (.-tid ^Key x)) - (.equals id (.-id ^Key x)) - (= t (.-t ^Key x))))) + (equals [_ x] + ;; skip the instanceof check, because keys are only compared to other keys + (and (= tid (.-tid ^Key x)) + (= did (.-did ^Key x)) + (= t (.-t ^Key x)))) (hashCode [_] - (-> tid + (-> (Long/hashCode tid) (unchecked-multiply-int 31) - (unchecked-add-int (.hashCode id)) + (unchecked-add-int (Long/hashCode did)) (unchecked-multiply-int 31) - (unchecked-add-int t)))) + (unchecked-add-int (Long/hashCode t))))) (defn resource-handle @@ -441,23 +400,23 @@ The returned function can't be called concurrently." [rh-cache raoi t] - (let [tb (bb/allocate-direct max-key-size) - kb (bb/allocate-direct max-key-size) - vb (bb/allocate-direct value-size) + (let [tb (bb/allocate-direct key-size) + kb (bb/allocate-direct key-size) + vb (bb/allocate-direct max-value-size) rh (reify Function (apply [_ key] - (resource-handle** raoi tb kb vb (.-tid ^Key key) - (.-id ^Key key) (.-t ^Key key))))] + (resource-handle* raoi tb kb vb (.-tid ^Key key) + (.-did ^Key key) (.-t ^Key key))))] (fn resource-handle - ([tid id] - (resource-handle tid id t)) - ([tid id t] - (.get ^Cache rh-cache (Key. tid id t) rh))))) + ([tid did] + (resource-handle tid did t)) + ([tid did t] + (.get ^Cache rh-cache (Key. tid did t) rh))))) (defn num-of-instance-changes "Returns the number of changes between `start-t` (inclusive) and `end-t` - (inclusive) of the resource with `tid` and `id`." - [resource-handle tid id start-t end-t] - (- (long (:num-changes (resource-handle tid id start-t) 0)) - (long (:num-changes (resource-handle tid id end-t) 0)))) + (inclusive) of the resource with `tid` and `did`." + [resource-handle tid did start-t end-t] + (- (long (:num-changes (resource-handle tid did start-t) 0)) + (long (:num-changes (resource-handle tid did end-t) 0)))) diff --git a/modules/db/src/blaze/db/impl/index/resource_handle.clj b/modules/db/src/blaze/db/impl/index/resource_handle.clj index 65b2b8bcb..d71d5bb93 100644 --- a/modules/db/src/blaze/db/impl/index/resource_handle.clj +++ b/modules/db/src/blaze/db/impl/index/resource_handle.clj @@ -13,38 +13,41 @@ (set! *unchecked-math* :warn-on-boxed) -(deftype ResourceHandle [^int tid id ^long t hash ^long num-changes op] +(deftype ResourceHandle [^int tid ^long did ^long t hash ^long num-changes op id] p/FhirType (-type [_] ;; TODO: maybe cache this (keyword "fhir" (codec/tid->type tid))) ILookup - (valAt [rh key] - (.valAt rh key nil)) + (valAt [resource-handle key] + (.valAt resource-handle key nil)) (valAt [_ key not-found] (case key :tid tid - :id id + :did did :t t :hash hash :num-changes num-changes :op op + :id id not-found)) Object - (equals [rh x] - (or (identical? rh x) + (toString [_] + (str (codec/tid->type tid) "/" id)) + (equals [resource-handle x] + (or (identical? resource-handle x) (and (instance? ResourceHandle x) (= tid (.-tid ^ResourceHandle x)) - (.equals id (.-id ^ResourceHandle x)) + (= did (.-did ^ResourceHandle x)) (= t (.-t ^ResourceHandle x))))) (hashCode [_] - (-> tid + (-> (Long/hashCode tid) (unchecked-multiply-int 31) - (unchecked-add-int (.hashCode id)) + (unchecked-add-int (Long/hashCode did)) (unchecked-multiply-int 31) - (unchecked-add-int t)))) + (unchecked-add-int (Long/hashCode t))))) (defn state->num-changes @@ -67,16 +70,11 @@ "Creates a new resource handle. The type of that handle will be the keyword `:fhir/`." - [tid id t value-buffer] + [tid did t value-buffer] (let [hash (hash/from-byte-buffer! value-buffer) state (bb/get-long! value-buffer)] - (ResourceHandle. - tid - id - t - hash - (state->num-changes state) - (state->op state)))) + (ResourceHandle. tid did t hash (state->num-changes state) (state->op state) + (codec/id-from-byte-buffer value-buffer)))) (defn resource-handle? [x] @@ -85,35 +83,54 @@ (defn deleted? {:inline - (fn [rh] - `(identical? :delete (.-op ~(with-meta rh {:tag `ResourceHandle}))))} - [rh] - (identical? :delete (.-op ^ResourceHandle rh))) + (fn [resource-handle] + `(identical? :delete (.-op ~(with-meta resource-handle {:tag `ResourceHandle}))))} + [resource-handle] + (identical? :delete (.-op ^ResourceHandle resource-handle))) (defn tid - {:inline (fn [rh] `(.-tid ~(with-meta rh {:tag `ResourceHandle})))} - [rh] - (.-tid ^ResourceHandle rh)) + {:inline + (fn [resource-handle] + `(.-tid ~(with-meta resource-handle {:tag `ResourceHandle})))} + [resource-handle] + (.-tid ^ResourceHandle resource-handle)) -(defn id - {:inline (fn [rh] `(.-id ~(with-meta rh {:tag `ResourceHandle})))} - [rh] - (.-id ^ResourceHandle rh)) +(defn did + "Returns the internal resource identifier of `resource-handle`." + {:inline + (fn [resource-handle] + `(.-did ~(with-meta resource-handle {:tag `ResourceHandle})))} + [resource-handle] + (.-did ^ResourceHandle resource-handle)) (defn t - {:inline (fn [rh] `(.-t ~(with-meta rh {:tag `ResourceHandle})))} - [rh] - (.-t ^ResourceHandle rh)) + "Returns the point in time `t` at which `resource-handle` was created." + {:inline + (fn [resource-handle] + `(.-t ~(with-meta resource-handle {:tag `ResourceHandle})))} + [resource-handle] + (.-t ^ResourceHandle resource-handle)) (defn hash - {:inline (fn [rh] `(.-hash ~(with-meta rh {:tag `ResourceHandle})))} - [rh] - (.-hash ^ResourceHandle rh)) + {:inline + (fn [resource-handle] + `(.-hash ~(with-meta resource-handle {:tag `ResourceHandle})))} + [resource-handle] + (.-hash ^ResourceHandle resource-handle)) + + +(defn id + "Returns the FHIR resource identifier of `resource-handle`." + {:inline + (fn [resource-handle] + `(.-id ~(with-meta resource-handle {:tag `ResourceHandle})))} + [resource-handle] + (.-id ^ResourceHandle resource-handle)) -(defn reference [rh] - (str (codec/tid->type (tid rh)) "/" (id rh))) +(defn reference [resource-handle] + (str (codec/tid->type (tid resource-handle)) "/" (id resource-handle))) diff --git a/modules/db/src/blaze/db/impl/index/resource_id.clj b/modules/db/src/blaze/db/impl/index/resource_id.clj new file mode 100644 index 000000000..203f5470a --- /dev/null +++ b/modules/db/src/blaze/db/impl/index/resource_id.clj @@ -0,0 +1,34 @@ +(ns blaze.db.impl.index.resource-id + "Functions for accessing the ResourceId index." + (:require + [blaze.byte-buffer :as bb] + [blaze.db.impl.codec :as codec] + [blaze.db.kv :as kv]) + (:import + [com.google.common.primitives Longs] + [java.nio.charset StandardCharsets])) + + +(set! *warn-on-reflection* true) +(set! *unchecked-math* :warn-on-boxed) + + +(defn encode-key [tid ^String id] + (-> (bb/allocate (+ (int codec/tid-size) (.length id))) + (bb/put-int! tid) + (bb/put-byte-array! (.getBytes id StandardCharsets/ISO_8859_1)) + bb/array)) + + +(defn resource-id [kv-store] + (fn [tid id] + (some-> (kv/get kv-store :resource-id-index (encode-key tid id)) + Longs/fromByteArray))) + + +(defn encode-value [did] + (Longs/toByteArray did)) + + +(defn index-entry [tid id did] + [:resource-id-index (encode-key tid id) (encode-value did)]) diff --git a/modules/db/src/blaze/db/impl/index/resource_search_param_value.clj b/modules/db/src/blaze/db/impl/index/resource_search_param_value.clj index 66269819a..bf7008750 100644 --- a/modules/db/src/blaze/db/impl/index/resource_search_param_value.clj +++ b/modules/db/src/blaze/db/impl/index/resource_search_param_value.clj @@ -14,48 +14,48 @@ (set! *unchecked-math* :warn-on-boxed) -(def ^:private ^:const ^long key-buffer-capacity +(def ^:const ^long key-buffer-capacity "Most search param value keys should fit into this size." - 128) + 64) + + +(def ^:private ^:const ^long value-pos + (+ codec/tid-size codec/did-size hash/prefix-size codec/c-hash-size)) (defn- decode-value "Decodes the value from the key." ([] (bb/allocate-direct key-buffer-capacity)) ([buf] - (bb/set-position! buf (unchecked-add-int (bb/position buf) codec/tid-size)) - (let [id-size (long (bb/size-up-to-null buf))] - (bb/set-position! buf (+ (bb/position buf) id-size 1 hash/prefix-size - codec/c-hash-size)) - (bs/from-byte-buffer! buf)))) + (bb/set-position! buf value-pos) + (bs/from-byte-buffer! buf))) -(defn- key-size ^long [id] - (+ codec/tid-size 1 (bs/size id) hash/prefix-size codec/c-hash-size)) +(def ^:private ^:const ^long seek-key-size + (+ codec/tid-size codec/did-size hash/prefix-size codec/c-hash-size)) -(defn- encode-key-buf-1 [size tid id hash c-hash] +(defn- encode-key-buf-1 [size tid did hash c-hash] (-> (bb/allocate size) (bb/put-int! tid) - (bb/put-byte-string! id) - (bb/put-byte! 0) + (bb/put-long! did) (hash/prefix-into-byte-buffer! (hash/prefix hash)) (bb/put-int! c-hash))) (defn- encode-key-buf - ([tid id hash c-hash] - (encode-key-buf-1 (key-size id) tid id hash c-hash)) - ([tid id hash c-hash value] - (-> (encode-key-buf-1 (+ (key-size id) (bs/size value)) tid id hash c-hash) + ([tid did hash c-hash] + (encode-key-buf-1 seek-key-size tid did hash c-hash)) + ([tid did hash c-hash value] + (-> (encode-key-buf-1 (+ seek-key-size (bs/size value)) tid did hash c-hash) (bb/put-byte-string! value)))) (defn- encode-key - ([tid id hash c-hash] - (-> (encode-key-buf tid id hash c-hash) bb/flip! bs/from-byte-buffer!)) - ([tid id hash c-hash value] - (-> (encode-key-buf tid id hash c-hash value) bb/flip! bs/from-byte-buffer!))) + ([tid did hash c-hash] + (-> (encode-key-buf tid did hash c-hash) bb/flip! bs/from-byte-buffer!)) + ([tid did hash c-hash value] + (-> (encode-key-buf tid did hash c-hash value) bb/flip! bs/from-byte-buffer!))) (defn next-value! @@ -67,14 +67,12 @@ {:arglists '([iter resource-handle c-hash] [iter resource-handle c-hash prefix-value value])} - ([iter {:keys [tid id hash]} c-hash] - (let [id (codec/id-byte-string id) - key (encode-key tid id hash c-hash)] + ([iter {:keys [tid did hash]} c-hash] + (let [key (encode-key tid did hash c-hash)] (coll/first (i/prefix-keys! iter key decode-value key)))) - ([iter {:keys [tid id hash]} c-hash prefix-value value] - (let [id (codec/id-byte-string id) - prefix-key (encode-key tid id hash c-hash prefix-value) - start-key (encode-key tid id hash c-hash value)] + ([iter {:keys [tid did hash]} c-hash prefix-value value] + (let [prefix-key (encode-key tid did hash c-hash prefix-value) + start-key (encode-key tid did hash c-hash value)] (coll/first (i/prefix-keys! iter prefix-key decode-value start-key))))) @@ -84,34 +82,33 @@ `prefix-value`." {:arglists '([iter resource-handle c-hash prefix-value value])} - [iter {:keys [tid id hash]} c-hash prefix-value value] - (let [id (codec/id-byte-string id) - prefix-key (encode-key tid id hash c-hash prefix-value) - start-key (encode-key tid id hash c-hash value)] + [iter {:keys [tid did hash]} c-hash prefix-value value] + (let [prefix-key (encode-key tid did hash c-hash prefix-value) + start-key (encode-key tid did hash c-hash value)] (coll/first (i/prefix-keys-prev! iter prefix-key decode-value start-key)))) (defn prefix-keys! "Returns a reducible collection of decoded values from keys starting at - `start-value` (optional) and ending when the prefix of `tid`, `id`, `hash`, + `start-value` (optional) and ending when the prefix of `tid`, `did`, `hash`, `c-hash` and `prefix-value` (optional) is no longer a prefix of the keys processed. Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." - ([iter tid id hash c-hash] - (let [key (encode-key tid id hash c-hash)] + ([iter tid did hash c-hash] + (let [key (encode-key tid did hash c-hash)] (i/prefix-keys! iter key decode-value key))) - ([iter tid id hash c-hash prefix-value] - (let [prefix-key (encode-key tid id hash c-hash prefix-value)] + ([iter tid did hash c-hash prefix-value] + (let [prefix-key (encode-key tid did hash c-hash prefix-value)] (i/prefix-keys! iter prefix-key decode-value prefix-key))) - ([iter tid id hash c-hash prefix-value start-value] - (let [prefix-key (encode-key tid id hash c-hash prefix-value) - start-key (encode-key tid id hash c-hash start-value)] + ([iter tid did hash c-hash prefix-value start-value] + (let [prefix-key (encode-key tid did hash c-hash prefix-value) + start-key (encode-key tid did hash c-hash start-value)] (i/prefix-keys! iter prefix-key decode-value start-key)))) -(defn index-entry [tid id hash c-hash value] +(defn index-entry [tid did hash c-hash value] [:resource-value-index - (bb/array (encode-key-buf tid id hash c-hash value)) + (bb/array (encode-key-buf tid did hash c-hash value)) bytes/empty]) diff --git a/modules/db/src/blaze/db/impl/index/rts_as_of.clj b/modules/db/src/blaze/db/impl/index/rts_as_of.clj index 590b909af..a8b34eaa6 100644 --- a/modules/db/src/blaze/db/impl/index/rts_as_of.clj +++ b/modules/db/src/blaze/db/impl/index/rts_as_of.clj @@ -12,32 +12,30 @@ [blaze.db.impl.index.type-as-of :as tao] [blaze.fhir.hash :as hash]) (:import - [clojure.lang Numbers])) + [clojure.lang Numbers] + [java.nio.charset StandardCharsets])) (set! *warn-on-reflection* true) (set! *unchecked-math* :warn-on-boxed) -(def ^:private ^:const ^long value-size - (+ hash/size codec/state-size)) - - (defn- state ^long [^long num-changes op] (cond-> (bit-shift-left num-changes 8) (identical? :create op) (Numbers/setBit 1) (identical? :delete op) (Numbers/setBit 0))) -(defn encode-value [hash num-changes op] - (-> (bb/allocate value-size) +(defn encode-value [hash num-changes op ^String id] + (-> (bb/allocate (+ hash/size codec/state-size (.length id))) (hash/into-byte-buffer! hash) (bb/put-long! (state num-changes op)) + (bb/put-byte-array! (.getBytes id StandardCharsets/ISO_8859_1)) bb/array)) -(defn index-entries [tid id t hash num-changes op] - (let [value (encode-value hash num-changes op)] - [[:resource-as-of-index (rao/encode-key tid id t) value] - [:type-as-of-index (tao/encode-key tid t id) value] - [:system-as-of-index (sao/encode-key t tid id) value]])) +(defn index-entries [tid did t hash num-changes op id] + (let [value (encode-value hash num-changes op id)] + [[:resource-as-of-index (rao/encode-key tid did t) value] + [:type-as-of-index (tao/encode-key tid t did) value] + [:system-as-of-index (sao/encode-key t tid did) value]])) diff --git a/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj b/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj index 099b05572..8a9b42dbf 100644 --- a/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj +++ b/modules/db/src/blaze/db/impl/index/search_param_value_resource.clj @@ -5,7 +5,6 @@ [blaze.byte-string :as bs] [blaze.db.impl.bytes :as bytes] [blaze.db.impl.codec :as codec] - [blaze.db.impl.index.search-param-value-resource.impl :as impl] [blaze.db.impl.iterators :as i] [blaze.fhir.hash :as hash])) @@ -13,29 +12,27 @@ (set! *unchecked-math* :warn-on-boxed) -(def ^:private ^:const ^long key-buffer-capacity +(def ^:const ^long key-buffer-capacity "Most search param value keys should fit into this size." - 128) + 64) (defn decode-key - "Returns a triple of `[prefix id hash-prefix]`. + "Returns a triple of `[prefix did hash-prefix]`. The prefix contains the c-hash, tid and value parts as encoded byte string." ([] (bb/allocate-direct key-buffer-capacity)) ([buf] - (let [id-size (impl/id-size buf) - all-size (bb/remaining buf) - prefix-size (- all-size 2 id-size hash/prefix-size) + (let [all-size (bb/remaining buf) + prefix-size (- all-size 1 codec/did-size hash/prefix-size) prefix (bs/from-byte-buffer! buf prefix-size) _ (bb/get-byte! buf) - id (bs/from-byte-buffer! buf id-size)] - (bb/get-byte! buf) - [prefix id (hash/prefix-from-byte-buffer! buf)]))) + did (bb/get-long! buf)] + [prefix did (hash/prefix-from-byte-buffer! buf)]))) (defn keys! - "Returns a reducible collection of `[prefix id hash-prefix]` triples starting + "Returns a reducible collection of `[prefix did hash-prefix]` triples starting at `start-key`. The prefix contains the c-hash, tid and value parts as encoded byte string. @@ -50,13 +47,6 @@ (+ codec/c-hash-size codec/tid-size)) -(defn- key-size - (^long [value] - (+ base-key-size (bs/size value))) - (^long [value id] - (+ (key-size value) (bs/size id) 2))) - - (defn encode-seek-key ([c-hash tid] (-> (bb/allocate base-key-size) @@ -65,20 +55,19 @@ bb/flip! bs/from-byte-buffer!)) ([c-hash tid value] - (-> (bb/allocate (key-size value)) + (-> (bb/allocate (+ base-key-size (bs/size value))) (bb/put-int! c-hash) (bb/put-int! tid) (bb/put-byte-string! value) bb/flip! bs/from-byte-buffer!)) - ([c-hash tid value id] - (-> (bb/allocate (key-size value id)) + ([c-hash tid value did] + (-> (bb/allocate (+ base-key-size (bs/size value) 1 codec/did-size)) (bb/put-int! c-hash) (bb/put-int! tid) (bb/put-byte-string! value) (bb/put-byte! 0) - (bb/put-byte-string! id) - (bb/put-byte! (bs/size id)) + (bb/put-long! did) bb/flip! bs/from-byte-buffer!))) @@ -94,39 +83,37 @@ (bs/concat (encode-seek-key c-hash tid) max-hash-prefix)) ([c-hash tid value] (bs/concat (encode-seek-key c-hash tid value) max-hash-prefix)) - ([c-hash tid value id] - (bs/concat (encode-seek-key c-hash tid value id) max-hash-prefix))) + ([c-hash tid value did] + (bs/concat (encode-seek-key c-hash tid value did) max-hash-prefix))) -(defn decode-value-id-hash-prefix - "Returns a triple of `[value id hash-prefix]`." +(defn decode-value-did-hash-prefix + "Returns a triple of `[value did hash-prefix]`." ([] (bb/allocate-direct key-buffer-capacity)) ([buf] - (let [id-size (impl/id-size buf) - _ (bb/set-position! buf base-key-size) - all-size (bb/remaining buf) - value-size (- all-size 2 id-size hash/prefix-size) + (let [_ (bb/set-position! buf base-key-size) + remaining-size (bb/remaining buf) + value-size (- remaining-size 1 codec/did-size hash/prefix-size) value (bs/from-byte-buffer! buf value-size) _ (bb/get-byte! buf) - id (bs/from-byte-buffer! buf id-size)] - (bb/get-byte! buf) - [value id (hash/prefix-from-byte-buffer! buf)]))) + did (bb/get-long! buf)] + [value did (hash/prefix-from-byte-buffer! buf)]))) (defn all-keys! - "Returns a reducible collection of `[value id hash-prefix]` triples of the + "Returns a reducible collection of `[value did hash-prefix]` triples of the whole range prefixed with `c-hash` and `tid` starting with `start-value` and - `start-id` (optional). + `start-did` (optional). Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." ([iter c-hash tid] (let [prefix (encode-seek-key c-hash tid)] - (i/prefix-keys! iter prefix decode-value-id-hash-prefix prefix))) - ([iter c-hash tid start-value start-id] + (i/prefix-keys! iter prefix decode-value-did-hash-prefix prefix))) + ([iter c-hash tid start-value start-did] (let [prefix (encode-seek-key c-hash tid) - start-key (encode-seek-key c-hash tid start-value start-id)] - (i/prefix-keys! iter prefix decode-value-id-hash-prefix start-key)))) + start-key (encode-seek-key c-hash tid start-value start-did)] + (i/prefix-keys! iter prefix decode-value-did-hash-prefix start-key)))) (defn all-keys-prev! @@ -139,44 +126,40 @@ ([iter c-hash tid] (let [prefix (encode-seek-key c-hash tid) start-key (encode-seek-key-for-prev c-hash tid)] - (i/prefix-keys-prev! iter prefix decode-value-id-hash-prefix start-key))) - ([iter c-hash tid start-value start-id] + (i/prefix-keys-prev! iter prefix decode-value-did-hash-prefix start-key))) + ([iter c-hash tid start-value start-did] (let [prefix (encode-seek-key c-hash tid) - start-key (encode-seek-key-for-prev c-hash tid start-value start-id)] - (i/prefix-keys-prev! iter prefix decode-value-id-hash-prefix start-key)))) + start-key (encode-seek-key-for-prev c-hash tid start-value start-did)] + (i/prefix-keys-prev! iter prefix decode-value-did-hash-prefix start-key)))) -(defn decode-id-hash-prefix - "Returns a tuple of `[id hash-prefix]`." +(defn decode-did-hash-prefix + "Returns a tuple of `[did hash-prefix]`." ([] (bb/allocate-direct key-buffer-capacity)) ([buf] - (let [id-size (impl/id-size buf) - all-size (unchecked-inc-int (unchecked-add-int id-size hash/prefix-size)) - _ (bb/set-position! buf (unchecked-subtract-int (bb/limit buf) all-size)) - id (bs/from-byte-buffer! buf id-size)] - (bb/get-byte! buf) - [id (hash/prefix-from-byte-buffer! buf)]))) + (bb/set-position! buf (- (bb/limit buf) codec/did-size hash/prefix-size)) + [(bb/get-long! buf) (hash/prefix-from-byte-buffer! buf)])) (defn prefix-keys! - "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys - starting at `start-value` and optional `start-id` and ending when + "Returns a reducible collection of decoded `[did hash-prefix]` tuples from keys + starting at `start-value` and optional `start-did` and ending when `prefix-value` is no longer a prefix of the values processed. Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." ([iter c-hash tid prefix-value start-value] (i/prefix-keys! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix (encode-seek-key c-hash tid start-value))) - ([iter c-hash tid prefix-value start-value start-id] + ([iter c-hash tid prefix-value start-value start-did] (i/prefix-keys! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix - (encode-seek-key c-hash tid start-value start-id)))) + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix + (encode-seek-key c-hash tid start-value start-did)))) (defn prefix-keys'! - "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys + "Returns a reducible collection of decoded `[did hash-prefix]` tuples from keys starting at `start-value` and ending when `prefix-value` is no longer a prefix of the values processed. @@ -184,13 +167,13 @@ access to `iter`. Doesn't close `iter`." [iter c-hash tid prefix-value start-value] (i/prefix-keys! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix (encode-seek-key-for-prev c-hash tid start-value))) (defn prefix-keys-prev! - "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys - starting at `start-value` and optional `start-id` and ending when + "Returns a reducible collection of decoded `[did hash-prefix]` tuples from keys + starting at `start-value` and optional `start-did` and ending when `prefix-value` is no longer a prefix of the values processed, iterating in reverse. @@ -198,16 +181,16 @@ access to `iter`. Doesn't close `iter`." ([iter c-hash tid prefix-value start-value] (i/prefix-keys-prev! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix (encode-seek-key-for-prev c-hash tid start-value))) - ([iter c-hash tid prefix-value start-value start-id] + ([iter c-hash tid prefix-value start-value start-did] (i/prefix-keys-prev! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix - (encode-seek-key-for-prev c-hash tid start-value start-id)))) + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix + (encode-seek-key-for-prev c-hash tid start-value start-did)))) (defn prefix-keys-prev'! - "Returns a reducible collection of decoded `[id hash-prefix]` tuples from keys + "Returns a reducible collection of decoded `[did hash-prefix]` tuples from keys starting at `start-value` and ending when `prefix-value` is no longer a prefix of the values processed, iterating in reverse. @@ -215,24 +198,23 @@ access to `iter`. Doesn't close `iter`." [iter c-hash tid prefix-value start-value] (i/prefix-keys-prev! - iter (encode-seek-key c-hash tid prefix-value) decode-id-hash-prefix + iter (encode-seek-key c-hash tid prefix-value) decode-did-hash-prefix (encode-seek-key c-hash tid start-value))) -(defn encode-key [c-hash tid value id hash] - (-> (bb/allocate (unchecked-add-int (key-size value id) hash/prefix-size)) +(defn encode-key [c-hash tid value did hash] + (-> (bb/allocate (+ base-key-size (bs/size value) 1 codec/did-size hash/prefix-size)) (bb/put-int! c-hash) (bb/put-int! tid) (bb/put-byte-string! value) (bb/put-byte! 0) - (bb/put-byte-string! id) - (bb/put-byte! (bs/size id)) + (bb/put-long! did) (hash/prefix-into-byte-buffer! (hash/prefix hash)) bb/array)) (defn index-entry "Returns an entry of the SearchParamValueResource index build from `c-hash`, - `tid`, `value`, `id` and `hash`." - [c-hash tid value id hash] - [:search-param-value-index (encode-key c-hash tid value id hash) bytes/empty]) + `tid`, `value`, `did` and `hash`." + [c-hash tid value did hash] + [:search-param-value-index (encode-key c-hash tid value did hash) bytes/empty]) diff --git a/modules/db/src/blaze/db/impl/index/search_param_value_resource/impl.clj b/modules/db/src/blaze/db/impl/index/search_param_value_resource/impl.clj deleted file mode 100644 index 1da9690ad..000000000 --- a/modules/db/src/blaze/db/impl/index/search_param_value_resource/impl.clj +++ /dev/null @@ -1,15 +0,0 @@ -(ns blaze.db.impl.index.search-param-value-resource.impl - (:require - [blaze.byte-buffer :as bb] - [blaze.fhir.hash :as hash])) - - -(set! *unchecked-math* :warn-on-boxed) - - -(defn id-size - {:inline - (fn [buf] - `(int (bb/get-byte! ~buf (unchecked-dec-int (unchecked-subtract-int (bb/limit ~buf) hash/prefix-size)))))} - [buf] - (int (bb/get-byte! buf (unchecked-dec-int (unchecked-subtract-int (bb/limit buf) hash/prefix-size))))) diff --git a/modules/db/src/blaze/db/impl/index/system_as_of.clj b/modules/db/src/blaze/db/impl/index/system_as_of.clj index 275e22839..1a6aa48ca 100644 --- a/modules/db/src/blaze/db/impl/index/system_as_of.clj +++ b/modules/db/src/blaze/db/impl/index/system_as_of.clj @@ -7,9 +7,7 @@ [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] [blaze.db.impl.iterators :as i] - [blaze.fhir.hash :as hash]) - (:import - [com.google.common.primitives Longs])) + [blaze.fhir.hash :as hash])) (set! *warn-on-reflection* true) @@ -20,12 +18,12 @@ (+ codec/t-size codec/tid-size)) -(def ^:private ^:const ^long max-key-size - (+ t-tid-size codec/max-id-size)) +(def ^:private ^:const ^long key-size + (+ t-tid-size codec/did-size)) -(def ^:private ^:const ^long value-size - (+ hash/size codec/state-size)) +(def ^:private ^:const ^long max-value-size + (+ hash/size codec/state-size codec/max-id-size)) (defn- key-valid? [^long end-t] @@ -48,57 +46,53 @@ Both byte buffers are changed during decoding and have to be reset accordingly after decoding." [] - (let [ib (byte-array codec/max-id-size)] - (fn - ([] - [(bb/allocate-direct max-key-size) - (bb/allocate-direct value-size)]) - ([kb vb] - (let [t (codec/descending-long (bb/get-long! kb))] - (rh/resource-handle - (bb/get-int! kb) - (let [id-size (bb/remaining kb)] - (bb/copy-into-byte-array! kb ib 0 id-size) - (codec/id ib 0 id-size)) - t vb)))))) + (fn + ([] + [(bb/allocate-direct key-size) + (bb/allocate-direct max-value-size)]) + ([kb vb] + (let [t (codec/descending-long (bb/get-5-byte-long! kb))] + (rh/resource-handle (bb/get-int! kb) (bb/get-long! kb) t vb))))) (defn encode-key - "Encodes the key of the SystemAsOf index from `t`, `tid` and `id`." - [t tid id] - (-> (bb/allocate (unchecked-add-int t-tid-size (bs/size id))) - (bb/put-long! (codec/descending-long ^long t)) + "Encodes the key of the SystemAsOf index from `t`, `tid` and `did`." + [t tid did] + (-> (bb/allocate key-size) + (bb/put-5-byte-long! (codec/descending-long t)) (bb/put-int! tid) - (bb/put-byte-string! id) + (bb/put-long! did) bb/array)) (defn- encode-t-tid [start-t start-tid] (-> (bb/allocate t-tid-size) - (bb/put-long! (codec/descending-long ^long start-t)) + (bb/put-5-byte-long! (codec/descending-long start-t)) (bb/put-int! start-tid) bb/array)) -(defn- start-key [start-t start-tid start-id] +(defn- start-key [start-t start-tid start-did] (cond - start-id - (encode-key start-t start-tid start-id) + start-did + (encode-key start-t start-tid start-did) start-tid (encode-t-tid start-t start-tid) :else - (Longs/toByteArray (codec/descending-long ^long start-t)))) + (-> (bb/allocate codec/t-size) + (bb/put-5-byte-long! (codec/descending-long start-t)) + bb/array))) (defn system-history "Returns a reducible collection of all versions between `start-t` (inclusive), - `start-tid` (optional, inclusive), `start-id` (optional, inclusive) and + `start-tid` (optional, inclusive), `start-did` (optional, inclusive) and `end-t` (inclusive) of all resources. Versions are resource handles." - [saoi start-t start-tid start-id end-t] + [saoi start-t start-tid start-did end-t] (coll/eduction (take-while (key-valid? end-t)) - (i/kvs! saoi (decoder) (bs/from-byte-array (start-key start-t start-tid start-id))))) + (i/kvs! saoi (decoder) (bs/from-byte-array (start-key start-t start-tid start-did))))) diff --git a/modules/db/src/blaze/db/impl/index/system_stats.clj b/modules/db/src/blaze/db/impl/index/system_stats.clj index 2360466fd..36a8ed45b 100644 --- a/modules/db/src/blaze/db/impl/index/system_stats.clj +++ b/modules/db/src/blaze/db/impl/index/system_stats.clj @@ -50,7 +50,7 @@ is used to get near `t`." [iter t] (let [buf (bb/allocate-direct kv-capacity)] - (bb/put-long! buf (codec/descending-long ^long t)) + (bb/put-5-byte-long! buf (codec/descending-long t)) (bb/flip! buf) (kv/seek-buffer! iter buf) (when (kv/valid? iter) @@ -61,7 +61,7 @@ (defn- encode-key [t] (-> (bb/allocate key-size) - (bb/put-long! (codec/descending-long ^long t)) + (bb/put-5-byte-long! (codec/descending-long t)) bb/array)) diff --git a/modules/db/src/blaze/db/impl/index/type_as_of.clj b/modules/db/src/blaze/db/impl/index/type_as_of.clj index ac3621b07..01665ede0 100644 --- a/modules/db/src/blaze/db/impl/index/type_as_of.clj +++ b/modules/db/src/blaze/db/impl/index/type_as_of.clj @@ -18,12 +18,12 @@ (+ codec/tid-size codec/t-size)) -(def ^:private ^:const ^long max-key-size - (+ tid-t-size codec/max-id-size)) +(def ^:private ^:const ^long key-size + (+ tid-t-size codec/did-size)) -(def ^:private ^:const ^long value-size - (+ hash/size codec/state-size)) +(def ^:private ^:const ^long max-value-size + (+ hash/size codec/state-size codec/max-id-size)) (defn- key-valid? [^long tid ^long end-t] @@ -46,47 +46,45 @@ Both byte buffers are changed during decoding and have to be reset accordingly after decoding." [] - (let [ib (byte-array codec/max-id-size)] - (fn - ([] - [(bb/allocate-direct max-key-size) - (bb/allocate-direct value-size)]) - ([kb vb] - (let [tid (bb/get-int! kb) - t (codec/descending-long (bb/get-long! kb))] - (rh/resource-handle - tid - (let [id-size (bb/remaining kb)] - (bb/copy-into-byte-array! kb ib 0 id-size) - (codec/id ib 0 id-size)) - t vb)))))) + (fn + ([] + [(bb/allocate-direct key-size) + (bb/allocate-direct max-value-size)]) + ([kb vb] + (let [tid (bb/get-int! kb) + t (codec/descending-long (bb/get-5-byte-long! kb))] + (rh/resource-handle + tid + (bb/get-long! kb) + t + vb))))) (defn encode-key - "Encodes the key of the TypeAsOf index from `tid`, `t` and `id`." - [tid t id] - (-> (bb/allocate (unchecked-add-int tid-t-size (bs/size id))) + "Encodes the key of the TypeAsOf index from `tid`, `t` and `did`." + [tid t did] + (-> (bb/allocate key-size) (bb/put-int! tid) - (bb/put-long! (codec/descending-long ^long t)) - (bb/put-byte-string! id) + (bb/put-5-byte-long! (codec/descending-long t)) + (bb/put-long! (unchecked-long did)) bb/array)) -(defn- start-key [tid start-t start-id] - (if start-id - (bs/from-byte-array (encode-key tid start-t start-id)) +(defn- start-key [tid start-t start-did] + (if start-did + (bs/from-byte-array (encode-key tid start-t start-did)) (-> (bb/allocate tid-t-size) (bb/put-int! tid) - (bb/put-long! (codec/descending-long ^long start-t)) + (bb/put-5-byte-long! (codec/descending-long start-t)) bb/flip! bs/from-byte-buffer!))) (defn type-history "Returns a reducible collection of all historic resource handles between - `start-t` (inclusive), `start-id` (optional, inclusive) and `end-t` + `start-t` (inclusive), `start-did` (optional, inclusive) and `end-t` (inclusive) of resources with `tid`." - [taoi tid start-t start-id end-t] + [taoi tid start-t start-did end-t] (coll/eduction (take-while (key-valid? tid end-t)) - (i/kvs! taoi (decoder) (start-key tid start-t start-id)))) + (i/kvs! taoi (decoder) (start-key tid start-t start-did)))) diff --git a/modules/db/src/blaze/db/impl/index/type_stats.clj b/modules/db/src/blaze/db/impl/index/type_stats.clj index 4d585b419..628ca3964 100644 --- a/modules/db/src/blaze/db/impl/index/type_stats.clj +++ b/modules/db/src/blaze/db/impl/index/type_stats.clj @@ -53,13 +53,13 @@ [iter tid t] (let [buf (bb/allocate-direct kv-capacity)] (bb/put-int! buf tid) - (bb/put-long! buf (codec/descending-long ^long t)) + (bb/put-5-byte-long! buf (codec/descending-long t)) (bb/flip! buf) (kv/seek-buffer! iter buf) (when (kv/valid? iter) (bb/clear! buf) (kv/key! iter buf) - (when (= ^long tid (bb/get-int! buf)) + (when (= (long tid) (bb/get-int! buf)) (bb/clear! buf) (kv/value! iter buf) (decode-value! buf))))) @@ -68,7 +68,7 @@ (defn- encode-key [tid t] (-> (bb/allocate key-size) (bb/put-int! tid) - (bb/put-long! (codec/descending-long ^long t)) + (bb/put-5-byte-long! (codec/descending-long t)) bb/array)) diff --git a/modules/db/src/blaze/db/impl/search_param.clj b/modules/db/src/blaze/db/impl/search_param.clj index 6f4db9aea..2bcb8bfed 100644 --- a/modules/db/src/blaze/db/impl/search_param.clj +++ b/modules/db/src/blaze/db/impl/search_param.clj @@ -48,29 +48,28 @@ (mapcat (partial p/-resource-handles search-param context tid modifier)) (distinct)) values))) - ([search-param context tid modifier values start-id] + ([search-param context tid modifier values start-did] (if (= 1 (count values)) (p/-resource-handles search-param context tid modifier (first values) - start-id) - (let [start-id (codec/id-string start-id)] - (coll/eduction - (drop-while #(not= start-id (rh/id %))) - (resource-handles search-param context tid modifier values)))))) + start-did) + (coll/eduction + (drop-while #(not= start-did (rh/did %))) + (resource-handles search-param context tid modifier values))))) (defn sorted-resource-handles "Returns a reducible collection of distinct resource handles sorted by `search-param` in `direction`. - Optionally starts at `start-id`" + Optionally starts at `start-did`" ([search-param context tid direction] (p/-sorted-resource-handles search-param context tid direction)) - ([search-param context tid direction start-id] - (p/-sorted-resource-handles search-param context tid direction start-id))) + ([search-param context tid direction start-did] + (p/-sorted-resource-handles search-param context tid direction start-did))) (defn- compartment-keys - "Returns a reducible collection of `[prefix id hash-prefix]` triples." + "Returns a reducible collection of `[prefix did hash-prefix]` triples." [search-param context compartment tid compiled-values] (coll/eduction (mapcat #(p/-compartment-keys search-param context compartment tid %)) @@ -115,19 +114,11 @@ (defn index-entries "Returns reducible collection of index entries of `resource` with `hash` for `search-param` or an anomaly in case of errors." - {:arglists '([search-param linked-compartments hash resource])} - [{:keys [code c-hash] :as search-param} linked-compartments hash resource] - (when-ok [values (p/-index-values search-param stub-resolver resource)] - (let [{:keys [id]} resource - type (name (fhir-spec/fhir-type resource)) - tid (codec/tid type) - id (codec/id-byte-string id) - linked-compartments - (mapv - (fn [[code comp-id]] - [(codec/c-hash code) - (codec/id-byte-string comp-id)]) - linked-compartments)] + {:arglists '([search-param resource-id linked-compartments did hash resource])} + [{:keys [code c-hash] :as search-param} resource-id linked-compartments did hash resource] + (when-ok [values (p/-index-values search-param resource-id stub-resolver resource)] + (let [type (name (fhir-spec/fhir-type resource)) + tid (codec/tid type)] (coll/eduction (mapcat (fn index-entry [[modifier value]] @@ -140,10 +131,10 @@ c-hash tid value - id + did hash))) conj - [(sp-vr/index-entry c-hash tid value id hash) - (r-sp-v/index-entry tid id hash c-hash value)] + [(sp-vr/index-entry c-hash tid value did hash) + (r-sp-v/index-entry tid did hash c-hash value)] linked-compartments)))) values)))) diff --git a/modules/db/src/blaze/db/impl/search_param/all.clj b/modules/db/src/blaze/db/impl/search_param/all.clj index 843b2159e..ac03d8f00 100644 --- a/modules/db/src/blaze/db/impl/search_param/all.clj +++ b/modules/db/src/blaze/db/impl/search_param/all.clj @@ -19,7 +19,7 @@ (-resource-handles [_ context tid _ _] (rao/type-list context tid)) - (-resource-handles [_ context tid _ _ start-id] - (rao/type-list context tid start-id)) + (-resource-handles [_ context tid _ _ start-did] + (rao/type-list context tid start-did)) - (-index-values [_ _ _]))) + (-index-values [_ _ _ _]))) diff --git a/modules/db/src/blaze/db/impl/search_param/chained.clj b/modules/db/src/blaze/db/impl/search_param/chained.clj index 64cc89150..536ea076e 100644 --- a/modules/db/src/blaze/db/impl/search_param/chained.clj +++ b/modules/db/src/blaze/db/impl/search_param/chained.clj @@ -41,11 +41,10 @@ (p/-resource-handles search-param (assoc context :svri svri) ref-tid modifier compiled-value)))) - (-resource-handles [this context tid modifier compiled-value start-id] - (let [start-id (codec/id-string start-id)] - (coll/eduction - (drop-while #(not= start-id (rh/id %))) - (p/-resource-handles this context tid modifier compiled-value)))) + (-resource-handles [this context tid modifier compiled-value start-did] + (coll/eduction + (drop-while #(not= start-did (rh/did %))) + (p/-resource-handles this context tid modifier compiled-value))) (-matches? [_ context resource-handle modifier compiled-values] (some diff --git a/modules/db/src/blaze/db/impl/search_param/composite/common.clj b/modules/db/src/blaze/db/impl/search_param/composite/common.clj index 1f2f4cefc..b45ae7bf4 100644 --- a/modules/db/src/blaze/db/impl/search_param/composite/common.clj +++ b/modules/db/src/blaze/db/impl/search_param/composite/common.clj @@ -22,25 +22,25 @@ (defn- component-index-values - [resolver main-value {:keys [expression search-param]}] + [resource-id resolver main-value {:keys [expression search-param]}] (when-ok [values (fhir-path/eval resolver expression main-value)] (coll/eduction (comp - (p/-index-value-compiler search-param) + (p/-index-value-compiler search-param resource-id) (filter (fn [[modifier]] (nil? modifier))) (map (fn [[_ value]] value))) values))) -(defn index-values [resolver c1 c2] +(defn index-values [resource-id resolver c1 c2] (comp (map (fn [main-value] - (when-ok [c1-values (component-index-values resolver main-value c1)] + (when-ok [c1-values (component-index-values resource-id resolver main-value c1)] (.reduce ^IReduceInit c1-values (fn [res v1] - (if-ok [c2-values (component-index-values resolver main-value c2)] + (if-ok [c2-values (component-index-values resource-id resolver main-value c2)] (.reduce ^IReduceInit c2-values (fn [res v2] diff --git a/modules/db/src/blaze/db/impl/search_param/composite/token_quantity.clj b/modules/db/src/blaze/db/impl/search_param/composite/token_quantity.clj index 8a1ba69a1..7e781ba77 100644 --- a/modules/db/src/blaze/db/impl/search_param/composite/token_quantity.clj +++ b/modules/db/src/blaze/db/impl/search_param/composite/token_quantity.clj @@ -35,7 +35,7 @@ (defrecord SearchParamCompositeTokenQuantity [name url type base code c-hash main-expression c1 c2] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (let [[v1 v2] (cc/split-value value) token-value (cc/compile-component-value c1 v1)] (if-ok [quantity-value (cc/compile-component-value c2 v2)] @@ -56,15 +56,15 @@ (u/resource-handle-mapper context tid) (spq/resource-keys! context c-hash tid prefix-length value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (spq/resource-keys! context c-hash tid prefix-length value start-id))) + (spq/resource-keys! context c-hash tid prefix-length value start-did))) (-matches? [_ context resource-handle _ values] (some? (some #(spq/matches? context c-hash resource-handle prefix-length %) values))) - (-index-values [_ resolver resource] + (-index-values [_ resource-id resolver resource] (when-ok [values (fhir-path/eval resolver main-expression resource)] - (coll/eduction (cc/index-values resolver c1 c2) values)))) + (coll/eduction (cc/index-values resource-id resolver c1 c2) values)))) diff --git a/modules/db/src/blaze/db/impl/search_param/composite/token_token.clj b/modules/db/src/blaze/db/impl/search_param/composite/token_token.clj index 8c3900c2e..a38161f0f 100644 --- a/modules/db/src/blaze/db/impl/search_param/composite/token_token.clj +++ b/modules/db/src/blaze/db/impl/search_param/composite/token_token.clj @@ -13,7 +13,7 @@ (defrecord SearchParamCompositeTokenToken [name url type base code c-hash main-expression c1 c2] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (let [[v1 v2] (cc/split-value value) v1 (cc/compile-component-value c1 v1) v2 (cc/compile-component-value c1 v2)] @@ -24,14 +24,14 @@ (u/resource-handle-mapper context tid) (spt/resource-keys! context c-hash tid value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (spt/resource-keys! context c-hash tid value start-id))) + (spt/resource-keys! context c-hash tid value start-did))) (-matches? [_ context resource-handle _ values] (some? (some #(spt/matches? context c-hash resource-handle %) values))) - (-index-values [_ resolver resource] + (-index-values [_ resource-id resolver resource] (when-ok [values (fhir-path/eval resolver main-expression resource)] - (coll/eduction (cc/index-values resolver c1 c2) values)))) + (coll/eduction (cc/index-values resource-id resolver c1 c2) values)))) diff --git a/modules/db/src/blaze/db/impl/search_param/date.clj b/modules/db/src/blaze/db/impl/search_param/date.clj index 4a634f062..1f49068bb 100644 --- a/modules/db/src/blaze/db/impl/search_param/date.clj +++ b/modules/db/src/blaze/db/impl/search_param/date.clj @@ -83,14 +83,14 @@ (eq-overlaps? value q-lb a-lb)))) -(defn- all-keys! [{:keys [svri] :as context} c-hash tid start-id] - (sp-vr/all-keys! svri c-hash tid (resource-value! context c-hash tid start-id) - start-id)) +(defn- all-keys! [{:keys [svri] :as context} c-hash tid start-did] + (sp-vr/all-keys! svri c-hash tid (resource-value! context c-hash tid start-did) + start-did)) -(defn- all-keys-prev! [{:keys [svri] :as context} c-hash tid start-id] +(defn- all-keys-prev! [{:keys [svri] :as context} c-hash tid start-did] (sp-vr/all-keys-prev! svri c-hash tid - (resource-value! context c-hash tid start-id) start-id)) + (resource-value! context c-hash tid start-did) start-did)) (def ^:private drop-value @@ -98,19 +98,19 @@ (defn- eq-keys! - "Returns a reducible collection of `[id hash-prefix]` triples of all + "Returns a reducible collection of `[did hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by - `lower-bound` and `upper-bound` starting at `start-id` (optional)." + `lower-bound` and `upper-bound` starting at `start-did` (optional)." ([{:keys [svri]} c-hash tid lower-bound upper-bound] (coll/eduction (comp (eq-filter lower-bound upper-bound) drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid lower-bound upper-bound start-id] + ([context c-hash tid lower-bound upper-bound start-did] (coll/eduction (comp (eq-filter lower-bound upper-bound) drop-value) - (all-keys! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did)))) (defn- ge-overlaps? [lower-bound value] @@ -125,19 +125,19 @@ (defn- ge-keys! - "Returns a reducible collection of `[id hash-prefix]` triples of all + "Returns a reducible collection of `[did hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by - `lower-bound` and an infinite upper bound starting at `start-id` (optional)." + `lower-bound` and an infinite upper bound starting at `start-did` (optional)." ([{:keys [svri]} c-hash tid lower-bound] (coll/eduction (comp (ge-filter lower-bound) drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid lower-bound start-id] + ([context c-hash tid lower-bound start-did] (coll/eduction (comp (ge-filter lower-bound) drop-value) - (all-keys! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did)))) (defn- gt-overlaps? [lower-bound value] @@ -152,7 +152,7 @@ (defn- gt-keys! - "Returns a reducible collection of `[id hash-prefix]` triples of all + "Returns a reducible collection of `[did hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by `lower-bound` and an infinite upper bound starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid lower-bound] @@ -160,11 +160,11 @@ (comp (gt-filter lower-bound) drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid lower-bound start-id] + ([context c-hash tid lower-bound start-did] (coll/eduction (comp (gt-filter lower-bound) drop-value) - (all-keys! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did)))) (defn- le-overlaps? [value upper-bound] @@ -179,19 +179,19 @@ (defn- le-keys! - "Returns a reducible collection of `[id hash-prefix]` triples of all + "Returns a reducible collection of `[did hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by - an infinite lower bound and `upper-bound` starting at `start-id` (optional)." + an infinite lower bound and `upper-bound` starting at `start-did` (optional)." ([{:keys [svri]} c-hash tid upper-bound] (coll/eduction (comp (le-filter upper-bound) drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid upper-bound start-id] + ([context c-hash tid upper-bound start-did] (coll/eduction (comp (le-filter upper-bound) drop-value) - (all-keys! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did)))) (defn- lt-overlaps? [value upper-bound] @@ -206,7 +206,7 @@ (defn- lt-keys! - "Returns a reducible collection of `[id hash-prefix]` triples of all + "Returns a reducible collection of `[did hash-prefix]` triples of all keys with overlapping date/time intervals with the interval specified by an infinite lower bound and `upper-bound` starting at `start-id` (optional)." ([{:keys [svri]} c-hash tid upper-bound] @@ -214,11 +214,11 @@ (comp (lt-filter upper-bound) drop-value) (sp-vr/all-keys! svri c-hash tid))) - ([context c-hash tid upper-bound start-id] + ([context c-hash tid upper-bound start-did] (coll/eduction (comp (lt-filter upper-bound) drop-value) - (all-keys! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did)))) (defn- invalid-date-time-value-msg [code value] @@ -233,13 +233,13 @@ :gt (gt-keys! context c-hash tid upper-bound) :le (le-keys! context c-hash tid upper-bound) :lt (lt-keys! context c-hash tid lower-bound))) - ([context c-hash tid {:keys [op lower-bound upper-bound]} start-id] + ([context c-hash tid {:keys [op lower-bound upper-bound]} start-did] (case op - :eq (eq-keys! context c-hash tid lower-bound upper-bound start-id) - :ge (ge-keys! context c-hash tid lower-bound start-id) - :gt (gt-keys! context c-hash tid upper-bound start-id) - :le (le-keys! context c-hash tid upper-bound start-id) - :lt (lt-keys! context c-hash tid lower-bound start-id)))) + :eq (eq-keys! context c-hash tid lower-bound upper-bound start-did) + :ge (ge-keys! context c-hash tid lower-bound start-did) + :gt (gt-keys! context c-hash tid upper-bound start-did) + :le (le-keys! context c-hash tid upper-bound start-did) + :lt (lt-keys! context c-hash tid lower-bound start-did)))) (defn- matches? @@ -256,7 +256,7 @@ (defrecord SearchParamDate [name url type base code c-hash expression] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (let [[op value] (u/separate-op value)] (if-ok [date-time-value (system/parse-date-time value)] (case op @@ -284,10 +284,10 @@ (u/resource-handle-mapper context tid) (resource-keys! context c-hash tid value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (resource-keys! context c-hash tid value start-id))) + (resource-keys! context c-hash tid value start-did))) (-sorted-resource-handles [_ context tid direction] (coll/eduction @@ -297,22 +297,22 @@ (sp-vr/all-keys! (:svri context) c-hash tid) (sp-vr/all-keys-prev! (:svri context) c-hash tid)))) - (-sorted-resource-handles [_ context tid direction start-id] + (-sorted-resource-handles [_ context tid direction start-did] (coll/eduction (comp drop-value (u/resource-handle-mapper context tid)) (if (= :asc direction) - (all-keys! context c-hash tid start-id) - (all-keys-prev! context c-hash tid start-id)))) + (all-keys! context c-hash tid start-did) + (all-keys-prev! context c-hash tid start-did)))) (-matches? [_ context resource-handle _ values] (some? (some #(matches? context c-hash resource-handle %) values))) - (-index-values [search-param resolver resource] + (-index-values [search-param resource-id resolver resource] (when-ok [values (fhir-path/eval resolver expression resource)] - (coll/eduction (p/-index-value-compiler search-param) values))) + (coll/eduction (p/-index-value-compiler search-param resource-id) values))) - (-index-value-compiler [_] + (-index-value-compiler [_ _resource-id] (mapcat (partial index-entries url)))) diff --git a/modules/db/src/blaze/db/impl/search_param/has.clj b/modules/db/src/blaze/db/impl/search_param/has.clj index da3ebf52f..e525ca121 100644 --- a/modules/db/src/blaze/db/impl/search_param/has.clj +++ b/modules/db/src/blaze/db/impl/search_param/has.clj @@ -41,26 +41,24 @@ [] (u/reference-resource-handle-mapper context) (let [tid-byte-string (codec/tid-byte-string tid) - {:keys [tid id hash]} resource-handle] - (r-sp-v/prefix-keys! rsvi tid (codec/id-byte-string id) hash c-hash - tid-byte-string)))) + {:keys [tid did hash]} resource-handle] + (r-sp-v/prefix-keys! rsvi tid did hash c-hash tid-byte-string)))) -(def ^:private id-cmp +(def ^:private did-cmp (reify Comparator (compare [_ a b] - (let [^String id-a (rh/id a)] - (.compareTo id-a (rh/id b)))))) + (Long/compare (rh/did a) (rh/did b))))) -(defn- drop-lesser-ids [start-id] - (drop-while #(neg? (let [^String id (rh/id %)] (.compareTo id start-id))))) +(defn- drop-lesser-ids [^long start-did] + (drop-while #(< (rh/did %) start-did))) (defn- resource-handles* [context tid [search-param chain-search-param join-tid value]] (into - (sorted-set-by id-cmp) + (sorted-set-by did-cmp) (mapcat #(resolve-resource-handles context chain-search-param tid %)) (p/-resource-handles search-param context join-tid nil value))) @@ -102,15 +100,13 @@ (-resource-handles [_ context tid _ value] (resource-handles context tid value)) - (-resource-handles [_ context tid _ value start-id] - (coll/eduction - (drop-lesser-ids (codec/id-string start-id)) - (resource-handles context tid value))) + (-resource-handles [_ context tid _ value start-did] + (coll/eduction (drop-lesser-ids start-did) (resource-handles context tid value))) (-matches? [_ context resource-handle _ values] (some? (some #(matches? context resource-handle %) values))) - (-index-values [_ _ _] + (-index-values [_ _ _ _] [])) diff --git a/modules/db/src/blaze/db/impl/search_param/list.clj b/modules/db/src/blaze/db/impl/search_param/list.clj index 4be150c64..159476823 100644 --- a/modules/db/src/blaze/db/impl/search_param/list.clj +++ b/modules/db/src/blaze/db/impl/search_param/list.clj @@ -13,51 +13,52 @@ (set! *warn-on-reflection* true) -(def ^:private list-tid (codec/tid "List")) -(def ^:private item-c-hash (codec/c-hash "item")) +(def ^:private ^:const list-tid (codec/tid "List")) +(def ^:private ^:const item-c-hash (codec/c-hash "item")) + + +(defn- list-resource-handle [{:keys [resource-id resource-handle]} list-id] + (when-let [list-did (resource-id list-tid list-id)] + (u/non-deleted-resource-handle resource-handle list-tid list-did))) (defn- referenced-resource-handles! "Returns a reducible collection of resource handles of type `tid` that are - referenced by the list with `list-id` and `list-hash`, starting with - `start-id` (optional). + referenced by the list with `list-did` and `list-hash`, starting with + `start-did` (optional). Changes the state of `rsvi`. Consuming the collection requires exclusive access to `rsvi`. Doesn't close `rsvi`." {:arglists - '([context list-id list-hash tid] - [context list-id list-hash tid start-id])} - ([{:keys [rsvi] :as context} list-id list-hash tid] + '([context list-did list-hash tid] + [context list-did list-hash tid start-did])} + ([{:keys [rsvi] :as context} list-did list-hash tid] (coll/eduction (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi list-tid list-id list-hash item-c-hash + (r-sp-v/prefix-keys! rsvi list-tid list-did list-hash item-c-hash (codec/tid-byte-string tid)))) - ([{:keys [rsvi] :as context} list-id list-hash tid start-id] + ([{:keys [rsvi] :as context} list-did list-hash tid start-did] (coll/eduction (u/reference-resource-handle-mapper context) - (r-sp-v/prefix-keys! rsvi list-tid list-id list-hash item-c-hash + (r-sp-v/prefix-keys! rsvi list-tid list-did list-hash item-c-hash (codec/tid-byte-string tid) - (codec/tid-id tid start-id))))) + (codec/tid-did tid start-did))))) (defrecord SearchParamList [name type code] p/SearchParam - (-compile-value [_ _ value] - (codec/id-byte-string value)) + (-compile-value [_ _modifier list-id] + list-id) (-resource-handles [_ context tid _ list-id] - (let [{:keys [resource-handle]} context] - (when-let [{:keys [hash]} (u/non-deleted-resource-handle - resource-handle list-tid list-id)] - (referenced-resource-handles! context list-id hash tid)))) - - (-resource-handles [_ context tid _ list-id start-id] - (let [{:keys [resource-handle]} context] - (when-let [{:keys [hash]} (u/non-deleted-resource-handle - resource-handle list-tid list-id)] - (referenced-resource-handles! context list-id hash tid start-id)))) - - (-index-values [_ _ _] + (when-let [{:keys [did hash]} (list-resource-handle context list-id)] + (referenced-resource-handles! context did hash tid))) + + (-resource-handles [_ context tid _ list-id start-did] + (when-let [{:keys [did hash]} (list-resource-handle context list-id)] + (referenced-resource-handles! context did hash tid start-did))) + + (-index-values [_ _ _ _] [])) diff --git a/modules/db/src/blaze/db/impl/search_param/number.clj b/modules/db/src/blaze/db/impl/search_param/number.clj index fc9072dd9..23e0905b9 100644 --- a/modules/db/src/blaze/db/impl/search_param/number.clj +++ b/modules/db/src/blaze/db/impl/search_param/number.clj @@ -42,7 +42,7 @@ (defrecord SearchParamQuantity [name url type base code c-hash expression] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (let [[op value] (u/separate-op value)] (if-ok [decimal-value (system/parse-decimal value)] (case op @@ -63,19 +63,19 @@ (u/resource-handle-mapper context tid) (spq/resource-keys! context c-hash tid 0 value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (spq/resource-keys! context c-hash tid 0 value start-id))) + (spq/resource-keys! context c-hash tid 0 value start-did))) (-matches? [_ context resource-handle _ values] (some? (some #(spq/matches? context c-hash resource-handle 0 %) values))) - (-index-values [search-param resolver resource] + (-index-values [search-param resource-id resolver resource] (when-ok [values (fhir-path/eval resolver expression resource)] - (coll/eduction (p/-index-value-compiler search-param) values))) + (coll/eduction (p/-index-value-compiler search-param resource-id) values))) - (-index-value-compiler [_] + (-index-value-compiler [_ _resource-id] (mapcat (partial index-entries url)))) diff --git a/modules/db/src/blaze/db/impl/search_param/quantity.clj b/modules/db/src/blaze/db/impl/search_param/quantity.clj index d7da54bd7..d13d44b7c 100644 --- a/modules/db/src/blaze/db/impl/search_param/quantity.clj +++ b/modules/db/src/blaze/db/impl/search_param/quantity.clj @@ -59,7 +59,7 @@ (defn- resource-value! - "Returns the value of the resource with `tid` and `id` according to the + "Returns the value of the resource with `tid` and `did` according to the search parameter with `c-hash` starting with `prefix`. The `prefix` is important, because resources have more than one index entry @@ -69,16 +69,16 @@ Changes the state of `context`. Calling this function requires exclusive access to `context`." - {:arglists '([context c-hash tid id prefix])} - [{:keys [rsvi resource-handle]} c-hash tid id prefix] - (let [handle (resource-handle tid id)] + {:arglists '([context c-hash tid did prefix])} + [{:keys [rsvi resource-handle]} c-hash tid did prefix] + (when-let [handle (resource-handle tid did)] (r-sp-v/next-value! rsvi handle c-hash prefix prefix))) -(defn- id-start-key! [context c-hash tid prefix start-id] - (let [start-value (resource-value! context c-hash tid start-id prefix)] +(defn- did-start-key! [context c-hash tid prefix start-did] + (let [start-value (resource-value! context c-hash tid start-did prefix)] (assert start-value) - (sp-vr/encode-seek-key c-hash tid start-value start-id))) + (sp-vr/encode-seek-key c-hash tid start-value start-did))) (defn- take-while-less-equal [c-hash tid value] @@ -91,8 +91,8 @@ (defn- eq-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values between - `lower-bound` and `upper-bound` starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values between + `lower-bound` and `upper-bound` starting at `start-did` (optional). The `prefix` is a fix prefix of `value` which all found values have to have. @@ -105,18 +105,18 @@ drop-value) (sp-vr/keys! svri (sp-vr/encode-seek-key c-hash tid lower-bound)))) ([{:keys [svri] :as context} c-hash tid lower-bound-prefix upper-bound - start-id] + start-did] (coll/eduction (comp (take-while-less-equal c-hash tid upper-bound) drop-value) - (sp-vr/keys! svri (id-start-key! context c-hash tid lower-bound-prefix - start-id))))) + (sp-vr/keys! svri (did-start-key! context c-hash tid lower-bound-prefix + start-did))))) (defn- gt-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values greater - than `value` starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values + greater than `value` starting at `start-did` (optional). The `prefix` is a fix prefix of `value` which all found values have to have. @@ -124,15 +124,15 @@ access to `iter`. Doesn't close `iter`." ([{:keys [svri]} c-hash tid prefix value] (sp-vr/prefix-keys'! svri c-hash tid prefix value)) - ([{:keys [svri] :as context} c-hash tid prefix _value start-id] - (let [start-value (resource-value! context c-hash tid start-id prefix)] + ([{:keys [svri] :as context} c-hash tid prefix _value start-did] + (let [start-value (resource-value! context c-hash tid start-did prefix)] (assert start-value) - (sp-vr/prefix-keys! svri c-hash tid prefix start-value start-id)))) + (sp-vr/prefix-keys! svri c-hash tid prefix start-value start-did)))) (defn- lt-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values less - than `value` starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values less + than `value` starting at `start-did` (optional). The `prefix` is a fix prefix of `value` which all found values have to have. @@ -140,15 +140,15 @@ access to `iter`. Doesn't close `iter`." ([{:keys [svri]} c-hash tid prefix value] (sp-vr/prefix-keys-prev'! svri c-hash tid prefix value)) - ([{:keys [svri] :as context} c-hash tid prefix _value start-id] - (let [start-value (resource-value! context c-hash tid start-id prefix)] + ([{:keys [svri] :as context} c-hash tid prefix _value start-did] + (let [start-value (resource-value! context c-hash tid start-did prefix)] (assert start-value) - (sp-vr/prefix-keys-prev! svri c-hash tid prefix start-value start-id)))) + (sp-vr/prefix-keys-prev! svri c-hash tid prefix start-value start-did)))) (defn- ge-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values greater - or equal `value` starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values greater + or equal `value` starting at `start-did` (optional). The `prefix` is a fix prefix of `value` which all found values have to have. @@ -156,15 +156,15 @@ access to `iter`. Doesn't close `iter`." ([{:keys [svri]} c-hash tid prefix value] (sp-vr/prefix-keys! svri c-hash tid prefix value)) - ([{:keys [svri] :as context} c-hash tid prefix _value start-id] - (let [start-value (resource-value! context c-hash tid start-id prefix)] + ([{:keys [svri] :as context} c-hash tid prefix _value start-did] + (let [start-value (resource-value! context c-hash tid start-did prefix)] (assert start-value) - (sp-vr/prefix-keys! svri c-hash tid prefix start-value start-id)))) + (sp-vr/prefix-keys! svri c-hash tid prefix start-value start-did)))) (defn- le-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values less - or equal `value` starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values less + or equal `value` starting at `start-did` (optional). The `prefix` is a fix prefix of `value` which all found values have to have. @@ -172,15 +172,15 @@ access to `iter`. Doesn't close `iter`." ([{:keys [svri]} c-hash tid prefix value] (sp-vr/prefix-keys-prev! svri c-hash tid prefix value)) - ([{:keys [svri] :as context} c-hash tid prefix _value start-id] - (let [start-value (resource-value! context c-hash tid start-id prefix)] + ([{:keys [svri] :as context} c-hash tid prefix _value start-did] + (let [start-value (resource-value! context c-hash tid start-did prefix)] (assert start-value) - (sp-vr/prefix-keys-prev! svri c-hash tid prefix start-value start-id)))) + (sp-vr/prefix-keys-prev! svri c-hash tid prefix start-value start-did)))) (defn resource-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples of values - according to `op` and values starting at `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples of values + according to `op` and values starting at `start-did` (optional). The `prefix-length` is the length of the fix prefix that all found values have to have. @@ -189,7 +189,7 @@ access to `context`." {:arglists '([context c-hash tid prefix-length value] - [context c-hash tid prefix-length value start-id])} + [context c-hash tid prefix-length value start-did])} ([context c-hash tid prefix-length {:keys [op lower-bound exact-value upper-bound]}] (case op @@ -204,18 +204,18 @@ exact-value))) ([context c-hash tid prefix-length {:keys [op lower-bound exact-value upper-bound]} - start-id] + start-did] (case op :eq (eq-keys! context c-hash tid (bs/subs lower-bound 0 prefix-length) - upper-bound start-id) + upper-bound start-did) :gt (gt-keys! context c-hash tid (bs/subs exact-value 0 prefix-length) - exact-value start-id) + exact-value start-did) :lt (lt-keys! context c-hash tid (bs/subs exact-value 0 prefix-length) - exact-value start-id) + exact-value start-did) :ge (ge-keys! context c-hash tid (bs/subs exact-value 0 prefix-length) - exact-value start-id) + exact-value start-did) :le (le-keys! context c-hash tid (bs/subs exact-value 0 prefix-length) - exact-value start-id)))) + exact-value start-did)))) (defn- take-while-compartment-less-equal [compartment c-hash tid value] @@ -283,7 +283,7 @@ (defrecord SearchParamQuantity [name url type base code c-hash expression] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (let [[op value-and-unit] (u/separate-op value) [value unit] (str/split value-and-unit #"\s*\|\s*" 2)] (if-ok [decimal-value (system/parse-decimal value)] @@ -305,10 +305,10 @@ (u/resource-handle-mapper context tid) (resource-keys! context c-hash tid codec/v-hash-size value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (resource-keys! context c-hash tid codec/v-hash-size value start-id))) + (resource-keys! context c-hash tid codec/v-hash-size value start-did))) (-compartment-keys [_ context compartment tid value] (compartment-keys context compartment c-hash tid value)) @@ -317,11 +317,11 @@ (some? (some #(matches? context c-hash resource-handle codec/v-hash-size %) values))) - (-index-values [search-param resolver resource] + (-index-values [search-param resource-id resolver resource] (when-ok [values (fhir-path/eval resolver expression resource)] - (coll/eduction (p/-index-value-compiler search-param) values))) + (coll/eduction (p/-index-value-compiler search-param resource-id) values))) - (-index-value-compiler [_] + (-index-value-compiler [_ _resource-id] (mapcat (partial index-entries url)))) diff --git a/modules/db/src/blaze/db/impl/search_param/string.clj b/modules/db/src/blaze/db/impl/search_param/string.clj index 64f8e2b88..e340eb44b 100644 --- a/modules/db/src/blaze/db/impl/search_param/string.clj +++ b/modules/db/src/blaze/db/impl/search_param/string.clj @@ -84,18 +84,19 @@ (defn- resource-keys! - "Returns a reducible collection of `[id hash-prefix]` tuples starting at - `start-id` (optional). + "Returns a reducible collection of `[did hash-prefix]` tuples starting at + `start-did` (optional). Changes the state of `context`. Calling this function requires exclusive access to `context`." - {:arglists '([context c-hash tid value] [context c-hash tid value start-id])} + {:arglists '([context c-hash tid value] + [context c-hash tid value start-did])} ([{:keys [svri]} c-hash tid value] (sp-vr/prefix-keys! svri c-hash tid value value)) - ([{:keys [svri] :as context} c-hash tid _value start-id] - (let [start-value (resource-value! context c-hash tid start-id)] + ([{:keys [svri] :as context} c-hash tid _value start-did] + (let [start-value (resource-value! context c-hash tid start-did)] (assert start-value) - (sp-vr/prefix-keys! svri c-hash tid start-value start-value start-id)))) + (sp-vr/prefix-keys! svri c-hash tid start-value start-value start-did)))) (defn- matches? [{:keys [rsvi]} c-hash resource-handle value] @@ -104,7 +105,7 @@ (defrecord SearchParamString [name url type base code c-hash expression] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (codec/string (normalize-string value))) (-resource-handles [_ context tid _ value] @@ -112,10 +113,10 @@ (u/resource-handle-mapper context tid) (resource-keys! context c-hash tid value))) - (-resource-handles [_ context tid _ value start-id] + (-resource-handles [_ context tid _ value start-did] (coll/eduction (u/resource-handle-mapper context tid) - (resource-keys! context c-hash tid value start-id))) + (resource-keys! context c-hash tid value start-did))) (-compartment-keys [_ context compartment tid value] (c-sp-vr/prefix-keys! (:csvri context) compartment c-hash tid value)) @@ -123,11 +124,11 @@ (-matches? [_ context resource-handle _ values] (some? (some #(matches? context c-hash resource-handle %) values))) - (-index-values [search-param resolver resource] + (-index-values [search-param resource-id resolver resource] (when-ok [values (fhir-path/eval resolver expression resource)] - (coll/eduction (p/-index-value-compiler search-param) values))) + (coll/eduction (p/-index-value-compiler search-param resource-id) values))) - (-index-value-compiler [_] + (-index-value-compiler [_ _resource-id] (mapcat (partial index-entries url)))) diff --git a/modules/db/src/blaze/db/impl/search_param/token.clj b/modules/db/src/blaze/db/impl/search_param/token.clj index d7def7235..6ca7fd586 100644 --- a/modules/db/src/blaze/db/impl/search_param/token.clj +++ b/modules/db/src/blaze/db/impl/search_param/token.clj @@ -20,42 +20,42 @@ (defmulti index-entries "Returns index entries for `value` from a resource." - {:arglists '([url value])} - (fn [_ value] (fhir-spec/fhir-type value))) + {:arglists '([resolve-id url value])} + (fn [_ _ value] (fhir-spec/fhir-type value))) (defmethod index-entries :fhir/id - [_ id] + [_ _ id] (when-let [value (type/value id)] [[nil (codec/v-hash value)]])) (defmethod index-entries :fhir/string - [_ s] + [_ _ s] (when-let [value (type/value s)] [[nil (codec/v-hash value)]])) (defmethod index-entries :fhir/uri - [_ uri] + [_ _ uri] (when-let [value (type/value uri)] [[nil (codec/v-hash value)]])) (defmethod index-entries :fhir/boolean - [_ boolean] + [_ _ boolean] (when-some [value (type/value boolean)] [[nil (codec/v-hash (str value))]])) (defmethod index-entries :fhir/canonical - [_ uri] + [_ _ uri] (when-let [value (type/value uri)] [[nil (codec/v-hash value)]])) (defmethod index-entries :fhir/code - [_ code] + [_ _ code] ;; TODO: system (when-let [value (type/value code)] [[nil (codec/v-hash value)]])) @@ -76,12 +76,12 @@ (defmethod index-entries :fhir/Coding - [_ coding] + [_ _ coding] (token-coding-entries coding)) (defmethod index-entries :fhir/CodeableConcept - [_ {:keys [coding]}] + [_ _ {:keys [coding]}] (coll/eduction (mapcat token-coding-entries) coding)) @@ -100,39 +100,40 @@ (defmethod index-entries :fhir/Identifier - [_ identifier] + [_ _ identifier] (identifier-entries nil identifier)) -(defn- literal-reference-entries [reference] +(defn- literal-reference-entries [resolve-id reference] (when-let [value (type/value reference)] (if-let [[type id] (u/split-literal-ref value)] - [[nil (codec/v-hash id)] - [nil (codec/v-hash (str type "/" id))] - [nil (codec/tid-id (codec/tid type) - (codec/id-byte-string id))]] + (let [tid (codec/tid type) + did (resolve-id tid id)] + (cond-> [[nil (codec/v-hash id)] + [nil (codec/v-hash (str type "/" id))]] + did (conj [nil (codec/tid-did tid did)]))) [[nil (codec/v-hash value)]]))) (defmethod index-entries :fhir/Reference - [_ {:keys [reference identifier]}] + [resolve-id _ {:keys [reference identifier]}] (coll/eduction cat (cond-> [] reference - (conj (literal-reference-entries reference)) + (conj (literal-reference-entries resolve-id reference)) identifier (conj (identifier-entries "identifier" identifier))))) (defmethod index-entries :fhir/ContactPoint - [_ {:keys [value]}] + [_ _ {:keys [value]}] (when-let [value (type/value value)] [[nil (codec/v-hash value)]])) (defmethod index-entries :default - [url value] + [_ url value] (log/warn (u/format-skip-indexing-msg value url "token"))) @@ -143,15 +144,15 @@ (defn resource-keys! - "Returns a reducible collection of [id hash-prefix] tuples starting at - `start-id` (optional). + "Returns a reducible collection of [did hash-prefix] tuples starting at + `start-did` (optional). Changes the state of `iter`. Consuming the collection requires exclusive access to `iter`. Doesn't close `iter`." ([{:keys [svri]} c-hash tid value] (sp-vr/prefix-keys! svri c-hash tid value value)) - ([{:keys [svri]} c-hash tid value start-id] - (sp-vr/prefix-keys! svri c-hash tid value value start-id))) + ([{:keys [svri]} c-hash tid value start-did] + (sp-vr/prefix-keys! svri c-hash tid value value start-did))) (defn matches? [{:keys [rsvi]} c-hash resource-handle value] @@ -160,7 +161,7 @@ (defrecord SearchParamToken [name url type base code target c-hash expression] p/SearchParam - (-compile-value [_ _ value] + (-compile-value [_ _modifier value] (codec/v-hash value)) (-resource-handles [_ context tid modifier value] @@ -169,11 +170,11 @@ (resource-keys! context (c-hash-w-modifier c-hash code modifier) tid value))) - (-resource-handles [_ context tid modifier value start-id] + (-resource-handles [_ context tid modifier value start-did] (coll/eduction (u/resource-handle-mapper context tid) (resource-keys! context (c-hash-w-modifier c-hash code modifier) tid value - start-id))) + start-did))) (-compartment-keys [_ context compartment tid value] (c-sp-vr/prefix-keys! (:csvri context) compartment c-hash tid value)) @@ -192,12 +193,12 @@ (some-> (u/split-literal-ref reference) (coll/nth 1)))))) values))) - (-index-values [search-param resolver resource] + (-index-values [search-param resource-id resolver resource] (when-ok [values (fhir-path/eval resolver expression resource)] - (coll/eduction (p/-index-value-compiler search-param) values))) + (coll/eduction (p/-index-value-compiler search-param resource-id) values))) - (-index-value-compiler [_] - (mapcat (partial index-entries url)))) + (-index-value-compiler [_ resource-id] + (mapcat (partial index-entries resource-id url)))) (defn- fix-expr diff --git a/modules/db/src/blaze/db/impl/search_param/util.clj b/modules/db/src/blaze/db/impl/search_param/util.clj index 9ed952f0c..4539bf3ae 100644 --- a/modules/db/src/blaze/db/impl/search_param/util.clj +++ b/modules/db/src/blaze/db/impl/search_param/util.clj @@ -31,13 +31,13 @@ (str value) (fhir-spec/fhir-type value) url type)) -(def ^:private by-id-grouper - "Transducer which groups `[id hash-prefix]` tuples by `id`." - (partition-by (fn [[id]] id))) +(def ^:private by-did-grouper + "Transducer which groups `[did hash-prefix]` tuples by `did`." + (partition-by (fn [[did]] did))) -(defn non-deleted-resource-handle [resource-handle tid id] - (when-let [handle (resource-handle tid id)] +(defn non-deleted-resource-handle [resource-handle tid did] + (when-let [handle (resource-handle tid did)] (when-not (rh/deleted? handle) handle))) @@ -61,7 +61,7 @@ prefix." [context tid] (comp - by-id-grouper + by-did-grouper (resource-handle-mapper* context tid))) @@ -78,12 +78,10 @@ [{:keys [resource-handle]}] (comp ;; there has to be at least some bytes for the id - (filter #(< codec/tid-size (bs/size %))) + (filter #(= (+ codec/tid-size codec/did-size) (bs/size %))) (map bs/as-read-only-byte-buffer) - (keep - #(let [tid (bb/get-int! %) - id (bs/from-byte-buffer! %)] - (non-deleted-resource-handle resource-handle tid id))))) + (keep #(non-deleted-resource-handle resource-handle (bb/get-int! %) + (bb/get-long! %))))) (defn split-literal-ref [^String s] diff --git a/modules/db/src/blaze/db/node.clj b/modules/db/src/blaze/db/node.clj index acc335abe..8bb46fd70 100644 --- a/modules/db/src/blaze/db/node.clj +++ b/modules/db/src/blaze/db/node.clj @@ -220,13 +220,13 @@ (log/trace "index transaction with t =" t "and" (count tx-cmds) "command(s)") (prom/observe! transaction-sizes (count tx-cmds)) (let [timer (prom/timer duration-seconds "index-resources") - future (resource-indexer/index-resources resource-indexer tx-data) result (index-tx (np/-db node) tx-data)] (if (ba/anomaly? result) (commit-error! node t result) - (do - (store-tx-entries! kv-store result) - (wait-for-resources future timer) + (let [[entries tx-cmds] result] + (store-tx-entries! kv-store entries) + (let [future (resource-indexer/index-resources resource-indexer (assoc tx-data :tx-cmds tx-cmds))] + (wait-for-resources future timer)) (commit-success! node t instant))))) @@ -294,9 +294,10 @@ (when-ok [clauses (resolve-search-params search-param-registry type clauses lenient?)] (if (empty? clauses) - (batch-db/->EmptyCompartmentQuery (codec/c-hash code) (codec/tid type)) - (batch-db/->CompartmentQuery (codec/c-hash code) (codec/tid type) - clauses)))) + (batch-db/->EmptyCompartmentQuery (codec/c-hash code) (codec/tid code) + (codec/tid type)) + (batch-db/->CompartmentQuery (codec/c-hash code) (codec/tid code) + (codec/tid type) clauses)))) (defrecord Node [context tx-log rh-cache tx-cache kv-store resource-store @@ -445,7 +446,7 @@ [:blaze.db/enforce-referential-integrity])) -(def ^:private expected-kv-store-version 1) +(def ^:private expected-kv-store-version 2) (def ^:private incompatible-kv-store-version-msg diff --git a/modules/db/src/blaze/db/node/resource_indexer.clj b/modules/db/src/blaze/db/node/resource_indexer.clj index 3e6af90be..cc36ceabb 100644 --- a/modules/db/src/blaze/db/node/resource_indexer.clj +++ b/modules/db/src/blaze/db/node/resource_indexer.clj @@ -4,6 +4,7 @@ [blaze.async.comp :as ac] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.compartment.resource :as cr] + [blaze.db.impl.index.resource-id :as ri] [blaze.db.impl.search-param :as search-param] [blaze.db.kv :as kv] [blaze.db.kv.spec] @@ -43,33 +44,25 @@ "type") -(defn- compartment-resource-type-entry - "Returns an entry into the :compartment-resource-type-index where `resource` - is linked to `compartment`." - {:arglists '([compartment resource])} - [[comp-code comp-id] {:keys [id] :as resource}] - (cr/index-entry - [(codec/c-hash comp-code) (codec/id-byte-string comp-id)] - (codec/tid (name (fhir-spec/fhir-type resource))) - (codec/id-byte-string id))) +(defn- compartment-resource-type-entry [compartment {:keys [type did]}] + (cr/index-entry compartment (codec/tid type) did)) -(defn- compartment-resource-type-entries [resource compartments] - (mapv #(compartment-resource-type-entry % resource) compartments)) +(defn- compartment-resource-type-entries [entry compartments] + (mapv #(compartment-resource-type-entry % entry) compartments)) -(defn- skip-indexing-msg [search-param resource cause-msg] +(defn- skip-indexing-msg [search-param {:keys [type resource]} cause-msg] (format "Skip indexing for search parameter `%s` on resource `%s/%s`. Cause: %s" - (:url search-param) (name (fhir-spec/fhir-type resource)) - (:id resource) (or cause-msg ""))) + (:url search-param) type (:id resource) (or cause-msg ""))) (defn- search-param-index-entries - [search-param linked-compartments hash resource] - (-> (search-param/index-entries search-param linked-compartments hash resource) + [search-param resource-id compartments {:keys [did hash resource] :as entry}] + (-> (search-param/index-entries search-param resource-id compartments did hash resource) (ba/exceptionally (fn [{::anom/keys [message]}] - (log/warn (skip-indexing-msg search-param resource message)) + (log/warn (skip-indexing-msg search-param entry message)) nil)))) @@ -94,21 +87,34 @@ (update resource :meta (fnil assoc #fhir/Meta{}) :lastUpdated last-updated)) +(defn- code-compartment [resource-id [comp-code comp-id]] + (when-let [co-res-did (resource-id (codec/tid comp-code) comp-id)] + [(codec/c-hash comp-code) co-res-did])) + + +(defn- code-compartments [resource-id compartments] + (into + [] + (keep (partial code-compartment resource-id)) + compartments)) + + (defn- index-resource* - [{:keys [search-param-registry last-updated]} hash resource] - (let [resource (enhance-resource last-updated resource) - compartments (linked-compartments search-param-registry hash resource)] + [{:keys [search-param-registry kv-store]} {:keys [hash resource] :as entry}] + (let [compartments (linked-compartments search-param-registry hash resource) + resource-id (ri/resource-id kv-store) + compartments (code-compartments resource-id compartments)] (into - (compartment-resource-type-entries resource compartments) - (mapcat #(search-param-index-entries % compartments hash resource)) + (compartment-resource-type-entries entry compartments) + (mapcat #(search-param-index-entries % resource-id compartments entry)) (search-params search-param-registry resource)))) -(defn- index-resource [context [hash resource]] +(defn- index-resource [context {:keys [hash type] :as entry}] (log/trace "Index resource with hash" hash) (with-open [_ (prom/timer duration-seconds "index-resource")] - (let [entries (index-resource* context hash resource)] - (prom/observe! index-entries (name (:fhir/type resource)) (count entries)) + (let [entries (index-resource* context entry)] + (prom/observe! index-entries type (count entries)) entries))) @@ -132,6 +138,20 @@ (into [] (keep :hash) tx-cmds)) +(defn- entries [last-updated tx-cmds resources] + (reduce + (fn [res {:keys [did hash]}] + (let [resource (some->> hash (get resources))] + (cond-> res + resource + (conj {:did did + :hash hash + :type (name (fhir-spec/fhir-type resource)) + :resource (enhance-resource last-updated resource)})))) + [] + tx-cmds)) + + (defn index-resources "Returns a CompletableFuture that will complete after all resources of `tx-data` are indexed. @@ -143,10 +163,10 @@ {:keys [tx-cmds] resources :local-payload last-updated :instant}] (let [context (assoc resource-indexer :last-updated last-updated)] (if resources - (index-resources* context resources) + (index-resources* context (entries last-updated tx-cmds resources)) (-> (rs/multi-get resource-store (hashes tx-cmds)) (ac/then-compose - (partial index-resources* context)))))) + #(index-resources* context (entries last-updated tx-cmds %))))))) (defmethod ig/pre-init-spec :blaze.db.node/resource-indexer [_] diff --git a/modules/db/src/blaze/db/node/tx_indexer/verify.clj b/modules/db/src/blaze/db/node/tx_indexer/verify.clj index 95af94e61..645bcc47b 100644 --- a/modules/db/src/blaze/db/node/tx_indexer/verify.clj +++ b/modules/db/src/blaze/db/node/tx_indexer/verify.clj @@ -4,6 +4,7 @@ [blaze.db.api :as d] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] + [blaze.db.impl.index.resource-id :as ri] [blaze.db.impl.index.rts-as-of :as rts] [blaze.db.impl.index.system-stats :as system-stats] [blaze.db.impl.index.type-stats :as type-stats] @@ -115,7 +116,7 @@ Throws an anomaly on conflicts." {:arglists '([db-before t res cmd])} - (fn [_db-before _t _res {:keys [op]}] op)) + (fn [_db-before _t _idx _res {:keys [op]}] op)) (defn- verify-tx-cmd-create-msg [type id] @@ -131,21 +132,20 @@ (throw-anom (ba/conflict (id-collision-msg type id))))) -(defn- index-entries [tid id t hash num-changes op] - (rts/index-entries tid (codec/id-byte-string id) t hash num-changes op)) - - (def ^:private inc-0 (fnil inc 0)) (defmethod verify-tx-cmd "create" - [db-before t res {:keys [type id hash]}] + [db-before t idx res {:keys [type id hash] :as cmd}] (log/trace (verify-tx-cmd-create-msg type id)) (with-open [_ (prom/timer duration-seconds "verify-create")] (check-id-collision! db-before type id) - (let [tid (codec/tid type)] - (-> (update res :entries into (index-entries tid id t hash 1 :create)) + (let [tid (codec/tid type) + did (codec/did t idx)] + (-> (update res :entries into (rts/index-entries tid did t hash 1 :create id)) + (update :entries conj (ri/index-entry tid id did)) (update :new-resources conj [type id]) + (update :cmds conj (assoc cmd :did did)) (update-in [:stats tid :num-changes] inc-0) (update-in [:stats tid :total] inc-0))))) @@ -185,11 +185,12 @@ (defmethod verify-tx-cmd "put" - [db-before t res {:keys [type id hash if-match if-none-match]}] + [db-before t idx res {:keys [type id hash if-match if-none-match] :as cmd}] (log/trace (verify-tx-cmd-put-msg type id if-match if-none-match)) (with-open [_ (prom/timer duration-seconds "verify-put")] (let [tid (codec/tid type) - {:keys [num-changes op] :or {num-changes 0} old-t :t} + {:keys [did num-changes op] :or {did (codec/did t idx) num-changes 0} + old-t :t} (d/resource-handle db-before type id)] (cond (and if-match (not= if-match old-t)) @@ -203,40 +204,48 @@ :else (cond-> - (-> (update res :entries into (index-entries tid id t hash (inc num-changes) :put)) + (-> (update res :entries into (rts/index-entries tid did t hash (inc num-changes) :put id)) (update :new-resources conj [type id]) + (update :cmds conj (assoc cmd :did did)) (update-in [:stats tid :num-changes] inc-0)) + (nil? old-t) + (update :entries conj (ri/index-entry tid id did)) (or (nil? old-t) (identical? :delete op)) (update-in [:stats tid :total] inc-0)))))) (defmethod verify-tx-cmd "delete" - [db-before t res {:keys [type id]}] + [db-before t idx res {:keys [type id]}] (log/trace "verify-tx-cmd :delete" (str type "/" id)) (with-open [_ (prom/timer duration-seconds "verify-delete")] (let [tid (codec/tid type) - {:keys [num-changes op] :or {num-changes 0}} + {:keys [did num-changes op] :or {did (codec/did t idx) num-changes 0}} (d/resource-handle db-before type id)] (cond-> - (-> (update res :entries into (index-entries tid id t hash/deleted-hash (inc num-changes) :delete)) + (-> (update res :entries into (rts/index-entries tid did t hash/deleted-hash (inc num-changes) :delete id)) (update :del-resources conj [type id]) (update-in [:stats tid :num-changes] inc-0)) + (nil? op) + (update :entries conj (ri/index-entry tid id did)) (and op (not (identical? :delete op))) (update-in [:stats tid :total] (fnil dec 0)))))) (defmethod verify-tx-cmd :default - [_db-before _t res _tx-cmd] + [_db-before _t _idx res _tx-cmd] res) (defn- verify-tx-cmds** [db-before t tx-cmds] - (reduce - (partial verify-tx-cmd db-before t) - {:entries [] - :new-resources #{} - :del-resources #{}} - tx-cmds)) + (let [idx (volatile! -1)] + (reduce + (fn [res tx-cmd] + (verify-tx-cmd db-before t (vswap! idx inc) res tx-cmd)) + {:entries [] + :cmds [] + :new-resources #{} + :del-resources #{}} + tx-cmds))) (def ^:private empty-stats @@ -262,10 +271,11 @@ (system-stats/index-entry new-t (apply merge-with + current-stats (vals stats)))))) -(defn- post-process-res [db-before t {:keys [entries stats]}] - (cond-> (conj-type-stats entries db-before t stats) - stats - (conj (system-stats db-before t stats)))) +(defn- post-process-res [db-before t {:keys [entries stats cmds]}] + [(cond-> (conj-type-stats entries db-before t stats) + stats + (conj (system-stats db-before t stats))) + cmds]) (defn- resource-exists? [db type id] diff --git a/modules/db/test-perf/blaze/db/api_test_perf.clj b/modules/db/test-perf/blaze/db/api_test_perf.clj index 3f184124e..7286335cd 100644 --- a/modules/db/test-perf/blaze/db/api_test_perf.clj +++ b/modules/db/test-perf/blaze/db/api_test_perf.clj @@ -61,6 +61,7 @@ :tx-success-index {:reverse-comparator? true} :tx-error-index nil :t-by-instant-index {:reverse-comparator? true} + :resource-id-index nil :resource-as-of-index nil :type-as-of-index nil :system-as-of-index nil @@ -96,7 +97,7 @@ (deftest transact-test (with-system [{:blaze.db/keys [node]} system] - ;; 58.8 µs / 1.76 µs - Macbook Pro M1 Pro, Oracle OpenJDK 17.0.2 + ;; 66.7 µs / 1.92 µs - Macbook Pro M1 Pro, Oracle OpenJDK 17.0.2 (criterium/bench @(d/transact node [[:put {:fhir/type :fhir/Patient :id "0"}]])))) diff --git a/modules/db/test/blaze/db/api_test.clj b/modules/db/test/blaze/db/api_test.clj index c335daf24..43b1c21ab 100644 --- a/modules/db/test/blaze/db/api_test.clj +++ b/modules/db/test/blaze/db/api_test.clj @@ -8,6 +8,7 @@ [blaze.coll.core :as coll] [blaze.db.api :as d] [blaze.db.api-spec] + [blaze.db.impl.codec :as codec] [blaze.db.impl.db-spec] [blaze.db.impl.index.resource-search-param-value-test-util :as r-sp-v-tu] [blaze.db.kv.mem-spec] @@ -2426,32 +2427,32 @@ (testing "ResourceSearchParamValue index looks like it should" (is (= (r-sp-v-tu/decode-index-entries (:kv-store node) - :type :id :hash-prefix :code :v-hash) - [["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + :type :did :hash-prefix :code :v-hash) + [["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "value-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "value-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "value-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "combo-value-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "combo-value-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "combo-value-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "_id" #blaze/byte-string"490E5C1C8B04CCEC"] - ["Observation" "id-0" #blaze/hash-prefix"36A9F36D" + ["Observation" (codec/did 1 0) #blaze/hash-prefix"36A9F36D" "_lastUpdated" #blaze/byte-string"80008001"] - ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" + ["TestScript" (codec/did 1 1) #blaze/hash-prefix"51E67D28" "context-quantity" #blaze/byte-string"4F40902F3B6AE19A80"] - ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" + ["TestScript" (codec/did 1 1) #blaze/hash-prefix"51E67D28" "context-quantity" #blaze/byte-string"9CEABF1B055DDDCF80"] - ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" + ["TestScript" (codec/did 1 1) #blaze/hash-prefix"51E67D28" "context-quantity" #blaze/byte-string"B658D8AF4F417A2B80"] - ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" + ["TestScript" (codec/did 1 1) #blaze/hash-prefix"51E67D28" "_id" #blaze/byte-string"490E5C1C8B04CCEC"] - ["TestScript" "id-0" #blaze/hash-prefix"51E67D28" + ["TestScript" (codec/did 1 1) #blaze/hash-prefix"51E67D28" "_lastUpdated" #blaze/byte-string"80008001"]]))) @@ -3500,14 +3501,6 @@ [0 :id] := "0" [0 :meta :versionId] := #fhir/id"1")) - (testing "starting with Measure also returns the patient, - because in type hash order, Measure comes before - Patient but after Observation" - (given @(d/pull-many node (d/system-list (d/db node) "Measure" "0")) - [0 :fhir/type] := :fhir/Patient - [0 :id] := "0" - [0 :meta :versionId] := #fhir/id"1")) - (testing "overshooting the start-id returns an empty collection" (is (coll/empty? (d/system-list (d/db node) "Patient" "1"))))))) @@ -3605,7 +3598,7 @@ (testing "Unknown compartment is not a problem" (with-system [{:blaze.db/keys [node]} system] (is (coll/empty? (d/list-compartment-resource-handles - (d/db node) "foo" "bar" "Condition")))))) + (d/db node) "Foo" "bar" "Condition")))))) (defn- pull-compartment-query [node code id type clauses] @@ -3810,7 +3803,7 @@ (testing "Unknown compartment is not a problem" (with-system [{:blaze.db/keys [node]} system] (is (coll/empty? (d/compartment-query - (d/db node) "foo" "bar" "Condition" + (d/db node) "Foo" "bar" "Condition" [["code" "baz"]]))))) (testing "Unknown type is not a problem" diff --git a/modules/db/test/blaze/db/impl/codec/spec.clj b/modules/db/test/blaze/db/impl/codec/spec.clj index 751b9f994..2fc741c74 100644 --- a/modules/db/test/blaze/db/impl/codec/spec.clj +++ b/modules/db/test/blaze/db/impl/codec/spec.clj @@ -1,10 +1,8 @@ (ns blaze.db.impl.codec.spec (:require [blaze.byte-string :as bs :refer [byte-string?]] - [blaze.db.impl.codec :as codec] [clojure.spec.alpha :as s] [clojure.spec.gen.alpha :as gen] - [clojure.string :as str] [clojure.test.check.generators :as gen2])) @@ -32,13 +30,15 @@ (s/with-gen int? gen/int)) -(def ^:private id-gen - #(gen/fmap (comp codec/id-byte-string str/join) - (gen/vector gen2/char-alphanumeric 1 64))) - - -(s/def :blaze.db/id-byte-string - (s/with-gen (s/and byte-string? #(<= 1 (bs/size %) 64)) id-gen)) +;; A database resource id is a long value were the first 5 bytes is the `t` at +;; which the resource was created and the last 3 bytes are the index of the +;; resource in the transaction. +(s/def :blaze.db/did + (s/with-gen + (s/and int? #(< 0xFFF %)) + #(gen/fmap + (fn [[t n]] (+ (bit-shift-left t 24) n)) + (gen/tuple (s/gen :blaze.db/t) (gen/choose 0 0xFFFFFE))))) (def ^:private byte-string-gen diff --git a/modules/db/test/blaze/db/impl/codec_spec.clj b/modules/db/test/blaze/db/impl/codec_spec.clj index 71ca65cc6..bdcd79c0e 100644 --- a/modules/db/test/blaze/db/impl/codec_spec.clj +++ b/modules/db/test/blaze/db/impl/codec_spec.clj @@ -1,10 +1,12 @@ (ns blaze.db.impl.codec-spec (:require + [blaze.byte-buffer :as bb] [blaze.byte-string :refer [byte-string?]] [blaze.byte-string-spec] [blaze.db.api-spec] [blaze.db.impl.codec :as codec] [blaze.db.impl.codec.spec] + [blaze.db.tx-log.spec] [blaze.fhir.spec] [blaze.fhir.spec.type.system-spec] [blaze.fhir.spec.type.system.spec] @@ -15,14 +17,14 @@ ;; ---- Identifier Functions -------------------------------------------------- -(s/fdef codec/id-byte-string - :args (s/cat :id :blaze.resource/id) - :ret :blaze.db/id-byte-string) +(s/fdef codec/id-from-byte-buffer + :args (s/cat :buf bb/byte-buffer?) + :ret string?) -(s/fdef codec/id-string - :args (s/cat :id-byte-string :blaze.db/id-byte-string) - :ret :blaze.resource/id) +(s/fdef codec/did + :args (s/cat :t :blaze.db/t :idx nat-int?) + :ret :blaze.db/did) ;; ---- Other Functions ------------------------------------------------------- @@ -47,8 +49,8 @@ :ret byte-string?) -(s/fdef codec/tid-id - :args (s/cat :type :blaze.db/tid :id :blaze.db/id-byte-string) +(s/fdef codec/tid-did + :args (s/cat :type :blaze.db/tid :did :blaze.db/did) :ret byte-string?) diff --git a/modules/db/test/blaze/db/impl/codec_test.clj b/modules/db/test/blaze/db/impl/codec_test.clj index 1feeaab75..0347aa7fd 100644 --- a/modules/db/test/blaze/db/impl/codec_test.clj +++ b/modules/db/test/blaze/db/impl/codec_test.clj @@ -8,7 +8,6 @@ [clojure.spec.alpha :as s] [clojure.spec.test.alpha :as st] [clojure.test :as test :refer [are deftest is testing]] - [clojure.test.check.generators :as gen] [clojure.test.check.properties :as prop]) (:import [java.nio.charset StandardCharsets])) @@ -28,21 +27,13 @@ `(is (not-every? :failure (st/check ~sym ~opts))))) -(deftest id-string-id-byte-string-test - (satisfies-prop 1000 - (prop/for-all [s (s/gen :blaze.resource/id)] - (= s - (codec/id-string (codec/id-byte-string s)) - (apply codec/id-string [(apply codec/id-byte-string [s])]))))) - - (deftest descending-long-test (are [t dt] (= dt (codec/descending-long t)) - 1 0xFFFFFFFFFFFFFE - 0 0xFFFFFFFFFFFFFF) + 1 0xFFFFFFFFFE + 0 0xFFFFFFFFFF) (satisfies-prop 100000 - (prop/for-all [t gen/nat] + (prop/for-all [t (s/gen :blaze.db/t)] (= t (codec/descending-long (codec/descending-long t)) (apply codec/descending-long [(apply codec/descending-long [t])]))))) diff --git a/modules/db/test/blaze/db/impl/db_spec.clj b/modules/db/test/blaze/db/impl/db_spec.clj index 1efc82cd5..baf7e52ac 100644 --- a/modules/db/test/blaze/db/impl/db_spec.clj +++ b/modules/db/test/blaze/db/impl/db_spec.clj @@ -5,6 +5,7 @@ [blaze.db.impl.codec-spec] [blaze.db.impl.db :as db] [blaze.db.impl.index-spec] + [blaze.db.impl.index.resource-as-of-spec] [blaze.db.impl.index.system-stats-spec] [blaze.db.impl.index.type-stats-spec] [blaze.db.impl.search-param-spec] diff --git a/modules/db/test/blaze/db/impl/index/compartment/resource_spec.clj b/modules/db/test/blaze/db/impl/index/compartment/resource_spec.clj index bf5ab5fc9..abf9737df 100644 --- a/modules/db/test/blaze/db/impl/index/compartment/resource_spec.clj +++ b/modules/db/test/blaze/db/impl/index/compartment/resource_spec.clj @@ -14,12 +14,12 @@ :args (s/cat :context :blaze.db.impl.batch-db/context :compartment :blaze.db/compartment :tid :blaze.db/tid - :start-id (s/? :blaze.db/id-byte-string)) + :start-did (s/? :blaze.db/did)) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) (s/fdef cr/index-entry :args (s/cat :compartment :blaze.db/compartment :tid :blaze.db/tid - :id :blaze.db/id-byte-string) + :did :blaze.db/did) :ret :blaze.db.kv/put-entry) diff --git a/modules/db/test/blaze/db/impl/index/compartment/resource_test_util.clj b/modules/db/test/blaze/db/impl/index/compartment/resource_test_util.clj index 1d8c28d56..db1fae55c 100644 --- a/modules/db/test/blaze/db/impl/index/compartment/resource_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/compartment/resource_test_util.clj @@ -18,10 +18,9 @@ {:compartment [(let [c-hash (bb/get-int! buf)] (tu/co-c-hash->code c-hash (Integer/toHexString c-hash))) - (let [id-size (bb/size-up-to-null buf)] - (codec/id-string (bs/from-byte-buffer! buf id-size)))] - :type (do (bb/get-byte! buf) (codec/tid->type (bb/get-int! buf))) - :id (codec/id-string (bs/from-byte-buffer! buf))})) + (bb/get-long! buf)] + :type (codec/tid->type (bb/get-int! buf)) + :did (bb/get-long! buf)})) (defn decode-index-entries [kv-store & keys] diff --git a/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_spec.clj b/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_spec.clj index 9bcf8c07f..cdff3babe 100644 --- a/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_spec.clj +++ b/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_spec.clj @@ -37,6 +37,6 @@ :c-hash :blaze.db/c-hash :tid :blaze.db/tid :value byte-string? - :id :blaze.db/id-byte-string + :did :blaze.db/did :hash :blaze.resource/hash) :ret :blaze.db.kv/put-entry) diff --git a/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_test_util.clj b/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_test_util.clj index 6f39254ea..b23b1af60 100644 --- a/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/compartment/search_param_value_resource_test_util.clj @@ -13,24 +13,21 @@ (set! *unchecked-math* :warn-on-boxed) -(defn decode-key-human +(defn- decode-key-human ([] (bb/allocate-direct 128)) ([buf] - (let [id-size (bb/get-byte! buf (- (bb/limit buf) hash/prefix-size 1))] - {:compartment - [(let [c-hash (bb/get-int! buf)] - (tu/co-c-hash->code c-hash (Integer/toHexString c-hash))) - (-> (bs/from-byte-buffer! buf (bb/size-up-to-null buf)) codec/id-string)] - :code (let [_ (bb/get-byte! buf) - c-hash (bb/get-int! buf)] - (codec/c-hash->code c-hash (Integer/toHexString c-hash))) - :type (codec/tid->type (bb/get-int! buf)) - :v-hash (let [size (- (bb/remaining buf) hash/prefix-size id-size 2)] - (bs/from-byte-buffer! buf size)) - :id (do (bb/get-byte! buf) - (codec/id-string (bs/from-byte-buffer! buf id-size))) - :hash-prefix (do (bb/get-byte! buf) - (hash/prefix-from-byte-buffer! buf))}))) + {:compartment + [(let [c-hash (bb/get-int! buf)] + (tu/co-c-hash->code c-hash (Integer/toHexString c-hash))) + (bb/get-long! buf)] + :code (let [c-hash (bb/get-int! buf)] + (codec/c-hash->code c-hash (Integer/toHexString c-hash))) + :type (codec/tid->type (bb/get-int! buf)) + :v-hash (let [size (- (bb/remaining buf) hash/prefix-size codec/did-size 1)] + (bs/from-byte-buffer! buf size)) + :did (do (bb/get-byte! buf) + (bb/get-long! buf)) + :hash-prefix (hash/prefix-from-byte-buffer! buf)})) (defn decode-index-entries [kv-store & keys] diff --git a/modules/db/test/blaze/db/impl/index/resource_as_of_spec.clj b/modules/db/test/blaze/db/impl/index/resource_as_of_spec.clj index 2bc0426f5..d1d481c42 100644 --- a/modules/db/test/blaze/db/impl/index/resource_as_of_spec.clj +++ b/modules/db/test/blaze/db/impl/index/resource_as_of_spec.clj @@ -13,28 +13,28 @@ (s/fdef rao/encode-key - :args (s/cat :tid :blaze.db/tid :id :blaze.db/id-byte-string :t :blaze.db/t) + :args (s/cat :tid :blaze.db/tid :did :blaze.db/did :t :blaze.db/t) :ret bytes?) (s/fdef rao/type-list :args (s/cat :context :blaze.db.impl.batch-db/context :tid :blaze.db/tid - :start-id (s/? :blaze.db/id-byte-string)) + :start-did (s/? :blaze.db/did)) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) (s/fdef rao/system-list :args (s/cat :context :blaze.db.impl.batch-db/context :start (s/? (s/cat :start-tid :blaze.db/tid - :start-id :blaze.db/id-byte-string))) + :start-did :blaze.db/did))) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) (s/fdef rao/instance-history :args (s/cat :raoi :blaze.db/kv-iterator :tid :blaze.db/tid - :id :blaze.db/id-byte-string + :did :blaze.db/did :start-t :blaze.db/t :end-t :blaze.db/t) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) @@ -45,7 +45,7 @@ :args (s/cat :tid :blaze.db/tid - :id :blaze.db/id-byte-string + :did :blaze.db/did :t (s/? :blaze.db/t)) :ret (s/nilable :blaze.db/resource-handle))) @@ -61,7 +61,7 @@ (s/fdef rao/num-of-instance-changes :args (s/cat :resource-handle ::resource-handle-fn :tid :blaze.db/tid - :id :blaze.db/id-byte-string + :did :blaze.db/did :start-t :blaze.db/t :end-t :blaze.db/t) :ret nat-int?) diff --git a/modules/db/test/blaze/db/impl/index/resource_as_of_test.clj b/modules/db/test/blaze/db/impl/index/resource_as_of_test.clj new file mode 100644 index 000000000..bc7906fbb --- /dev/null +++ b/modules/db/test/blaze/db/impl/index/resource_as_of_test.clj @@ -0,0 +1,25 @@ +(ns blaze.db.impl.index.resource-as-of-test + (:require + [blaze.byte-buffer :as bb] + [blaze.db.impl.codec :as codec] + [blaze.db.impl.codec.spec] + [blaze.db.impl.index.resource-as-of :as rao] + [blaze.test-util :refer [satisfies-prop]] + [clojure.spec.alpha :as s] + [clojure.test :refer [deftest]] + [clojure.test.check.properties :as prop])) + + +(defn decode-key [buf] + {:tid (bb/get-int! buf) + :did (bb/get-long! buf) + :t (codec/descending-long (bb/get-5-byte-long! buf))}) + + +(deftest encode-key-test + (satisfies-prop 10000 + (prop/for-all [tid (s/gen :blaze.db/tid) + did (s/gen :blaze.db/did) + t (s/gen :blaze.db/t)] + (= {:tid tid :did did :t t} + (decode-key (bb/wrap (rao/encode-key tid did t))))))) diff --git a/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj index 3afb8681e..9ac0621b0 100644 --- a/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/resource_as_of_test_util.clj @@ -1,7 +1,6 @@ (ns blaze.db.impl.index.resource-as-of-test-util (:require [blaze.byte-buffer :as bb] - [blaze.byte-string :as bs] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] [blaze.fhir.hash :as hash])) @@ -11,12 +10,10 @@ (defn decode-key [byte-array] - (let [buf (bb/wrap byte-array) - tid (bb/get-int! buf) - id-size (- (bb/remaining buf) codec/t-size)] - {:type (codec/tid->type tid) - :id (codec/id-string (bs/from-byte-buffer! buf id-size)) - :t (codec/descending-long (bb/get-long! buf))})) + (let [buf (bb/wrap byte-array)] + {:type (codec/tid->type (bb/get-int! buf)) + :did (bb/get-long! buf) + :t (codec/descending-long (bb/get-5-byte-long! buf))})) (defn decode-val [byte-array] @@ -25,4 +22,5 @@ state (bb/get-long! buf)] {:hash hash :num-changes (rh/state->num-changes state) - :op (rh/state->op state)})) + :op (rh/state->op state) + :id (codec/id-from-byte-buffer buf)})) diff --git a/modules/db/test/blaze/db/impl/index/resource_handle_spec.clj b/modules/db/test/blaze/db/impl/index/resource_handle_spec.clj index 2a55b79ed..790f6103b 100644 --- a/modules/db/test/blaze/db/impl/index/resource_handle_spec.clj +++ b/modules/db/test/blaze/db/impl/index/resource_handle_spec.clj @@ -11,7 +11,7 @@ (s/fdef rh/resource-handle - :args (s/cat :tid :blaze.db/tid :id :blaze.resource/id + :args (s/cat :tid :blaze.db/tid :did :blaze.db/did :t :blaze.db/t :value-buffer byte-buffer?) :ret :blaze.db/resource-handle) @@ -31,9 +31,9 @@ :ret :blaze.db/tid) -(s/fdef rh/id +(s/fdef rh/did :args (s/cat :rh rh/resource-handle?) - :ret :blaze.resource/id) + :ret :blaze.db/did) (s/fdef rh/t @@ -46,6 +46,11 @@ :ret :blaze.resource/hash) +(s/fdef rh/id + :args (s/cat :rh rh/resource-handle?) + :ret :blaze.resource/id) + + (s/fdef rh/reference :args (s/cat :rh rh/resource-handle?) :ret :blaze.fhir/local-ref) diff --git a/modules/db/test/blaze/db/impl/index/resource_handle_test.clj b/modules/db/test/blaze/db/impl/index/resource_handle_test.clj index 931785444..f4f3189a0 100644 --- a/modules/db/test/blaze/db/impl/index/resource_handle_test.clj +++ b/modules/db/test/blaze/db/impl/index/resource_handle_test.clj @@ -1,6 +1,7 @@ (ns blaze.db.impl.index.resource-handle-test (:refer-clojure :exclude [hash]) (:require + [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] [blaze.db.impl.index.resource-handle-spec] [blaze.fhir.hash :as hash] @@ -22,14 +23,14 @@ (defn- resource-handle - ([tid id] - (resource-handle tid id 0)) - ([tid id t] - (resource-handle tid id t hash)) - ([tid id t hash] - (resource-handle tid id t hash :create)) - ([tid id t hash op] - (rh/->ResourceHandle tid id t hash 0 op))) + ([tid did] + (resource-handle tid did 0)) + ([tid did t] + (resource-handle tid did t hash)) + ([tid did t hash] + (resource-handle tid did t hash :create "0")) + ([tid did t hash op id] + (rh/->ResourceHandle tid did t hash 0 op id))) (deftest state->num-changes-test @@ -44,62 +45,73 @@ (deftest deleted-test (are [rh] (and (rh/deleted? rh) (apply rh/deleted? [rh])) - (resource-handle 0 "0" 0 hash :delete))) + (resource-handle 0 0 0 hash :delete "0"))) (deftest tid-test (satisfies-prop 100 (prop/for-all [tid (s/gen :blaze.db/tid)] - (let [rh (resource-handle tid "foo")] + (let [rh (resource-handle tid 0)] (= tid (:tid rh) (rh/tid rh) (apply rh/tid [rh])))))) -(deftest id-test +(deftest did-test (satisfies-prop 100 - (prop/for-all [id (s/gen :blaze.resource/id)] - (let [rh (resource-handle 0 id)] - (= id (:id rh) (rh/id rh) (apply rh/id [rh])))))) + (prop/for-all [did (s/gen :blaze.db/did)] + (let [rh (resource-handle 0 did)] + (= did (:did rh) (rh/did rh) (apply rh/did [rh])))))) (deftest t-test (satisfies-prop 100 (prop/for-all [t (s/gen :blaze.db/t)] - (let [rh (resource-handle 0 "foo" t)] + (let [rh (resource-handle 0 0 t)] (= t (:t rh) (rh/t rh) (apply rh/t [rh])))))) (deftest hash-test (satisfies-prop 100 (prop/for-all [hash (s/gen :blaze.resource/hash)] - (let [rh (resource-handle 0 "foo" 0 hash)] + (let [rh (resource-handle 0 0 0 hash)] (= hash (:hash rh) (rh/hash rh) (apply rh/hash [rh])))))) +(deftest id-test + (satisfies-prop 100 + (prop/for-all [id (s/gen :blaze.resource/id)] + (let [rh (resource-handle 0 0 0 hash :create id)] + (= id (:id rh) (rh/id rh) (apply rh/id [rh])))))) + + (deftest reference-test (satisfies-prop 100 (prop/for-all [id (s/gen :blaze.resource/id)] - (let [rh (resource-handle 1495153489 id)] + (let [rh (resource-handle 1495153489 0 0 hash :create id)] (= (str "Condition/" id) (rh/reference rh) (apply rh/reference [rh])))))) (deftest not-found-key-test - (is (nil? (:foo (resource-handle 0 "foo")))) - (is (= ::not-found (:foo (resource-handle 0 "foo") ::not-found)))) + (is (nil? (:foo (resource-handle 0 0)))) + (is (= ::not-found (:foo (resource-handle 0 0) ::not-found)))) (deftest equals-test (satisfies-prop 100 (prop/for-all [tid (s/gen :blaze.db/tid) - id (s/gen :blaze.resource/id) + did (s/gen :blaze.db/did) t (s/gen :blaze.db/t)] (testing "same instance" - (let [rh (resource-handle tid id t)] + (let [rh (resource-handle tid did t)] (= rh rh))) (testing "separate instances" - (let [rh-1 (resource-handle tid id t) - rh-2 (resource-handle tid id t)] + (let [rh-1 (resource-handle tid did t) + rh-2 (resource-handle tid did t)] (= rh-1 rh-2)))))) + + +(deftest toString-test + (is (= "Patient/182457" (str (resource-handle (codec/tid "Patient") 0 0 hash :put "182457"))))) diff --git a/modules/db/test/blaze/db/impl/index/resource_id_spec.clj b/modules/db/test/blaze/db/impl/index/resource_id_spec.clj new file mode 100644 index 000000000..5b6235bc5 --- /dev/null +++ b/modules/db/test/blaze/db/impl/index/resource_id_spec.clj @@ -0,0 +1,17 @@ +(ns blaze.db.impl.index.resource-id-spec + (:require + [blaze.db.impl.codec.spec] + [blaze.db.impl.index.resource-id :as ri] + [blaze.db.kv.spec] + [blaze.fhir.spec.spec] + [clojure.spec.alpha :as s])) + + +(s/fdef ri/resource-id + :args (s/cat :kv-store :blaze.db/kv-store) + :ret :blaze.db/did) + + +(s/fdef ri/index-entry + :args (s/cat :tid :blaze.db/tid :id :blaze.resource/id :did :blaze.db/did) + :ret bytes?) diff --git a/modules/db/test/blaze/db/impl/index/resource_id_test_util.clj b/modules/db/test/blaze/db/impl/index/resource_id_test_util.clj new file mode 100644 index 000000000..04857a99e --- /dev/null +++ b/modules/db/test/blaze/db/impl/index/resource_id_test_util.clj @@ -0,0 +1,20 @@ +(ns blaze.db.impl.index.resource-id-test-util + (:require + [blaze.byte-buffer :as bb] + [blaze.db.impl.codec :as codec]) + (:import + [com.google.common.primitives Longs])) + + +(set! *warn-on-reflection* true) +(set! *unchecked-math* :warn-on-boxed) + + +(defn decode-key [byte-array] + (let [buf (bb/wrap byte-array)] + {:type (codec/tid->type (bb/get-int! buf)) + :id (codec/id-from-byte-buffer buf)})) + + +(defn decode-val [byte-array] + {:did (Longs/fromByteArray byte-array)}) diff --git a/modules/db/test/blaze/db/impl/index/resource_search_param_value_spec.clj b/modules/db/test/blaze/db/impl/index/resource_search_param_value_spec.clj index 83780712e..b505ceca5 100644 --- a/modules/db/test/blaze/db/impl/index/resource_search_param_value_spec.clj +++ b/modules/db/test/blaze/db/impl/index/resource_search_param_value_spec.clj @@ -26,20 +26,20 @@ :ret (s/nilable byte-string?)) -(s/fdef r-sp-v/index-entry - :args (s/cat :tid :blaze.db/tid - :id :blaze.db/id-byte-string - :hash :blaze.resource/hash - :c-hash :blaze.db/c-hash - :value byte-string?) - :ret :blaze.db.kv/put-entry) - - (s/fdef r-sp-v/prefix-keys! :args (s/cat :iter :blaze.db/kv-iterator :tid :blaze.db/tid - :id :blaze.db/id-byte-string + :did :blaze.db/did :hash :blaze.resource/hash :c-hash :blaze.db/c-hash :prefix-value (s/? byte-string?) :start-value (s/? byte-string?))) + + +(s/fdef r-sp-v/index-entry + :args (s/cat :tid :blaze.db/tid + :did :blaze.db/did + :hash :blaze.resource/hash + :c-hash :blaze.db/c-hash + :value byte-string?) + :ret :blaze.db.kv/put-entry) diff --git a/modules/db/test/blaze/db/impl/index/resource_search_param_value_test_util.clj b/modules/db/test/blaze/db/impl/index/resource_search_param_value_test_util.clj index 27a3a33ee..3028e981c 100644 --- a/modules/db/test/blaze/db/impl/index/resource_search_param_value_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/resource_search_param_value_test_util.clj @@ -3,6 +3,7 @@ [blaze.byte-buffer :as bb] [blaze.byte-string :as bs] [blaze.db.impl.codec :as codec] + [blaze.db.impl.index.resource-search-param-value :as r-sp-v] [blaze.db.impl.iterators :as i] [blaze.db.kv :as kv] [blaze.fhir.hash :as hash])) @@ -13,16 +14,14 @@ (defn decode-key-human - ([] (bb/allocate-direct 128)) + ([] (bb/allocate-direct r-sp-v/key-buffer-capacity)) ([buf] (let [tid (bb/get-int! buf) - id-size (bb/size-up-to-null buf) - id (bs/from-byte-buffer! buf id-size) - _ (bb/get-byte! buf) + did (bb/get-long! buf) hash-prefix (hash/prefix-from-byte-buffer! buf) c-hash (bb/get-int! buf)] {:type (codec/tid->type tid) - :id (codec/id-string id) + :did did :hash-prefix hash-prefix :code (codec/c-hash->code c-hash (Integer/toHexString c-hash)) :v-hash (bs/from-byte-buffer! buf)}))) diff --git a/modules/db/test/blaze/db/impl/index/rts_as_of_spec.clj b/modules/db/test/blaze/db/impl/index/rts_as_of_spec.clj index 3ec8174a5..bd6cc3d5a 100644 --- a/modules/db/test/blaze/db/impl/index/rts_as_of_spec.clj +++ b/modules/db/test/blaze/db/impl/index/rts_as_of_spec.clj @@ -1,6 +1,7 @@ (ns blaze.db.impl.index.rts-as-of-spec (:require [blaze.db.impl.codec.spec] + [blaze.db.impl.index.resource-as-of-spec] [blaze.db.impl.index.rts-as-of :as rts] [blaze.db.tx-log.spec] [blaze.fhir.hash-spec] @@ -9,11 +10,20 @@ [clojure.spec.alpha :as s])) +(s/fdef rts/encode-value + :args (s/cat :hash :blaze.resource/hash + :num-changes nat-int? + :op keyword? + :id :blaze.resource/id) + :ret bytes?) + + (s/fdef rts/index-entries :args (s/cat :tid :blaze.db/tid - :id :blaze.db/id-byte-string + :did :blaze.db/did :t :blaze.db/t :hash :blaze.resource/hash :num-changes nat-int? - :op keyword?) + :op keyword? + :id :blaze.resource/id) :ret bytes?) diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj deleted file mode 100644 index a7e74a45d..000000000 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource/impl_test.clj +++ /dev/null @@ -1,29 +0,0 @@ -(ns blaze.db.impl.index.search-param-value-resource.impl-test - (:require - [blaze.byte-buffer :as bb] - [blaze.byte-string :as bs] - [blaze.db.impl.index.search-param-value-resource :as sp-vr] - [blaze.db.impl.index.search-param-value-resource-spec] - [blaze.db.impl.index.search-param-value-resource.impl :as impl] - [blaze.test-util :as tu :refer [satisfies-prop]] - [clojure.spec.alpha :as s] - [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [deftest]] - [clojure.test.check.properties :as prop])) - - -(st/instrument) - - -(test/use-fixtures :each tu/fixture) - - -(deftest id-size-test - (satisfies-prop 1000 - (prop/for-all [c-hash (s/gen :blaze.db/c-hash) - tid (s/gen :blaze.db/tid) - value (s/gen :blaze.db/byte-string) - id (s/gen :blaze.db/id-byte-string) - hash (s/gen :blaze.resource/hash)] - (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value id hash))] - (= (bs/size id) (impl/id-size buf) (apply impl/id-size [buf])))))) diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj index 91eb3701c..7e9dc003d 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource_spec.clj @@ -21,21 +21,38 @@ :tid :blaze.db/tid :prefix-value byte-string? :start-value byte-string? - :start-id (s/? :blaze.db/id-byte-string))) + :start-did (s/? :blaze.db/did))) (s/fdef sp-vr/encode-seek-key :args (s/cat :c-hash :blaze.db/c-hash :tid :blaze.db/tid :more (s/? (s/cat :value byte-string? - :id (s/? :blaze.db/id-byte-string)))) + :did (s/? :blaze.db/did)))) :ret byte-string?) +(s/fdef sp-vr/encode-seek-key-for-prev + :args (s/cat :c-hash :blaze.db/c-hash + :tid :blaze.db/tid + :more (s/? (s/cat :value byte-string? + :did (s/? :blaze.db/did)))) + :ret byte-string?) + + +(s/fdef sp-vr/encode-key + :args (s/cat :c-hash :blaze.db/c-hash + :tid :blaze.db/tid + :value byte-string? + :did :blaze.db/did + :hash :blaze.resource/hash) + :ret bytes?) + + (s/fdef sp-vr/index-entry :args (s/cat :c-hash :blaze.db/c-hash :tid :blaze.db/tid :value byte-string? - :id :blaze.db/id-byte-string + :did :blaze.db/did :hash :blaze.resource/hash) :ret :blaze.db.kv/put-entry) diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj index d93d7bf72..b85e5ca03 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test.clj @@ -30,41 +30,41 @@ (deftest decode-key-test - (satisfies-prop 100 + (satisfies-prop 1000 (prop/for-all [c-hash (s/gen :blaze.db/c-hash) tid (s/gen :blaze.db/tid) value (s/gen :blaze.db/byte-string) - id (s/gen :blaze.db/id-byte-string) + did (s/gen :blaze.db/did) hash (s/gen :blaze.resource/hash)] - (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value id hash)) - [prefix act_id hash-prefix] (sp-vr/decode-key buf)] + (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value did hash)) + [prefix act-did hash-prefix] (sp-vr/decode-key buf)] (and (= (create-prefix c-hash tid value) prefix) - (= id act_id) + (= did act-did) (= (hash/prefix hash) hash-prefix)))))) (deftest decode-value-id-hash-prefix-test - (satisfies-prop 100 + (satisfies-prop 1000 (prop/for-all [c-hash (s/gen :blaze.db/c-hash) tid (s/gen :blaze.db/tid) value (s/gen :blaze.db/byte-string) - id (s/gen :blaze.db/id-byte-string) + did (s/gen :blaze.db/did) hash (s/gen :blaze.resource/hash)] - (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value id hash)) - [act_value act_id hash-prefix] (sp-vr/decode-value-id-hash-prefix buf)] - (and (= value act_value) - (= id act_id) + (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value did hash)) + [act-value act-did hash-prefix] (sp-vr/decode-value-did-hash-prefix buf)] + (and (= value act-value) + (= did act-did) (= (hash/prefix hash) hash-prefix)))))) (deftest decode-id-hash-prefix-test - (satisfies-prop 100 + (satisfies-prop 1000 (prop/for-all [c-hash (s/gen :blaze.db/c-hash) tid (s/gen :blaze.db/tid) value (s/gen :blaze.db/byte-string) - id (s/gen :blaze.db/id-byte-string) + did (s/gen :blaze.db/did) hash (s/gen :blaze.resource/hash)] - (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value id hash)) - [act_id hash-prefix] (sp-vr/decode-id-hash-prefix buf)] - (and (= id act_id) + (let [buf (bb/wrap (sp-vr/encode-key c-hash tid value did hash)) + [act-did hash-prefix] (sp-vr/decode-did-hash-prefix buf)] + (and (= did act-did) (= (hash/prefix hash) hash-prefix)))))) diff --git a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test_util.clj b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test_util.clj index 4a4fd32c0..2d534d190 100644 --- a/modules/db/test/blaze/db/impl/index/search_param_value_resource_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/search_param_value_resource_test_util.clj @@ -3,6 +3,7 @@ [blaze.byte-buffer :as bb] [blaze.byte-string :as bs] [blaze.db.impl.codec :as codec] + [blaze.db.impl.index.search-param-value-resource :as sp-vr] [blaze.db.impl.iterators :as i] [blaze.db.kv :as kv] [blaze.fhir.hash :as hash])) @@ -13,21 +14,19 @@ (defn decode-key-human - ([] (bb/allocate-direct 128)) + ([] (bb/allocate-direct sp-vr/key-buffer-capacity)) ([buf] - (let [id-size (bb/get-byte! buf (- (bb/limit buf) hash/prefix-size 1)) - value-size (- (bb/remaining buf) id-size 2 hash/prefix-size - codec/c-hash-size codec/tid-size) + (let [value-size (- (bb/remaining buf) 1 codec/did-size hash/prefix-size + sp-vr/base-key-size) c-hash (bb/get-int! buf) tid (bb/get-int! buf) value (bs/from-byte-buffer! buf value-size) _ (bb/get-byte! buf) - id (bs/from-byte-buffer! buf id-size) - _ (bb/get-byte! buf)] + did (bb/get-long! buf)] {:code (codec/c-hash->code c-hash (Integer/toHexString c-hash)) :type (codec/tid->type tid) :v-hash value - :id (codec/id-string id) + :did did :hash-prefix (hash/prefix-from-byte-buffer! buf)}))) diff --git a/modules/db/test/blaze/db/impl/index/system_as_of_spec.clj b/modules/db/test/blaze/db/impl/index/system_as_of_spec.clj index 7a9e15b9e..a8194d6ea 100644 --- a/modules/db/test/blaze/db/impl/index/system_as_of_spec.clj +++ b/modules/db/test/blaze/db/impl/index/system_as_of_spec.clj @@ -15,6 +15,6 @@ :args (s/cat :saoi :blaze.db/kv-iterator :start-t :blaze.db/t :start-tid (s/nilable :blaze.db/tid) - :start-id (s/nilable :blaze.db/id-byte-string) + :start-did (s/nilable :blaze.db/did) :end-t :blaze.db/t) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) diff --git a/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj index fd8db7ce8..762e42381 100644 --- a/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/system_as_of_test_util.clj @@ -1,7 +1,6 @@ (ns blaze.db.impl.index.system-as-of-test-util (:require [blaze.byte-buffer :as bb] - [blaze.byte-string :as bs] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] [blaze.fhir.hash :as hash])) @@ -12,9 +11,9 @@ (defn decode-key [byte-array] (let [buf (bb/wrap byte-array)] - {:t (codec/descending-long (bb/get-long! buf)) + {:t (codec/descending-long (bb/get-5-byte-long! buf)) :type (codec/tid->type (bb/get-int! buf)) - :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) + :did (bb/get-long! buf)})) (defn decode-val [byte-array] @@ -23,4 +22,5 @@ state (bb/get-long! buf)] {:hash hash :num-changes (rh/state->num-changes state) - :op (rh/state->op state)})) + :op (rh/state->op state) + :id (codec/id-from-byte-buffer buf)})) diff --git a/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj b/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj index 001b12f9d..c310f5b52 100644 --- a/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/system_stats_test_util.clj @@ -9,7 +9,7 @@ (defn decode-key [byte-array] (let [buf (bb/wrap byte-array)] - {:t (codec/descending-long (bb/get-long! buf))})) + {:t (codec/descending-long (bb/get-5-byte-long! buf))})) (defn decode-val [byte-array] diff --git a/modules/db/test/blaze/db/impl/index/type_as_of_spec.clj b/modules/db/test/blaze/db/impl/index/type_as_of_spec.clj index 792dfba2d..ef2950b2c 100644 --- a/modules/db/test/blaze/db/impl/index/type_as_of_spec.clj +++ b/modules/db/test/blaze/db/impl/index/type_as_of_spec.clj @@ -14,6 +14,6 @@ :args (s/cat :taoi :blaze.db/kv-iterator :tid :blaze.db/tid :start-t :blaze.db/t - :start-id (s/nilable :blaze.db/id-byte-string) + :start-did (s/nilable :blaze.db/did) :end-t :blaze.db/t) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) diff --git a/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj b/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj index bd8e7f89f..36ad8b26e 100644 --- a/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/type_as_of_test_util.clj @@ -1,7 +1,6 @@ (ns blaze.db.impl.index.type-as-of-test-util (:require [blaze.byte-buffer :as bb] - [blaze.byte-string :as bs] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-handle :as rh] [blaze.fhir.hash :as hash])) @@ -13,8 +12,8 @@ (defn decode-key [byte-array] (let [buf (bb/wrap byte-array)] {:type (codec/tid->type (bb/get-int! buf)) - :t (codec/descending-long (bb/get-long! buf)) - :id (codec/id-string (bs/from-byte-buffer! buf (bb/remaining buf)))})) + :t (codec/descending-long (bb/get-5-byte-long! buf)) + :did (bb/get-long! buf)})) (defn decode-val [byte-array] @@ -23,4 +22,5 @@ state (bb/get-long! buf)] {:hash hash :num-changes (rh/state->num-changes state) - :op (rh/state->op state)})) + :op (rh/state->op state) + :id (codec/id-from-byte-buffer buf)})) diff --git a/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj b/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj index b5932fbfc..8e9b0782c 100644 --- a/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj +++ b/modules/db/test/blaze/db/impl/index/type_stats_test_util.clj @@ -10,7 +10,7 @@ (defn decode-key [byte-array] (let [buf (bb/wrap byte-array)] {:type (codec/tid->type (bb/get-int! buf)) - :t (codec/descending-long (bb/get-long! buf))})) + :t (codec/descending-long (bb/get-5-byte-long! buf))})) (defn decode-val [byte-array] diff --git a/modules/db/test/blaze/db/impl/index_spec.clj b/modules/db/test/blaze/db/impl/index_spec.clj index 8a02c56c6..9e81936ce 100644 --- a/modules/db/test/blaze/db/impl/index_spec.clj +++ b/modules/db/test/blaze/db/impl/index_spec.clj @@ -26,7 +26,7 @@ :args (s/cat :context :blaze.db.impl.batch-db/context :tid :blaze.db/tid :clauses :blaze.db.index.query/clauses - :start-id (s/? :blaze.db/id-byte-string)) + :start-did (s/? :blaze.db/did)) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) diff --git a/modules/db/test/blaze/db/impl/search_param/composite_test.clj b/modules/db/test/blaze/db/impl/search_param/composite_test.clj index 693e767ff..dc23ecfaf 100644 --- a/modules/db/test/blaze/db/impl/search_param/composite_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/composite_test.clj @@ -153,7 +153,8 @@ [_ k12] [_ k13] [_ k14] [_ k15] [_ k16] [_ k17]] (search-param/index-entries (code-value-quantity-param search-param-registry) - [] hash observation)] + (constantly nil) + [] 201853 hash observation)] (testing "`code` followed by `value`" (testing "SearchParamValueResource key" @@ -162,13 +163,13 @@ :type := "Observation" [:v-hash split-value 0] := observation-code [:v-hash split-value 1] := value - :id := "id-155558" + :did := 201853 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-155558" + :did := 201853 :hash-prefix := (hash/prefix hash) :code := "code-value-quantity" [:v-hash split-value 0] := observation-code @@ -274,7 +275,8 @@ ::x ::y})] (given (search-param/index-entries (code-value-quantity-param search-param-registry) - [] hash resource) + (constantly nil) + [] 201932 hash resource) ::anom/category := ::anom/fault ::x := ::y))) @@ -287,7 +289,8 @@ ::x ::y}))] (given (anom-vec (search-param/index-entries (code-value-quantity-param search-param-registry) - [] hash resource)) + (constantly nil) + [] 201948 hash resource)) ::anom/category := ::anom/fault ::x := ::y))) @@ -308,7 +311,8 @@ ::x ::y}))] (given (anom-vec (search-param/index-entries (code-value-quantity-param search-param-registry) - [] hash resource)) + (constantly nil) + [] 201954 hash resource)) ::anom/category := ::anom/fault ::x := ::y))))) @@ -323,7 +327,8 @@ ::x ::y})] (given (search-param/index-entries (code-value-concept-param search-param-registry) - [] hash resource) + (constantly nil) + [] 202002 hash resource) ::anom/category := ::anom/fault ::x := ::y)))))))) diff --git a/modules/db/test/blaze/db/impl/search_param/date_test.clj b/modules/db/test/blaze/db/impl/search_param/date_test.clj index ce1df21f0..1389deba5 100644 --- a/modules/db/test/blaze/db/impl/search_param/date_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/date_test.clj @@ -97,7 +97,9 @@ hash (hash/generate patient) [[_ k0]] (search-param/index-entries - (birth-date-param search-param-registry) [] hash patient)] + (birth-date-param search-param-registry) + (constantly nil) + [] 202016 hash patient)] (testing "the entry is about both bounds of `2020-02-04`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) @@ -105,7 +107,7 @@ :type := "Patient" [:v-hash lower-bound-instant] := (Instant/parse "2020-02-04T00:00:00Z") [:v-hash upper-bound-instant] := (Instant/parse "2020-02-04T23:59:59Z") - :id := "id-142629" + :did := 202016 :hash-prefix := (hash/prefix hash))))) (testing "death-date" @@ -117,7 +119,8 @@ [[_ k0]] (search-param/index-entries (sr/get search-param-registry "death-date" "Patient") - [] hash patient)] + (constantly nil) + [] 202030 hash patient)] (testing "the entry is about both bounds of `2019-11-16T23:14:29Z`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) @@ -125,7 +128,7 @@ :type := "Patient" [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") - :id := "id-142629" + :did := 202030 :hash-prefix := (hash/prefix hash)))))) (testing "Encounter" @@ -140,7 +143,8 @@ [[_ k0]] (search-param/index-entries (sr/get search-param-registry "date" "Encounter") - [] hash encounter)] + (constantly nil) + [] 202044 hash encounter)] (testing "the entry is about the lower bound of the start and the upper bound of the end of the period" @@ -149,7 +153,7 @@ :type := "Encounter" [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:44:29Z") - :id := "id-160224" + :did := 202044 :hash-prefix := (hash/prefix hash)))) (testing "without start" @@ -162,7 +166,8 @@ [[_ k0]] (search-param/index-entries (sr/get search-param-registry "date" "Encounter") - [] hash encounter)] + (constantly nil) + [] 202100 hash encounter)] (testing "the entry is about the min bound as lower bound and the upper bound of the end of the period" @@ -171,7 +176,7 @@ :type := "Encounter" [:v-hash lower-bound-instant] := (Instant/parse "0001-01-01T00:00:00Z") [:v-hash upper-bound-instant] := (Instant/parse "2019-11-17T23:59:59Z") - :id := "id-160224" + :did := 202100 :hash-prefix := (hash/prefix hash))))) (testing "Encounter date without end" @@ -184,7 +189,8 @@ [[_ k0]] (search-param/index-entries (sr/get search-param-registry "date" "Encounter") - [] hash encounter)] + (constantly nil) + [] 202117 hash encounter)] (testing "the entry is about the lower bound of the start and the max upper bound" @@ -193,7 +199,7 @@ :type := "Encounter" [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") [:v-hash upper-bound-instant] := (Instant/parse "9999-12-31T23:59:59Z") - :id := "id-160224" + :did := 202117 :hash-prefix := (hash/prefix hash))))))) (testing "DiagnosticReport" @@ -205,7 +211,8 @@ [[_ k0]] (search-param/index-entries (sr/get search-param-registry "issued" "DiagnosticReport") - [] hash patient)] + (constantly nil) + [] 202130 hash patient)] (testing "the entry is about both bounds of `2019-11-17T00:14:29.917+01:00`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) @@ -213,7 +220,7 @@ :type := "DiagnosticReport" [:v-hash lower-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") [:v-hash upper-bound-instant] := (Instant/parse "2019-11-16T23:14:29Z") - :id := "id-155607" + :did := 202130 :hash-prefix := (hash/prefix hash)))))) (testing "FHIRPath evaluation problem" @@ -223,7 +230,8 @@ (with-redefs [fhir-path/eval (fn [_ _ _] {::anom/category ::anom/fault})] (given (search-param/index-entries (sr/get search-param-registry "issued" "DiagnosticReport") - [] hash resource) + (constantly nil) + [] 202141 hash resource) ::anom/category := ::anom/fault))))) (testing "skip warning" diff --git a/modules/db/test/blaze/db/impl/search_param/number_test.clj b/modules/db/test/blaze/db/impl/search_param/number_test.clj index 12ec6017b..dc1cd4350 100644 --- a/modules/db/test/blaze/db/impl/search_param/number_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/number_test.clj @@ -97,20 +97,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "probability" "RiskAssessment") - [] hash risk-assessment)] + (constantly nil) + [] 202156 hash risk-assessment)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "probability" :type := "RiskAssessment" :v-hash := (codec/number 0.9M) - :id := "id-163630" + :did := 202156 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "RiskAssessment" - :id := "id-163630" + :did := 202156 :hash-prefix := (hash/prefix hash) :code := "probability" :v-hash := (codec/number 0.9M))))) @@ -126,20 +127,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "variant-start" "MolecularSequence") - [] hash risk-assessment)] + (constantly nil) + [] 202219 hash risk-assessment)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "variant-start" :type := "MolecularSequence" :v-hash := (codec/number 1M) - :id := "id-170736" + :did := 202219 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "MolecularSequence" - :id := "id-170736" + :did := 202219 :hash-prefix := (hash/prefix hash) :code := "variant-start" :v-hash := (codec/number 1M))))) @@ -151,7 +153,8 @@ (with-redefs [fhir-path/eval (fn [_ _ _] {::anom/category ::anom/fault})] (given (search-param/index-entries (sr/get search-param-registry "probability" "RiskAssessment") - [] hash resource) + (constantly nil) + [] 202240 hash resource) ::anom/category := ::anom/fault))))) (testing "skip warning" diff --git a/modules/db/test/blaze/db/impl/search_param/quantity_spec.clj b/modules/db/test/blaze/db/impl/search_param/quantity_spec.clj index 79aa64526..7fde8eeb6 100644 --- a/modules/db/test/blaze/db/impl/search_param/quantity_spec.clj +++ b/modules/db/test/blaze/db/impl/search_param/quantity_spec.clj @@ -17,7 +17,7 @@ :tid :blaze.db/tid :prefix-length nat-int? :value ::spq/value - :start-id (s/? :blaze.db/id-byte-string))) + :start-did (s/? :blaze.db/did))) (s/fdef spq/matches? diff --git a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj index 6fc36651d..3a2ebc949 100644 --- a/modules/db/test/blaze/db/impl/search_param/quantity_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/quantity_test.clj @@ -48,7 +48,7 @@ (catch Exception e (is (= "No matching clause: :foo" (ex-message e))))) - (testing "with start-id" + (testing "with start-did" (try (spq/resource-keys! {} (codec/c-hash "value-quantity") 0 0 {:op :foo} 0) (catch Exception e @@ -149,20 +149,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation)] + (constantly nil) + [] 153511 hash observation)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity nil 140M) - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity nil 140M))) @@ -172,13 +173,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "mm[Hg]" 140M) - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `code value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "mm[Hg]" 140M))) @@ -188,13 +189,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "http://unitsofmeasure.org|mm[Hg]" 140M) - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|code value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Observation" - :id := "id-155558" + :did := 153511 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "http://unitsofmeasure.org|mm[Hg]" 140M))))) @@ -212,20 +213,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3]] (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation)] + (constantly nil) + [] 153548 hash observation)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity nil 140M) - :id := "id-155558" + :did := 153548 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-155558" + :did := 153548 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity nil 140M))) @@ -235,13 +237,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "mmHg" 140M) - :id := "id-155558" + :did := 153548 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `unit value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-155558" + :did := 153548 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "mmHg" 140M))))) @@ -260,20 +262,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3]] (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation)] + (constantly nil) + [] 153606 hash observation)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity nil 120M) - :id := "id-155558" + :did := 153606 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-155558" + :did := 153606 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity nil 120M))) @@ -283,13 +286,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "mm[Hg]" 120M) - :id := "id-155558" + :did := 153606 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `code value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-155558" + :did := 153606 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "mm[Hg]" 120M))))) @@ -308,20 +311,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation)] + (constantly nil) + [] 153622 hash observation)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity nil 120M) - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity nil 120M))) @@ -331,13 +335,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "mm[Hg]" 120M) - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `code value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "mm[Hg]" 120M))) @@ -347,13 +351,13 @@ :code := "value-quantity" :type := "Observation" :v-hash := (codec/quantity "mmHg" 120M) - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `unit value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Observation" - :id := "id-155558" + :did := 153622 :hash-prefix := (hash/prefix hash) :code := "value-quantity" :v-hash := (codec/quantity "mmHg" 120M))))) @@ -371,7 +375,8 @@ (is (empty? (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation))))) + (constantly nil) + [] 153644 hash observation))))) (testing "without value" (let [observation @@ -382,7 +387,8 @@ (is (empty? (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash observation)))))) + (constantly nil) + [] 153644 hash observation)))))) (testing "FHIRPath evaluation problem" (let [resource {:fhir/type :fhir/Observation :id "foo"} @@ -391,7 +397,8 @@ (with-redefs [fhir-path/eval (fn [_ _ _] {::anom/category ::anom/fault})] (given (search-param/index-entries (sr/get search-param-registry "value-quantity" "Observation") - [] hash resource) + (constantly nil) + [] 153644 hash resource) ::anom/category := ::anom/fault)))) (testing "skip warning" diff --git a/modules/db/test/blaze/db/impl/search_param/spec.clj b/modules/db/test/blaze/db/impl/search_param/spec.clj index 6ce8a1dd7..bb3c5adb6 100644 --- a/modules/db/test/blaze/db/impl/search_param/spec.clj +++ b/modules/db/test/blaze/db/impl/search_param/spec.clj @@ -5,4 +5,4 @@ (s/def :blaze.db/compartment - (s/tuple :blaze.db/c-hash :blaze.db/id-byte-string)) + (s/tuple :blaze.db/c-hash :blaze.db/did)) diff --git a/modules/db/test/blaze/db/impl/search_param/string_test.clj b/modules/db/test/blaze/db/impl/search_param/string_test.clj index 83dcd949f..28e69551a 100644 --- a/modules/db/test/blaze/db/impl/search_param/string_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/string_test.clj @@ -59,7 +59,9 @@ hash (hash/generate patient)] (is (empty? (search-param/index-entries - (phonetic-param search-param-registry) [] hash + (phonetic-param search-param-registry) + (constantly nil) + [] 153659 hash patient))))) (let [patient {:fhir/type :fhir/Patient @@ -68,20 +70,22 @@ hash (hash/generate patient) [[_ k0] [_ k1]] (search-param/index-entries - (phonetic-param search-param-registry) [] hash patient)] + (phonetic-param search-param-registry) + (constantly nil) + [] 153708 hash patient)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "phonetic" :type := "Patient" :v-hash := (codec/string (phonetics/soundex "family-102508")) - :id := "id-122929" + :did := 153708 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-122929" + :did := 153708 :hash-prefix := (hash/prefix hash) :code := "phonetic" :v-hash := (codec/string (phonetics/soundex "family-102508")))))) @@ -96,7 +100,8 @@ [[_ k0] [_ k1] [_ k2] [_ k3]] (search-param/index-entries (sr/get search-param-registry "address" "Patient") - [] hash patient)] + (constantly nil) + [] 153730 hash patient)] (testing "first entry is about `line`" (testing "SearchParamValueResource key" @@ -104,13 +109,13 @@ :code := "address" :type := "Patient" :v-hash := (codec/string "line 120252") - :id := "id-122929" + :did := 153730 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-122929" + :did := 153730 :hash-prefix := (hash/prefix hash) :code := "address" :v-hash := (codec/string "line 120252")))) @@ -121,13 +126,13 @@ :code := "address" :type := "Patient" :v-hash := (codec/string "city 105431") - :id := "id-122929" + :did := 153730 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Patient" - :id := "id-122929" + :did := 153730 :hash-prefix := (hash/prefix hash) :code := "address" :v-hash := (codec/string "city 105431")))))) @@ -140,20 +145,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "description" "ActivityDefinition") - [] hash resource)] + (constantly nil) + [] 153757 hash resource)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "description" :type := "ActivityDefinition" :v-hash := (codec/string "desc 121328") - :id := "id-121344" + :did := 153757 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "ActivityDefinition" - :id := "id-121344" + :did := 153757 :hash-prefix := (hash/prefix hash) :code := "description" :v-hash := (codec/string "desc 121328"))))) @@ -165,7 +171,8 @@ (with-redefs [fhir-path/eval (fn [_ _ _] {::anom/category ::anom/fault})] (given (search-param/index-entries (sr/get search-param-registry "description" "ActivityDefinition") - [] hash resource) + (constantly nil) + [] 153816 hash resource) ::anom/category := ::anom/fault)))) (testing "skip warning" diff --git a/modules/db/test/blaze/db/impl/search_param/token_spec.clj b/modules/db/test/blaze/db/impl/search_param/token_spec.clj index 6048e3e86..20d361e11 100644 --- a/modules/db/test/blaze/db/impl/search_param/token_spec.clj +++ b/modules/db/test/blaze/db/impl/search_param/token_spec.clj @@ -13,4 +13,4 @@ :c-hash :blaze.db/c-hash :tid :blaze.db/tid :value byte-string? - :start-id (s/? :blaze.db/id-byte-string))) + :start-did (s/? :blaze.db/did))) diff --git a/modules/db/test/blaze/db/impl/search_param/token_test.clj b/modules/db/test/blaze/db/impl/search_param/token_test.clj index c3b5eeffa..1f50d6377 100644 --- a/modules/db/test/blaze/db/impl/search_param/token_test.clj +++ b/modules/db/test/blaze/db/impl/search_param/token_test.clj @@ -59,20 +59,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "_id" "Observation") - [] hash observation)] + (constantly nil) + [] 153828 hash observation)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "_id" :type := "Observation" :v-hash := (codec/v-hash "id-161849") - :id := "id-161849" + :did := 153828 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-161849" + :did := 153828 :hash-prefix := (hash/prefix hash) :code := "_id" :v-hash := (codec/v-hash "id-161849"))))) @@ -90,20 +91,22 @@ hash (hash/generate observation) [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries - (code-param search-param-registry) [] hash observation)] + (code-param search-param-registry) + (constantly nil) + [] 153911 hash observation)] (testing "first SearchParamValueResource key is about `code`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "code" :type := "Observation" :v-hash := (codec/v-hash "code-171327") - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "code-171327"))) @@ -113,13 +116,13 @@ :code := "code" :type := "Observation" :v-hash := (codec/v-hash "system-171339|") - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "system-171339|"))) @@ -129,13 +132,13 @@ :code := "code" :type := "Observation" :v-hash := (codec/v-hash "system-171339|code-171327") - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Observation" - :id := "id-183201" + :did := 153911 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "system-171339|code-171327"))))) @@ -152,20 +155,22 @@ hash (hash/generate observation) [[_ k0] [_ k1] [_ k2] [_ k3]] (search-param/index-entries - (code-param search-param-registry) [] hash observation)] + (code-param search-param-registry) + (constantly nil) + [] 153954 hash observation)] (testing "first SearchParamValueResource key is about `code`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "code" :type := "Observation" :v-hash := (codec/v-hash "code-134035") - :id := "id-183201" + :did := 153954 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-183201" + :did := 153954 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "code-134035"))) @@ -175,13 +180,13 @@ :code := "code" :type := "Observation" :v-hash := (codec/v-hash "|code-134035") - :id := "id-183201" + :did := 153954 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `|code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Observation" - :id := "id-183201" + :did := 153954 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "|code-134035"))))) @@ -198,20 +203,22 @@ hash (hash/generate observation) [[_ k0] [_ k1]] (search-param/index-entries - (code-param search-param-registry) [] hash observation)] + (code-param search-param-registry) + (constantly nil) + [] 154050 hash observation)] (testing "first SearchParamValueResource key is about `system|`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "code" :type := "Observation" :v-hash := (codec/v-hash "system-171339|") - :id := "id-183201" + :did := 154050 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Observation" - :id := "id-183201" + :did := 154050 :hash-prefix := (hash/prefix hash) :code := "code" :v-hash := (codec/v-hash "system-171339|"))))) @@ -227,20 +234,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "identifier" "Patient") - [] hash patient)] + (constantly nil) + [] 154101 hash patient)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "value-123005") - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "value-123005"))) @@ -250,13 +258,13 @@ :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "system-123000|") - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Patient" - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "system-123000|"))) @@ -266,13 +274,13 @@ :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "system-123000|value-123005") - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Patient" - :id := "id-122929" + :did := 154101 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "system-123000|value-123005"))))) @@ -287,20 +295,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3]] (search-param/index-entries (sr/get search-param-registry "identifier" "Patient") - [] hash patient)] + (constantly nil) + [] 154139 hash patient)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "value-140132") - :id := "id-122929" + :did := 154139 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-122929" + :did := 154139 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "value-140132"))) @@ -310,13 +319,13 @@ :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "|value-140132") - :id := "id-122929" + :did := 154139 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `|value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Patient" - :id := "id-122929" + :did := 154139 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "|value-140132"))))) @@ -331,20 +340,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "identifier" "Patient") - [] hash patient)] + (constantly nil) + [] 154210 hash patient)] (testing "second SearchParamValueResource key is about `system|`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "identifier" :type := "Patient" :v-hash := (codec/v-hash "system-140316|") - :id := "id-122929" + :did := 154210 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-122929" + :did := 154210 :hash-prefix := (hash/prefix hash) :code := "identifier" :v-hash := (codec/v-hash "system-140316|"))))) @@ -356,20 +366,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "deceased" "Patient") - [] hash patient)] + (constantly nil) + [] 154245 hash patient)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "deceased" :type := "Patient" :v-hash := (codec/v-hash "false") - :id := "id-142629" + :did := 154245 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-142629" + :did := 154245 :hash-prefix := (hash/prefix hash) :code := "deceased" :v-hash := (codec/v-hash "false"))))) @@ -382,20 +393,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "deceased" "Patient") - [] hash patient)] + (constantly nil) + [] 154258 hash patient)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "deceased" :type := "Patient" :v-hash := (codec/v-hash "true") - :id := "id-142629" + :did := 154258 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-142629" + :did := 154258 :hash-prefix := (hash/prefix hash) :code := "deceased" :v-hash := (codec/v-hash "true"))))) @@ -409,20 +421,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "deceased" "Patient") - [] hash patient)] + (constantly nil) + [] 154315 hash patient)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "deceased" :type := "Patient" :v-hash := (codec/v-hash "true") - :id := "id-142629" + :did := 154315 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-142629" + :did := 154315 :hash-prefix := (hash/prefix hash) :code := "deceased" :v-hash := (codec/v-hash "true")))))) @@ -442,20 +455,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "bodysite" "Specimen") - [] hash specimen)] + (constantly nil) + [] 154350 hash specimen)] (testing "first SearchParamValueResource key is about `code`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "bodysite" :type := "Specimen" :v-hash := (codec/v-hash "code-103812") - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Specimen" - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash) :code := "bodysite" :v-hash := (codec/v-hash "code-103812"))) @@ -465,13 +479,13 @@ :code := "bodysite" :type := "Specimen" :v-hash := (codec/v-hash "system-103824|") - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Specimen" - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash) :code := "bodysite" :v-hash := (codec/v-hash "system-103824|"))) @@ -481,13 +495,13 @@ :code := "bodysite" :type := "Specimen" :v-hash := (codec/v-hash "system-103824|code-103812") - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Specimen" - :id := "id-105153" + :did := 154350 :hash-prefix := (hash/prefix hash) :code := "bodysite" :v-hash := (codec/v-hash "system-103824|code-103812"))))) @@ -503,20 +517,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "class" "Encounter") - [] hash specimen)] + (constantly nil) + [] 154421 hash specimen)] (testing "first SearchParamValueResource key is about `code`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "class" :type := "Encounter" :v-hash := (codec/v-hash "AMB") - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Encounter" - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash) :code := "class" :v-hash := (codec/v-hash "AMB"))) @@ -526,13 +541,13 @@ :code := "class" :type := "Encounter" :v-hash := (codec/v-hash "http://terminology.hl7.org/CodeSystem/v3-ActCode|") - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "Encounter" - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash) :code := "class" :v-hash := (codec/v-hash "http://terminology.hl7.org/CodeSystem/v3-ActCode|"))) @@ -542,13 +557,13 @@ :code := "class" :type := "Encounter" :v-hash := (codec/v-hash "http://terminology.hl7.org/CodeSystem/v3-ActCode|AMB") - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|code`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "Encounter" - :id := "id-105153" + :did := 154421 :hash-prefix := (hash/prefix hash) :code := "class" :v-hash := (codec/v-hash "http://terminology.hl7.org/CodeSystem/v3-ActCode|AMB"))))) @@ -563,20 +578,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "series" "ImagingStudy") - [] hash specimen)] + (constantly nil) + [] 154455 hash specimen)] (testing "SearchParamValueResource key is about `id`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "series" :type := "ImagingStudy" :v-hash := (codec/v-hash "1.2.840.99999999.1.59354388.1582528879516") - :id := "id-105153" + :did := 154455 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "ImagingStudy" - :id := "id-105153" + :did := 154455 :hash-prefix := (hash/prefix hash) :code := "series" :v-hash := (codec/v-hash "1.2.840.99999999.1.59354388.1582528879516"))))) @@ -589,20 +605,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "version" "CodeSystem") - [] hash resource)] + (constantly nil) + [] 154546 hash resource)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "version" :type := "CodeSystem" :v-hash := (codec/v-hash "version-122621") - :id := "id-111846" + :did := 154546 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "CodeSystem" - :id := "id-111846" + :did := 154546 :hash-prefix := (hash/prefix hash) :code := "version" :v-hash := (codec/v-hash "version-122621"))))) @@ -614,11 +631,12 @@ (with-redefs [fhir-path/eval (fn [_ _ _] {::anom/category ::anom/fault})] (given (search-param/index-entries (sr/get search-param-registry "_id" "Patient") - [] hash resource) + (constantly nil) + [] 154605 hash resource) ::anom/category := ::anom/fault)))) (testing "skip warning" - (is (nil? (spt/index-entries "" nil)))))) + (is (nil? (spt/index-entries (constantly nil) "" nil)))))) (defn subject-param [search-param-registry] diff --git a/modules/db/test/blaze/db/impl/search_param/util_spec.clj b/modules/db/test/blaze/db/impl/search_param/util_spec.clj index ce83f70e0..ecd2cae0a 100644 --- a/modules/db/test/blaze/db/impl/search_param/util_spec.clj +++ b/modules/db/test/blaze/db/impl/search_param/util_spec.clj @@ -8,6 +8,7 @@ [blaze.db.impl.search-param.util :as u] [blaze.db.kv.spec] [blaze.db.spec] + [blaze.fhir.spec.spec] [clojure.spec.alpha :as s])) @@ -16,6 +17,11 @@ :ret (s/tuple keyword? string?)) +(s/fdef u/non-deleted-resource-handle + :args (s/cat :resource-handle fn? :tid :blaze.db/tid :did :blaze.db/did) + :ret (s/nilable :blaze.db/resource-handle)) + + (s/fdef u/resource-handle-mapper :args (s/cat :context :blaze.db.impl.batch-db/context :tid :blaze.db/tid)) diff --git a/modules/db/test/blaze/db/impl/search_param_spec.clj b/modules/db/test/blaze/db/impl/search_param_spec.clj index 30014927a..c7864527f 100644 --- a/modules/db/test/blaze/db/impl/search_param_spec.clj +++ b/modules/db/test/blaze/db/impl/search_param_spec.clj @@ -40,7 +40,7 @@ :tid :blaze.db/tid :modifier (s/nilable :blaze.db.search-param/modifier) :values (s/coll-of some? :min-count 1) - :start-id (s/? :blaze.db/id-byte-string)) + :start-did (s/? :blaze.db/did)) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) @@ -49,7 +49,7 @@ :context :blaze.db.impl.batch-db/context :tid :blaze.db/tid :direction :blaze.db.query/sort-direction - :start-id (s/? :blaze.db/id-byte-string)) + :start-did (s/? :blaze.db/did)) :ret (s/coll-of :blaze.db/resource-handle :kind sequential?)) @@ -79,7 +79,9 @@ (s/fdef search-param/index-entries :args (s/cat :search-param :blaze.db/search-param - :linked-compartments (s/nilable (s/coll-of (s/tuple string? string?))) + :resource-id fn? + :linked-compartments (s/nilable (s/coll-of :blaze.db/compartment)) + :did :blaze.db/did :hash :blaze.resource/hash :resource :blaze/resource) :ret (s/or :entries (s/coll-of :blaze.db.kv/put-entry-w-cf :kind sequential?) diff --git a/modules/db/test/blaze/db/impl/search_param_test.clj b/modules/db/test/blaze/db/impl/search_param_test.clj index b59da92a6..e1b9a200a 100644 --- a/modules/db/test/blaze/db/impl/search_param_test.clj +++ b/modules/db/test/blaze/db/impl/search_param_test.clj @@ -65,20 +65,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "_profile" "Patient") - [] hash patient)] + (constantly nil) + [] 201411 hash patient)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "_profile" :type := "Patient" :v-hash := (codec/v-hash "profile-uri-141443") - :id := "id-140855" + :did := 201411 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "Patient" - :id := "id-140855" + :did := 201411 :hash-prefix := (hash/prefix hash) :code := "_profile" :v-hash := (codec/v-hash "profile-uri-141443"))))) @@ -91,7 +92,8 @@ (empty? (search-param/index-entries (sr/get search-param-registry "patient" "Specimen") - [] hash specimen))))) + (constantly nil) + [] 201646 hash specimen))))) (testing "ActivityDefinition url" (let [resource {:fhir/type :fhir/ActivityDefinition @@ -101,20 +103,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "url" "ActivityDefinition") - [] hash resource)] + (constantly nil) + [] 201658 hash resource)] (testing "SearchParamValueResource key" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "url" :type := "ActivityDefinition" :v-hash := (codec/v-hash "url-111854") - :id := "id-111846" + :did := 201658 :hash-prefix := (hash/prefix hash))) (testing "ResourceSearchParamValue key" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "ActivityDefinition" - :id := "id-111846" + :did := 201658 :hash-prefix := (hash/prefix hash) :code := "url" :v-hash := (codec/v-hash "url-111854"))))) @@ -129,20 +132,23 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "item" "List") - [] hash resource)] + (fn [tid id] + (when (and (= (codec/tid "Patient") tid) (= "0" id)) + 181705)) + [] 201714 hash resource)] (testing "first SearchParamValueResource key is about `id`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "item" :type := "List" :v-hash := (codec/v-hash "0") - :id := "id-121825" + :did := 201714 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `id`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "List" - :id := "id-121825" + :did := 201714 :hash-prefix := (hash/prefix hash) :code := "item" :v-hash := (codec/v-hash "0"))) @@ -152,34 +158,32 @@ :code := "item" :type := "List" :v-hash := (codec/v-hash "Patient/0") - :id := "id-121825" + :did := 201714 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `type/id`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "List" - :id := "id-121825" + :did := 201714 :hash-prefix := (hash/prefix hash) :code := "item" :v-hash := (codec/v-hash "Patient/0"))) - (testing "third SearchParamValueResource key is about `tid` and `id`" + (testing "third SearchParamValueResource key is about `tid` and `did`" (given (sp-vr-tu/decode-key-human (bb/wrap k4)) :code := "item" :type := "List" - :v-hash := (codec/tid-id (codec/tid "Patient") - (codec/id-byte-string "0")) - :id := "id-121825" + :v-hash := (codec/tid-did (codec/tid "Patient") 181705) + :did := 201714 :hash-prefix := (hash/prefix hash))) - (testing "third ResourceSearchParamValue key is about `tid` and `id`" + (testing "third ResourceSearchParamValue key is about `tid` and `did`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "List" - :id := "id-121825" + :did := 201714 :hash-prefix := (hash/prefix hash) :code := "item" - :v-hash := (codec/tid-id (codec/tid "Patient") - (codec/id-byte-string "0")))))) + :v-hash := (codec/tid-did (codec/tid "Patient") 181705))))) (testing "with identifier reference" (let [resource {:fhir/type :fhir/List :id "id-123058" @@ -195,20 +199,21 @@ [[_ k0] [_ k1] [_ k2] [_ k3] [_ k4] [_ k5]] (search-param/index-entries (sr/get search-param-registry "item" "List") - [] hash resource)] + (constantly nil) + [] 201800 hash resource)] (testing "first SearchParamValueResource key is about `value`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "item:identifier" :type := "List" :v-hash := (codec/v-hash "value-122931") - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "List" - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash) :code := "item:identifier" :v-hash := (codec/v-hash "value-122931"))) @@ -218,13 +223,13 @@ :code := "item:identifier" :type := "List" :v-hash := (codec/v-hash "system-122917|") - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash))) (testing "second ResourceSearchParamValue key is about `system|`" (given (r-sp-v-tu/decode-key-human (bb/wrap k3)) :type := "List" - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash) :code := "item:identifier" :v-hash := (codec/v-hash "system-122917|"))) @@ -234,13 +239,13 @@ :code := "item:identifier" :type := "List" :v-hash := (codec/v-hash "system-122917|value-122931") - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash))) (testing "third ResourceSearchParamValue key is about `system|value`" (given (r-sp-v-tu/decode-key-human (bb/wrap k5)) :type := "List" - :id := "id-123058" + :did := 201800 :hash-prefix := (hash/prefix hash) :code := "item:identifier" :v-hash := (codec/v-hash "system-122917|value-122931"))))) @@ -256,20 +261,21 @@ [[_ k0] [_ k1]] (search-param/index-entries (sr/get search-param-registry "item" "List") - [] hash resource)] + (constantly nil) + [] 201820 hash resource)] (testing "first SearchParamValueResource key is about `id`" (given (sp-vr-tu/decode-key-human (bb/wrap k0)) :code := "item" :type := "List" :v-hash := (codec/v-hash "http://foo.com/bar-141221") - :id := "id-121825" + :did := 201820 :hash-prefix := (hash/prefix hash))) (testing "first ResourceSearchParamValue key is about `id`" (given (r-sp-v-tu/decode-key-human (bb/wrap k1)) :type := "List" - :id := "id-121825" + :did := 201820 :hash-prefix := (hash/prefix hash) :code := "item" :v-hash := (codec/v-hash "http://foo.com/bar-141221")))))))) diff --git a/modules/db/test/blaze/db/node/resource_indexer_test.clj b/modules/db/test/blaze/db/node/resource_indexer_test.clj index 297f02e50..df86a054e 100644 --- a/modules/db/test/blaze/db/node/resource_indexer_test.clj +++ b/modules/db/test/blaze/db/node/resource_indexer_test.clj @@ -7,6 +7,7 @@ [blaze.db.impl.index.compartment.resource-test-util :as cr-tu] [blaze.db.impl.index.compartment.search-param-value-resource-test-util :as c-sp-vr-tu] + [blaze.db.impl.index.resource-id :as ri] [blaze.db.impl.index.resource-search-param-value-test-util :as r-sp-v-tu] [blaze.db.impl.index.search-param-value-resource-test-util :as sp-vr-tu] [blaze.db.kv :as kv] @@ -134,7 +135,8 @@ :resource-value-index nil :compartment-search-param-value-index nil :compartment-resource-type-index nil - :active-search-params nil}} + :active-search-params nil + :resource-id-index nil}} ::rs/kv {:kv-store (ig/ref :blaze.db/resource-kv-store) @@ -173,6 +175,7 @@ [{:op "put" :type "Patient" :id "0" + :did 193734 :hash hash}] :local-payload {hash patient}}) @@ -196,6 +199,7 @@ [{:op "put" :type "Observation" :id "0" + :did 193724 :hash hash}] :local-payload {hash observation}})) @@ -207,6 +211,7 @@ (with-system [{kv-store [::kv/mem :blaze.db/index-kv-store] resource-store ::rs/kv :blaze.db.node/keys [resource-indexer]} system] + (kv/put! kv-store [(ri/index-entry (codec/tid "Patient") "id-145552" 155044)]) (let [resource {:fhir/type :fhir/Condition :id "id-204446" :code @@ -233,79 +238,67 @@ [{:op "put" :type "Condition" :id "id-204446" + :did 142201 :hash hash}]}) (testing "SearchParamValueResource index" - (is (every? #{["Condition" "id-204446" #blaze/hash-prefix"4AB29C7B"]} + (is (every? #{["Condition" 142201 #blaze/hash-prefix"4AB29C7B"]} (sp-vr-tu/decode-index-entries - kv-store :type :id :hash-prefix))) + kv-store :type :did :hash-prefix))) (is (= (sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] ["patient" (codec/v-hash "id-145552")] - ["patient" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] - + ["patient" (codec/tid-did (codec/tid "Patient") 155044)] ["code" (codec/v-hash "system-204435|code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/v-hash "id-145552")] - ["subject" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] + ["subject" (codec/tid-did (codec/tid "Patient") 155044)] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]]))) (testing "ResourceSearchParamValue index" - (is (every? #{["Condition" "id-204446" #blaze/hash-prefix"4AB29C7B"]} + (is (every? #{["Condition" 142201 #blaze/hash-prefix"4AB29C7B"]} (r-sp-v-tu/decode-index-entries - kv-store :type :id :hash-prefix))) + kv-store :type :did :hash-prefix))) (is (= (r-sp-v-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] ["patient" (codec/v-hash "id-145552")] - ["patient" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] + ["patient" (codec/tid-did (codec/tid "Patient") 155044)] ["code" (codec/v-hash "system-204435|code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/v-hash "id-145552")] - ["subject" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] + ["subject" (codec/tid-did (codec/tid "Patient") 155044)] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]]))) (testing "CompartmentResource index" - (is (= (cr-tu/decode-index-entries kv-store :compartment :type :id) - [[["Patient" "id-145552"] "Condition" "id-204446"]]))) + (is (= (cr-tu/decode-index-entries kv-store :compartment :type :did) + [[["Patient" 155044] "Condition" 142201]]))) (testing "CompartmentSearchParamValueResource index" - (is (every? #{[["Patient" "id-145552"] "Condition" "id-204446" + (is (every? #{[["Patient" 155044] "Condition" 142201 #blaze/hash-prefix"4AB29C7B"]} (c-sp-vr-tu/decode-index-entries - kv-store :compartment :type :id :hash-prefix))) + kv-store :compartment :type :did :hash-prefix))) (is (= (c-sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["patient" (codec/v-hash "Patient/id-145552")] ["patient" (codec/v-hash "id-145552")] - ["patient" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] + ["patient" (codec/tid-did (codec/tid "Patient") 155044)] ["code" (codec/v-hash "system-204435|code-204441")] ["code" (codec/v-hash "system-204435|")] ["code" (codec/v-hash "code-204441")] ["onset-date" (codec-date/encode-range (LocalDate/of 2020 1 30))] ["subject" (codec/v-hash "Patient/id-145552")] ["subject" (codec/v-hash "id-145552")] - ["subject" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-145552"))] + ["subject" (codec/tid-did (codec/tid "Patient") 155044)] ["_profile" (codec/v-hash "url-164445")] ["_id" (codec/v-hash "id-204446")] ["_lastUpdated" #blaze/byte-string"80008001"]])))))) @@ -315,6 +308,7 @@ (with-system [{kv-store [::kv/mem :blaze.db/index-kv-store] resource-store ::rs/kv :blaze.db.node/keys [resource-indexer]} system] + (kv/put! kv-store [(ri/index-entry (codec/tid "Patient") "id-180857" 174950)]) (let [resource {:fhir/type :fhir/Observation :id "id-192702" :status #fhir/code"status-193613" :category @@ -348,12 +342,13 @@ [{:op "put" :type "Observation" :id "id-192702" + :did 193644 :hash hash}]}) (testing "SearchParamValueResource index" - (is (every? #{["Observation" "id-192702" #blaze/hash-prefix"651D1F37"]} + (is (every? #{["Observation" 193644 #blaze/hash-prefix"651D1F37"]} (sp-vr-tu/decode-index-entries - kv-store :type :id :hash-prefix))) + kv-store :type :did :hash-prefix))) (is (= (sp-vr-tu/decode-index-entries kv-store :code :v-hash) [["code-value-quantity" (bs/concat (codec/v-hash "code-193824") @@ -382,9 +377,7 @@ ["category" (codec/v-hash "code-193603")] ["category" (codec/v-hash "system-193558|code-193603")] ["patient" (codec/v-hash "id-180857")] - ["patient" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-180857"))] + ["patient" (codec/tid-did (codec/tid "Patient") 174950)] ["patient" (codec/v-hash "Patient/id-180857")] ["code" (codec/v-hash "code-193824")] ["code" (codec/v-hash "system-193821|")] @@ -422,9 +415,7 @@ ["combo-code-value-quantity" #blaze/byte-string"D47C56F6D0C25BA3F35972C2DDEDDFE6900926"] ["subject" (codec/v-hash "id-180857")] - ["subject" (codec/tid-id - (codec/tid "Patient") - (codec/id-byte-string "id-180857"))] + ["subject" (codec/tid-did (codec/tid "Patient") 174950)] ["subject" (codec/v-hash "Patient/id-180857")] ["status" (codec/v-hash "status-193613")] ["_id" (codec/v-hash "id-192702")] @@ -441,6 +432,7 @@ :tx-cmds [{:op "delete" :type "Patient" + :did 193708 :id "0"}]}) (testing "doesn't index anything" diff --git a/modules/db/test/blaze/db/node/tx_indexer/verify_spec.clj b/modules/db/test/blaze/db/node/tx_indexer/verify_spec.clj index 6e1bc81f4..fc16aa2db 100644 --- a/modules/db/test/blaze/db/node/tx_indexer/verify_spec.clj +++ b/modules/db/test/blaze/db/node/tx_indexer/verify_spec.clj @@ -3,6 +3,7 @@ [blaze.byte-string-spec] [blaze.db.impl.index-spec] [blaze.db.impl.index.resource-as-of-spec] + [blaze.db.impl.index.resource-id-spec] [blaze.db.impl.index.rts-as-of-spec] [blaze.db.impl.index.system-stats-spec] [blaze.db.impl.index.type-stats-spec] @@ -16,5 +17,5 @@ (s/fdef verify/verify-tx-cmds :args (s/cat :db-before :blaze.db/db :t :blaze.db/t :cmds :blaze.db/tx-cmds) - :ret (s/or :entries (s/coll-of :blaze.db.kv/put-entry) + :ret (s/or :res (s/tuple (s/coll-of :blaze.db.kv/put-entry) :blaze.db/tx-cmds) :anomaly ::anom/anomaly)) diff --git a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj index cc0dab231..ca9bffd12 100644 --- a/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj +++ b/modules/db/test/blaze/db/node/tx_indexer/verify_test.clj @@ -3,6 +3,7 @@ [blaze.db.api :as d] [blaze.db.impl.codec :as codec] [blaze.db.impl.index.resource-as-of-test-util :as rao-tu] + [blaze.db.impl.index.resource-id-test-util :as ri-tu] [blaze.db.impl.index.system-as-of-test-util :as sao-tu] [blaze.db.impl.index.system-stats-test-util :as ss-tu] [blaze.db.impl.index.type-as-of-test-util :as tao-tu] @@ -24,7 +25,7 @@ [blaze.log] [blaze.test-util :as tu :refer [with-system]] [clojure.spec.test.alpha :as st] - [clojure.test :as test :refer [deftest is testing]] + [clojure.test :as test :refer [deftest testing]] [cognitect.anomalies :as anom] [juxt.iota :refer [given]] [taoensso.timbre :as log])) @@ -37,8 +38,6 @@ (test/use-fixtures :each tu/fixture) -(def tid-patient (codec/tid "Patient")) - (def patient-0 {:fhir/type :fhir/Patient :id "0"}) (def patient-0-v2 {:fhir/type :fhir/Patient :id "0" :gender #fhir/code"male"}) (def patient-1 {:fhir/type :fhir/Patient :id "1"}) @@ -48,7 +47,8 @@ (deftest verify-tx-cmds-test (testing "adding one patient to an empty store" - (let [hash (hash/generate patient-0)] + (let [did (codec/did 1 0) + hash (hash/generate patient-0)] (doseq [op [:create :put] if-none-match [nil "*"]] (with-system [{:blaze.db/keys [node]} system] @@ -57,28 +57,35 @@ [(cond-> {:op (name op) :type "Patient" :id "0" :hash hash} if-none-match (assoc :if-none-match if-none-match))]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 1} - [0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 1} + [0 0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op op :id "0"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op op :id "0"} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op op :id "0"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op op} + [0 3 0] := :resource-id-index + [0 3 1 ri-tu/decode-key] := {:type "Patient" :id "0"} + [0 3 2 ri-tu/decode-val] := {:did did} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 1} - [3 2 ts-tu/decode-val] := {:total 1 :num-changes 1} + [0 4 0] := :type-stats-index + [0 4 1 ts-tu/decode-key] := {:type "Patient" :t 1} + [0 4 2 ts-tu/decode-val] := {:total 1 :num-changes 1} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 1} - [4 2 ss-tu/decode-val] := {:total 1 :num-changes 1}))))) + [0 5 0] := :system-stats-index + [0 5 1 ss-tu/decode-key] := {:t 1} + [0 5 2 ss-tu/decode-val] := {:total 1 :num-changes 1} + + [1 0 :did] := did))))) (testing "adding a second version of a patient to a store containing it already" - (let [hash (hash/generate patient-0-v2)] + (let [did (codec/did 1 0) + hash (hash/generate patient-0-v2)] (doseq [if-match [nil 1]] (with-system-data [{:blaze.db/keys [node]} system] [[[:put patient-0]]] @@ -88,132 +95,154 @@ [(cond-> {:op "put" :type "Patient" :id "0" :hash hash} if-match (assoc :if-match if-match))]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} - [0 2 rao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 2} + [0 0 2 rao-tu/decode-val] := {:hash hash :num-changes 2 :op :put :id "0"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash :num-changes 2 :op :put :id "0"} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash :num-changes 2 :op :put :id "0"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash :num-changes 2 :op :put} + [0 3 0] := :type-stats-index + [0 3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [0 3 2 ts-tu/decode-val] := {:total 1 :num-changes 2} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} - [3 2 ts-tu/decode-val] := {:total 1 :num-changes 2} + [0 4 0] := :system-stats-index + [0 4 1 ss-tu/decode-key] := {:t 2} + [0 4 2 ss-tu/decode-val] := {:total 1 :num-changes 2} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 2} - [4 2 ss-tu/decode-val] := {:total 1 :num-changes 2}))))) + [1 0 :did] := did))))) (testing "deleting a patient from an empty store" - (with-system [{:blaze.db/keys [node]} system] - (given (verify/verify-tx-cmds - (d/db node) 1 - [{:op "delete" :type "Patient" :id "0"}]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 1} - [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete} - - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 1} - [3 2 ts-tu/decode-val] := {:total 0 :num-changes 1} - - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 1} - [4 2 ss-tu/decode-val] := {:total 0 :num-changes 1}))) + (let [did (codec/did 1 0)] + (with-system [{:blaze.db/keys [node]} system] + (given (verify/verify-tx-cmds + (d/db node) 1 + [{:op "delete" :type "Patient" :id "0"}]) + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 1} + [0 0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete :id "0"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 1 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete :id "0"} + + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 1 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 1 :op :delete :id "0"} + + [0 3 0] := :resource-id-index + [0 3 1 ri-tu/decode-key] := {:type "Patient" :id "0"} + [0 3 2 ri-tu/decode-val] := {:did did} + + [0 4 0] := :type-stats-index + [0 4 1 ts-tu/decode-key] := {:type "Patient" :t 1} + [0 4 2 ts-tu/decode-val] := {:total 0 :num-changes 1} + + [0 5 0] := :system-stats-index + [0 5 1 ss-tu/decode-key] := {:t 1} + [0 5 2 ss-tu/decode-val] := {:total 0 :num-changes 1} + + [1] :? empty?)))) (testing "deleting an already deleted patient" - (with-system-data [{:blaze.db/keys [node]} system] - [[[:delete "Patient" "0"]]] + (let [did (codec/did 1 0)] + (with-system-data [{:blaze.db/keys [node]} system] + [[[:delete "Patient" "0"]]] + + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "delete" :type "Patient" :id "0"}]) + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 2} + [0 0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} - (given (verify/verify-tx-cmds - (d/db node) 2 - [{:op "delete" :type "Patient" :id "0"}]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} - [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + [0 3 0] := :type-stats-index + [0 3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [0 3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} - [3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} + [0 4 0] := :system-stats-index + [0 4 1 ss-tu/decode-key] := {:t 2} + [0 4 2 ss-tu/decode-val] := {:total 0 :num-changes 2} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 2} - [4 2 ss-tu/decode-val] := {:total 0 :num-changes 2}))) + [1] :? empty?)))) (testing "deleting an existing patient" - (with-system-data [{:blaze.db/keys [node]} system] + (let [did (codec/did 1 0)] + (with-system-data [{:blaze.db/keys [node]} system] [[[:put patient-0]]] - (given (verify/verify-tx-cmds - (d/db node) 2 - [{:op "delete" :type "Patient" :id "0"}]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 2} - [0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "delete" :type "Patient" :id "0"}]) + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 2} + [0 0 2 rao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete :id "0"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash/deleted-hash :num-changes 2 :op :delete} + [0 3 0] := :type-stats-index + [0 3 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [0 3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} - [3 2 ts-tu/decode-val] := {:total 0 :num-changes 2} + [0 4 0] := :system-stats-index + [0 4 1 ss-tu/decode-key] := {:t 2} + [0 4 2 ss-tu/decode-val] := {:total 0 :num-changes 2} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 2} - [4 2 ss-tu/decode-val] := {:total 0 :num-changes 2}))) + [1] :? empty?)))) (testing "adding a second patient to a store containing already one" - (let [hash (hash/generate patient-1)] + (let [did (codec/did 2 0) + hash (hash/generate patient-1)] (with-system-data [{:blaze.db/keys [node]} system] [[[:put patient-0]]] (given (verify/verify-tx-cmds (d/db node) 2 [{:op "put" :type "Patient" :id "1" :hash hash}]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "1" :t 2} - [0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 2} + [0 0 2 rao-tu/decode-val] := {:hash hash :num-changes 1 :op :put :id "1"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op :put :id "1"} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 2 :id "1"} - [1 2 tao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op :put :id "1"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 2 :type "Patient" :id "1"} - [2 2 sao-tu/decode-val] := {:hash hash :num-changes 1 :op :put} + [0 3 0] := :resource-id-index + [0 3 1 ri-tu/decode-key] := {:type "Patient" :id "1"} + [0 3 2 ri-tu/decode-val] := {:did did} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 2} - [3 2 ts-tu/decode-val] := {:total 2 :num-changes 2} + [0 4 0] := :type-stats-index + [0 4 1 ts-tu/decode-key] := {:type "Patient" :t 2} + [0 4 2 ts-tu/decode-val] := {:total 2 :num-changes 2} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 2} - [4 2 ss-tu/decode-val] := {:total 2 :num-changes 2})))) + [0 5 0] := :system-stats-index + [0 5 1 ss-tu/decode-key] := {:t 2} + [0 5 2 ss-tu/decode-val] := {:total 2 :num-changes 2} + + [1 0 :did] := did)))) (testing "update conflict" (testing "using non-matching if-match" @@ -276,13 +305,13 @@ (with-system-data [{:blaze.db/keys [node]} system] [[[:put patient-2]]] - (is - (empty? - (verify/verify-tx-cmds - (d/db node) 2 - [{:op "create" :type "Patient" :id "0" - :hash (hash/generate patient-0) - :if-none-exist [["identifier" "120426"]]}]))))) + (given (verify/verify-tx-cmds + (d/db node) 2 + [{:op "create" :type "Patient" :id "0" + :hash (hash/generate patient-0) + :if-none-exist [["identifier" "120426"]]}]) + [0] :? empty? + [1] :? empty?))) (testing "conflict because matching resource is deleted" (with-system-data [{:blaze.db/keys [node]} system] @@ -299,7 +328,8 @@ ::anom/message := "Duplicate transaction commands `create Patient?identifier=120426 (resolved to id 2)` and `delete Patient/2`."))) (testing "on recreation" - (let [hash (hash/generate patient-0)] + (let [did (codec/did 1 0) + hash (hash/generate patient-0)] (with-system-data [{:blaze.db/keys [node]} system] [[[:put patient-0]] [[:delete "Patient" "0"]]] @@ -307,22 +337,25 @@ (given (verify/verify-tx-cmds (d/db node) 3 [{:op "put" :type "Patient" :id "0" :hash hash}]) - [0 0] := :resource-as-of-index - [0 1 rao-tu/decode-key] := {:type "Patient" :id "0" :t 3} - [0 2 rao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} - [1 0] := :type-as-of-index - [1 1 tao-tu/decode-key] := {:type "Patient" :t 3 :id "0"} - [1 2 tao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} + [0 0 0] := :resource-as-of-index + [0 0 1 rao-tu/decode-key] := {:type "Patient" :did did :t 3} + [0 0 2 rao-tu/decode-val] := {:hash hash :num-changes 3 :op :put :id "0"} + + [0 1 0] := :type-as-of-index + [0 1 1 tao-tu/decode-key] := {:type "Patient" :t 3 :did did} + [0 1 2 tao-tu/decode-val] := {:hash hash :num-changes 3 :op :put :id "0"} + + [0 2 0] := :system-as-of-index + [0 2 1 sao-tu/decode-key] := {:t 3 :type "Patient" :did did} + [0 2 2 sao-tu/decode-val] := {:hash hash :num-changes 3 :op :put :id "0"} - [2 0] := :system-as-of-index - [2 1 sao-tu/decode-key] := {:t 3 :type "Patient" :id "0"} - [2 2 sao-tu/decode-val] := {:hash hash :num-changes 3 :op :put} + [0 3 0] := :type-stats-index + [0 3 1 ts-tu/decode-key] := {:type "Patient" :t 3} + [0 3 2 ts-tu/decode-val] := {:total 1 :num-changes 3} - [3 0] := :type-stats-index - [3 1 ts-tu/decode-key] := {:type "Patient" :t 3} - [3 2 ts-tu/decode-val] := {:total 1 :num-changes 3} + [0 4 0] := :system-stats-index + [0 4 1 ss-tu/decode-key] := {:t 3} + [0 4 2 ss-tu/decode-val] := {:total 1 :num-changes 3} - [4 0] := :system-stats-index - [4 1 ss-tu/decode-key] := {:t 3} - [4 2 ss-tu/decode-val] := {:total 1 :num-changes 3})))))) + [1 0 :did] := did)))))) diff --git a/modules/db/test/blaze/db/node_test.clj b/modules/db/test/blaze/db/node_test.clj index 213850611..333a7903e 100644 --- a/modules/db/test/blaze/db/node_test.clj +++ b/modules/db/test/blaze/db/node_test.clj @@ -179,7 +179,7 @@ (given-thrown (ig/init (with-index-store-version system 0)) :key := :blaze.db/node :reason := ::ig/build-threw-exception - [:cause-data :expected-version] := 1 + [:cause-data :expected-version] := 2 [:cause-data :actual-version] := 0))) @@ -274,10 +274,10 @@ (deftest existing-data-with-compatible-version - (with-system [{:blaze.db/keys [node]} (with-index-store-version system 1)] + (with-system [{:blaze.db/keys [node]} (with-index-store-version system 2)] (is node))) (deftest sets-db-version-on-startup (with-system [{kv-store [::kv/mem :blaze.db/index-kv-store]} system] - (is (= 1 (version/get kv-store))))) + (is (= 2 (version/get kv-store))))) diff --git a/modules/db/test/blaze/db/test_util.clj b/modules/db/test/blaze/db/test_util.clj index e7f082417..aa3127d78 100644 --- a/modules/db/test/blaze/db/test_util.clj +++ b/modules/db/test/blaze/db/test_util.clj @@ -38,7 +38,8 @@ :blaze.test/fixed-clock {} :blaze.test/system-clock {} - :blaze.db/resource-handle-cache {} + :blaze.db/resource-handle-cache + {:max-size 1000} :blaze.db/tx-cache {:kv-store (ig/ref :blaze.db/index-kv-store)} @@ -55,6 +56,7 @@ :tx-success-index {:reverse-comparator? true} :tx-error-index nil :t-by-instant-index {:reverse-comparator? true} + :resource-id-index nil :resource-as-of-index nil :type-as-of-index nil :system-as-of-index nil diff --git a/modules/interaction/test/blaze/interaction/search/include_test.clj b/modules/interaction/test/blaze/interaction/search/include_test.clj index ec54e9f67..974de1d50 100644 --- a/modules/interaction/test/blaze/interaction/search/include_test.clj +++ b/modules/interaction/test/blaze/interaction/search/include_test.clj @@ -38,7 +38,9 @@ count := 1 [0 fhir-spec/fhir-type] := :fhir/Patient)))) - (testing "not enforcing referential integrity" + ;; TODO: we have to add to the ResourceSearchParamValue index of the observation in the transaction creating the patient + ;; TODO: add this test to blaze.db.api-test + #_(testing "not enforcing referential integrity" (with-system-data [{:blaze.db/keys [node]} non-ref-int-system] [[[:put {:fhir/type :fhir/Observation :id "0" :subject diff --git a/modules/interaction/test/blaze/interaction/search_type_test.clj b/modules/interaction/test/blaze/interaction/search_type_test.clj index c3993bb34..8df6b3253 100644 --- a/modules/interaction/test/blaze/interaction/search_type_test.clj +++ b/modules/interaction/test/blaze/interaction/search_type_test.clj @@ -1871,16 +1871,16 @@ [:resource :fhir/type] := :fhir/Observation [:search :mode] := #fhir/code"match")) - (testing "the second entry is the included Encounter" - (given (-> body :entry (nth 2)) - :fullUrl := #fhir/uri"base-url-113047/Encounter/1" - [:resource :fhir/type] := :fhir/Encounter - [:search :mode] := #fhir/code"include")) - - (testing "the third entry is the included Patient" + (testing "the second entry is the included Patient" (given (-> body :entry second) :fullUrl := #fhir/uri"base-url-113047/Patient/0" [:resource :fhir/type] := :fhir/Patient + [:search :mode] := #fhir/code"include")) + + (testing "the third entry is the included Encounter" + (given (-> body :entry (nth 2)) + :fullUrl := #fhir/uri"base-url-113047/Encounter/1" + [:resource :fhir/type] := :fhir/Encounter [:search :mode] := #fhir/code"include"))))) (testing "with paging" @@ -2007,16 +2007,16 @@ [:resource :fhir/type] := :fhir/MedicationStatement [:search :mode] := #fhir/code"match")) - (testing "the second entry is the included Organization" + (testing "the second entry is the included Medication" (given (-> body :entry second) - :fullUrl := #fhir/uri"base-url-113047/Organization/0" - [:resource :fhir/type] := :fhir/Organization + :fullUrl := #fhir/uri"base-url-113047/Medication/0" + [:resource :fhir/type] := :fhir/Medication [:search :mode] := #fhir/code"include")) - (testing "the third entry is the included Medication" + (testing "the third entry is the included Organization" (given (-> body :entry (nth 2)) - :fullUrl := #fhir/uri"base-url-113047/Medication/0" - [:resource :fhir/type] := :fhir/Medication + :fullUrl := #fhir/uri"base-url-113047/Organization/0" + [:resource :fhir/type] := :fhir/Organization [:search :mode] := #fhir/code"include"))))) (testing "non-iterative include doesn't work iterative" diff --git a/profiling/blaze/profiling.clj b/profiling/blaze/profiling.clj index da2830ee6..34fe9339c 100644 --- a/profiling/blaze/profiling.clj +++ b/profiling/blaze/profiling.clj @@ -73,6 +73,7 @@ (rocksdb/get-property index-db :tx-success-index "rocksdb.stats") (rocksdb/get-property index-db :tx-error-index "rocksdb.stats") (rocksdb/get-property index-db :t-by-instant-index "rocksdb.stats") + (rocksdb/get-property index-db :resource-id-index "rocksdb.stats") (rocksdb/get-property index-db :resource-as-of-index "rocksdb.stats") (rocksdb/get-property index-db :type-as-of-index "rocksdb.stats") (rocksdb/get-property index-db :system-as-of-index "rocksdb.stats") diff --git a/resources/blaze.edn b/resources/blaze.edn index cefedce07..21e9a1ec9 100644 --- a/resources/blaze.edn +++ b/resources/blaze.edn @@ -284,6 +284,7 @@ :tx-success-index {:reverse-comparator? true} :tx-error-index nil :t-by-instant-index {:reverse-comparator? true} + :resource-id-index nil :resource-as-of-index nil :type-as-of-index nil :system-as-of-index nil @@ -408,6 +409,12 @@ :block-size #blaze/cfg ["DB_BLOCK_SIZE" int? 16384] :reverse-comparator? true} + :resource-id-index + {:write-buffer-size-in-mb 4 + :max-bytes-for-level-base-in-mb 16 + :target-file-size-base-in-mb 4 + :block-size #blaze/cfg ["DB_BLOCK_SIZE" int? 16384]} + :resource-as-of-index {:write-buffer-size-in-mb 8 :max-bytes-for-level-base-in-mb 32 @@ -599,6 +606,12 @@ :block-size #blaze/cfg ["DB_BLOCK_SIZE" int? 16384] :reverse-comparator? true} + :resource-id-index + {:write-buffer-size-in-mb 4 + :max-bytes-for-level-base-in-mb 16 + :target-file-size-base-in-mb 4 + :block-size #blaze/cfg ["DB_BLOCK_SIZE" int? 16384]} + :resource-as-of-index {:write-buffer-size-in-mb 8 :max-bytes-for-level-base-in-mb 32

ZC=>h_Rf`A|( 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ⓈwF5{(6$( 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�_KsSbyb$0e`2eANDB;AaK-Yx*Ks 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Ν$)D_xtv@;1%l1w< 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.k`-9HWC>AQYU*W|UX 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 z%0A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