Skip to content
Snippets Groups Projects
Commit f27fd0bf authored by LAIGNEAU Clément's avatar LAIGNEAU Clément
Browse files

Merge branch 'fix_bug_discrimminator' into 'develop'

Fix bug discrimminator et cache

See merge request !33
parents 4b98245f 57dbb430
No related branches found
No related tags found
2 merge requests!35preparation release 2.1.0,!33Fix bug discrimminator et cache
Pipeline #351590 passed
Showing
with 55 additions and 24 deletions
......@@ -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)
......
......@@ -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
......@@ -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;
......
......@@ -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()) {
......
......@@ -42,6 +42,7 @@ numecoeval:
url: "http://localhost:18080"
cache:
ttl: "20"
donnesfiltrees: "1"
server:
port: 18085
......
......@@ -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);
......
......@@ -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);
......
......@@ -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;
}
......
......@@ -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());
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment