diff --git a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java index 876701ea8..bf5cbb0de 100644 --- a/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java +++ b/src/main/java/org/gridsuite/study/server/repository/rootnetwork/RootNetworkRepository.java @@ -28,6 +28,9 @@ public interface RootNetworkRepository extends JpaRepository findWithRootNetworkNodeInfosById(UUID rootNetworkUuid); + @EntityGraph(attributePaths = {"rootNetworkNodeInfos.modificationReports", "rootNetworkNodeInfos.computationReports"}, type = EntityGraph.EntityGraphType.LOAD) + Optional findWithRootNetworkNodeInfosAndReportsById(UUID rootNetworkUuid); + boolean existsByIdAndStudyId(UUID rootNetworkUuid, UUID studyUuid); int countAllByStudyId(UUID studyUuid); diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java index c54fd5abc..002b34baf 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkNodeInfoService.java @@ -640,20 +640,6 @@ public void deleteRootNetworkNodeRemoteInfos(List rootNetwo CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); } - // New method specifically for the supervision/invalidate path - @Transactional(readOnly = true) - public void deleteRootNetworkNodeRemoteInfosByUuids(List rootNetworkUuids) { - if (rootNetworkUuids == null || rootNetworkUuids.isEmpty()) { - return; - } - List rootNetworkNodeInfos = rootNetworkUuids.stream() - .flatMap(rnUuid -> rootNetworkNodeInfoRepository.findAllByRootNetworkId(rnUuid).stream()) - .map(RootNetworkNodeInfoEntity::toDto) - .toList(); - // Do not wait completion and do not throw exception - CompletableFuture.allOf(getRemoteDeletions(getRemoteDeletionInfos(rootNetworkNodeInfos)).toArray(CompletableFuture[]::new)); - } - @Transactional public ModificationApplicationContext getNetworkModificationApplicationContext(UUID rootNetworkUuid, UUID nodeUuid, UUID networkUuid) { RootNetworkNodeInfoEntity rootNetworkNodeInfoEntity = rootNetworkNodeInfoRepository.findWithModificationsToExcludeByNodeInfoIdAndRootNetworkId(nodeUuid, rootNetworkUuid).orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found")); diff --git a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java index 0c73da75a..b6771b787 100644 --- a/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java +++ b/src/main/java/org/gridsuite/study/server/service/RootNetworkService.java @@ -239,36 +239,25 @@ public void deleteRootNetworks(StudyEntity studyEntity, Stream rootNetwork } public void deleteRootNetworks(StudyEntity studyEntity, List rootNetworksInfos) { - deleteRootNetworkRemoteInfos(rootNetworksInfos); + invalidateRootNetworkRemoteInfos(rootNetworksInfos, false, true); studyEntity.deleteRootNetworks(rootNetworksInfos.stream().map(RootNetworkInfos::getId).collect(Collectors.toSet())); } - public void deleteRootNetworkRemoteInfos(List rootNetworkInfos) { - CompletableFuture.allOf( - // delete remote data ids set in root network - studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList())), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes)), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork)), - studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)) - ); - // delete remote data ids set in root network node infos - rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); - } - - public void invalidateRootNetworkRemoteInfos(List rootNetworkInfos, boolean blocking) { + public void invalidateRootNetworkRemoteInfos(List rootNetworkInfos, boolean blocking, boolean deleteCase) { ArrayList> futures = new ArrayList<>(); // delete remote data ids set in root network futures.add(studyServerExecutionService.runAsync(() -> reportService.deleteReports(rootNetworkInfos.stream().map(RootNetworkInfos::getReportUuid).toList()))); futures.add(studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(equipmentInfosService::deleteEquipmentIndexes))); futures.add(studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getNetworkInfos().getNetworkUuid()).filter(Objects::nonNull).forEach(networkStoreService::deleteNetwork))); + if (deleteCase) { + studyServerExecutionService.runAsync(() -> rootNetworkInfos.stream().map(rni -> rni.getCaseInfos().getCaseUuid()).filter(Objects::nonNull).forEach(caseService::deleteCase)); + } if (blocking) { CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).join(); } // delete remote data ids set in root network node infos - rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfosByUuids( - rootNetworkInfos.stream().map(RootNetworkInfos::getId).toList() - ); + rootNetworkNodeInfoService.deleteRootNetworkNodeRemoteInfos(rootNetworkInfos.stream().map(RootNetworkInfos::getRootNetworkNodeInfos).filter(Objects::nonNull).flatMap(Collection::stream).toList()); } public Optional getRootNetworkRequest(UUID rootNetworkUuid) { @@ -354,12 +343,10 @@ public boolean isRootNetworkTagExistsInStudy(UUID studyUuid, String rootNetworkT rootNetworkRequestRepository.findByTagAndStudyUuid(rootNetworkTag, studyUuid).isPresent(); } - @Transactional(readOnly = true) public List getStudyRootNetwork(StudyEntity study) { return study.getRootNetworks(); } - @Transactional(readOnly = true) public List getStudyRootNetworkIds(UUID studyUuid) { return rootNetworkRepository.findAllByStudyId(studyUuid).stream() .map(RootNetworkEntity::getId) @@ -368,7 +355,7 @@ public List getStudyRootNetworkIds(UUID studyUuid) { @Transactional(readOnly = true) public RootNetworkInfos getRootNetworkInfos(UUID rootNetworkUuid) { - return getRootNetwork(rootNetworkUuid) + return rootNetworkRepository.findWithRootNetworkNodeInfosAndReportsById(rootNetworkUuid) .orElseThrow(() -> new StudyException(NOT_FOUND, "Root network not found")) .toDto(); } diff --git a/src/main/java/org/gridsuite/study/server/service/StudyService.java b/src/main/java/org/gridsuite/study/server/service/StudyService.java index 9140fcc60..36a04bad0 100644 --- a/src/main/java/org/gridsuite/study/server/service/StudyService.java +++ b/src/main/java/org/gridsuite/study/server/service/StudyService.java @@ -611,7 +611,7 @@ public void deleteStudyIfNotCreationInProgress(UUID studyUuid) { startTime.set(System.nanoTime()); // delete all distant resources linked to rootNetworks - rootNetworkService.deleteRootNetworkRemoteInfos(deleteStudyInfos.getRootNetworkInfosList()); + rootNetworkService.invalidateRootNetworkRemoteInfos(deleteStudyInfos.getRootNetworkInfosList(), false, true); // delete all distant resources linked to nodes studyServerExecutionService.runAsync(() -> deleteStudyInfos.getModificationGroupUuids().stream().filter(Objects::nonNull).forEach(networkModificationService::deleteModifications)); @@ -3946,7 +3946,7 @@ public void invalidateStudyRootNetwork(UUID studyUuid, UUID rootNetworkUuid, Str // First we unbuild all nodes doUnbuildNodeTree(studyUuid, rootNodeUuid, true, true, userId); // Then we erase data linked to root node on all root networks - rootNetworkService.invalidateRootNetworkRemoteInfos(List.of(rootNetworkService.getRootNetworkInfos(rootNetworkUuid)), true); + rootNetworkService.invalidateRootNetworkRemoteInfos(List.of(rootNetworkService.getRootNetworkInfos(rootNetworkUuid)), true, false); rootNetworkService.updateRootNetworkIndexationStatus(studyUuid, rootNetworkUuid, RootNetworkIndexationStatus.NOT_INDEXED); } finally { networkModificationTreeService.unblockNodeTree(rootNetworkUuid, rootNodeUuid); diff --git a/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java b/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java index a3ef753c3..0766cc7b5 100644 --- a/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java +++ b/src/test/java/org/gridsuite/study/server/SupervisionControllerTest.java @@ -322,7 +322,7 @@ void testInvalidateStudy() throws Exception { // Remote root-network data was deleted Mockito.verify(rootNetworkService, Mockito.times(1)) - .invalidateRootNetworkRemoteInfos(any(), eq(true)); + .invalidateRootNetworkRemoteInfos(any(), eq(true), eq(false)); Mockito.verify(networkStoreService, Mockito.times(1)).deleteNetwork(NETWORK_UUID); // Indexation flipped to NOT_INDEXED so the auto-detect path will reimport on reopen