Skip to content

Commit c423c0b

Browse files
authored
Update $ersd-v2-import to preserve 'reporting' intendedUsageContext (#1061)
1 parent 0641dff commit c423c0b

2 files changed

Lines changed: 48 additions & 28 deletions

File tree

cqf-fhir-cr/src/main/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducer.java

Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -112,27 +112,29 @@ public static List<Bundle.BundleEntryComponent> transformImportBundle(
112112
switch (resource.getResourceType()) {
113113
case ValueSet:
114114
var valueSet = (ValueSet) resource;
115-
List<UsageContext> conditionsList = new ArrayList<>();
115+
List<UsageContext> genericContextList = new ArrayList<>();
116116
List<UsageContext> priorityList = new ArrayList<>();
117117
valueSet.setIdentifier(fixIdentifiers(valueSet.getIdentifier()));
118118
var valueSetCanonicalUrl = adapterFactory
119119
.createKnowledgeArtifactAdapter(valueSet)
120120
.getCanonical();
121-
extractPrioritiesAndConditions(
122-
valueSet.getUseContext(), priorityList, conditionsList, valueSetCanonicalUrl);
121+
extractUsageContexts(
122+
valueSet.getUseContext(), priorityList, genericContextList, valueSetCanonicalUrl);
123123
if (hasGrouperCompose(valueSet)) {
124124
prepareGrouperValueSet(valueSet, appAuthoritativeUrl);
125-
groupers.add(
126-
relatedArtifactFromGrouperUrl(valueSetCanonicalUrl, conditionsList, priorityList));
125+
groupers.add(relatedArtifactFromGrouperUrl(
126+
valueSetCanonicalUrl, genericContextList, priorityList));
127127
} else {
128128
prepareLeafValueSet(valueSet);
129-
leafs.add(relatedArtifactFromLeafUrl(valueSetCanonicalUrl, conditionsList, priorityList));
129+
leafs.add(
130+
relatedArtifactFromLeafUrl(valueSetCanonicalUrl, genericContextList, priorityList));
130131
}
131132
// Remove conditions and priority from useContext of leaf valuesets and groupers
132133
var cleanedContext = valueSet.getUseContext().stream()
133134
.filter(ctx -> ctx.hasCode()
134135
&& !(ctx.getCode().getCode().equals("focus")
135-
|| ctx.getCode().getCode().equals("priority")))
136+
|| ctx.getCode().getCode().equals("priority")
137+
|| ctx.getCode().getCode().equals("reporting")))
136138
.collect(Collectors.toList());
137139
valueSet.setUseContext(cleanedContext);
138140
// Check if ValueSet already exists
@@ -249,10 +251,10 @@ static List<CanonicalType> removeProfileFromList(List<CanonicalType> profiles, S
249251
.collect(Collectors.toList());
250252
}
251253

252-
static void extractPrioritiesAndConditions(
254+
static void extractUsageContexts(
253255
List<UsageContext> contexts,
254256
List<UsageContext> priorityList,
255-
List<UsageContext> conditionsList,
257+
List<UsageContext> genericContextList,
256258
String valueSetCanonicalUrl) {
257259

258260
if (contexts == null || contexts.isEmpty()) return;
@@ -262,7 +264,7 @@ static void extractPrioritiesAndConditions(
262264
if (!isValidUsageContext) continue;
263265

264266
switch (context.getCode().getCode()) {
265-
case "focus" -> conditionsList.add(context);
267+
case "focus", "reporting" -> genericContextList.add(context);
266268
case "priority" -> handlePriorityContext(context, priorityList, valueSetCanonicalUrl);
267269
default -> {
268270
/* ignore other usage contexts */
@@ -360,16 +362,16 @@ private static void prepareRCTCLibrary(Library rctcLibrary, Set<RelatedArtifact>
360362
}
361363

362364
private static RelatedArtifact relatedArtifactFromGrouperUrl(
363-
String grouperUrl, List<UsageContext> conditions, List<UsageContext> priorities) {
365+
String grouperUrl, List<UsageContext> genericContexts, List<UsageContext> priorities) {
364366
var relatedArtifact = new RelatedArtifact();
365367
relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.COMPOSEDOF);
366368
relatedArtifact.setResource(grouperUrl);
367369
var isOwnedExtension = new Extension();
368370
isOwnedExtension.setUrl(TransformProperties.crmiIsOwned);
369371
isOwnedExtension.setValue(new BooleanType(true));
370372
var extensions = new ArrayList<Extension>();
371-
extensions.addAll(
372-
processUsageContextMapForLibrary(conditions, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
373+
extensions.addAll(processUsageContextMapForLibrary(
374+
genericContexts, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
373375
extensions.addAll(
374376
processUsageContextMapForLibrary(priorities, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
375377
extensions.add(isOwnedExtension);
@@ -378,13 +380,13 @@ private static RelatedArtifact relatedArtifactFromGrouperUrl(
378380
}
379381

380382
private static RelatedArtifact relatedArtifactFromLeafUrl(
381-
String leafUrl, List<UsageContext> conditions, List<UsageContext> priorities) {
383+
String leafUrl, List<UsageContext> genericContexts, List<UsageContext> priorities) {
382384
var relatedArtifact = new RelatedArtifact();
383385
relatedArtifact.setType(RelatedArtifact.RelatedArtifactType.DEPENDSON);
384386
relatedArtifact.setResource(leafUrl);
385387
var extensions = new ArrayList<Extension>();
386-
extensions.addAll(
387-
processUsageContextMapForLibrary(conditions, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
388+
extensions.addAll(processUsageContextMapForLibrary(
389+
genericContexts, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
388390
extensions.addAll(
389391
processUsageContextMapForLibrary(priorities, TransformProperties.CRMI_INTENDED_USAGE_CONTEXT_EXT_URL));
390392
relatedArtifact.setExtension(extensions);

cqf-fhir-cr/src/test/java/org/opencds/cqf/fhir/cr/ecr/r4/R4ImportBundleProducerTest.java

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ void testRootLibraryImport() throws FhirResourceExistsException {
147147
conditionUsageContext.getValueCodeableConcept().getText());
148148

149149
UsageContext priorityUsageContext =
150-
(UsageContext) ra.get(0).getExtension().get(1).getValue();
150+
(UsageContext) ra.get(0).getExtension().get(2).getValue();
151151
assertEquals("priority", priorityUsageContext.getCode().getCode());
152152
assertEquals(
153153
"routine",
@@ -248,8 +248,8 @@ void testImportOperation() {
248248
}
249249

250250
@Test
251-
void testExtractPrioritiesAndConditionsPopulatesLists() {
252-
// focus usage context goes to conditions
251+
void testExtractUsageContextsPopulatesLists() {
252+
// focus usage context goes to genericUseContexts
253253
UsageContext context1 = new UsageContext();
254254
context1.setCode(new Coding().setCode("focus"));
255255
context1.setValue(new CodeableConcept().setText("Condition1").addCoding(new Coding().setCode("condition1")));
@@ -259,24 +259,38 @@ void testExtractPrioritiesAndConditionsPopulatesLists() {
259259
context2.setCode(new Coding().setCode("priority"));
260260
context2.setValue(new CodeableConcept().addCoding(new Coding().setCode("routine")));
261261

262+
// reporting usage context goes to genericUseContexts
263+
UsageContext context3 = new UsageContext();
264+
context3.setCode(new Coding().setCode("reporting"));
265+
context3.setValue(new CodeableConcept().addCoding(new Coding().setCode("triggering")));
266+
262267
List<UsageContext> priorities = new ArrayList<>();
263-
List<UsageContext> conditions = new ArrayList<>();
268+
List<UsageContext> genericUseContexts = new ArrayList<>();
264269

265270
// Execute
266-
R4ImportBundleProducer.extractPrioritiesAndConditions(
267-
Arrays.asList(context1, context2), priorities, conditions, "fakeUrl");
271+
R4ImportBundleProducer.extractUsageContexts(
272+
Arrays.asList(context1, context2, context3), priorities, genericUseContexts, "fakeUrl");
268273

269274
// Verify
270275
assertEquals(1, priorities.size());
271276
assertEquals(
272277
"routine",
273278
priorities.get(0).getValueCodeableConcept().getCodingFirstRep().getCode());
274-
assertEquals(1, conditions.size());
275-
assertEquals("Condition1", conditions.get(0).getValueCodeableConcept().getText());
279+
assertEquals(2, genericUseContexts.size());
280+
assertEquals(
281+
"Condition1",
282+
genericUseContexts.get(0).getValueCodeableConcept().getText());
283+
assertEquals(
284+
"triggering",
285+
genericUseContexts
286+
.get(1)
287+
.getValueCodeableConcept()
288+
.getCodingFirstRep()
289+
.getCode());
276290
}
277291

278292
@Test
279-
void testExtractPrioritiesAndConditionsConflictingPrioritiesThrows() {
293+
void testExtractUsageContextsConflictingPrioritiesThrows() {
280294
UsageContext context1 = new UsageContext();
281295
context1.setCode(new Coding().setCode("priority"));
282296
context1.setValue(new CodeableConcept().addCoding(new Coding().setCode("urgent")));
@@ -285,13 +299,17 @@ void testExtractPrioritiesAndConditionsConflictingPrioritiesThrows() {
285299
context2.setCode(new Coding().setCode("priority"));
286300
context2.setValue(new CodeableConcept().addCoding(new Coding().setCode("routine")));
287301

302+
UsageContext context3 = new UsageContext();
303+
context3.setCode(new Coding().setCode("reporting"));
304+
context3.setValue(new CodeableConcept().addCoding(new Coding().setCode("triggering")));
305+
288306
List<UsageContext> priorities = new ArrayList<>();
289-
List<UsageContext> conditions = new ArrayList<>();
307+
List<UsageContext> genericUseContexts = new ArrayList<>();
290308

291309
assertThrows(
292310
UnprocessableEntityException.class,
293-
() -> R4ImportBundleProducer.extractPrioritiesAndConditions(
294-
Arrays.asList(context1, context2), priorities, conditions, "http://example.com/fhir"));
311+
() -> R4ImportBundleProducer.extractUsageContexts(
312+
Arrays.asList(context1, context2), priorities, genericUseContexts, "http://example.com/fhir"));
295313
}
296314

297315
@Test

0 commit comments

Comments
 (0)