From 57dbb430cb3eef0f75e4604c5d3e5694dcab99c5 Mon Sep 17 00:00:00 2001 From: OURY Sarah <sarah.oury@soprasteria.com> Date: Thu, 1 Aug 2024 12:48:31 +0000 Subject: [PATCH] Fix bug discrimminator et cache --- CHANGELOG.md | 1 + .../infrastructure/config/CacheConfig.java | 11 ++++++++- .../ListenEquipementPhysique.java | 1 - .../repository/DonneesEntreeRepository.java | 4 ++-- .../src/main/resources/application.yaml | 1 + .../src/main/resources/schema.sql | 10 +++++++- .../controller/CalculController.java | 9 ++++++-- .../service/DonneesEntreesService.java | 23 ++++++++++++------- .../service/DonneesEntreesServiceTest.java | 19 +++++++-------- 9 files changed, 55 insertions(+), 24 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd8753fe..a66c9cd3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ Tous les changements de ce projet seront documentés dans ce document. ## [Non livré] +- Correction bug dans la table ind_indicateur_impact_operation_non_it, ajout de l'attribut date_lot_discrimminator - Nettoyage du code : Enlever tous les appels aux anciennes API (impactReseau, impactEquipement, mixelec et typeEquipement), les API restent fonctionnelles mais ne sont plus appelées par les autres composants - Nettoyage : Supression des tables, Entities et Repositories plus utilisés (pour MixElectrique, ImpactEquipement, ImpactReseau & TypeEquipement) - Lancer les calculs sur uniquement quelques critères et/ou étapes -> [Issue6](https://gitlab-forge.din.developpement-durable.gouv.fr/pub/numeco/m4g/numecoeval/-/issues/6) diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java index 5e182885..90538c3d 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/config/CacheConfig.java @@ -37,4 +37,13 @@ public class CacheConfig { public void emptyAllCaches() { log.info("Nettoyage de tous les caches internes"); } -} + + @CacheEvict(value = { + "EtapesFiltrees", + "CriteresFiltres", + }, allEntries = true) + @Scheduled(fixedRateString = "${numecoeval.cache.donnesfiltrees}", timeUnit = TimeUnit.MINUTES) + public void emptyDonneesFiltreesCaches() { + log.info("Nettoyage des caches d'EtapesFiltrees et CriteresFiltres"); + } +} \ No newline at end of file diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java index 3a4ed077..7bb761ea 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/kafkalistener/ListenEquipementPhysique.java @@ -4,7 +4,6 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.mte.numecoeval.calculs.infrastructure.service.calcul.MainEquipementPhysiqueService; import org.mte.numecoeval.topic.data.EquipementPhysiqueDTO; -import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; diff --git a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java index 58e771cf..965c8c4f 100644 --- a/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java +++ b/services/api-event-calculs/src/main/java/org/mte/numecoeval/calculs/infrastructure/repository/DonneesEntreeRepository.java @@ -46,7 +46,7 @@ public class DonneesEntreeRepository { return result.getFirst(); } - @Cacheable("Etapes") + @Cacheable("EtapesFiltrees") public String findEtapes(String nomLot) { List<String> result = new ArrayList<>(); try (Connection conn = dataSource.getConnection()) { @@ -72,7 +72,7 @@ public class DonneesEntreeRepository { return result.getFirst(); } - @Cacheable("Criteres") + @Cacheable("CriteresFiltres") public String findCriteres(String nomLot) { List<String> result = new ArrayList<>(); try (Connection conn = dataSource.getConnection()) { diff --git a/services/api-event-calculs/src/main/resources/application.yaml b/services/api-event-calculs/src/main/resources/application.yaml index 22e10dfe..070760f9 100644 --- a/services/api-event-calculs/src/main/resources/application.yaml +++ b/services/api-event-calculs/src/main/resources/application.yaml @@ -42,6 +42,7 @@ numecoeval: url: "http://localhost:18080" cache: ttl: "20" + donnesfiltrees: "1" server: port: 18085 diff --git a/services/api-event-calculs/src/main/resources/schema.sql b/services/api-event-calculs/src/main/resources/schema.sql index b95c0f38..9a7df953 100644 --- a/services/api-event-calculs/src/main/resources/schema.sql +++ b/services/api-event-calculs/src/main/resources/schema.sql @@ -104,7 +104,11 @@ CREATE TABLE IF NOT EXISTS ind_indicateur_impact_operation_non_it nom_organisation varchar(255) NULL, nom_source_donnee varchar(255) NULL, nom_item_non_it varchar(255) NULL, - qualite varchar(255) NULL + qualite varchar(255) NULL, + date_lot_discriminator date NOT NULL DEFAULT('1970-01-01'), + nom_organisation_discriminator varchar(255) NOT NULL DEFAULT(''), + nom_entite_discriminator varchar(255) NOT NULL DEFAULT(''), + nom_source_donnee_discriminator varchar(255) NOT NULL DEFAULT('') ); CREATE TABLE IF NOT EXISTS ind_indicateur_impact_messagerie @@ -158,6 +162,10 @@ ALTER TABLE IF EXISTS ind_indicateur_impact_equipement_physique ADD COLUMN IF NO ALTER TABLE IF EXISTS ind_indicateur_impact_application ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; ALTER TABLE IF EXISTS ind_indicateur_impact_equipement_virtuel ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS qualite varchar(255) NULL DEFAULT ''; +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS date_lot_discriminator date NOT NULL DEFAULT('1970-01-01'); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_organisation_discriminator varchar(255) NOT NULL DEFAULT(''); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_entite_discriminator varchar(255) NOT NULL DEFAULT(''); +ALTER TABLE IF EXISTS ind_indicateur_impact_operation_non_it ADD COLUMN IF NOT EXISTS nom_source_donnee_discriminator varchar(255) NOT NULL DEFAULT(''); CREATE INDEX IF NOT EXISTS idx_ind_eq_p__nom_lot_nom_equipement ON ind_indicateur_impact_equipement_physique (nom_lot, nom_equipement); CREATE INDEX IF NOT EXISTS idx_ind_eq_v__nom_lot_nom_equipement ON ind_indicateur_impact_equipement_virtuel (nom_lot, nom_equipement); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java index 72c1feff..2a40f112 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/controller/CalculController.java @@ -18,6 +18,8 @@ import org.springframework.web.bind.annotation.RestController; @RequiredArgsConstructor public class CalculController implements CalculsApi { + public static final String TYPE_CALCUL_REJEU = "rejeu"; + public static final String TYPE_CALCUL_SOUMISSION = "soumission"; @Value("${regle-par-defaut-duree-usage}") private String defaultDureeUsage; @@ -46,7 +48,7 @@ public class CalculController implements CalculsApi { log.info("Soumission de calcul pour nom_lot: {}, dureeUsage: {}, mode: {}, etapes:{}, criteres:{}", demandeCalculRest.getNomLot(), modeDureeUsage, mode, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres()); var demandeCalcul = calculRestMapper.toDomain(demandeCalculRest); - donneesEntreesService.manageDonneesEntrees(demandeCalculRest.getNomLot(), dureeUsage, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres()); + donneesEntreesService.manageDonneesEntrees(demandeCalculRest.getNomLot(), dureeUsage, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres(), TYPE_CALCUL_SOUMISSION); var soumission = ModeRest.ASYNC == mode ? soumissionCalculPort.soumissionCalcul(demandeCalcul) : @@ -55,11 +57,14 @@ public class CalculController implements CalculsApi { return ResponseEntity.ok(calculRestMapper.toRest(soumission)); } + @Override public ResponseEntity<RapportDemandeCalculRest> rejeuCalcul(DemandeCalculRest demandeCalculRest) { - log.info("Rejeu de calcul, nom_lot: {}", demandeCalculRest.getNomLot()); + log.info("Rejeu de calcul, nom_lot: {}, etapes:{}, criteres:{}", demandeCalculRest.getNomLot(), demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres()); var demandeCalcul = calculRestMapper.toDomain(demandeCalculRest); + donneesEntreesService.manageDonneesEntrees(demandeCalculRest.getNomLot(), null, demandeCalculRest.getEtapes(), demandeCalculRest.getCriteres(), TYPE_CALCUL_REJEU); + var soumission = soumissionCalculPort.rejeuCalcul(demandeCalcul); var responseBody = calculRestMapper.toRest(soumission); diff --git a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java index f793e5af..a5f0ca4f 100644 --- a/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java +++ b/services/api-expositiondonneesentrees/src/main/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesService.java @@ -14,6 +14,8 @@ import org.springframework.stereotype.Service; import java.util.HashSet; import java.util.List; +import static org.mte.numecoeval.expositiondonneesentrees.infrastructure.controller.CalculController.TYPE_CALCUL_SOUMISSION; + @Service @RequiredArgsConstructor public class DonneesEntreesService { @@ -24,19 +26,20 @@ public class DonneesEntreesService { final ReferentielRestClient referentielRestClient; final DonneesEntreesRepository donneesEntreesRepository; - public void manageDonneesEntrees(String nomLot, DureeUsage modeDureeUsage, List<String> etapes, List<String> criteres) { + public void manageDonneesEntrees(String nomLot, DureeUsage modeDureeUsage, List<String> etapes, List<String> criteres, String typeCalcul) { var donneeEntreeEntity = donneesEntreesRepository.findByNomLot(nomLot).getFirst(); - donneeEntreeEntity = enrichi(donneeEntreeEntity, modeDureeUsage, etapes, criteres); + donneeEntreeEntity = enrichi(donneeEntreeEntity, modeDureeUsage, etapes, criteres, typeCalcul); donneesEntreesRepository.save(donneeEntreeEntity); } - private DonneesEntreesEntity enrichi(DonneesEntreesEntity donneeEntreeEntity, DureeUsage dureeUsage, List<String> etapes, List<String> criteres) { - var modeDureeUsage = dureeUsage == null ? DureeUsage.fromValue(defaultDureeUsage) : dureeUsage; - if (DureeUsage.REEL != modeDureeUsage) { - modeDureeUsage = DureeUsage.FIXE; + private DonneesEntreesEntity enrichi(DonneesEntreesEntity donneeEntreeEntity, DureeUsage dureeUsage, List<String> etapes, List<String> criteres, String typeCalcul) { + if (typeCalcul.equals(TYPE_CALCUL_SOUMISSION)) { + var modeDureeUsage = dureeUsage == null ? DureeUsage.fromValue(defaultDureeUsage) : dureeUsage; + if (DureeUsage.REEL != modeDureeUsage) { + modeDureeUsage = DureeUsage.FIXE; + } + donneeEntreeEntity.setDureeUsage(String.valueOf(modeDureeUsage)); } - donneeEntreeEntity.setDureeUsage(String.valueOf(modeDureeUsage)); - if (etapes != null) { var allEtapes = referentielRestClient.getAllEtapes().stream().map(EtapeDTO::getCode).toList(); if (!new HashSet<>(allEtapes).containsAll(etapes)) { @@ -45,6 +48,8 @@ public class DonneesEntreesService { ); } donneeEntreeEntity.setEtapes(String.join("##", etapes)); + } else { + donneeEntreeEntity.setEtapes(null); } if (criteres != null) { var allCriteres = referentielRestClient.getAllCriteres().stream().map(CritereDTO::getNomCritere).toList(); @@ -54,6 +59,8 @@ public class DonneesEntreesService { ); } donneeEntreeEntity.setCriteres(String.join("##", criteres)); + } else { + donneeEntreeEntity.setCriteres(null); } return donneeEntreeEntity; } diff --git a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java index cd2bf078..76ed19eb 100644 --- a/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java +++ b/services/api-expositiondonneesentrees/src/test/java/org/mte/numecoeval/expositiondonneesentrees/infrastructure/service/DonneesEntreesServiceTest.java @@ -27,6 +27,7 @@ import java.util.List; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThrows; +import static org.mte.numecoeval.expositiondonneesentrees.infrastructure.controller.CalculController.TYPE_CALCUL_SOUMISSION; @ExtendWith({SpringExtension.class}) @ContextConfiguration(initializers = ConfigDataApplicationContextInitializer.class) @@ -73,63 +74,63 @@ public class DonneesEntreesServiceTest { @Test void enrichiDonneesEntrees_with_dureeUsageNull() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, null, null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, null, null, null, TYPE_CALCUL_SOUMISSION); assertEquals("FIXE", actual.getDureeUsage()); } @Test void enrichiDonneesEntrees_with_dureeUsageFixe() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null, TYPE_CALCUL_SOUMISSION); assertEquals("FIXE", actual.getDureeUsage()); } @Test void enrichiDonneesEntrees_with_dureeUsageReel() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("REEL"), null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("REEL"), null, null, TYPE_CALCUL_SOUMISSION); assertEquals("REEL", actual.getDureeUsage()); } @Test void enrichiDonneesEntrees_with_etapesFiltree_shouldFilter() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("UTILISATION", "FABRICATION"), List.of()); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("UTILISATION", "FABRICATION"), List.of(), TYPE_CALCUL_SOUMISSION); assertEquals("UTILISATION##FABRICATION", actual.getEtapes()); } @Test void enrichiDonneesEntrees_with_etapesFiltreeNull_shouldReturnNull() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of()); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of(), TYPE_CALCUL_SOUMISSION); Assertions.assertNull(actual.getEtapes()); } @Test void enrichiDonneesEntrees_with_etapeFiltreeNotInReferentiel_shouldThrowError() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("FAB"), List.of())); + var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of("FAB"), List.of(), TYPE_CALCUL_SOUMISSION)); assertEquals("La liste d'étapes n'est pas valide, elle doit être comprise dans: [UTILISATION, FABRICATION, DISTRIBUTION]", exception.getErreur()); } @Test void enrichiDonneesEntrees_with_criteresFiltree_shouldFilter() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of(), List.of("Acidification", "Ionising radiation", "Climate change")); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), List.of(), List.of("Acidification", "Ionising radiation", "Climate change"), TYPE_CALCUL_SOUMISSION); assertEquals("Acidification##Ionising radiation##Climate change", actual.getCriteres()); } @Test void enrichiDonneesEntrees_with_criteresFiltreeNull_shouldReturnNull() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null); + DonneesEntreesEntity actual = ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, null, TYPE_CALCUL_SOUMISSION); Assertions.assertNull(actual.getCriteres()); } @Test void enrichiDonneesEntrees_with_critereFiltreeNotInReferentiel_shouldThrowError() { DonneesEntreesEntity donneeEntreeEntity = new DonneesEntreesEntity(Long.parseLong("10000"), Long.parseLong("10"), Long.parseLong("20"), Long.parseLong("4"), Long.parseLong("4"), Long.parseLong("4"), null, null, null); - var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of("CLIMATE CHANGE"))); + var exception = assertThrows(ValidationException.class, () -> ReflectionTestUtils.invokeMethod(donneesEntreesService, "enrichi", donneeEntreeEntity, DureeUsage.valueOf("FIXE"), null, List.of("CLIMATE CHANGE"), TYPE_CALCUL_SOUMISSION)); Assertions.assertEquals("La liste de critères n'est pas valide, elle doit être comprise dans: [Climate change, Particulate matter and respiratory inorganics, Ionising radiation, Acidification]", exception.getErreur()); } } -- GitLab