1
0
mirror of https://github.com/pcvolkmer/mv64e-onkostar-data.git synced 2025-07-02 02:22:54 +00:00

feat: add Evidenzlevel

This commit is contained in:
2025-06-30 00:46:07 +02:00
parent 60cbb0ff8a
commit 070ac3c2ab
5 changed files with 247 additions and 3 deletions

View File

@ -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<T> extends AbstractSubformDataMapper<T> {
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<LevelOfEvidenceAddendumCoding>();
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();
}
}

View File

@ -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<ProcedureRecommendation> {
public class EinzelempfehlungProzedurDataMapper extends AbstractEinzelempfehlungDataMapper<ProcedureRecommendation> {
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();
}
}

View File

@ -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<MtbMedicationRecommendation> {
public class EinzelempfehlungWirkstoffDataMapper extends AbstractEinzelempfehlungDataMapper<MtbMedicationRecommendation> {
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();
}

View File

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

View File

@ -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.*;