From f0050c960a90a10e4e0419601cedbbd1699f3afb Mon Sep 17 00:00:00 2001 From: Liu Date: Fri, 25 Feb 2022 14:23:11 -0500 Subject: [PATCH 1/3] handle embedded CQL in Questionniare --- databaseData/db.json | 535 +++++++++++++++++- src/App.jsx | 9 +- .../QuestionnaireForm/QuestionnaireForm.jsx | 36 +- .../buildPopulatedResourceBundle.js | 5 + src/elmExecutor/executeElm.js | 15 +- src/util/fetchArtifacts.js | 32 +- 6 files changed, 608 insertions(+), 24 deletions(-) diff --git a/databaseData/db.json b/databaseData/db.json index b6c7d2dc..62084257 100644 --- a/databaseData/db.json +++ b/databaseData/db.json @@ -1,5 +1,534 @@ { - "clients": [], - "logs": [], - "count": 0 + "clients": [ + { + "name": "http://localhost:8080/test-ehr/r4", + "client": "app-login", + "id": 0 + } + ], + "logs": [ + { + "status": "launching", + "launchContextId": "7eec70e0-9ae2-42b5-9481-728b1f649f4d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 1 + }, + { + "status": "launching", + "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 2 + }, + { + "status": "launching", + "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 3 + }, + { + "status": "launching", + "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 4 + }, + { + "status": "launching", + "launchContextId": "185a1bb9-3667-41b0-bafb-241e38171033", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 5 + }, + { + "status": "launching", + "launchContextId": "185a1bb9-3667-41b0-bafb-241e38171033", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 6 + }, + { + "status": "launching", + "launchContextId": "25c66900-06fb-4531-9ee7-ce99a139d92d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 7 + }, + { + "status": "launching", + "launchContextId": "660de322-f972-4bfc-bd6f-9a09fe30a4fc", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 8 + }, + { + "status": "launching", + "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 9 + }, + { + "status": "launching", + "launchContextId": "047ca578-a5bf-49b7-96c5-6711c4993df3", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 10 + }, + { + "status": "launching", + "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 11 + }, + { + "status": "launching", + "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 12 + }, + { + "status": "launching", + "launchContextId": "a807709a-d0ba-4025-b411-768a2ce84507", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 13 + }, + { + "status": "launching", + "launchContextId": "a807709a-d0ba-4025-b411-768a2ce84507", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 14 + }, + { + "status": "launching", + "launchContextId": "40b7ebde-a998-4d70-b0d6-656471ee3ffb", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 15 + }, + { + "status": "launching", + "launchContextId": "40b7ebde-a998-4d70-b0d6-656471ee3ffb", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 16 + }, + { + "status": "launching", + "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 17 + }, + { + "status": "launching", + "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 18 + }, + { + "status": "launching", + "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 19 + }, + { + "status": "launching", + "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 20 + }, + { + "status": "launching", + "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 21 + }, + { + "status": "launching", + "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 22 + }, + { + "status": "launching", + "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 23 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 24 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 25 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 26 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 27 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 28 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 29 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 30 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 31 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 32 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 33 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 34 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 35 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 36 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 37 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 38 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 39 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 40 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 41 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 42 + }, + { + "status": "launching", + "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 43 + }, + { + "status": "launching", + "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 44 + }, + { + "status": "launching", + "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 45 + }, + { + "status": "launching", + "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 46 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 47 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 48 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 49 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 50 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 51 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 52 + }, + { + "status": "launching", + "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 53 + }, + { + "status": "launching", + "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 54 + }, + { + "status": "launching", + "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 55 + }, + { + "status": "launching", + "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 56 + }, + { + "status": "launching", + "launchContextId": "19ac4b59-5ee3-4d25-b698-d175aadec9a6", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 57 + }, + { + "status": "launching", + "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 58 + }, + { + "status": "launching", + "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 59 + }, + { + "status": "launching", + "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 60 + }, + { + "status": "launching", + "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 61 + }, + { + "status": "launching", + "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 62 + }, + { + "status": "launching", + "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 63 + }, + { + "status": "launching", + "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 64 + }, + { + "status": "launching", + "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 65 + }, + { + "status": "launching", + "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 66 + }, + { + "status": "launching", + "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 67 + }, + { + "status": "launching", + "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 68 + }, + { + "status": "launching", + "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 69 + }, + { + "status": "launching", + "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 70 + }, + { + "status": "launching", + "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 71 + }, + { + "status": "launching", + "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 72 + }, + { + "status": "launching", + "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 73 + }, + { + "status": "launching", + "launchContextId": "8f450b14-083c-4d23-b74d-fdf56a14d80a", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 74 + }, + { + "status": "launching", + "launchContextId": "4fc55611-36b8-40a0-967b-4b65568602c9", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 75 + }, + { + "status": "launching", + "launchContextId": "4fc55611-36b8-40a0-967b-4b65568602c9", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 76 + }, + { + "status": "launching", + "launchContextId": "2b6c2bbc-81bb-483c-bd33-8a88acbe30af", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 77 + }, + { + "status": "launching", + "launchContextId": "2b6c2bbc-81bb-483c-bd33-8a88acbe30af", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 78 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 79 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 80 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 81 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 82 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 83 + }, + { + "status": "launching", + "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 84 + }, + { + "status": "launching", + "launchContextId": "4fe4a089-4b47-430a-b03b-70407486f073", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 85 + }, + { + "status": "launching", + "launchContextId": "4fe4a089-4b47-430a-b03b-70407486f073", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 86 + }, + { + "status": "launching", + "launchContextId": "614158c1-9844-49fe-855f-7d015365ab28", + "serviceUri": "http://localhost:8080/test-ehr/r4", + "id": 87 + } + ], + "count": 88 } \ No newline at end of file diff --git a/src/App.jsx b/src/App.jsx index 190eb598..001eb83c 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -129,7 +129,7 @@ export default class App extends Component { this.setState({ questionnaire: artifacts.questionnaire }); this.setState({ deviceRequest: deviceRequest }); this.setState({ isAdaptiveFormWithoutExtension: artifacts.questionnaire.meta && artifacts.questionnaire.meta.profile && artifacts.questionnaire.meta.profile.includes("http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-adapt") && (artifacts.questionnaire.extension === undefined || !artifacts.questionnaire.extension.includes(e => e.url === "http://hl7.org/fhir/StructureDefinition/cqf-library")) }); - + this.setState({ }); // execute for each main library return Promise.all( artifacts.mainLibraryElms.map(mainLibraryElm => { @@ -157,7 +157,7 @@ export default class App extends Component { const executionInputs = { elm: mainLibraryElm, // look at main library elms to determine dependent elms to include - elmDependencies: mainLibraryElm.library.includes.def.map( + elmDependencies: mainLibraryElm.library.includes ? mainLibraryElm.library.includes.def.map( includeStatement => { let foundLibrary = artifacts.dependentElms.find(elm => { return ( @@ -172,7 +172,7 @@ export default class App extends Component { this.consoleLog(`Could not find library ${includeStatement.path}. Check if it is referenced in FHIR Library (${mainLibraryElm.library.identifier.id}) properly.`, `errorClass`) } } - ), + ) : undefined, valueSetDB: {}, parameters: parameterObj, mainLibraryMaps: artifacts.mainLibraryMaps @@ -263,6 +263,9 @@ export default class App extends Component { // fill the valueSetDB in executionInputs with the required valuesets from their artifact source fillValueSetDB(executionInputs, artifacts) { + if (!executionInputs.elmDependencies) { + return; + } // create list of all ELMs that will be used let allElms = executionInputs.elmDependencies.slice(); allElms.push(executionInputs.elm); diff --git a/src/components/QuestionnaireForm/QuestionnaireForm.jsx b/src/components/QuestionnaireForm/QuestionnaireForm.jsx index 0d1c96c0..263a2021 100644 --- a/src/components/QuestionnaireForm/QuestionnaireForm.jsx +++ b/src/components/QuestionnaireForm/QuestionnaireForm.jsx @@ -451,7 +451,7 @@ export default class QuestionnaireForm extends Component { getLibraryPrepopulationResult(item, cqlResults) { let prepopulationResult; item.extension.forEach(e => { - let value; + let value, valueExpression; if ( e.url === "http://hl7.org/fhir/StructureDefinition/cqif-calculatedValue" @@ -464,26 +464,34 @@ export default class QuestionnaireForm extends Component { ) { // r4 value = findValueByPrefix(e, "value"); - value = value.expression; + valueExpression = value.expression; } else { // not a cql statement reference return; } - // split library designator from statement - const valueComponents = value.split("."); let libraryName; let statementName; - if (valueComponents.length > 1) { - libraryName = valueComponents[0].substring( - 1, - valueComponents[0].length - 1 - ); - statementName = valueComponents[1]; - } else { - // if there is not library name grab the first library name - statementName = value; - libraryName = Object.keys(cqlResults)[0]; + // this is embedded CQL in Questionnaire + if(value.language === "application/elm+json") { + libraryName = "LibraryLinkId" + item.linkId; + statementName = "linkId." + item.linkId; + } + else { + // split library designator from statement + const valueComponents = valueExpression.split("."); + + if (valueComponents.length > 1) { + libraryName = valueComponents[0].substring( + 1, + valueComponents[0].length - 1 + ); + statementName = valueComponents[1]; + } else { + // if there is not library name grab the first library name + statementName = valueExpression; + libraryName = Object.keys(cqlResults)[0]; + } } if (cqlResults[libraryName] != null) { diff --git a/src/elmExecutor/buildPopulatedResourceBundle.js b/src/elmExecutor/buildPopulatedResourceBundle.js index cc51b023..feaee0e4 100644 --- a/src/elmExecutor/buildPopulatedResourceBundle.js +++ b/src/elmExecutor/buildPopulatedResourceBundle.js @@ -192,6 +192,11 @@ function buildPopulatedResourceBundle( } }; + // at least grab patient + if(!neededResources) { + neededResources = []; + neededResources.push("Patient"); + } readResources(neededResources.slice(), () => { const bundle = { resourceType: "Bundle", diff --git a/src/elmExecutor/executeElm.js b/src/elmExecutor/executeElm.js index 8275a8f8..1e700a8b 100644 --- a/src/elmExecutor/executeElm.js +++ b/src/elmExecutor/executeElm.js @@ -1,6 +1,5 @@ import cql from "cql-execution"; import cqlfhir from "cql-exec-fhir"; -// import fhirhelpersElm from "./FHIRHelpers.json"; import extractFhirResourcesThatNeedFetching from "./extractFhirResourcesThatNeedFetching"; import buildPopulatedResourceBundle from "./buildPopulatedResourceBundle"; @@ -56,8 +55,18 @@ function findDifference(array1, array2) { function executeElmAgainstPatientSource(executionInputs, patientSource) { // executionInputs.elmDependencies = [ fhirhelpersElm ] - const repository = new cql.Repository(executionInputs.elmDependencies); - const lib = new cql.Library(executionInputs.elm, repository); + let repository = undefined; + if(executionInputs.elmDependencies) { + repository = new cql.Repository(executionInputs.elmDependencies); + } + + let lib = undefined; + if(repository) { + lib = new cql.Library(executionInputs.elm, repository); + } else { + lib = new cql.Library(executionInputs.elm); + } + const codeService = new cql.CodeService(executionInputs.valueSetDB); const executor = new cql.Executor(lib, codeService, executionInputs.parameters); const results = executor.exec(patientSource); diff --git a/src/util/fetchArtifacts.js b/src/util/fetchArtifacts.js index 3c9a4da6..3e660ecc 100644 --- a/src/util/fetchArtifacts.js +++ b/src/util/fetchArtifacts.js @@ -24,7 +24,8 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers dependentElms: [], valueSets: [], mainLibraryMaps: null, - isAdaptiveFormWithoutExtension: false + isAdaptiveFormWithoutExtension: false, + questionnaireElms: [] }; function resolveIfDone(){ @@ -33,6 +34,33 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers else reject("Failed to fetch all artifacts."); } + function findQuestionnaireEmbeddedCql(inputItems) { + inputItems.forEach(item => { + const itemExtensions = item.extension; + if(item.extension) { + let findEmbeddedCql = item.extension.find(ext => + ext.url === "http://hl7.org/fhir/uv/sdc/StructureDefinition/sdc-questionnaire-initialExpression" + && ext.valueExpression && ext.valueExpression.language === "application/elm+json"); + + if(findEmbeddedCql) { + const itemLibrary = JSON.parse(findEmbeddedCql.valueExpression.expression); + itemLibrary.library.identifier= { + id: "LibraryLinkId" + item.linkId, + version: "0.0.1" + }; + retVal.questionnaireElms.push(itemLibrary); + elmLibraryMaps[itemLibrary.library.identifier.id] = itemLibrary; + retVal.mainLibraryMaps = elmLibraryMaps; + retVal.mainLibraryElms.push(itemLibrary); + } + } + + if(item.item !== undefined && item.item.length > 0) { + findQuestionnaireEmbeddedCql(item.item); + } + }); + } + pendingFetches += 1; consoleLog("fetching questionnaire and elms", "infoClass"); consoleLog(questionnaireReference, "infoClass"); @@ -46,6 +74,8 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers fetchedUrls.add(questionnaireReference); + findQuestionnaireEmbeddedCql(questionnaire.item); + if (questionnaire.extension !== undefined) { // grab all main elm urls // R4 resources use cqf library. From 845437ad12706b1c7ca08361a591ff047e652c25 Mon Sep 17 00:00:00 2001 From: Liu Date: Tue, 1 Mar 2022 13:42:02 -0500 Subject: [PATCH 2/3] handle adaptive form --- src/components/QuestionnaireForm/QuestionnaireForm.jsx | 2 +- src/util/fetchArtifacts.js | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/QuestionnaireForm/QuestionnaireForm.jsx b/src/components/QuestionnaireForm/QuestionnaireForm.jsx index 263a2021..de291f5b 100644 --- a/src/components/QuestionnaireForm/QuestionnaireForm.jsx +++ b/src/components/QuestionnaireForm/QuestionnaireForm.jsx @@ -475,7 +475,7 @@ export default class QuestionnaireForm extends Component { // this is embedded CQL in Questionnaire if(value.language === "application/elm+json") { libraryName = "LibraryLinkId" + item.linkId; - statementName = "linkId." + item.linkId; + statementName = "LinkId." + item.linkId; } else { // split library designator from statement diff --git a/src/util/fetchArtifacts.js b/src/util/fetchArtifacts.js index 3e660ecc..d2be597f 100644 --- a/src/util/fetchArtifacts.js +++ b/src/util/fetchArtifacts.js @@ -24,8 +24,7 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers dependentElms: [], valueSets: [], mainLibraryMaps: null, - isAdaptiveFormWithoutExtension: false, - questionnaireElms: [] + isAdaptiveFormWithoutExtension: false }; function resolveIfDone(){ @@ -35,6 +34,9 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers } function findQuestionnaireEmbeddedCql(inputItems) { + if(!inputItems) { + return; + } inputItems.forEach(item => { const itemExtensions = item.extension; if(item.extension) { @@ -48,7 +50,6 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers id: "LibraryLinkId" + item.linkId, version: "0.0.1" }; - retVal.questionnaireElms.push(itemLibrary); elmLibraryMaps[itemLibrary.library.identifier.id] = itemLibrary; retVal.mainLibraryMaps = elmLibraryMaps; retVal.mainLibraryElms.push(itemLibrary); @@ -111,6 +112,8 @@ function fetchArtifacts(fhirPrefix, filePrefix, questionnaireReference, fhirVers //fetchedUrls.add(questionnaireReference); + findQuestionnaireEmbeddedCql(questionnaire.item); + if (questionnaire.extension !== undefined) { // grab all main elm urls // R4 resources use cqf library. From 5bd5c46e41737021c65bbd8a05060c28e73f059e Mon Sep 17 00:00:00 2001 From: Liu Date: Thu, 3 Mar 2022 14:29:00 -0500 Subject: [PATCH 3/3] revert db json changes --- databaseData/db.json | 536 +------------------------------------------ 1 file changed, 4 insertions(+), 532 deletions(-) diff --git a/databaseData/db.json b/databaseData/db.json index 62084257..c228d7d5 100644 --- a/databaseData/db.json +++ b/databaseData/db.json @@ -1,534 +1,6 @@ + { - "clients": [ - { - "name": "http://localhost:8080/test-ehr/r4", - "client": "app-login", - "id": 0 - } - ], - "logs": [ - { - "status": "launching", - "launchContextId": "7eec70e0-9ae2-42b5-9481-728b1f649f4d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 1 - }, - { - "status": "launching", - "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 2 - }, - { - "status": "launching", - "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 3 - }, - { - "status": "launching", - "launchContextId": "907a8250-6463-4318-bc48-5d097de63aaf", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 4 - }, - { - "status": "launching", - "launchContextId": "185a1bb9-3667-41b0-bafb-241e38171033", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 5 - }, - { - "status": "launching", - "launchContextId": "185a1bb9-3667-41b0-bafb-241e38171033", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 6 - }, - { - "status": "launching", - "launchContextId": "25c66900-06fb-4531-9ee7-ce99a139d92d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 7 - }, - { - "status": "launching", - "launchContextId": "660de322-f972-4bfc-bd6f-9a09fe30a4fc", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 8 - }, - { - "status": "launching", - "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 9 - }, - { - "status": "launching", - "launchContextId": "047ca578-a5bf-49b7-96c5-6711c4993df3", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 10 - }, - { - "status": "launching", - "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 11 - }, - { - "status": "launching", - "launchContextId": "69d6dd88-c5e5-4d8f-b8a6-d8acd91ff9a2", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 12 - }, - { - "status": "launching", - "launchContextId": "a807709a-d0ba-4025-b411-768a2ce84507", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 13 - }, - { - "status": "launching", - "launchContextId": "a807709a-d0ba-4025-b411-768a2ce84507", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 14 - }, - { - "status": "launching", - "launchContextId": "40b7ebde-a998-4d70-b0d6-656471ee3ffb", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 15 - }, - { - "status": "launching", - "launchContextId": "40b7ebde-a998-4d70-b0d6-656471ee3ffb", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 16 - }, - { - "status": "launching", - "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 17 - }, - { - "status": "launching", - "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 18 - }, - { - "status": "launching", - "launchContextId": "fa1555db-189b-4041-b930-ed7741c35e68", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 19 - }, - { - "status": "launching", - "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 20 - }, - { - "status": "launching", - "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 21 - }, - { - "status": "launching", - "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 22 - }, - { - "status": "launching", - "launchContextId": "0fb71511-6cb3-4301-966e-fd61d8cc0d6d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 23 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 24 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 25 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 26 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 27 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 28 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 29 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 30 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 31 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 32 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 33 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 34 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 35 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 36 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 37 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 38 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 39 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 40 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 41 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 42 - }, - { - "status": "launching", - "launchContextId": "446c183b-a46e-4609-9b00-0fb323877d38", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 43 - }, - { - "status": "launching", - "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 44 - }, - { - "status": "launching", - "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 45 - }, - { - "status": "launching", - "launchContextId": "9a9766f9-ed76-4a7f-ae68-077b75a2d799", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 46 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 47 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 48 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 49 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 50 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 51 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 52 - }, - { - "status": "launching", - "launchContextId": "acfb4bfe-5e77-4456-a22d-3937f2a6509d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 53 - }, - { - "status": "launching", - "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 54 - }, - { - "status": "launching", - "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 55 - }, - { - "status": "launching", - "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 56 - }, - { - "status": "launching", - "launchContextId": "19ac4b59-5ee3-4d25-b698-d175aadec9a6", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 57 - }, - { - "status": "launching", - "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 58 - }, - { - "status": "launching", - "launchContextId": "76dbcbf6-b89c-4448-a9c2-321ed0965468", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 59 - }, - { - "status": "launching", - "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 60 - }, - { - "status": "launching", - "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 61 - }, - { - "status": "launching", - "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 62 - }, - { - "status": "launching", - "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 63 - }, - { - "status": "launching", - "launchContextId": "707d3d3b-8db5-4647-85ff-f0c0c9d97827", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 64 - }, - { - "status": "launching", - "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 65 - }, - { - "status": "launching", - "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 66 - }, - { - "status": "launching", - "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 67 - }, - { - "status": "launching", - "launchContextId": "e4f6a7d9-2c8e-4aa9-9556-b271aa52230b", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 68 - }, - { - "status": "launching", - "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 69 - }, - { - "status": "launching", - "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 70 - }, - { - "status": "launching", - "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 71 - }, - { - "status": "launching", - "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 72 - }, - { - "status": "launching", - "launchContextId": "82e41e72-2b80-4dab-bb1a-0f2a6aee6a5d", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 73 - }, - { - "status": "launching", - "launchContextId": "8f450b14-083c-4d23-b74d-fdf56a14d80a", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 74 - }, - { - "status": "launching", - "launchContextId": "4fc55611-36b8-40a0-967b-4b65568602c9", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 75 - }, - { - "status": "launching", - "launchContextId": "4fc55611-36b8-40a0-967b-4b65568602c9", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 76 - }, - { - "status": "launching", - "launchContextId": "2b6c2bbc-81bb-483c-bd33-8a88acbe30af", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 77 - }, - { - "status": "launching", - "launchContextId": "2b6c2bbc-81bb-483c-bd33-8a88acbe30af", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 78 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 79 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 80 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 81 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 82 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 83 - }, - { - "status": "launching", - "launchContextId": "18f681c5-49f0-471c-b16b-bdc8e0c76427", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 84 - }, - { - "status": "launching", - "launchContextId": "4fe4a089-4b47-430a-b03b-70407486f073", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 85 - }, - { - "status": "launching", - "launchContextId": "4fe4a089-4b47-430a-b03b-70407486f073", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 86 - }, - { - "status": "launching", - "launchContextId": "614158c1-9844-49fe-855f-7d015365ab28", - "serviceUri": "http://localhost:8080/test-ehr/r4", - "id": 87 - } - ], - "count": 88 + "clients": [], + "logs": [], + "count": 0 } \ No newline at end of file