Skip to content

Commit 2d2261d

Browse files
authored
Merge pull request #1422 from b2ihealthcare/fix/SO-6343-valueset-include-designations-display-bug
SO-6343: Valueset include designations display bug
2 parents 70dbfb3 + 536bb48 commit 2d2261d

File tree

5 files changed

+37
-15
lines changed

5 files changed

+37
-15
lines changed

fhir/com.b2international.snowowl.fhir.rest.tests/src/com/b2international/snowowl/fhir/rest/tests/FhirRestTest.java

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@
2424
import org.junit.Before;
2525
import org.junit.Rule;
2626

27-
import com.b2international.snowowl.snomed.common.SnomedTerminologyComponentConstants;
2827
import com.b2international.snowowl.snomed.common.SnomedConstants.Concepts;
28+
import com.b2international.snowowl.snomed.common.SnomedTerminologyComponentConstants;
2929
import com.b2international.snowowl.test.commons.TestMethodNameRule;
3030
import com.b2international.snowowl.test.commons.codesystem.CodeSystemRestRequests;
3131

@@ -95,9 +95,20 @@ protected final static void checkDesignationUseContext(JsonPath jsonPath, String
9595

9696
assertThat(jsonPath.getString("extension[0].url")).isEqualTo("context");
9797
assertThat(jsonPath.getString("extension[0].valueCoding.code")).isEqualTo(refsetId);
98+
9899
assertThat(jsonPath.getString("extension[1].url")).isEqualTo("role");
99100
assertThat(jsonPath.getString("extension[1].valueCoding.code")).isEqualTo(Concepts.REFSET_DESCRIPTION_ACCEPTABILITY_PREFERRED);
101+
assertThat(jsonPath.getString("extension[1].valueCoding.display")).isEqualTo("Preferred");
102+
100103
assertThat(jsonPath.getString("extension[2].url")).isEqualTo("type");
101104
assertThat(jsonPath.getString("extension[2].valueCoding.code")).isEqualTo(typeId);
105+
106+
String display = jsonPath.getString("extension[2].valueCoding.display");
107+
108+
if (Concepts.FULLY_SPECIFIED_NAME.equals(typeId)) {
109+
assertThat(display).isEqualTo("Fully specified name");
110+
} else if (Concepts.SYNONYM.equals(typeId)) {
111+
assertThat(display).isEqualTo("Synonym");
112+
}
102113
}
103114
}

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/domain/Acceptability.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,19 @@ public enum Acceptability {
3131
/**
3232
* Description is acceptable in language or dialect
3333
*/
34-
ACCEPTABLE(Concepts.REFSET_DESCRIPTION_ACCEPTABILITY_ACCEPTABLE),
34+
ACCEPTABLE(Concepts.REFSET_DESCRIPTION_ACCEPTABILITY_ACCEPTABLE, "Acceptable"),
3535

3636
/**
3737
* Description is preferred in language or dialect
3838
*/
39-
PREFERRED(Concepts.REFSET_DESCRIPTION_ACCEPTABILITY_PREFERRED);
39+
PREFERRED(Concepts.REFSET_DESCRIPTION_ACCEPTABILITY_PREFERRED, "Preferred");
4040

4141
private final String conceptId;
42+
private final String label;
4243

43-
private Acceptability(final String conceptId) {
44+
private Acceptability(final String conceptId, String label) {
4445
this.conceptId = conceptId;
46+
this.label = label;
4547
}
4648

4749
/**
@@ -52,6 +54,10 @@ private Acceptability(final String conceptId) {
5254
public String getConceptId() {
5355
return conceptId;
5456
}
57+
58+
public String getLabel() {
59+
return label;
60+
}
5561

5662
/**
5763
* Performs a reverse lookup by concept identifier and returns the matching acceptability value.

snomed/com.b2international.snowowl.snomed.datastore/src/com/b2international/snowowl/snomed/core/request/SnomedConceptSearchRequestEvaluator.java

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@
3636
import com.b2international.snowowl.snomed.core.domain.SnomedConcept;
3737
import com.b2international.snowowl.snomed.core.domain.SnomedConcepts;
3838
import com.b2international.snowowl.snomed.core.domain.SnomedDescription;
39-
import com.b2international.snowowl.snomed.core.domain.SnomedDescriptions;
4039
import com.b2international.snowowl.snomed.datastore.request.SnomedConceptSearchRequestBuilder;
4140
import com.b2international.snowowl.snomed.datastore.request.SnomedRequests;
4241
import com.google.common.base.Strings;
@@ -120,7 +119,7 @@ public Concepts evaluate(ResourceURI uri, ServiceProvider context, Options searc
120119
private Concept toConcept(ResourceURI codeSystem, SnomedConcept snomedConcept, String pt, boolean requestedExpand) {
121120
final Concept concept = toConcept(codeSystem, snomedConcept, snomedConcept.getIconId(), pt, snomedConcept.getScore());
122121

123-
SortedSet<Description> descriptions = generateGenericDescriptions(snomedConcept.getPreferredDescriptions());
122+
SortedSet<Description> descriptions = generateGenericDescriptions(snomedConcept);
124123

125124
if (!descriptions.isEmpty()) {
126125
concept.setDescriptions(descriptions);
@@ -136,16 +135,20 @@ private Concept toConcept(ResourceURI codeSystem, SnomedConcept snomedConcept, S
136135
}
137136

138137
/**
139-
* Generates generic {@link Description} objects for each {@link SnomedDescription} in the given {@link SnomedDescriptions}. This method combines
138+
* Generates generic {@link Description} objects from the descriptions of the given {@link SnomedConcept}.
139+
* The method uses {@link SnomedConcept#getDescriptions() concept descriptions} when available; if that collection is {@code null},
140+
* it falls back to {@link SnomedConcept#getPreferredDescriptions() preferred descriptions}. This method combines
140141
* the language code and each language reference set acceptability membership of the {@link SnomedDescription} to generate a generic
141142
* {@link Description} representation. The number of {@link Description}s generated can be higher than the given number of
142143
* {@link SnomedDescription}s.
143-
*
144-
* @param descriptions
145-
* @return a {@link SortedSet} of {@link Description} objects, never <code>null</code>
144+
*
145+
* @param concept the {@link SnomedConcept} to read descriptions from
146+
* @return a {@code SortedSet<Description>} of {@link Description} objects, never <code>null</code>
146147
*/
147-
public static SortedSet<Description> generateGenericDescriptions(SnomedDescriptions descriptions) {
148-
return descriptions.stream()
148+
public static SortedSet<Description> generateGenericDescriptions(SnomedConcept concept) {
149+
return Optional.ofNullable(concept.getDescriptions())
150+
.orElse(concept.getPreferredDescriptions())
151+
.stream()
149152
.flatMap(description -> {
150153
// FIXME falling back to en when the languageCode is not available on concept descriptions
151154
// descriptions expand is needed but only when the requestor truly needs them, but that requires a bit larger set of changes

snomed/com.b2international.snowowl.snomed.fhir/src/com/b2international/snowowl/snomed/fhir/SnomedFhirCodeSystemLookupConverter.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ public List<CodeSystemLookupResultParameters.Designation> expandDesignations(Ser
103103
// FIXME: "system" may need to be set to the code system's URL we are calling from
104104
.setSystem(SNOMED_SYSTEM_URL)
105105
.setCode(acceptability.getConceptId())
106-
.setDisplay(acceptability.name());
106+
.setDisplay(acceptability.getLabel());
107107

108108
final Extension useContextExtension = new Extension("http://snomed.info/fhir/StructureDefinition/designation-use-context");
109109

snomed/com.b2international.snowowl.snomed.fhir/src/com/b2international/snowowl/snomed/fhir/SnomedFhirValueSetExpander.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ public ValueSet expand(ServiceProvider context, ValueSet valueSet, ValueSetExpan
6363
.setLimit(parameters.getCount() == null ? 10 : parameters.getCount().getValue())
6464
.setSearchAfter(parameters.getAfter() == null ? null : parameters.getAfter().getValue())
6565
// SNOMED only preferred display support (VS should always use FSN)
66-
.setPreferredDisplay("FSN")
66+
.setPreferredDisplay("FSN")
67+
// Expand descriptions so that type information can be extracted later
68+
.setExpand("descriptions(expand(type(expand(pt()))))")
6769
.setLocales(FhirRequest.compactLocale(parameters.getDisplayLanguage()))
6870
// always return sorted results for consistency, in case of term filtering return by score otherwise by ID
6971
.sortBy(!CompareUtils.isEmpty(termFilter) ? SearchIndexResourceRequest.SCORE : SearchResourceRequest.Sort.fieldAsc("id"));
@@ -162,7 +164,7 @@ private void includeDesignations(final String baseUrl, Concept concept, ValueSet
162164
// FIXME: "system" may need to be set to the code system's URL we are calling from
163165
.setSystem(baseUrl)
164166
.setCode(acceptability.getConceptId())
165-
.setDisplay(acceptability.name());
167+
.setDisplay(acceptability.getLabel());
166168

167169
final Extension useContextExtension = new Extension("http://snomed.info/fhir/StructureDefinition/designation-use-context");
168170

0 commit comments

Comments
 (0)