use of com.b2international.snowowl.fhir.core.model.codesystem.CodeSystem in project snow-owl by b2ihealthcare.
the class BundleEntryTest method requestEntryWithResourceTest.
@Test
public void requestEntryWithResourceTest() throws Exception {
CodeSystem resource = CodeSystem.builder().status(PublicationStatus.ACTIVE).content(CodeSystemContentMode.COMPLETE).build();
ResourceRequestEntry entry = ResourceRequestEntry.builder().fullUrl("test_url").request(BatchRequest.createPostRequest("/CodeSystem")).resource(resource).build();
String json = objectMapper.writeValueAsString(entry);
Entry readEntry = objectMapper.readValue(json, Entry.class);
assertTrue(readEntry instanceof ResourceRequestEntry);
assertEquals("test_url", readEntry.getFullUrl().getUriValue());
}
use of com.b2international.snowowl.fhir.core.model.codesystem.CodeSystem in project snow-owl by b2ihealthcare.
the class FhirValidateCodeRequest method doExecute.
@Override
public ValidateCodeResult doExecute(ServiceProvider context, CodeSystem codeSystem) {
Set<Coding> codings = collectCodingsToValidate(request);
Map<String, Coding> codingsById = codings.stream().collect(Collectors.toMap(Coding::getCodeValue, c -> c));
// extract locales from the request
Map<String, Concept> conceptsById = CodeSystemRequests.prepareSearchConcepts().setLimit(codingsById.keySet().size()).filterByCodeSystemUri(codeSystem.getResourceURI()).filterByIds(codingsById.keySet()).setLocales(extractLocales(request.getDisplayLanguage())).buildAsync().execute(context).stream().collect(Collectors.toMap(Concept::getId, c -> c));
// check if both Maps have the same keys and report if not
Set<String> missingConceptIds = Sets.difference(codingsById.keySet(), conceptsById.keySet());
if (!missingConceptIds.isEmpty()) {
return ValidateCodeResult.builder().result(false).message(String.format("Could not find code%s '%s'.", missingConceptIds.size() == 1 ? "" : "s", ImmutableSortedSet.copyOf(missingConceptIds))).build();
}
// XXX it would be great to have support for multiple messages/validation results in a single request
for (String id : codingsById.keySet()) {
// check display if provided
Coding providedCoding = codingsById.get(id);
if (providedCoding.getDisplay() != null) {
Concept concept = conceptsById.get(id);
if (!providedCoding.getDisplay().equals(concept.getTerm())) {
return ValidateCodeResult.builder().result(false).display(concept.getTerm()).message(String.format("Incorrect display '%s' for code '%s'.", providedCoding.getDisplay(), providedCoding.getCodeValue())).build();
}
}
}
return ValidateCodeResult.builder().result(true).build();
}
use of com.b2international.snowowl.fhir.core.model.codesystem.CodeSystem in project snow-owl by b2ihealthcare.
the class FhirValueSetExpandRequest method computeFhirValueSetUsingUrl.
private ValueSet computeFhirValueSetUsingUrl(ServiceProvider context, String urlValue) {
// only URLs with query parts are supported, every other case is rejected for now
if (urlValue.contains("#")) {
return null;
}
// extract the non-query part from the URL value
String baseUrl = urlValue.split("\\?")[0];
String query = "";
if (urlValue.contains("?")) {
query = urlValue.split("\\?")[1];
}
// if this is the base URI string, then always append the core module to represent the International Edition properly
if (Uri.SNOMED_BASE_URI_STRING.equals(baseUrl)) {
baseUrl = baseUrl.concat("/900000000000207008");
}
// try to lookup the CodeSystem using the baseUrl
CodeSystem codeSystem = FhirRequests.codeSystems().prepareSearch().one().filterByUrl(baseUrl).buildAsync().execute(context).first().map(ResourceResponseEntry.class::cast).map(ResourceResponseEntry::getResponseResource).map(CodeSystem.class::cast).orElse(null);
// if no CodeSystem stored to use as Value Set source, return NotFound response
if (codeSystem == null) {
return null;
}
// return the content of the CodeSystem as Value Set
String id = Hashing.goodFastHash(8).hashString(urlValue, Charsets.UTF_8).toString();
Builder valueSet = ValueSet.builder(id).url(urlValue).status(PublicationStatus.ACTIVE);
final Expansion.Builder expansion = Expansion.builder().identifier(id).timestamp(new Date());
ConceptSearchRequestBuilder req = CodeSystemRequests.prepareSearchConcepts().filterByCodeSystemUri(codeSystem.getResourceURI()).filterByActive(request.getActiveOnly()).filterByTerm(request.getFilter()).setLimit(request.getCount() == null ? 10 : request.getCount()).setSearchAfter(request.getAfter()).setPreferredDisplay("FSN").sortBy(!CompareUtils.isEmpty(request.getFilter()) ? SearchIndexResourceRequest.SCORE : SearchResourceRequest.Sort.fieldAsc("id"));
Compose compose = null;
// configure query based on fhir_vs query parameter and also build the compose declaration for this implicit Value Set
if (Strings.isNullOrEmpty(query) || "fhir_vs".equals(query)) {
// do nothing, search all concepts
} else if (query.startsWith("fhir_vs=")) {
String fhirVsValue = query.replace("fhir_vs=", "");
if (fhirVsValue.startsWith("ecl/")) {
String ecl = fhirVsValue.replace("ecl/", "");
req.filterByQuery(ecl);
// configure Value Set for ECL
valueSet.name(String.format("%s Concepts matching %s", codeSystem.getName(), ecl)).description(String.format("All SNOMED CT concepts that match the expression constraint %s", ecl));
// configure compose for ECL
compose = Compose.builder().addInclude(Include.builder().addFilters(ValueSetFilter.builder().property("constraint").operator(FilterOperator.EQUALS).value(ecl).build()).build()).build();
} else if (fhirVsValue.startsWith("isa/")) {
String parent = fhirVsValue.replace("isa/", "");
req.filterByAncestor(parent);
// configure Value Set for IS A
valueSet.name(String.format("%s Concept %s and descendants", codeSystem.getName(), parent)).description(String.format("All SNOMED CT concepts for %s", parent));
// configure compose for IS A
compose = Compose.builder().addInclude(Include.builder().system(baseUrl).addFilters(ValueSetFilter.builder().property("concept").operator(FilterOperator.IS_A).value(parent).build()).build()).build();
} else if (fhirVsValue.startsWith("refset/")) {
String refsetId = fhirVsValue.replace("refset/", "");
if (Strings.isNullOrEmpty(refsetId)) {
// TODO support refset identifier concept search
return null;
} else {
req.filterByQuery("^" + refsetId);
// configure Value Set for REFSET
valueSet.name(String.format("%s Reference Set %s", codeSystem.getName(), refsetId)).description(String.format("All SNOMED CT concepts in the reference set %s", refsetId));
// configure compose for REFSET
compose = Compose.builder().addInclude(Include.builder().addFilters(ValueSetFilter.builder().property("concept").operator(FilterOperator.IN).value(refsetId).build()).build()).build();
}
} else {
// TODO check against declared filter values in CodeSystem
return null;
}
}
Concepts concepts = req.buildAsync().execute(context);
expansion.total(concepts.getTotal()).after(concepts.getSearchAfter());
for (Concept concept : concepts) {
expansion.addContains(Contains.builder().code(concept.getId()).system(baseUrl).display(concept.getTerm()).build());
}
return valueSet.compose(compose).expansion(expansion.build()).build();
}
Aggregations