From f25df1db342919dad0ef99695010de5166b31bb2 Mon Sep 17 00:00:00 2001 From: Loup Theron Date: Fri, 4 Oct 2024 10:53:04 +0200 Subject: [PATCH] Improve use-case perfs --- .../prior_notification/PriorNotification.kt | 13 +++++++ .../GetPriorNotifications.kt | 34 ++++++++++++++++--- 2 files changed, 43 insertions(+), 4 deletions(-) diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/prior_notification/PriorNotification.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/prior_notification/PriorNotification.kt index 737713352f..f914b5241f 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/prior_notification/PriorNotification.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/entities/prior_notification/PriorNotification.kt @@ -7,6 +7,7 @@ import fr.gouv.cnsp.monitorfish.domain.entities.logbook.LogbookMessageAndValue import fr.gouv.cnsp.monitorfish.domain.entities.logbook.messages.Acknowledgment import fr.gouv.cnsp.monitorfish.domain.entities.logbook.messages.PNO import fr.gouv.cnsp.monitorfish.domain.entities.port.Port +import fr.gouv.cnsp.monitorfish.domain.entities.reporting.Reporting import fr.gouv.cnsp.monitorfish.domain.entities.reporting.ReportingType import fr.gouv.cnsp.monitorfish.domain.entities.reporting.filters.ReportingFilter import fr.gouv.cnsp.monitorfish.domain.entities.risk_factor.VesselRiskFactor @@ -152,6 +153,18 @@ data class PriorNotification( reportingCount = currentReportings?.count() ?: 0 } + fun enrichReportingCount( + internalReferenceNumber: String?, + reportings: List, + ) { + val currentReportings = + internalReferenceNumber?.let { vesselInternalReferenceNumber -> + reportings.filter { it.internalReferenceNumber == vesselInternalReferenceNumber } + } + + reportingCount = currentReportings?.count() ?: 0 + } + fun markAsAcknowledged() { logbookMessageAndValue = LogbookMessageAndValue( diff --git a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/use_cases/prior_notification/GetPriorNotifications.kt b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/use_cases/prior_notification/GetPriorNotifications.kt index a89bbdb00d..095f6fe742 100644 --- a/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/use_cases/prior_notification/GetPriorNotifications.kt +++ b/backend/src/main/kotlin/fr/gouv/cnsp/monitorfish/domain/use_cases/prior_notification/GetPriorNotifications.kt @@ -7,6 +7,9 @@ import fr.gouv.cnsp.monitorfish.domain.entities.prior_notification.PriorNotifica import fr.gouv.cnsp.monitorfish.domain.entities.prior_notification.PriorNotificationStats import fr.gouv.cnsp.monitorfish.domain.entities.prior_notification.filters.PriorNotificationsFilter import fr.gouv.cnsp.monitorfish.domain.entities.prior_notification.sorters.PriorNotificationsSortColumn +import fr.gouv.cnsp.monitorfish.domain.entities.reporting.Reporting +import fr.gouv.cnsp.monitorfish.domain.entities.reporting.ReportingType +import fr.gouv.cnsp.monitorfish.domain.entities.reporting.filters.ReportingFilter import fr.gouv.cnsp.monitorfish.domain.entities.vessel.UNKNOWN_VESSEL import fr.gouv.cnsp.monitorfish.domain.repositories.* import fr.gouv.cnsp.monitorfish.domain.utils.PaginatedList @@ -68,10 +71,8 @@ class GetPriorNotifications( incompletePriorNotifications .map { priorNotification -> priorNotification.enrich(allRiskFactors, allPorts, priorNotification.isManuallyCreated) - priorNotification.logbookMessageAndValue.logbookMessage - .enrichGearPortAndSpecyNames(allGears, allPorts, allSpecies) - priorNotification + return@map priorNotification } enrichPriorNotificationsWithVessel(priorNotificationsWithoutVessel) @@ -137,8 +138,12 @@ class GetPriorNotifications( val (enrichedPaginatedList, enrichedPaginatedListTimeTaken) = measureTimedValue { paginatedList.apply { + val reportings = getReportings() + data.forEach { - it.enrichReportingCount(reportingRepository) + it.enrichReportingCount(it.vessel?.internalReferenceNumber, reportings) + it.logbookMessageAndValue.logbookMessage + .enrichGearPortAndSpecyNames(allGears, allPorts, allSpecies) } } } @@ -147,23 +152,44 @@ class GetPriorNotifications( return enrichedPaginatedList } + private fun PaginatedList.getReportings(): List { + val internalReferenceNumbers = data.mapNotNull { it.vessel?.internalReferenceNumber } + val reportings = + reportingRepository.findAll( + ReportingFilter( + vesselInternalReferenceNumbers = internalReferenceNumbers, + isArchived = false, + isDeleted = false, + types = listOf(ReportingType.INFRACTION_SUSPICION), + ), + ) + + return reportings + } + private fun enrichPriorNotificationsWithVessel( priorNotifications: List, ): List { val vesselsViaVesselsIds = priorNotifications + .asSequence() .filter { it.isManuallyCreated } .mapNotNull { it.logbookMessageAndValue.logbookMessage.vesselId } + .distinct() .chunked(5000) .map { vesselRepository.findVesselsByIds(it) } .flatten() + .toList() val vesselsViaInternalReferenceNumbers = priorNotifications + .asSequence() .filter { !it.isManuallyCreated } .mapNotNull { it.logbookMessageAndValue.logbookMessage.internalReferenceNumber } + .distinct() .chunked(5000) .map { vesselRepository.findVesselsByInternalReferenceNumbers(it) } .flatten() + .toList() val vessels = vesselsViaVesselsIds + vesselsViaInternalReferenceNumbers return priorNotifications.map {