Skip to content

Commit 457ef47

Browse files
author
Slimane AMAR
committed
Unbuild a subtree
Signed-off-by: Slimane AMAR <[email protected]>
1 parent 281d29f commit 457ef47

File tree

4 files changed

+112
-40
lines changed

4 files changed

+112
-40
lines changed

src/main/java/org/gridsuite/study/server/dto/InvalidateNodeInfos.java

+28-9
Original file line numberDiff line numberDiff line change
@@ -24,29 +24,24 @@
2424
public class InvalidateNodeInfos {
2525
private UUID networkUuid;
2626

27-
private List<UUID> reportUuids = new ArrayList<>();
27+
private List<UUID> nodeUuids = new ArrayList<>();
28+
private List<UUID> groupUuids = new ArrayList<>();
2829

30+
private List<UUID> reportUuids = new ArrayList<>();
2931
private List<String> variantIds = new ArrayList<>();
3032

3133
private List<UUID> loadFlowResultUuids = new ArrayList<>();
32-
3334
private List<UUID> securityAnalysisResultUuids = new ArrayList<>();
34-
3535
private List<UUID> sensitivityAnalysisResultUuids = new ArrayList<>();
3636
private List<UUID> nonEvacuatedEnergyResultUuids = new ArrayList<>();
37-
3837
private List<UUID> shortCircuitAnalysisResultUuids = new ArrayList<>();
3938
private List<UUID> oneBusShortCircuitAnalysisResultUuids = new ArrayList<>();
40-
4139
private List<UUID> voltageInitResultUuids = new ArrayList<>();
40+
private List<UUID> stateEstimationResultUuids = new ArrayList<>();
4241

4342
private List<UUID> dynamicSimulationResultUuids = new ArrayList<>();
4443
private List<UUID> dynamicSecurityAnalysisResultUuids = new ArrayList<>();
4544

46-
private List<UUID> stateEstimationResultUuids = new ArrayList<>();
47-
48-
private List<UUID> groupUuids = new ArrayList<>();
49-
5045
public void addReportUuid(UUID reportUuid) {
5146
reportUuids.add(reportUuid);
5247
}
@@ -98,4 +93,28 @@ public void addStateEstimationResultUuid(UUID stateEstimationResultUuid) {
9893
public void addGroupUuid(List<UUID> groupUuids) {
9994
this.groupUuids.addAll(groupUuids);
10095
}
96+
97+
public void addNodeUuid(UUID nodeUuid) {
98+
this.groupUuids.add(nodeUuid);
99+
}
100+
101+
public void add(InvalidateNodeInfos invalidateNodeInfos) {
102+
nodeUuids.addAll(invalidateNodeInfos.getNodeUuids());
103+
groupUuids.addAll(invalidateNodeInfos.getGroupUuids());
104+
105+
reportUuids.addAll(invalidateNodeInfos.getReportUuids());
106+
variantIds.addAll(invalidateNodeInfos.getVariantIds());
107+
108+
loadFlowResultUuids.addAll(invalidateNodeInfos.getLoadFlowResultUuids());
109+
securityAnalysisResultUuids.addAll(invalidateNodeInfos.getSecurityAnalysisResultUuids());
110+
sensitivityAnalysisResultUuids.addAll(invalidateNodeInfos.getSensitivityAnalysisResultUuids());
111+
nonEvacuatedEnergyResultUuids.addAll(invalidateNodeInfos.getNonEvacuatedEnergyResultUuids());
112+
shortCircuitAnalysisResultUuids.addAll(invalidateNodeInfos.getShortCircuitAnalysisResultUuids());
113+
oneBusShortCircuitAnalysisResultUuids.addAll(invalidateNodeInfos.getOneBusShortCircuitAnalysisResultUuids());
114+
voltageInitResultUuids.addAll(invalidateNodeInfos.getVoltageInitResultUuids());
115+
stateEstimationResultUuids.addAll(invalidateNodeInfos.getStateEstimationResultUuids());
116+
117+
dynamicSimulationResultUuids.addAll(invalidateNodeInfos.getDynamicSimulationResultUuids());
118+
dynamicSecurityAnalysisResultUuids.addAll(invalidateNodeInfos.getDynamicSecurityAnalysisResultUuids());
119+
}
101120
}

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

+63-11
Original file line numberDiff line numberDiff line change
@@ -788,7 +788,7 @@ public void invalidateBuild(UUID nodeUuid, UUID rootNetworkUuid, boolean invalid
788788
changedNodes.add(nodeUuid);
789789
UUID studyId = self.getStudyUuidForNodeId(nodeUuid);
790790
nodesRepository.findById(nodeUuid).ifPresent(nodeEntity -> {
791-
fillIndexedModificationsInfosToInvalidate(invalidateNodeInfos, nodeUuid, rootNetworkUuid, invalidateOnlyChildrenBuildStatus);
791+
fillIndexedNodeInfosToInvalidate(invalidateNodeInfos, nodeUuid, rootNetworkUuid, invalidateOnlyChildrenBuildStatus);
792792
if (rootNetworkService.exists(rootNetworkUuid)) {
793793
if (nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION)) {
794794
rootNetworkNodeInfoService.invalidateRootNetworkNodeInfoProper(nodeUuid, rootNetworkUuid, invalidateNodeInfos, invalidateOnlyChildrenBuildStatus, changedNodes, deleteVoltageInitResults);
@@ -800,7 +800,7 @@ public void invalidateBuild(UUID nodeUuid, UUID rootNetworkUuid, boolean invalid
800800
notificationService.emitNodeBuildStatusUpdated(studyId, changedNodes.stream().distinct().collect(Collectors.toList()), rootNetworkUuid);
801801
}
802802

803-
private void fillIndexedModificationsInfosToInvalidate(InvalidateNodeInfos invalidateNodeInfos, UUID nodeUuid, UUID rootNetworkUuid, boolean invalidateOnlyChildrenBuildStatus) {
803+
private void fillIndexedNodeInfosToInvalidate(InvalidateNodeInfos invalidateNodeInfos, UUID nodeUuid, UUID rootNetworkUuid, boolean invalidateOnlyChildrenBuildStatus) {
804804
// when invalidating node
805805
// we need to invalidate indexed modifications up to it's last built parent, not included
806806
boolean isNodeBuilt = self.getNodeBuildStatus(nodeUuid, rootNetworkUuid).isBuilt();
@@ -809,10 +809,10 @@ private void fillIndexedModificationsInfosToInvalidate(InvalidateNodeInfos inval
809809
}
810810

811811
if (isNodeBuilt && invalidateOnlyChildrenBuildStatus) {
812-
fillIndexedModificationsInfosToInvalidate(nodeUuid, false, invalidateNodeInfos);
812+
fillIndexedNodeInfosToInvalidate(nodeUuid, false, invalidateNodeInfos);
813813
} else {
814814
NodeEntity closestNodeWithParentHavingBuiltDescendent = getSubTreeToInvalidateIndexedModifications(nodeUuid, rootNetworkUuid);
815-
fillIndexedModificationsInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
815+
fillIndexedNodeInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
816816
}
817817
}
818818

@@ -823,13 +823,33 @@ public InvalidateNodeInfos unbuildNode(UUID nodeUuid, UUID rootNetworkUuid) {
823823

824824
InvalidateNodeInfos invalidateNodeInfos = rootNetworkNodeInfoService.unbuildRootNetworkNode(nodeUuid, rootNetworkUuid);
825825

826-
fillIndexedModificationsInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos);
826+
fillIndexedNodeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos);
827827

828828
notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), List.of(nodeUuid), rootNetworkUuid);
829829

830830
return invalidateNodeInfos;
831831
}
832832

833+
@Transactional
834+
// old name: invalidateBuild
835+
public InvalidateNodeInfos unbuildNodeTree(UUID nodeUuid, UUID rootNetworkUuid) {
836+
NodeEntity nodeEntity = getNodeEntity(nodeUuid);
837+
838+
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();
839+
840+
// First node
841+
if (nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION)) {
842+
invalidateNodeInfos = rootNetworkNodeInfoService.unbuildRootNetworkNode(nodeUuid, rootNetworkUuid);
843+
fillIndexedNodeTreeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos);
844+
}
845+
846+
invalidateNodeInfos.add(unbuildChildrenNodes(nodeUuid, rootNetworkUuid));
847+
848+
notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), invalidateNodeInfos.getNodeUuids().stream().distinct().collect(Collectors.toList()), rootNetworkUuid);
849+
850+
return invalidateNodeInfos;
851+
}
852+
833853
@Transactional
834854
// method used when moving a node to invalidate it without impacting other nodes
835855
public void invalidateBuildOfNodeOnly(UUID nodeUuid, UUID rootNetworkUuid, boolean invalidateOnlyChildrenBuildStatus, InvalidateNodeInfos invalidateNodeInfos, boolean deleteVoltageInitResults) {
@@ -849,7 +869,7 @@ public void invalidateBuildOfNodeOnly(UUID nodeUuid, UUID rootNetworkUuid, boole
849869
if (!hasAnyBuiltChildren(getNodeEntity(nodeUuid), rootNetworkUuid)) {
850870
// when invalidating nodes, we need to get last built parent to invalidate all its children modifications in elasticsearch
851871
NodeEntity closestNodeWithParentHavingBuiltDescendent = getSubTreeToInvalidateIndexedModifications(nodeUuid, rootNetworkUuid);
852-
fillIndexedModificationsInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
872+
fillIndexedNodeInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
853873
}
854874

855875
notificationService.emitNodeBuildStatusUpdated(studyId, changedNodes.stream().distinct().collect(Collectors.toList()), rootNetworkUuid);
@@ -904,16 +924,48 @@ && hasAnyBuiltChildren(child, rootNetworkUuid, checkedChildren)) {
904924
return false;
905925
}
906926

907-
private void fillIndexedModificationsInfosToInvalidate(NodeEntity nodeEntity, UUID rootNetworkUuid, InvalidateNodeInfos invalidateNodeInfos) {
927+
private void fillIndexedNodeInfosToInvalidate(NodeEntity nodeEntity, UUID rootNetworkUuid, InvalidateNodeInfos invalidateNodeInfos) {
908928
// when manually invalidating a single node, if this node does not have any built children
909929
// we need to invalidate indexed modifications up to it's last built parent, not included
910-
if (!hasAnyBuiltChildren(nodeEntity, rootNetworkUuid)) {
911-
// when invalidating nodes, we need to get last built parent to invalidate all its children modifications in elasticsearch
930+
if (hasAnyBuiltChildren(nodeEntity, rootNetworkUuid)) {
931+
return;
932+
}
933+
934+
// when invalidating nodes, we need to get last built parent to invalidate all its children modifications in elasticsearch
935+
NodeEntity closestNodeWithParentHavingBuiltDescendent = getSubTreeToInvalidateIndexedModifications(nodeEntity.getIdNode(), rootNetworkUuid);
936+
fillIndexedNodeInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
937+
}
938+
939+
// OldName: fillIndexedModificationsInfosToInvalidate
940+
// For subTree
941+
private void fillIndexedNodeTreeInfosToInvalidate(NodeEntity nodeEntity, UUID rootNetworkUuid, InvalidateNodeInfos invalidateNodeInfos) {
942+
// when invalidating node
943+
// we need to invalidate indexed modifications up to it's last built parent, not included
944+
boolean isNodeBuilt = self.getNodeBuildStatus(nodeEntity.getIdNode(), rootNetworkUuid).isBuilt();
945+
if (!isNodeBuilt && !hasAnyBuiltChildren(getNodeEntity(nodeEntity.getIdNode()), rootNetworkUuid)) {
946+
return;
947+
}
948+
949+
// TODO check invalidateOnlyChildrenBuildStatus
950+
if (isNodeBuilt) {
951+
fillIndexedNodeInfosToInvalidate(nodeEntity.getIdNode(), false, invalidateNodeInfos);
952+
} else {
912953
NodeEntity closestNodeWithParentHavingBuiltDescendent = getSubTreeToInvalidateIndexedModifications(nodeEntity.getIdNode(), rootNetworkUuid);
913-
fillIndexedModificationsInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
954+
fillIndexedNodeInfosToInvalidate(closestNodeWithParentHavingBuiltDescendent.getIdNode(), true, invalidateNodeInfos);
914955
}
915956
}
916957

958+
// OldName: invalidateChildrenBuildStatus
959+
private InvalidateNodeInfos unbuildChildrenNodes(UUID nodeUuid, UUID rootNetworkUuid) {
960+
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();
961+
nodesRepository.findAllByParentNodeIdNode(nodeUuid)
962+
.forEach(child -> {
963+
invalidateNodeInfos.add(rootNetworkNodeInfoService.unbuildRootNetworkNode(child.getIdNode(), rootNetworkUuid));
964+
invalidateNodeInfos.add(unbuildChildrenNodes(child.getIdNode(), rootNetworkUuid));
965+
});
966+
return invalidateNodeInfos;
967+
}
968+
917969
private void invalidateChildrenBuildStatus(UUID nodeUuid, UUID rootNetworkUuid, List<UUID> changedNodes, InvalidateNodeInfos invalidateNodeInfos,
918970
boolean deleteVoltageInitResults) {
919971
nodesRepository.findAllByParentNodeIdNode(nodeUuid)
@@ -1053,7 +1105,7 @@ public long countBuiltNodes(UUID studyUuid, UUID rootNetworkUuid) {
10531105
return nodes.stream().filter(n -> self.getNodeBuildStatus(n.getIdNode(), rootNetworkUuid).isBuilt()).count();
10541106
}
10551107

1056-
private void fillIndexedModificationsInfosToInvalidate(UUID parentNodeUuid, boolean includeParentNode, InvalidateNodeInfos invalidateNodeInfos) {
1108+
private void fillIndexedNodeInfosToInvalidate(UUID parentNodeUuid, boolean includeParentNode, InvalidateNodeInfos invalidateNodeInfos) {
10571109
List<UUID> nodesToInvalidate = new ArrayList<>();
10581110
if (includeParentNode) {
10591111
nodesToInvalidate.add(parentNodeUuid);

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

+20-19
Original file line numberDiff line numberDiff line change
@@ -1724,7 +1724,8 @@ public void invalidateBuild(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid,
17241724
}
17251725
}
17261726

1727-
//OldName: invalidateBuild
1727+
// OldName: invalidateBuild part 1
1728+
// Only one node
17281729
private void unbuildNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
17291730
AtomicReference<Long> startTime = new AtomicReference<>(null);
17301731
startTime.set(System.nanoTime());
@@ -1740,6 +1741,24 @@ private void unbuildNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
17401741
}
17411742
}
17421743

1744+
// OldName: invalidateBuild part 2
1745+
// This is used to unbuild the node and its children
1746+
@Transactional
1747+
public void unbuildNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
1748+
AtomicReference<Long> startTime = new AtomicReference<>(null);
1749+
startTime.set(System.nanoTime());
1750+
1751+
InvalidateNodeInfos invalidateNodeInfos = networkModificationTreeService.unbuildNodeTree(nodeUuid, rootNetworkUuid);
1752+
invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid));
1753+
1754+
deleteInvalidationInfos(invalidateNodeInfos);
1755+
1756+
if (startTime.get() != null) {
1757+
LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid,
1758+
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
1759+
}
1760+
}
1761+
17431762
public void deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) {
17441763
CompletableFuture<Void> executeInParallel = CompletableFuture.allOf(
17451764
studyServerExecutionService.runAsync(() -> networkModificationService.deleteIndexedModifications(invalidateNodeInfos.getGroupUuids(), invalidateNodeInfos.getNetworkUuid())),
@@ -1767,24 +1786,6 @@ public void deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) {
17671786

17681787
}
17691788

1770-
//OldName: invalidateBuild part 2
1771-
// this is used to unbuild the node and its children
1772-
public void unbuildNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
1773-
AtomicReference<Long> startTime = new AtomicReference<>(null);
1774-
startTime.set(System.nanoTime());
1775-
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();
1776-
invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid));
1777-
1778-
//TODO: change invalidateBuild methode later
1779-
networkModificationTreeService.invalidateBuild(nodeUuid, rootNetworkUuid, false, invalidateNodeInfos, true);
1780-
deleteInvalidationInfos(invalidateNodeInfos);
1781-
1782-
if (startTime.get() != null) {
1783-
LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid,
1784-
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
1785-
}
1786-
}
1787-
17881789
private void updateStatuses(UUID studyUuid, UUID nodeUuid) {
17891790
updateStatuses(studyUuid, nodeUuid, true);
17901791
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ public void invalidateAllNodesBuilds(UUID studyUuid) {
323323
UUID rootNodeUuid = networkModificationTreeService.getStudyRootNodeUuid(studyUuid);
324324
//TODO: to parallelize ?
325325
studyService.getExistingBasicRootNetworkInfos(studyUuid).forEach(rootNetwork ->
326-
studyService.invalidateBuild(studyUuid, rootNodeUuid, rootNetwork.rootNetworkUuid(), false, false, true)
326+
studyService.unbuildNodeTree(studyUuid, rootNodeUuid, rootNetwork.rootNetworkUuid())
327327
);
328328

329329
LOGGER.trace("Nodes builds deletion for study {} in : {} seconds", studyUuid, TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));

0 commit comments

Comments
 (0)