From 37c553a34e602261749330588bb4c222e693a61c Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sun, 6 Jul 2025 16:51:45 +0200 Subject: [PATCH] feat: add specimens related to Vorbefunde This also uses DB id as specimen id. --- .../MolekulargenetikCatalogue.java | 39 +++++++++++++ .../mapper/KpaVorbefundeDataMapper.java | 58 +++++++++++++------ .../MolekulargenetikToSpecimenDataMapper.java | 20 +++++-- .../onco/datamapper/mapper/MtbDataMapper.java | 8 ++- .../mapper/KpaVorbefundeDataMapperTest.java | 12 +++- ...ekulargenetikToSpecimenDataMapperTest.java | 9 ++- 6 files changed, 113 insertions(+), 33 deletions(-) diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/MolekulargenetikCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/MolekulargenetikCatalogue.java index 3694d10..9e73b92 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/MolekulargenetikCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/datacatalogues/MolekulargenetikCatalogue.java @@ -21,6 +21,7 @@ package dev.pcvolkmer.onco.datamapper.datacatalogues; import dev.pcvolkmer.onco.datamapper.ResultSet; +import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import java.util.List; @@ -98,4 +99,42 @@ public class MolekulargenetikCatalogue extends AbstractDataCatalogue { .collect(Collectors.toList()); } + /** + * Get procedure result set by einsendenummer + * + * @param einsendenummer The case id related to this procedure + * @return The procedure id + */ + public ResultSet getByEinsendenummer(String einsendenummer) { + var result = this.jdbcTemplate.queryForList( + String.format( + "SELECT patient.patienten_id, %s.*, prozedur.* FROM %s JOIN prozedur ON (prozedur.id = %s.id) JOIN patient ON (patient.id = prozedur.patient_id) WHERE geloescht = 0 AND %s.einsendenummer = ?", + getTableName(), + getTableName(), + getTableName(), + getTableName() + ), + einsendenummer); + + if (result.isEmpty()) { + throw new DataAccessException("No record found for einsendenummer: " + einsendenummer); + } else if (result.size() > 1) { + throw new DataAccessException("Multiple records found for einsendenummer: " + einsendenummer); + } + + var resultSet = ResultSet.from(result.get(0)); + + if (resultSet.getRawData().containsKey("id")) { + var merkmale = getMerkmaleById(resultSet.getId()); + if (merkmale.isEmpty()) { + return resultSet; + } + merkmale.forEach((key, value) -> + resultSet.getRawData().put(key, value) + ); + } + + return resultSet; + } + } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java index f8aa3ec..a9b40c9 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapper.java @@ -20,15 +20,19 @@ package dev.pcvolkmer.onco.datamapper.mapper; -import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.mv64e.mtb.MolecularDiagnosticReportCoding; +import dev.pcvolkmer.mv64e.mtb.MolecularDiagnosticReportCodingCode; +import dev.pcvolkmer.mv64e.mtb.PriorDiagnosticReport; +import dev.pcvolkmer.mv64e.mtb.Reference; import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; -import dev.pcvolkmer.onco.datamapper.datacatalogues.EcogCatalogue; +import dev.pcvolkmer.onco.datamapper.datacatalogues.MolekulargenetikCatalogue; import dev.pcvolkmer.onco.datamapper.datacatalogues.VorbefundeCatalogue; import java.io.IOException; import java.util.Arrays; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; /** @@ -39,10 +43,16 @@ import java.util.stream.Collectors; */ public class KpaVorbefundeDataMapper extends AbstractSubformDataMapper { + private final MolekulargenetikCatalogue molekulargenetikCatalogue; private final PropertyCatalogue propertyCatalogue; - public KpaVorbefundeDataMapper(final VorbefundeCatalogue catalogue, PropertyCatalogue propertyCatalogue) { + public KpaVorbefundeDataMapper( + final VorbefundeCatalogue catalogue, + final MolekulargenetikCatalogue molekulargenetikCatalogue, + final PropertyCatalogue propertyCatalogue + ) { super(catalogue); + this.molekulargenetikCatalogue = molekulargenetikCatalogue; this.propertyCatalogue = propertyCatalogue; } @@ -63,29 +73,39 @@ public class KpaVorbefundeDataMapper extends AbstractSubformDataMapper rs.getString("befundnummer")) + .map(molekulargenetikCatalogue::getByEinsendenummer) + .map(ResultSet::getId) + .collect(Collectors.toList()) + ); + return osMolGen.stream() .filter(Objects::nonNull) + .distinct() .map(this::getById) .peek(it -> it.setDiagnosis(diagnoseReferenz)) .collect(Collectors.toList()); 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 0afa260..1d6963a 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java @@ -121,12 +121,16 @@ public class MtbDataMapper implements DataMapper { catalogueFactory.catalogue(RebiopsieCatalogue.class), catalogueFactory.catalogue(ReevaluationCatalogue.class), einzelempfehlungCatalogue, - propertyCatalogue + catalogueFactory.catalogue(VorbefundeCatalogue.class) ); var kpaMolekulargenetikDataMapper = new KpaMolekulargenetikDataMapper(molekulargenetikCatalogue, catalogueFactory.catalogue(MolekulargenuntersuchungCatalogue.class), propertyCatalogue); - var kpaVorbefundeDataMapper = new KpaVorbefundeDataMapper(catalogueFactory.catalogue(VorbefundeCatalogue.class), propertyCatalogue); + var kpaVorbefundeDataMapper = new KpaVorbefundeDataMapper( + catalogueFactory.catalogue(VorbefundeCatalogue.class), + molekulargenetikCatalogue, + propertyCatalogue + ); var resultBuilder = Mtb.builder(); diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapperTest.java index 62ec7ca..5234a70 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaVorbefundeDataMapperTest.java @@ -26,6 +26,7 @@ import dev.pcvolkmer.mv64e.mtb.PriorDiagnosticReport; import dev.pcvolkmer.mv64e.mtb.Reference; import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; +import dev.pcvolkmer.onco.datamapper.datacatalogues.MolekulargenetikCatalogue; import dev.pcvolkmer.onco.datamapper.datacatalogues.VorbefundeCatalogue; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -48,6 +49,7 @@ import static org.mockito.Mockito.when; class KpaVorbefundeDataMapperTest { VorbefundeCatalogue catalogue; + MolekulargenetikCatalogue molekulargenetikCatalogue; PropertyCatalogue propertyCatalogue; KpaVorbefundeDataMapper dataMapper; @@ -55,11 +57,13 @@ class KpaVorbefundeDataMapperTest { @BeforeEach void setUp( @Mock VorbefundeCatalogue catalogue, + @Mock MolekulargenetikCatalogue molekulargenetikCatalogue, @Mock PropertyCatalogue propertyCatalogue ) { this.catalogue = catalogue; + this.molekulargenetikCatalogue = molekulargenetikCatalogue; this.propertyCatalogue = propertyCatalogue; - this.dataMapper = new KpaVorbefundeDataMapper(catalogue, propertyCatalogue); + this.dataMapper = new KpaVorbefundeDataMapper(catalogue, molekulargenetikCatalogue, propertyCatalogue); } @Test @@ -93,6 +97,10 @@ class KpaVorbefundeDataMapperTest { .when(catalogue) .getAllByParentId(anyInt()); + doAnswer(invocationOnMock -> ResultSet.from(Map.of("id", 1, "einsendenummer", "X/2025/1234"))) + .when(molekulargenetikCatalogue) + .getByEinsendenummer(anyString()); + doAnswer(invocationOnMock -> { var testPropertyData = Map.of( "panel", new PropertyCatalogue.Entry("panel", "Panel", "Panel") @@ -119,7 +127,7 @@ class KpaVorbefundeDataMapperTest { .isEqualTo(new java.sql.Date(Date.from(Instant.parse("2000-07-06T12:00:00Z")).getTime())); assertThat(actual.getSpecimen()) .isEqualTo(Reference.builder() - .id("X/2025/1234") + .id("1") .type("Specimen") .build() ); diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MolekulargenetikToSpecimenDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MolekulargenetikToSpecimenDataMapperTest.java index 130cfdf..66fe44d 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MolekulargenetikToSpecimenDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MolekulargenetikToSpecimenDataMapperTest.java @@ -21,7 +21,6 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.*; -import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.*; import org.junit.jupiter.api.BeforeEach; @@ -50,7 +49,7 @@ class MolekulargenetikToSpecimenDataMapperTest { RebiopsieCatalogue rebiopsieCatalogue; ReevaluationCatalogue reevaluationCatalogue; EinzelempfehlungCatalogue einzelempfehlungCatalogue; - PropertyCatalogue propertyCatalogue; + VorbefundeCatalogue vorbefundeCatalogue; MolekulargenetikToSpecimenDataMapper mapper; @@ -61,14 +60,14 @@ class MolekulargenetikToSpecimenDataMapperTest { @Mock RebiopsieCatalogue rebiopsieCatalogue, @Mock ReevaluationCatalogue reevaluationCatalogue, @Mock EinzelempfehlungCatalogue einzelempfehlungCatalogue, - @Mock PropertyCatalogue propertyCatalogue + @Mock VorbefundeCatalogue vorbefundeCatalogue ) { this.molekulargenetikCatalogue = molekulargenetikCatalogue; this.therapieplanCatalogue = therapieplanCatalogue; this.rebiopsieCatalogue = rebiopsieCatalogue; this.reevaluationCatalogue = reevaluationCatalogue; this.einzelempfehlungCatalogue = einzelempfehlungCatalogue; - this.propertyCatalogue = propertyCatalogue; + this.vorbefundeCatalogue = vorbefundeCatalogue; this.mapper = new MolekulargenetikToSpecimenDataMapper( molekulargenetikCatalogue, @@ -76,7 +75,7 @@ class MolekulargenetikToSpecimenDataMapperTest { rebiopsieCatalogue, reevaluationCatalogue, einzelempfehlungCatalogue, - propertyCatalogue + vorbefundeCatalogue ); }