Skip to content

Commit 4332f6c

Browse files
refactor: use DTO for applying modifications (#731)
Signed-off-by: Joris Mancini <[email protected]>
1 parent 1e85f02 commit 4332f6c

File tree

15 files changed

+203
-193
lines changed

15 files changed

+203
-193
lines changed

src/main/java/org/gridsuite/modification/server/dto/ModificationApplicationGroup.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
*/
77
package org.gridsuite.modification.server.dto;
88

9-
import org.gridsuite.modification.server.entities.ModificationEntity;
9+
import org.gridsuite.modification.dto.ModificationInfos;
1010

1111
import java.util.List;
1212
import java.util.UUID;
1313

1414
/**
1515
* @author Slimane Amar <slimane.amar at rte-france.com>
1616
*/
17-
public record ModificationApplicationGroup(UUID groupUuid, List<ModificationEntity> modifications, ReportInfos reportInfos) {
17+
public record ModificationApplicationGroup(UUID groupUuid, List<ModificationInfos> modifications, ReportInfos reportInfos) {
1818
}

src/main/java/org/gridsuite/modification/server/dto/elasticsearch/ModificationApplicationInfos.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
import lombok.*;
1010
import org.gridsuite.modification.server.elasticsearch.ESConfig;
11-
import org.gridsuite.modification.server.entities.ModificationEntity;
1211
import org.gridsuite.modification.server.modifications.ImpactedEquipmentsInfos;
1312
import org.gridsuite.modification.server.modifications.IndexedImpactedEquipmentInfos;
1413
import org.springframework.data.annotation.AccessType;
@@ -83,9 +82,6 @@ public void setUniqueId(String uniqueId) {
8382
@Builder.Default
8483
ImpactedEquipmentsInfos impactedEquipmentsInfos = new ImpactedEquipmentsInfos();
8584

86-
@Transient
87-
ModificationEntity modification;
88-
8985
public ModificationApplicationInfos flushImpactedEquipments() {
9086
createdEquipmentIds = impactedEquipmentsInfos.getCreatedEquipments().stream()
9187
.filter(IndexedImpactedEquipmentInfos::shouldIndexInModification)

src/main/java/org/gridsuite/modification/server/elasticsearch/ModificationApplicationInfosService.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos;
1111
import org.gridsuite.modification.server.entities.ModificationApplicationEntity;
1212
import org.gridsuite.modification.server.repositories.ModificationApplicationRepository;
13+
import org.gridsuite.modification.server.repositories.ModificationRepository;
1314
import org.springframework.beans.factory.annotation.Value;
1415
import org.springframework.stereotype.Service;
1516

@@ -26,15 +27,18 @@
2627
public class ModificationApplicationInfosService {
2728
private final ModificationApplicationInfosRepository modificationApplicationInfosRepository;
2829
private final ModificationApplicationRepository modificationApplicationRepository;
30+
private final ModificationRepository modificationRepository;
2931
@Value("${spring.data.elasticsearch.partition-size:10000}")
3032
private int partitionSize;
3133
@Value("${spring.data.elasticsearch.partition-size-for-deletion:2048}")
3234
public int partitionSizeForDeletion;
3335

3436
public ModificationApplicationInfosService(ModificationApplicationInfosRepository modificationApplicationInfosRepository,
35-
ModificationApplicationRepository modificationApplicationRepository) {
37+
ModificationApplicationRepository modificationApplicationRepository,
38+
ModificationRepository modificationRepository) {
3639
this.modificationApplicationInfosRepository = modificationApplicationInfosRepository;
3740
this.modificationApplicationRepository = modificationApplicationRepository;
41+
this.modificationRepository = modificationRepository;
3842
}
3943

4044
public void addAll(List<ModificationApplicationInfos> modificationApplicationInfos) {
@@ -50,7 +54,9 @@ public void addAll(List<ModificationApplicationInfos> modificationApplicationInf
5054
.modifiedEquipmentIds(modificationInfo.getModifiedEquipmentIds())
5155
.deletedEquipmentIds(modificationInfo.getDeletedEquipmentIds())
5256
.build();
53-
newModificationApplicationEntity.setModification(modificationInfo.getModification());
57+
newModificationApplicationEntity.setModification(
58+
modificationRepository.getReferenceById(modificationInfo.getModificationUuid())
59+
);
5460
return newModificationApplicationEntity;
5561
}).toList()));
5662
Lists.partition(modificationApplicationInfos, partitionSize)

src/main/java/org/gridsuite/modification/server/modifications/NetworkModificationApplicator.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@
2626
import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus;
2727
import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
2828
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
29-
import org.gridsuite.modification.server.entities.ModificationEntity;
3029
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
3130
import org.gridsuite.modification.server.service.*;
3231
import org.slf4j.Logger;
@@ -99,8 +98,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
9998
public CompletableFuture<NetworkModificationResult> applyModifications(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) {
10099
PreloadingStrategy preloadingStrategy = modificationInfosGroup.modifications().stream()
101100
.filter(m -> m.getActivated() && !m.getStashed())
102-
.map(ModificationEntity::getType)
103-
.map(ModificationType::valueOf)
101+
.map(ModificationInfos::getType)
104102
.reduce(ModificationType::maxStrategy)
105103
.map(ModificationType::getStrategy)
106104
.orElse(PreloadingStrategy.NONE);
@@ -142,8 +140,7 @@ public NetworkModificationResult applyModifications(List<ModificationApplication
142140
.map(ModificationApplicationGroup::modifications)
143141
.flatMap(List::stream)
144142
.filter(m -> m.getActivated() && !m.getStashed())
145-
.map(ModificationEntity::getType)
146-
.map(ModificationType::valueOf)
143+
.map(ModificationInfos::getType)
147144
.reduce(ModificationType::maxStrategy)
148145
.map(ModificationType::getStrategy)
149146
.orElse(PreloadingStrategy.NONE);
@@ -193,10 +190,10 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn
193190
reportNode = ReportNode.NO_OP;
194191
}
195192
ApplicationStatus groupApplicationStatus = modificationGroupInfos.modifications().stream()
196-
.filter(ModificationEntity::getActivated)
193+
.filter(ModificationInfos::getActivated)
197194
.map(m -> {
198195
listener.initModificationApplication(modificationGroupInfos.groupUuid(), m);
199-
return apply(m.toModificationInfos(), listener.getNetwork(), reportNode);
196+
return apply(m, listener.getNetwork(), reportNode);
200197
})
201198
.reduce(ApplicationStatus::max)
202199
.orElse(ApplicationStatus.ALL_OK);

src/main/java/org/gridsuite/modification/server/modifications/NetworkStoreListener.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,13 @@
1212
import lombok.Getter;
1313
import org.apache.commons.collections4.CollectionUtils;
1414
import org.gridsuite.modification.NetworkModificationException;
15+
import org.gridsuite.modification.dto.ModificationInfos;
1516
import org.gridsuite.modification.server.dto.elasticsearch.BasicEquipmentInfos;
1617
import org.gridsuite.modification.server.dto.elasticsearch.EquipmentInfos;
1718
import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos;
1819
import org.gridsuite.modification.server.dto.elasticsearch.TombstonedEquipmentInfos;
1920
import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
2021
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
21-
import org.gridsuite.modification.server.entities.ModificationEntity;
2222
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
2323
import org.gridsuite.modification.server.impacts.CollectionElementImpact;
2424
import org.gridsuite.modification.server.impacts.SimpleElementImpact;
@@ -249,12 +249,11 @@ public void afterRemoval(String identifiableId) {
249249
// Do nothing
250250
}
251251

252-
public void initModificationApplication(UUID groupUuid, ModificationEntity modification) {
252+
public void initModificationApplication(UUID groupUuid, ModificationInfos modification) {
253253
ModificationApplicationInfos modificationApplication = ModificationApplicationInfos.builder()
254254
.groupUuid(groupUuid)
255-
.modificationUuid(modification.getId())
255+
.modificationUuid(modification.getUuid())
256256
.networkUuid(networkUuid)
257-
.modification(modification)
258257
.build();
259258
modificationApplicationInfosList.add(modificationApplication);
260259
}

src/main/java/org/gridsuite/modification/server/repositories/NetworkModificationRepository.java

Lines changed: 30 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -109,13 +109,16 @@ public void deleteAll() {
109109
// This method should be package-private and not used as API of the service as it uses ModificationEntity and
110110
// we want to encapsulate the use of Entity related objects to this service.
111111
// Nevertheless We have to keep it public for transactional annotation.
112-
public List<ModificationEntity> saveModifications(UUID groupUuid, List<ModificationEntity> modifications) {
113-
return saveModificationsNonTransactional(groupUuid, modifications);
112+
public List<ModificationInfos> saveModifications(UUID groupUuid, List<ModificationEntity> modifications) {
113+
List<ModificationEntity> entities = saveModificationsNonTransactional(groupUuid, modifications);
114+
return entities.stream().map(ModificationEntity::toModificationInfos).toList();
114115
}
115116

116117
@Transactional
117-
public List<ModificationEntity> saveModificationInfos(UUID groupUuid, List<ModificationInfos> modifications) {
118-
return saveModificationInfosNonTransactional(groupUuid, modifications);
118+
public List<ModificationInfos> saveModificationInfos(UUID groupUuid, List<ModificationInfos> modifications) {
119+
List<ModificationEntity> entities = saveModificationInfosNonTransactional(groupUuid, modifications);
120+
// We can't return input modifications directly because it wouldn't have the IDs coming from the saved entities
121+
return entities.stream().map(ModificationEntity::toModificationInfos).toList();
119122
}
120123

121124
private List<ModificationEntity> saveModificationInfosNonTransactional(UUID groupUuid,
@@ -129,7 +132,7 @@ public UUID createNetworkCompositeModification(@NonNull List<UUID> modificationU
129132
CompositeModificationInfos compositeInfos = CompositeModificationInfos.builder().modifications(List.of()).build();
130133
CompositeModificationEntity compositeEntity = (CompositeModificationEntity) ModificationEntity.fromDTO(compositeInfos);
131134
List<ModificationEntity> copyEntities = modificationRepository.findAllByIdIn(modificationUuids).stream()
132-
.map(this::getModificationInfos)
135+
.map(this::toModificationsInfosOptimizedForTabular)
133136
.map(ModificationEntity::fromDTO)
134137
.toList();
135138
compositeEntity.setModifications(copyEntities);
@@ -146,7 +149,7 @@ public void updateCompositeModification(@NonNull UUID compositeUuid, @NonNull Li
146149
}
147150

148151
List<ModificationEntity> copyEntities = modificationRepository.findAllByIdIn(modificationUuids).stream()
149-
.map(this::getModificationInfos)
152+
.map(this::toModificationsInfosOptimizedForTabular)
150153
.map(ModificationEntity::fromDTO)
151154
.toList();
152155
compositeEntity.getModifications().clear();
@@ -168,11 +171,9 @@ private List<ModificationEntity> saveModificationsNonTransactional(UUID groupUui
168171
}
169172

170173
@Transactional
171-
public List<ModificationEntity> moveModifications(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
174+
public List<ModificationInfos> moveModifications(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
172175
List<ModificationEntity> movedModifications = moveModificationsNonTransactional(destinationGroupUuid, originGroupUuid, modificationsToMoveUUID, referenceModificationUuid);
173-
// TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
174-
movedModifications.forEach(ModificationEntity::toModificationInfos);
175-
return movedModifications;
176+
return movedModifications.stream().map(this::toModificationsInfosOptimizedForTabular).toList();
176177
}
177178

178179
private List<ModificationEntity> moveModificationsNonTransactional(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
@@ -260,7 +261,7 @@ public Map<UUID, UUID> duplicateCompositeModifications(List<UUID> sourceModifica
260261
// findAllById does not keep sourceModificationUuids order, but
261262
// sourceEntities, copyEntities, newEntities have the same order.
262263
List<ModificationEntity> copyEntities = sourceEntities.stream()
263-
.map(this::getModificationInfos)
264+
.map(this::toModificationsInfosOptimizedForTabular)
264265
.map(ModificationEntity::fromDTO)
265266
.toList();
266267
List<ModificationEntity> newEntities = modificationRepository.saveAll(copyEntities);
@@ -297,13 +298,13 @@ public List<ModificationInfos> getModificationsMetadata(UUID groupUuid, boolean
297298
.findAllBaseByGroupIdReverse(getModificationGroup(groupUuid).getId())
298299
.stream()
299300
.filter(ModificationEntity::getStashed)
300-
.map(this::getModificationInfos)
301+
.map(this::toModificationsInfosOptimizedForTabular)
301302
.collect(Collectors.toList());
302303
} else {
303304
return modificationRepository
304305
.findAllBaseByGroupId(getModificationGroup(groupUuid).getId())
305306
.stream()
306-
.map(this::getModificationInfos)
307+
.map(this::toModificationsInfosOptimizedForTabular)
307308
.collect(Collectors.toList());
308309
}
309310
}
@@ -408,38 +409,28 @@ private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabu
408409
.build();
409410
}
410411

411-
public ModificationInfos getModificationInfos(ModificationEntity modificationEntity) {
412+
public ModificationInfos toModificationsInfosOptimizedForTabular(ModificationEntity modificationEntity) {
412413
if (modificationEntity instanceof TabularModificationsEntity tabularEntity) {
413414
return loadTabularModification(tabularEntity);
414415
}
415416
return modificationEntity.toModificationInfos();
416417
}
417418

418419
@Transactional(readOnly = true)
419-
public List<ModificationEntity> getActiveModificationsEntities(UUID groupUuid, Set<UUID> modificationsToExclude) {
420+
public List<ModificationInfos> getActiveModifications(UUID groupUuid, Set<UUID> modificationsToExclude) {
420421
List<ModificationEntity> modificationsEntities = modificationRepository.findAllActiveModificationsByGroupId(groupUuid, emptyIfNull(modificationsToExclude));
421-
// TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
422-
modificationsEntities.forEach(ModificationEntity::toModificationInfos);
423-
return modificationsEntities;
424-
}
425-
426-
private void loadFullModificationsEntities(List<ModificationEntity> modificationsEntities) {
427-
// Force load subentities/collections, needed later when the transaction is closed
428-
// Necessary for applying network modifications
429-
// to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
430-
// And refactor to more efficiently load the data (avoid 1+N) ?
431-
modificationsEntities.forEach(this::getModificationInfos);
422+
return modificationsEntities.stream().map(this::toModificationsInfosOptimizedForTabular).toList();
432423
}
433424

434425
private List<ModificationInfos> getModificationsInfos(List<UUID> groupUuids, boolean onlyStashed) {
435426
return groupUuids.stream().flatMap(this::getModificationEntityStream)
436427
.filter(m -> !onlyStashed || m.getStashed() == onlyStashed)
437-
.map(this::getModificationInfos).toList();
428+
.map(this::toModificationsInfosOptimizedForTabular).toList();
438429
}
439430

440431
@Transactional(readOnly = true)
441432
public ModificationInfos getModificationInfo(UUID modificationUuid) {
442-
return getModificationInfos(getModificationEntity(modificationUuid));
433+
return toModificationsInfosOptimizedForTabular(getModificationEntity(modificationUuid));
443434
}
444435

445436
public ModificationEntity getModificationEntity(UUID modificationUuid) {
@@ -518,7 +509,7 @@ private List<ModificationInfos> getModificationsInfosNonTransactional(List<UUID>
518509
ModificationEntity::getId,
519510
Function.identity()
520511
));
521-
return uuids.stream().map(entities::get).filter(Objects::nonNull).map(this::getModificationInfos).toList();
512+
return uuids.stream().map(entities::get).filter(Objects::nonNull).map(this::toModificationsInfosOptimizedForTabular).toList();
522513
}
523514

524515
/**
@@ -533,7 +524,7 @@ public List<ModificationInfos> getBasicNetworkModificationsFromComposite(@NonNul
533524
return networkModificationsUuids.stream()
534525
.map(entitiesById::get)
535526
.filter(Objects::nonNull)
536-
.map(this::getModificationInfos)
527+
.map(this::toModificationsInfosOptimizedForTabular)
537528
.toList();
538529
}
539530

@@ -562,7 +553,7 @@ public List<ModificationInfos> getUnstashedModificationsInfos(@NonNull UUID grou
562553
}
563554

564555
private List<ModificationInfos> getUnstashedModificationsInfosNonTransactional(UUID groupUuid) {
565-
return getModificationEntityStream(groupUuid).filter(m -> !m.getStashed()).map(this::getModificationInfos).toList();
556+
return getModificationEntityStream(groupUuid).filter(m -> !m.getStashed()).map(this::toModificationsInfosOptimizedForTabular).toList();
566557
}
567558

568559
@Transactional
@@ -754,14 +745,18 @@ private void deleteTabularModificationSubModifications(TabularModificationsEntit
754745
}
755746

756747
@Transactional
757-
public List<ModificationEntity> saveDuplicateModifications(@NonNull UUID targetGroupUuid, UUID originGroupUuid, @NonNull List<UUID> modificationsUuids) {
748+
public List<ModificationInfos> saveDuplicateModifications(@NonNull UUID targetGroupUuid, UUID originGroupUuid, @NonNull List<UUID> modificationsUuids) {
758749
List<ModificationInfos> modificationInfos = originGroupUuid != null ? getUnstashedModificationsInfosNonTransactional(originGroupUuid) : getModificationsInfosNonTransactional(modificationsUuids);
759-
return saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
750+
List<ModificationEntity> newEntities = saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
751+
// We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
752+
return newEntities.stream().map(ModificationEntity::toModificationInfos).toList();
760753
}
761754

762755
@Transactional
763-
public List<ModificationEntity> saveCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids) {
756+
public List<ModificationInfos> saveCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids) {
764757
List<ModificationInfos> modificationInfos = getCompositeModificationsInfosNonTransactional(modificationsUuids);
765-
return saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
758+
List<ModificationEntity> newEntities = saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
759+
// We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
760+
return newEntities.stream().map(ModificationEntity::toModificationInfos).toList();
766761
}
767762
}

0 commit comments

Comments
 (0)