-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathscreening-example.js
137 lines (124 loc) · 7.36 KB
/
screening-example.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import { readFileSync, writeFileSync } from 'fs';
import { applyAndMerge, simpleResolver } from 'encender';
const CervicalCancerDecisionAids = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/ActivityDefinition-CervicalCancerDecisionAids.json'));
const CervicalCancerManagementActivity = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/ActivityDefinition-CervicalCancerManagementActivity.json'));
const CervicalCancerScreeningActivity = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/ActivityDefinition-CervicalCancerScreeningActivity.json'));
const CommunicateErrors = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/ActivityDefinition-CommunicateErrors.json'));
const DisplayCervicalCancerMedicalHistory = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/ActivityDefinition-DisplayCervicalCancerMedicalHistory.json'));
const DashboardLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-DashboardLibrary.json'));
const ManagementLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ManagementLibrary.json'));
const OrderSetLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-OrderSetLibrary.json'));
const ScreeningAverageRiskLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ScreeningAverageRiskLibrary.json'));
const ScreeningDesExposureLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ScreeningDesExposureLibrary.json'));
const ScreeningImmunocompromisedLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ScreeningImmunocompromisedLibrary.json'));
const ScreeningLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ScreeningLibrary.json'));
const ScreeningSymptomaticLibrary = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Library-ScreeningSymptomaticLibrary.json'));
const CervicalCancerManagement = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/PlanDefinition-CervicalCancerManagement.json'));
const CervicalCancerManagementActions = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/PlanDefinition-CervicalCancerManagementActions.json'));
const CervicalCancerScreening = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/PlanDefinition-CervicalCancerScreening.json'));
const CervicalCancerScreeningActions = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/PlanDefinition-CervicalCancerScreeningActions.json'));
const CervicalCancerScreeningAndManagementClinicalDecisionSupport = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/PlanDefinition-CervicalCancerScreeningAndManagementClinicalDecisionSupport.json'));
const PertinentConditionQuestionnaire = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Questionnaire-PertinentConditionQuestionnaire.json'));
const PertinentObservationQuestionnaire = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Questionnaire-PertinentObservationQuestionnaire.json'));
const PertinentProcedureQuestionnaire = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Questionnaire-PertinentProcedureQuestionnaire.json'));
const PertinentVaccinationQuestionnaire = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Questionnaire-PertinentVaccinationQuestionnaire.json'));
const ScreeningAndManagementHistoryQuestionnaire = JSON.parse(readFileSync('fsh-tank/fsh-generated/resources/Questionnaire-ScreeningAndManagementHistoryQuestionnaire.json'));
// Bring in an example patient bundle from the test folder
const examplePatientBundle = JSON.parse(readFileSync('test/ScreeningAverageRisk/test_results/ScreeningAverageRiskLibrary_v1.0.0/bundles/Age_between_30_and_65_and_have_NOT_had_recent_cytology_test.json'));
const examplePatientResources = examplePatientBundle.entry.map(r => r.resource); // convert from bundle to flat array
// Read in ELM JSON representation of CDS logic
const elmJsonDependencyArray = [
JSON.parse(readFileSync('cql/AutogeneratedRiskTables.json')),
JSON.parse(readFileSync('cql/AutogeneratedTableLookup.json')),
JSON.parse(readFileSync('cql/CCSMCommonFunctions.json')),
JSON.parse(readFileSync('cql/CDSConnectCommonsforFHIRv401.json')),
JSON.parse(readFileSync('cql/CollateManagementData.json')),
JSON.parse(readFileSync('cql/DashboardLibrary.json')),
JSON.parse(readFileSync('cql/FHIRHelpers-4.0.1.json')),
JSON.parse(readFileSync('cql/ManageCommonAbnormality.json')),
JSON.parse(readFileSync('cql/ManageRareAbnormality.json')),
JSON.parse(readFileSync('cql/ManageSpecialPopulation.json')),
JSON.parse(readFileSync('cql/ManagementLibrary.json')),
JSON.parse(readFileSync('cql/OrderSetLibrary.json')),
JSON.parse(readFileSync('cql/ScreeningAverageRiskLibrary.json')),
JSON.parse(readFileSync('cql/ScreeningDesExposureLibrary.json')),
JSON.parse(readFileSync('cql/ScreeningImmunocompromisedLibrary.json')),
JSON.parse(readFileSync('cql/ScreeningLibrary.json')),
JSON.parse(readFileSync('cql/ScreeningSymptomaticLibrary.json'))
];
// Reformat ELM JSON value set references to match what is expected by the
// code service built into the cql execution engine
const elmJsonDependencies = elmJsonDependencyArray.reduce((acc, elm) => {
let refs = elm?.library?.valueSets?.def;
if (refs) {
refs = refs.map(r => {
return {
...r,
id: r.id.split('/').pop()
}
});
elm.library.valueSets.def = refs;
}
return {
...acc,
[elm.library.identifier.id]: elm
}
}, {});
// Read in cached value set JSON
let valueSetJson = JSON.parse(readFileSync('test/ScreeningAverageRisk/.vscache/valueset-db.json'));
// Reformat value sets to match format expected by code service built into the
// cql execution engine.
valueSetJson = Object.keys(valueSetJson).reduce((acc,vs) => {
return {
...acc,
[vs]: {
Latest: valueSetJson[vs]['Latest']['codes']
}
}
}, {});
// Put all FHIR resources into a single flat array
let fhirJsonArray = [
CervicalCancerDecisionAids,
CervicalCancerManagementActivity,
CervicalCancerScreeningActivity,
CommunicateErrors,
DisplayCervicalCancerMedicalHistory,
DashboardLibrary,
ManagementLibrary,
OrderSetLibrary,
ScreeningAverageRiskLibrary,
ScreeningDesExposureLibrary,
ScreeningImmunocompromisedLibrary,
ScreeningLibrary,
ScreeningSymptomaticLibrary,
CervicalCancerManagement,
CervicalCancerManagementActions,
CervicalCancerScreening,
CervicalCancerScreeningActions,
CervicalCancerScreeningAndManagementClinicalDecisionSupport,
PertinentConditionQuestionnaire,
PertinentObservationQuestionnaire,
PertinentProcedureQuestionnaire,
PertinentVaccinationQuestionnaire,
ScreeningAndManagementHistoryQuestionnaire,
...examplePatientResources
];
// Create resolver() function
const resolver = simpleResolver(fhirJsonArray);
// Specify patient reference
const patientId = examplePatientResources.filter(r => r.resourceType == 'Patient').map(p => p.id)[0];
const patientReference = 'Patient/' + patientId;
// Define aux object containing ELM JSON and value sets
const aux = {
elmJsonDependencies,
valueSetJson
};
// Run the $apply operations
const [RequestGroup, ...otherResources] = await applyAndMerge(CervicalCancerScreening, patientReference, resolver, aux);
// Concatenate all the resources created by $apply operation
let outputResources = [
RequestGroup,
otherResources
];
// Write them out to a file
writeFileSync('apply/screeningExampleOutput.json', JSON.stringify(outputResources,null,2));