From 070ac3c2ab39adbd69fb7dcfc6731581c4af8486 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 30 Jun 2025 00:46:07 +0200 Subject: [PATCH] feat: add Evidenzlevel --- .../AbstractEinzelempfehlungDataMapper.java | 175 ++++++++++++++++++ .../EinzelempfehlungProzedurDataMapper.java | 8 +- .../EinzelempfehlungWirkstoffDataMapper.java | 3 +- .../mapper/KpaVorbefundeDataMapper.java | 63 +++++++ .../onco/datamapper/mapper/MtbDataMapper.java | 1 + 5 files changed, 247 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractEinzelempfehlungDataMapper.java create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractEinzelempfehlungDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractEinzelempfehlungDataMapper.java new file mode 100644 index 0000000..430edb2 --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractEinzelempfehlungDataMapper.java @@ -0,0 +1,175 @@ +package dev.pcvolkmer.onco.datamapper.mapper; + +import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.onco.datamapper.ResultSet; +import dev.pcvolkmer.onco.datamapper.datacatalogues.EinzelempfehlungCatalogue; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Objects; +import java.util.stream.Collectors; + +public abstract class AbstractEinzelempfehlungDataMapper extends AbstractSubformDataMapper { + + private static final String GRADING_SYSTEM = "dnpm-dip/mtb/level-of-evidence/grading"; + private static final String ADDENDUM_SYSTEM = "dnpm-dip/mtb/level-of-evidence/addendum"; + + protected AbstractEinzelempfehlungDataMapper(EinzelempfehlungCatalogue einzelempfehlungCatalogue) { + super(einzelempfehlungCatalogue); + } + + protected LevelOfEvidence getLevelOfEvidence(ResultSet resultSet) { + if (resultSet == null) { + return null; + } + + var resultBuilder = LevelOfEvidence.builder(); + + var evidenzlevel = resultSet.getString("evidenzlevel"); + if (evidenzlevel != null) { + switch (evidenzlevel) { + case "1": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M1A) + .display(LevelOfEvidenceGradingCodingCode.M1A.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "2": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M1B) + .display(LevelOfEvidenceGradingCodingCode.M1B.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "3": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M1C) + .display(LevelOfEvidenceGradingCodingCode.M1C.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "4": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M2A) + .display(LevelOfEvidenceGradingCodingCode.M2A.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "5": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M2B) + .display(LevelOfEvidenceGradingCodingCode.M2B.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "6": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M2C) + .display(LevelOfEvidenceGradingCodingCode.M2C.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "7": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M3) + .display(LevelOfEvidenceGradingCodingCode.M3.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + case "8": + resultBuilder.grading( + LevelOfEvidenceGradingCoding.builder() + .code(LevelOfEvidenceGradingCodingCode.M4) + .display(LevelOfEvidenceGradingCodingCode.M4.toValue()) + .system(GRADING_SYSTEM) + .build() + ); + break; + } + } + + var evidenzlevelZusatz = new ArrayList(); + if (resultSet.isTrue("evidenzlevel_zusatz_is")) { + evidenzlevelZusatz.add( + LevelOfEvidenceAddendumCoding.builder() + .code(LevelOfEvidenceAddendumCodingCode.IS) + .display(LevelOfEvidenceAddendumCodingCode.IS.toValue()) + .system(ADDENDUM_SYSTEM) + .build() + ); + } + if (resultSet.isTrue("evidenzlevel_zusatz_iv")) { + evidenzlevelZusatz.add( + LevelOfEvidenceAddendumCoding.builder() + .code(LevelOfEvidenceAddendumCodingCode.IV) + .display(LevelOfEvidenceAddendumCodingCode.IV.toValue()) + .system(ADDENDUM_SYSTEM) + .build() + ); + } + if (resultSet.isTrue("evidenzlevel_zusatz_z")) { + evidenzlevelZusatz.add( + LevelOfEvidenceAddendumCoding.builder() + .code(LevelOfEvidenceAddendumCodingCode.Z) + .display(LevelOfEvidenceAddendumCodingCode.Z.toValue()) + .system(ADDENDUM_SYSTEM) + .build() + ); + } + if (resultSet.isTrue("evidenzlevel_zusatz_r")) { + evidenzlevelZusatz.add( + LevelOfEvidenceAddendumCoding.builder() + .code(LevelOfEvidenceAddendumCodingCode.R) + .display(LevelOfEvidenceAddendumCodingCode.R.toValue()) + .system(ADDENDUM_SYSTEM) + .build() + ); + } + + resultBuilder.addendums(evidenzlevelZusatz); + + if (resultSet.getString("evidenzlevel_publication") != null) { + // Mappe nur PubMed-Ids (Ziffern) oder DOI (Pattern) + var evidenzlevelPublications = Arrays.stream(resultSet.getString("evidenzlevel_publication").split("\n")) + .map(String::trim) + .map(line -> { + if (line.matches("^\\d+$")) { + return PublicationReference.builder() + .id(line) + .system(PublicationSystem.PUBMED_NCBI_NLM_NIH_GOV) + .type("Publication") + .build(); + } + if (line.matches("^\\d{2}\\.\\d{4}/\\d+$")) { + return PublicationReference.builder() + .id(line) + .system(PublicationSystem.DOI_ORG) + .type("Publication") + .build(); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + resultBuilder.publications(evidenzlevelPublications); + } + + return resultBuilder.build(); + } +} diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungProzedurDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungProzedurDataMapper.java index 375f03a..de61821 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungProzedurDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungProzedurDataMapper.java @@ -5,8 +5,10 @@ import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.EinzelempfehlungCatalogue; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import static dev.pcvolkmer.onco.datamapper.mapper.MapperUtils.getPatientReference; @@ -17,7 +19,7 @@ import static dev.pcvolkmer.onco.datamapper.mapper.MapperUtils.getPatientReferen * @author Paul-Christian Volkmer * @since 0.1 */ -public class EinzelempfehlungProzedurDataMapper extends AbstractSubformDataMapper { +public class EinzelempfehlungProzedurDataMapper extends AbstractEinzelempfehlungDataMapper { public EinzelempfehlungProzedurDataMapper(EinzelempfehlungCatalogue einzelempfehlungCatalogue) { super(einzelempfehlungCatalogue); @@ -43,6 +45,7 @@ public class EinzelempfehlungProzedurDataMapper extends AbstractSubformDataMappe resultSet.getInteger("art_der_therapie_propcat_version") ) ) + .levelOfEvidence(getLevelOfEvidence(resultSet)) .build(); } @@ -56,7 +59,7 @@ public class EinzelempfehlungProzedurDataMapper extends AbstractSubformDataMappe return catalogue.getAllByParentId(parentId) .stream() // Filter Prozedurempfehlung (Weitere Empfehlungen) - .filter(it -> it.getString("art_der_therapie") != null && !it.getString("art_der_therapie").isBlank() ) + .filter(it -> it.getString("art_der_therapie") != null && !it.getString("art_der_therapie").isBlank()) .map(this::map) .collect(Collectors.toList()); } @@ -98,4 +101,5 @@ public class EinzelempfehlungProzedurDataMapper extends AbstractSubformDataMappe return resultBuilder.build(); } + } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungWirkstoffDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungWirkstoffDataMapper.java index df63342..12cd6b1 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungWirkstoffDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/EinzelempfehlungWirkstoffDataMapper.java @@ -20,7 +20,7 @@ import static dev.pcvolkmer.onco.datamapper.mapper.MapperUtils.getPatientReferen * @author Paul-Christian Volkmer * @since 0.1 */ -public class EinzelempfehlungWirkstoffDataMapper extends AbstractSubformDataMapper { +public class EinzelempfehlungWirkstoffDataMapper extends AbstractEinzelempfehlungDataMapper { public EinzelempfehlungWirkstoffDataMapper(EinzelempfehlungCatalogue einzelempfehlungCatalogue) { super(einzelempfehlungCatalogue); @@ -41,6 +41,7 @@ public class EinzelempfehlungWirkstoffDataMapper extends AbstractSubformDataMapp ) ) .medication(JsonToMedicationMapper.map(resultSet.getString("wirkstoffe_json"))) + .levelOfEvidence(getLevelOfEvidence(resultSet)) .build(); } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java new file mode 100644 index 0000000..1e2d409 --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java @@ -0,0 +1,63 @@ +package dev.pcvolkmer.onco.datamapper.mapper; + +import dev.pcvolkmer.mv64e.mtb.EcogCoding; +import dev.pcvolkmer.mv64e.mtb.EcogCodingCode; +import dev.pcvolkmer.mv64e.mtb.PerformanceStatus; +import dev.pcvolkmer.mv64e.mtb.PriorDiagnosticReport; +import dev.pcvolkmer.onco.datamapper.ResultSet; +import dev.pcvolkmer.onco.datamapper.datacatalogues.EcogCatalogue; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.stream.Collectors; + +import static dev.pcvolkmer.onco.datamapper.mapper.MapperUtils.getPatientReference; + +/** + * Mapper class to load and map prozedur data from database table 'dk_dnpm_vorbefunde' + * + * @author Paul-Christian Volkmer + * @since 0.1 + */ +public class KpaVorbefundeDataMapper extends AbstractSubformDataMapper { + + public KpaVorbefundeDataMapper(final EcogCatalogue catalogue) { + super(catalogue); + } + + /** + * Loads and maps Prozedur related by database id + * + * @param id The database id of the procedure data set + * @return The loaded data set + */ + @Override + public PriorDiagnosticReport getById(final int id) { + var data = catalogue.getById(id); + return this.map(data); + } + + @Override + public List getByParentId(final int parentId) { + return catalogue.getAllByParentId(parentId) + .stream() + .map(this::map) + .collect(Collectors.toList()); + } + + @Override + protected PriorDiagnosticReport map(final ResultSet resultSet) { + var builder = PriorDiagnosticReport.builder(); + builder + .id(resultSet.getId().toString()) + .patient(getPatientReference(resultSet.getString("patient_id"))) + .issuedOn(resultSet.getDate("datum")) + .results(List.of(resultSet.getString("ecog"))) + ; + + return builder.build(); + } + +} diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java index ad47f7f..588493d 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.Mtb; +import dev.pcvolkmer.mv64e.mtb.PriorDiagnosticReport; import dev.pcvolkmer.mv64e.mtb.Reference; import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.datacatalogues.*;