Skip to content

Commit

Permalink
Sort FAO areas by usage in prior notification form select
Browse files Browse the repository at this point in the history
  • Loading branch information
ivangabriele committed Aug 14, 2024
1 parent 206cb9d commit 7514fd2
Show file tree
Hide file tree
Showing 23 changed files with 223 additions and 176 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package fr.gouv.cnsp.monitorfish.domain.entities.fao_area

data class FAOArea(
data class FaoArea(
val faoCode: String,
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package fr.gouv.cnsp.monitorfish.domain.entities.mission.mission_actions.actrep

import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import fr.gouv.cnsp.monitorfish.domain.entities.mission.mission_actions.MissionAction
import fr.gouv.cnsp.monitorfish.domain.entities.mission.mission_actions.MissionActionType
import fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment.hasFaoCodeIncludedIn
Expand All @@ -25,9 +25,13 @@ val NORTH_SEA_OPERATIONAL_ZONES = listOf("27.4", "27.3.a")
*
* cf. https://extranet.legipeche.metier.developpement-durable.gouv.fr/fichier/pdf/ed_decision_2023-25_-_ww_jdp_2024_planning_-_adoption_fr_cle128883.pdf?arg=25288&cle=9a2d7705425e766258f0d648353a05aa04249faf&file=pdf%2Fed_decision_2023-25_-_ww_jdp_2024_planning_-_adoption_fr_cle128883.pdf
*/
val WESTERN_WATERS_OPERATIONAL_ZONES = listOf("27.5", "27.6", "27.7", "27.8", "27.9", "27.10", "34.1.1", "34.1.2", "34.2.0")
val WESTERN_WATERS_OPERATIONAL_ZONES =
listOf("27.5", "27.6", "27.7", "27.8", "27.9", "27.10", "34.1.1", "34.1.2", "34.2.0")

enum class JointDeploymentPlan(private val species: List<FaoZonesAndSpecy>, private val operationalZones: List<String>) {
enum class JointDeploymentPlan(
private val species: List<FaoZonesAndSpecy>,
private val operationalZones: List<String>,
) {
MEDITERRANEAN_AND_EASTERN_ATLANTIC(
MEDITERRANEAN_AND_EASTERN_ATLANTIC_SPECIES,
MEDITERRANEAN_OPERATIONAL_ZONES + EASTERN_ATLANTIC_OPERATIONAL_ZONES,
Expand Down Expand Up @@ -82,15 +86,15 @@ enum class JointDeploymentPlan(private val species: List<FaoZonesAndSpecy>, priv

fun getFirstFaoAreaIncludedInJdp(
control: MissionAction,
): FAOArea? {
): FaoArea? {
val jdpFaoAreas = this.getOperationalZones()

if (control.actionType == MissionActionType.SEA_CONTROL && !isAttributedJdp(control)) {
return null
}

val firstFaoAreaIncludedInJdp = control.faoAreas
.map { FAOArea(it) }
.map { FaoArea(it) }
.firstOrNull { controlFaoArea ->
jdpFaoAreas.any { controlFaoArea.hasFaoCodeIncludedIn(it) }
}
Expand Down Expand Up @@ -119,7 +123,7 @@ enum class JointDeploymentPlan(private val species: List<FaoZonesAndSpecy>, priv

return@firstOrNull jdpEntry.getOperationalZones().any { jdpFaoArea ->
control.faoAreas.any { controlFaoArea ->
FAOArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea)
FaoArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea)
}
}
} == this
Expand All @@ -133,13 +137,13 @@ enum class JointDeploymentPlan(private val species: List<FaoZonesAndSpecy>, priv
*/
if (EASTERN_ATLANTIC_OPERATIONAL_ZONES.contains(jdpFaoArea)) {
return@any control.faoAreas.any { controlFaoArea ->
FAOArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea) &&
FaoArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea) &&
control.speciesOnboard.map { it.speciesCode }.contains(EASTERN_ATLANTIC_SPECY.second)
}
}

return@any control.faoAreas.any { controlFaoArea ->
FAOArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea)
FaoArea(controlFaoArea).hasFaoCodeIncludedIn(jdpFaoArea)
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package fr.gouv.cnsp.monitorfish.domain.repositories

import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import org.locationtech.jts.geom.Point

interface FaoAreaRepository {
fun findAll(): List<FaoArea>

fun findAllSortedByUsage(): List<FaoArea>

fun findByIncluding(point: Point): List<FaoArea>
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
package fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas

import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.repositories.FAOAreasRepository
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import fr.gouv.cnsp.monitorfish.domain.repositories.FaoAreaRepository
import fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment.removeRedundantFaoArea
import org.locationtech.jts.geom.Coordinate
import org.locationtech.jts.geom.GeometryFactory

@UseCase
class ComputeFAOAreasFromCoordinates(private val faoAreasRepository: FAOAreasRepository) {
fun execute(longitude: Double, latitude: Double): List<FAOArea> {
class ComputeFaoAreasFromCoordinates(private val faoAreaRepository: FaoAreaRepository) {
fun execute(longitude: Double, latitude: Double): List<FaoArea> {
val point = GeometryFactory().createPoint(Coordinate(longitude, latitude))

val allFaoAreas = faoAreasRepository.findByIncluding(point)
val allFaoAreas = faoAreaRepository.findByIncluding(point)

return removeRedundantFaoArea(allFaoAreas)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas

import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import fr.gouv.cnsp.monitorfish.domain.repositories.PortRepository
import fr.gouv.cnsp.monitorfish.domain.repositories.RiskFactorRepository
import fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment.removeRedundantFaoArea
Expand All @@ -19,10 +19,10 @@ import fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment.removeRedundantFa
* - Fetch the fao zones from the portLocode if given
*/
@UseCase
class ComputeVesselFAOAreas(
class ComputeVesselFaoAreas(
private val riskFactorRepository: RiskFactorRepository,
private val portRepository: PortRepository,
private val computeFAOAreasFromCoordinates: ComputeFAOAreasFromCoordinates,
private val computeFaoAreasFromCoordinates: ComputeFaoAreasFromCoordinates,
) {
fun execute(
internalReferenceNumber: String?,
Expand All @@ -45,15 +45,15 @@ class ComputeVesselFAOAreas(
} ?: listOf()

if (faoAreas.isNotEmpty()) {
val faoAreasObjects = faoAreas.map { FAOArea(faoCode = it) }
val faoAreasObjects = faoAreas.map { FaoArea(faoCode = it) }

return removeRedundantFaoArea(faoAreasObjects).map { it.faoCode }
}
}

// Otherwise, fetch the fao zones from the latitude/longitude if given
if (latitude != null && longitude != null) {
return computeFAOAreasFromCoordinates.execute(longitude, latitude).map { it.faoCode }
return computeFaoAreasFromCoordinates.execute(longitude, latitude).map { it.faoCode }
}

// Otherwise, fetch the fao zones from the portLocode if given
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas

import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.repositories.FAOAreasRepository
import fr.gouv.cnsp.monitorfish.domain.repositories.FaoAreaRepository

@UseCase
class GetFAOAreas(private val faoAreasRepository: FAOAreasRepository) {
class GetFaoAreas(private val faoAreaRepository: FaoAreaRepository) {
fun execute(): List<String> {
val faoAreas = faoAreasRepository.findAll()
val faoAreas = faoAreaRepository.findAllSortedByUsage()

return faoAreas.map { it.faoCode }
.distinct()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment

import fr.gouv.cnsp.monitorfish.config.UseCase
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import fr.gouv.cnsp.monitorfish.domain.entities.fleet_segment.FleetSegment
import fr.gouv.cnsp.monitorfish.domain.repositories.FleetSegmentRepository
import org.slf4j.LoggerFactory
Expand Down Expand Up @@ -34,7 +34,7 @@ class ComputeFleetSegments(
fleetSegment.targetSpecies.any { specyCodes.contains(it) } ||
fleetSegment.bycatchSpecies.any { specyCodes.contains(it) }
val isContainingFaoAreaFromList = fleetSegment.faoAreas.isEmpty() || fleetSegment.faoAreas.any { faoArea ->
faoAreas.map { FAOArea(it) }.any { it.hasFaoCodeIncludedIn(faoArea) }
faoAreas.map { FaoArea(it) }.any { it.hasFaoCodeIncludedIn(faoArea) }
}

return@filter isContainingGearFromList && isContainingSpecyFromList && isContainingFaoAreaFromList
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package fr.gouv.cnsp.monitorfish.domain.use_cases.fleet_segment

import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea

/**
* Filters the input sequence of FAO areas to keep only the smallest non overlapping areas.
Expand All @@ -13,7 +13,7 @@ import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
* @see: Python implementation :
* https://github.com/MTES-MCT/monitorfish/blob/master/datascience/src/pipeline/helpers/fao_areas.py#L4
*/
fun removeRedundantFaoArea(faoAreas: List<FAOArea>): List<FAOArea> {
fun removeRedundantFaoArea(faoAreas: List<FaoArea>): List<FaoArea> {
val distinctFAOAreas = faoAreas.distinctBy { it.faoCode }

return distinctFAOAreas
Expand Down Expand Up @@ -41,7 +41,7 @@ fun removeRedundantFaoArea(faoAreas: List<FAOArea>): List<FAOArea> {
* - true if the faoArea.faoCode if null or empty
* - false if the faoArea.faoCode is not null or empty and the tested are is null or empty
*/
fun FAOArea.hasFaoCodeIncludedIn(faoCode: String?): Boolean {
fun FaoArea.hasFaoCodeIncludedIn(faoCode: String?): Boolean {
if (faoCode.isNullOrEmpty()) {
return true
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package fr.gouv.cnsp.monitorfish.infrastructure.api.bff

import fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas.ComputeVesselFAOAreas
import fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas.GetFAOAreas
import fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas.ComputeVesselFaoAreas
import fr.gouv.cnsp.monitorfish.domain.use_cases.fao_areas.GetFaoAreas
import io.swagger.v3.oas.annotations.Operation
import io.swagger.v3.oas.annotations.Parameter
import io.swagger.v3.oas.annotations.tags.Tag
Expand All @@ -14,8 +14,8 @@ import org.springframework.web.bind.annotation.RestController
@RequestMapping("/bff")
@Tag(name = "APIs for Data referential")
class FaoAreaController(
private val getFAOAreas: GetFAOAreas,
private val computeVesselFAOAreas: ComputeVesselFAOAreas,
private val getFAOAreas: GetFaoAreas,
private val computeVesselFAOAreas: ComputeVesselFaoAreas,
) {

@GetMapping("/v1/fao_areas")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class CaffeineConfiguration {

// FAO Areas
val faoAreas = "fao_areas"
val faoAreasSortedByUsage = "fao_areas_sorted_by_usage"

// Gears
val gear = "gear"
Expand Down Expand Up @@ -95,6 +96,7 @@ class CaffeineConfiguration {

// FAO Areas
val faoAreasCache = buildMinutesCache(faoAreas, ticker, oneWeek)
val faoAreasSortedByUsageCache = buildMinutesCache(faoAreasSortedByUsage, ticker, oneDay)

// Gears
val gearsCache = buildMinutesCache(gears, ticker, oneWeek)
Expand Down Expand Up @@ -171,6 +173,7 @@ class CaffeineConfiguration {
segmentsByYearCache,
districtCache,
faoAreasCache,
faoAreasSortedByUsageCache,
findBeaconCache,
firstAndLastTripDates,
gearCache,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
package fr.gouv.cnsp.monitorfish.infrastructure.database.entities

import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FAOArea
import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import jakarta.persistence.Column
import jakarta.persistence.Entity
import jakarta.persistence.Id
import jakarta.persistence.Table

@Entity
@Table(name = "fao_areas")
data class FAOAreasEntity(
data class FaoAreaEntity(
@Id
@Column(name = "f_code")
val faoCode: String,
) {

fun toFAOArea() = FAOArea(
fun toFaoArea() = FaoArea(
faoCode = faoCode,
)
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package fr.gouv.cnsp.monitorfish.infrastructure.database.repositories

import fr.gouv.cnsp.monitorfish.domain.entities.fao_area.FaoArea
import fr.gouv.cnsp.monitorfish.domain.repositories.FaoAreaRepository
import fr.gouv.cnsp.monitorfish.infrastructure.database.repositories.interfaces.DBFaoAreaRepository
import org.locationtech.jts.geom.Point
import org.springframework.cache.annotation.Cacheable
import org.springframework.stereotype.Repository

@Repository
class JpaFaoAreaRepository(private val dbFAOAreaRepository: DBFaoAreaRepository) : FaoAreaRepository {
@Cacheable(value = ["fao_areas"])
override fun findAll(): List<FaoArea> {
return dbFAOAreaRepository.findAll().map {
it.toFaoArea()
}
}

@Cacheable(value = ["fao_areas_sorted_by_usage"])
override fun findAllSortedByUsage(): List<FaoArea> {
return dbFAOAreaRepository.findAllSortedByUsage().map {
it.toFaoArea()
}
}

override fun findByIncluding(point: Point): List<FaoArea> {
return dbFAOAreaRepository.findByIncluding(point).map {
it.toFaoArea()
}
}
}

This file was deleted.

Loading

0 comments on commit 7514fd2

Please sign in to comment.