diff --git a/pom.xml b/pom.xml index 2e39ab396..109c9dafa 100644 --- a/pom.xml +++ b/pom.xml @@ -53,7 +53,7 @@ gridsuite org.gridsuite:network-modification-server - 0.81.0 + 0.83.0 diff --git a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java index 155f01991..e2b50dfe2 100644 --- a/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java +++ b/src/main/java/org/gridsuite/modification/server/NetworkModificationController.java @@ -59,12 +59,12 @@ public ResponseEntity> getNetworkModifications(@Paramete return ResponseEntity.ok().body(networkModificationService.getNetworkModifications(groupUuid, onlyMetadata, errorOnGroupNotFound, onlyStashed)); } - @GetMapping(value = "/groups/{groupUuid}/network-modifications/export", produces = MediaType.APPLICATION_JSON_VALUE) - @Operation(summary = "Get list modifications to export for a given group") - @ApiResponse(responseCode = "200", description = "List of modifications of the group to export") - public ResponseEntity getNetworkModificationsToExport(@Parameter(description = "Group UUID") @PathVariable("groupUuid") UUID groupUuid, - @Parameter(description = "Return 404 if group is not found or an empty list") @RequestParam(name = "errorOnGroupNotFound", required = false, defaultValue = "true") Boolean errorOnGroupNotFound) { - return ResponseEntity.ok().body(networkModificationService.getNetworkModificationsInfosToExport(groupUuid, errorOnGroupNotFound)); + @PostMapping(value = "/groups/modifications/export", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation(summary = "Export network modifications for multiple groups in a single batched call") + @ApiResponse(responseCode = "200", description = "Modifications grouped by groupUuid, with embedded filters and load-flow parameters") + public ResponseEntity> getModificationsByGroupsToExport(@RequestBody List groupUuids, + @RequestParam(value = "errorOnGroupNotFound", required = false, defaultValue = "false") boolean errorOnGroupNotFound) { + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(networkModificationService.getModificationsByGroupsToExport(groupUuids, errorOnGroupNotFound)); } @GetMapping(value = "/groups/{groupUuid}/network-modifications/verify", produces = MediaType.APPLICATION_JSON_VALUE) diff --git a/src/main/java/org/gridsuite/modification/server/dto/NetworkModificationExportInfos.java b/src/main/java/org/gridsuite/modification/server/dto/NetworkModificationExportInfos.java index bcab3c17e..d45e6a281 100644 --- a/src/main/java/org/gridsuite/modification/server/dto/NetworkModificationExportInfos.java +++ b/src/main/java/org/gridsuite/modification/server/dto/NetworkModificationExportInfos.java @@ -7,26 +7,15 @@ package org.gridsuite.modification.server.dto; import com.fasterxml.jackson.annotation.JsonProperty; -import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.dto.ModificationInfos; import java.util.List; -import java.util.UUID; /** * @author Maissa Souissi */ public record NetworkModificationExportInfos( @JsonProperty("modifications") - List exportedModifications, - - @JsonProperty("unexported") - List unexportedModifications + List exportedModifications ) { - - public record UnexportedModification( - UUID uuid, - ModificationType type - ) { - } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/deletion/ByFilterDeletionEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/deletion/ByFilterDeletionEntity.java index 7bdb037ef..ba4e9e2a5 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/deletion/ByFilterDeletionEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/deletion/ByFilterDeletionEntity.java @@ -75,7 +75,7 @@ public ByFilterDeletionInfos toModificationInfos() { .activated(getActivated()) .description(getDescription()) .filters(getFilters().stream() - .map(filter -> new FilterInfos(filter.getFilterId(), filter.getName())) + .map(filter -> new FilterInfos(filter.getFilterId(), filter.getName(), null)) .collect(Collectors.toList())) .equipmentType(getEquipmentType()).build(); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ScalingVariationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ScalingVariationEntity.java index ca7b8b626..cd03c6139 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ScalingVariationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/ScalingVariationEntity.java @@ -77,7 +77,7 @@ public ScalingVariationInfos toScalingVariationInfos() { .variationValue(getVariationValue()) .reactiveVariationMode(getReactiveVariationMode()) .filters(this.getFilters().stream() - .map(filter -> new FilterInfos(filter.getFilterId(), filter.getName())) + .map(filter -> new FilterInfos(filter.getFilterId(), filter.getName(), null)) .collect(Collectors.toList())) .build(); } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java index d93cfa1b2..a5f1ca772 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/assignment/AssignmentEntity.java @@ -80,7 +80,7 @@ public AssignmentInfos toAssignmentInfos() { assignAttributes(assignmentInfos); assignmentInfos.setFilters(filters.stream() - .map(filterEntity -> new FilterInfos(filterEntity.getFilterId(), filterEntity.getName())) + .map(filterEntity -> new FilterInfos(filterEntity.getFilterId(), filterEntity.getName(), null)) .toList()); return assignmentInfos; } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java index f7eca8cd1..0e5e70f9d 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/byfilter/formula/FormulaEntity.java @@ -61,7 +61,7 @@ public FormulaEntity(FormulaInfos formulaInfos) { public FormulaInfos toFormulaInfos() { FormulaInfos formulaInfos = FormulaInfos.builder() .filters(filters.stream() - .map(filterEntity -> new FilterInfos(filterEntity.getFilterId(), filterEntity.getName())) + .map(filterEntity -> new FilterInfos(filterEntity.getFilterId(), filterEntity.getName(), null)) .toList()) .fieldOrValue1(ReferenceFieldOrValue.builder() .equipmentField(equipmentField1) diff --git a/src/main/java/org/gridsuite/modification/server/service/FilterService.java b/src/main/java/org/gridsuite/modification/server/service/FilterService.java index 9b3060a55..865e5d953 100644 --- a/src/main/java/org/gridsuite/modification/server/service/FilterService.java +++ b/src/main/java/org/gridsuite/modification/server/service/FilterService.java @@ -20,10 +20,7 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -78,4 +75,16 @@ public Map getUuidFilterEquipmentsMap(Network network, M f.getNotFoundEquipments())) .collect(Collectors.toMap(FilterEquipments::getFilterId, Function.identity())); } + + public Map getFiltersAsMap(Collection filterUuids) { + if (filterUuids == null || filterUuids.isEmpty()) { + return Map.of(); + } + List filters = getFilters(new ArrayList<>(new LinkedHashSet<>(filterUuids))); + if (filters == null) { + return Map.of(); + } + return filters.stream().filter(f -> f.getId() != null) + .collect(Collectors.toMap(AbstractFilter::getId, Function.identity(), (a, b) -> a)); + } } diff --git a/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java b/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java index 6c689f6c0..7da7e718f 100644 --- a/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java +++ b/src/main/java/org/gridsuite/modification/server/service/LoadFlowService.java @@ -17,7 +17,7 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; -import java.util.UUID; +import java.util.*; import static org.gridsuite.modification.server.NetworkModificationServerException.handleChangeError; @@ -54,4 +54,18 @@ public LoadFlowParametersInfos getLoadFlowParametersInfos(UUID uuid) { } } } + + public Map getLoadFlowParametersAsMap(Collection uuids) { + if (uuids == null || uuids.isEmpty()) { + return Map.of(); + } + Map result = new HashMap<>(); + for (UUID id : new LinkedHashSet<>(uuids)) { + LoadFlowParametersInfos params = getLoadFlowParametersInfos(id); + if (params != null) { + result.put(id, params); + } + } + return result; + } } 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 bfcfb47b4..8463c9e7f 100644 --- a/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java +++ b/src/main/java/org/gridsuite/modification/server/service/NetworkModificationService.java @@ -21,8 +21,8 @@ import org.gridsuite.filter.AbstractFilter; import org.gridsuite.modification.ModificationType; import org.gridsuite.modification.NetworkModificationException; -import org.gridsuite.modification.dto.EquipmentModificationInfos; import org.gridsuite.modification.dto.GenerationDispatchInfos; +import org.gridsuite.modification.dto.LoadFlowParametersInfos; import org.gridsuite.modification.dto.ModificationInfos; import org.gridsuite.modification.server.NetworkModificationServerException; import org.gridsuite.modification.server.dto.*; @@ -80,6 +80,8 @@ public class NetworkModificationService { private final FilterService filterService; + private final LoadFlowService loadFlowService; + static final String NETWORK_UUID = "networkUuid.keyword"; static final String CREATED_EQUIPMENT_IDS = "createdEquipmentIds.fullascii"; static final String MODIFIED_EQUIPMENT_IDS = "modifiedEquipmentIds.fullascii"; @@ -96,7 +98,8 @@ public NetworkModificationService(NetworkStoreService networkStoreService, ModificationApplicationInfosService applicationInfosService, ElasticsearchOperations elasticsearchOperations, ModificationRepository modificationRepository, - FilterService filterService) { + FilterService filterService, + LoadFlowService loadFlowService) { this.networkStoreService = networkStoreService; this.networkModificationRepository = networkModificationRepository; this.equipmentInfosService = equipmentInfosService; @@ -107,6 +110,7 @@ public NetworkModificationService(NetworkStoreService networkStoreService, this.elasticsearchOperations = elasticsearchOperations; this.modificationRepository = modificationRepository; this.filterService = filterService; + this.loadFlowService = loadFlowService; } public List getModificationGroups() { @@ -120,20 +124,26 @@ public List getNetworkModifications(UUID groupUuid, boolean o } @Transactional(readOnly = true) - public NetworkModificationExportInfos getNetworkModificationsInfosToExport(UUID groupUuid, boolean errorOnGroupNotFound) { - List allModifications = networkModificationRepository.getModificationsInfosToExport(List.of(groupUuid), errorOnGroupNotFound); - List exportable = new ArrayList<>(); - List unexported = new ArrayList<>(); - for (ModificationInfos modification : allModifications) { - if (modification instanceof EquipmentModificationInfos) { - exportable.add(modification); - } else { - unexported.add( - new NetworkModificationExportInfos.UnexportedModification(modification.getUuid(), modification.getType()) - ); - } + public Map getModificationsByGroupsToExport(List groupUuids, boolean errorOnGroupNotFound) { + if (groupUuids == null || groupUuids.isEmpty()) { + return Map.of(); + } + Map> modsByGroup = new LinkedHashMap<>(); + for (UUID groupUuid : groupUuids) { + List mods = networkModificationRepository.getModificationsInfosToExport(List.of(groupUuid), errorOnGroupNotFound); + modsByGroup.put(groupUuid, mods); } - return new NetworkModificationExportInfos(exportable, unexported); + List allMods = modsByGroup.values().stream().flatMap(List::stream).toList(); + Set filterUuids = allMods.stream().flatMap(m -> m.getReferencedFilterUuids().stream()).collect(Collectors.toSet()); + Set lfParamsUuids = allMods.stream().flatMap(m -> m.getReferencedLoadFlowParametersUuids().stream()).collect(Collectors.toSet()); + Map filters = filterService.getFiltersAsMap(filterUuids); + Map lfParams = loadFlowService.getLoadFlowParametersAsMap(lfParamsUuids); + allMods.forEach(m -> m.embedReferencedData(filters, lfParams)); + return modsByGroup.entrySet().stream().collect(Collectors.toMap( + Map.Entry::getKey, + e -> new NetworkModificationExportInfos(e.getValue()), + (a, b) -> a, + LinkedHashMap::new)); } public List getModificationsByUuids(List modificationUuids) { diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 863cc947c..3c5be1a0d 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -286,8 +286,6 @@ void testNetworkModificationsToExport() throws Exception { NetworkModificationExportInfos exportInfos = mapper.readValue(resultAsString, NetworkModificationExportInfos.class); assertEquals(1, exportInfos.exportedModifications().size()); - assertEquals(1, exportInfos.unexportedModifications().size()); - assertEquals(exportInfos.unexportedModifications().getFirst().type(), byFormulaModificationInfos.getType()); // delete group mockMvc.perform(delete("/v1/groups/{groupUuid}", TEST_GROUP_ID)) @@ -304,7 +302,6 @@ void testNetworkModificationsToExport() throws Exception { resultAsString = mvcResult.getResponse().getContentAsString(); exportInfos = mapper.readValue(resultAsString, NetworkModificationExportInfos.class); assertEquals(exportInfos.exportedModifications(), List.of()); - assertEquals(exportInfos.unexportedModifications(), List.of()); } @Test diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java index 5ee834c23..c7a47aae5 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/assignment/AbstractModificationByAssignmentTest.java @@ -63,13 +63,13 @@ abstract class AbstractModificationByAssignmentTest extends AbstractNetworkModif protected static final UUID FILTER_ID_6 = UUID.randomUUID(); protected static final UUID FILTER_WITH_ALL_WRONG_IDS = UUID.randomUUID(); protected static final UUID FILTER_WITH_ONE_WRONG_ID = UUID.randomUUID(); - protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1"); - protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2"); - protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3"); - protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4"); - protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5"); - protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6"); - protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId"); + protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1", null); + protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2", null); + protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3", null); + protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4", null); + protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5", null); + protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6", null); + protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId", null); protected static final String PATH = "/v1/filters/metadata"; @@ -143,7 +143,7 @@ public void testModificationWithAllWrongEquipmentIds() throws Exception { AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of()); List> assignmentsWithWrongFilter = getAssignmentInfos().stream() - .peek(assignmentInfos -> assignmentInfos.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId")))) + .peek(assignmentInfos -> assignmentInfos.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId", null)))) .toList(); UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ALL_WRONG_IDS)) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java index 6ea3c95ba..a8919d73b 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/AbstractByFormulaModificationTest.java @@ -59,13 +59,13 @@ abstract class AbstractByFormulaModificationTest extends AbstractNetworkModifica protected static final UUID FILTER_ID_6 = UUID.randomUUID(); protected static final UUID FILTER_WITH_ALL_WRONG_IDS = UUID.randomUUID(); protected static final UUID FILTER_WITH_ONE_WRONG_ID = UUID.randomUUID(); - protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1"); - protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2"); - protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3"); - protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4"); - protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5"); - protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6"); - protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId"); + protected final FilterInfos filter1 = new FilterInfos(FILTER_ID_1, "filter1", null); + protected final FilterInfos filter2 = new FilterInfos(FILTER_ID_2, "filter2", null); + protected final FilterInfos filter3 = new FilterInfos(FILTER_ID_3, "filter3", null); + protected final FilterInfos filter4 = new FilterInfos(FILTER_ID_4, "filter4", null); + protected final FilterInfos filter5 = new FilterInfos(FILTER_ID_5, "filter5", null); + protected final FilterInfos filter6 = new FilterInfos(FILTER_ID_6, "filter6", null); + protected final FilterInfos filterWithOneWrongId = new FilterInfos(FILTER_WITH_ONE_WRONG_ID, "filterWithOneWrongId", null); protected static final String PATH = "/v1/filters/metadata"; @@ -151,7 +151,7 @@ public void testModificationWithAllWrongEquipmentIds() throws Exception { AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of()); List formulaInfos = getFormulaInfos().stream() - .peek(formula -> formula.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId")))) + .peek(formula -> formula.setFilters(List.of(new FilterInfos(FILTER_WITH_ALL_WRONG_IDS, "filterWithWrongId", null)))) .toList(); UUID stubId = wireMockServer.stubFor(WireMock.get(WireMock.urlMatching("/v1/filters/metadata\\?ids=" + FILTER_WITH_ALL_WRONG_IDS)) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java index b46fd28ec..b31b88848 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/byfilter/formula/GeneratorByFormulaModificationTest.java @@ -67,7 +67,7 @@ void testWithNullReferenceFieldOrValue() throws Exception { AbstractFilter filterEquipments = getFilterEquipments(FILTER_ID_1, List.of(identifiableAttributes)); FormulaInfos formulaInfos = FormulaInfos.builder() - .filters(List.of(new FilterInfos(FILTER_ID_1, "filter1"))) + .filters(List.of(new FilterInfos(FILTER_ID_1, "filter1", null))) .editedField(GeneratorField.ACTIVE_POWER_SET_POINT.name()) .fieldOrValue1(ReferenceFieldOrValue.builder().value(55.).build()) .operator(Operator.ADDITION)