Skip to content

Commit a534dd7

Browse files
authored
Updating LF params now only invalidate security nodes (#824)
Signed-off-by: LE SAULNIER Kevin <[email protected]>
1 parent 0aacfdd commit a534dd7

File tree

5 files changed

+45
-26
lines changed

5 files changed

+45
-26
lines changed

src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkNodeInfoRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
package org.gridsuite.study.server.repository.rootnetwork;
88

99
import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus;
10+
import org.gridsuite.study.server.networkmodificationtree.entities.NetworkModificationNodeType;
1011
import org.gridsuite.study.server.networkmodificationtree.entities.RootNetworkNodeInfoEntity;
1112
import org.springframework.data.jpa.repository.EntityGraph;
1213
import org.springframework.data.jpa.repository.JpaRepository;
@@ -54,6 +55,8 @@ public interface RootNetworkNodeInfoRepository extends JpaRepository<RootNetwork
5455

5556
List<RootNetworkNodeInfoEntity> findAllByRootNetworkStudyIdAndLoadFlowResultUuidNotNull(UUID studyUuid);
5657

58+
List<RootNetworkNodeInfoEntity> findAllByRootNetworkStudyIdAndNodeInfoNodeTypeAndLoadFlowResultUuidNotNull(UUID studyUuid, NetworkModificationNodeType nodeType);
59+
5760
@Query("SELECT count(rnni) > 0 from RootNetworkNodeInfoEntity rnni LEFT JOIN rnni.rootNetwork rn LEFT JOIN rn.study s " +
5861
"where s.id = :studyUuid and (rnni.nodeBuildStatus.globalBuildStatus = :buildStatus or rnni.nodeBuildStatus.localBuildStatus = :buildStatus)")
5962
boolean existsByStudyUuidAndBuildStatus(UUID studyUuid, BuildStatus buildStatus);

src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.gridsuite.study.server.dto.timeseries.TimelineEventInfos;
2121
import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus;
2222
import org.gridsuite.study.server.networkmodificationtree.entities.NetworkModificationNodeInfoEntity;
23+
import org.gridsuite.study.server.networkmodificationtree.entities.NetworkModificationNodeType;
2324
import org.gridsuite.study.server.networkmodificationtree.entities.NodeBuildStatusEmbeddable;
2425
import org.gridsuite.study.server.networkmodificationtree.entities.RootNetworkNodeInfoEntity;
2526
import org.gridsuite.study.server.repository.StudyEntity;
@@ -382,7 +383,7 @@ public List<RootNetworkNodeInfoEntity> getRootNetworkNodes(UUID rootNetworkUuid,
382383
}
383384

384385
public List<RootNetworkNodeInfoEntity> getAllByStudyUuidWithLoadFlowResultsNotNull(UUID studyUuid) {
385-
return rootNetworkNodeInfoRepository.findAllByRootNetworkStudyIdAndLoadFlowResultUuidNotNull(studyUuid);
386+
return rootNetworkNodeInfoRepository.findAllByRootNetworkStudyIdAndNodeInfoNodeTypeAndLoadFlowResultUuidNotNull(studyUuid, NetworkModificationNodeType.SECURITY);
386387
}
387388

388389
public void assertNoRootNetworkNodeIsBuilding(UUID studyUuid) {

src/main/java/org/gridsuite/study/server/service/StudyService.java

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1093,7 +1093,7 @@ private NonEvacuatedEnergyParametersInfos getNonEvacuatedEnergyParametersInfos(S
10931093
public boolean setLoadFlowParameters(UUID studyUuid, String parameters, String userId) {
10941094
StudyEntity studyEntity = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND));
10951095
boolean userProfileIssue = createOrUpdateLoadFlowParameters(studyEntity, parameters, userId);
1096-
invalidateNodeTreeWithLoadFlowResults(studyUuid);
1096+
invalidateAllStudyLoadFlowStatus(studyUuid);
10971097
invalidateSecurityAnalysisStatusOnAllNodes(studyUuid);
10981098
invalidateSensitivityAnalysisStatusOnAllNodes(studyUuid);
10991099
invalidateNonEvacuatedEnergyAnalysisStatusOnAllNodes(studyUuid);
@@ -1135,7 +1135,7 @@ private void updateProvider(UUID studyUuid, String userId, Consumer<StudyEntity>
11351135
public void updateLoadFlowProvider(UUID studyUuid, String provider, String userId) {
11361136
updateProvider(studyUuid, userId, studyEntity -> {
11371137
loadflowService.updateLoadFlowProvider(studyEntity.getLoadFlowParametersUuid(), provider);
1138-
invalidateNodeTreeWithLoadFlowResults(studyUuid);
1138+
invalidateAllStudyLoadFlowStatus(studyUuid);
11391139
notificationService.emitStudyChanged(studyUuid, null, null, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
11401140
notificationService.emitComputationParamsChanged(studyUuid, LOAD_FLOW);
11411141

@@ -1369,6 +1369,10 @@ public String getNetworkAreaDiagram(UUID nodeUuid, UUID rootNetworkUuid, String
13691369
}
13701370
}
13711371

1372+
private void invalidateLoadFlowStatusOnAllNodes(UUID studyUuid) {
1373+
loadflowService.invalidateLoadFlowStatus(rootNetworkNodeInfoService.getComputationResultUuids(studyUuid, LOAD_FLOW));
1374+
}
1375+
13721376
public void invalidateSecurityAnalysisStatusOnAllNodes(UUID studyUuid) {
13731377
securityAnalysisService.invalidateSaStatus(rootNetworkNodeInfoService.getComputationResultUuids(studyUuid, SECURITY_ANALYSIS));
13741378
}
@@ -1389,7 +1393,12 @@ public void invalidateDynamicSecurityAnalysisStatusOnAllNodes(UUID studyUuid) {
13891393
dynamicSecurityAnalysisService.invalidateStatus(rootNetworkNodeInfoService.getComputationResultUuids(studyUuid, DYNAMIC_SECURITY_ANALYSIS));
13901394
}
13911395

1392-
public void invalidateNodeTreeWithLoadFlowResults(UUID studyUuid) {
1396+
public void invalidateAllStudyLoadFlowStatus(UUID studyUuid) {
1397+
invalidateSecurityNodeTreeWithLoadFlowResults(studyUuid);
1398+
invalidateLoadFlowStatusOnAllNodes(studyUuid);
1399+
}
1400+
1401+
private void invalidateSecurityNodeTreeWithLoadFlowResults(UUID studyUuid) {
13931402
Map<UUID, List<RootNetworkNodeInfoEntity>> rootNetworkNodeInfosWithLFByRootNetwork = rootNetworkNodeInfoService.getAllByStudyUuidWithLoadFlowResultsNotNull(studyUuid).stream()
13941403
.collect(Collectors.groupingBy(rootNetworkNodeInfoEntity -> rootNetworkNodeInfoEntity.getRootNetwork().getId()));
13951404

@@ -3082,7 +3091,7 @@ public void updateNonEvacuatedEnergyParameters(UUID studyUuid, NonEvacuatedEnerg
30823091

30833092
@Transactional
30843093
public void invalidateLoadFlowStatus(UUID studyUuid, String userId) {
3085-
invalidateNodeTreeWithLoadFlowResults(studyUuid);
3094+
invalidateAllStudyLoadFlowStatus(studyUuid);
30863095
notificationService.emitStudyChanged(studyUuid, null, null, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
30873096
notificationService.emitElementUpdated(studyUuid, userId);
30883097
}

src/main/java/org/gridsuite/study/server/service/SupervisionService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import java.util.stream.Stream;
3939

4040
import static org.gridsuite.study.server.StudyException.Type.ELEMENT_NOT_FOUND;
41+
import static org.gridsuite.study.server.dto.ComputationType.LOAD_FLOW;
4142

4243
/**
4344
* @author Hugo Marcellin <hugo.marcelin at rte-france.com>
@@ -197,7 +198,7 @@ private Integer deleteLoadflowResults() {
197198
startTime.set(System.nanoTime());
198199
List<RootNetworkNodeInfoEntity> rootNetworkNodeInfoEntities = rootNetworkNodeInfoRepository.findAllByLoadFlowResultUuidNotNull();
199200
List<UUID> studyUuids = rootNetworkNodeInfoEntities.stream().map(rnnie -> rnnie.getRootNetwork().getStudy().getId()).distinct().toList();
200-
studyUuids.forEach(studyService::invalidateNodeTreeWithLoadFlowResults);
201+
studyUuids.forEach(studyService::invalidateAllStudyLoadFlowStatus);
201202
LOGGER.trace(DELETION_LOG_MESSAGE, ComputationType.LOAD_FLOW, TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
202203
return rootNetworkNodeInfoEntities.size();
203204
}

src/test/java/org/gridsuite/study/server/LoadFlowTest.java

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,8 @@ public MockResponse dispatch(RecordedRequest request) {
276276
return new MockResponse(404);
277277
} else if (path.matches("/v1/results/invalidate-status\\?resultUuid=" + LOADFLOW_RESULT_UUID)) {
278278
return new MockResponse(200);
279+
} else if (path.matches("/v1/results/invalidate-status\\?resultUuid=" + LOADFLOW_RESULT_UUID + "&resultUuid=" + LOADFLOW_OTHER_NODE_RESULT_UUID)) {
280+
return new MockResponse(200);
279281
} else if (path.matches("/v1/results/" + LOADFLOW_RESULT_UUID + "/stop.*")
280282
|| path.matches("/v1/results/" + LOADFLOW_OTHER_NODE_RESULT_UUID + "/stop.*")) {
281283
String resultUuid = path.matches(".*variantId=" + VARIANT_ID_2 + ".*") ? LOADFLOW_OTHER_NODE_RESULT_UUID : LOADFLOW_RESULT_UUID;
@@ -365,15 +367,15 @@ void testLoadFlow(final MockWebServer server) throws Exception {
365367
StudyEntity studyEntity = insertDummyStudy(UUID.fromString(NETWORK_UUID_STRING), CASE_LOADFLOW_UUID, LOADFLOW_PARAMETERS_UUID);
366368
UUID studyNameUserIdUuid = studyEntity.getId();
367369
UUID rootNodeUuid = getRootNode(studyNameUserIdUuid).getId();
368-
NetworkModificationNode modificationNode1 = createNetworkModificationNode(studyNameUserIdUuid, rootNodeUuid,
370+
NetworkModificationNode modificationNode1 = createNetworkModificationConstructionNode(studyNameUserIdUuid, rootNodeUuid,
369371
UUID.randomUUID(), VARIANT_ID, "node 1");
370372
UUID modificationNode1Uuid = modificationNode1.getId();
371373

372-
NetworkModificationNode modificationNode2 = createNetworkModificationNode(studyNameUserIdUuid,
374+
NetworkModificationNode modificationNode2 = createNetworkModificationConstructionNode(studyNameUserIdUuid,
373375
modificationNode1Uuid, UUID.randomUUID(), VARIANT_ID, "node 2");
374376
UUID modificationNode2Uuid = modificationNode2.getId();
375377

376-
NetworkModificationNode modificationNode3 = createNetworkModificationNode(studyNameUserIdUuid,
378+
NetworkModificationNode modificationNode3 = createNetworkModificationConstructionNode(studyNameUserIdUuid,
377379
modificationNode2Uuid, UUID.randomUUID(), VARIANT_ID_2, "node 3");
378380

379381
NetworkModificationNode modificationNode4 = createNetworkModificationNode(studyNameUserIdUuid,
@@ -553,6 +555,7 @@ void testInvalidateStatus(final MockWebServer server) throws Exception {
553555
// invalidating loadflow (with security node) invalidate node, their children and their computations
554556
checkUpdateModelsStatusMessagesReceived(studyNameUserIdUuid, modificationNode1Uuid);
555557
checkUpdateModelStatusMessagesReceived(studyNameUserIdUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
558+
assertRequestsDone(server, List.of("/v1/results/invalidate-status\\?resultUuid=.*"));
556559
}
557560

558561
@Test
@@ -562,11 +565,11 @@ void testDeleteLoadFlowResults(final MockWebServer server) throws Exception {
562565
UUID studyNameUserIdUuid = studyEntity.getId();
563566
UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid);
564567
UUID rootNodeUuid = getRootNode(studyNameUserIdUuid).getId();
565-
NetworkModificationNode modificationNode1 = createNetworkModificationNode(studyNameUserIdUuid, rootNodeUuid,
568+
NetworkModificationNode modificationNode1 = createNetworkModificationConstructionNode(studyNameUserIdUuid, rootNodeUuid,
566569
UUID.randomUUID(), VARIANT_ID, "node 1");
567570
UUID modificationNode1Uuid = modificationNode1.getId();
568571

569-
NetworkModificationNode modificationNode2 = createNetworkModificationNode(studyNameUserIdUuid,
572+
NetworkModificationNode modificationNode2 = createNetworkModificationConstructionNode(studyNameUserIdUuid,
570573
modificationNode1Uuid, UUID.randomUUID(), VARIANT_ID, "node 2");
571574
UUID modificationNode2Uuid = modificationNode2.getId();
572575

@@ -602,7 +605,7 @@ void testResetUuidResultWhenLFFailed() throws Exception {
602605
UUID resultUuid = UUID.randomUUID();
603606
StudyEntity studyEntity = insertDummyStudy(UUID.randomUUID(), UUID.randomUUID(), LOADFLOW_PARAMETERS_UUID);
604607
RootNode rootNode = networkModificationTreeService.getStudyTree(studyEntity.getId(), null);
605-
NetworkModificationNode modificationNode = createNetworkModificationNode(studyEntity.getId(), rootNode.getId(), UUID.randomUUID(), VARIANT_ID, "node 1");
608+
NetworkModificationNode modificationNode = createNetworkModificationConstructionNode(studyEntity.getId(), rootNode.getId(), UUID.randomUUID(), VARIANT_ID, "node 1");
606609
UUID rootNetworkUuid = studyEntity.getFirstRootNetwork().getId();
607610
String resultUuidJson = objectMapper.writeValueAsString(new NodeReceiver(modificationNode.getId(), rootNetworkUuid));
608611

@@ -677,7 +680,7 @@ void testNoResult() throws Exception {
677680
UUID studyNameUserIdUuid = studyEntity.getId();
678681
UUID firstRootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyNameUserIdUuid);
679682
UUID rootNodeUuid = getRootNode(studyNameUserIdUuid).getId();
680-
NetworkModificationNode modificationNode1 = createNetworkModificationNode(studyNameUserIdUuid, rootNodeUuid,
683+
NetworkModificationNode modificationNode1 = createNetworkModificationConstructionNode(studyNameUserIdUuid, rootNodeUuid,
681684
UUID.randomUUID(), VARIANT_ID, "node 1");
682685
UUID modificationNode1Uuid = modificationNode1.getId();
683686

@@ -907,22 +910,22 @@ void testInvalidateNodesAfterLoadflow(final MockWebServer server) throws Excepti
907910
UUID studyUuid = studyEntity.getId();
908911
UUID rootNetworkUuid = studyTestUtils.getOneRootNetworkUuid(studyUuid);
909912
RootNode rootNode = getRootNode(studyUuid);
910-
NetworkModificationNode node1 = createNetworkModificationNode(studyUuid, rootNode.getId(), UUID.randomUUID(), "variant1", "N1");
911-
NetworkModificationNode node2 = createNetworkModificationNode(studyUuid, node1.getId(), UUID.randomUUID(), "variant2", "N2");
912-
NetworkModificationNode node3 = createNetworkModificationNode(studyUuid, node1.getId(), UUID.randomUUID(), "variant3", "N3");
913+
NetworkModificationNode node1 = createNetworkModificationConstructionNode(studyUuid, rootNode.getId(), UUID.randomUUID(), "variant1", "N1");
914+
NetworkModificationNode node2 = createNetworkModificationConstructionNode(studyUuid, node1.getId(), UUID.randomUUID(), "variant2", "N2");
915+
NetworkModificationNode node3 = createNetworkModificationNode(studyUuid, node1.getId(), UUID.randomUUID(), "variant3", "N3", NetworkModificationNodeType.SECURITY);
913916

914917
/*
915918
* R
916919
* |
917-
* N1
920+
* N1(C)
918921
* | |
919-
* N2 N3
922+
* N2(C) N3(S)
920923
*/
921924
updateNodeBuildStatus(node1.getId(), rootNetworkUuid, BuildStatus.BUILT);
922925
updateNodeBuildStatus(node2.getId(), rootNetworkUuid, BuildStatus.BUILT);
923926
updateNodeBuildStatus(node3.getId(), rootNetworkUuid, BuildStatus.BUILT);
924-
updateLoadflowResultUuid(node2.getId(), rootNetworkUuid, UUID.randomUUID());
925-
updateLoadflowResultUuid(node3.getId(), rootNetworkUuid, UUID.randomUUID());
927+
updateLoadflowResultUuid(node2.getId(), rootNetworkUuid, UUID.fromString(LOADFLOW_RESULT_UUID));
928+
updateLoadflowResultUuid(node3.getId(), rootNetworkUuid, UUID.fromString(LOADFLOW_OTHER_NODE_RESULT_UUID));
926929

927930
/*
928931
* R
@@ -931,7 +934,9 @@ void testInvalidateNodesAfterLoadflow(final MockWebServer server) throws Excepti
931934
* | |
932935
* N2* N3*
933936
*
934-
* All nodes are BUILT, N2 and N3 have loadflow results - they will be invalidated
937+
* All nodes are BUILT, N2 and N3 have loadflow results
938+
* N2 is construction - its loadflow computation will be invalidated
939+
* N3 is security - it will be invalidated
935940
*/
936941

937942
// run loadflow invalidation on all study
@@ -940,16 +945,16 @@ void testInvalidateNodesAfterLoadflow(final MockWebServer server) throws Excepti
940945
// node2 and node3 will be invalidated with their children, but the order in which way they are invalidated is not deterministic
941946
// this is why we don't check node uuid here for those two calls
942947
checkUpdateModelsStatusMessagesReceived(studyUuid);
943-
checkUpdateModelsStatusMessagesReceived(studyUuid);
944948

945949
checkUpdateModelStatusMessagesReceived(studyUuid, NotificationService.UPDATE_TYPE_LOADFLOW_STATUS);
946950

947-
var requests = TestUtils.getRequestsDone(4, server);
951+
var requests = TestUtils.getRequestsDone(3, server);
948952
assertTrue(requests.stream().anyMatch(r -> r.matches("/v1/results\\?resultsUuids=.*")));
949953
assertTrue(requests.stream().anyMatch(r -> r.matches("/v1/reports")));
954+
assertTrue(requests.stream().anyMatch(r -> r.matches("/v1/results/invalidate-status\\?resultUuid=.*")));
950955

951956
assertEquals(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT), rootNetworkNodeInfoService.getRootNetworkNodeInfo(node1.getId(), rootNetworkUuid).map(RootNetworkNodeInfoEntity::getNodeBuildStatus).orElseThrow());
952-
assertEquals(NodeBuildStatusEmbeddable.from(BuildStatus.NOT_BUILT), rootNetworkNodeInfoService.getRootNetworkNodeInfo(node2.getId(), rootNetworkUuid).map(RootNetworkNodeInfoEntity::getNodeBuildStatus).orElseThrow());
957+
assertEquals(NodeBuildStatusEmbeddable.from(BuildStatus.BUILT), rootNetworkNodeInfoService.getRootNetworkNodeInfo(node2.getId(), rootNetworkUuid).map(RootNetworkNodeInfoEntity::getNodeBuildStatus).orElseThrow());
953958
assertEquals(NodeBuildStatusEmbeddable.from(BuildStatus.NOT_BUILT), rootNetworkNodeInfoService.getRootNetworkNodeInfo(node3.getId(), rootNetworkUuid).map(RootNetworkNodeInfoEntity::getNodeBuildStatus).orElseThrow());
954959
}
955960

@@ -983,8 +988,8 @@ private RootNode getRootNode(UUID study) throws Exception {
983988
.getContentAsString(), new TypeReference<>() { });
984989
}
985990

986-
private NetworkModificationNode createNetworkModificationNode(UUID studyUuid, UUID parentNodeUuid,
987-
UUID modificationGroupUuid, String variantId, String nodeName) throws Exception {
991+
private NetworkModificationNode createNetworkModificationConstructionNode(UUID studyUuid, UUID parentNodeUuid,
992+
UUID modificationGroupUuid, String variantId, String nodeName) throws Exception {
988993
return createNetworkModificationNode(studyUuid, parentNodeUuid, modificationGroupUuid, variantId, nodeName, NetworkModificationNodeType.CONSTRUCTION);
989994
}
990995

0 commit comments

Comments
 (0)