1
0
mirror of https://github.com/pcvolkmer/mv64e-onkostar-data.git synced 2025-09-13 07:52:52 +00:00

feat: add specimens related to Vorbefunde

This also uses DB id as specimen id.
This commit is contained in:
2025-07-06 16:51:45 +02:00
parent 21ce6f3185
commit 37c553a34e
6 changed files with 113 additions and 33 deletions

View File

@@ -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;
}
}

View File

@@ -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<PriorDiagnosticReport> {
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<PriorDiag
return catalogue.getAllByParentId(parentId)
.stream()
.map(this::map)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
}
@Override
protected PriorDiagnosticReport map(final ResultSet resultSet) {
var builder = PriorDiagnosticReport.builder();
builder
.id(resultSet.getId().toString())
.patient(resultSet.getPatientReference())
.issuedOn(resultSet.getDate("erstellungsdatum"))
.specimen(Reference.builder().id(resultSet.getString("befundnummer")).type("Specimen").build())
.type(
getMolecularDiagnosticReportCoding(
resultSet.getString("artderdiagnostik"),
resultSet.getInteger("artderdiagnostik_propcat_version")
)
)
.results(List.of(
resultSet.getString("ergebnisse")
))
;
var einsendenummer = resultSet.getString("befundnummer");
return builder.build();
var osMolGen = molekulargenetikCatalogue.getByEinsendenummer(einsendenummer);
if (null != osMolGen) {
builder
.id(resultSet.getId().toString())
.patient(resultSet.getPatientReference())
.issuedOn(resultSet.getDate("erstellungsdatum"))
.specimen(Reference.builder().id(osMolGen.getId().toString()).type("Specimen").build())
.type(
getMolecularDiagnosticReportCoding(
resultSet.getString("artderdiagnostik"),
resultSet.getInteger("artderdiagnostik_propcat_version")
)
)
.results(List.of(
resultSet.getString("ergebnisse")
))
;
return builder.build();
}
return null;
}
private MolecularDiagnosticReportCoding getMolecularDiagnosticReportCoding(String value, int version) {

View File

@@ -42,7 +42,7 @@ public class MolekulargenetikToSpecimenDataMapper implements DataMapper<TumorSpe
private final RebiopsieCatalogue rebiopsieCatalogue;
private final ReevaluationCatalogue reevaluationCatalogue;
private final EinzelempfehlungCatalogue einzelempfehlungCatalogue;
private final PropertyCatalogue propertyCatalogue;
private final VorbefundeCatalogue vorbefundeCatalogue;
public MolekulargenetikToSpecimenDataMapper(
final MolekulargenetikCatalogue molekulargenetikCatalogue,
@@ -50,19 +50,19 @@ public class MolekulargenetikToSpecimenDataMapper implements DataMapper<TumorSpe
final RebiopsieCatalogue rebiopsieCatalogue,
final ReevaluationCatalogue reevaluationCatalogue,
final EinzelempfehlungCatalogue einzelempfehlungCatalogue,
final PropertyCatalogue propertyCatalogue
final VorbefundeCatalogue vorbefundeCatalogue
) {
this.molekulargenetikCatalogue = molekulargenetikCatalogue;
this.therapieplanCatalogue = therapieplanCatalogue;
this.rebiopsieCatalogue = rebiopsieCatalogue;
this.reevaluationCatalogue = reevaluationCatalogue;
this.einzelempfehlungCatalogue = einzelempfehlungCatalogue;
this.propertyCatalogue = propertyCatalogue;
this.vorbefundeCatalogue = vorbefundeCatalogue;
}
/**
* Loads and maps a specimen using the database id
* The result does not include a diagnosis reference!
* Not intended for direct use! The result does not include a diagnosis reference!
*
* @param id The database id of the procedure data set
* @return The loaded Patient data
@@ -77,7 +77,7 @@ public class MolekulargenetikToSpecimenDataMapper implements DataMapper<TumorSpe
.patient(data.getPatientReference())
.type(getTumorSpecimenCoding(data.getString("materialfixierung")))
.collection(getCollection(data))
// TODO add diagnosis later
// diagnosis is added in getAllByKpaId()
;
@@ -127,8 +127,18 @@ public class MolekulargenetikToSpecimenDataMapper implements DataMapper<TumorSpe
.collect(Collectors.toSet())
);
// Vorbefunde anhand Einsendenummer
osMolGen.addAll(
vorbefundeCatalogue.getAllByParentId(kpaId).stream()
.map(rs -> 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());

View File

@@ -121,12 +121,16 @@ public class MtbDataMapper implements DataMapper<Mtb> {
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();

View File

@@ -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()
);

View File

@@ -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
);
}