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

fix: add some filters and cleanups

This commit is contained in:
2025-07-06 19:48:45 +02:00
parent d458e7f441
commit 94878fa7fe
11 changed files with 80 additions and 24 deletions

View File

@@ -131,6 +131,8 @@ public class ResultSet {
return null;
} else if (raw instanceof Integer) {
return ((Integer) raw).longValue();
} else if (raw instanceof Double) {
return ((Double) raw).longValue();
} else if (raw instanceof Long) {
return ((Long) raw);
}

View File

@@ -54,7 +54,7 @@ public abstract class AbstractDataCatalogue implements DataCatalogue {
public ResultSet getById(int id) {
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 prozedur.id = ?",
"SELECT patient.patienten_id, %s.*, prozedur.patient_id, prozedur.hauptprozedur_id FROM %s JOIN prozedur ON (prozedur.id = %s.id) JOIN patient ON (patient.id = prozedur.patient_id) WHERE geloescht = 0 AND prozedur.id = ?",
getTableName(),
getTableName(),
getTableName()

View File

@@ -51,7 +51,7 @@ public abstract class AbstractSubformDataCatalogue extends AbstractDataCatalogue
public List<ResultSet> getAllByParentId(int id) {
return 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 hauptprozedur_id = ?",
"SELECT patient.patienten_id, %s.*, prozedur.patient_id, prozedur.hauptprozedur_id FROM %s JOIN prozedur ON (prozedur.id = %s.id) JOIN patient ON (patient.id = prozedur.patient_id) WHERE geloescht = 0 AND hauptprozedur_id = ?",
getTableName(),
getTableName(),
getTableName()

View File

@@ -212,4 +212,23 @@ public abstract class AbstractEinzelempfehlungDataMapper<T> extends AbstractSubf
return resultBuilder.build();
}
protected RecommendationPriorityCoding getRecommendationPriorityCoding(int value) {
var resultBuilder = RecommendationPriorityCoding.builder()
.system("dnpm-dip/recommendation/priority")
.display(String.format("%d", value));
switch (value) {
case 1:
resultBuilder.code(RecommendationPriorityCodingCode.CODE_1);
case 2:
resultBuilder.code(RecommendationPriorityCodingCode.CODE_3);
case 3:
resultBuilder.code(RecommendationPriorityCodingCode.CODE_3);
case 4:
default:
resultBuilder.code(RecommendationPriorityCodingCode.CODE_4);
}
return resultBuilder.build();
}
}

View File

@@ -20,10 +20,7 @@
package dev.pcvolkmer.onco.datamapper.mapper;
import dev.pcvolkmer.mv64e.mtb.MtbProcedureRecommendationCategoryCoding;
import dev.pcvolkmer.mv64e.mtb.MtbProcedureRecommendationCategoryCodingCode;
import dev.pcvolkmer.mv64e.mtb.ProcedureRecommendation;
import dev.pcvolkmer.mv64e.mtb.Reference;
import dev.pcvolkmer.mv64e.mtb.*;
import dev.pcvolkmer.onco.datamapper.ResultSet;
import dev.pcvolkmer.onco.datamapper.datacatalogues.EinzelempfehlungCatalogue;
@@ -49,6 +46,7 @@ public class EinzelempfehlungProzedurDataMapper extends AbstractEinzelempfehlung
var resultBuilder = ProcedureRecommendation.builder()
.id(resultSet.getString("id"))
.patient(resultSet.getPatientReference())
.priority(getRecommendationPriorityCoding(resultSet.getInteger("prio")))
// TODO Fix id?
.reason(Reference.builder().id(resultSet.getString("id")).build())
.issuedOn(resultSet.getDate("datum"))

View File

@@ -45,15 +45,10 @@ public class EinzelempfehlungStudieDataMapper extends AbstractEinzelempfehlungDa
var resultBuilder = MtbStudyEnrollmentRecommendation.builder()
.id(resultSet.getString("id"))
.patient(resultSet.getPatientReference())
.priority(getRecommendationPriorityCoding(resultSet.getInteger("prio")))
// TODO Fix id?
.reason(Reference.builder().id(resultSet.getString("id")).build())
.issuedOn(resultSet.getDate("datum"))
.priority(
getRecommendationPriorityCoding(
resultSet.getString("evidenzlevel"),
resultSet.getInteger("evidenzlevel_propcat_version")
)
)
.medication(JsonToMedicationMapper.map(resultSet.getString("wirkstoffe_json")))
.levelOfEvidence(getLevelOfEvidence(resultSet))
.study(JsonToStudyMapper.map(resultSet.getString("studien_alle_json")));

View File

@@ -53,15 +53,10 @@ public class EinzelempfehlungWirkstoffDataMapper extends AbstractEinzelempfehlun
var resultBuilder = MtbMedicationRecommendation.builder()
.id(resultSet.getString("id"))
.patient(resultSet.getPatientReference())
.priority(getRecommendationPriorityCoding(resultSet.getInteger("prio")))
// TODO Fix id?
.reason(Reference.builder().id(resultSet.getString("id")).build())
.issuedOn(resultSet.getDate("datum"))
.priority(
getRecommendationPriorityCoding(
resultSet.getString("evidenzlevel"),
resultSet.getInteger("evidenzlevel_propcat_version")
)
)
.medication(JsonToMedicationMapper.map(resultSet.getString("wirkstoffe_json")))
.levelOfEvidence(getLevelOfEvidence(resultSet));

View File

@@ -22,6 +22,7 @@ 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.KpaCatalogue;
import dev.pcvolkmer.onco.datamapper.datacatalogues.TumorausbreitungCatalogue;
import dev.pcvolkmer.onco.datamapper.datacatalogues.TumorgradingCatalogue;
@@ -79,7 +80,9 @@ public class KpaDiagnosisDataMapper implements DataMapper<MtbDiagnosis> {
.version(propertyCatalogue.getByCodeAndVersion(data.getString("icd10"), data.getInteger("icd10_propcat_version")).getVersionDescription())
.build()
)
.topography(Coding.builder().code(data.getString("icdo3localisation")).build())
.recordedOn(data.getDate("datumerstdiagnose"))
.topography(Coding.builder().code(data.getString("icdo3lokalisation")).build())
.type(getType(data))
// Nicht in Onkostar erfasst
//.germlineCodes()
.guidelineTreatmentStatus(
@@ -168,4 +171,29 @@ public class KpaDiagnosisDataMapper implements DataMapper<MtbDiagnosis> {
return Staging.builder().history(all).build();
}
private Type getType(final ResultSet resultSet) {
var diagnosisCoding = MtbDiagnosisCoding.builder();
var code = resultSet.getString("diagnosetyp");
if (code == null || !Arrays.stream(ValueCode.values()).map(ValueCode::toValue).collect(Collectors.toSet()).contains(code)) {
return null;
}
try {
diagnosisCoding.code(ValueCode.forValue(code));
} catch (IOException e) {
throw new IllegalStateException("No valid code found");
}
return Type.builder()
.history(
List.of(
History.builder()
.date(resultSet.getDate("datumerstdiagnose"))
.value(diagnosisCoding.build())
.build()
)
)
.build();
}
}

View File

@@ -93,8 +93,8 @@ public class KpaHistologieDataMapper extends AbstractSubformDataMapper<Histology
.patient(resultSet.getPatientReference())
.specimen(Reference.builder().id(osMolGen.getId().toString()).type("Specimen").build())
.value(resultSet.getLong("tumorzellgehalt"))
// Nicht in OS.Molekulargenetik
//.method()
// TODO: Nicht in OS.Molekulargenetik
.method(TumorCellContentMethodCoding.builder().code(TumorCellContentMethodCodingCode.HISTOLOGIC).build())
.build()
)
.tumorMorphology(

View File

@@ -96,18 +96,20 @@ public class KpaMolekulargenetikDataMapper implements DataMapper<SomaticNgsRepor
var resultBuilder = NgsReportResults.builder();
// TODO: Aktuell nicht eingebunden, da Fehler, wenn nicht bioinformatisch gemäß: https://ibmi-ut.atlassian.net/wiki/spaces/DAM/pages/698777783/ Zeile 144!
// TODO: Aktuell problematisch, wenn nicht bioinformatisch gemäß: https://ibmi-ut.atlassian.net/wiki/spaces/DAM/pages/698777783/ Zeile 144!
// In Würzburg immer histologisch!
/*if (null != resultSet.getLong("tumorzellgehalt")) {
if (null != resultSet.getLong("tumorzellgehalt")) {
resultBuilder.tumorCellContent(
TumorCellContent.builder()
.id(resultSet.getId().toString())
.patient(resultSet.getPatientReference())
.specimen(Reference.builder().id(resultSet.getString("einsendenummer")).type("Specimen").build())
.value(resultSet.getLong("tumorzellgehalt"))
// TODO: Missing in OS.Molekulargenetik
.method(TumorCellContentMethodCoding.builder().code(TumorCellContentMethodCodingCode.HISTOLOGIC).build())
.build()
);
}*/
}
resultBuilder.simpleVariants(
subforms.stream()
@@ -123,6 +125,7 @@ public class KpaMolekulargenetikDataMapper implements DataMapper<SomaticNgsRepor
.id(subform.getString("id"))
.patient(subform.getPatientReference())
.gene(GeneUtils.toCoding(geneOptional.get()))
.transcriptId(TranscriptId.builder().value(geneOptional.get().getEnsemblId()).system(TranscriptIdSystem.ENSEMBL_ORG).build())
.exonId(subform.getString("exon"))
.dnaChange(subform.getString("cdnanomenklatur"))
.proteinChange(subform.getString("proteinebenenomenklatur"));
@@ -133,10 +136,19 @@ public class KpaMolekulargenetikDataMapper implements DataMapper<SomaticNgsRepor
if (null != subform.getLong("evreaddepth")) {
snvBuilder.readDepth(subform.getLong("evreaddepth"));
}
if (null != subform.getString("evaltnucleotide")) {
snvBuilder.altAllele(subform.getString("evaltnucleotide"));
}
if (null != subform.getString("evrefnucleotide")) {
snvBuilder.altAllele(subform.getString("evrefnucleotide"));
}
geneOptional.get().getSingleChromosomeInPropertyForm().ifPresent(snvBuilder::chromosome);
return snvBuilder.build();
})
// TODO: Filter missing position, altAllele, refAllele
.filter(snv -> snv.getPosition() != null && snv.getAltAllele() != null && snv.getRefAllele() != null)
.collect(Collectors.toList())
);

View File

@@ -28,6 +28,7 @@ import dev.pcvolkmer.onco.datamapper.ResultSet;
import dev.pcvolkmer.onco.datamapper.datacatalogues.ProzedurCatalogue;
import java.util.List;
import java.util.stream.Collectors;
/**
* Mapper class to load and map prozedur data from database table 'dk_dnpm_uf_prozedur'
@@ -53,6 +54,12 @@ public class KpaProzedurDataMapper extends AbstractKpaTherapieverlaufDataMapper<
return this.map(data);
}
// TODO: Fix for DNPM:DIP verification that does not accept procedures without reason.id
@Override
public List<OncoProcedure> getByParentId(final int id) {
return super.getByParentId(id).stream().filter(p -> p.getReason() != null && p.getReason().getId() != null).collect(Collectors.toList());
}
@Override
protected OncoProcedure map(final ResultSet resultSet) {
var diseases = catalogue.getDiseases(resultSet.getId());