cql-sdk
Install from PyPI:
pip install ms-cql-sdkPublished at https://pypi.org/project/ms-cql-sdk/. The Python import name remains
cql_sdk.
A Python SDK that compiles Clinical Quality Language (CQL) definitions to parameterized PostgreSQL SQL and executes them over FHIR R4 resources stored as JSONB. ELM remains an internal compiler representation and a compatibility surface for existing consumers.
What's new in 0.7.1
- PostgreSQL property compilation now expands FHIR choice roots to their
concrete JSON fields, including
effectiveDateTime,valueQuantity,onsetDateTime, andperformedPeriod. - Choice expansion matches the existing in-memory runtime while ordinary FHIR properties retain compact SQL.
- Live validation covers the ePC-02 gestational-age Observation predicates against PostgreSQL-backed FHIR JSONB data.
What's new in 0.7.0
PostgresCompilertranslates CQL/ELM definitions to parameterized SQL.PostgresExecutorruns definitions against PostgreSQL 16.PostgresFHIRStoreinitializes the FHIR JSONB schema, atomically replaces patient Bundles, and loads the bundled expanded ValueSets.- All definitions in the platform's CMS122v11, CMS165v9, and ePC-02 measures compile and execute as SQL.
- The prior in-memory Python ELM runtime remains available for compatibility.
Disclaimer
This SDK is provided as-is under the MIT license. It is a general purpose CQL/ELM execution toolkit and does not include or grant any rights to third-party measure specifications, value sets, or code systems.
If you use this SDK to compute HEDIS® measures in production, you are responsible for obtaining the appropriate license from NCQA. HEDIS is a registered trademark of the National Committee for Quality Assurance (NCQA). See https://www.ncqa.org/hedis/measures/ for measure licensing terms.
The same applies to other proprietary measure stewards (for example, CMS eCQM artifacts may have their own usage terms, and any LOINC, SNOMED CT, RxNorm, ICD, or CPT content carries its own licensing).
What's new in 0.6.1
- README: surface the 0.6.0 release notes on the PyPI project page (no code changes).
What's new in 0.6.0
- Expanded CQL → ELM front-end for parity with common Firely CQL SDK
constructs:
DateTimeliterals with timezone offsets (Z,+hh:mm,-hh:mm).- The
X between low and highrange operator. - Conditional expressions:
if ... then ... else ...andcase ... when ... then ... [else ...] end. duration in <precision> betweenanddifference in <precision> between.- Model-qualified cast types such as
X as FHIR.dateTime. - Function-call forms
Exists(...),Now(),Today().
- Runtime additions:
Now,Today,DurationBetweenandDifferenceBetweenoperators, plus case-insensitiveascoercion for FHIR primitive types.
What's new in 0.5.0
- DQM (FHIR / QI-Core) measure package evaluation via the new
cql_sdk.dqmpackage: a FHIRMeasureresource model, QI-Core profile model-info, an ELM-first multi-libraryMeasurePackageloader, and proportion scoring for both patient (boolean) and episode-of-care (Encounter) basis. - Runtime additions: list set operations (
Union/Except/Intersect), value-set membership (InValueSet/AnyInValueSet), user-defined function parameter binding (OperandRef), and querywith/withoutrelationships. - New public API:
load_measure_package/evaluate_measure_package.
What's new in 0.4.3
- License changed from Apache-2.0 to MIT.
- Added Origins and Attribution, Acknowledgements, and Relationship to Firely CQL SDK sections to README.
What's new in 0.4.2
- Project URL metadata now points at the canonical
github.com/microsoft/azure-healthcare-digital-quality-cql-sdkrepository. - Added Disclaimer section covering HEDIS® / NCQA licensing responsibilities for production use, and a note on third-party terminology content (LOINC, SNOMED CT, RxNorm, ICD, CPT).
What's new in 0.4.1
- README: surface the 0.3.0 and 0.4.0 release notes on the PyPI project page (no code changes).
What's new in 0.4.0
- Spark adapter fix:
SparkInvocation.runnow uses the library registered viafrom_elm_pathinstead of the first entry in the toolkit registry, which was the auto-registered syntheticFHIRHelpers. FixesKeyError: "Definition '<name>' not found in library 'FHIRHelpers|4.0.1'.". SparkInvocationaccepts an explicitdefault_library_identifierfor callers constructing the toolkit directly.
What's new in 0.3.0
- Invocation toolkit auto-registers a synthetic
FHIRHelperslibrary so measures thatinclude FHIRHelpersresolve without an extra step. - Public API consolidation around
InvocationToolkit(register,has,validate,invoke) as the preferred entry point. - Library registry de-duplicates
idandid|versionkeys during iteration.
What's new in 0.2.1
- Internal: ruff and mypy
--strictare now both clean (parser/translator refactors broke long lines into helpers, no behavior change). Aligns the package with the CI gates so downstream forks pass on a clean checkout.
What's new in 0.2.0
- Pure-Python CQL → ELM front end under
cql_sdk.compiler.cql_to_elm— no Java required. Covers the CQL 1.5 subset used by typical CMS eCQM measures: library/using/include/codesystem/valueset/code/parameter/context/define, retrieves and queries with where/sort/return, all standard arithmetic and comparison operators, interval/list literals, casts, and fluent function calls (X.extension("...")). - New public API:
cql_sdk.api.load_library_from_cqlandload_library_from_cql_text. - New CLI command:
cql-sdk compile <CQL_FILE> [--output ELM.json].
Why this SDK
- PostgreSQL-native execution for set-based clinical quality evaluation.
- Parameterized SQL over an indexed FHIR JSONB and terminology schema.
- Pure-Python CQL parser with ELM used as an internal intermediate form.
- Optional FHIR integration (retrieval, type conversion, terminology).
- Optional Spark / Microsoft Fabric integration (the same core package runs unchanged in both environments).
- A Typer-based CLI for inspecting, validating, packaging and running ELM.
- Designed around pre-generated ELM artifacts as a first-class workflow — no Java/CQL-to-ELM toolchain is required for normal execution.
Package layering
cql_sdk
├── abstractions/ # Protocols / ABCs for operators, terminology, data, packaging
├── elm/ # ELM model + (de)serialization
├── runtime/ # RuntimeContext, operators, comparers, intervals, datetime
├── compiler/ # Expression planner, bindings, type manager
├── invocation/ # High-level toolkit / invoker / library registry (PUBLIC API)
├── fhir/ # Optional FHIR adapters
├── postgres/ # CQL-to-SQL compiler, executor, schema, and FHIR store
├── spark/ # Optional Spark / Fabric adapters
├── packaging/ # Library + resource packaging primitives
├── cli/ # Typer CLI (`cql-sdk`)
└── api.py # Top-level convenience facade (PUBLIC API)
The invocation toolkit and cql_sdk.api are the
preferred entry points. Internal modules (compiler, low-level runtime) are
available but not the recommended consumption path.
Quick start
Install (base)
uv sync
Install with optional extras
uv sync --extra fhir
uv sync --extra postgres # pulls pg8000; required for PostgreSQL execution
uv sync --extra spark # pulls pyspark; not required for base install
uv sync --extra dev --extra test
Run the local hello-world example
uv run python examples/hello_world/run.py
Load ELM and invoke a definition (Python)
from cql_sdk.api import load_library, invoke
library = load_library("examples/hello_world/HelloWorld.elm.json")
result = invoke(library, definition="Greeting")
print(result)
Compile a CQL source file (no Java required)
from cql_sdk.api import load_library_from_cql
library = load_library_from_cql("path/to/Measure.cql")
print(library.identifier) # CMS122|11
print(list(library.definitions)) # ['Initial Population', 'Numerator', ...]
Or get the raw ELM JSON via the lower-level entry point:
from cql_sdk.compiler.cql_to_elm import compile_file
elm = compile_file("path/to/Measure.cql")
Execute CQL on PostgreSQL
from cql_sdk.api import execute_library_on_postgres, load_library_from_cql
from cql_sdk.postgres import PostgresFHIRStore
database_url = "postgresql://dq@localhost:5432/dq"
# Set PGPASSWORD through the process environment or a secret provider.
store = PostgresFHIRStore(database_url=database_url)
store.initialize()
store.load_value_sets()
store.replace_patient_bundle("patient-1", bundle)
library = load_library_from_cql("path/to/Measure.cql")
result = execute_library_on_postgres(
library,
definition="Initial Population",
database_url=database_url,
patient_id="patient-1",
parameters={"Measurement Period": (period_start, period_end)},
)
Use compile_cql_to_sql(...) when SQL generation is needed without execution.
All literal values, patient identifiers, JSON paths, and terminology values
are emitted as bind parameters.
Use the CLI
uv run cql-sdk compile path/to/Measure.cql --output dist/Measure.elm.json
uv run cql-sdk inspect examples/hello_world/HelloWorld.elm.json
uv run cql-sdk validate examples/hello_world/HelloWorld.elm.json
uv run cql-sdk run examples/hello_world/HelloWorld.elm.json --definition Greeting
uv run cql-sdk package examples/hello_world --output dist/packages
Spark / Fabric usage
Spark support is opt-in:
uv sync --extra spark
from pyspark.sql import SparkSession
from cql_sdk.spark import SparkInvocation
spark = SparkSession.builder.getOrCreate()
invocation = SparkInvocation.from_elm_path(
"examples/hello_world/HelloWorld.elm.json", spark=spark
)
df = invocation.run(definition="Greeting")
df.show()
Core modules never import pyspark — importing cql_sdk.spark is the only
place Spark is required.
Development
uv sync --extra dev --extra test
uv run ruff check .
uv run mypy
uv run pytest -m "not spark"
uv run pytest -m spark # requires `--extra spark`
See docs/development.md for more.
Documentation
License
MIT. See LICENSE.
This license covers the SDK source code only. It does not grant rights to HEDIS® measure specifications (license from NCQA required for production use, see the Disclaimer section), nor to any third-party terminology content (LOINC, SNOMED CT, RxNorm, ICD, CPT, etc.).
Origins and Attribution
This project was inspired by and derived from concepts demonstrated in the Firely and NCQA CQL SDK project:
The Firely CQL SDK is NCQA's and Firely's official SDK for working with Clinical Quality Language (CQL) on the .NET platform.
The Microsoft Azure Healthcare Digital Quality CQL SDK extends these concepts to support additional healthcare analytics scenarios, including cloud-native execution patterns, Python interoperability, Spark/Fabric integration, and Azure-based deployment models.
We are grateful to Firely and NCQA for their contributions to the CQL ecosystem and for advancing interoperable clinical quality measurement technologies.
The original Firely project and its contributors retain ownership of their respective intellectual property and code contributions. Please refer to the upstream repository for additional details and licensing information.
Relationship to Firely CQL SDK
This project is not a drop-in replacement for the Firely CQL SDK.
While portions of the architecture, compiler design concepts, and CQL execution patterns were informed by the Firely implementation, this SDK introduces additional capabilities focused on analytics, distributed execution, cloud-native deployment, and modern healthcare data platform integration.
Acknowledgements
Special thanks to:
- Firely
- NCQA
- HL7 Clinical Quality Language (CQL) Community
- FHIR Community Contributors
for advancing standards-based clinical quality measurement and interoperability.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ms_cql_sdk-0.7.1.tar.gz.
File metadata
- Download URL: ms_cql_sdk-0.7.1.tar.gz
- Upload date:
- Size: 96.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb00d7acc3f06eea37d3ec79e719f7f7a1ae0ff0bfe0e268a3ae24499e2b7626
|
|
| MD5 |
f77404f800275a1b8d21aecc04083c4b
|
|
| BLAKE2b-256 |
432b5f927539e2d62455b75b1d67a656804187ecc56050f5df556cc06bb59703
|
File details
Details for the file ms_cql_sdk-0.7.1-py3-none-any.whl.
File metadata
- Download URL: ms_cql_sdk-0.7.1-py3-none-any.whl
- Upload date:
- Size: 116.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/7.0.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
426780755c8c036c751d76f3ff7ef89a1036030ef61ba0e29fadefa372b98d3c
|
|
| MD5 |
62b304d014300f313fba1676224e7cb7
|
|
| BLAKE2b-256 |
f386634a168bec157bb27ab8ab7cf5793791adde5688d52283e5a1c7c9538a6b
|