-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add support for deleting equipments by filter Signed-off-by: BOUHOURS Antoine <[email protected]>
- Loading branch information
1 parent
6d5d096
commit 714bcec
Showing
8 changed files
with
287 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
68 changes: 68 additions & 0 deletions
68
src/main/java/org/gridsuite/modification/server/dto/ByFilterDeletionInfos.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
/* | ||
Copyright (c) 2023, RTE (http://www.rte-france.com) | ||
This Source Code Form is subject to the terms of the Mozilla Public | ||
License, v. 2.0. If a copy of the MPL was not distributed with this | ||
file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
package org.gridsuite.modification.server.dto; | ||
|
||
import com.fasterxml.jackson.annotation.JsonInclude; | ||
import com.fasterxml.jackson.annotation.JsonTypeName; | ||
import com.powsybl.commons.reporter.Reporter; | ||
import com.powsybl.commons.reporter.ReporterModel; | ||
import io.swagger.v3.oas.annotations.media.Schema; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
import lombok.Setter; | ||
import lombok.ToString; | ||
import lombok.experimental.SuperBuilder; | ||
import org.gridsuite.modification.server.dto.annotation.ModificationErrorTypeName; | ||
import org.gridsuite.modification.server.entities.equipment.deletion.ByFilterDeletionEntity; | ||
import org.gridsuite.modification.server.modifications.AbstractModification; | ||
import org.gridsuite.modification.server.modifications.ByFilterDeletion; | ||
|
||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
/** | ||
* @author Antoine Bouhours <antoine.bouhours at rte-france.com> | ||
*/ | ||
@SuperBuilder | ||
@NoArgsConstructor | ||
@Getter | ||
@Setter | ||
@ToString(callSuper = true) | ||
@Schema(description = "By filter deletion") | ||
@JsonTypeName("BY_FILTER_DELETION") | ||
@ModificationErrorTypeName("BY_FILTER_DELETION_ERROR") | ||
public class ByFilterDeletionInfos extends ModificationInfos { | ||
@Schema(description = "Equipment type") | ||
private String equipmentType; | ||
|
||
@Schema(description = "Equipment filters") | ||
@JsonInclude(JsonInclude.Include.NON_NULL) | ||
private List<FilterInfos> equipmentFilters; | ||
|
||
@Override | ||
public ByFilterDeletionEntity toEntity() { | ||
return new ByFilterDeletionEntity(this); | ||
} | ||
|
||
@Override | ||
public AbstractModification toModification() { | ||
return new ByFilterDeletion(this); | ||
} | ||
|
||
@Override | ||
public Reporter createSubReporter(ReporterModel reporter) { | ||
return reporter.createSubReporter(getType().name(), "By filter deletion"); | ||
} | ||
|
||
@Override | ||
public Map<String, String> getMapMessageValues() { | ||
Map<String, String> mapMessageValues = new HashMap<>(); | ||
mapMessageValues.put("equipmentType", getEquipmentType()); | ||
return mapMessageValues; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
73 changes: 73 additions & 0 deletions
73
...org/gridsuite/modification/server/entities/equipment/deletion/ByFilterDeletionEntity.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* | ||
Copyright (c) 2023, RTE (http://www.rte-france.com) | ||
This Source Code Form is subject to the terms of the Mozilla Public | ||
License, v. 2.0. If a copy of the MPL was not distributed with this | ||
file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
package org.gridsuite.modification.server.entities.equipment.deletion; | ||
|
||
import jakarta.persistence.*; | ||
import lombok.Getter; | ||
import lombok.NoArgsConstructor; | ||
import lombok.NonNull; | ||
import org.gridsuite.modification.server.dto.ByFilterDeletionInfos; | ||
import org.gridsuite.modification.server.dto.FilterInfos; | ||
import org.gridsuite.modification.server.dto.ModificationInfos; | ||
import org.gridsuite.modification.server.entities.ModificationEntity; | ||
import org.gridsuite.modification.server.entities.equipment.modification.VariationFilterEntity; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
/** | ||
* @author Antoine Bouhours <antoine.bouhours at rte-france.com> | ||
*/ | ||
@NoArgsConstructor | ||
@Getter | ||
@Entity | ||
@Table(name = "byFilterDeletion") | ||
@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "ByFilterDeletion_id_fk_constraint")) | ||
public class ByFilterDeletionEntity extends ModificationEntity { | ||
@Column(name = "equipmentType") | ||
private String equipmentType; | ||
|
||
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) | ||
@JoinTable( | ||
joinColumns = @JoinColumn(name = "id"), | ||
inverseJoinColumns = @JoinColumn(name = "filterId")) | ||
private List<VariationFilterEntity> equipmentFilters; | ||
|
||
public ByFilterDeletionEntity(ByFilterDeletionInfos byFilterDeletionInfos) { | ||
super(byFilterDeletionInfos); | ||
assignAttributes(byFilterDeletionInfos); | ||
} | ||
|
||
@Override | ||
public void update(@NonNull ModificationInfos modificationInfos) { | ||
super.update(modificationInfos); | ||
assignAttributes((ByFilterDeletionInfos) modificationInfos); | ||
} | ||
|
||
private void assignAttributes(ByFilterDeletionInfos byFilterDeletionInfos) { | ||
this.equipmentType = byFilterDeletionInfos.getEquipmentType(); | ||
if (equipmentFilters == null) { | ||
this.equipmentFilters = byFilterDeletionInfos.getEquipmentFilters().stream().map(FilterInfos::toEntity).collect(Collectors.toList()); | ||
} else { | ||
equipmentFilters.clear(); | ||
equipmentFilters.addAll(byFilterDeletionInfos.getEquipmentFilters().stream().map(FilterInfos::toEntity).collect(Collectors.toList())); | ||
} | ||
} | ||
|
||
@Override | ||
public ByFilterDeletionInfos toModificationInfos() { | ||
return ByFilterDeletionInfos | ||
.builder() | ||
.uuid(getId()) | ||
.date(getDate()) | ||
.stashed(getStashed()) | ||
.equipmentFilters(this.getEquipmentFilters().stream() | ||
.map(filter -> new FilterInfos(filter.getFilterId(), filter.getName())) | ||
.collect(Collectors.toList())) | ||
.equipmentType(getEquipmentType()).build(); | ||
} | ||
} |
105 changes: 105 additions & 0 deletions
105
src/main/java/org/gridsuite/modification/server/modifications/ByFilterDeletion.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
/** | ||
* Copyright (c) 2023, RTE (http://www.rte-france.com) | ||
* This Source Code Form is subject to the terms of the Mozilla Public | ||
* License, v. 2.0. If a copy of the MPL was not distributed with this | ||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||
*/ | ||
package org.gridsuite.modification.server.modifications; | ||
|
||
import com.powsybl.commons.PowsyblException; | ||
import com.powsybl.commons.reporter.Report; | ||
import com.powsybl.commons.reporter.Reporter; | ||
import com.powsybl.commons.reporter.TypedValue; | ||
import com.powsybl.iidm.modification.topology.RemoveFeederBay; | ||
import com.powsybl.iidm.modification.topology.RemoveSubstationBuilder; | ||
import com.powsybl.iidm.modification.topology.RemoveVoltageLevel; | ||
import com.powsybl.iidm.network.IdentifiableType; | ||
import com.powsybl.iidm.network.Network; | ||
import org.gridsuite.modification.server.dto.ByFilterDeletionInfos; | ||
import org.gridsuite.modification.server.dto.FilterEquipments; | ||
import org.gridsuite.modification.server.dto.FilterInfos; | ||
import org.gridsuite.modification.server.dto.IdentifiableAttributes; | ||
import org.gridsuite.modification.server.service.FilterService; | ||
import org.springframework.util.CollectionUtils; | ||
|
||
import java.util.EnumSet; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.UUID; | ||
import java.util.stream.Collectors; | ||
|
||
import static org.gridsuite.modification.server.modifications.ModificationUtils.createReport; | ||
import static org.gridsuite.modification.server.modifications.ModificationUtils.distinctByKey; | ||
|
||
/** | ||
* @author Antoine Bouhours <antoine.bouhours at rte-france.com> | ||
*/ | ||
public class ByFilterDeletion extends AbstractModification { | ||
|
||
private final ByFilterDeletionInfos modificationInfos; | ||
|
||
protected FilterService filterService; | ||
|
||
private static final EnumSet<IdentifiableType> CONNECTABLE_EQUIPMENTS = EnumSet.of( | ||
IdentifiableType.LINE, | ||
IdentifiableType.TWO_WINDINGS_TRANSFORMER, | ||
IdentifiableType.THREE_WINDINGS_TRANSFORMER, | ||
IdentifiableType.GENERATOR, | ||
IdentifiableType.BATTERY, | ||
IdentifiableType.LOAD, | ||
IdentifiableType.SHUNT_COMPENSATOR, | ||
IdentifiableType.DANGLING_LINE, | ||
IdentifiableType.STATIC_VAR_COMPENSATOR | ||
); | ||
public ByFilterDeletion(ByFilterDeletionInfos modificationInfos) { | ||
this.modificationInfos = modificationInfos; | ||
} | ||
|
||
@Override | ||
public void initApplicationContext(NetworkModificationApplicator modificationApplicator) { | ||
filterService = modificationApplicator.getFilterService(); | ||
} | ||
|
||
@Override | ||
public void apply(Network network, Reporter subReporter) { | ||
var filters = modificationInfos.getEquipmentFilters().stream() | ||
.filter(distinctByKey(FilterInfos::getId)) | ||
.collect(Collectors.toMap(FilterInfos::getId, FilterInfos::getName)); | ||
|
||
Map<UUID, FilterEquipments> exportFilters = ModificationUtils.getInstance().getUuidFilterEquipmentsMap(filterService, network, subReporter, filters, modificationInfos); | ||
if (exportFilters == null) return; | ||
Map<UUID, FilterEquipments> exportedFiltersWithWrongEquipmentIds = ModificationUtils.getInstance().getUuidFilterWrongEquipmentsIdsMap(subReporter, exportFilters, filters); | ||
List<IdentifiableAttributes> identifiableAttributes = ModificationUtils.getIdentifiableAttributes(exportFilters, exportedFiltersWithWrongEquipmentIds, modificationInfos.getEquipmentFilters(), subReporter); | ||
|
||
if (CollectionUtils.isEmpty(identifiableAttributes)) { | ||
String filterNames = modificationInfos.getEquipmentFilters().stream().map(FilterInfos::getName).collect(Collectors.joining(", ")); | ||
createReport(subReporter, | ||
"allFiltersWrong", | ||
String.format("All of the following filters have equipments with wrong id : %s", filterNames), | ||
TypedValue.WARN_SEVERITY); | ||
} else { | ||
applyFilterDeletion(network, subReporter, identifiableAttributes); | ||
} | ||
|
||
subReporter.report(Report.builder() | ||
.withKey("equipmentDeleted") | ||
.withDefaultMessage("equipment of type=${type} and ids=${ids} deleted") | ||
.withValue("type", modificationInfos.getEquipmentType()) | ||
.withValue("ids", identifiableAttributes.stream().map(IdentifiableAttributes::getId).collect(Collectors.joining(", "))) | ||
.withSeverity(TypedValue.INFO_SEVERITY) | ||
.build()); | ||
} | ||
|
||
private void applyFilterDeletion(Network network, Reporter subReporter, List<IdentifiableAttributes> identifiableAttributes) { | ||
IdentifiableType identifiableType = IdentifiableType.valueOf(modificationInfos.getEquipmentType()); | ||
if (CONNECTABLE_EQUIPMENTS.contains(identifiableType)) { | ||
identifiableAttributes.forEach(identifiableAttribute -> new RemoveFeederBay(identifiableAttribute.getId()).apply(network, true, subReporter)); | ||
} else if (identifiableType == IdentifiableType.VOLTAGE_LEVEL) { | ||
identifiableAttributes.forEach(identifiableAttribute -> new RemoveVoltageLevel(identifiableAttribute.getId()).apply(network, true, subReporter)); | ||
} else if (identifiableType == IdentifiableType.SUBSTATION) { | ||
identifiableAttributes.forEach(identifiableAttribute -> new RemoveSubstationBuilder().withSubstationId(identifiableAttribute.getId()).build().apply(network, true, subReporter)); | ||
} else { | ||
throw new PowsyblException("Unsupported equipment type"); | ||
} | ||
} | ||
} |
35 changes: 35 additions & 0 deletions
35
src/main/resources/db/changelog/changesets/changelog_20231207T122105Z.xml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
<?xml version="1.1" encoding="UTF-8" standalone="no"?> | ||
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" | ||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" | ||
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd"> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-29"> | ||
<createTable tableName="by_filter_deletion"> | ||
<column name="equipment_type" type="VARCHAR(255)"/> | ||
<column name="id" type="UUID"> | ||
<constraints nullable="false" primaryKey="true" primaryKeyName="by_filter_deletionPK"/> | ||
</column> | ||
</createTable> | ||
</changeSet> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-30"> | ||
<createTable tableName="by_filter_deletion_equipment_filters"> | ||
<column name="id" type="UUID"> | ||
<constraints nullable="false"/> | ||
</column> | ||
<column name="filter_id" type="UUID"> | ||
<constraints nullable="false"/> | ||
</column> | ||
</createTable> | ||
</changeSet> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-31"> | ||
<addUniqueConstraint columnNames="filter_id" constraintName="UC_BY_FILTER_DELETION_EQUIPMENT_FILTERSFILTER_ID_COL" tableName="by_filter_deletion_equipment_filters"/> | ||
</changeSet> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-46"> | ||
<addForeignKeyConstraint baseColumnNames="id" baseTableName="by_filter_deletion" constraintName="ByFilterDeletion_id_fk_constraint" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="modification" validate="true"/> | ||
</changeSet> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-47"> | ||
<addForeignKeyConstraint baseColumnNames="filter_id" baseTableName="by_filter_deletion_equipment_filters" constraintName="FK6mdj9n0jqovnp8k7uv2dvudf3" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="variation_filter" validate="true"/> | ||
</changeSet> | ||
<changeSet author="bouhoursant (generated)" id="1701951681075-48"> | ||
<addForeignKeyConstraint baseColumnNames="id" baseTableName="by_filter_deletion_equipment_filters" constraintName="FKamud9vd6dj9jvojrg0l070ijm" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="by_filter_deletion" validate="true"/> | ||
</changeSet> | ||
</databaseChangeLog> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters