Skip to content
Merged
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 @@ -6,13 +6,13 @@
*/
package org.gridsuite.modification.server.dto;

import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.dto.ModificationInfos;

import java.util.List;
import java.util.UUID;

/**
* @author Slimane Amar <slimane.amar at rte-france.com>
*/
public record ModificationApplicationGroup(UUID groupUuid, List<ModificationEntity> modifications, ReportInfos reportInfos) {
public record ModificationApplicationGroup(UUID groupUuid, List<ModificationInfos> modifications, ReportInfos reportInfos) {
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@

import lombok.*;
import org.gridsuite.modification.server.elasticsearch.ESConfig;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.modifications.ImpactedEquipmentsInfos;
import org.gridsuite.modification.server.modifications.IndexedImpactedEquipmentInfos;
import org.springframework.data.annotation.AccessType;
Expand Down Expand Up @@ -83,9 +82,6 @@ public void setUniqueId(String uniqueId) {
@Builder.Default
ImpactedEquipmentsInfos impactedEquipmentsInfos = new ImpactedEquipmentsInfos();

@Transient
ModificationEntity modification;

public ModificationApplicationInfos flushImpactedEquipments() {
createdEquipmentIds = impactedEquipmentsInfos.getCreatedEquipments().stream()
.filter(IndexedImpactedEquipmentInfos::shouldIndexInModification)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos;
import org.gridsuite.modification.server.entities.ModificationApplicationEntity;
import org.gridsuite.modification.server.repositories.ModificationApplicationRepository;
import org.gridsuite.modification.server.repositories.ModificationRepository;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

Expand All @@ -26,15 +27,18 @@
public class ModificationApplicationInfosService {
private final ModificationApplicationInfosRepository modificationApplicationInfosRepository;
private final ModificationApplicationRepository modificationApplicationRepository;
private final ModificationRepository modificationRepository;
@Value("${spring.data.elasticsearch.partition-size:10000}")
private int partitionSize;
@Value("${spring.data.elasticsearch.partition-size-for-deletion:2048}")
public int partitionSizeForDeletion;

public ModificationApplicationInfosService(ModificationApplicationInfosRepository modificationApplicationInfosRepository,
ModificationApplicationRepository modificationApplicationRepository) {
ModificationApplicationRepository modificationApplicationRepository,
ModificationRepository modificationRepository) {
this.modificationApplicationInfosRepository = modificationApplicationInfosRepository;
this.modificationApplicationRepository = modificationApplicationRepository;
this.modificationRepository = modificationRepository;
}

public void addAll(List<ModificationApplicationInfos> modificationApplicationInfos) {
Expand All @@ -50,7 +54,9 @@ public void addAll(List<ModificationApplicationInfos> modificationApplicationInf
.modifiedEquipmentIds(modificationInfo.getModifiedEquipmentIds())
.deletedEquipmentIds(modificationInfo.getDeletedEquipmentIds())
.build();
newModificationApplicationEntity.setModification(modificationInfo.getModification());
newModificationApplicationEntity.setModification(
modificationRepository.getReferenceById(modificationInfo.getModificationUuid())
);
return newModificationApplicationEntity;
}).toList()));
Lists.partition(modificationApplicationInfos, partitionSize)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@
import org.gridsuite.modification.server.dto.NetworkModificationResult.ApplicationStatus;
import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
import org.gridsuite.modification.server.service.*;
import org.slf4j.Logger;
Expand Down Expand Up @@ -99,8 +98,7 @@ public NetworkModificationApplicator(NetworkStoreService networkStoreService, Eq
public CompletableFuture<NetworkModificationResult> applyModifications(ModificationApplicationGroup modificationInfosGroup, NetworkInfos networkInfos) {
PreloadingStrategy preloadingStrategy = modificationInfosGroup.modifications().stream()
.filter(m -> m.getActivated() && !m.getStashed())
.map(ModificationEntity::getType)
.map(ModificationType::valueOf)
.map(ModificationInfos::getType)
.reduce(ModificationType::maxStrategy)
.map(ModificationType::getStrategy)
.orElse(PreloadingStrategy.NONE);
Expand Down Expand Up @@ -142,8 +140,7 @@ public NetworkModificationResult applyModifications(List<ModificationApplication
.map(ModificationApplicationGroup::modifications)
.flatMap(List::stream)
.filter(m -> m.getActivated() && !m.getStashed())
.map(ModificationEntity::getType)
.map(ModificationType::valueOf)
.map(ModificationInfos::getType)
.reduce(ModificationType::maxStrategy)
.map(ModificationType::getStrategy)
.orElse(PreloadingStrategy.NONE);
Expand Down Expand Up @@ -193,10 +190,10 @@ private ApplicationStatus apply(ModificationApplicationGroup modificationGroupIn
reportNode = ReportNode.NO_OP;
}
ApplicationStatus groupApplicationStatus = modificationGroupInfos.modifications().stream()
.filter(ModificationEntity::getActivated)
.filter(ModificationInfos::getActivated)
.map(m -> {
listener.initModificationApplication(modificationGroupInfos.groupUuid(), m);
return apply(m.toModificationInfos(), listener.getNetwork(), reportNode);
return apply(m, listener.getNetwork(), reportNode);
})
.reduce(ApplicationStatus::max)
.orElse(ApplicationStatus.ALL_OK);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,13 @@
import lombok.Getter;
import org.apache.commons.collections4.CollectionUtils;
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.ModificationInfos;
import org.gridsuite.modification.server.dto.elasticsearch.BasicEquipmentInfos;
import org.gridsuite.modification.server.dto.elasticsearch.EquipmentInfos;
import org.gridsuite.modification.server.dto.elasticsearch.ModificationApplicationInfos;
import org.gridsuite.modification.server.dto.elasticsearch.TombstonedEquipmentInfos;
import org.gridsuite.modification.server.elasticsearch.EquipmentInfosService;
import org.gridsuite.modification.server.elasticsearch.ModificationApplicationInfosService;
import org.gridsuite.modification.server.entities.ModificationEntity;
import org.gridsuite.modification.server.impacts.AbstractBaseImpact;
import org.gridsuite.modification.server.impacts.CollectionElementImpact;
import org.gridsuite.modification.server.impacts.SimpleElementImpact;
Expand Down Expand Up @@ -249,12 +249,11 @@ public void afterRemoval(String identifiableId) {
// Do nothing
}

public void initModificationApplication(UUID groupUuid, ModificationEntity modification) {
public void initModificationApplication(UUID groupUuid, ModificationInfos modification) {
ModificationApplicationInfos modificationApplication = ModificationApplicationInfos.builder()
.groupUuid(groupUuid)
.modificationUuid(modification.getId())
.modificationUuid(modification.getUuid())
.networkUuid(networkUuid)
.modification(modification)
.build();
modificationApplicationInfosList.add(modificationApplication);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,13 +109,16 @@ public void deleteAll() {
// This method should be package-private and not used as API of the service as it uses ModificationEntity and
// we want to encapsulate the use of Entity related objects to this service.
// Nevertheless We have to keep it public for transactional annotation.
public List<ModificationEntity> saveModifications(UUID groupUuid, List<ModificationEntity> modifications) {
return saveModificationsNonTransactional(groupUuid, modifications);
public List<ModificationInfos> saveModifications(UUID groupUuid, List<ModificationEntity> modifications) {
List<ModificationEntity> entities = saveModificationsNonTransactional(groupUuid, modifications);
return entities.stream().map(ModificationEntity::toModificationInfos).toList();
}

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

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

List<ModificationEntity> copyEntities = modificationRepository.findAllByIdIn(modificationUuids).stream()
.map(this::getModificationInfos)
.map(this::toModificationsInfosOptimizedForTabular)
.map(ModificationEntity::fromDTO)
.toList();
compositeEntity.getModifications().clear();
Expand All @@ -168,11 +171,9 @@ private List<ModificationEntity> saveModificationsNonTransactional(UUID groupUui
}

@Transactional
public List<ModificationEntity> moveModifications(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
public List<ModificationInfos> moveModifications(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
List<ModificationEntity> movedModifications = moveModificationsNonTransactional(destinationGroupUuid, originGroupUuid, modificationsToMoveUUID, referenceModificationUuid);
// TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
movedModifications.forEach(ModificationEntity::toModificationInfos);
return movedModifications;
return movedModifications.stream().map(this::toModificationsInfosOptimizedForTabular).toList();
}

private List<ModificationEntity> moveModificationsNonTransactional(UUID destinationGroupUuid, UUID originGroupUuid, List<UUID> modificationsToMoveUUID, UUID referenceModificationUuid) {
Expand Down Expand Up @@ -260,7 +261,7 @@ public Map<UUID, UUID> duplicateCompositeModifications(List<UUID> sourceModifica
// findAllById does not keep sourceModificationUuids order, but
// sourceEntities, copyEntities, newEntities have the same order.
List<ModificationEntity> copyEntities = sourceEntities.stream()
.map(this::getModificationInfos)
.map(this::toModificationsInfosOptimizedForTabular)
.map(ModificationEntity::fromDTO)
.toList();
List<ModificationEntity> newEntities = modificationRepository.saveAll(copyEntities);
Expand Down Expand Up @@ -297,13 +298,13 @@ public List<ModificationInfos> getModificationsMetadata(UUID groupUuid, boolean
.findAllBaseByGroupIdReverse(getModificationGroup(groupUuid).getId())
.stream()
.filter(ModificationEntity::getStashed)
.map(this::getModificationInfos)
.map(this::toModificationsInfosOptimizedForTabular)
.collect(Collectors.toList());
} else {
return modificationRepository
.findAllBaseByGroupId(getModificationGroup(groupUuid).getId())
.stream()
.map(this::getModificationInfos)
.map(this::toModificationsInfosOptimizedForTabular)
.collect(Collectors.toList());
}
}
Expand Down Expand Up @@ -408,38 +409,28 @@ private TabularBaseInfos loadTabularModification(TabularModificationsEntity tabu
.build();
}

public ModificationInfos getModificationInfos(ModificationEntity modificationEntity) {
public ModificationInfos toModificationsInfosOptimizedForTabular(ModificationEntity modificationEntity) {
if (modificationEntity instanceof TabularModificationsEntity tabularEntity) {
return loadTabularModification(tabularEntity);
}
return modificationEntity.toModificationInfos();
}

@Transactional(readOnly = true)
public List<ModificationEntity> getActiveModificationsEntities(UUID groupUuid, Set<UUID> modificationsToExclude) {
public List<ModificationInfos> getActiveModifications(UUID groupUuid, Set<UUID> modificationsToExclude) {
List<ModificationEntity> modificationsEntities = modificationRepository.findAllActiveModificationsByGroupId(groupUuid, emptyIfNull(modificationsToExclude));
// TODO resolve lazy initialisation exception : replace this line by loadFullModificationsEntities
modificationsEntities.forEach(ModificationEntity::toModificationInfos);
return modificationsEntities;
}

private void loadFullModificationsEntities(List<ModificationEntity> modificationsEntities) {
// Force load subentities/collections, needed later when the transaction is closed
// Necessary for applying network modifications
// to avoid LazyInitialisationException. Maybe better to refactor to return the dto ?
// And refactor to more efficiently load the data (avoid 1+N) ?
modificationsEntities.forEach(this::getModificationInfos);
return modificationsEntities.stream().map(this::toModificationsInfosOptimizedForTabular).toList();
}

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

@Transactional(readOnly = true)
public ModificationInfos getModificationInfo(UUID modificationUuid) {
return getModificationInfos(getModificationEntity(modificationUuid));
return toModificationsInfosOptimizedForTabular(getModificationEntity(modificationUuid));
}

public ModificationEntity getModificationEntity(UUID modificationUuid) {
Expand Down Expand Up @@ -518,7 +509,7 @@ private List<ModificationInfos> getModificationsInfosNonTransactional(List<UUID>
ModificationEntity::getId,
Function.identity()
));
return uuids.stream().map(entities::get).filter(Objects::nonNull).map(this::getModificationInfos).toList();
return uuids.stream().map(entities::get).filter(Objects::nonNull).map(this::toModificationsInfosOptimizedForTabular).toList();
}

/**
Expand All @@ -533,7 +524,7 @@ public List<ModificationInfos> getBasicNetworkModificationsFromComposite(@NonNul
return networkModificationsUuids.stream()
.map(entitiesById::get)
.filter(Objects::nonNull)
.map(this::getModificationInfos)
.map(this::toModificationsInfosOptimizedForTabular)
.toList();
}

Expand Down Expand Up @@ -562,7 +553,7 @@ public List<ModificationInfos> getUnstashedModificationsInfos(@NonNull UUID grou
}

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

@Transactional
Expand Down Expand Up @@ -754,14 +745,18 @@ private void deleteTabularModificationSubModifications(TabularModificationsEntit
}

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

@Transactional
public List<ModificationEntity> saveCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids) {
public List<ModificationInfos> saveCompositeModifications(@NonNull UUID targetGroupUuid, @NonNull List<UUID> modificationsUuids) {
List<ModificationInfos> modificationInfos = getCompositeModificationsInfosNonTransactional(modificationsUuids);
return saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
List<ModificationEntity> newEntities = saveModificationInfosNonTransactional(targetGroupUuid, modificationInfos);
// We can't return modificationInfos directly because it wouldn't have the IDs coming from the new saved entities
return newEntities.stream().map(ModificationEntity::toModificationInfos).toList();
}
}
Loading