Skip to content

Commit a021f24

Browse files
authored
Add create voltage level topology (#644)
Signed-off-by: Etienne LESOT <[email protected]>
1 parent 11abced commit a021f24

File tree

6 files changed

+191
-3
lines changed

6 files changed

+191
-3
lines changed

src/main/java/org/gridsuite/modification/server/entities/EntityRegistry.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ private EntityRegistry() {
7272
register(LccConverterStationModificationInfos.class, LccConverterStationModificationEntity.class);
7373
register(VoltageLevelTopologyModificationInfos.class, VoltageLevelTopologyModificationEntity.class);
7474
register(CreateCouplingDeviceInfos.class, CreateCouplingDeviceEntity.class);
75+
register(CreateVoltageLevelTopologyInfos.class, CreateVoltageLevelTopologyEntity.class);
7576

7677
// // attatching and splitting
7778
register(LineAttachToVoltageLevelInfos.class, LineAttachToVoltageLevelEntity.class);
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.modification.server.entities.equipment.creation;
8+
9+
import com.powsybl.iidm.network.SwitchKind;
10+
import jakarta.persistence.*;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
import lombok.NonNull;
14+
import org.gridsuite.modification.dto.CreateVoltageLevelTopologyInfos;
15+
import org.gridsuite.modification.dto.ModificationInfos;
16+
import org.gridsuite.modification.server.entities.ModificationEntity;
17+
18+
import java.util.List;
19+
import java.util.stream.Collectors;
20+
21+
/**
22+
* @author etienne Lesot <etienne.lesot at rte-france.com>
23+
*/
24+
@NoArgsConstructor
25+
@Getter
26+
@Entity
27+
@Table(name = "create_voltage_level_topology")
28+
@PrimaryKeyJoinColumn(foreignKey = @ForeignKey(name = "create_voltage_level_topology_id_fk_constraint"))
29+
public class CreateVoltageLevelTopologyEntity extends ModificationEntity {
30+
31+
@Column(name = "voltage_level_id")
32+
private String voltageLevelId;
33+
34+
@Column(name = "section_count")
35+
private Integer sectionCount;
36+
37+
@ElementCollection
38+
@CollectionTable(name = "create_voltage_level_topology_switch_kinds",
39+
joinColumns = @JoinColumn(name = "create_voltage_level_topology_id", foreignKey = @ForeignKey(name = "create_voltage_level_topology_switch_kinds")))
40+
private List<String> switchKinds;
41+
42+
@Override
43+
public void update(@NonNull ModificationInfos modificationInfos) {
44+
super.update(modificationInfos);
45+
assignAttributes((CreateVoltageLevelTopologyInfos) modificationInfos);
46+
}
47+
48+
private void assignAttributes(CreateVoltageLevelTopologyInfos createVoltageLevelTopologyInfos) {
49+
this.voltageLevelId = createVoltageLevelTopologyInfos.getVoltageLevelId();
50+
this.switchKinds = createVoltageLevelTopologyInfos.getSwitchKinds().stream().map(Enum::name).collect(Collectors.toList());
51+
this.sectionCount = createVoltageLevelTopologyInfos.getSectionCount();
52+
}
53+
54+
public CreateVoltageLevelTopologyEntity(CreateVoltageLevelTopologyInfos createVoltageLevelTopologyInfos) {
55+
super(createVoltageLevelTopologyInfos);
56+
assignAttributes(createVoltageLevelTopologyInfos);
57+
}
58+
59+
@Override
60+
public CreateVoltageLevelTopologyInfos toModificationInfos() {
61+
return toCreateVoltageLevelTopologyInfos().build();
62+
}
63+
64+
private CreateVoltageLevelTopologyInfos.CreateVoltageLevelTopologyInfosBuilder<?, ?> toCreateVoltageLevelTopologyInfos() {
65+
return CreateVoltageLevelTopologyInfos.builder()
66+
.uuid(getId())
67+
.date(getDate())
68+
.stashed(getStashed())
69+
.activated(getActivated())
70+
.voltageLevelId(getVoltageLevelId())
71+
.switchKinds(getSwitchKinds().stream().map(SwitchKind::valueOf).collect(Collectors.toList()))
72+
.sectionCount(getSectionCount());
73+
}
74+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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="lesoteti (generated)" id="1750250902704-25">
4+
<createTable tableName="create_voltage_level_topology">
5+
<column name="section_count" type="INT"/>
6+
<column name="voltage_level_id" type="VARCHAR(255)"/>
7+
<column name="id" type="UUID">
8+
<constraints nullable="false" primaryKey="true" primaryKeyName="create_voltage_level_topologyPK"/>
9+
</column>
10+
</createTable>
11+
</changeSet>
12+
<changeSet author="lesoteti (generated)" id="1750250902704-26">
13+
<createTable tableName="create_voltage_level_topology_switch_kinds">
14+
<column name="create_voltage_level_topology_id" type="UUID">
15+
<constraints nullable="false"/>
16+
</column>
17+
<column name="switch_kinds" type="VARCHAR(255)"/>
18+
</createTable>
19+
</changeSet>
20+
<changeSet author="lesoteti (generated)" id="1750250902704-39">
21+
<addForeignKeyConstraint baseColumnNames="create_voltage_level_topology_id" baseTableName="create_voltage_level_topology_switch_kinds" constraintName="create_voltage_level_topology_switch_kinds_fk_constraint" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="create_voltage_level_topology" validate="true"/>
22+
</changeSet>
23+
<changeSet author="lesoteti (generated)" id="1750250902704-43">
24+
<addForeignKeyConstraint baseColumnNames="id" baseTableName="create_voltage_level_topology" constraintName="create_voltage_level_topology_id_fk_constraint" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="modification" validate="true"/>
25+
</changeSet>
26+
</databaseChangeLog>

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,3 +390,6 @@ databaseChangeLog:
390390
- include:
391391
file: changesets/changelog_20250729T080203Z.xml
392392
relativeToChangelogFile: true
393+
- include:
394+
file: changesets/changelog_20250618T124747Z.xml
395+
relativeToChangelogFile: true
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* Copyright (c) 2025, RTE (http://www.rte-france.com)
3+
* This Source Code Form is subject to the terms of the Mozilla Public
4+
* License, v. 2.0. If a copy of the MPL was not distributed with this
5+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
6+
*/
7+
package org.gridsuite.modification.server.modifications;
8+
9+
import com.powsybl.iidm.network.Network;
10+
import com.powsybl.iidm.network.Switch;
11+
import com.powsybl.iidm.network.SwitchKind;
12+
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
13+
import org.gridsuite.modification.dto.CreateVoltageLevelTopologyInfos;
14+
import org.gridsuite.modification.dto.ModificationInfos;
15+
import org.gridsuite.modification.server.utils.NetworkCreation;
16+
import org.junit.jupiter.api.Assertions;
17+
18+
import java.util.ArrayList;
19+
import java.util.List;
20+
import java.util.Set;
21+
import java.util.UUID;
22+
import java.util.stream.Collectors;
23+
24+
import static org.junit.jupiter.api.Assertions.assertEquals;
25+
26+
/**
27+
* @author Etienne Lesot <etienne.lesot at rte-france.com>
28+
*/
29+
public class CreateVoltageLevelTopologyTest extends AbstractNetworkModificationTest {
30+
31+
@Override
32+
protected Network createNetwork(UUID networkUuid) {
33+
return NetworkCreation.createSwitchNetwork(networkUuid, new NetworkFactoryImpl());
34+
}
35+
36+
@Override
37+
protected ModificationInfos buildModification() {
38+
return CreateVoltageLevelTopologyInfos.builder().voltageLevelId("vl1").sectionCount(3)
39+
.switchKinds(List.of(SwitchKind.DISCONNECTOR, SwitchKind.DISCONNECTOR)).build();
40+
}
41+
42+
@Override
43+
protected ModificationInfos buildModificationUpdate() {
44+
return CreateVoltageLevelTopologyInfos.builder().voltageLevelId("vl1").sectionCount(2)
45+
.switchKinds(List.of(SwitchKind.DISCONNECTOR)).build();
46+
}
47+
48+
@Override
49+
protected void assertAfterNetworkModificationCreation() {
50+
List<String> busBarIds = new ArrayList<>();
51+
getNetwork().getBusbarSections().forEach(busbarSection -> busBarIds.add(busbarSection.getId()));
52+
Assertions.assertEquals(5, busBarIds.size());
53+
Assertions.assertTrue(busBarIds.containsAll(List.of("b1", "b2", "vl1_2_1", "vl1_2_2", "vl1_2_3")));
54+
Set<String> switchIds = getNetwork().getSwitchStream().map(Switch::getId).collect(Collectors.toSet());
55+
Assertions.assertTrue(switchIds.containsAll(Set.of("vl1_DISCONNECTOR_4_5", "vl1_DISCONNECTOR_3_4")));
56+
}
57+
58+
@Override
59+
protected void assertAfterNetworkModificationDeletion() {
60+
List<String> busBarIds = new ArrayList<>();
61+
getNetwork().getBusbarSections().forEach(busbarSection -> busBarIds.add(busbarSection.getId()));
62+
Assertions.assertEquals(2, busBarIds.size());
63+
Assertions.assertFalse(busBarIds.containsAll(List.of("v1_1_1", "v1_1_2", "v1_1_3")));
64+
}
65+
66+
@Override
67+
protected void testCreationModificationMessage(ModificationInfos modificationInfos) {
68+
assertEquals("{\"voltageLevelId\":\"vl1\"}", modificationInfos.getMessageValues());
69+
}
70+
71+
@Override
72+
protected void testUpdateModificationMessage(ModificationInfos modificationInfos) {
73+
assertEquals("{\"voltageLevelId\":\"vl1\"}", modificationInfos.getMessageValues());
74+
}
75+
}

src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,14 @@
77
package org.gridsuite.modification.server.utils;
88

99
import com.powsybl.iidm.network.*;
10+
import com.powsybl.iidm.network.extensions.BusbarSectionPositionAdder;
1011
import com.powsybl.iidm.network.extensions.ConnectablePosition;
1112
import com.powsybl.iidm.network.extensions.HvdcAngleDroopActivePowerControlAdder;
1213
import com.powsybl.network.store.iidm.impl.NetworkFactoryImpl;
14+
import org.gridsuite.modification.utils.ModificationUtils;
1315

1416
import java.util.UUID;
1517

16-
import org.gridsuite.modification.utils.ModificationUtils;
17-
1818
import static org.gridsuite.modification.server.utils.NetworkUtil.*;
1919

2020
public final class NetworkCreation {
@@ -42,13 +42,22 @@ public static Network createSwitchNetwork(UUID uuid, NetworkFactory networkFacto
4242
.setName("b1")
4343
.setNode(0)
4444
.add();
45-
45+
vl1.getNodeBreakerView().getBusbarSection("b1")
46+
.newExtension(BusbarSectionPositionAdder.class)
47+
.withBusbarIndex(1)
48+
.withSectionIndex(1)
49+
.add();
4650
VoltageLevel vl2 = createVoltageLevel(s1, "vl2", "vl2", TopologyKind.NODE_BREAKER, 400.0);
4751
vl2.getNodeBreakerView().newBusbarSection()
4852
.setId("b2")
4953
.setName("b2")
5054
.setNode(0)
5155
.add();
56+
vl2.getNodeBreakerView().getBusbarSection("b2")
57+
.newExtension(BusbarSectionPositionAdder.class)
58+
.withBusbarIndex(1)
59+
.withSectionIndex(1)
60+
.add();
5261

5362
createSwitch(vl1, "b4", "b4", SwitchKind.DISCONNECTOR, false, false, false, 0, 1);
5463
createSwitch(vl1, "br11", "br11", SwitchKind.BREAKER, false, false, false, 1, 2);

0 commit comments

Comments
 (0)