Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
<sonar.organization>gridsuite</sonar.organization>
<sonar.projectKey>org.gridsuite:network-modification-server</sonar.projectKey>
<!-- TODO network-modification.version remove when included in gridsuite-dependencies -->
<network-modification.version>0.81.0</network-modification.version>
<network-modification.version>0.83.0</network-modification.version>
</properties>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,12 +59,12 @@ public ResponseEntity<List<ModificationInfos>> 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<NetworkModificationExportInfos> 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<Map<UUID, NetworkModificationExportInfos>> getModificationsByGroupsToExport(@RequestBody List<UUID> 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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <maissa.souissi@rte-france.com>
*/
public record NetworkModificationExportInfos(
@JsonProperty("modifications")
List<ModificationInfos> exportedModifications,

@JsonProperty("unexported")
List<UnexportedModification> unexportedModifications
List<ModificationInfos> exportedModifications
) {

public record UnexportedModification(
UUID uuid,
ModificationType type
) {
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -78,4 +75,16 @@ public Map<UUID, FilterEquipments> getUuidFilterEquipmentsMap(Network network, M
f.getNotFoundEquipments()))
.collect(Collectors.toMap(FilterEquipments::getFilterId, Function.identity()));
}

public Map<UUID, AbstractFilter> getFiltersAsMap(Collection<UUID> filterUuids) {
if (filterUuids == null || filterUuids.isEmpty()) {
return Map.of();
}
List<AbstractFilter> 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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -54,4 +54,18 @@ public LoadFlowParametersInfos getLoadFlowParametersInfos(UUID uuid) {
}
}
}

public Map<UUID, LoadFlowParametersInfos> getLoadFlowParametersAsMap(Collection<UUID> uuids) {
if (uuids == null || uuids.isEmpty()) {
return Map.of();
}
Map<UUID, LoadFlowParametersInfos> result = new HashMap<>();
for (UUID id : new LinkedHashSet<>(uuids)) {
LoadFlowParametersInfos params = getLoadFlowParametersInfos(id);
if (params != null) {
result.put(id, params);
}
}
return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand Down Expand Up @@ -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";
Expand All @@ -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;
Expand All @@ -107,6 +110,7 @@ public NetworkModificationService(NetworkStoreService networkStoreService,
this.elasticsearchOperations = elasticsearchOperations;
this.modificationRepository = modificationRepository;
this.filterService = filterService;
this.loadFlowService = loadFlowService;
}

public List<UUID> getModificationGroups() {
Expand All @@ -120,20 +124,26 @@ public List<ModificationInfos> getNetworkModifications(UUID groupUuid, boolean o
}

@Transactional(readOnly = true)
public NetworkModificationExportInfos getNetworkModificationsInfosToExport(UUID groupUuid, boolean errorOnGroupNotFound) {
List<ModificationInfos> allModifications = networkModificationRepository.getModificationsInfosToExport(List.of(groupUuid), errorOnGroupNotFound);
List<ModificationInfos> exportable = new ArrayList<>();
List<NetworkModificationExportInfos.UnexportedModification> 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<UUID, NetworkModificationExportInfos> getModificationsByGroupsToExport(List<UUID> groupUuids, boolean errorOnGroupNotFound) {
if (groupUuids == null || groupUuids.isEmpty()) {
return Map.of();
}
Map<UUID, List<ModificationInfos>> modsByGroup = new LinkedHashMap<>();
for (UUID groupUuid : groupUuids) {
List<ModificationInfos> mods = networkModificationRepository.getModificationsInfosToExport(List.of(groupUuid), errorOnGroupNotFound);
modsByGroup.put(groupUuid, mods);
}
return new NetworkModificationExportInfos(exportable, unexported);
List<ModificationInfos> allMods = modsByGroup.values().stream().flatMap(List::stream).toList();
Set<UUID> filterUuids = allMods.stream().flatMap(m -> m.getReferencedFilterUuids().stream()).collect(Collectors.toSet());
Set<UUID> lfParamsUuids = allMods.stream().flatMap(m -> m.getReferencedLoadFlowParametersUuids().stream()).collect(Collectors.toSet());
Map<UUID, AbstractFilter> filters = filterService.getFiltersAsMap(filterUuids);
Map<UUID, LoadFlowParametersInfos> 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<ModificationEntity> getModificationsByUuids(List<UUID> modificationUuids) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand All @@ -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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -143,7 +143,7 @@ public void testModificationWithAllWrongEquipmentIds() throws Exception {
AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of());

List<AssignmentInfos<?>> 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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand Down Expand Up @@ -151,7 +151,7 @@ public void testModificationWithAllWrongEquipmentIds() throws Exception {
AbstractFilter filter = getFilterEquipments(FILTER_WITH_ALL_WRONG_IDS, List.of());

List<FormulaInfos> 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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Loading