Skip to content

Commit cba5fd0

Browse files
authored
indexation status by root network and study (#730)
* indexation status by root network and study --------- Signed-off-by: souissimai <[email protected]>
1 parent 87ba987 commit cba5fd0

File tree

13 files changed

+84
-59
lines changed

13 files changed

+84
-59
lines changed

src/main/java/org/gridsuite/study/server/controller/StudyController.java

+10-10
Original file line numberDiff line numberDiff line change
@@ -334,13 +334,13 @@ public ResponseEntity<BasicStudyInfos> recreateStudyNetwork(@PathVariable("study
334334
}
335335

336336
@GetMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/indexation/status")
337-
@Operation(summary = "check study indexation")
337+
@Operation(summary = "check root network indexation")
338338
@ApiResponses(value = {
339-
@ApiResponse(responseCode = "200", description = "The study indexation status"),
340-
@ApiResponse(responseCode = "204", description = "The study indexation status doesn't exist"),
341-
@ApiResponse(responseCode = "404", description = "The study or network doesn't exist")})
342-
public ResponseEntity<String> checkStudyIndexationStatus(@PathVariable("studyUuid") UUID studyUuid, @PathVariable("rootNetworkUuid") UUID rootNetworkUuid) {
343-
String result = studyService.getStudyIndexationStatus(studyUuid, rootNetworkUuid).name();
339+
@ApiResponse(responseCode = "200", description = "The root network indexation status for a study"),
340+
@ApiResponse(responseCode = "204", description = "The root network indexation status doesn't exist"),
341+
@ApiResponse(responseCode = "404", description = "The root network or network doesn't exist")})
342+
public ResponseEntity<String> checkRootNetworkIndexationStatus(@PathVariable("studyUuid") UUID studyUuid, @PathVariable("rootNetworkUuid") UUID rootNetworkUuid) {
343+
String result = studyService.getRootNetworkIndexationStatus(studyUuid, rootNetworkUuid).name();
344344
return result != null ? ResponseEntity.ok().body(result) :
345345
ResponseEntity.noContent().build();
346346
}
@@ -1556,11 +1556,11 @@ public ResponseEntity<String> getDefaultDynamicSecurityAnalysisProvider(@Request
15561556
}
15571557

15581558
@PostMapping(value = "/studies/{studyUuid}/root-networks/{rootNetworkUuid}/reindex-all")
1559-
@Operation(summary = "reindex the study")
1560-
@ApiResponse(responseCode = "200", description = "Study reindexed")
1561-
public ResponseEntity<Void> reindexStudy(@Parameter(description = "study uuid") @PathVariable("studyUuid") UUID studyUuid,
1559+
@Operation(summary = "reindex root network")
1560+
@ApiResponse(responseCode = "200", description = "Root network reindexed")
1561+
public ResponseEntity<Void> reindexRootNetwork(@Parameter(description = "study uuid") @PathVariable("studyUuid") UUID studyUuid,
15621562
@Parameter(description = "root network uuid") @PathVariable("rootNetworkUuid") UUID rootNetworkUuid) {
1563-
studyService.reindexStudy(studyUuid, rootNetworkUuid);
1563+
studyService.reindexRootNetwork(studyUuid, rootNetworkUuid);
15641564
return ResponseEntity.ok().build();
15651565
}
15661566

src/main/java/org/gridsuite/study/server/controller/SupervisionController.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public ResponseEntity<Void> recreateStudyIndices() {
141141
@ApiResponse(responseCode = "200", description = "Study reindexed")
142142
public ResponseEntity<Void> reindexStudy(@Parameter(description = "study uuid") @PathVariable("studyUuid") UUID studyUuid) {
143143
studyService.getExistingBasicRootNetworkInfos(studyUuid).forEach(
144-
rootNetwork -> studyService.reindexStudy(studyUuid, rootNetwork.rootNetworkUuid())
144+
rootNetwork -> studyService.reindexRootNetwork(studyUuid, rootNetwork.rootNetworkUuid())
145145
);
146146
return ResponseEntity.ok().build();
147147
}

src/main/java/org/gridsuite/study/server/dto/StudyIndexationStatus.java renamed to src/main/java/org/gridsuite/study/server/dto/RootNetworkIndexationStatus.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
/**
1010
* @author Sylvain Bouzols <sylvain.bouzols at rte-france.com>
1111
*/
12-
public enum StudyIndexationStatus {
12+
public enum RootNetworkIndexationStatus {
1313
NOT_INDEXED,
1414
INDEXING_ONGOING,
1515
INDEXED

src/main/java/org/gridsuite/study/server/notification/NotificationService.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import com.fasterxml.jackson.core.JsonProcessingException;
1010
import com.fasterxml.jackson.databind.ObjectMapper;
1111
import org.gridsuite.study.server.dto.ComputationType;
12-
import org.gridsuite.study.server.dto.StudyIndexationStatus;
12+
import org.gridsuite.study.server.dto.RootNetworkIndexationStatus;
1313
import org.gridsuite.study.server.networkmodificationtree.dto.InsertMode;
1414
import org.gridsuite.study.server.notification.dto.NetworkImpactsInfos;
1515
import org.gridsuite.study.server.notification.dto.StudyAlert;
@@ -246,9 +246,10 @@ public void emitStudyChanged(UUID studyUuid, UUID nodeUuid, UUID rootNetworkUuid
246246
}
247247

248248
@PostCompletion
249-
public void emitStudyIndexationStatusChanged(UUID studyUuid, StudyIndexationStatus status) {
249+
public void emitRootNetworkIndexationStatusChanged(UUID studyUuid, UUID rootNetworkUuid, RootNetworkIndexationStatus status) {
250250
sendStudyUpdateMessage(studyUuid, UPDATE_TYPE_INDEXATION_STATUS, MessageBuilder.withPayload("")
251251
.setHeader(HEADER_INDEXATION_STATUS, status.name())
252+
.setHeader(HEADER_ROOT_NETWORK_UUID, rootNetworkUuid)
252253
);
253254
}
254255

src/main/java/org/gridsuite/study/server/repository/StudyEntity.java

+2-5
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import jakarta.persistence.*;
1010
import lombok.*;
11-
import org.gridsuite.study.server.dto.StudyIndexationStatus;
11+
import org.gridsuite.study.server.dto.RootNetworkIndexationStatus;
1212
import org.gridsuite.study.server.repository.nonevacuatedenergy.NonEvacuatedEnergyParametersEntity;
1313
import org.gridsuite.study.server.repository.rootnetwork.RootNetworkEntity;
1414
import org.gridsuite.study.server.repository.voltageinit.StudyVoltageInitParametersEntity;
@@ -116,10 +116,6 @@ public class StudyEntity extends AbstractManuallyAssignedIdentifierEntity<UUID>
116116
))
117117
private NonEvacuatedEnergyParametersEntity nonEvacuatedEnergyParameters;
118118

119-
@Enumerated(EnumType.STRING)
120-
@Builder.Default
121-
private StudyIndexationStatus indexationStatus = StudyIndexationStatus.NOT_INDEXED;
122-
123119
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
124120
@JoinColumn(name = "study_voltage_init_parameters_id",
125121
foreignKey = @ForeignKey(
@@ -139,6 +135,7 @@ public RootNetworkEntity getFirstRootNetwork() {
139135

140136
public void addRootNetwork(RootNetworkEntity rootNetworkEntity) {
141137
rootNetworkEntity.setStudy(this);
138+
rootNetworkEntity.setIndexationStatus(RootNetworkIndexationStatus.INDEXED);
142139
rootNetworks.add(rootNetworkEntity);
143140
}
144141

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

+5-4
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,7 @@
88

99
import jakarta.persistence.*;
1010
import lombok.*;
11-
import org.gridsuite.study.server.dto.BasicRootNetworkInfos;
12-
import org.gridsuite.study.server.dto.CaseInfos;
13-
import org.gridsuite.study.server.dto.NetworkInfos;
14-
import org.gridsuite.study.server.dto.RootNetworkInfos;
11+
import org.gridsuite.study.server.dto.*;
1512
import org.gridsuite.study.server.networkmodificationtree.entities.RootNetworkNodeInfoEntity;
1613
import org.gridsuite.study.server.repository.StudyEntity;
1714

@@ -44,6 +41,10 @@ public class RootNetworkEntity {
4441
@JoinColumn(name = "studyUuid", foreignKey = @ForeignKey(name = "rootNetwork_study_id_fk_constraint"))
4542
private StudyEntity study;
4643

44+
@Enumerated(EnumType.STRING)
45+
@Builder.Default
46+
private RootNetworkIndexationStatus indexationStatus = RootNetworkIndexationStatus.NOT_INDEXED;
47+
4748
@OneToMany(orphanRemoval = true, mappedBy = "rootNetwork", cascade = CascadeType.ALL)
4849
@Builder.Default
4950
private List<RootNetworkNodeInfoEntity> rootNetworkNodeInfos = new ArrayList<>();

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

+19-18
Original file line numberDiff line numberDiff line change
@@ -447,7 +447,7 @@ public void duplicateStudyAsync(BasicStudyInfos basicStudyInfos, UUID sourceStud
447447
StudyEntity duplicatedStudy = duplicateStudy(basicStudyInfos, sourceStudyUuid, userId);
448448

449449
getStudyRootNetworks(duplicatedStudy.getId()).forEach(rootNetworkEntity ->
450-
reindexStudy(duplicatedStudy, rootNetworkEntity.getId())
450+
reindexRootNetwork(duplicatedStudy, rootNetworkEntity.getId())
451451
);
452452
} catch (Exception e) {
453453
LOGGER.error(e.toString(), e);
@@ -1289,14 +1289,14 @@ public void invalidateStateEstimationStatusOnAllNodes(UUID studyUuid) {
12891289
stateEstimationService.invalidateStateEstimationStatus(rootNetworkNodeInfoService.getComputationResultUuids(studyUuid, STATE_ESTIMATION));
12901290
}
12911291

1292-
private StudyEntity updateStudyIndexationStatus(StudyEntity studyEntity, StudyIndexationStatus indexationStatus) {
1293-
studyEntity.setIndexationStatus(indexationStatus);
1294-
notificationService.emitStudyIndexationStatusChanged(studyEntity.getId(), indexationStatus);
1292+
private StudyEntity updateRootNetworkIndexationStatus(StudyEntity studyEntity, RootNetworkEntity rootNetworkEntity, RootNetworkIndexationStatus indexationStatus) {
1293+
rootNetworkEntity.setIndexationStatus(indexationStatus);
1294+
notificationService.emitRootNetworkIndexationStatusChanged(studyEntity.getId(), rootNetworkEntity.getId(), indexationStatus);
12951295
return studyEntity;
12961296
}
12971297

1298-
public StudyEntity updateStudyIndexationStatus(UUID studyUuid, StudyIndexationStatus indexationStatus) {
1299-
return updateStudyIndexationStatus(studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)), indexationStatus);
1298+
public StudyEntity updateRootNetworkIndexationStatus(UUID studyUuid, UUID rootNetworkUuid, RootNetworkIndexationStatus indexationStatus) {
1299+
return updateRootNetworkIndexationStatus(studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)), rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND)), indexationStatus);
13001300
}
13011301

13021302
private StudyEntity saveStudyThenCreateBasicTree(UUID studyUuid, NetworkInfos networkInfos,
@@ -1316,7 +1316,6 @@ private StudyEntity saveStudyThenCreateBasicTree(UUID studyUuid, NetworkInfos ne
13161316
.voltageInitParametersUuid(voltageInitParametersUuid)
13171317
.securityAnalysisParametersUuid(securityAnalysisParametersUuid)
13181318
.sensitivityAnalysisParametersUuid(sensitivityAnalysisParametersUuid)
1319-
.indexationStatus(StudyIndexationStatus.INDEXED)
13201319
.voltageInitParameters(new StudyVoltageInitParametersEntity())
13211320
.networkVisualizationParametersUuid(networkVisualizationParametersUuid)
13221321
.dynamicSecurityAnalysisParametersUuid(dynamicSecurityAnalysisParametersUuid)
@@ -1932,37 +1931,39 @@ public void restoreNodes(UUID studyId, List<UUID> nodeIds, UUID anchorNodeId) {
19321931
networkModificationTreeService.restoreNode(studyId, nodeIds, anchorNodeId);
19331932
}
19341933

1935-
private void reindexStudy(StudyEntity study, UUID rootNetworkUuid) {
1934+
private void reindexRootNetwork(StudyEntity study, UUID rootNetworkUuid) {
19361935
CreatedStudyBasicInfos studyInfos = toCreatedStudyBasicInfos(study);
1937-
// reindex study in elasticsearch
1936+
// reindex root network for study in elasticsearch
19381937
studyInfosService.recreateStudyInfos(studyInfos);
1938+
RootNetworkEntity rootNetwork = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND));
19391939

19401940
// Reset indexation status
1941-
updateStudyIndexationStatus(study, StudyIndexationStatus.INDEXING_ONGOING);
1941+
updateRootNetworkIndexationStatus(study, rootNetwork, RootNetworkIndexationStatus.INDEXING_ONGOING);
19421942
try {
19431943
networkConversionService.reindexStudyNetworkEquipments(rootNetworkService.getNetworkUuid(rootNetworkUuid));
1944-
updateStudyIndexationStatus(study, StudyIndexationStatus.INDEXED);
1944+
updateRootNetworkIndexationStatus(study, rootNetwork, RootNetworkIndexationStatus.INDEXED);
19451945
} catch (Exception e) {
19461946
// Allow to retry indexation
1947-
updateStudyIndexationStatus(study, StudyIndexationStatus.NOT_INDEXED);
1947+
updateRootNetworkIndexationStatus(study, rootNetwork, RootNetworkIndexationStatus.NOT_INDEXED);
19481948
throw e;
19491949
}
19501950
LOGGER.info("Study with id = '{}' has been reindexed", study.getId());
19511951
}
19521952

19531953
@Transactional
1954-
public void reindexStudy(UUID studyUuid, UUID rootNetworkUuid) {
1955-
reindexStudy(studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)), rootNetworkUuid);
1954+
public void reindexRootNetwork(UUID studyUuid, UUID rootNetworkUuid) {
1955+
reindexRootNetwork(studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND)), rootNetworkUuid);
19561956
}
19571957

19581958
@Transactional
1959-
public StudyIndexationStatus getStudyIndexationStatus(UUID studyUuid, UUID rootNetworkUuid) {
1959+
public RootNetworkIndexationStatus getRootNetworkIndexationStatus(UUID studyUuid, UUID rootNetworkUuid) {
19601960
StudyEntity study = studyRepository.findById(studyUuid).orElseThrow(() -> new StudyException(STUDY_NOT_FOUND));
1961-
if (study.getIndexationStatus() == StudyIndexationStatus.INDEXED
1961+
RootNetworkEntity rootNetwork = rootNetworkService.getRootNetwork(rootNetworkUuid).orElseThrow(() -> new StudyException(ROOT_NETWORK_NOT_FOUND));
1962+
if (rootNetwork.getIndexationStatus() == RootNetworkIndexationStatus.INDEXED
19621963
&& !networkConversionService.checkStudyIndexationStatus(rootNetworkService.getNetworkUuid(rootNetworkUuid))) {
1963-
updateStudyIndexationStatus(study, StudyIndexationStatus.NOT_INDEXED);
1964+
updateRootNetworkIndexationStatus(study, rootNetwork, RootNetworkIndexationStatus.NOT_INDEXED);
19641965
}
1965-
return study.getIndexationStatus();
1966+
return rootNetwork.getIndexationStatus();
19661967
}
19671968

19681969
@Transactional

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

+11-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
import org.gridsuite.study.server.StudyException;
1010
import org.gridsuite.study.server.dto.ComputationType;
1111
import org.gridsuite.study.server.dto.CreatedStudyBasicInfos;
12-
import org.gridsuite.study.server.dto.StudyIndexationStatus;
12+
import org.gridsuite.study.server.dto.RootNetworkInfos;
13+
import org.gridsuite.study.server.dto.RootNetworkIndexationStatus;
1314
import org.gridsuite.study.server.dto.elasticsearch.EquipmentInfos;
1415
import org.gridsuite.study.server.dto.elasticsearch.TombstonedEquipmentInfos;
1516
import org.gridsuite.study.server.elasticsearch.EquipmentInfosService;
@@ -77,6 +78,7 @@ public class SupervisionService {
7778
private final ElasticsearchOperations elasticsearchOperations;
7879

7980
private final StudyInfosService studyInfosService;
81+
private final RootNetworkService rootNetworkService;
8082

8183
public SupervisionService(StudyService studyService,
8284
NetworkModificationTreeService networkModificationTreeService,
@@ -93,7 +95,7 @@ public SupervisionService(StudyService studyService,
9395
EquipmentInfosService equipmentInfosService,
9496
StateEstimationService stateEstimationService,
9597
ElasticsearchOperations elasticsearchOperations,
96-
StudyInfosService studyInfosService) {
98+
StudyInfosService studyInfosService, RootNetworkService rootNetworkService) {
9799
this.studyService = studyService;
98100
this.networkModificationTreeService = networkModificationTreeService;
99101
this.rootNetworkNodeInfoRepository = rootNetworkNodeInfoRepository;
@@ -110,6 +112,7 @@ public SupervisionService(StudyService studyService,
110112
this.stateEstimationService = stateEstimationService;
111113
this.elasticsearchOperations = elasticsearchOperations;
112114
this.studyInfosService = studyInfosService;
115+
this.rootNetworkService = rootNetworkService;
113116
}
114117

115118
@Transactional
@@ -332,8 +335,12 @@ public void recreateStudyIndices() {
332335
recreateIndex(EquipmentInfos.class);
333336
recreateIndex(TombstonedEquipmentInfos.class);
334337

335-
studyService.getStudies().forEach(study ->
336-
studyService.updateStudyIndexationStatus(study.getId(), StudyIndexationStatus.NOT_INDEXED));
338+
studyService.getStudies().forEach(study -> {
339+
List<RootNetworkInfos> rootNetworkInfos = rootNetworkService.getRootNetworkInfosWithLinksInfos(study.getId());
340+
for (RootNetworkInfos rootNetworkInfo : rootNetworkInfos) {
341+
studyService.updateRootNetworkIndexationStatus(study.getId(), rootNetworkInfo.getId(), RootNetworkIndexationStatus.NOT_INDEXED);
342+
}
343+
});
337344
}
338345

339346
private void recreateIndex(Class<?> indexClass) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
2+
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext" xmlns:pro="http://www.liquibase.org/xml/ns/pro" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
3+
<changeSet author="souissimai (generated)" id="1743957372376-14">
4+
<addColumn tableName="root_network">
5+
<column name="indexation_status" type="varchar(255)"/>
6+
</addColumn>
7+
</changeSet>
8+
<changeSet author="souissimai" id="migrate-indexation-status">
9+
<update tableName="root_network">
10+
<column name="indexation_status" valueComputed="(SELECT s.indexation_status FROM STUDY s WHERE s.id = root_network.study_uuid)"/>
11+
</update>
12+
</changeSet>
13+
<changeSet author="souissimai (generated)" id="1743957372376-18">
14+
<dropColumn columnName="INDEXATION_STATUS" tableName="STUDY"/>
15+
</changeSet>
16+
</databaseChangeLog>

src/main/resources/db/changelog/db.changelog-master.yaml

+3
Original file line numberDiff line numberDiff line change
@@ -307,4 +307,7 @@ databaseChangeLog:
307307
relativeToChangelogFile: true
308308
- include:
309309
file: changesets/changelog_20250411T134806Z.xml
310+
relativeToChangelogFile: true
311+
- include:
312+
file: changesets/changelog_20250406T163555Z.xml
310313
relativeToChangelogFile: true

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
*/
77
package org.gridsuite.study.server;
88

9+
import org.gridsuite.study.server.dto.RootNetworkIndexationStatus;
910
import org.gridsuite.study.server.controller.StudyController;
10-
import org.gridsuite.study.server.dto.StudyIndexationStatus;
1111
import org.gridsuite.study.server.networkmodificationtree.dto.BuildStatus;
1212
import org.gridsuite.study.server.networkmodificationtree.dto.NodeBuildStatus;
1313
import org.gridsuite.study.server.networkmodificationtree.entities.*;
@@ -119,6 +119,7 @@ void setup() {
119119
.caseUuid(CASE_LOADFLOW_UUID)
120120
.caseFormat("caseFormat")
121121
.caseName("caseName")
122+
.indexationStatus(RootNetworkIndexationStatus.INDEXED)
122123
.build();
123124

124125
study.addRootNetwork(firstRootNetworkEntity);
@@ -248,7 +249,6 @@ private void checkUpdateModelsStatusMessagesReceived(UUID studyUuid, UUID nodeUu
248249
private StudyEntity insertStudy() {
249250
return StudyEntity.builder()
250251
.id(UUID.randomUUID())
251-
.indexationStatus(StudyIndexationStatus.INDEXED)
252252
.voltageInitParameters(new StudyVoltageInitParametersEntity())
253253
.build();
254254
}

0 commit comments

Comments
 (0)