The CQL Packager tool
The HL7 CQL Packager is a utility for converting CQL or ELM into other artifacts, such as C#, .NET assemblies, or FHIR Resources. It performs the following steps:
CQL to ELM Conversion: Converts CQL files into ELM JSON files (with important limitations - see disclaimer below).
ELM to C#: Converts ELM JSON files into LINQ expressions, then translates those into C# code.
C# to .NET DLL Compilation: Compiles the generated C# code into .NET assemblies.
Packaging to FHIR Libraries/Measures: Packages the assembly (and optionally the original CQL, ELM, and C# source code) into a FHIR Library resource, creating one resource per original ELM file. Where applicable, FHIR Measure resources are also generated.
Installing the tool
The tool is distributed as a dotnet tool, so to install it, run:
dotnet tool install Hl7.Cql.Packager --global --prerelease
Note
The --prerelease option is required because only prerelease versions are currently available.
Getting Help
Get help for the command line tool by running any of the following commands:
cql-package --help
cql-package cql --help
cql-package elm --help
The two main commands
The CQL Packager has two main commands:
elm Command
Start from ELM files and convert to one or more of the following outputs: C#, DLL, PDB, FHIR Resources.
Usage: cql-package elm [options]
Required Options:
--elm <directory>- ELM input directory containing ELM files in JSON format “*.json”
Output Options:
--cs <directory>- C# output directory for generated C# source code files “*.g.cs”--dll <directory>- DLL output directory for .NET assembly libraries “*.dll”--pdb <directory>- PDB output directory for portable debug symbol files “*.pdb”--fhir <directory>- FHIR Resource output directory for Library and Measure files in JSON format
FHIR-specific Options:
--cql <directory>- CQL input directory (REQUIRED with –fhir)--canonical-root-url <url>- The root canonical URL output in FHIR library--override-utc-date-time <datetime>- Override date output in FHIR library--json-pretty- Output JSON using multiline and indentation (for –fhir)
Debug Options:
--debug-symbols <None|PortablePdb|Embedded>- Debug symbol generation:None(DEFAULT) - No debug symbols, optimizations enabledPortablePdb- Separate PDB files, no optimizationsEmbedded- Debug symbols embedded in DLL with C# source
cql Command
Start from CQL files and convert to one or more of the following outputs: ELM, C#, DLL, PDB, FHIR Resources.
Usage: cql-package cql [options]
Required Options:
--cql <directory>- CQL input directory containing CQL files “*.cql”
Output Options:
--elm <directory>- ELM output directory for generated ELM JSON files--cs <directory>- C# output directory for generated C# source code files “*.g.cs”--dll <directory>- DLL output directory for .NET assembly libraries “*.dll”--pdb <directory>- PDB output directory for portable debug symbol files “*.pdb”--fhir <directory>- FHIR Resource output directory for Library and Measure files in JSON format
FHIR-specific Options:
--canonical-root-url <url>- The root canonical URL output in FHIR library--override-utc-date-time <datetime>- Override date output in FHIR library--json-pretty- Output JSON using multiline and indentation (for –fhir or –elm)
Debug Options:
--debug-symbols <None|PortablePdb|Embedded>- Debug symbol generation (same as elm command)
Logging Options (both commands):
--log-append- Append to existing log file instead of clearing--console-log-level <level>- Minimum log level for console output--file-log-level <level>- Minimum log level for file output
Log levels: Critical, Debug, Error, Information, None, Trace, Warning
Examples
Package ELM into FHIR resources (as indented JSON) and save C# source code:
cql-package elm --elm input/elm --cql input/cql --fhir output/fhir --cs output/csharp --json-pretty
Packages ELM JSON files from the directory
input/elminto FHIR Library resources saving them tooutput/fhir.The CQL files in
input/cqlare included in the FHIR Library resources, if they match the ELM files by file name.The generated C# source code is saved to directory
output/csharp.
Package CQL into FHIR resources (as indented JSON) and save C# source code:
cql-package cql --cql input/cql --fhir output/fhir --cs output/csharp --json-pretty
Packages CQL files from the directory
input/cqlinto FHIR Library resources saving them tooutput/fhir.The ELM files are included in the FHIR Library resources, but are not saved to a separate directory.
The generated C# source code is saved to directory
output/csharp.Read the disclaimer below.
Package ELM into .NET assembly DLL’s, which can be stepped through in a debugger:
cql-package elm --elm input/elm --dll output/dll --debug-symbols Embedded
Compiles ELM JSON files in the directory
input/elminto .NET assemblies and saving them tooutput/dll.The C# and debugging symbols are embedded in the DLLs. The DLLs are compiled without any optimizations.
Package ELM with portable PDB files for debugging:
cql-package elm --elm input/elm --dll output/dll --pdb output/dll --debug-symbols PortablePdb
Compiles ELM JSON files into .NET assemblies in
output/dll.Creates separate portable PDB files in the same directory for debugging.
Set canonical root URL and override date for FHIR resources:
cql-package elm --elm input/elm --fhir output/fhir --canonical-root-url https://example.org/fhir/ --override-utc-date-time 2024-01-01T00:00:00Z --json-pretty
Packages ELM into FHIR Library resources with a custom canonical root URL.
Overrides the date timestamp in the generated FHIR resources.
Outputs pretty-printed JSON.
Disclaimer
Warning
The CQL to ELM conversion process by the cql command is currently in an early stage of development and only supports basic CQL translation. It is NOT PRODUCTION READY.
If you encounter issues with the CQL to ELM conversion, please log them in the Firely CQL SDK issue tracker.
We HIGHLY recommend using the elm command to package ELM files that have been generated by the CQL to ELM Java Tooling (see the Java Tooling README).
The version of the Java Tooling that is used to generate the ELM files must be compatible with the version of the CQL Packager you are using.
Further Reading
This package is part of the Firely CQL SDK. More information can be found at Firely’s documentation site.
