From 0fd44319b21aa5fa7a30c0476b14d9c53277fd3b Mon Sep 17 00:00:00 2001 From: aswathikrishnan24 <146727970+aswathikrishnan24@users.noreply.github.com> Date: Wed, 13 Mar 2024 10:24:19 +0100 Subject: [PATCH 1/6] Tutorial for cql plugin --- features_and_tools/cql.rst | 346 ++++++++++++++++++ features_and_tools/features.rst | 3 +- ...postman_cql_evaluatemeasure_parameters.png | Bin 0 -> 46200 bytes 3 files changed, 348 insertions(+), 1 deletion(-) create mode 100644 features_and_tools/cql.rst create mode 100644 images/postman_cql_evaluatemeasure_parameters.png diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst new file mode 100644 index 00000000..c09ca58d --- /dev/null +++ b/features_and_tools/cql.rst @@ -0,0 +1,346 @@ +.. _cql: + +CQL Plugin +============ + +Introduction +------------ + +Firely Server CQL Plugin is a means to use the Firely Server to run the CQL engine. + +This document demonstrates : + +* Creation of a simple CQL file +* Transformation of the CQL file to a library resource using the CQL Packager Tool +* Setting up Firely Server CQL Plugin +* Getting the result of your CQL measure on a resource using Postman tool + + +Create a CQL File +----------------- + +To start working with Firely Server CQL Plugin, you would need a CQL File. +An example of a CQL file ``AgeFHIR4.cql`` is displayed below: + + .. code-block:: jsonc + + library AgeFHIR4 version '0.0.1' + using FHIR version '4.0.1' + + context Patient + + define "is18OrAbove": + AgeInYears() >= 18 + +Generate a Library resource +--------------------------- + +CQL File is translated to a library resource using the `CQL Packager tool `_ + + 1. Follow the step by step `Installation of the CQL Packager tool and use the Demo solution `_ to generate a resource file: + 2. Place the CQL file ``Age.cql`` in the folder ..\firely-cql-sdk\Demo\Cql\input + 3. Clean and Build CQL project + + .. note:: + Running the build for this project turns these CQL files into ELM and puts the files into the source directory of the next step. + (Json folder under the Elm project contains the translated file AgeFHIR4.json) + + .. container:: toggle + + .. container:: header + + Click to expand AgeFHIR4.json + + .. code-block:: jsonc + + { + "library" : { + "annotation" : [ { + "translatorVersion" : "2.11.0", + "translatorOptions" : "EnableLocators,EnableResultTypes", + "type" : "CqlToElmInfo" + } ], + "identifier" : { + "id" : "AgeFHIR4", + "version" : "0.0.1" + }, + "schemaIdentifier" : { + "id" : "urn:hl7-org:elm", + "version" : "r1" + }, + "usings" : { + "def" : [ { + "localIdentifier" : "System", + "uri" : "urn:hl7-org:elm-types:r1" + }, { + "locator" : "3:1-3:26", + "localIdentifier" : "FHIR", + "uri" : "http://hl7.org/fhir", + "version" : "4.0.1" + } ] + }, + "contexts" : { + "def" : [ { + "locator" : "5:1-5:15", + "name" : "Patient" + } ] + }, + "statements" : { + "def" : [ { + "locator" : "5:1-5:15", + "name" : "Patient", + "context" : "Patient", + "expression" : { + "type" : "SingletonFrom", + "operand" : { + "locator" : "5:1-5:15", + "dataType" : "{http://hl7.org/fhir}Patient", + "templateId" : "http://hl7.org/fhir/StructureDefinition/Patient", + "type" : "Retrieve" + } + } + }, { + "locator" : "7:1-8:20", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", + "name" : "is18OrAbove", + "context" : "Patient", + "accessLevel" : "Public", + "expression" : { + "locator" : "8:3-8:20", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Boolean", + "type" : "GreaterOrEqual", + "operand" : [ { + "locator" : "8:3-8:14", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", + "precision" : "Year", + "type" : "CalculateAge", + "operand" : { + "path" : "birthDate.value", + "type" : "Property", + "source" : { + "name" : "Patient", + "type" : "ExpressionRef" + } + } + }, { + "locator" : "8:19-8:20", + "resultTypeName" : "{urn:hl7-org:elm-types:r1}Integer", + "valueType" : "{urn:hl7-org:elm-types:r1}Integer", + "value" : "18", + "type" : "Literal" + } ] + } + } ] + } + } + } + + + 4. Clean and Build ELM project. + + .. note:: + + PackagerCLI takes the original CQL (from the input folder in step 1) and the ELM (from Json folder from this project from step 2) as input. + The generated C# is exported to the root directory of the Measures project and built into a Measures.dll. + The generated Library resource ``AgeFHIR4-0.0.1.json`` is stored in the Resources folder in the Test project. + + .. container:: toggle + + .. container:: header + + Click to expand AgeFHIR4-0.0.1.json + + .. code-block:: jsonc + + { + "resourceType": "Library", + "id": "AgeFHIR4-0.0.1", + "url": "https://fire.ly/fhir/Library/AgeFHIR4-0.0.1", + "version": "0.0.1", + "name": "AgeFHIR4", + "status": "active", + "type": { + "coding": [ + { + "system": "http://terminology.hl7.org/CodeSystem/library-type", + "code": "logic-library" + } + ] + }, + "date": "2024-02-06T16:04:23.315Z", + "parameter": [ + { + "name": "is18OrAbove", + "use": "out", + "min": 0, + "max": "1", + "type": "boolean" + } + ], + "content": [ + { + "id": "AgeFHIR4-0.0.1+elm", + "contentType": "application/elm+json", + "data": "ew0KICAgImxpYnJhcnkiIDogew0KICAgICAgImFubm90YXRpb24iIDogWyB7DQogICAgICAgICAidHJhbnNsYXRvclZlcnNpb24iIDogIjIuMTEuMCIsDQogICAgICAgICAidHJhbnNsYXRvck9wdGlvbnMiIDogIkVuYWJsZUxvY2F0b3JzLEVuYWJsZVJlc3VsdFR5cGVzIiwNCiAgICAgICAgICJ0eXBlIiA6ICJDcWxUb0VsbUluZm8iDQogICAgICB9IF0sDQogICAgICAiaWRlbnRpZmllciIgOiB7DQogICAgICAgICAiaWQiIDogIkFkdWx0Qk1JRkhJUjQiLA0KICAgICAgICAgInZlcnNpb24iIDogIjAuMC4xIg0KICAgICAgfSwNCiAgICAgICJzY2hlbWFJZGVudGlmaWVyIiA6IHsNCiAgICAgICAgICJpZCIgOiAidXJuOmhsNy1vcmc6ZWxtIiwNCiAgICAgICAgICJ2ZXJzaW9uIiA6ICJyMSINCiAgICAgIH0sDQogICAgICAidXNpbmdzIiA6IHsNCiAgICAgICAgICJkZWYiIDogWyB7DQogICAgICAgICAgICAibG9jYWxJZGVudGlmaWVyIiA6ICJTeXN0ZW0iLA0KICAgICAgICAgICAgInVyaSIgOiAidXJuOmhsNy1vcmc6ZWxtLXR5cGVzOnIxIg0KICAgICAgICAgfSwgew0KICAgICAgICAgICAgImxvY2F0b3IiIDogIjM6MS0zOjI2IiwNCiAgICAgICAgICAgICJsb2NhbElkZW50aWZpZXIiIDogIkZISVIiLA0KICAgICAgICAgICAgInVyaSIgOiAiaHR0cDovL2hsNy5vcmcvZmhpciIsDQogICAgICAgICAgICAidmVyc2lvbiIgOiAiNC4wLjEiDQogICAgICAgICB9IF0NCiAgICAgIH0sDQogICAgICAiY29udGV4dHMiIDogew0KICAgICAgICAgImRlZiIgOiBbIHsNCiAgICAgICAgICAgICJsb2NhdG9yIiA6ICI1OjEtNToxNSIsDQogICAgICAgICAgICAibmFtZSIgOiAiUGF0aWVudCINCiAgICAgICAgIH0gXQ0KICAgICAgfSwNCiAgICAgICJzdGF0ZW1lbnRzIiA6IHsNCiAgICAgICAgICJkZWYiIDogWyB7DQogICAgICAgICAgICAibG9jYXRvciIgOiAiNToxLTU6MTUiLA0KICAgICAgICAgICAgIm5hbWUiIDogIlBhdGllbnQiLA0KICAgICAgICAgICAgImNvbnRleHQiIDogIlBhdGllbnQiLA0KICAgICAgICAgICAgImV4cHJlc3Npb24iIDogew0KICAgICAgICAgICAgICAgInR5cGUiIDogIlNpbmdsZXRvbkZyb20iLA0KICAgICAgICAgICAgICAgIm9wZXJhbmQiIDogew0KICAgICAgICAgICAgICAgICAgImxvY2F0b3IiIDogIjU6MS01OjE1IiwNCiAgICAgICAgICAgICAgICAgICJkYXRhVHlwZSIgOiAie2h0dHA6Ly9obDcub3JnL2ZoaXJ9UGF0aWVudCIsDQogICAgICAgICAgICAgICAgICAidGVtcGxhdGVJZCIgOiAiaHR0cDovL2hsNy5vcmcvZmhpci9TdHJ1Y3R1cmVEZWZpbml0aW9uL1BhdGllbnQiLA0KICAgICAgICAgICAgICAgICAgInR5cGUiIDogIlJldHJpZXZlIg0KICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgfSwgew0KICAgICAgICAgICAgImxvY2F0b3IiIDogIjc6MS04OjIwIiwNCiAgICAgICAgICAgICJyZXN1bHRUeXBlTmFtZSIgOiAie3VybjpobDctb3JnOmVsbS10eXBlczpyMX1Cb29sZWFuIiwNCiAgICAgICAgICAgICJuYW1lIiA6ICJpczE4T3JBYm92ZSIsDQogICAgICAgICAgICAiY29udGV4dCIgOiAiUGF0aWVudCIsDQogICAgICAgICAgICAiYWNjZXNzTGV2ZWwiIDogIlB1YmxpYyIsDQogICAgICAgICAgICAiZXhwcmVzc2lvbiIgOiB7DQogICAgICAgICAgICAgICAibG9jYXRvciIgOiAiODozLTg6MjAiLA0KICAgICAgICAgICAgICAgInJlc3VsdFR5cGVOYW1lIiA6ICJ7dXJuOmhsNy1vcmc6ZWxtLXR5cGVzOnIxfUJvb2xlYW4iLA0KICAgICAgICAgICAgICAgInR5cGUiIDogIkdyZWF0ZXJPckVxdWFsIiwNCiAgICAgICAgICAgICAgICJvcGVyYW5kIiA6IFsgew0KICAgICAgICAgICAgICAgICAgImxvY2F0b3IiIDogIjg6My04OjE0IiwNCiAgICAgICAgICAgICAgICAgICJyZXN1bHRUeXBlTmFtZSIgOiAie3VybjpobDctb3JnOmVsbS10eXBlczpyMX1JbnRlZ2VyIiwNCiAgICAgICAgICAgICAgICAgICJwcmVjaXNpb24iIDogIlllYXIiLA0KICAgICAgICAgICAgICAgICAgInR5cGUiIDogIkNhbGN1bGF0ZUFnZSIsDQogICAgICAgICAgICAgICAgICAib3BlcmFuZCIgOiB7DQogICAgICAgICAgICAgICAgICAgICAicGF0aCIgOiAiYmlydGhEYXRlLnZhbHVlIiwNCiAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJQcm9wZXJ0eSIsDQogICAgICAgICAgICAgICAgICAgICAic291cmNlIiA6IHsNCiAgICAgICAgICAgICAgICAgICAgICAgICJuYW1lIiA6ICJQYXRpZW50IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICJ0eXBlIiA6ICJFeHByZXNzaW9uUmVmIg0KICAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgfSwgew0KICAgICAgICAgICAgICAgICAgImxvY2F0b3IiIDogIjg6MTktODoyMCIsDQogICAgICAgICAgICAgICAgICAicmVzdWx0VHlwZU5hbWUiIDogInt1cm46aGw3LW9yZzplbG0tdHlwZXM6cjF9SW50ZWdlciIsDQogICAgICAgICAgICAgICAgICAidmFsdWVUeXBlIiA6ICJ7dXJuOmhsNy1vcmc6ZWxtLXR5cGVzOnIxfUludGVnZXIiLA0KICAgICAgICAgICAgICAgICAgInZhbHVlIiA6ICIxOCIsDQogICAgICAgICAgICAgICAgICAidHlwZSIgOiAiTGl0ZXJhbCINCiAgICAgICAgICAgICAgIH0gXQ0KICAgICAgICAgICAgfQ0KICAgICAgICAgfSBdDQogICAgICB9DQogICB9DQp9DQoNCg==" + }, + { + "id": "AgeFHIR4-0.0.1+cql", + "contentType": "text/cql", + "data": "bGlicmFyeSBBZHVsdEJNSUZISVI0IHZlcnNpb24gJzAuMC4xJw0KDQp1c2luZyBGSElSIHZlcnNpb24gJzQuMC4xJw0KDQpjb250ZXh0IFBhdGllbnQNCg0KZGVmaW5lICJpczE4T3JBYm92ZSI6DQogIEFnZUluWWVhcnMoKSA+PSAxOA==" + }, + { + "id": "AgeFHIR4-0.0.1+dll", + "contentType": "application/octet-stream", + "data": "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wAAAAAAAAQAAAAAAAAAAAAAAAADsAgAAAAABAAAAAAAAAAAAAAAAAEADAAAAACMAbwAlAG8ALQChAAAAAEFkdWx0Qk1JRkhJUjQtMC4wLjEAQWR1bHRCTUlGSElSNF8wXzBfMQBGdW5jYDEATnVsbGFibGVgMQBJRW51bWVyYWJsZWAxAExhenlgMQBJbnQzMgBIbDcuRmhpci5SNAA8TW9kdWxlPgBTeXN0ZW0uUHJpdmF0ZS5Db3JlTGliAFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljAENhbGN1bGF0ZUFnZQBSYW5nZQBIbDcuQ3FsLlJ1bnRpbWUASGw3LkZoaXIuQmFzZQBDcWxEYXRlAEVtYmVkZGVkQXR0cmlidXRlAENvbXBpbGVyR2VuZXJhdGVkQXR0cmlidXRlAEdlbmVyYXRlZENvZGVBdHRyaWJ1dGUAQXR0cmlidXRlVXNhZ2VBdHRyaWJ1dGUARGVidWdnYWJsZUF0dHJpYnV0ZQBDcWxEZWNsYXJhdGlvbkF0dHJpYnV0ZQBSZWZTYWZldHlSdWxlc0F0dHJpYnV0ZQBDb21waWxhdGlvblJlbGF4YXRpb25zQXR0cmlidXRlAENxbExpYnJhcnlBdHRyaWJ1dGUAUnVudGltZUNvbXBhdGliaWxpdHlBdHRyaWJ1dGUAaXMxOE9yQWJvdmVfVmFsdWUAZ2V0X1ZhbHVlAFBhdGllbnRfVmFsdWUAX19pczE4T3JBYm92ZQBUYXNrAEdyZWF0ZXJPckVxdWFsAEhsNy5GaGlyLk1vZGVsAEFkdWx0Qk1JRkhJUjQtMC4wLjEuZGxsAFNpbmdsZU9yTnVsbABTeXN0ZW0AVmVyc2lvbgBTeXN0ZW0uUmVmbGVjdGlvbgBBcmd1bWVudE51bGxFeGNlcHRpb24AUHJvcGVydHlJbmZvAFN5c3RlbS5Db2RlRG9tLkNvbXBpbGVyAC5jdG9yAFN5c3RlbS5EaWFnbm9zdGljcwBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzAERlYnVnZ2luZ01vZGVzAEhsNy5DcWwuUHJpbWl0aXZlcwBNaWNyb3NvZnQuQ29kZUFuYWx5c2lzAEhMNy5DcWwuQWJzdHJhY3Rpb25zAEhsNy5DcWwuQWJzdHJhY3Rpb25zAEhsNy5DcWwuT3BlcmF0b3JzAGdldF9PcGVyYXRvcnMASUNxbE9wZXJhdG9ycwBBdHRyaWJ1dGVUYXJnZXRzAE9iamVjdABDcWxWYWx1ZVNldABSZXRyaWV2ZUJ5VmFsdWVTZXQAX19QYXRpZW50AGdldF9CaXJ0aERhdGVFbGVtZW50AENvbnZlcnQAQ3FsQ29udGV4dABjb250ZXh0AAAAD2MAbwBuAHQAZQB4AHQAAAl5AGUAYQByAAAAbGP+Akd8gkaIY0FKJaNJqQAEIAEBCAMgAAEFIAEBEREFIAIBDg4FIAEBESEEIAEBDgYVElkBEjkFIAIBHBgGFRI1ARI5CSABARUSWQETAAkVElkBFRE9AQIJFRI1ARURPQECCAcBFRJJARI5BCAAEl0NMAECFRJJAR4AEmESZQQKARI5CzABAR4AFRJJAR4ABCAAEwALBwMSORJRFRE9AQgEIAASaQMgAA4GMAEBHgAcBAoBElEKIAIVET0BCBJRDgUVET0BCAkgAhURPQECHBwIfOyF176neY4I1waRFIBVD8MCBggDBhIxBwYVEjUBEjkKBhUSNQEVET0BAgUgAQESMQQgABI5ByAAFRE9AQIIAQAIAAAAAAAeAQABAFQCFldyYXBOb25FeGNlcHRpb25UaHJvd3MBCAEAAgAAAAAAGAEADUFkdWx0Qk1JRkhJUjQFMC4wLjEAAAwBAAdQYXRpZW50AAAQAQALaXMxOE9yQWJvdmUAAAQBAAAAJgEAAgAAAAIAVAINQWxsb3dNdWx0aXBsZQBUAglJbmhlcml0ZWQAIQEAFC5ORVQgQ29kZSBHZW5lcmF0aW9uBzEuMC4wLjAAAAgBAAsAAAAAAAA4KwAAAAAAAAAAAABSKwAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARCsAAAAAAAAAAAAAAABfQ29yRGxsTWFpbgBtc2NvcmVlLmRsbAAAAAAA/yUAIAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAADAAAAGQ7AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==" + }, + { + "id": "AgeFHIR4-0.0.1+csharp", + "contentType": "text/plain", + "data": "dXNpbmcgU3lzdGVtOw0KdXNpbmcgU3lzdGVtLkxpbnE7DQp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsNCnVzaW5nIEhsNy5DcWwuUnVudGltZTsNCnVzaW5nIEhsNy5DcWwuUHJpbWl0aXZlczsNCnVzaW5nIEhsNy5DcWwuQWJzdHJhY3Rpb25zOw0KdXNpbmcgSGw3LkNxbC5WYWx1ZVNldHM7DQp1c2luZyBIbDcuQ3FsLklzbzg2MDE7DQp1c2luZyBIbDcuRmhpci5Nb2RlbDsNCnVzaW5nIFJhbmdlID0gSGw3LkZoaXIuTW9kZWwuUmFuZ2U7DQp1c2luZyBUYXNrID0gSGw3LkZoaXIuTW9kZWwuVGFzazsNCltTeXN0ZW0uQ29kZURvbS5Db21waWxlci5HZW5lcmF0ZWRDb2RlKCIuTkVUIENvZGUgR2VuZXJhdGlvbiIsICIxLjAuMC4wIildDQpbQ3FsTGlicmFyeSgiQWR1bHRCTUlGSElSNCIsICIwLjAuMSIpXQ0KcHVibGljIGNsYXNzIEFkdWx0Qk1JRkhJUjRfMF8wXzENCnsNCg0KDQogICAgaW50ZXJuYWwgQ3FsQ29udGV4dCBjb250ZXh0Ow0KDQogICAgI3JlZ2lvbiBDYWNoZWQgdmFsdWVzDQoNCiAgICBpbnRlcm5hbCBMYXp5PFBhdGllbnQ+IF9fUGF0aWVudDsNCiAgICBpbnRlcm5hbCBMYXp5PGJvb2w/PiBfX2lzMThPckFib3ZlOw0KDQogICAgI2VuZHJlZ2lvbg0KICAgIHB1YmxpYyBBZHVsdEJNSUZISVI0XzBfMF8xKENxbENvbnRleHQgY29udGV4dCkNCiAgICB7DQogICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQgPz8gdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigiY29udGV4dCIpOw0KDQoNCiAgICAgICAgX19QYXRpZW50ID0gbmV3IExhenk8UGF0aWVudD4odGhpcy5QYXRpZW50X1ZhbHVlKTsNCiAgICAgICAgX19pczE4T3JBYm92ZSA9IG5ldyBMYXp5PGJvb2w/Pih0aGlzLmlzMThPckFib3ZlX1ZhbHVlKTsNCiAgICB9DQogICAgI3JlZ2lvbiBEZXBlbmRlbmNpZXMNCg0KDQogICAgI2VuZHJlZ2lvbg0KDQoJcHJpdmF0ZSBQYXRpZW50IFBhdGllbnRfVmFsdWUoKQ0KCXsNCgkJdmFyIGFfID0gY29udGV4dC5PcGVyYXRvcnMuUmV0cmlldmVCeVZhbHVlU2V0PFBhdGllbnQ+KG51bGwsIG51bGwpOw0KCQl2YXIgYl8gPSBjb250ZXh0Lk9wZXJhdG9ycy5TaW5nbGVPck51bGw8UGF0aWVudD4oYV8pOw0KDQoJCXJldHVybiBiXzsNCgl9DQoNCiAgICBbQ3FsRGVjbGFyYXRpb24oIlBhdGllbnQiKV0NCglwdWJsaWMgUGF0aWVudCBQYXRpZW50KCkgPT4gDQoJCV9fUGF0aWVudC5WYWx1ZTsNCg0KCXByaXZhdGUgYm9vbD8gaXMxOE9yQWJvdmVfVmFsdWUoKQ0KCXsNCgkJdmFyIGFfID0gdGhpcy5QYXRpZW50KCk7DQoJCXZhciBiXyA9IGNvbnRleHQuT3BlcmF0b3JzLkNvbnZlcnQ8Q3FsRGF0ZT4oYV8/LkJpcnRoRGF0ZUVsZW1lbnQ/LlZhbHVlKTsNCgkJdmFyIGNfID0gY29udGV4dC5PcGVyYXRvcnMuQ2FsY3VsYXRlQWdlKGJfLCAieWVhciIpOw0KCQl2YXIgZF8gPSBjb250ZXh0Lk9wZXJhdG9ycy5HcmVhdGVyT3JFcXVhbChjXywgKGludD8pMTgpOw0KDQoJCXJldHVybiBkXzsNCgl9DQoNCiAgICBbQ3FsRGVjbGFyYXRpb24oImlzMThPckFib3ZlIildDQoJcHVibGljIGJvb2w/IGlzMThPckFib3ZlKCkgPT4gDQoJCV9faXMxOE9yQWJvdmUuVmFsdWU7DQoNCn0=" + } + ] + } + +Firely Server CQL Plugin +------------------------ + +This chapter details setting up Firely ServerCQL Plugin and provides you with an example to get some hands-on experience with CQL library with Postman tool. + + +* Getting Started +* CQL Plugin Configuration +* Using Postman + +Getting Started +^^^^^^^^^^^^^^^^ + +* Install Firely Server using `Basic installation — Firely Server documentation `_ + + .. warning:: + Make sure that the license contains CQL Plugin. + +CQL Plugin Configuration in Firely Server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +* Edit appsettings.instance.json: + + 1. Set Repository to ``SQL`` and add the database configuration + 2. Add ``$evaluate-measure`` to the ``SupportedInteractions.TypeLevelInteractions`` + 3. Ensure ``$everything`` is present in the ``SupportedInteractions.InstanceLevelInteractions`` + 4. Insert ``Vonk.Plugin.Cql`` to PipelineOptions.Branches[Path="/"].Include before any other plugin + 5. Uncomment ``Vonk.Plugin.PatientEverything`` from the same list PipelineOptions.Branches[Path="/"].Include. + +* Build and run the Vonk.Server project from your IDE + +Using Postman +^^^^^^^^^^^^^ +CQL Plugin in Firely Server uses the ``$evaluate-measure`` operation to execute a CQL measure on a resource. +To verify the result of our CQL measure, we use Postman tool + +* Set up Postman with environment variable : baseUrl and point to http://localhost:4080 + + .. note:: + Make sure that the capability statement contains a Library operation "https:/fire.ly/fhir/OperationDefinition/Library-evaluate-measure" + + .. code-block:: + + GET {{baseUrl}}/metadata + + This confirms that the CQL Plugin is enabled for the Firely Server + +* Create a Postman Collection with the following inputs : + + 1. Create a Library resource with the Library resource json file ``AgeFHIR4-0.0.1.json``. + + .. code-block:: + + POST {{baseUrl}}/administration/Library + + Store the ``url`` + 2. Create a Support File with a binary file (todo : Explain this) + 3. Create a Patient resource with age over 18 years + + .. code-block:: + + POST {{baseUrl}}/Patient + + .. code-block:: jsonc + + { + "resourceType": "Patient", + "active": true, + "gender": "male", + "birthDate": "1967-11-06", + "name": [ + { + "use": "official", + "family": "Smith", + "given": [ + "John" + ] + } + ] + } + + Store the ``id`` of the patient resource created. + + 4. Create a POST request for $evaluate-measure operation on the Library resource created + + .. code-block:: + + POST {{baseUrl}}/Library/$evaluate-measure + + .. code-block:: jsonc + + { + "resourceType": "Parameters", + "parameter": [ + { + "name": "url", + "valueCanonical": "https://fire.ly/fhir/Library/AgeFHIR4-0.0.1" + }, + { + "name": "version", + "valueString": "0.0.1" + }, + { + "name": "subject", + "valueString": "Patient/patient-id" + }, + { + "name": "periodStart", + "valueDate": "2023-01-01" + }, + { + "name": "periodEnd", + "valueDate": "2023-12-01" + } + ] + } + + ``valueCanonical`` of the url comes from the ``url`` of the library resource in Step 1 and the ``patient-id`` comes from the ``id`` of the patient created in Step 3 + 5. Get the result of the $evaluate-measure by passing the parameters. + .. code-block:: + + GET {{baseUrl}}/Library/$evaluate-measure + + .. image:: ../images/postman_cql_evaluatemeasure_parameters.png + :width: 1000px + :alt: Illustration of paramters + + 6. Results + + .. code-block:: + + Results here #todo API response and Decoded results + The result displays if the Patient is evaluated as true or false for Age over 18 years + + + + + + + + + + + diff --git a/features_and_tools/features.rst b/features_and_tools/features.rst index ed4772b2..41df109c 100644 --- a/features_and_tools/features.rst +++ b/features_and_tools/features.rst @@ -3,7 +3,7 @@ Features and Tools ================== -Firely Server offers many features as defined in the FHIR Specification and beyond. Below pages provide you with an overview of these features and tools. Note that for some tools, such as Firely Server Ingest and Bulk Data Export, separate licensing applies. You can always reach out to us at server@fire.ly if you have questions. +Firely Server offers many features as defined in the FHIR Specification and beyond. Below pages provide you with an overview of these features and tools. Note that for some tools, such as Firely Server Ingest, Bulk Data Export and CQL, separate licensing applies. You can always reach out to us at server@fire.ly if you have questions. .. image:: ../images/FirelyPlugins.png :align: right @@ -27,6 +27,7 @@ Firely Server offers many features as defined in the FHIR Specification and beyo pubsub multi-tenancy features-availability + cql diff --git a/images/postman_cql_evaluatemeasure_parameters.png b/images/postman_cql_evaluatemeasure_parameters.png new file mode 100644 index 0000000000000000000000000000000000000000..ad40fdcbd61a4dd12088017649c3cf68fe335079 GIT binary patch literal 46200 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 Date: Wed, 13 Mar 2024 12:19:45 +0100 Subject: [PATCH 2/6] Updated cql file --- features_and_tools/cql.rst | 121 ++++++++++++++++++++----------------- 1 file changed, 64 insertions(+), 57 deletions(-) diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst index c09ca58d..f0ca4364 100644 --- a/features_and_tools/cql.rst +++ b/features_and_tools/cql.rst @@ -135,7 +135,6 @@ CQL File is translated to a library resource using the `CQL Packager tool Date: Thu, 14 Mar 2024 08:53:48 +0100 Subject: [PATCH 3/6] Updated the file with Postman response --- features_and_tools/cql.rst | 66 +++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 18 deletions(-) diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst index f0ca4364..8cc2a6d7 100644 --- a/features_and_tools/cql.rst +++ b/features_and_tools/cql.rst @@ -9,11 +9,10 @@ Introduction Firely Server CQL Plugin is a means to use the Firely Server to run the CQL engine. This document demonstrates : - -* Creation of a simple CQL file -* Transformation of the CQL file to a library resource using the CQL Packager Tool -* Setting up Firely Server CQL Plugin -* Getting the result of your CQL measure on a resource using Postman tool + * Creation of a simple CQL file + * Transformation of the CQL file to a library resource using the CQL Packager Tool + * Setting up Firely Server CQL Plugin + * Getting the result of your CQL measure on a resource using Postman tool Create a CQL File @@ -37,9 +36,9 @@ Generate a Library resource CQL File is translated to a library resource using the `CQL Packager tool `_ - 1. Follow the step by step `Installation of the CQL Packager tool and use the Demo solution `_ to generate a resource file: - 2. Place the CQL file ``Age.cql`` in the folder ..\firely-cql-sdk\Demo\Cql\input - 3. Clean and Build CQL project + 1. Follow the step by step `Installation of the CQL Packager tool and use the Demo solution `_ to generate a resource file. + 2. Place the CQL file ``Age.cql`` in the folder ``..\firely-cql-sdk\Demo\Cql\input`` + 3. From the Demo Solution, Clean and Build CQL folder .. note:: Running the build for this project turns these CQL files into ELM and puts the files into the source directory of the next step. @@ -135,7 +134,7 @@ CQL File is translated to a library resource using the `CQL Packager tool Date: Thu, 14 Mar 2024 12:07:07 +0100 Subject: [PATCH 4/6] Updated postman collection and typo in name. --- features_and_tools/cql.rst | 73 +++++++++++------- ...stman_cql_evaluate_measure_parameters.png} | Bin 2 files changed, 45 insertions(+), 28 deletions(-) rename images/{postman_cql_evaluatemeasure_parameters.png => postman_cql_evaluate_measure_parameters.png} (100%) diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst index 8cc2a6d7..d1244c7b 100644 --- a/features_and_tools/cql.rst +++ b/features_and_tools/cql.rst @@ -233,20 +233,48 @@ Using Postman CQL Plugin in Firely Server uses the ``$evaluate-measure`` operation to execute a CQL measure on a resource. To verify the result of our CQL measure, we use Postman tool -* Set up Postman with environment variable : baseUrl and point to http://localhost:4080 +Fork an existing collection: + #. Click the following "Fork postman collection into your workspace" link: + + .. raw:: html + +
+ + + #. Click "Fork Collection" + + .. image:: ../images/Compliance_ForkTestCollectionPostman.png + :align: center + :width: 500 + + #. Sign-In with your Postman account and click "Fork Collection". Change the label and workspace names as desired. + #. Run the Postman collection + +Create a postman collection + #. Set up Postman with variable : baseUrl and point to http://localhost:4080 - .. note:: - Make sure that the capability statement contains a Library operation ``https:/fire.ly/fhir/OperationDefinition/Library-evaluate-measure``. - This confirms that the CQL Plugin is enabled for the Firely Server. - - Request : - .. code-block:: + .. note:: + Make sure that the capability statement contains a Library operation ``https:/fire.ly/fhir/OperationDefinition/Library-evaluate-measure``. + This confirms that the CQL Plugin is enabled for the Firely Server. - GET {{baseUrl}}/metadata + Request : + .. code-block:: -* Create a Postman Collection with the following inputs : + GET {{baseUrl}}/metadata - 1. Create a Library resource with the Library resource json file ``AgeFHIR4-0.0.1.json``. + #. Create a Library resource with the Library resource json file ``AgeFHIR4-0.0.1.json``. Request : .. code-block:: @@ -254,8 +282,8 @@ To verify the result of our CQL measure, we use Postman tool POST {{baseUrl}}/administration/Library Store the ``url`` - 2. Create a Support File with a binary file (todo : Explain this) - 3. Create a Patient resource with age over 18 years + #. Create a Support File with a binary file (todo : Explain this) + #. Create a Patient resource with age over 18 years Request : .. code-block:: @@ -283,7 +311,7 @@ To verify the result of our CQL measure, we use Postman tool Store the ``id`` of the patient resource created. - 4. Create a POST request for $evaluate-measure operation on the Library resource created + #. Create a POST request for $evaluate-measure operation on the Library resource created Request : .. code-block:: @@ -331,16 +359,16 @@ To verify the result of our CQL measure, we use Postman tool "data": "eyJQYXRpZW50Ijp7InJlc291cmNlVHlwZSI6IlBhdGllbnQiLCJpZCI6IjFjMjI1NzVmLWE5Y2QtNGI4OS05YTI3LTk2M2VmNmU3Y2QwNyIsIm1ldGEiOnsidmVyc2lvbklkIjoiN2VjMzkzYjItOTE1ZS00MTYyLTk1YzEtYjc4Y2M4YjE5MjhlIiwibGFzdFVwZGF0ZWQiOiIyMDI0LTAzLTEzVDEyOjQyOjAyLjU4MiswMDowMCJ9LCJhY3RpdmUiOnRydWUsIm5hbWUiOlt7InVzZSI6Im9mZmljaWFsIiwiZmFtaWx5IjoiU21pdGgiLCJnaXZlbiI6WyJKb2huIl19XSwiZ2VuZGVyIjoibWFsZSIsImJpcnRoRGF0ZSI6IjIwMTgtMTEtMDYifSwiaXMxOE9yQWJvdmUiOmZhbHNlfQ==" } - 5. Get the result of the $evaluate-measure by passing the parameters. + #. Get the result of the $evaluate-measure by passing the parameters. Request : .. code-block:: GET {{baseUrl}}/Library/$evaluate-measure - .. image:: ../images/postman_cql_evaluatemeasure_parameters.png + .. image:: ../images/postman_cql_evaluate_measure_parameters.png :width: 1000px - :alt: Illustration of paramters + :alt: Illustration of parameters Response : .. code-block:: @@ -369,15 +397,4 @@ To verify the result of our CQL measure, we use Postman tool "is18OrAbove": true } - The result displays if the Patient is evaluated as ``true`` or ``false`` for the CQL measure, in this case 18 years or above. - - - - - - - - - - - + The result displays if the Patient is evaluated as ``true`` or ``false`` for the CQL measure, in this case 18 years or above. \ No newline at end of file diff --git a/images/postman_cql_evaluatemeasure_parameters.png b/images/postman_cql_evaluate_measure_parameters.png similarity index 100% rename from images/postman_cql_evaluatemeasure_parameters.png rename to images/postman_cql_evaluate_measure_parameters.png From bfc9c34970bc2f340f8feaaba11a6126b1ead63e Mon Sep 17 00:00:00 2001 From: aswathikrishnan24 <146727970+aswathikrishnan24@users.noreply.github.com> Date: Fri, 15 Mar 2024 08:25:21 +0100 Subject: [PATCH 5/6] Changed the order of the Postman steps --- build-in-docker.sh | 2 +- features_and_tools/cql.rst | 60 +++++++++++++++++++------------------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/build-in-docker.sh b/build-in-docker.sh index 2880552a..e362a29d 100755 --- a/build-in-docker.sh +++ b/build-in-docker.sh @@ -2,7 +2,7 @@ docsroot=$(pwd) echo "Building documentation in folder ${docsroot}" -docker run --rm -v ${docsroot}:/docs firely.azurecr.io/firely/docs-sphinx:latest +docker run --rm -v /${docsroot}:/docs firely.azurecr.io/firely/docs-sphinx:latest index="${docsroot}/_build/html/index.html" echo "Build ready, showing output from ${index}" open ${index} &2> /dev/null || xdg-open ${index} &2> /dev/null diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst index d1244c7b..06190592 100644 --- a/features_and_tools/cql.rst +++ b/features_and_tools/cql.rst @@ -233,35 +233,6 @@ Using Postman CQL Plugin in Firely Server uses the ``$evaluate-measure`` operation to execute a CQL measure on a resource. To verify the result of our CQL measure, we use Postman tool -Fork an existing collection: - #. Click the following "Fork postman collection into your workspace" link: - - .. raw:: html - -
- - - #. Click "Fork Collection" - - .. image:: ../images/Compliance_ForkTestCollectionPostman.png - :align: center - :width: 500 - - #. Sign-In with your Postman account and click "Fork Collection". Change the label and workspace names as desired. - #. Run the Postman collection - Create a postman collection #. Set up Postman with variable : baseUrl and point to http://localhost:4080 @@ -397,4 +368,33 @@ Create a postman collection "is18OrAbove": true } - The result displays if the Patient is evaluated as ``true`` or ``false`` for the CQL measure, in this case 18 years or above. \ No newline at end of file + The result displays if the Patient is evaluated as ``true`` or ``false`` for the CQL measure, in this case 18 years or above. + +Fork an existing collection: + #. Click the following "Fork postman collection into your workspace" link: + + .. raw:: html + +
+ + + #. Click "Fork Collection" + + .. image:: ../images/Compliance_ForkTestCollectionPostman.png + :align: center + :width: 500 + + #. Sign-In with your Postman account and click "Fork Collection". Change the label and workspace names as desired. + #. Run the requests in the collection From 9b2f603009157768bb141e18ef2138a7ce504c1a Mon Sep 17 00:00:00 2001 From: aswathikrishnan24 <146727970+aswathikrishnan24@users.noreply.github.com> Date: Mon, 18 Mar 2024 09:43:24 +0100 Subject: [PATCH 6/6] Updated review comments --- features_and_tools/cql.rst | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/features_and_tools/cql.rst b/features_and_tools/cql.rst index 06190592..4414019f 100644 --- a/features_and_tools/cql.rst +++ b/features_and_tools/cql.rst @@ -6,19 +6,19 @@ CQL Plugin Introduction ------------ -Firely Server CQL Plugin is a means to use the Firely Server to run the CQL engine. +Firely Server CQL Plugin is a means to use the Firely Server to run the `CQL engine `_. This document demonstrates : * Creation of a simple CQL file - * Transformation of the CQL file to a library resource using the CQL Packager Tool - * Setting up Firely Server CQL Plugin - * Getting the result of your CQL measure on a resource using Postman tool + * Transformation of the CQL file to a `library resource `_ using the CQL Packager Tool + * Setting up Firely Server with CQL Plugin + * Getting the result of your CQL measure on the library resource in Firely Server using Postman tool Create a CQL File ----------------- -To start working with Firely Server CQL Plugin, you would need a CQL File. +To start working with Firely Server CQL Plugin, you would need a CQL File. Some examples can be found `here `_. An example of a CQL file ``AgeFHIR4.cql`` is displayed below: .. code-block:: jsonc @@ -34,7 +34,8 @@ An example of a CQL file ``AgeFHIR4.cql`` is displayed below: Generate a Library resource --------------------------- -CQL File is translated to a library resource using the `CQL Packager tool `_ +CQL File created in the previous step is translated to a `library resource `_ using the `CQL Packager tool `_. +Firely Server CQL plugin uses this library resource to evaluate the CMS measure on other resources. 1. Follow the step by step `Installation of the CQL Packager tool and use the Demo solution `_ to generate a resource file. 2. Place the CQL file ``Age.cql`` in the folder ``..\firely-cql-sdk\Demo\Cql\input`` @@ -140,7 +141,8 @@ CQL File is translated to a library resource using the `CQL Packager tool