Skip to content

Commit

Permalink
Share code for modifications exporting filters (#389)
Browse files Browse the repository at this point in the history
Signed-off-by: BOUHOURS Antoine <[email protected]>
  • Loading branch information
antoinebhs authored Dec 13, 2023
1 parent 2783c8f commit 54c724a
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 88 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,15 @@
import com.powsybl.commons.reporter.TypedValue;
import com.powsybl.iidm.modification.scalable.Scalable;
import com.powsybl.iidm.network.Network;
import com.powsybl.network.store.iidm.impl.NetworkImpl;
import org.gridsuite.modification.server.NetworkModificationException;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.service.FilterService;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import java.util.stream.Collectors;

import static org.gridsuite.modification.server.modifications.ModificationUtils.createReport;
Expand Down Expand Up @@ -52,66 +49,26 @@ public void apply(Network network, Reporter subReporter) {
.filter(distinctByKey(FilterInfos::getId))
.collect(Collectors.toMap(FilterInfos::getId, FilterInfos::getName));

// export filters from filter server
String workingVariantId = network.getVariantManager().getWorkingVariantId();
UUID uuid = ((NetworkImpl) network).getUuid();
Map<UUID, FilterEquipments> exportFilters = filterService
.exportFilters(new ArrayList<>(filters.keySet()), uuid, workingVariantId)
.stream()
.peek(t -> t.setFilterName(filters.get(t.getFilterId())))
.collect(Collectors.toMap(FilterEquipments::getFilterId, Function.identity()));

// collect all filters with wrong equipments ids
Map<UUID, FilterEquipments> filterWithWrongEquipmentsIds = exportFilters.entrySet().stream()
.filter(e -> !CollectionUtils.isEmpty(e.getValue().getNotFoundEquipments()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

Boolean noValidEquipmentId = exportFilters.values().stream()
.allMatch(filterEquipments -> filterEquipments.getIdentifiableAttributes().isEmpty());

if (noValidEquipmentId) {
String errorMsg = scalingInfos.getErrorType() + ": There is no valid equipment ID among the provided filter(s)";
createReport(subReporter, "invalidFilters", errorMsg, TypedValue.ERROR_SEVERITY);
return;
Map<UUID, FilterEquipments> exportFilters = ModificationUtils.getUuidFilterEquipmentsMap(filterService, network, subReporter, filters, scalingInfos.getErrorType());
if (exportFilters != null) {
Map<UUID, FilterEquipments> filtersWithWrongEquipmentIds = ModificationUtils.getUuidFilterWrongEquipmentsIdsMap(subReporter, exportFilters, filters);

// apply variations
scalingInfos.getVariations().forEach(variation -> {
List<IdentifiableAttributes> identifiableAttributes = ModificationUtils.getIdentifiableAttributes(exportFilters, filtersWithWrongEquipmentIds, variation.getFilters(), subReporter);

if (CollectionUtils.isEmpty(identifiableAttributes)) {
String filterNames = variation.getFilters().stream().map(FilterInfos::getName).collect(Collectors.joining(", "));
createReport(subReporter,
"allFiltersWrong",
String.format("All of the following variation's filters have equipments with wrong id : %s", filterNames),
TypedValue.WARN_SEVERITY);
} else {
applyVariation(network, subReporter, identifiableAttributes, variation);
}
});
createReport(subReporter, "scalingCreated", "new scaling created", TypedValue.INFO_SEVERITY);
}

// create report for each wrong filter
filterWithWrongEquipmentsIds.values().forEach(f -> {
var equipmentIds = String.join(", ", f.getNotFoundEquipments());
createReport(subReporter,
"filterEquipmentsNotFound_" + f.getFilterName(),
String.format("Cannot find the following equipments %s in filter %s", equipmentIds, filters.get(f.getFilterId())),
TypedValue.WARN_SEVERITY);
});

// apply variations
scalingInfos.getVariations().forEach(variation -> {
variation.getFilters().stream()
.filter(f -> !exportFilters.containsKey(f.getId()))
.forEach(f -> createReport(subReporter,
"filterNotFound",
String.format("Cannot find the following filter: %s", f.getName()),
TypedValue.WARN_SEVERITY));

List<IdentifiableAttributes> identifiableAttributes = variation.getFilters()
.stream()
.filter(f -> !filterWithWrongEquipmentsIds.containsKey(f.getId()) && exportFilters.containsKey(f.getId()))
.flatMap(f -> exportFilters.get(f.getId())
.getIdentifiableAttributes()
.stream())
.collect(Collectors.toList());

if (CollectionUtils.isEmpty(identifiableAttributes)) {
String filterNames = variation.getFilters().stream().map(FilterInfos::getName).collect(Collectors.joining(", "));
createReport(subReporter,
"allFiltersWrong",
String.format("All of the following variation's filters have equipments with wrong id : %s", filterNames),
TypedValue.WARN_SEVERITY);
} else {
applyVariation(network, subReporter, identifiableAttributes, variation);
}
});
createReport(subReporter, "scalingCreated", "new scaling created", TypedValue.INFO_SEVERITY);
}

private void applyVariation(Network network,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,30 +10,16 @@
import com.powsybl.commons.reporter.Report;
import com.powsybl.commons.reporter.Reporter;
import com.powsybl.commons.reporter.TypedValue;
import com.powsybl.iidm.network.Battery;
import com.powsybl.iidm.network.Generator;
import com.powsybl.iidm.network.Identifiable;
import com.powsybl.iidm.network.IdentifiableType;
import com.powsybl.iidm.network.Load;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.ShuntCompensator;
import com.powsybl.iidm.network.TwoWindingsTransformer;
import com.powsybl.iidm.network.VoltageLevel;
import com.powsybl.iidm.network.*;
import org.gridsuite.modification.server.NetworkModificationException;
import org.gridsuite.modification.server.dto.ByFormulaModificationInfos;
import org.gridsuite.modification.server.dto.FilterEquipments;
import org.gridsuite.modification.server.dto.FilterInfos;
import org.gridsuite.modification.server.dto.formula.FormulaInfos;
import org.gridsuite.modification.server.dto.formula.Operator;
import org.gridsuite.modification.server.dto.formula.equipmentfield.BatteryField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.GeneratorField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.LoadField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.ShuntCompensatorField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.TwoWindingsTransformerField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.VoltageLevelField;
import org.gridsuite.modification.server.dto.formula.equipmentfield.*;
import org.gridsuite.modification.server.service.FilterService;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
Expand Down Expand Up @@ -83,7 +69,7 @@ public void apply(Network network, Reporter subReporter) {
.filter(distinctByKey(FilterInfos::getId))
.collect(Collectors.toMap(FilterInfos::getId, FilterInfos::getName));

Map<UUID, FilterEquipments> exportFilters = getUuidFilterEquipmentsMap(network, subReporter, filters);
Map<UUID, FilterEquipments> exportFilters = ModificationUtils.getUuidFilterEquipmentsMap(filterService, network, subReporter, filters, modificationInfos.getErrorType());

if (exportFilters != null) {
long equipmentCount = exportFilters.values()
Expand Down Expand Up @@ -218,15 +204,6 @@ private void createFormulaReports(List<Report> formulaReports, FormulaInfos form
}
}

@Nullable
private Map<UUID, FilterEquipments> getUuidFilterEquipmentsMap(Network network, Reporter subReporter, Map<UUID, String> filters) {
// export filters from filter server
Map<UUID, FilterEquipments> exportFilters = filterService.getUuidFilterEquipmentsMap(network, filters);

boolean isValidFilter = ModificationUtils.getInstance().isValidFilter(subReporter, modificationInfos.getErrorType(), exportFilters);
return isValidFilter ? exportFilters : null;
}

private boolean isEquipmentEditable(Identifiable<?> identifiable,
FormulaInfos formulaInfos) {
if (formulaInfos.getEditedField() == null) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
import com.powsybl.iidm.network.extensions.IdentifiableShortCircuitAdder;
import org.gridsuite.modification.server.NetworkModificationException;
import org.gridsuite.modification.server.dto.*;
import org.gridsuite.modification.server.service.FilterService;
import org.jetbrains.annotations.Nullable;
import org.springframework.util.CollectionUtils;

import java.util.*;
Expand All @@ -27,6 +29,7 @@
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import static org.gridsuite.modification.server.NetworkModificationException.Type.*;
Expand Down Expand Up @@ -1027,5 +1030,47 @@ public boolean isValidFilter(Reporter subReporter,

return true;
}

public static List<IdentifiableAttributes> getIdentifiableAttributes(Map<UUID, FilterEquipments> exportFilters, Map<UUID, FilterEquipments> filtersWithWrongEquipmentIds, List<FilterInfos> filterInfos, Reporter subReporter) {
filterInfos.stream()
.filter(f -> !exportFilters.containsKey(f.getId()))
.forEach(f -> createReport(subReporter,
"filterNotFound",
String.format("Cannot find the following filter: %s", f.getName()),
TypedValue.WARN_SEVERITY));

return filterInfos
.stream()
.filter(f -> !filtersWithWrongEquipmentIds.containsKey(f.getId()) && exportFilters.containsKey(f.getId()))
.flatMap(f -> exportFilters.get(f.getId())
.getIdentifiableAttributes()
.stream())
.toList();
}

@Nullable
public static Map<UUID, FilterEquipments> getUuidFilterEquipmentsMap(FilterService filterService, Network network, Reporter subReporter, Map<UUID, String> filters, NetworkModificationException.Type errorType) {
Map<UUID, FilterEquipments> exportFilters = filterService.getUuidFilterEquipmentsMap(network, filters);

boolean isValidFilter = ModificationUtils.getInstance().isValidFilter(subReporter, errorType, exportFilters);
return isValidFilter ? exportFilters : null;
}

public static Map<UUID, FilterEquipments> getUuidFilterWrongEquipmentsIdsMap(Reporter subReporter, Map<UUID, FilterEquipments> exportFilters, Map<UUID, String> filters) {
// collect all filters with wrong equipments ids
Map<UUID, FilterEquipments> filterWithWrongEquipmentsIds = exportFilters.entrySet().stream()
.filter(e -> !CollectionUtils.isEmpty(e.getValue().getNotFoundEquipments()))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

// create report for each wrong filter
filterWithWrongEquipmentsIds.values().forEach(f -> {
var equipmentIds = String.join(", ", f.getNotFoundEquipments());
createReport(subReporter,
"filterEquipmentsNotFound_" + f.getFilterName(),
String.format("Cannot find the following equipments %s in filter %s", equipmentIds, filters.get(f.getFilterId())),
TypedValue.WARN_SEVERITY);
});
return filterWithWrongEquipmentsIds;
}
}

0 comments on commit 54c724a

Please sign in to comment.