Skip to content

Commit 058e708

Browse files
Filter voltage init results with a global filter (#112)
* Add global filter parameter to filter voltage init results Signed-off-by: Franck LECUYER <[email protected]>
1 parent 0a359a6 commit 058e708

File tree

10 files changed

+315
-11
lines changed

10 files changed

+315
-11
lines changed

pom.xml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,6 @@
134134
<artifactId>powsybl-open-reac</artifactId>
135135
<version>${powsybl-open-reac.version}</version>
136136
</dependency>
137-
138137
<dependency>
139138
<groupId>com.powsybl</groupId>
140139
<artifactId>powsybl-optimizer-commons</artifactId>
@@ -158,6 +157,10 @@
158157
<groupId>com.powsybl</groupId>
159158
<artifactId>powsybl-open-reac</artifactId>
160159
</dependency>
160+
<dependency>
161+
<groupId>com.powsybl</groupId>
162+
<artifactId>powsybl-security-analysis-api</artifactId>
163+
</dependency>
161164
<dependency>
162165
<groupId>com.powsybl</groupId>
163166
<artifactId>powsybl-optimizer-commons</artifactId>
@@ -190,6 +193,10 @@
190193
<groupId>org.projectlombok</groupId>
191194
<artifactId>lombok</artifactId>
192195
<scope>provided</scope>
196+
</dependency>
197+
<dependency>
198+
<groupId>org.gridsuite</groupId>
199+
<artifactId>gridsuite-filter</artifactId>
193200
</dependency>
194201
<dependency>
195202
<groupId>com.powsybl</groupId>

src/main/java/org/gridsuite/voltageinit/server/VoltageInitController.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@
2323
import java.util.List;
2424
import java.util.UUID;
2525

26+
import java.net.URLDecoder;
27+
import java.nio.charset.StandardCharsets;
28+
2629
import static com.powsybl.ws.commons.computation.service.NotificationService.HEADER_USER_ID;
2730
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
2831

@@ -60,8 +63,12 @@ public ResponseEntity<UUID> runAndSave(@Parameter(description = "Network UUID")
6063
@Operation(summary = "Get a voltage init result from the database")
6164
@ApiResponses(value = {@ApiResponse(responseCode = "200", description = "The voltage init result"),
6265
@ApiResponse(responseCode = "404", description = "Voltage init result has not been found")})
63-
public ResponseEntity<VoltageInitResult> getResult(@Parameter(description = "Result UUID") @PathVariable("resultUuid") UUID resultUuid) {
64-
VoltageInitResult result = voltageInitService.getResult(resultUuid);
66+
public ResponseEntity<VoltageInitResult> getResult(@Parameter(description = "Result UUID") @PathVariable("resultUuid") UUID resultUuid,
67+
@Parameter(description = "Global Filters") @RequestParam(name = "globalFilters", required = false) String globalFilters,
68+
@Parameter(description = "network Uuid") @RequestParam(name = "networkUuid", required = false) UUID networkUuid,
69+
@Parameter(description = "variant Id") @RequestParam(name = "variantId", required = false) String variantId) {
70+
String decodedStringGlobalFilters = globalFilters != null ? URLDecoder.decode(globalFilters, StandardCharsets.UTF_8) : null;
71+
VoltageInitResult result = voltageInitService.getResult(resultUuid, decodedStringGlobalFilters, networkUuid, variantId);
6572
return result != null ? ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result)
6673
: ResponseEntity.notFound().build();
6774
}

src/main/java/org/gridsuite/voltageinit/server/dto/ReactiveSlack.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
@AllArgsConstructor
1818
@NoArgsConstructor
1919
public class ReactiveSlack {
20+
private String voltageLevelId;
2021

2122
private String busId;
2223

src/main/java/org/gridsuite/voltageinit/server/entities/ReactiveSlackEmbeddable.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
@NoArgsConstructor
2222
@Embeddable
2323
public class ReactiveSlackEmbeddable {
24+
@Column
25+
private String voltageLevelId;
2426

2527
@Column
2628
private String busId;

src/main/java/org/gridsuite/voltageinit/server/service/VoltageInitResultService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ private static VoltageInitResultEntity toVoltageInitResultEntity(UUID resultUuid
4848
boolean isReactiveSlacksOverThreshold, Double reactiveSlacksThreshold) {
4949
Map<String, String> indicators = result.getIndicators();
5050
List<ReactiveSlackEmbeddable> reactiveSlacks = result.getReactiveSlacks().stream().map(rs ->
51-
new ReactiveSlackEmbeddable(rs.getBusId(), rs.getSlack()))
51+
new ReactiveSlackEmbeddable(rs.getVoltageLevelId(), rs.getBusId(), rs.getSlack()))
5252
.collect(Collectors.toList());
5353
Map<String, Pair<Double, Double>> voltageProfile = result.getVoltageProfile();
5454
List<BusVoltageEmbeddable> busVoltages = voltageProfile.entrySet().stream()

src/main/java/org/gridsuite/voltageinit/server/service/VoltageInitService.java

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,18 @@
99
import com.fasterxml.jackson.databind.ObjectMapper;
1010
import com.powsybl.network.store.client.NetworkStoreService;
1111

12+
import com.powsybl.ws.commons.computation.dto.GlobalFilter;
1213
import com.powsybl.ws.commons.computation.service.AbstractComputationService;
1314
import com.powsybl.ws.commons.computation.service.NotificationService;
1415
import com.powsybl.ws.commons.computation.service.UuidGeneratorService;
16+
import com.powsybl.ws.commons.computation.utils.FilterUtils;
17+
import org.apache.commons.collections4.CollectionUtils;
1518
import org.gridsuite.voltageinit.server.dto.BusVoltage;
1619
import org.gridsuite.voltageinit.server.dto.ReactiveSlack;
1720
import org.gridsuite.voltageinit.server.dto.VoltageInitResult;
1821
import org.gridsuite.voltageinit.server.dto.VoltageInitStatus;
1922
import org.gridsuite.voltageinit.server.entities.VoltageInitResultEntity;
23+
import org.gridsuite.voltageinit.server.service.parameters.FilterService;
2024
import org.springframework.beans.factory.annotation.Autowired;
2125
import org.springframework.context.annotation.ComponentScan;
2226
import org.springframework.stereotype.Service;
@@ -36,13 +40,17 @@ public class VoltageInitService extends AbstractComputationService<VoltageInitRu
3640
@Autowired
3741
NetworkModificationService networkModificationService;
3842

43+
private final FilterService filterService;
44+
3945
public VoltageInitService(NotificationService notificationService,
4046
NetworkModificationService networkModificationService,
4147
UuidGeneratorService uuidGeneratorService,
4248
VoltageInitResultService resultService,
49+
FilterService filterService,
4350
ObjectMapper objectMapper) {
4451
super(notificationService, resultService, objectMapper, uuidGeneratorService, null);
4552
this.networkModificationService = Objects.requireNonNull(networkModificationService);
53+
this.filterService = Objects.requireNonNull(filterService);
4654
}
4755

4856
@Override
@@ -63,20 +71,32 @@ public List<String> getProviders() {
6371
}
6472

6573
@Transactional(readOnly = true)
66-
public VoltageInitResult getResult(UUID resultUuid) {
74+
public VoltageInitResult getResult(UUID resultUuid, String stringGlobalFilters, UUID networkUuid, String variantId) {
6775
Optional<VoltageInitResultEntity> result = resultService.find(resultUuid);
68-
return result.map(VoltageInitService::fromEntity).orElse(null);
76+
77+
List<String> voltageLevelIds;
78+
// get global filters
79+
GlobalFilter globalFilter = FilterUtils.fromStringGlobalFiltersToDTO(stringGlobalFilters, objectMapper);
80+
if (globalFilter != null) {
81+
voltageLevelIds = filterService.getResourceFilters(networkUuid, variantId, globalFilter);
82+
} else {
83+
voltageLevelIds = null;
84+
}
85+
86+
return result.map(entity -> VoltageInitService.fromEntity(entity, voltageLevelIds)).orElse(null);
6987
}
7088

71-
private static VoltageInitResult fromEntity(VoltageInitResultEntity resultEntity) {
89+
private static VoltageInitResult fromEntity(VoltageInitResultEntity resultEntity, List<String> voltageLevelIds) {
7290
LinkedHashMap<String, String> sortedIndicators = resultEntity.getIndicators().entrySet()
7391
.stream()
7492
.sorted(Map.Entry.comparingByKey(String.CASE_INSENSITIVE_ORDER))
7593
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (collisionValue1, collisionValue2) -> collisionValue1, LinkedHashMap::new));
7694
List<ReactiveSlack> reactiveSlacks = resultEntity.getReactiveSlacks().stream()
77-
.map(slack -> new ReactiveSlack(slack.getBusId(), slack.getSlack()))
95+
.filter(slack -> CollectionUtils.isEmpty(voltageLevelIds) || voltageLevelIds.contains(slack.getVoltageLevelId()))
96+
.map(slack -> new ReactiveSlack(slack.getVoltageLevelId(), slack.getBusId(), slack.getSlack()))
7897
.toList();
7998
List<BusVoltage> busVoltages = resultEntity.getBusVoltages().stream()
99+
.filter(bv -> CollectionUtils.isEmpty(voltageLevelIds) || voltageLevelIds.contains(bv.getVoltageLevelId()))
80100
.map(bv -> new BusVoltage(bv.getVoltageLevelId(), bv.getBusId(), bv.getV(), bv.getAngle()))
81101
.toList();
82102
return new VoltageInitResult(resultEntity.getResultUuid(), resultEntity.getWriteTimeStamp(), sortedIndicators,

0 commit comments

Comments
 (0)