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
Original file line number Diff line number Diff line change
Expand Up @@ -1331,7 +1331,7 @@ public ResponseEntity<Void> unbuildNode(@Parameter(description = "Study uuid") @
@Parameter(description = "nodeUuid") @PathVariable("nodeUuid") UUID nodeUuid,
@RequestHeader(HEADER_USER_ID) String userId) {
// unbuildStudyNode only reaches the children of a security node whose loadflow has run
NodeActivityType unbuildType = studyService.isSecurityNodeWithLoadflowDone(nodeUuid, rootNetworkUuid)
NodeActivityType unbuildType = networkModificationTreeService.isSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid)
? UNBUILD_CHILDREN : UNBUILD;
nodeActivityRunnerService.runWith(unbuildType, studyUuid, rootNetworkUuid, List.of(nodeUuid),
() -> studyService.unbuildStudyNode(studyUuid, nodeUuid, rootNetworkUuid, userId));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1072,48 +1072,6 @@ private BuildInfos getBuildInfos(UUID nodeUuid, UUID rootNetworkUuid) {
return buildInfos;
}

private InvalidateNodeInfos invalidateNode(UUID nodeUuid, UUID rootNetworkUuid) {
NodeEntity nodeEntity = getNodeEntity(nodeUuid);

InvalidateNodeInfos invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL);

fillIndexedNodeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos);

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

return invalidateNodeInfos;
}

private InvalidateNodeInfos invalidateNodeTree(UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) {
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();

// Node status before invalidation
NodeEntity nodeEntity = getNodeEntity(nodeUuid);
boolean isModificationNode = nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION);
boolean isNodeBuilt = doGetNodeBuildStatus(nodeEntity.getIdNode(), rootNetworkUuid).isBuilt();
boolean shouldInvalidateIndexedInfos = isNodeBuilt || hasAnyBuiltChildren(nodeEntity, rootNetworkUuid);

// First node
if (isModificationNode && !invalidateTreeParameters.isOnlyChildren()) {
invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, invalidateTreeParameters);
}

// Invalidate indexed nodes
if (shouldInvalidateIndexedInfos) {
fillIndexedNodeTreeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos,
isNodeBuilt && (invalidateTreeParameters.isOnlyChildren() || invalidateTreeParameters.isOnlyChildrenBuildStatus()));
}

// Children
invalidateNodeInfos.add(invalidateChildrenNodes(nodeUuid, rootNetworkUuid));

if (!invalidateNodeInfos.getNodeUuids().isEmpty()) {
notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), invalidateNodeInfos.getNodeUuids().stream().toList(), rootNetworkUuid);
}

return invalidateNodeInfos;
}

/** Children are always invalidated in full, whatever was asked of the node itself. */
private InvalidateNodeInfos invalidateChildrenNodes(UUID nodeUuid, UUID rootNetworkUuid) {
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();
Expand Down Expand Up @@ -1386,30 +1344,21 @@ public ExportNetworkStatus getExportNetworkStatus(UUID exportUuid) {
}

@Transactional
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) {
AtomicReference<Long> startTime = new AtomicReference<>(null);
startTime.set(System.nanoTime());

InvalidateNodeInfos invalidateNodeInfos = invalidateNodeTree(nodeUuid, rootNetworkUuid, invalidateTreeParameters);
invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid));
deleteInvalidationInfos(invalidateNodeInfos, skipDeleteVariants);

if (!isRootNode(nodeUuid)) {
emitAllComputationStatusChanged(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters.computationsInvalidationMode());
}

if (startTime.get() != null) {
LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid,
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
}
public void invalidateNode(UUID studyUuid, UUID nodeUuid) {
rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
handleInvalidateNode(studyUuid, nodeUuid, rootNetworkEntity.getId()));
}

@Transactional
public void invalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
handleInvalidateNode(studyUuid, nodeUuid, rootNetworkUuid);
}

private void handleInvalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
AtomicReference<Long> startTime = new AtomicReference<>(null);
startTime.set(System.nanoTime());

InvalidateNodeInfos invalidateNodeInfos = invalidateNode(nodeUuid, rootNetworkUuid);
InvalidateNodeInfos invalidateNodeInfos = handleInvalidateNode(nodeUuid, rootNetworkUuid);
invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid));

deleteInvalidationInfos(invalidateNodeInfos);
Expand All @@ -1421,6 +1370,18 @@ public void invalidateNode(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid)
}
}

private InvalidateNodeInfos handleInvalidateNode(UUID nodeUuid, UUID rootNetworkUuid) {
NodeEntity nodeEntity = getNodeEntity(nodeUuid);

InvalidateNodeInfos invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL);

fillIndexedNodeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos);

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

return invalidateNodeInfos;
}

private CompletableFuture<Void> deleteInvalidationInfos(InvalidateNodeInfos invalidateNodeInfos) {
return deleteInvalidationInfos(invalidateNodeInfos, false);
}
Expand Down Expand Up @@ -1451,4 +1412,104 @@ private void emitAllComputationStatusChanged(UUID studyUuid, UUID nodeUuid, UUID
notificationService.emitStudyChanged(studyUuid, nodeUuid, rootNetworkUuid, NotificationService.UPDATE_TYPE_ALL_COMPUTATION_STATUS);
}
}

@Transactional(readOnly = true)
public boolean isSecurityNodeWithLoadFlowDone(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) {
return testSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid);
}

private boolean testSecurityNodeWithLoadFlowDone(@NonNull UUID nodeUuid, @NonNull UUID rootNetworkUuid) {
return isSecurityNode(nodeUuid) && rootNetworkNodeInfoService.isLoadflowDone(nodeUuid, rootNetworkUuid);
}

@Transactional
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) {
handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters, skipDeleteVariants);
}

@Transactional
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid) {
handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, InvalidateNodeTreeParameters.ALL, false);
}

@Transactional
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters invalidateTreeParameters) {
rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), invalidateTreeParameters, false));
}

@Transactional
public void invalidateNodeTree(UUID studyUuid, UUID nodeUuid) {
rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkEntity.getId(), InvalidateNodeTreeParameters.ALL, false));
}

@Transactional
public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) {
rootNetworkService.getStudyRootNetworks(studyUuid).forEach(rootNetworkEntity ->
handleInvalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkEntity.getId(), computationsInvalidationMode)
);
}

@Transactional
public void invalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) {
handleInvalidateNodeTreeWithLF(studyUuid, nodeUuid, rootNetworkUuid, computationsInvalidationMode);
}

private void handleInvalidateNodeTreeWithLF(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode computationsInvalidationMode) {
boolean invalidateAll = testSecurityNodeWithLoadFlowDone(nodeUuid, rootNetworkUuid);
InvalidateNodeTreeParameters invalidateNodeTreeParameters = InvalidateNodeTreeParameters.builder()
.invalidationMode(invalidateAll ? InvalidateNodeTreeParameters.InvalidationMode.ALL : InvalidateNodeTreeParameters.InvalidationMode.ONLY_CHILDREN_BUILD_STATUS)
.computationsInvalidationMode(invalidateAll ? InvalidateNodeTreeParameters.ComputationsInvalidationMode.ALL : computationsInvalidationMode)
.build();
handleInvalidateNodeTree(studyUuid, nodeUuid, rootNetworkUuid, invalidateNodeTreeParameters, false);
}

private void handleInvalidateNodeTree(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters, boolean skipDeleteVariants) {
AtomicReference<Long> startTime = new AtomicReference<>(null);
startTime.set(System.nanoTime());

InvalidateNodeInfos invalidateNodeInfos = handleInvalidateNodeTree(nodeUuid, rootNetworkUuid, invalidateTreeParameters);
invalidateNodeInfos.setNetworkUuid(rootNetworkService.getNetworkUuid(rootNetworkUuid));
deleteInvalidationInfos(invalidateNodeInfos, skipDeleteVariants);

if (!isRootNode(nodeUuid)) {
emitAllComputationStatusChanged(studyUuid, nodeUuid, rootNetworkUuid, invalidateTreeParameters.computationsInvalidationMode());
}

if (startTime.get() != null) {
LOGGER.trace("unbuild node '{}' of study '{}' : {} seconds", nodeUuid, studyUuid,
TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - startTime.get()));
}
}

private InvalidateNodeInfos handleInvalidateNodeTree(UUID nodeUuid, UUID rootNetworkUuid, InvalidateNodeTreeParameters invalidateTreeParameters) {
InvalidateNodeInfos invalidateNodeInfos = new InvalidateNodeInfos();

// Node status before invalidation
NodeEntity nodeEntity = getNodeEntity(nodeUuid);
boolean isModificationNode = nodeEntity.getType().equals(NodeType.NETWORK_MODIFICATION);
boolean isNodeBuilt = doGetNodeBuildStatus(nodeEntity.getIdNode(), rootNetworkUuid).isBuilt();
boolean shouldInvalidateIndexedInfos = isNodeBuilt || hasAnyBuiltChildren(nodeEntity, rootNetworkUuid);

// First node
if (isModificationNode && !invalidateTreeParameters.isOnlyChildren()) {
invalidateNodeInfos = rootNetworkNodeInfoService.invalidateRootNetworkNode(nodeUuid, rootNetworkUuid, invalidateTreeParameters);
}

// Invalidate indexed nodes
if (shouldInvalidateIndexedInfos) {
fillIndexedNodeTreeInfosToInvalidate(nodeEntity, rootNetworkUuid, invalidateNodeInfos,
isNodeBuilt && (invalidateTreeParameters.isOnlyChildren() || invalidateTreeParameters.isOnlyChildrenBuildStatus()));
}

// Children
invalidateNodeInfos.add(invalidateChildrenNodes(nodeUuid, rootNetworkUuid));

if (!invalidateNodeInfos.getNodeUuids().isEmpty()) {
notificationService.emitNodeBuildStatusUpdated(nodeEntity.getStudy().getId(), invalidateNodeInfos.getNodeUuids().stream().toList(), rootNetworkUuid);
}

return invalidateNodeInfos;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
package org.gridsuite.study.server.service;

import org.gridsuite.study.server.dto.InvalidateNodeTreeParameters;
import org.gridsuite.study.server.dto.modification.ModificationMoveInfos;
import org.gridsuite.study.server.dto.modification.NetworkModificationMetadata;
import org.gridsuite.study.server.nodeactivity.NodeActivityRunnerService;
Expand Down Expand Up @@ -42,7 +43,7 @@ public void createNetworkModification(UUID studyUuid, UUID nodeUuid, String modi
}

private void handleCreateNetworkModification(UUID studyUuid, UUID nodeUuid, String modificationAttributes, String userId) {
studyService.invalidateNodeTreeWithLF(studyUuid, nodeUuid);
networkModificationTreeService.invalidateNodeTreeWithLF(studyUuid, nodeUuid, InvalidateNodeTreeParameters.ComputationsInvalidationMode.ALL);
studyService.createNetworkModification(studyUuid, nodeUuid, modificationAttributes, userId);
}

Expand Down
Loading
Loading