From 51934de457b17331df7c6453d813f0a83f7b949f Mon Sep 17 00:00:00 2001 From: Grahame Grieve Date: Mon, 9 Sep 2024 17:47:33 +0800 Subject: [PATCH] Fix bug processing value set includes / excludes that are just value sets (no system value) --- .../fhir/r5/context/BaseWorkerContext.java | 8 ++- .../expansion/ValueSetExpander.java | 53 ++++++++++--------- 2 files changed, 33 insertions(+), 28 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java index e517398be..e33cc0bfa 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/context/BaseWorkerContext.java @@ -934,10 +934,14 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte throw new Error(formatMessage(I18nConstants.NO_VALUE_SET_IN_URL)); } for (ConceptSetComponent inc : vs.getCompose().getInclude()) { - codeSystemsUsed.add(inc.getSystem()); + if (inc.hasSystem()) { + codeSystemsUsed.add(inc.getSystem()); + } } for (ConceptSetComponent inc : vs.getCompose().getExclude()) { - codeSystemsUsed.add(inc.getSystem()); + if (inc.hasSystem()) { + codeSystemsUsed.add(inc.getSystem()); + } } CacheToken cacheToken = txCache.generateExpandToken(vs, hierarchical); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java index 28058becb..7e1cfbbf7 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/terminologies/expansion/ValueSetExpander.java @@ -606,33 +606,35 @@ public class ValueSetExpander extends ValueSetProcessBase { excludeCodes(wc, importValueSetForExclude(wc, imp.getValue(), exp, expParams, false, vs).getExpansion()); } - CodeSystem cs = context.fetchSupplementedCodeSystem(exc.getSystem()); - if ((cs == null || cs.getContent() != CodeSystemContentMode.COMPLETE) && context.supportsSystem(exc.getSystem(), opContext.getOptions().getFhirVersion())) { - ValueSetExpansionOutcome vse = context.expandVS(exc, false, false); - ValueSet valueset = vse.getValueset(); - if (valueset == null) - throw failTSE("Error Expanding ValueSet: "+vse.getError()); - excludeCodes(wc, valueset.getExpansion()); - return; - } - - for (ConceptReferenceComponent c : exc.getConcept()) { - excludeCode(wc, exc.getSystem(), c.getCode()); - } - - if (exc.getFilter().size() > 0) { - if (cs.getContent() == CodeSystemContentMode.FRAGMENT) { - addFragmentWarning(exp, cs); + if (exc.hasSystem()) { + CodeSystem cs = context.fetchSupplementedCodeSystem(exc.getSystem()); + if ((cs == null || cs.getContent() != CodeSystemContentMode.COMPLETE) && context.supportsSystem(exc.getSystem(), opContext.getOptions().getFhirVersion())) { + ValueSetExpansionOutcome vse = context.expandVS(exc, false, false); + ValueSet valueset = vse.getValueset(); + if (valueset == null) + throw failTSE("Error Expanding ValueSet: "+vse.getError()); + excludeCodes(wc, valueset.getExpansion()); + return; } - List filters = new ArrayList<>(); - for (int i = 1; i < exc.getFilter().size(); i++) { - WorkingContext wc1 = new WorkingContext(); - filters.add(wc1); - processFilter(exc, exp, expParams, null, cs, false, exc.getFilter().get(i), wc1, null, true); + + for (ConceptReferenceComponent c : exc.getConcept()) { + excludeCode(wc, exc.getSystem(), c.getCode()); + } + + if (exc.getFilter().size() > 0) { + if (cs.getContent() == CodeSystemContentMode.FRAGMENT) { + addFragmentWarning(exp, cs); + } + List filters = new ArrayList<>(); + for (int i = 1; i < exc.getFilter().size(); i++) { + WorkingContext wc1 = new WorkingContext(); + filters.add(wc1); + processFilter(exc, exp, expParams, null, cs, false, exc.getFilter().get(i), wc1, null, true); + } + ConceptSetFilterComponent fc = exc.getFilter().get(0); + WorkingContext wc1 = dwc; + processFilter(exc, exp, expParams, null, cs, false, fc, wc1, filters, true); } - ConceptSetFilterComponent fc = exc.getFilter().get(0); - WorkingContext wc1 = dwc; - processFilter(exc, exp, expParams, null, cs, false, fc, wc1, filters, true); } } @@ -728,7 +730,6 @@ public class ValueSetExpander extends ValueSetProcessBase { expParams = makeDefaultExpansion(); altCodeParams.seeParameters(expParams); altCodeParams.seeValueSet(source); - source.checkNoModifiers("ValueSet", "expanding"); focus = source.copy(); focus.setIdBase(null);