Fix problem expanding flat code systems

This commit is contained in:
Grahame Grieve 2020-04-21 10:00:30 +10:00
parent 87bcdd36c6
commit e76c65e6c9
3 changed files with 68 additions and 5 deletions

View File

@ -81,6 +81,7 @@ import org.hl7.fhir.r5.model.TerminologyCapabilities.TerminologyCapabilitiesCode
import org.hl7.fhir.r5.model.ValueSet; import org.hl7.fhir.r5.model.ValueSet;
import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent; import org.hl7.fhir.r5.model.ValueSet.ConceptSetComponent;
import org.hl7.fhir.r5.model.ValueSet.ValueSetComposeComponent; import org.hl7.fhir.r5.model.ValueSet.ValueSetComposeComponent;
import org.hl7.fhir.r5.terminologies.CodeSystemUtilities;
import org.hl7.fhir.r5.terminologies.TerminologyClient; import org.hl7.fhir.r5.terminologies.TerminologyClient;
import org.hl7.fhir.r5.terminologies.ValueSetCheckerSimple; import org.hl7.fhir.r5.terminologies.ValueSetCheckerSimple;
import org.hl7.fhir.r5.terminologies.ValueSetExpander.TerminologyServiceErrorClass; import org.hl7.fhir.r5.terminologies.ValueSetExpander.TerminologyServiceErrorClass;
@ -265,9 +266,10 @@ public abstract class BaseWorkerContext extends I18nBase implements IWorkerConte
structures.see(sd, packageInfo); structures.see(sd, packageInfo);
} else if (r instanceof ValueSet) } else if (r instanceof ValueSet)
valueSets.see((ValueSet) m, packageInfo); valueSets.see((ValueSet) m, packageInfo);
else if (r instanceof CodeSystem) else if (r instanceof CodeSystem) {
CodeSystemUtilities.crossLinkCodeSystem((CodeSystem) r);
codeSystems.see((CodeSystem) m, packageInfo); codeSystems.see((CodeSystem) m, packageInfo);
else if (r instanceof ImplementationGuide) } else if (r instanceof ImplementationGuide)
guides.see((ImplementationGuide) m, packageInfo); guides.see((ImplementationGuide) m, packageInfo);
else if (r instanceof CapabilityStatement) else if (r instanceof CapabilityStatement)
capstmts.see((CapabilityStatement) m, packageInfo); capstmts.see((CapabilityStatement) m, packageInfo);

View File

@ -49,6 +49,8 @@ import org.hl7.fhir.utilities.Utilities;
public class CodeSystemUtilities { public class CodeSystemUtilities {
public static final String USER_DATA_CROSS_LINK = "cs.utils.cross.link";
public static class CodeSystemNavigator { public static class CodeSystemNavigator {
private CodeSystem cs; private CodeSystem cs;
@ -345,6 +347,17 @@ public class CodeSystemUtilities {
return null; return null;
} }
public static List<ConceptPropertyComponent> getPropertyValues(ConceptDefinitionComponent concept, String code) {
List<ConceptPropertyComponent> res = new ArrayList<>();
for (ConceptPropertyComponent p : concept.getProperty()) {
if (p.getCode().equals(code)) {
res.add(p);
}
}
return res;
}
// see http://hl7.org/fhir/R4/codesystem.html#hierachy // see http://hl7.org/fhir/R4/codesystem.html#hierachy
// returns additional parents not in the heirarchy // returns additional parents not in the heirarchy
public static List<String> getOtherChildren(CodeSystem cs, ConceptDefinitionComponent c) { public static List<String> getOtherChildren(CodeSystem cs, ConceptDefinitionComponent c) {
@ -416,4 +429,40 @@ public class CodeSystemUtilities {
return null; return null;
} }
public static void crossLinkCodeSystem(CodeSystem cs) {
String parent = getPropertyByUrl(cs, "http://hl7.org/fhir/concept-properties#parent");
if ((parent != null)) {
crossLinkConcepts(cs.getConcept(), cs.getConcept(), parent);
}
}
private static String getPropertyByUrl(CodeSystem cs, String url) {
for (PropertyComponent pc : cs.getProperty()) {
if (url.equals(pc.getUri())) {
return pc.getCode();
}
}
return null;
}
private static void crossLinkConcepts(List<ConceptDefinitionComponent> root, List<ConceptDefinitionComponent> focus, String parent) {
for (ConceptDefinitionComponent def : focus) {
List<ConceptPropertyComponent> pcl = getPropertyValues(def, parent);
for (ConceptPropertyComponent pc : pcl) {
String code = pc.getValue().primitiveValue();
ConceptDefinitionComponent tgt = findCode(root, code);
if (!tgt.hasUserData(USER_DATA_CROSS_LINK)) {
tgt.setUserData(USER_DATA_CROSS_LINK, new ArrayList<>());
}
@SuppressWarnings("unchecked")
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) tgt.getUserData(USER_DATA_CROSS_LINK);
children.add(def);
}
if (def.hasConcept()) {
crossLinkConcepts(root, def.getConcept(), parent);
}
}
}
} }

View File

@ -215,11 +215,23 @@ public class ValueSetExpanderSimple implements ValueSetExpander {
boolean inc = CodeSystemUtilities.isInactive(cs, def); boolean inc = CodeSystemUtilities.isInactive(cs, def);
if (canBeHeirarchy || !abs) if (canBeHeirarchy || !abs)
np = addCode(system, def.getCode(), def.getDisplay(), parent, def.getDesignation(), expParams, abs, inc, filters); np = addCode(system, def.getCode(), def.getDisplay(), parent, def.getDesignation(), expParams, abs, inc, filters);
for (ConceptDefinitionComponent c : def.getConcept()) for (ConceptDefinitionComponent c : def.getConcept()) {
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion); addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion);
}
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
for (ConceptDefinitionComponent c : children)
addCodeAndDescendents(cs, system, c, np, expParams, filters, exclusion);
}
} else { } else {
for (ConceptDefinitionComponent c : def.getConcept()) for (ConceptDefinitionComponent c : def.getConcept()) {
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion); addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion);
}
if (def.hasUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK)) {
List<ConceptDefinitionComponent> children = (List<ConceptDefinitionComponent>) def.getUserData(CodeSystemUtilities.USER_DATA_CROSS_LINK);
for (ConceptDefinitionComponent c : children)
addCodeAndDescendents(cs, system, c, null, expParams, filters, exclusion);
}
} }
} }