Skip to content

Commit 82d3789

Browse files
authored
Add Limits properties to operational limits groups (#704)
Signed-off-by: basseche <[email protected]>
1 parent 8111d65 commit 82d3789

File tree

11 files changed

+147
-23
lines changed

11 files changed

+147
-23
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
<sonar.organization>gridsuite</sonar.organization>
5353
<sonar.projectKey>org.gridsuite:network-modification-server</sonar.projectKey>
5454
<!-- TODO network-modification.version remove when upgrading gridsuite dependencies -->
55-
<network-modification.version>0.44.0</network-modification.version>
55+
<network-modification.version>0.45.0</network-modification.version>
5656
<!-- FIXME: powsybl-network-store modules'version is overloaded in the dependencies section.The overloads and this property below have to be removed at next powsybl-ws-dependencies.version upgrade -->
5757
<powsybl-network-store.version>1.31.0</powsybl-network-store.version>
5858
<powsybl-balances-adjustment.version>2.14.1</powsybl-balances-adjustment.version>

src/main/java/org/gridsuite/modification/server/entities/equipment/creation/OperationalLimitsGroupEntity.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@
88

99
import jakarta.persistence.*;
1010
import lombok.*;
11+
import org.gridsuite.modification.dto.LimitsPropertyInfos;
1112
import org.gridsuite.modification.dto.OperationalLimitsGroupInfos;
13+
import org.gridsuite.modification.server.entities.equipment.modification.LimitsPropertyEntity;
1214
import org.springframework.util.CollectionUtils;
1315

16+
import java.util.ArrayList;
1417
import java.util.List;
1518
import java.util.Objects;
1619
import java.util.UUID;
@@ -38,6 +41,10 @@ public class OperationalLimitsGroupEntity {
3841
@Enumerated(EnumType.STRING)
3942
private OperationalLimitsGroupInfos.Applicability applicability;
4043

44+
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
45+
@JoinColumn(name = "operational_limit_group_id", foreignKey = @ForeignKey(name = "operational_limit_group_id_fk"))
46+
private List<LimitsPropertyEntity> limitsProperties;
47+
4148
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
4249
@JoinColumn(name = "current_limits_id",
4350
referencedColumnName = "id",
@@ -46,6 +53,14 @@ public class OperationalLimitsGroupEntity {
4653
))
4754
private CurrentLimitsEntity currentLimits;
4855

56+
private static List<LimitsPropertyEntity> toLimitPropertyEntities(List<LimitsPropertyInfos> properties) {
57+
List<LimitsPropertyEntity> result = new ArrayList<>();
58+
if (!CollectionUtils.isEmpty(properties)) {
59+
result = properties.stream().map(LimitsPropertyEntity::fromLimitsPropertyInfos).toList();
60+
}
61+
return result;
62+
}
63+
4964
public static List<OperationalLimitsGroupEntity> toOperationalLimitsGroupsEntities(@NonNull List<OperationalLimitsGroupInfos> limitsGroups) {
5065
return limitsGroups.stream()
5166
.filter(Objects::nonNull)
@@ -54,6 +69,7 @@ public static List<OperationalLimitsGroupEntity> toOperationalLimitsGroupsEntiti
5469
null,
5570
limitsGroup.getId(),
5671
limitsGroup.getApplicability(),
72+
toLimitPropertyEntities(limitsGroup.getLimitsProperties()),
5773
new CurrentLimitsEntity(limitsGroup.getCurrentLimits())
5874
)
5975
)
@@ -68,6 +84,8 @@ public static List<OperationalLimitsGroupInfos> fromOperationalLimitsGroupsEntit
6884
.id(limitsGroupEntity.getId())
6985
.applicability(limitsGroupEntity.getApplicability())
7086
.currentLimits(limitsGroupEntity.getCurrentLimits().toCurrentLimitsInfos())
87+
.limitsProperties(limitsGroupEntity.getLimitsProperties()
88+
.stream().map(LimitsPropertyEntity::toLimitsPropertyInfos).toList())
7189
.build()
7290
)
7391
.collect(Collectors.toList());
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
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+
8+
package org.gridsuite.modification.server.entities.equipment.modification;
9+
10+
import jakarta.persistence.*;
11+
import lombok.AllArgsConstructor;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
import lombok.Setter;
15+
import org.gridsuite.modification.dto.LimitsPropertyInfos;
16+
17+
import java.util.UUID;
18+
19+
/**
20+
* @author El Cheikh Bassel <bassel.el-cheikh_externe at rte-france.com>
21+
*/
22+
23+
@Getter
24+
@Setter
25+
@NoArgsConstructor
26+
@AllArgsConstructor
27+
@Entity
28+
@Table(name = "limits_property")
29+
public class LimitsPropertyEntity {
30+
@Id
31+
@GeneratedValue(strategy = GenerationType.AUTO)
32+
@Column(name = "id")
33+
private UUID id;
34+
35+
@Column(name = "name", nullable = false)
36+
private String name;
37+
38+
@Column(name = "value_", nullable = false)
39+
private String value;
40+
41+
public static LimitsPropertyEntity fromLimitsPropertyInfos(LimitsPropertyInfos propertyInfos) {
42+
return new LimitsPropertyEntity(null, propertyInfos.name(), propertyInfos.value());
43+
}
44+
45+
public LimitsPropertyInfos toLimitsPropertyInfos() {
46+
return new LimitsPropertyInfos(name, value);
47+
}
48+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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="elcheikhbas (generated)" id="1760014971491-1">
4+
<createTable tableName="limits_property">
5+
<column name="id" type="UUID">
6+
<constraints nullable="false" primaryKey="true" primaryKeyName="limits_propertyPK"/>
7+
</column>
8+
<column name="name" type="VARCHAR(255)">
9+
<constraints nullable="false"/>
10+
</column>
11+
<column name="value_" type="VARCHAR(255)">
12+
<constraints nullable="false"/>
13+
</column>
14+
<column name="operational_limit_group_id" type="UUID"/>
15+
</createTable>
16+
</changeSet>
17+
<changeSet author="elcheikhbas (generated)" id="1760014971491-2">
18+
<addForeignKeyConstraint baseColumnNames="operational_limit_group_id" baseTableName="limits_property" constraintName="operational_limit_group_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="uuid" referencedTableName="operational_limits_group" validate="true"/>
19+
</changeSet>
20+
</databaseChangeLog>

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -417,10 +417,12 @@ databaseChangeLog:
417417
- include:
418418
file: changesets/changelog_20250923T141508Z.xml
419419
relativeToChangelogFile: true
420-
421420
- include:
422421
file: changesets/changelog_20250930T101841Z.xml
423422
relativeToChangelogFile: true
424423
- include:
425424
file: changesets/changelog_20250930T132326Z.xml
426-
relativeToChangelogFile: true
425+
relativeToChangelogFile: true
426+
- include:
427+
file: changesets/changelog_20251009T130154Z.xml
428+
relativeToChangelogFile: true

src/test/java/org/gridsuite/modification/server/modifications/LineCreationInBusBreakerTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ void testCreateLineOptionalParameters3() throws Exception {
117117
.currentLimits(
118118
CurrentLimitsInfos.builder().permanentLimit(1.0).temporaryLimits(Collections.emptyList()).build()
119119
)
120-
.id("limitSet1").applicability(SIDE2)
120+
.id("limitSet1").applicability(SIDE2).limitsProperties(Collections.emptyList())
121121
.build()
122122
)
123123
)
@@ -149,7 +149,7 @@ void testCreateLineOptionalParameters4() throws Exception {
149149
List.of(
150150
OperationalLimitsGroupInfos.builder().currentLimits(
151151
CurrentLimitsInfos.builder().permanentLimit(5.0).temporaryLimits(Collections.emptyList()).build()
152-
).applicability(SIDE1).build()
152+
).applicability(SIDE1).limitsProperties(List.of(new LimitsPropertyInfos(PROPERTY_NAME, PROPERTY_VALUE))).build()
153153
)
154154
)
155155
.build();
@@ -179,6 +179,7 @@ void testCreateLineOptionalParameters5() throws Exception {
179179
.operationalLimitsGroups(
180180
List.of(
181181
OperationalLimitsGroupInfos.builder()
182+
.id("limitSet1")
182183
.currentLimits(
183184
CurrentLimitsInfos.builder().permanentLimit(-1.0).build())
184185
.applicability(SIDE1).build()
@@ -243,10 +244,10 @@ protected ModificationInfos buildModification() {
243244
List.of(
244245
OperationalLimitsGroupInfos.builder().currentLimits(
245246
CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build())
246-
.applicability(SIDE1).build(),
247+
.applicability(SIDE1).limitsProperties(Collections.emptyList()).build(),
247248
OperationalLimitsGroupInfos.builder().currentLimits(
248249
CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build())
249-
.applicability(SIDE2).build()
250+
.applicability(SIDE2).limitsProperties(Collections.emptyList()).build()
250251
)
251252
)
252253
.voltageLevelId2("v2")

src/test/java/org/gridsuite/modification/server/modifications/LineCreationInNodeBreakerTest.java

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

99
import com.fasterxml.jackson.core.type.TypeReference;
10+
import com.powsybl.iidm.network.Line;
1011
import com.powsybl.iidm.network.Network;
12+
import com.powsybl.iidm.network.OperationalLimitsGroup;
1113
import com.powsybl.iidm.network.extensions.ConnectablePosition;
1214
import org.gridsuite.modification.NetworkModificationException;
1315
import org.gridsuite.modification.dto.*;
@@ -32,6 +34,10 @@
3234
class LineCreationInNodeBreakerTest extends AbstractNetworkModificationTest {
3335
private static final String PROPERTY_NAME = "property-name";
3436
private static final String PROPERTY_VALUE = "property-value";
37+
private static final String PROP1_NAME = "prop1";
38+
private static final String PROP2_NAME = "prop2";
39+
private static final String PROP1_VALUE = "value1";
40+
private static final String PROP2_VALUE = "value2";
3541

3642
@Test
3743
void testCreateWithBadVariant() throws Exception {
@@ -252,11 +258,37 @@ void testCreateLineWithBothCurrentLimits() throws Exception {
252258
testNetworkModificationsCount(getGroupId(), 1);
253259

254260
assertEquals(
255-
"LineCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=LINE_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true), equipmentId=idLineEdited, properties=null), equipmentName=nameLineEdited), r=110.0, x=110.0, voltageLevelId1=v2, voltageLevelId2=v1, busOrBusbarSectionId1=1A, busOrBusbarSectionId2=1.1, operationalLimitsGroups=[OperationalLimitsGroupInfos(id=null, currentLimits=CurrentLimitsInfos(permanentLimit=200.0, temporaryLimits=[CurrentTemporaryLimitCreationInfos(name=IT10, value=200.0, acceptableDuration=600)]), applicability=SIDE1), OperationalLimitsGroupInfos(id=null, currentLimits=CurrentLimitsInfos(permanentLimit=100.0, temporaryLimits=[CurrentTemporaryLimitCreationInfos(name=IT20, value=600.0, acceptableDuration=1200)]), applicability=SIDE2)], selectedOperationalLimitsGroup1=null, selectedOperationalLimitsGroup2=null, connectionName1=cn1LineEdited, connectionDirection1=BOTTOM, connectionName2=cn2LineEdited, connectionDirection2=TOP, connectionPosition1=0, connectionPosition2=0, connected1=true, connected2=false), g1=15.0, b1=15.0, g2=25.0, b2=25.0)",
261+
"LineCreationInfos(super=BranchCreationInfos(super=EquipmentCreationInfos(super=EquipmentModificationInfos(super=ModificationInfos(uuid=null, type=LINE_CREATION, date=null, stashed=false, messageType=null, messageValues=null, activated=true), equipmentId=idLineEdited, properties=null), equipmentName=nameLineEdited), r=110.0, x=110.0, voltageLevelId1=v2, voltageLevelId2=v1, busOrBusbarSectionId1=1A, busOrBusbarSectionId2=1.1, operationalLimitsGroups=[OperationalLimitsGroupInfos(id=null, currentLimits=CurrentLimitsInfos(permanentLimit=200.0, temporaryLimits=[CurrentTemporaryLimitCreationInfos(name=IT10, value=200.0, acceptableDuration=600)]), applicability=SIDE1, limitsProperties=null), OperationalLimitsGroupInfos(id=null, currentLimits=CurrentLimitsInfos(permanentLimit=100.0, temporaryLimits=[CurrentTemporaryLimitCreationInfos(name=IT20, value=600.0, acceptableDuration=1200)]), applicability=SIDE2, limitsProperties=null)], selectedOperationalLimitsGroup1=null, selectedOperationalLimitsGroup2=null, connectionName1=cn1LineEdited, connectionDirection1=BOTTOM, connectionName2=cn2LineEdited, connectionDirection2=TOP, connectionPosition1=0, connectionPosition2=0, connected1=true, connected2=false), g1=15.0, b1=15.0, g2=25.0, b2=25.0)",
256262
lineCreation.toString()
257263
);
258264
}
259265

266+
@Test
267+
void testCreateLimitsProperties() {
268+
LineCreationInfos modificationInfos = (LineCreationInfos) buildModification();
269+
modificationInfos.setOperationalLimitsGroups(List.of(
270+
OperationalLimitsGroupInfos.builder()
271+
.id("newLimit")
272+
.applicability(SIDE1)
273+
.limitsProperties(List.of(new LimitsPropertyInfos(PROP1_NAME, PROP1_VALUE),
274+
new LimitsPropertyInfos(PROP2_NAME, PROP2_VALUE)))
275+
.currentLimits(CurrentLimitsInfos.builder().permanentLimit(10.0)
276+
.build())
277+
.build()));
278+
279+
modificationInfos.toModification().apply(getNetwork());
280+
Line line = getNetwork().getLine("idLine");
281+
assertNotNull(line);
282+
Optional<OperationalLimitsGroup> limitSet = line.getOperationalLimitsGroup1("newLimit");
283+
assertTrue(limitSet.isPresent());
284+
Set<String> propertiesName = limitSet.get().getPropertyNames();
285+
assertEquals(2, propertiesName.size());
286+
assertTrue(propertiesName.contains(PROP1_NAME));
287+
assertTrue(propertiesName.contains(PROP2_NAME));
288+
assertEquals(PROP1_VALUE, limitSet.get().getProperty(PROP1_NAME));
289+
assertEquals(PROP2_VALUE, limitSet.get().getProperty(PROP2_NAME));
290+
}
291+
260292
@Override
261293
protected Network createNetwork(UUID networkUuid) {
262294
return NetworkCreation.create(networkUuid, true);
@@ -308,10 +340,10 @@ protected ModificationInfos buildModificationUpdate() {
308340
List.of(
309341
OperationalLimitsGroupInfos.builder().currentLimits(
310342
CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build()
311-
).applicability(SIDE1).build(),
343+
).applicability(SIDE1).limitsProperties(Collections.emptyList()).build(),
312344
OperationalLimitsGroupInfos.builder().currentLimits(
313345
CurrentLimitsInfos.builder().permanentLimit(5.).temporaryLimits(Collections.emptyList()).build()
314-
).applicability(SIDE2).build()
346+
).applicability(SIDE2).limitsProperties(Collections.emptyList()).build()
315347
)
316348
)
317349
.connectionName1("cn1LineEdited")

src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerCreationBusBreakerTest.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springframework.http.MediaType;
1919
import org.springframework.test.web.servlet.MvcResult;
2020

21+
import java.util.Collections;
2122
import java.util.List;
2223
import java.util.Map;
2324
import java.util.Set;
@@ -65,10 +66,10 @@ protected ModificationInfos buildModification() {
6566
List.of(
6667
OperationalLimitsGroupInfos.builder().currentLimits(
6768
CurrentLimitsInfos.builder().permanentLimit(3.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(98647).value(45.).build())).build()
68-
).applicability(SIDE1).build(),
69+
).applicability(SIDE1).limitsProperties(Collections.emptyList()).build(),
6970
OperationalLimitsGroupInfos.builder().currentLimits(
7071
CurrentLimitsInfos.builder().permanentLimit(2.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build())).build()
71-
).applicability(SIDE2).build()
72+
).applicability(SIDE2).limitsProperties(Collections.emptyList()).build()
7273
)
7374
)
7475
.connectionName1("cn201")
@@ -182,10 +183,10 @@ protected ModificationInfos buildModificationUpdate() {
182183
OperationalLimitsGroupInfos.builder().currentLimits(CurrentLimitsInfos.builder()
183184
.permanentLimit(3.)
184185
.temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(98647).value(45.).build())).build()
185-
).applicability(SIDE1).build(),
186+
).applicability(SIDE1).limitsProperties(Collections.emptyList()).build(),
186187
OperationalLimitsGroupInfos.builder().currentLimits(CurrentLimitsInfos.builder()
187188
.permanentLimit(2.).temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build())).build()
188-
).applicability(SIDE2).build()
189+
).applicability(SIDE2).limitsProperties(Collections.emptyList()).build()
189190
)
190191
)
191192
.connectionName1("cn2012")

src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerCreationMixedBreakerTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.junit.jupiter.api.Test;
1818
import org.springframework.http.MediaType;
1919

20+
import java.util.Collections;
2021
import java.util.List;
2122
import java.util.Map;
2223
import java.util.UUID;
@@ -170,13 +171,13 @@ protected ModificationInfos buildModificationUpdate() {
170171
.permanentLimit(3.)
171172
.temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT5").acceptableDuration(98647).value(45.).build()))
172173
.build()
173-
).applicability(SIDE1).build(),
174+
).applicability(SIDE1).limitsProperties(Collections.emptyList()).build(),
174175
OperationalLimitsGroupInfos.builder()
175176
.currentLimits(CurrentLimitsInfos.builder()
176177
.permanentLimit(2.)
177178
.temporaryLimits(List.of(CurrentTemporaryLimitCreationInfos.builder().name("IT10").acceptableDuration(683647).value(791.).build()))
178179
.build()
179-
).applicability(SIDE2).build()
180+
).applicability(SIDE2).limitsProperties(Collections.emptyList()).build()
180181
)
181182
)
182183
.connectionName1("cn2012")

0 commit comments

Comments
 (0)