1
0
mirror of https://github.com/pcvolkmer/etl-processor.git synced 2025-04-19 17:26:51 +00:00

Issue #12: Transform MTBFile objects by using transformation rules

This commit is contained in:
Paul-Christian Volkmer 2023-10-05 12:09:56 +02:00
parent 2824951e5e
commit 4196664060
5 changed files with 41 additions and 22 deletions

View File

@ -26,6 +26,7 @@ import dev.dnpm.etl.processor.pseudonym.Generator
import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator import dev.dnpm.etl.processor.pseudonym.GpasPseudonymGenerator
import dev.dnpm.etl.processor.pseudonym.PseudonymizeService import dev.dnpm.etl.processor.pseudonym.PseudonymizeService
import dev.dnpm.etl.processor.services.Transformation import dev.dnpm.etl.processor.services.Transformation
import dev.dnpm.etl.processor.services.TransformationService
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty
import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
@ -73,10 +74,13 @@ class AppConfiguration {
} }
@Bean @Bean
fun transformations(configProperties: AppConfigProperties): List<Transformation> { fun transformationService(
return configProperties.transformations.map { objectMapper: ObjectMapper,
configProperties: AppConfigProperties
): TransformationService {
return TransformationService(objectMapper, configProperties.transformations.map {
Transformation.of(it.path) from it.from to it.to Transformation.of(it.path) from it.from to it.to
} })
} }
} }

View File

@ -38,6 +38,7 @@ import java.util.*
@Service @Service
class RequestProcessor( class RequestProcessor(
private val pseudonymizeService: PseudonymizeService, private val pseudonymizeService: PseudonymizeService,
private val transformationService: TransformationService,
private val sender: MtbFileSender, private val sender: MtbFileSender,
private val requestService: RequestService, private val requestService: RequestService,
private val objectMapper: ObjectMapper, private val objectMapper: ObjectMapper,
@ -50,7 +51,7 @@ class RequestProcessor(
mtbFile pseudonymizeWith pseudonymizeService mtbFile pseudonymizeWith pseudonymizeService
val request = MtbFileSender.MtbFileRequest(requestId, mtbFile) val request = MtbFileSender.MtbFileRequest(requestId, transformationService.transform(mtbFile))
requestService.save( requestService.save(
Request( Request(

View File

@ -24,8 +24,8 @@ import com.jayway.jsonpath.JsonPath
import com.jayway.jsonpath.PathNotFoundException import com.jayway.jsonpath.PathNotFoundException
import de.ukw.ccc.bwhc.dto.MtbFile import de.ukw.ccc.bwhc.dto.MtbFile
class TransformationService(private val objectMapper: ObjectMapper) { class TransformationService(private val objectMapper: ObjectMapper, private val transformations: List<Transformation>) {
fun transform(mtbFile: MtbFile, vararg transformations: Transformation): MtbFile { fun transform(mtbFile: MtbFile): MtbFile {
var json = objectMapper.writeValueAsString(mtbFile) var json = objectMapper.writeValueAsString(mtbFile)
transformations.forEach { transformation -> transformations.forEach { transformation ->

View File

@ -37,6 +37,7 @@ import org.mockito.Mockito.*
import org.mockito.junit.jupiter.MockitoExtension import org.mockito.junit.jupiter.MockitoExtension
import org.mockito.kotlin.any import org.mockito.kotlin.any
import org.mockito.kotlin.argumentCaptor import org.mockito.kotlin.argumentCaptor
import org.mockito.kotlin.whenever
import org.springframework.context.ApplicationEventPublisher import org.springframework.context.ApplicationEventPublisher
import java.time.Instant import java.time.Instant
import java.util.* import java.util.*
@ -46,6 +47,7 @@ import java.util.*
class RequestProcessorTest { class RequestProcessorTest {
private lateinit var pseudonymizeService: PseudonymizeService private lateinit var pseudonymizeService: PseudonymizeService
private lateinit var transformationService: TransformationService
private lateinit var sender: MtbFileSender private lateinit var sender: MtbFileSender
private lateinit var requestService: RequestService private lateinit var requestService: RequestService
private lateinit var applicationEventPublisher: ApplicationEventPublisher private lateinit var applicationEventPublisher: ApplicationEventPublisher
@ -55,11 +57,13 @@ class RequestProcessorTest {
@BeforeEach @BeforeEach
fun setup( fun setup(
@Mock pseudonymizeService: PseudonymizeService, @Mock pseudonymizeService: PseudonymizeService,
@Mock transformationService: TransformationService,
@Mock sender: RestMtbFileSender, @Mock sender: RestMtbFileSender,
@Mock requestService: RequestService, @Mock requestService: RequestService,
@Mock applicationEventPublisher: ApplicationEventPublisher @Mock applicationEventPublisher: ApplicationEventPublisher
) { ) {
this.pseudonymizeService = pseudonymizeService this.pseudonymizeService = pseudonymizeService
this.transformationService = transformationService
this.sender = sender this.sender = sender
this.requestService = requestService this.requestService = requestService
this.applicationEventPublisher = applicationEventPublisher this.applicationEventPublisher = applicationEventPublisher
@ -68,6 +72,7 @@ class RequestProcessorTest {
requestProcessor = RequestProcessor( requestProcessor = RequestProcessor(
pseudonymizeService, pseudonymizeService,
transformationService,
sender, sender,
requestService, requestService,
objectMapper, objectMapper,
@ -98,6 +103,10 @@ class RequestProcessorTest {
it.arguments[0] as String it.arguments[0] as String
}.`when`(pseudonymizeService).patientPseudonym(any()) }.`when`(pseudonymizeService).patientPseudonym(any())
doAnswer {
it.arguments[0]
}.whenever(transformationService).transform(any())
val mtbFile = MtbFile.builder() val mtbFile = MtbFile.builder()
.withPatient( .withPatient(
Patient.builder() Patient.builder()
@ -153,6 +162,10 @@ class RequestProcessorTest {
it.arguments[0] as String it.arguments[0] as String
}.`when`(pseudonymizeService).patientPseudonym(any()) }.`when`(pseudonymizeService).patientPseudonym(any())
doAnswer {
it.arguments[0]
}.whenever(transformationService).transform(any())
val mtbFile = MtbFile.builder() val mtbFile = MtbFile.builder()
.withPatient( .withPatient(
Patient.builder() Patient.builder()
@ -212,6 +225,10 @@ class RequestProcessorTest {
it.arguments[0] as String it.arguments[0] as String
}.`when`(pseudonymizeService).patientPseudonym(any()) }.`when`(pseudonymizeService).patientPseudonym(any())
doAnswer {
it.arguments[0]
}.whenever(transformationService).transform(any())
val mtbFile = MtbFile.builder() val mtbFile = MtbFile.builder()
.withPatient( .withPatient(
Patient.builder() Patient.builder()
@ -271,6 +288,10 @@ class RequestProcessorTest {
it.arguments[0] as String it.arguments[0] as String
}.`when`(pseudonymizeService).patientPseudonym(any()) }.`when`(pseudonymizeService).patientPseudonym(any())
doAnswer {
it.arguments[0]
}.whenever(transformationService).transform(any())
val mtbFile = MtbFile.builder() val mtbFile = MtbFile.builder()
.withPatient( .withPatient(
Patient.builder() Patient.builder()

View File

@ -34,15 +34,16 @@ class TransformationServiceTest {
@BeforeEach @BeforeEach
fun setup() { fun setup() {
this.service = TransformationService(ObjectMapper()) this.service = TransformationService(
ObjectMapper(), listOf(
Transformation.of("consent.status") from Consent.Status.ACTIVE to Consent.Status.REJECTED,
Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014",
)
)
} }
@Test @Test
fun shouldTransformMtbFile() { fun shouldTransformMtbFile() {
val transformations = arrayOf(
Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014",
)
val mtbFile = MtbFile.builder().withDiagnoses( val mtbFile = MtbFile.builder().withDiagnoses(
listOf( listOf(
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also { Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
@ -51,7 +52,7 @@ class TransformationServiceTest {
) )
).build() ).build()
val actual = this.service.transform(mtbFile, *transformations) val actual = this.service.transform(mtbFile)
assertThat(actual).isNotNull assertThat(actual).isNotNull
assertThat(actual.diagnoses[0].icd10.version).isEqualTo("2014") assertThat(actual.diagnoses[0].icd10.version).isEqualTo("2014")
@ -59,10 +60,6 @@ class TransformationServiceTest {
@Test @Test
fun shouldOnlyTransformGivenValues() { fun shouldOnlyTransformGivenValues() {
val transformations = arrayOf(
Transformation.of("diagnoses[*].icd10.version") from "2013" to "2014",
)
val mtbFile = MtbFile.builder().withDiagnoses( val mtbFile = MtbFile.builder().withDiagnoses(
listOf( listOf(
Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also { Diagnosis.builder().withId("1234").withIcd10(Icd10("F79.9").also {
@ -74,7 +71,7 @@ class TransformationServiceTest {
) )
).build() ).build()
val actual = this.service.transform(mtbFile, *transformations) val actual = this.service.transform(mtbFile)
assertThat(actual).isNotNull assertThat(actual).isNotNull
assertThat(actual.diagnoses[0].icd10.code).isEqualTo("F79.9") assertThat(actual.diagnoses[0].icd10.code).isEqualTo("F79.9")
@ -85,15 +82,11 @@ class TransformationServiceTest {
@Test @Test
fun shouldTransformMtbFileWithConsentEnum() { fun shouldTransformMtbFileWithConsentEnum() {
val transformations = arrayOf(
Transformation.of("consent.status") from Consent.Status.ACTIVE to Consent.Status.REJECTED,
)
val mtbFile = MtbFile.builder().withConsent( val mtbFile = MtbFile.builder().withConsent(
Consent("123", "456", Consent.Status.ACTIVE) Consent("123", "456", Consent.Status.ACTIVE)
).build() ).build()
val actual = this.service.transform(mtbFile, *transformations) val actual = this.service.transform(mtbFile)
assertThat(actual.consent).isNotNull assertThat(actual.consent).isNotNull
assertThat(actual.consent.status).isEqualTo(Consent.Status.REJECTED) assertThat(actual.consent.status).isEqualTo(Consent.Status.REJECTED)