Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 6 additions & 12 deletions .github/scripts/evaluate-measure-param.sh
Original file line number Diff line number Diff line change
@@ -1,22 +1,16 @@
#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
. "$SCRIPT_DIR/util.sh"

BASE="http://localhost:8080/fhir"
NAME="$1"
PARAM_NAME="$2"
PARAM_VALUE="$3"
EXPECTED_COUNT="$4"

if ! REPORT=$(./blazectl --server "$BASE" evaluate-measure --parameter "$PARAM_NAME=$PARAM_VALUE" ".github/scripts/cql/$NAME.yml"); then
echo "Measure evaluation failed: $REPORT"
exit 1
fi

COUNT=$(echo "$REPORT" | jq '.group[0].population[0].count')
REPORT=$(evaluate_measure --parameter "$PARAM_NAME=$PARAM_VALUE" ".github/scripts/cql/$NAME.yml")
check_population_count "measure file with $PARAM_NAME = $PARAM_VALUE" "$REPORT" "$EXPECTED_COUNT"

if [ "$COUNT" = "$EXPECTED_COUNT" ]; then
echo "✅ count ($COUNT) equals the expected count for $PARAM_NAME = $PARAM_VALUE"
else
echo "🆘 count ($COUNT) != $EXPECTED_COUNT for $PARAM_NAME = $PARAM_VALUE"
exit 1
fi
evaluate_existing_measure "$REPORT" "$EXPECTED_COUNT" --parameter "$PARAM_NAME=$PARAM_VALUE"
20 changes: 7 additions & 13 deletions .github/scripts/evaluate-measure-stratifier.sh
Original file line number Diff line number Diff line change
@@ -1,23 +1,15 @@
#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
. "$SCRIPT_DIR/util.sh"

BASE="http://localhost:8080/fhir"
NAME="$1"
EXPECTED_COUNT="$2"

if ! REPORT=$(./blazectl --server "$BASE" evaluate-measure ".github/scripts/cql/$NAME.yml"); then
echo "Measure evaluation failed: $REPORT"
exit 1
fi

COUNT=$(echo "$REPORT" | jq '.group[0].population[0].count')

if [ "$COUNT" = "$EXPECTED_COUNT" ]; then
echo "✅ count ($COUNT) equals the expected count"
else
echo "🆘 count ($COUNT) != $EXPECTED_COUNT"
exit 1
fi
REPORT=$(evaluate_measure ".github/scripts/cql/$NAME.yml")
check_population_count "measure file" "$REPORT" "$EXPECTED_COUNT"

STRATIFIER_DATA=$(echo "$REPORT" | jq -r '.group[0].stratifier[0].stratum[] | [.value.text, .population[0].count] | @csv' | sort)
EXPECTED_STRATIFIER_DATA=$(cat ".github/scripts/cql/$NAME.csv")
Expand All @@ -29,3 +21,5 @@ else
echo "$STRATIFIER_DATA"
exit 1
fi

evaluate_existing_measure "$REPORT" "$EXPECTED_COUNT"
18 changes: 6 additions & 12 deletions .github/scripts/evaluate-measure.sh
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
#!/bin/bash
set -euo pipefail

SCRIPT_DIR="$(dirname "$(readlink -f "$0")")"
. "$SCRIPT_DIR/util.sh"

BASE="http://localhost:8080/fhir"
NAME="$1"
EXPECTED_COUNT="$2"

if ! REPORT=$(./blazectl --server "$BASE" evaluate-measure ".github/scripts/cql/$NAME.yml"); then
echo "Measure evaluation failed: $REPORT"
exit 1
fi

COUNT=$(echo "$REPORT" | jq '.group[0].population[0].count')
REPORT=$(evaluate_measure ".github/scripts/cql/$NAME.yml")
check_population_count "measure file" "$REPORT" "$EXPECTED_COUNT"

if [ "$COUNT" = "$EXPECTED_COUNT" ]; then
echo "✅ count ($COUNT) equals the expected count"
else
echo "🆘 count ($COUNT) != $EXPECTED_COUNT"
exit 1
fi
evaluate_existing_measure "$REPORT" "$EXPECTED_COUNT"
50 changes: 50 additions & 0 deletions .github/scripts/util.sh
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,53 @@ transact() {
transact_return_representation() {
curl -s -H 'Accept: application/fhir+json' -H "Content-Type: application/fhir+json" -H "Prefer: return=representation" -d @- "$1"
}

# Evaluates a measure with the given blazectl evaluate-measure arguments and
# prints the resulting MeasureReport.
evaluate_measure() {
local report
if ! report=$(./blazectl --server "$BASE" evaluate-measure "$@"); then
echo "Measure evaluation failed: $report" >&2
exit 1
fi
echo "$report"
}

# Checks that the initial population count of the given MeasureReport matches
# the expected count.
check_population_count() {
local desc="$1"
local report="$2"
local expected_count="$3"
local count
count=$(echo "$report" | jq '.group[0].population[0].count')
if [ "$count" = "$expected_count" ]; then
echo "✅ $desc: count ($count) equals the expected count"
else
echo "🆘 $desc: count ($count) != $expected_count"
exit 1
fi
}

# Finds the resource ID of the Measure with the given canonical URL.
measure_id() {
curl -s -H 'Accept: application/fhir+json' "$BASE/Measure?url=$1" | jq -r '.entry[0].resource.id'
}

# Evaluates the existing Measure referenced by the given MeasureReport again,
# once by its canonical URL and once by its resource ID, checking the initial
# population count each time. Additional blazectl evaluate-measure arguments
# can be given after the expected count.
evaluate_existing_measure() {
local report="$1"
local expected_count="$2"
shift 2
local measure_url url_report
measure_url=$(echo "$report" | jq -r '.measure')
url_report=$(evaluate_measure --measure-url "$measure_url" "$@")
check_population_count "existing measure with canonical URL $measure_url" "$url_report" "$expected_count"
local measure_id id_report
measure_id=$(measure_id "$measure_url")
id_report=$(evaluate_measure --measure-id "$measure_id" "$@")
check_population_count "existing measure with ID $measure_id" "$id_report" "$expected_count"
}
16 changes: 16 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,22 @@ blazectl evaluate-measure --server "http://localhost:8080/fhir" \

When at least one parameter is given, the operation is invoked via `POST` with a FHIR `Parameters` body, because the `parameters` input of `$evaluate-measure` cannot be transmitted as a GET query parameter.

Instead of a measure file, an existing Measure on the server can be evaluated. In that case no resources are created. The Measure is referenced either by its canonical URL with the `--measure-url` flag:

```sh
blazectl evaluate-measure --server "http://localhost:8080/fhir" \
--measure-url "https://example.com/fhir/Measure/example"
```

or by its resource ID with the `--measure-id` flag:

```sh
blazectl evaluate-measure --server "http://localhost:8080/fhir" \
--measure-id DACG22F3LKPU7ZZ5
```

The measure file argument and the `--measure-url` and `--measure-id` flags are mutually exclusive. The `--parameter` flag works the same for existing measures.

More comprehensive documentation can be found in the [Blaze CQL Queries Documentation][9].

### Render Report
Expand Down
Loading