Skip to content

Commit ece8ad1

Browse files
NIAD-3304: Refactor mapCodeableConceptToCd method (#1125)
* Refactor `mapCodeableConceptToCd` method in `CodeableConceptCdMapper` for readability and to easier allow modification for NIAD-3304 functionality.
1 parent a22402f commit ece8ad1

File tree

1 file changed

+68
-38
lines changed

1 file changed

+68
-38
lines changed

service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/CodeableConceptCdMapper.java

Lines changed: 68 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -50,38 +50,29 @@ public class CodeableConceptCdMapper {
5050
private static final String OTHER_CATEGORY_DESCRIPTION = "Other category";
5151

5252
public String mapCodeableConceptToCd(CodeableConcept codeableConcept) {
53-
var builder = CodeableConceptCdTemplateParameters.builder();
54-
var mainCode = findMainCode(codeableConcept);
53+
Optional<Coding> snomedCodeCoding = getSnomedCodeCoding(codeableConcept);
5554

56-
builder.nullFlavor(mainCode.isEmpty());
55+
if (snomedCodeCoding.isEmpty()) {
56+
return buildNullFlavourCodeableConceptCd(codeableConcept, snomedCodeCoding);
57+
}
5758

58-
if (mainCode.isPresent()) {
59-
var extension = retrieveDescriptionExtension(mainCode.get())
60-
.map(Extension::getExtension)
61-
.orElse(Collections.emptyList());
59+
var builder = CodeableConceptCdTemplateParameters.builder();
6260

63-
builder.mainCodeSystem(SNOMED_SYSTEM_CODE);
61+
var descriptionExtensions = retrieveDescriptionExtension(snomedCodeCoding.get())
62+
.map(Extension::getExtension);
6463

65-
Optional<String> code = extension.stream()
66-
.filter(descriptionExt -> DESCRIPTION_ID.equals(descriptionExt.getUrl()))
67-
.map(description -> description.getValue().toString())
68-
.findFirst()
69-
.or(() -> Optional.ofNullable(mainCode.get().getCode()));
70-
code.ifPresent(builder::mainCode);
64+
builder.mainCodeSystem(SNOMED_SYSTEM_CODE);
7165

72-
Optional<String> displayName = extension.stream()
73-
.filter(displayExtension -> DESCRIPTION_DISPLAY.equals(displayExtension.getUrl()))
74-
.map(description -> description.getValue().toString())
75-
.findFirst()
76-
.or(() -> Optional.ofNullable(mainCode.get().getDisplay()));
77-
displayName.ifPresent(builder::mainDisplayName);
66+
if (descriptionExtensions.isPresent()) {
67+
var mainCode = getMainCode(descriptionExtensions.get(), snomedCodeCoding.get());
68+
mainCode.ifPresent(builder::mainCode);
69+
70+
var mainDisplayName = getMainDisplayName(descriptionExtensions.get(), snomedCodeCoding.get());
71+
mainDisplayName.ifPresent(builder::mainDisplayName);
7872

7973
if (codeableConcept.hasText()) {
8074
builder.mainOriginalText(codeableConcept.getText());
8175
}
82-
} else {
83-
var originalText = findOriginalText(codeableConcept, mainCode);
84-
originalText.ifPresent(builder::mainOriginalText);
8576
}
8677

8778
return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
@@ -92,7 +83,7 @@ public String mapCodeableConceptToCd(CodeableConcept codeableConcept) {
9283
// we have agreed to use the Concept ID rather than Description Id for medications which will avoided the degradation.
9384
public String mapCodeableConceptForMedication(CodeableConcept codeableConcept) {
9485
var builder = CodeableConceptCdTemplateParameters.builder();
95-
var mainCode = findMainCode(codeableConcept);
86+
var mainCode = getSnomedCodeCoding(codeableConcept);
9687

9788
builder.nullFlavor(mainCode.isEmpty());
9889

@@ -127,7 +118,7 @@ public String mapCodeableConceptForMedication(CodeableConcept codeableConcept) {
127118
public String mapCodeableConceptToCdForAllergy(CodeableConcept codeableConcept, AllergyIntolerance.AllergyIntoleranceClinicalStatus
128119
allergyIntoleranceClinicalStatus) {
129120
var builder = CodeableConceptCdTemplateParameters.builder();
130-
var mainCode = findMainCode(codeableConcept);
121+
var mainCode = getSnomedCodeCoding(codeableConcept);
131122

132123
builder.nullFlavor(mainCode.isEmpty());
133124

@@ -177,7 +168,7 @@ public String mapCodeableConceptToCdForTransformedActualProblemHeader(CodeableCo
177168

178169
public String mapCodeableConceptToCdForBloodPressure(CodeableConcept codeableConcept) {
179170
var builder = CodeableConceptCdTemplateParameters.builder();
180-
var mainCode = findMainCode(codeableConcept);
171+
var mainCode = getSnomedCodeCoding(codeableConcept);
181172

182173
builder.nullFlavor(mainCode.isEmpty());
183174
var originalText = findOriginalText(codeableConcept, mainCode);
@@ -238,7 +229,7 @@ public String getCdForTopic() {
238229
}
239230

240231
public String mapToCdForTopic(CodeableConcept relatedProblem, String title) {
241-
var mainCode = findMainCode(relatedProblem);
232+
var mainCode = getSnomedCodeCoding(relatedProblem);
242233

243234
if (mainCode.isEmpty()) {
244235
return mapToCdForTopic(title);
@@ -251,7 +242,7 @@ public String mapToCdForTopic(CodeableConcept relatedProblem, String title) {
251242
}
252243

253244
public String mapToCdForTopic(CodeableConcept relatedProblem) {
254-
var mainCode = findMainCode(relatedProblem);
245+
var mainCode = getSnomedCodeCoding(relatedProblem);
255246

256247
if (mainCode.isEmpty()) {
257248
return getCdForTopic();
@@ -331,7 +322,7 @@ private Optional<Coding> findPrescribingAgency(CodeableConcept codeableConcept)
331322
.findFirst();
332323
}
333324

334-
private Optional<Coding> findMainCode(CodeableConcept codeableConcept) {
325+
private Optional<Coding> getSnomedCodeCoding(CodeableConcept codeableConcept) {
335326
return codeableConcept.getCoding()
336327
.stream()
337328
.filter(this::isSnomed)
@@ -358,9 +349,11 @@ private Optional<String> findOriginalText(CodeableConcept codeableConcept, Optio
358349
}
359350
}
360351

361-
private Optional<String> findOriginalTextForAllergy(CodeableConcept codeableConcept, Optional<Coding> coding,
362-
AllergyIntolerance.AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus) {
363-
352+
private Optional<String> findOriginalTextForAllergy(
353+
CodeableConcept codeableConcept,
354+
Optional<Coding> coding,
355+
AllergyIntolerance.AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus
356+
) {
364357
if (!allergyIntoleranceClinicalStatus.toCode().isEmpty()) {
365358
if (RESOLVED_CLINICAL_STATUS.equals(allergyIntoleranceClinicalStatus.toCode())) {
366359
if (coding.isPresent()) {
@@ -428,29 +421,66 @@ private Optional<Extension> retrieveDescriptionExtension(Coding coding) {
428421
}
429422

430423
public String getDisplayFromCodeableConcept(CodeableConcept codeableConcept) {
431-
return findMainCode(codeableConcept)
424+
return getSnomedCodeCoding(codeableConcept)
432425
.map(cc -> findDisplayText(cc).orElse(StringUtils.EMPTY))
433426
.orElse(StringUtils.EMPTY);
434427
}
435428

436429
public String mapToNullFlavorCodeableConcept(CodeableConcept codeableConcept) {
437430

438431
var builder = CodeableConceptCdTemplateParameters.builder().nullFlavor(true);
439-
var mainCode = findMainCode(codeableConcept);
432+
var mainCode = getSnomedCodeCoding(codeableConcept);
440433

441434
var originalText = findOriginalText(codeableConcept, mainCode);
442435
originalText.ifPresent(builder::mainOriginalText);
443436
return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
444437
}
445438

446-
public String mapToNullFlavorCodeableConceptForAllergy(CodeableConcept codeableConcept,
447-
AllergyIntolerance.AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus) {
448-
439+
public String mapToNullFlavorCodeableConceptForAllergy(
440+
CodeableConcept codeableConcept,
441+
AllergyIntolerance.AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus
442+
) {
449443
var builder = CodeableConceptCdTemplateParameters.builder().nullFlavor(true);
450-
var mainCode = findMainCode(codeableConcept);
444+
var mainCode = getSnomedCodeCoding(codeableConcept);
451445

452446
var originalText = findOriginalTextForAllergy(codeableConcept, mainCode, allergyIntoleranceClinicalStatus);
453447
originalText.ifPresent(builder::mainOriginalText);
454448
return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
455449
}
450+
451+
private String buildNullFlavourCodeableConceptCd(CodeableConcept codeableConcept, Optional<Coding> snomedCode) {
452+
var builder = CodeableConceptCdTemplateParameters.builder();
453+
builder.nullFlavor(true);
454+
var originalText = findOriginalText(codeableConcept, snomedCode);
455+
originalText.ifPresent(builder::mainOriginalText);
456+
457+
return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
458+
}
459+
460+
private Optional<String> getMainCode(List<Extension> descriptionExtensions, Coding snomedCodeCoding) {
461+
var descriptionCode = descriptionExtensions.stream()
462+
.filter(descriptionExt -> DESCRIPTION_ID.equals(descriptionExt.getUrl()))
463+
.map(description -> description.getValue().toString())
464+
.findFirst();
465+
466+
if (descriptionCode.isPresent()) {
467+
return descriptionCode;
468+
}
469+
470+
return Optional.ofNullable(snomedCodeCoding.getCode());
471+
}
472+
473+
private Optional<String> getMainDisplayName(List<Extension> descriptionExtensions, Coding snomedCodeCoding) {
474+
var descriptionDisplayName = descriptionExtensions.stream()
475+
.filter(descriptionExt -> DESCRIPTION_DISPLAY.equals(descriptionExt.getUrl()))
476+
.map(description -> description.getValue().toString())
477+
.findFirst();
478+
479+
if (descriptionDisplayName.isPresent()) {
480+
return descriptionDisplayName;
481+
}
482+
483+
return Optional.ofNullable(snomedCodeCoding.getDisplay());
484+
}
485+
456486
}

0 commit comments

Comments
 (0)