From 1d371524badaa42e8e7c12661a36f7765004478b Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Tue, 30 Sep 2025 19:02:58 +0200 Subject: [PATCH 01/11] migration and new entities OK (todo: single DTO and rm former tables) Signed-off-by: David BRAQUART --- .../server/entities/EntityRegistry.java | 11 +- .../entities/tabular/TabularBaseEntity.java | 64 ------ .../tabular/TabularCreationEntity.java | 89 -------- .../tabular/TabularModificationEntity.java | 87 -------- .../tabular/TabularModificationsEntity.java | 156 ++++++++++++++ .../GeneratorCreationRepository.java | 16 -- .../LineModificationRepository.java | 8 +- .../repositories/ModificationRepository.java | 10 +- .../NetworkModificationRepository.java | 193 +++++++----------- .../changesets/changelog_20250930T101841Z.xml | 27 +++ .../changesets/changelog_20250930T132326Z.xml | 42 ++++ ...nTabularModifications_20250930T132326Z.sql | 27 +++ .../db/changelog/db.changelog-master.yaml | 6 + 13 files changed, 340 insertions(+), 396 deletions(-) delete mode 100644 src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java delete mode 100644 src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java delete mode 100644 src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java create mode 100644 src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml create mode 100644 src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql diff --git a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java index a3a61c8ee..b72ea25fe 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java +++ b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java @@ -20,8 +20,7 @@ import org.gridsuite.modification.server.entities.equipment.modification.attribute.IntegerEquipmentAttributeModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.attribute.StringEquipmentAttributeModificationEntity; import org.gridsuite.modification.server.entities.equipment.modification.byfilter.*; -import org.gridsuite.modification.server.entities.tabular.TabularCreationEntity; -import org.gridsuite.modification.server.entities.tabular.TabularModificationEntity; +import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; /** * @author Ayoub LABIDI @@ -50,7 +49,6 @@ private EntityRegistry() { register(ConverterStationCreationInfos.class, ConverterStationCreationEntity.class); register(LccCreationInfos.class, LccCreationEntity.class); register(LccConverterStationCreationInfos.class, LccConverterStationCreationEntity.class); - register(TabularCreationInfos.class, TabularCreationEntity.class); register(CreateVoltageLevelSectionInfos.class, CreateVoltageLevelSectionEntity.class); // // modification @@ -64,8 +62,6 @@ private EntityRegistry() { register(ShuntCompensatorModificationInfos.class, ShuntCompensatorModificationEntity.class); register(VscModificationInfos.class, VscModificationEntity.class); register(ConverterStationModificationInfos.class, ConverterStationModificationEntity.class); - register(TabularModificationInfos.class, TabularModificationEntity.class); - register(LimitSetsTabularModificationInfos.class, TabularModificationEntity.class); register(ByFormulaModificationInfos.class, ByFormulaModificationEntity.class); register(ModificationByAssignmentInfos.class, ModificationByAssignmentEntity.class); register(EquipmentAttributeModificationInfos.class, EquipmentAttributeModificationEntity.class); @@ -76,6 +72,11 @@ private EntityRegistry() { register(CreateVoltageLevelTopologyInfos.class, CreateVoltageLevelTopologyEntity.class); register(MoveVoltageLevelFeederBaysInfos.class, MoveVoltageLevelFeederBaysEntity.class); + // tabular + register(TabularCreationInfos.class, TabularModificationsEntity.class); + register(TabularModificationInfos.class, TabularModificationsEntity.class); + register(LimitSetsTabularModificationInfos.class, TabularModificationsEntity.class); + // // attatching and splitting register(LineAttachToVoltageLevelInfos.class, LineAttachToVoltageLevelEntity.class); register(LineSplitWithVoltageLevelInfos.class, LineSplitWithVoltageLevelEntity.class); diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java deleted file mode 100644 index 9f350afdf..000000000 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularBaseEntity.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - Copyright (c) 2021, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.modification.server.entities.tabular; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.FetchType; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.MappedSuperclass; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OrderColumn; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.gridsuite.modification.dto.ModificationInfos; -import org.gridsuite.modification.dto.TabularBaseInfos; -import org.gridsuite.modification.server.entities.ModificationEntity; - -import java.util.List; - -/** - * @author Franck Lecuyer - */ -@NoArgsConstructor -@Getter -@MappedSuperclass -public class TabularBaseEntity extends ModificationEntity { - - @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "tabular_modification_id") - @OrderColumn(name = "insert_position") - private List properties; - - private String csvFilename; - - protected TabularBaseEntity(TabularBaseInfos tabularBaseInfos) { - super(tabularBaseInfos); - assignAttributes(tabularBaseInfos); - } - - @Override - public void update(ModificationInfos modificationInfos) { - super.update(modificationInfos); - assignAttributes((TabularBaseInfos) modificationInfos); - } - - private void assignAttributes(TabularBaseInfos tabularBaseInfos) { - List newProperties = tabularBaseInfos.getProperties() == null ? null : - tabularBaseInfos.getProperties().stream() - .map(TabularPropertyEntity::new) - .toList(); - if (this.properties != null) { - this.properties.clear(); - if (newProperties != null) { - this.properties.addAll(newProperties); - } - } else { - this.properties = newProperties; - } - this.csvFilename = tabularBaseInfos.getCsvFilename(); - } -} diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java deleted file mode 100644 index dbd5abc30..000000000 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularCreationEntity.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - Copyright (c) 2024, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.modification.server.entities.tabular; - -import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.EnumType; -import jakarta.persistence.Enumerated; -import jakarta.persistence.OneToMany; -import jakarta.persistence.OrderColumn; -import jakarta.persistence.Table; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import lombok.Setter; -import org.gridsuite.modification.ModificationType; -import org.gridsuite.modification.dto.ModificationInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; -import org.gridsuite.modification.server.entities.ModificationEntity; -import org.springframework.util.CollectionUtils; - -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author Franck Lecuyer - */ -@NoArgsConstructor -@Getter -@Setter -@Entity -@Table(name = "tabular_creation") -public class TabularCreationEntity extends TabularBaseEntity { - - @Column(name = "creationType") - @Enumerated(EnumType.STRING) - private ModificationType creationType; - - @OneToMany(cascade = CascadeType.ALL) - @OrderColumn - private List creations; - - public TabularCreationEntity(@NonNull TabularCreationInfos tabularCreationInfos) { - super(tabularCreationInfos); - assignAttributes(tabularCreationInfos); - } - - @Override - public TabularCreationInfos toModificationInfos() { - List creationsInfos = creations.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); - return TabularCreationInfos.builder() - .date(getDate()) - .uuid(getId()) - .stashed(getStashed()) - .activated(getActivated()) - .creationType(creationType) - .creations(creationsInfos) - .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(getCsvFilename()) - .build(); - } - - @Override - public void update(@NonNull ModificationInfos modificationInfos) { - super.update(modificationInfos); - assignAttributes((TabularCreationInfos) modificationInfos); - } - - private void assignAttributes(TabularCreationInfos tabularCreationInfos) { - creationType = tabularCreationInfos.getCreationType(); - if (creations == null) { - creations = tabularCreationInfos.getCreations().stream() - .map(ModificationEntity::fromDTO) - .toList(); - } else { - creations.clear(); - creations.addAll(tabularCreationInfos.getCreations().stream() - .map(ModificationEntity::fromDTO) - .toList()); - } - } -} diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java deleted file mode 100644 index c9af5f86b..000000000 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationEntity.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - Copyright (c) 2023, RTE (http://www.rte-france.com) - This Source Code Form is subject to the terms of the Mozilla Public - License, v. 2.0. If a copy of the MPL was not distributed with this - file, You can obtain one at http://mozilla.org/MPL/2.0/. - */ -package org.gridsuite.modification.server.entities.tabular; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.NonNull; -import lombok.Setter; - -import java.util.List; -import java.util.stream.Collectors; - -import org.gridsuite.modification.ModificationType; -import org.gridsuite.modification.dto.*; -import org.gridsuite.modification.server.entities.ModificationEntity; -import org.springframework.util.CollectionUtils; - -/** - * @author Etienne Homer - */ -@NoArgsConstructor -@Getter -@Setter -@Entity -@Table(name = "tabular_modification") -public class TabularModificationEntity extends TabularBaseEntity { - - @Column(name = "modificationType") - @Enumerated(EnumType.STRING) - private ModificationType modificationType; - - @OneToMany(cascade = CascadeType.ALL) - @OrderColumn - private List modifications; - - public TabularModificationEntity(@NonNull TabularModificationInfos tabularModificationInfos) { - super(tabularModificationInfos); - assignAttributes(tabularModificationInfos); - } - - public TabularModificationEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) { - super(tabularModificationInfos); - assignAttributes(tabularModificationInfos); - } - - @Override - public TabularModificationInfos toModificationInfos() { - List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); - return TabularModificationInfos.builder() - .date(getDate()) - .uuid(getId()) - .stashed(getStashed()) - .activated(getActivated()) - .modificationType(modificationType) - .modifications(modificationsInfos) - .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(getCsvFilename()) - .build(); - } - - @Override - public void update(@NonNull ModificationInfos modificationInfos) { - super.update(modificationInfos); - assignAttributes((TabularModificationInfos) modificationInfos); - } - - private void assignAttributes(TabularModificationInfos tabularModificationInfos) { - modificationType = tabularModificationInfos.getModificationType(); - if (modifications == null) { - modifications = tabularModificationInfos.getModifications().stream() - .map(ModificationEntity::fromDTO) - .collect(Collectors.toList()); - } else { - modifications.clear(); - modifications.addAll(tabularModificationInfos.getModifications().stream() - .map(ModificationEntity::fromDTO) - .toList()); - } - } -} diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java new file mode 100644 index 000000000..7ad49d6be --- /dev/null +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java @@ -0,0 +1,156 @@ +/* + Copyright (c) 2021, RTE (http://www.rte-france.com) + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +package org.gridsuite.modification.server.entities.tabular; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.NonNull; +import lombok.Setter; +import org.gridsuite.modification.ModificationType; +import org.gridsuite.modification.dto.LimitSetsTabularModificationInfos; +import org.gridsuite.modification.dto.ModificationInfos; +import org.gridsuite.modification.dto.TabularBaseInfos; +import org.gridsuite.modification.dto.TabularCreationInfos; +import org.gridsuite.modification.dto.TabularModificationInfos; +import org.gridsuite.modification.server.entities.ModificationEntity; +import org.springframework.util.CollectionUtils; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author David Braquart + */ +@NoArgsConstructor +@Getter +@Setter +@Entity +@Table(name = "tabular_modifications") +public class TabularModificationsEntity extends ModificationEntity { + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) + @JoinColumn(name = "tabular_modification_id") + @OrderColumn(name = "insert_position") + private List properties; + + private String csvFilename; + + @Enumerated(EnumType.STRING) + private ModificationType modificationType; + + @OneToMany(cascade = CascadeType.ALL) + @OrderColumn + private List modifications; + + public TabularModificationsEntity(@NonNull TabularModificationInfos tabularModificationInfos) { + super(tabularModificationInfos); + assignModificationAttributes(tabularModificationInfos); + } + + public TabularModificationsEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) { + super(tabularModificationInfos); + assignModificationAttributes(tabularModificationInfos); + } + + public TabularModificationsEntity(@NonNull TabularCreationInfos tabularCreationInfos) { + super(tabularCreationInfos); + assignCreationAttributes(tabularCreationInfos); + } + + @Override + public void update(ModificationInfos modificationInfos) { + super.update(modificationInfos); + if (modificationInfos.getType() == ModificationType.TABULAR_CREATION) { + assignCreationAttributes((TabularCreationInfos) modificationInfos); + } else { + assignModificationAttributes((TabularModificationInfos) modificationInfos); + } + } + + @Override + public TabularBaseInfos toModificationInfos() { + //throw new UnsupportedOperationException("DTO from tabular entity is build with optimized loadTabularModification()"); + // TODO DBR: should have no IF with a single DTO + if (modificationType == ModificationType.TABULAR_CREATION) { + List creationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); + return TabularCreationInfos.builder() + .date(getDate()) + .uuid(getId()) + .stashed(getStashed()) + .activated(getActivated()) + .creationType(modificationType) + .creations(creationsInfos) + .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(getCsvFilename()) + .build(); + } else { + List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); + return TabularModificationInfos.builder() + .date(getDate()) + .uuid(getId()) + .stashed(getStashed()) + .activated(getActivated()) + .modificationType(modificationType) + .modifications(modificationsInfos) + .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(getCsvFilename()) + .build(); + } + } + + // TODO DBR: should have a single assign function with a single DTO + private void assignCommonAttributes(TabularBaseInfos tabularBaseInfos) { + List newProperties = tabularBaseInfos.getProperties() == null ? null : + tabularBaseInfos.getProperties().stream() + .map(TabularPropertyEntity::new) + .toList(); + if (this.properties != null) { + this.properties.clear(); + if (newProperties != null) { + this.properties.addAll(newProperties); + } + } else { + this.properties = newProperties; + } + this.csvFilename = tabularBaseInfos.getCsvFilename(); + } + + private void assignModificationAttributes(TabularModificationInfos tabularModificationInfos) { + assignCommonAttributes(tabularModificationInfos); + modificationType = tabularModificationInfos.getModificationType(); + if (modifications == null) { + modifications = tabularModificationInfos.getModifications().stream() + .map(ModificationEntity::fromDTO) + .collect(Collectors.toList()); + } else { + modifications.clear(); + modifications.addAll(tabularModificationInfos.getModifications().stream() + .map(ModificationEntity::fromDTO) + .toList()); + } + } + + private void assignCreationAttributes(TabularCreationInfos tabularCreationInfos) { + assignCommonAttributes(tabularCreationInfos); + modificationType = tabularCreationInfos.getCreationType(); + if (modifications == null) { + modifications = tabularCreationInfos.getCreations().stream() + .map(ModificationEntity::fromDTO) + .toList(); + } else { + modifications.clear(); + modifications.addAll(tabularCreationInfos.getCreations().stream() + .map(ModificationEntity::fromDTO) + .toList()); + } + } +} diff --git a/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java index 230fdc167..315d8f395 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/GeneratorCreationRepository.java @@ -34,20 +34,4 @@ public interface GeneratorCreationRepository extends JpaRepository subModificationIdsPart); - - @Modifying - @Query(value = "BEGIN;" + - "DELETE FROM tabular_creation_creations WHERE tabular_creation_entity_id = ?1 ;" + - "DELETE FROM modification WHERE id IN ?2 ;" + - "COMMIT;", nativeQuery = true) - // This function is generic and can work on any creation - void deleteTabularCreationCreations(UUID tabularModificationId, List subModificationIds); - - @Modifying - @Query(value = "BEGIN;" + - "DELETE FROM tabular_creation WHERE id = ?1 ;" + - "DELETE FROM modification WHERE id = ?1 ;" + - "COMMIT;", nativeQuery = true) - // This function is generic and can work on any creation - void deleteTabularCreationItself(UUID tabularModificationId); } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java index a0cac072f..0aa459ae1 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/LineModificationRepository.java @@ -42,17 +42,17 @@ public interface LineModificationRepository extends JpaRepository subModificationIds); @Modifying @Query(value = "BEGIN;" + - "DELETE FROM tabular_modification WHERE id = ?1 ;" + + "DELETE FROM tabular_modifications WHERE id = ?1 ;" + "DELETE FROM modification WHERE id = ?1 ;" + "COMMIT;", nativeQuery = true) - // This function is generic and can work on any modification + // This function is generic and can work on any tabular modification/creation void deleteTabularModificationItself(UUID tabularModificationId); } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java index 93e97849f..6ec7ec599 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/ModificationRepository.java @@ -49,18 +49,12 @@ public interface ModificationRepository extends JpaRepository findAllByIdInReverse(List uuids); - @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modification_modifications WHERE tabular_modification_entity_id = :uuid", nativeQuery = true) + @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modifications_modifications WHERE tabular_modifications_entity_id = :uuid", nativeQuery = true) List findSubModificationIdsByTabularModificationId(UUID uuid); - @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modification_modifications WHERE tabular_modification_entity_id = :uuid ORDER BY modifications_order", nativeQuery = true) + @Query(value = "SELECT cast(modifications_id AS VARCHAR) FROM tabular_modifications_modifications WHERE tabular_modifications_entity_id = :uuid ORDER BY modifications_order", nativeQuery = true) List findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(UUID uuid); - @Query(value = "SELECT cast(creations_id AS VARCHAR) FROM tabular_creation_creations WHERE tabular_creation_entity_id = :uuid", nativeQuery = true) - List findSubModificationIdsByTabularCreationId(UUID uuid); - - @Query(value = "SELECT cast(creations_id AS VARCHAR) FROM tabular_creation_creations WHERE tabular_creation_entity_id = :uuid ORDER BY creations_order", nativeQuery = true) - List findSubModificationIdsByTabularCreationIdOrderByModificationsOrder(UUID uuid); - @Query(value = "SELECT cast(modification_id AS VARCHAR) FROM composite_modification_sub_modifications WHERE id = :uuid ORDER BY modifications_order", nativeQuery = true) List findModificationIdsByCompositeModificationId(UUID uuid); diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index 14c310fb0..32b4aee2a 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -16,9 +16,7 @@ import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.*; import org.gridsuite.modification.server.entities.equipment.modification.EquipmentModificationEntity; -import org.gridsuite.modification.server.entities.tabular.TabularBaseEntity; -import org.gridsuite.modification.server.entities.tabular.TabularCreationEntity; -import org.gridsuite.modification.server.entities.tabular.TabularModificationEntity; +import org.gridsuite.modification.server.entities.tabular.TabularModificationsEntity; import org.gridsuite.modification.server.entities.tabular.TabularPropertyEntity; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @@ -314,6 +312,24 @@ private List reorderModifications(List loadTabularModificationSubEntities(List subModificationsUuids, ModificationType modificationType) { List modifications; switch (modificationType) { + case GENERATOR_CREATION -> { + // load generator modifications with curvePoints + modifications = generatorCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList(); + // load properties too, it uses hibernate first-level cache to fill them up directly in modifications + generatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); + } + case BATTERY_CREATION -> { + // load battery modifications with curvePoints + modifications = batteryCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList(); + // load properties too, it uses hibernate first-level cache to fill them up directly in modifications + batteryCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); + } + case LOAD_CREATION -> + // load Load modifications with properties + modifications = loadCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); + case SHUNT_COMPENSATOR_CREATION -> + // load MCS modifications with properties + modifications = shuntCompensatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); case GENERATOR_MODIFICATION -> { // load generator modifications with curvePoints modifications = generatorModificationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList(); @@ -356,87 +372,49 @@ private List loadTabularModificationSubEn return modifications; } - private TabularModificationInfos loadTabularModification(ModificationEntity modificationEntity) { - TabularModificationEntity tabularModificationEntity = (TabularModificationEntity) modificationEntity; + private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabularEntity) { // fetch embedded modifications uuids only - List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(modificationEntity.getId()); + List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularModificationIdOrderByModificationsOrder(tabularEntity.getId()); // optimized entities full loading, per type - List modifications = loadTabularModificationSubEntities(subModificationsUuids, tabularModificationEntity.getModificationType()); + List modifications = loadTabularModificationSubEntities(subModificationsUuids, tabularEntity.getModificationType()); // re-order the list of entities based on the ordered list of IDs List orderedModifications = reorderModifications(modifications, subModificationsUuids); - // then build DTOs - var builder = TabularModificationInfos.builder(); - if (tabularModificationEntity.getType().equals(ModificationType.LIMIT_SETS_TABULAR_MODIFICATION.name())) { - builder = LimitSetsTabularModificationInfos.builder(); - } - return builder.uuid(tabularModificationEntity.getId()) - .date(tabularModificationEntity.getDate()) - .stashed(tabularModificationEntity.getStashed()) - .activated(tabularModificationEntity.getActivated()) - .modificationType(tabularModificationEntity.getModificationType()) - .modifications(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) - .properties(CollectionUtils.isEmpty(tabularModificationEntity.getProperties()) ? null : tabularModificationEntity.getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(tabularModificationEntity.getCsvFilename()) - .build(); - } - - private List loadTabularCreationSubEntities(List subModificationsUuids, ModificationType modificationType) { - List modifications; - switch (modificationType) { - case GENERATOR_CREATION -> { - // load generator modifications with curvePoints - modifications = generatorCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList(); - // load properties too, it uses hibernate first-level cache to fill them up directly in modifications - generatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); - } - case BATTERY_CREATION -> { - // load battery modifications with curvePoints - modifications = batteryCreationRepository.findAllReactiveCapabilityCurvePointsByIdIn(subModificationsUuids).stream().toList(); - // load properties too, it uses hibernate first-level cache to fill them up directly in modifications - batteryCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); + // then build DTO TODO DBR should have a single DTO + if (ModificationType.TABULAR_CREATION.name().equalsIgnoreCase(tabularEntity.getType())) { + return TabularCreationInfos.builder() + .uuid(tabularEntity.getId()) + .date(tabularEntity.getDate()) + .stashed(tabularEntity.getStashed()) + .activated(tabularEntity.getActivated()) + .creationType(tabularEntity.getModificationType()) + .creations(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) + .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(tabularEntity.getCsvFilename()) + .build(); + } else { + var builder = TabularModificationInfos.builder(); + if (tabularEntity.getType().equals(ModificationType.LIMIT_SETS_TABULAR_MODIFICATION.name())) { + builder = LimitSetsTabularModificationInfos.builder(); } - case LOAD_CREATION -> - // load Load modifications with properties - modifications = loadCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); - case SHUNT_COMPENSATOR_CREATION -> - // load MCS modifications with properties - modifications = shuntCompensatorCreationRepository.findAllPropertiesByIdIn(subModificationsUuids); - default -> - throw new UnsupportedOperationException(String.format("No sub-modifications loading for creation type: %s", modificationType)); + return builder.uuid(tabularEntity.getId()) + .date(tabularEntity.getDate()) + .stashed(tabularEntity.getStashed()) + .activated(tabularEntity.getActivated()) + .modificationType(tabularEntity.getModificationType()) + .modifications(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) + .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(tabularEntity.getCsvFilename()) + .build(); } - return modifications; - } - - private TabularCreationInfos loadTabularCreation(ModificationEntity modificationEntity) { - TabularCreationEntity tabularCreationEntity = (TabularCreationEntity) modificationEntity; - // fetch embedded modifications uuids only - List subModificationsUuids = modificationRepository.findSubModificationIdsByTabularCreationIdOrderByModificationsOrder(modificationEntity.getId()); - // optimized entities full loading, per type - List modifications = loadTabularCreationSubEntities(subModificationsUuids, tabularCreationEntity.getCreationType()); - // re-order the list of entities based on the ordered list of IDs - List orderedModifications = reorderModifications(modifications, subModificationsUuids); - // then build DTOs - return TabularCreationInfos.builder() - .uuid(tabularCreationEntity.getId()) - .date(tabularCreationEntity.getDate()) - .stashed(tabularCreationEntity.getStashed()) - .activated(tabularCreationEntity.getActivated()) - .creationType(tabularCreationEntity.getCreationType()) - .creations(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) - .properties(CollectionUtils.isEmpty(tabularCreationEntity.getProperties()) ? null : tabularCreationEntity.getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(tabularCreationEntity.getCsvFilename()) - .build(); } public ModificationInfos getModificationInfos(ModificationEntity modificationEntity) { - if (modificationEntity instanceof TabularModificationEntity) { - return loadTabularModification(modificationEntity); - } else if (modificationEntity instanceof TabularCreationEntity) { - return loadTabularCreation(modificationEntity); + if (modificationEntity instanceof TabularModificationsEntity tabularEntity) { + return loadTabularModification(tabularEntity); } return modificationEntity.toModificationInfos(); } @@ -630,14 +608,12 @@ public void updateModification(@NonNull UUID modificationUuid, @NonNull Modifica // Tabular modifications optimization: // Before updating/adding with new sub-modifications, we delete and clear existing sub-modifications manually // to avoid JPA to make a huge query to find them (no need to read them, they are going to be replaced). - if (modificationInfos.getType() == ModificationType.TABULAR_MODIFICATION || modificationInfos.getType() == ModificationType.LIMIT_SETS_TABULAR_MODIFICATION) { - TabularModificationEntity tabularModificationEntity = (TabularModificationEntity) entity; - deleteTabularModificationSubModifications(tabularModificationEntity); - tabularModificationEntity.update(modificationInfos); - } else if (modificationInfos.getType() == ModificationType.TABULAR_CREATION) { - TabularCreationEntity tabularCreationEntity = (TabularCreationEntity) entity; - deleteTabularCreationSubModifications(tabularCreationEntity); - tabularCreationEntity.update(modificationInfos); + if (modificationInfos.getType() == ModificationType.TABULAR_CREATION + || modificationInfos.getType() == ModificationType.TABULAR_MODIFICATION + || modificationInfos.getType() == ModificationType.LIMIT_SETS_TABULAR_MODIFICATION) { + TabularModificationsEntity tabularEntity = (TabularModificationsEntity) entity; + deleteTabularModificationSubModifications(tabularEntity); + tabularEntity.update(modificationInfos); } else { entity.update(modificationInfos); } @@ -681,27 +657,17 @@ private void deleteModifications(List modificationEntities) // efficient so no need to dig deeper about that for now. // delete tabular modifications/creations - List tabularModificationsToDelete = modificationEntities.stream().filter(TabularModificationEntity.class::isInstance).map(TabularModificationEntity.class::cast).toList(); + List tabularModificationsToDelete = modificationEntities.stream().filter(TabularModificationsEntity.class::isInstance).map(TabularModificationsEntity.class::cast).toList(); tabularModificationsToDelete.forEach(this::deleteTabularModification); - List tabularCreationsToDelete = modificationEntities.stream().filter(TabularCreationEntity.class::isInstance).map(TabularCreationEntity.class::cast).toList(); - tabularCreationsToDelete.forEach(this::deleteTabularCreation); // delete other modification types with "in" requests - List uuidsToDelete = modificationEntities.stream().filter(Predicate.not(TabularBaseEntity.class::isInstance)).map(ModificationEntity::getId).toList(); + List uuidsToDelete = modificationEntities.stream().filter(Predicate.not(TabularModificationsEntity.class::isInstance)).map(ModificationEntity::getId).toList(); if (!uuidsToDelete.isEmpty()) { modificationApplicationInfosService.deleteAllByModificationIds(uuidsToDelete); modificationRepository.deleteAllByIdIn(uuidsToDelete); } } - private void deleteTabularCreation(TabularCreationEntity tabularCreationEntity) { - deleteTabular(tabularCreationEntity.getCreationType(), tabularCreationEntity); - } - - private void deleteTabularModification(TabularModificationEntity tabularModificationEntity) { - deleteTabular(tabularModificationEntity.getModificationType(), tabularModificationEntity); - } - private void deleteSomeLineTabularSubModifications(List subModificationsIds) { List opLimitsGroupsIds = modificationRepository.findLineModificationOpLimitsGroupsIdsByBranchIds(subModificationsIds); List currentLimitsIds = modificationRepository.findCurrentLimitsIdsByOpLimitsGroupsIds(opLimitsGroupsIds); @@ -745,46 +711,27 @@ private void deleteAllTabularSubModificationsUsingPartition(ModificationType tab } } - private void deleteTabular(ModificationType tabularModificationType, ModificationEntity modificationEntity) { - UUID modificationUuid = modificationEntity.getId(); + private void deleteTabularModification(TabularModificationsEntity tabularEntity) { + UUID modificationUuid = tabularEntity.getId(); List modificationToCleanUuids = new ArrayList<>(); modificationToCleanUuids.add(modificationUuid); - List subModificationsIds = modificationEntity instanceof TabularModificationEntity ? - modificationRepository.findSubModificationIdsByTabularModificationId(modificationUuid) : - modificationRepository.findSubModificationIdsByTabularCreationId(modificationUuid); + List subModificationsIds = modificationRepository.findSubModificationIdsByTabularModificationId(modificationUuid); modificationToCleanUuids.addAll(subModificationsIds); - modificationApplicationInfosService.deleteAllByModificationIds(modificationToCleanUuids); tabularPropertyRepository.deleteTabularProperties(modificationUuid); - deleteAllTabularSubModificationsUsingPartition(tabularModificationType, subModificationsIds); - if (modificationEntity instanceof TabularModificationEntity) { - // line functions works for any modification case - lineModificationRepository.deleteTabularModificationModifications(modificationUuid, subModificationsIds); - lineModificationRepository.deleteTabularModificationItself(modificationUuid); - } else { - // generator functions works for any creation case - generatorCreationRepository.deleteTabularCreationCreations(modificationUuid, subModificationsIds); - generatorCreationRepository.deleteTabularCreationItself(modificationUuid); - } - } - - private void deleteTabularCreationSubModifications(TabularCreationEntity tabularCreationEntity) { - UUID modificationId = tabularCreationEntity.getId(); - List subModificationsIds = modificationRepository.findSubModificationIdsByTabularCreationId(modificationId); - tabularCreationEntity.setCreations(null); - modificationApplicationInfosService.deleteAllByModificationIds(subModificationsIds); - deleteAllTabularSubModificationsUsingPartition(tabularCreationEntity.getCreationType(), subModificationsIds); - // generator function works for any creation case - generatorCreationRepository.deleteTabularCreationCreations(modificationId, subModificationsIds); + deleteAllTabularSubModificationsUsingPartition(tabularEntity.getModificationType(), subModificationsIds); + // line functions work for any type + lineModificationRepository.deleteTabularModificationModifications(modificationUuid, subModificationsIds); + lineModificationRepository.deleteTabularModificationItself(modificationUuid); } - private void deleteTabularModificationSubModifications(TabularModificationEntity tabularModificationEntity) { + private void deleteTabularModificationSubModifications(TabularModificationsEntity tabularModificationEntity) { UUID modificationId = tabularModificationEntity.getId(); List subModificationsIds = modificationRepository.findSubModificationIdsByTabularModificationId(modificationId); tabularModificationEntity.setModifications(null); modificationApplicationInfosService.deleteAllByModificationIds(subModificationsIds); deleteAllTabularSubModificationsUsingPartition(tabularModificationEntity.getModificationType(), subModificationsIds); - // line function works for any modification case + // line function works for any type lineModificationRepository.deleteTabularModificationModifications(modificationId, subModificationsIds); } } diff --git a/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml new file mode 100644 index 000000000..73e86e60b --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250930T101841Z.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml new file mode 100644 index 000000000..88ccb093b --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql b/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql new file mode 100644 index 000000000..b1d95a7fc --- /dev/null +++ b/src/main/resources/db/changelog/changesets/migrationTabularModifications_20250930T132326Z.sql @@ -0,0 +1,27 @@ +-- tabular_modification + tabular_creation -> tabular_modifications +insert into tabular_modifications (id, modification_type, csv_filename) +select + id, + modification_type, + csv_filename +from tabular_modification; +insert into tabular_modifications (id, modification_type, csv_filename) +select + id, + creation_type, + csv_filename +from tabular_creation; + +-- tabular_modification_modifications + tabular_creation_creations -> tabular_modifications_modifications +insert into tabular_modifications_modifications (tabular_modifications_entity_id, modifications_id, modifications_order) +select + tabular_modification_entity_id, + modifications_id, + modifications_order +from tabular_modification_modifications; +insert into tabular_modifications_modifications (tabular_modifications_entity_id, modifications_id, modifications_order) +select + tabular_creation_entity_id, + creations_id, + creations_order +from tabular_creation_creations; \ No newline at end of file diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index bf7990ffa..140500f8a 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -411,3 +411,9 @@ databaseChangeLog: - include: file: changesets/changelog_20250921T151431Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20250930T101841Z.xml + relativeToChangelogFile: true + - include: + file: changesets/changelog_20250930T132326Z.xml + relativeToChangelogFile: true \ No newline at end of file From 2d087557ff9a74c43ed620e0961d2f4e4d365844 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 1 Oct 2025 10:53:49 +0200 Subject: [PATCH 02/11] use tabular DTO package Signed-off-by: David BRAQUART --- .../modification/server/entities/EntityRegistry.java | 1 + .../server/entities/tabular/TabularModificationsEntity.java | 5 +---- .../server/entities/tabular/TabularPropertyEntity.java | 2 +- .../server/repositories/NetworkModificationRepository.java | 1 + .../tabularcreations/TabularBatteryCreationsTest.java | 4 ++-- 5 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java index b72ea25fe..ae45b7142 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java +++ b/src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java @@ -10,6 +10,7 @@ import java.util.Map; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.entities.equipment.creation.*; import org.gridsuite.modification.server.entities.equipment.deletion.*; import org.gridsuite.modification.server.entities.equipment.modification.*; diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java index 7ad49d6be..9ec0d31da 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java @@ -12,11 +12,8 @@ import lombok.NonNull; import lombok.Setter; import org.gridsuite.modification.ModificationType; -import org.gridsuite.modification.dto.LimitSetsTabularModificationInfos; import org.gridsuite.modification.dto.ModificationInfos; -import org.gridsuite.modification.dto.TabularBaseInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; -import org.gridsuite.modification.dto.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.entities.ModificationEntity; import org.springframework.util.CollectionUtils; diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java index 397d830a2..db7da6912 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularPropertyEntity.java @@ -18,7 +18,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; -import org.gridsuite.modification.dto.TabularPropertyInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import java.util.UUID; diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index 32b4aee2a..d63a81d77 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -12,6 +12,7 @@ import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.dto.ModificationMetadata; import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.*; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java index 0c54ec7f3..5869c272b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java @@ -13,8 +13,8 @@ import org.gridsuite.modification.dto.BatteryCreationInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ReactiveCapabilityCurvePointsInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; -import org.gridsuite.modification.dto.TabularPropertyInfos; +import org.gridsuite.modification.dto.tabular.TabularCreationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.ModificationCreation; import org.gridsuite.modification.server.utils.NetworkCreation; From cd92753ed8bf5a84e6c0d22f2b35256ea5350e31 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 1 Oct 2025 18:27:46 +0200 Subject: [PATCH 03/11] simplify DTOs Signed-off-by: David BRAQUART --- .../tabular/TabularModificationsEntity.java | 93 ++++++------------- .../NetworkModificationRepository.java | 47 ++++------ .../TabularBatteryCreationsTest.java | 8 +- .../TabularGeneratorCreationsTest.java | 27 +++--- .../TabularLoadCreationsTest.java | 11 +-- .../TabularShuntCompensatorCreationsTest.java | 11 +-- .../TabularBatteryModificationsTest.java | 2 + .../TabularGeneratorModificationsTest.java | 2 + .../TabularLineModificationsTest.java | 2 + .../TabularLoadModificationsTest.java | 2 + ...ularShuntCompensatorModificationsTest.java | 4 +- .../TabularSubstationModificationsTest.java | 2 + ...oWindingsTransformerModificationsTest.java | 2 + .../TabularVoltageLevelModificationsTest.java | 2 + .../service/ModificationRepositoryTest.java | 1 + 15 files changed, 90 insertions(+), 126 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java index 9ec0d31da..be5774f76 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java @@ -46,66 +46,51 @@ public class TabularModificationsEntity extends ModificationEntity { public TabularModificationsEntity(@NonNull TabularModificationInfos tabularModificationInfos) { super(tabularModificationInfos); - assignModificationAttributes(tabularModificationInfos); + assignAttributes(tabularModificationInfos); } public TabularModificationsEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) { super(tabularModificationInfos); - assignModificationAttributes(tabularModificationInfos); + assignAttributes(tabularModificationInfos); } public TabularModificationsEntity(@NonNull TabularCreationInfos tabularCreationInfos) { super(tabularCreationInfos); - assignCreationAttributes(tabularCreationInfos); + assignAttributes(tabularCreationInfos); } @Override public void update(ModificationInfos modificationInfos) { super.update(modificationInfos); - if (modificationInfos.getType() == ModificationType.TABULAR_CREATION) { - assignCreationAttributes((TabularCreationInfos) modificationInfos); - } else { - assignModificationAttributes((TabularModificationInfos) modificationInfos); - } + assignAttributes((TabularBaseInfos) modificationInfos); } @Override public TabularBaseInfos toModificationInfos() { - //throw new UnsupportedOperationException("DTO from tabular entity is build with optimized loadTabularModification()"); - // TODO DBR: should have no IF with a single DTO - if (modificationType == ModificationType.TABULAR_CREATION) { - List creationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); - return TabularCreationInfos.builder() - .date(getDate()) - .uuid(getId()) - .stashed(getStashed()) - .activated(getActivated()) - .creationType(modificationType) - .creations(creationsInfos) - .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(getCsvFilename()) - .build(); - } else { - List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); - return TabularModificationInfos.builder() - .date(getDate()) - .uuid(getId()) - .stashed(getStashed()) - .activated(getActivated()) - .modificationType(modificationType) - .modifications(modificationsInfos) - .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(getCsvFilename()) - .build(); - } + var builder = switch (ModificationType.valueOf(getType())) { + case ModificationType.TABULAR_CREATION -> TabularCreationInfos.builder(); + case ModificationType.LIMIT_SETS_TABULAR_MODIFICATION -> LimitSetsTabularModificationInfos.builder(); + default -> TabularModificationInfos.builder(); + }; + List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); + return builder + .date(getDate()) + .uuid(getId()) + .stashed(getStashed()) + .activated(getActivated()) + .modificationType(modificationType) + .modifications(modificationsInfos) + .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(getCsvFilename()) + .build(); } - // TODO DBR: should have a single assign function with a single DTO - private void assignCommonAttributes(TabularBaseInfos tabularBaseInfos) { + private void assignAttributes(TabularBaseInfos tabularBaseInfos) { + this.csvFilename = tabularBaseInfos.getCsvFilename(); + modificationType = tabularBaseInfos.getModificationType(); + // properties list List newProperties = tabularBaseInfos.getProperties() == null ? null : tabularBaseInfos.getProperties().stream() .map(TabularPropertyEntity::new) @@ -118,34 +103,14 @@ private void assignCommonAttributes(TabularBaseInfos tabularBaseInfos) { } else { this.properties = newProperties; } - this.csvFilename = tabularBaseInfos.getCsvFilename(); - } - - private void assignModificationAttributes(TabularModificationInfos tabularModificationInfos) { - assignCommonAttributes(tabularModificationInfos); - modificationType = tabularModificationInfos.getModificationType(); + // modifications list if (modifications == null) { - modifications = tabularModificationInfos.getModifications().stream() + modifications = tabularBaseInfos.getModifications().stream() .map(ModificationEntity::fromDTO) .collect(Collectors.toList()); } else { modifications.clear(); - modifications.addAll(tabularModificationInfos.getModifications().stream() - .map(ModificationEntity::fromDTO) - .toList()); - } - } - - private void assignCreationAttributes(TabularCreationInfos tabularCreationInfos) { - assignCommonAttributes(tabularCreationInfos); - modificationType = tabularCreationInfos.getCreationType(); - if (modifications == null) { - modifications = tabularCreationInfos.getCreations().stream() - .map(ModificationEntity::fromDTO) - .toList(); - } else { - modifications.clear(); - modifications.addAll(tabularCreationInfos.getCreations().stream() + modifications.addAll(tabularBaseInfos.getModifications().stream() .map(ModificationEntity::fromDTO) .toList()); } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index d63a81d77..2dac0a66d 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -380,37 +380,22 @@ private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabu List modifications = loadTabularModificationSubEntities(subModificationsUuids, tabularEntity.getModificationType()); // re-order the list of entities based on the ordered list of IDs List orderedModifications = reorderModifications(modifications, subModificationsUuids); - // then build DTO TODO DBR should have a single DTO - if (ModificationType.TABULAR_CREATION.name().equalsIgnoreCase(tabularEntity.getType())) { - return TabularCreationInfos.builder() - .uuid(tabularEntity.getId()) - .date(tabularEntity.getDate()) - .stashed(tabularEntity.getStashed()) - .activated(tabularEntity.getActivated()) - .creationType(tabularEntity.getModificationType()) - .creations(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) - .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(tabularEntity.getCsvFilename()) - .build(); - } else { - var builder = TabularModificationInfos.builder(); - if (tabularEntity.getType().equals(ModificationType.LIMIT_SETS_TABULAR_MODIFICATION.name())) { - builder = LimitSetsTabularModificationInfos.builder(); - } - return builder.uuid(tabularEntity.getId()) - .date(tabularEntity.getDate()) - .stashed(tabularEntity.getStashed()) - .activated(tabularEntity.getActivated()) - .modificationType(tabularEntity.getModificationType()) - .modifications(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) - .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(tabularEntity.getCsvFilename()) - .build(); - } + var builder = switch (ModificationType.valueOf(tabularEntity.getType())) { + case ModificationType.TABULAR_CREATION -> TabularCreationInfos.builder(); + case ModificationType.LIMIT_SETS_TABULAR_MODIFICATION -> LimitSetsTabularModificationInfos.builder(); + default -> TabularModificationInfos.builder(); + }; + return builder.uuid(tabularEntity.getId()) + .date(tabularEntity.getDate()) + .stashed(tabularEntity.getStashed()) + .activated(tabularEntity.getActivated()) + .modificationType(tabularEntity.getModificationType()) + .modifications(orderedModifications.stream().map(ModificationEntity::toModificationInfos).toList()) + .properties(CollectionUtils.isEmpty(tabularEntity.getProperties()) ? null : tabularEntity.getProperties().stream() + .map(TabularPropertyEntity::toInfos) + .toList()) + .csvFilename(tabularEntity.getCsvFilename()) + .build(); } public ModificationInfos getModificationInfos(ModificationEntity modificationEntity) { diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java index 5869c272b..5eddfb415 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularBatteryCreationsTest.java @@ -58,8 +58,8 @@ protected ModificationInfos buildModification() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.BATTERY_CREATION) - .creations(creations) + .modificationType(ModificationType.BATTERY_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build())) .stashed(false) .build(); @@ -75,8 +75,8 @@ protected ModificationInfos buildModificationUpdate() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.BATTERY_CREATION) - .creations(creations) + .modificationType(ModificationType.BATTERY_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build())) .stashed(false) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java index 0b0608824..b37d2c944 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java @@ -17,9 +17,8 @@ import org.gridsuite.modification.dto.GeneratorCreationInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.SubstationCreationInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.dto.NetworkModificationsResult; -import org.gridsuite.modification.dto.TabularPropertyInfos; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; @@ -111,8 +110,8 @@ protected ModificationInfos buildModification() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.GENERATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.GENERATOR_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build())) .stashed(false) .build(); @@ -145,8 +144,8 @@ protected ModificationInfos buildModificationUpdate() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.GENERATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.GENERATOR_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build())) .stashed(false) .build(); @@ -202,8 +201,8 @@ void testCheckSqlRequestsCount() throws Exception { .build() ); TabularCreationInfos creationInfos = TabularCreationInfos.builder() - .creationType(ModificationType.GENERATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.GENERATOR_CREATION) + .modifications(creations) .build(); modificationUuid = saveModification(creationInfos); reset(); @@ -249,8 +248,8 @@ void testAllModificationsHaveSucceeded() throws Exception { ); ModificationInfos creationInfos = TabularCreationInfos.builder() - .creationType(ModificationType.GENERATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.GENERATOR_CREATION) + .modifications(creations) .build(); String tabularCreationJson = getJsonBody(creationInfos, null); @@ -298,8 +297,8 @@ void testAllModificationsHaveFailed() throws Exception { .build() ); ModificationInfos creationInfos = TabularCreationInfos.builder() - .creationType(ModificationType.GENERATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.GENERATOR_CREATION) + .modifications(creations) .build(); String tabularCreationJson = getJsonBody(creationInfos, null); @@ -335,8 +334,8 @@ void testUnsupportedTabularCreationType() throws Exception { .build() ); ModificationInfos creationInfos = TabularCreationInfos.builder() - .creationType(ModificationType.SUBSTATION_CREATION) - .creations(creations) + .modificationType(ModificationType.SUBSTATION_CREATION) + .modifications(creations) .build(); String tabularCreationJson = getJsonBody(creationInfos, null); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java index 0de39c63d..adb793725 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularLoadCreationsTest.java @@ -14,8 +14,7 @@ import org.gridsuite.modification.dto.FreePropertyInfos; import org.gridsuite.modification.dto.LoadCreationInfos; import org.gridsuite.modification.dto.ModificationInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; -import org.gridsuite.modification.dto.TabularPropertyInfos; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; @@ -57,8 +56,8 @@ protected ModificationInfos buildModification() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.LOAD_CREATION) - .creations(creations) + .modificationType(ModificationType.LOAD_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build())) .stashed(false) .build(); @@ -76,8 +75,8 @@ protected ModificationInfos buildModificationUpdate() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.LOAD_CREATION) - .creations(creations) + .modificationType(ModificationType.LOAD_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build())) .stashed(false) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java index c6d1c3222..73d84034b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularShuntCompensatorCreationsTest.java @@ -13,8 +13,7 @@ import org.gridsuite.modification.dto.FreePropertyInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.ShuntCompensatorCreationInfos; -import org.gridsuite.modification.dto.TabularCreationInfos; -import org.gridsuite.modification.dto.TabularPropertyInfos; +import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; @@ -60,8 +59,8 @@ protected ModificationInfos buildModification() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.SHUNT_COMPENSATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.SHUNT_COMPENSATOR_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(true).build())) .stashed(false) .build(); @@ -81,8 +80,8 @@ protected ModificationInfos buildModificationUpdate() { .build() ); return TabularCreationInfos.builder() - .creationType(ModificationType.SHUNT_COMPENSATOR_CREATION) - .creations(creations) + .modificationType(ModificationType.SHUNT_COMPENSATOR_CREATION) + .modifications(creations) .properties(List.of(TabularPropertyInfos.builder().name("P1").predefined(true).selected(false).build())) .stashed(false) .build(); diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java index d4fd67fd4..2a8c50582 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularBatteryModificationsTest.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java index ceb79c2a8..edbdcd7bf 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java @@ -12,6 +12,8 @@ import com.powsybl.iidm.network.extensions.ConnectablePosition; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.repositories.ModificationRepository; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java index 02e0c720a..4fde032d3 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLineModificationsTest.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.repositories.ModificationRepository; import org.gridsuite.modification.server.utils.ApiUtils; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java index 2e665eaee..bdc13a86e 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularLoadModificationsTest.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java index fff9e845e..445a34569 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java @@ -15,8 +15,10 @@ import com.powsybl.iidm.network.ShuntCompensatorModelType; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; -import org.gridsuite.modification.modifications.TabularModification; +import org.gridsuite.modification.modifications.tabular.TabularModification; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java index cea05a375..19782c815 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularSubstationModificationsTest.java @@ -11,6 +11,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java index 7014c689c..22d234df0 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.repositories.ModificationRepository; import org.gridsuite.modification.server.utils.ApiUtils; diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java index 13ecddf44..b290dbd72 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularVoltageLevelModificationsTest.java @@ -10,6 +10,8 @@ import com.powsybl.iidm.network.Network; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; +import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; diff --git a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java index 4a3ddb6be..9ec25805c 100644 --- a/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java +++ b/src/test/java/org/gridsuite/modification/server/service/ModificationRepositoryTest.java @@ -12,6 +12,7 @@ import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; +import org.gridsuite.modification.dto.tabular.TabularModificationInfos; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.entities.ModificationGroupEntity; import org.gridsuite.modification.server.entities.equipment.creation.VoltageLevelCreationEntity; From 4ec5887ef6055cac329bb8a0a2ff8e6d79f30b26 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 1 Oct 2025 18:43:20 +0200 Subject: [PATCH 04/11] fix TU Signed-off-by: David BRAQUART --- .../tabularcreations/TabularGeneratorCreationsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java index b37d2c944..ca7fb82f2 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java @@ -353,14 +353,14 @@ void testUnsupportedTabularCreationType() throws Exception { UnsupportedOperationException.class, () -> networkModificationRepository.getModifications(TEST_GROUP_ID, false, true) ); - assertEquals("No sub-modifications loading for creation type: SUBSTATION_CREATION", exception.getMessage()); + assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getMessage()); // try to get via id exception = assertThrows( UnsupportedOperationException.class, () -> networkModificationRepository.getModificationInfo(modifId) ); - assertEquals("No sub-modifications loading for creation type: SUBSTATION_CREATION", exception.getMessage()); + assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getMessage()); // try to update exception = assertThrows( From ba7f192aff9b861e264265377261f3ccc78e2d04 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Thu, 2 Oct 2025 16:04:32 +0200 Subject: [PATCH 05/11] little change Signed-off-by: David BRAQUART --- pom.xml | 2 +- .../entities/tabular/TabularModificationsEntity.java | 2 +- .../TabularShuntCompensatorModificationsTest.java | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index e4984c966..7d308f6dc 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ gridsuite org.gridsuite:network-modification-server - 0.38.0 + 0.39.0-SNAPSHOT 2.14.1 diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java index be5774f76..36ef44d3c 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java @@ -1,5 +1,5 @@ /* - Copyright (c) 2021, RTE (http://www.rte-france.com) + Copyright (c) 2025, RTE (http://www.rte-france.com) This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of the MPL was not distributed with this file, You can obtain one at http://mozilla.org/MPL/2.0/. diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java index 445a34569..bf1ddb29b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularShuntCompensatorModificationsTest.java @@ -132,13 +132,13 @@ void testCheckModificationConflict() { .withMessageTemplate("test") .build(); - tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); + tabularModification.specificCheck(shuntModification, network, reportNode); shuntModification.setShuntCompensatorType(AttributeModification.toAttributeModification(ShuntCompensatorType.CAPACITOR, OperationType.SET)); - tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); + tabularModification.specificCheck(shuntModification, network, reportNode); shuntModification.setMaxQAtNominalV(null); - tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); + tabularModification.specificCheck(shuntModification, network, reportNode); assertEquals(TypedValue.WARN_SEVERITY, reportNode.getChildren().get(0).getValues().get(ReportConstants.SEVERITY_KEY)); } @@ -167,7 +167,7 @@ void testCheckModificationNonLinear() { .withResourceBundles("i18n.reports") .withMessageTemplate("test") .build(); - tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); + tabularModification.specificCheck(shuntModification, network, reportNode); assertEquals(TypedValue.ERROR_SEVERITY, reportNode.getChildren().get(0).getValues().get(ReportConstants.SEVERITY_KEY)); @@ -197,7 +197,7 @@ void testCheckModificationOK() { .withMessageTemplate("test") .build(); - tabularModification.checkShuntCompensatorModification(network, shuntModification, reportNode); + tabularModification.specificCheck(shuntModification, network, reportNode); assertEquals(0, reportNode.getChildren().size()); } } From 969e00c4bf42a64d1b99f47cd38cea6dbd84b89c Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Mon, 6 Oct 2025 14:10:19 +0200 Subject: [PATCH 06/11] uncomment drop tables Signed-off-by: David BRAQUART --- .../db/changelog/changesets/changelog_20250930T132326Z.xml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml index 88ccb093b..dcbf5b3a4 100644 --- a/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml +++ b/src/main/resources/db/changelog/changesets/changelog_20250930T132326Z.xml @@ -25,8 +25,8 @@ - - + @@ -37,6 +37,5 @@ - - + From aea91295800c73015901e70b0903479693a317d8 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 8 Oct 2025 10:38:27 +0200 Subject: [PATCH 07/11] use optimized getDTO function for tabular Signed-off-by: David BRAQUART --- .../modifications/NetworkModificationApplicator.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java index 3d9a06003..809921e12 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java @@ -29,6 +29,7 @@ import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; +import org.gridsuite.modification.server.repositories.NetworkModificationRepository; import org.gridsuite.modification.server.service.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -63,6 +64,8 @@ public class NetworkModificationApplicator { private final NetworkModificationObserver networkModificationObserver; + private final NetworkModificationRepository networkModificationRepository; + @Value("${impacts.collection-threshold:50}") @Setter // TODO REMOVE when VoltageInitReportTest will no longer use NetworkModificationApplicator private Integer collectionThreshold; @@ -75,6 +78,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq ReportService reportService, FilterService filterService, LoadFlowService loadFlowService, NetworkModificationObserver networkModificationObserver, + NetworkModificationRepository networkModificationRepository, LargeNetworkModificationExecutionService largeNetworkModificationExecutionService) { this.networkStoreService = networkStoreService; this.equipmentInfosService = equipmentInfosService; @@ -83,6 +87,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq this.filterService = filterService; this.loadFlowService = loadFlowService; this.networkModificationObserver = networkModificationObserver; + this.networkModificationRepository = networkModificationRepository; this.largeNetworkModificationExecutionService = largeNetworkModificationExecutionService; } @@ -192,7 +197,7 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn .filter(ModificationEntity::getActivated) .map(m -> { listener.initModificationApplication(modificationGroupInfos.groupUuid(), m); - return apply(m.toModificationInfos(), listener.getNetwork(), reportNode); + return apply(networkModificationRepository.getModificationInfos(m), listener.getNetwork(), reportNode); }) .reduce(ApplicationStatus::max) .orElse(ApplicationStatus.ALL_OK); From e4d6bf4db7045afc6136d93be8c07ee6308b12e7 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 8 Oct 2025 13:44:00 +0200 Subject: [PATCH 08/11] fix test compile error Signed-off-by: David BRAQUART --- .../NetworkModificationApplicator.java | 2 - .../server/VoltageInitReportTest.java | 83 ++++++++++--------- 2 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java index 809921e12..f78c27c6e 100644 --- a/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java +++ b/src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java @@ -17,7 +17,6 @@ import com.powsybl.network.store.client.NetworkStoreService; import com.powsybl.network.store.client.PreloadingStrategy; import lombok.Getter; -import lombok.Setter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.modifications.AbstractModification; @@ -67,7 +66,6 @@ public class NetworkModificationApplicator { private final NetworkModificationRepository networkModificationRepository; @Value("${impacts.collection-threshold:50}") - @Setter // TODO REMOVE when VoltageInitReportTest will no longer use NetworkModificationApplicator private Integer collectionThreshold; @Value("${naming-strategy:Default}") diff --git a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java index df946fac5..c80ea253e 100644 --- a/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java +++ b/src/test/java/org/gridsuite/modification/server/VoltageInitReportTest.java @@ -13,14 +13,6 @@ import com.powsybl.commons.report.ReportNodeJsonModule; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.ThreeSides; -import com.powsybl.network.store.client.NetworkStoreService; -import com.powsybl.network.store.client.NetworkStoreServicePublic; -import com.powsybl.network.store.client.PreloadingStrategy; -import com.powsybl.network.store.client.RestClient; -import com.powsybl.network.store.iidm.impl.CachedNetworkStoreClient; -import com.powsybl.network.store.iidm.impl.OfflineNetworkStoreClient; -import io.micrometer.core.instrument.simple.SimpleMeterRegistry; -import io.micrometer.observation.ObservationRegistry; import lombok.extern.slf4j.Slf4j; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.server.dto.ModificationApplicationGroup; @@ -28,13 +20,11 @@ import org.gridsuite.modification.server.dto.NetworkModificationResult; import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus; import org.gridsuite.modification.server.dto.ReportInfos; -import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService; -import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService; import org.gridsuite.modification.server.entities.ModificationEntity; import org.gridsuite.modification.server.modifications.NetworkModificationApplicator; -import org.gridsuite.modification.server.service.LargeNetworkModificationExecutionService; -import org.gridsuite.modification.server.service.NetworkModificationObserver; +import org.gridsuite.modification.server.repositories.NetworkModificationRepository; import org.gridsuite.modification.server.service.ReportService; +import org.gridsuite.modification.server.utils.elasticsearch.DisableElasticsearch; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.extension.ExtendWith; @@ -45,6 +35,9 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.skyscreamer.jsonassert.JSONAssert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import java.nio.file.Files; import java.nio.file.Paths; @@ -52,12 +45,33 @@ import java.util.List; import java.util.UUID; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.atLeast; +import static org.mockito.Mockito.verify; import static org.assertj.core.api.Assertions.assertThat; @Slf4j @TestInstance(TestInstance.Lifecycle.PER_CLASS) @ExtendWith({MockitoExtension.class}) +@SpringBootTest +@DisableElasticsearch class VoltageInitReportTest { + + @Autowired + private NetworkModificationRepository modificationRepository; + + @Autowired + private NetworkModificationApplicator networkModificationApplicator; + + @MockBean + protected ReportService reportService; + + private static final UUID NETWORK_ID = UUID.fromString("11111111-1111-1111-1111-111111111111"); + private static final UUID NODE_ID = UUID.fromString("99999999-9999-9999-9999-999999999999"); + private static final UUID REPORT_ID = UUID.fromString("88888888-8888-8888-8888-888888888888"); + private static final UUID GROUP_ID = UUID.randomUUID(); + private final ObjectMapper objectMapper = new ObjectMapper().findAndRegisterModules() .registerModule(new ReportNodeJsonModule()) .setInjectableValues(new InjectableValues.Std().addValue(ReportNodeDeserializer.DICTIONARY_VALUE_ID, null)); @@ -67,41 +81,32 @@ class VoltageInitReportTest { @ParameterizedTest(name = "result status = {0}") @DisplayName("Verifying logs after applying Voltage-Init server modifications on a network") void testVoltageInitDuplicationLogs(final ApplicationStatus resultStatus, final String logsJsonFile, final VoltageInitModificationInfos modificationInfos) throws Exception { - final ReportService reportService = Mockito.mock(ReportService.class); - final RestClient restClient = Mockito.mock(RestClient.class); - final NetworkStoreService networkStoreService = new NetworkStoreServicePublic(restClient, PreloadingStrategy.NONE, - (restClient_, preloadingStrategy, executorService) -> new CachedNetworkStoreClient(new OfflineNetworkStoreClient())); - final EquipmentInfosService equipmentInfosService = Mockito.mock(EquipmentInfosService.class); - final ModificationApplicationInfosService modificationApplicationInfosService = Mockito.mock(ModificationApplicationInfosService.class); - final NetworkModificationObserver networkModificationObserver = new NetworkModificationObserver(ObservationRegistry.NOOP, new SimpleMeterRegistry()); - final LargeNetworkModificationExecutionService modificationExecutionService = new LargeNetworkModificationExecutionService(2, networkModificationObserver); - final NetworkModificationApplicator networkModificationApplicator = new NetworkModificationApplicator(networkStoreService, equipmentInfosService, modificationApplicationInfosService, reportService, null, null, networkModificationObserver, modificationExecutionService); - networkModificationApplicator.setCollectionThreshold(5); - final Network network = Network.read(Paths.get(this.getClass().getClassLoader().getResource("fourSubstations_testsOpenReac.xiidm").toURI())); - //for internal call to reportService.sendReport(reportInfos.getReportUuid(), reporter); - final ArgumentCaptor reporterCaptor = ArgumentCaptor.forClass(ReportNode.class); - - final UUID networkUuuid = UUID.fromString("11111111-1111-1111-1111-111111111111"); - final UUID reportUuid = UUID.fromString("88888888-8888-8888-8888-888888888888"); - //simulate PUT /v1/groups/abc?action=COPY with body ModificationApplicationContext(networkUuid=0000, reportUuid=0000, reporterId=0000, variantId=0000, duplicateFrom=0000) - assertThat(networkModificationApplicator.applyModifications( - new ModificationApplicationGroup(UUID.randomUUID(), List.of(ModificationEntity.fromDTO(modificationInfos)), new ReportInfos(reportUuid, UUID.fromString("99999999-9999-9999-9999-999999999999"))), - new NetworkInfos(network, networkUuuid, true))) - .as("network modifications results") - .isNotNull() - .extracting(NetworkModificationResult::getApplicationStatus) - .isEqualTo(resultStatus); + // apply a VoltageInit modification and check status + assertThat(applyModification(network, modificationInfos)) + .as("voltage init result status") + .isEqualTo(resultStatus); - Mockito.verify(reportService, Mockito.times(1)).sendReport(Mockito.eq(reportUuid), reporterCaptor.capture()); + // check produced report json data + ArgumentCaptor reporterCaptor = ArgumentCaptor.forClass(ReportNode.class); + verify(reportService, atLeast(1)).sendReport(any(UUID.class), reporterCaptor.capture()); final ReportNode result = reporterCaptor.getValue(); - log.info("Result = {}", objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(result)); + assertNotNull(result); JSONAssert.assertEquals("voltage-init plan logs aggregated", Files.readString(Paths.get(this.getClass().getClassLoader().getResource(logsJsonFile).toURI())), objectMapper.writeValueAsString(result), false); Mockito.verifyNoMoreInteractions(reportService); - Mockito.reset(reportService); //because parametized tests haven't same lifecycle than tests + Mockito.reset(reportService); //because parameterized tests haven't same lifecycle than tests + } + + private ApplicationStatus applyModification(Network network, VoltageInitModificationInfos infos) { + List entities = modificationRepository.saveModifications(GROUP_ID, List.of(ModificationEntity.fromDTO(infos))); + List modificationInfosGroups = List.of( + new ModificationApplicationGroup(GROUP_ID, entities, new ReportInfos(REPORT_ID, NODE_ID)) + ); + NetworkModificationResult result = networkModificationApplicator.applyModifications(modificationInfosGroups, new NetworkInfos(network, NETWORK_ID, true)); + return result.getApplicationStatus(); } private static List voltageInitModifications() { From 8b7eac59b6b92644932f8967b68fe3a364677f44 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 8 Oct 2025 16:23:35 +0200 Subject: [PATCH 09/11] fix TUs Signed-off-by: David BRAQUART --- .../EquipmentModificationEntity.java | 6 +-- .../NetworkModificationRepository.java | 2 - .../service/NetworkModificationService.java | 4 +- .../server/ModificationControllerTest.java | 2 +- .../TabularGeneratorCreationsTest.java | 45 +++-------------- .../TabularGeneratorModificationsTest.java | 50 +++---------------- 6 files changed, 18 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java index 050d0be72..c157b5fbe 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/EquipmentModificationEntity.java @@ -43,16 +43,14 @@ public void update(ModificationInfos modificationInfos) { private void assignAttributes(EquipmentModificationInfos equipmentModificationInfos) { equipmentId = equipmentModificationInfos.getEquipmentId(); - List newProperties = equipmentModificationInfos.getProperties() == null ? null : + List newProperties = equipmentModificationInfos.getProperties() == null ? List.of() : equipmentModificationInfos.getProperties().stream() .map(FreePropertyEntity::new) .toList(); if (this.properties != null) { // update using the same reference with clear/add (to avoid JPA exception) this.properties.clear(); - if (newProperties != null) { - this.properties.addAll(newProperties); - } + this.properties.addAll(newProperties); } else { this.properties = newProperties; } diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index 2dac0a66d..5286db6ce 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -113,8 +113,6 @@ public List saveModifications(UUID groupUuid, List saveModificationInfos(UUID groupUuid, List modifications) { List entities = modifications.stream().map(ModificationEntity::fromDTO).toList(); diff --git a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java index 8daf4cca9..32dbe9a22 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -191,9 +191,7 @@ public void restoreNetworkModifications(UUID groupUuid, @NonNull List modi networkModificationRepository.getModificationsCount(groupUuid, false)); } - // No transactional because we need to save modification in DB also in case of error - // Transaction made in 'saveModifications' method - // TODO Add transaction when errors will no longer be sent to the front + @Transactional public NetworkModificationsResult createNetworkModification(@NonNull UUID groupUuid, @NonNull ModificationInfos modificationInfo, @NonNull List applicationContexts) { List modificationEntities = networkModificationRepository.saveModificationInfos(groupUuid, List.of(modificationInfo)); diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 61804e764..1ac17fdf8 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -451,7 +451,7 @@ void testNetworkModificationsWithErrorOnNetworkFlush() throws Exception { mockMvc.perform(post(NETWORK_MODIFICATION_URI).content(groovyScriptInfosJson).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()); - assertEquals(1, modificationRepository.getModifications(TEST_GROUP_ID, true, false).size()); + assertEquals(0, modificationRepository.getModifications(TEST_GROUP_ID, true, false).size()); } @Test diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java index ca7fb82f2..b2209c1e9 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java @@ -12,20 +12,19 @@ import com.powsybl.iidm.network.IdentifiableType; import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.extensions.ConnectablePosition; +import jakarta.servlet.ServletException; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.FreePropertyInfos; import org.gridsuite.modification.dto.GeneratorCreationInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.SubstationCreationInfos; import org.gridsuite.modification.dto.tabular.*; -import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.impacts.AbstractBaseImpact; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.utils.NetworkCreation; import org.junit.jupiter.api.Tag; import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MvcResult; import java.util.List; import java.util.Map; @@ -339,43 +338,11 @@ void testUnsupportedTabularCreationType() throws Exception { .build(); String tabularCreationJson = getJsonBody(creationInfos, null); - // creation - MvcResult mvcResult = mockMvc.perform(post(getNetworkModificationUri()).content(tabularCreationJson) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - NetworkModificationsResult result = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); - assertNotNull(result); - assertEquals(1, result.modificationUuids().size()); - UUID modifId = result.modificationUuids().get(0); - - // try to get via the group - UnsupportedOperationException exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.getModifications(TEST_GROUP_ID, false, true) - ); - assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getMessage()); - - // try to get via id - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.getModificationInfo(modifId) - ); - assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getMessage()); - - // try to update - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.updateModification(modifId, creationInfos) - ); - // deletion error because we try to remove the sub-modifications before updating them - assertEquals("No sub-modifications deletion method for type: SUBSTATION_CREATION", exception.getMessage()); - - // try to delete - List ids = List.of(modifId); - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.deleteModifications(TEST_GROUP_ID, ids) + // try to create something impossible + ServletException exception = assertThrows( + ServletException.class, + () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularCreationJson).contentType(MediaType.APPLICATION_JSON)) ); - assertEquals("No sub-modifications deletion method for type: SUBSTATION_CREATION", exception.getMessage()); + assertEquals("No sub-modifications loading for modification type: SUBSTATION_CREATION", exception.getRootCause().getMessage()); } } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java index edbdcd7bf..73bccbec5 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java @@ -10,11 +10,11 @@ import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.StaticVarCompensator; import com.powsybl.iidm.network.extensions.ConnectablePosition; +import jakarta.servlet.ServletException; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.dto.tabular.TabularModificationInfos; import org.gridsuite.modification.dto.tabular.TabularPropertyInfos; -import org.gridsuite.modification.server.dto.NetworkModificationsResult; import org.gridsuite.modification.server.modifications.AbstractNetworkModificationTest; import org.gridsuite.modification.server.repositories.ModificationRepository; import org.gridsuite.modification.server.repositories.TabularPropertyRepository; @@ -26,7 +26,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; -import org.springframework.test.web.servlet.MvcResult; import org.testcontainers.shaded.org.apache.commons.lang3.tuple.Pair; import java.util.List; @@ -42,7 +41,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -172,7 +170,7 @@ void testSqlRequestsCountOnPostGroups() throws Exception { reset(); ApiUtils.postGroups(mockMvc, getGroupId(), targetGroupUuid); - TestUtils.assertRequestsCount(12, 9, 2, 0); // (13, 9, 2, 0) before improvements + TestUtils.assertRequestsCount(13, 9, 2, 0); // (13, 9, 2, 0) before improvements assertTabularModificationsEquals(modifications, targetGroupUuid); } @@ -183,7 +181,7 @@ void testSqlRequestsCountOnPostGroups2() throws Exception { reset(); ApiUtils.postGroups(mockMvc, getGroupId(), targetGroupUuid); - TestUtils.assertRequestsCount(20, 10, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points + TestUtils.assertRequestsCount(21, 10, 2, 0); // (95, 10, 2, 0) before improvements, why one additional insert ? It feels batch_size is limited at 100 for insertions and is it reached for reactive_capability_curve_points assertTabularModificationsEquals(modifications, targetGroupUuid); } @@ -597,44 +595,12 @@ void testUnsupportedTabularModificationType() throws Exception { .build(); String tabularModificationJson = getJsonBody(tabularInfos, null); - // creation - MvcResult mvcResult = mockMvc.perform(post(getNetworkModificationUri()).content(tabularModificationJson) - .contentType(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()).andReturn(); - NetworkModificationsResult result = mapper.readValue(mvcResult.getResponse().getContentAsString(), new TypeReference<>() { }); - assertNotNull(result); - assertEquals(1, result.modificationUuids().size()); - UUID modifId = result.modificationUuids().get(0); - - // try to get via the group - UnsupportedOperationException exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.getModifications(TEST_GROUP_ID, false, true) - ); - assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage()); - - // try to get via id - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.getModificationInfo(modifId) - ); - assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage()); - - // try to update - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.updateModification(modifId, tabularInfos) - ); - // deletion error because we try to remove the sub-modifications before updating them - assertEquals("No sub-modifications deletion method for type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage()); - - // try to delete - List ids = List.of(modifId); - exception = assertThrows( - UnsupportedOperationException.class, - () -> networkModificationRepository.deleteModifications(TEST_GROUP_ID, ids) + // try to create something impossible + ServletException exception = assertThrows( + ServletException.class, + () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularModificationJson).contentType(MediaType.APPLICATION_JSON)) ); - assertEquals("No sub-modifications deletion method for type: STATIC_VAR_COMPENSATOR_CREATION", exception.getMessage()); + assertEquals("No sub-modifications loading for modification type: STATIC_VAR_COMPENSATOR_CREATION", exception.getRootCause().getMessage()); } @Override From 966741e74bfee1db7e5c0e0489dd75a6e86b3afb Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Wed, 8 Oct 2025 16:24:27 +0200 Subject: [PATCH 10/11] add exception to be sure to use optimized tabular access Signed-off-by: David BRAQUART --- .../tabular/TabularModificationsEntity.java | 20 +------------------ 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java index 36ef44d3c..cd60c3b36 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/tabular/TabularModificationsEntity.java @@ -15,7 +15,6 @@ import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.dto.tabular.*; import org.gridsuite.modification.server.entities.ModificationEntity; -import org.springframework.util.CollectionUtils; import java.util.List; import java.util.stream.Collectors; @@ -67,24 +66,7 @@ public void update(ModificationInfos modificationInfos) { @Override public TabularBaseInfos toModificationInfos() { - var builder = switch (ModificationType.valueOf(getType())) { - case ModificationType.TABULAR_CREATION -> TabularCreationInfos.builder(); - case ModificationType.LIMIT_SETS_TABULAR_MODIFICATION -> LimitSetsTabularModificationInfos.builder(); - default -> TabularModificationInfos.builder(); - }; - List modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList()); - return builder - .date(getDate()) - .uuid(getId()) - .stashed(getStashed()) - .activated(getActivated()) - .modificationType(modificationType) - .modifications(modificationsInfos) - .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() - .map(TabularPropertyEntity::toInfos) - .toList()) - .csvFilename(getCsvFilename()) - .build(); + throw new UnsupportedOperationException("Tabular DTO must be retrieved with NetworkModificationRepository::getModificationInfos"); } private void assignAttributes(TabularBaseInfos tabularBaseInfos) { From e1f2bc699f5cb00216c4636cacf5b5abe6109859 Mon Sep 17 00:00:00 2001 From: David BRAQUART Date: Tue, 14 Oct 2025 16:18:58 +0200 Subject: [PATCH 11/11] update comments Signed-off-by: David BRAQUART --- .../repositories/NetworkModificationRepository.java | 10 ++++------ .../server/ModificationControllerTest.java | 3 ++- .../TabularGeneratorCreationsTest.java | 2 +- .../TabularGeneratorModificationsTest.java | 2 +- 4 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java index 5286db6ce..696851f78 100644 --- a/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java +++ b/src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java @@ -104,18 +104,16 @@ public void deleteAll() { modificationGroupRepository.deleteAll(); } - @Transactional // To have all create in the same transaction (atomic) - // TODO Remove transaction when errors will no longer be sent to the front - // This method should be package-private and not used as API of the service as it uses ModificationEntity and - // we want to encapsulate the use of Entity related objects to this service. - // Nevertheless We have to keep it public for transactional annotation. + @Transactional + // TODO Rather than calling saveModificationsNonTransactional(), we should call saveModificationInfos() below. + // In this case, we could change this method signature to use DTOs instead of Entities. + // Note: This current method is used only by the tests. public List saveModifications(UUID groupUuid, List modifications) { return saveModificationsNonTransactional(groupUuid, modifications); } public List saveModificationInfos(UUID groupUuid, List modifications) { List entities = modifications.stream().map(ModificationEntity::fromDTO).toList(); - return saveModificationsNonTransactional(groupUuid, entities); } diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 1ac17fdf8..65c64007d 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -450,7 +450,8 @@ void testNetworkModificationsWithErrorOnNetworkFlush() throws Exception { String groovyScriptInfosJson = getJsonBody(groovyScriptInfos, TEST_NETWORK_WITH_FLUSH_ERROR_ID, NetworkCreation.VARIANT_ID); mockMvc.perform(post(NETWORK_MODIFICATION_URI).content(groovyScriptInfosJson).contentType(MediaType.APPLICATION_JSON)).andExpect(status().is5xxServerError()); - + // TODO because creating a modification is now a unique Tx, and because network.flush() is not covered by the apply() exception catch, + // this test result has changed : the modification save is not committed because of the flush exception. assertEquals(0, modificationRepository.getModifications(TEST_GROUP_ID, true, false).size()); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java index b2209c1e9..3e1120f6b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularcreations/TabularGeneratorCreationsTest.java @@ -338,7 +338,7 @@ void testUnsupportedTabularCreationType() throws Exception { .build(); String tabularCreationJson = getJsonBody(creationInfos, null); - // try to create something impossible + // try to create+apply a tabular creation with an unsupported type ServletException exception = assertThrows( ServletException.class, () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularCreationJson).contentType(MediaType.APPLICATION_JSON)) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java index 73bccbec5..08f1764eb 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularGeneratorModificationsTest.java @@ -595,7 +595,7 @@ void testUnsupportedTabularModificationType() throws Exception { .build(); String tabularModificationJson = getJsonBody(tabularInfos, null); - // try to create something impossible + // try to create+apply a tabular modification with an unsupported type ServletException exception = assertThrows( ServletException.class, () -> mockMvc.perform(post(getNetworkModificationUri()).content(tabularModificationJson).contentType(MediaType.APPLICATION_JSON))