Skip to content

Commit a485244

Browse files
authored
Add limit sets tabular modifications (#660)
Signed-off-by: Hugo Marcellin <[email protected]>
1 parent af8f5e0 commit a485244

File tree

10 files changed

+297
-1
lines changed

10 files changed

+297
-1
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.27.0</network-modification.version>
55+
<network-modification.version>0.28.0</network-modification.version>
5656
<powsybl-balances-adjustment.version>2.14.1</powsybl-balances-adjustment.version>
5757
</properties>
5858

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ private EntityRegistry() {
6262
register(VscModificationInfos.class, VscModificationEntity.class);
6363
register(ConverterStationModificationInfos.class, ConverterStationModificationEntity.class);
6464
register(TabularModificationInfos.class, TabularModificationEntity.class);
65+
register(LimitSetsTabularModificationInfos.class, TabularModificationEntity.class);
6566
register(ByFormulaModificationInfos.class, ByFormulaModificationEntity.class);
6667
register(ModificationByAssignmentInfos.class, ModificationByAssignmentEntity.class);
6768
register(EquipmentAttributeModificationInfos.class, EquipmentAttributeModificationEntity.class);

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@ public TabularModificationEntity(@NonNull TabularModificationInfos tabularModifi
4141
assignAttributes(tabularModificationInfos);
4242
}
4343

44+
public TabularModificationEntity(@NonNull LimitSetsTabularModificationInfos tabularModificationInfos) {
45+
super(tabularModificationInfos);
46+
assignAttributes(tabularModificationInfos);
47+
}
48+
4449
@Override
4550
public TabularModificationInfos toModificationInfos() {
4651
List<ModificationInfos> modificationsInfos = modifications.stream().map(ModificationEntity::toModificationInfos).collect(Collectors.toList());

src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
import lombok.NoArgsConstructor;
1313
import org.gridsuite.modification.dto.BranchModificationInfos;
1414
import org.gridsuite.modification.dto.ModificationInfos;
15+
import org.gridsuite.modification.dto.OperationalLimitsGroupModificationInfos;
1516
import org.gridsuite.modification.server.entities.equipment.modification.attribute.*;
1617

18+
import java.util.ArrayList;
19+
import java.util.List;
20+
1721
/**
1822
* @author Ayoub LABIDI <ayoub.labidi at rte-france.com>
1923
*/
@@ -52,6 +56,20 @@ public class BranchModificationEntity extends BasicEquipmentModificationEntity {
5256
), nullable = true)
5357
private CurrentLimitsModificationEntity currentLimits2;
5458

59+
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
60+
@JoinTable(
61+
joinColumns = @JoinColumn(name = "branch_id"),
62+
inverseJoinColumns = @JoinColumn(name = "operational_limits_groups_id"), inverseForeignKey = @ForeignKey(name = "operational_limits_groups_id1_fk"))
63+
@OrderColumn(name = "pos_operationalLimitsGroups")
64+
private List<OperationalLimitsGroupModificationEntity> opLimitsGroups1;
65+
66+
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
67+
@JoinTable(
68+
joinColumns = @JoinColumn(name = "branch_id"),
69+
inverseJoinColumns = @JoinColumn(name = "operational_limits_groups_id"), inverseForeignKey = @ForeignKey(name = "operational_limits_groups_id2_fk"))
70+
@OrderColumn(name = "pos_operationalLimitsGroups")
71+
private List<OperationalLimitsGroupModificationEntity> opLimitsGroups2;
72+
5573
@Embedded
5674
@AttributeOverrides(value = {
5775
@AttributeOverride(name = "value", column = @Column(name = "voltageLevelId1")),
@@ -212,11 +230,13 @@ private void assignAttributes(BranchModificationInfos branchModificationInfos) {
212230
} else {
213231
currentLimits1 = null;
214232
}
233+
this.opLimitsGroups1 = assignOperationalLimitsGroups(branchModificationInfos.getOperationalLimitsGroup1(), opLimitsGroups1);
215234
if (branchModificationInfos.getCurrentLimits2() != null) {
216235
currentLimits2 = new CurrentLimitsModificationEntity(branchModificationInfos.getCurrentLimits2());
217236
} else {
218237
currentLimits2 = null;
219238
}
239+
this.opLimitsGroups2 = assignOperationalLimitsGroups(branchModificationInfos.getOperationalLimitsGroup2(), opLimitsGroups2);
220240
this.voltageLevelId1 = branchModificationInfos.getVoltageLevelId1() != null ? new StringModificationEmbedded(branchModificationInfos.getVoltageLevelId1()) : null;
221241
this.voltageLevelId2 = branchModificationInfos.getVoltageLevelId2() != null ? new StringModificationEmbedded(branchModificationInfos.getVoltageLevelId2()) : null;
222242
this.busOrBusbarSectionId1 = branchModificationInfos.getBusOrBusbarSectionId1() != null ? new StringModificationEmbedded(branchModificationInfos.getBusOrBusbarSectionId1()) : null;
@@ -238,4 +258,24 @@ private void assignAttributes(BranchModificationInfos branchModificationInfos) {
238258
this.q2MeasurementValue = branchModificationInfos.getQ2MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getQ2MeasurementValue()) : null;
239259
this.q2MeasurementValidity = branchModificationInfos.getQ2MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getQ2MeasurementValidity()) : null;
240260
}
261+
262+
/**
263+
* the point of this function is to avoid dereferencing operationalLimitsGroups if it already exists,
264+
* in order to prevent Hibernate from losing the reference during cascade cleaning
265+
*/
266+
private List<OperationalLimitsGroupModificationEntity> assignOperationalLimitsGroups(
267+
List<OperationalLimitsGroupModificationInfos> operationalLimitsGroupInfos,
268+
List<OperationalLimitsGroupModificationEntity> operationalLimitsGroups
269+
) {
270+
List<OperationalLimitsGroupModificationEntity> updatedLimitsGroups = operationalLimitsGroups;
271+
if (operationalLimitsGroups == null) {
272+
updatedLimitsGroups = new ArrayList<>();
273+
} else {
274+
updatedLimitsGroups.clear();
275+
}
276+
if (operationalLimitsGroupInfos != null) {
277+
updatedLimitsGroups.addAll(OperationalLimitsGroupModificationEntity.toOperationalLimitsGroupsEntities(operationalLimitsGroupInfos));
278+
}
279+
return updatedLimitsGroups;
280+
}
241281
}

src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ public LineModificationInfos toModificationInfos() {
125125
if (getCurrentLimits2() != null) {
126126
builder.currentLimits2(getCurrentLimits2().toCurrentLimitsInfos());
127127
}
128+
if (getOpLimitsGroups1() != null) {
129+
builder.operationalLimitsGroup1(OperationalLimitsGroupModificationEntity.fromOperationalLimitsGroupsEntities(getOpLimitsGroups1()));
130+
}
131+
if (getOpLimitsGroups2() != null) {
132+
builder.operationalLimitsGroup2(OperationalLimitsGroupModificationEntity.fromOperationalLimitsGroupsEntities(getOpLimitsGroups2()));
133+
}
128134
return builder;
129135
}
130136

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
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.modification;
8+
9+
import jakarta.persistence.*;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Getter;
12+
import lombok.NoArgsConstructor;
13+
import lombok.NonNull;
14+
import org.gridsuite.modification.dto.OperationalLimitsGroupModificationInfos;
15+
import org.gridsuite.modification.dto.OperationalLimitsGroupModificationType;
16+
import org.gridsuite.modification.dto.TemporaryLimitModificationType;
17+
import org.springframework.util.CollectionUtils;
18+
19+
import java.util.List;
20+
import java.util.Objects;
21+
import java.util.UUID;
22+
import java.util.stream.Collectors;
23+
24+
/**
25+
* @author Hugo Marcellin <hugo.marcelin at rte-france.com>
26+
*/
27+
28+
@Getter
29+
@NoArgsConstructor
30+
@AllArgsConstructor
31+
@Entity
32+
@Table(name = "operational_limits_group_modification")
33+
public class OperationalLimitsGroupModificationEntity {
34+
35+
@Id
36+
@GeneratedValue(strategy = GenerationType.AUTO)
37+
@Column(name = "uuid")
38+
private UUID uuid;
39+
40+
@Column(name = "id")
41+
private String id;
42+
43+
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
44+
@JoinColumn(name = "current_limits_id",
45+
referencedColumnName = "id",
46+
foreignKey = @ForeignKey(
47+
name = "current_limits_id_fk"
48+
))
49+
private CurrentLimitsModificationEntity currentLimits;
50+
51+
@Column(name = "modificationType")
52+
@Enumerated(EnumType.STRING)
53+
private OperationalLimitsGroupModificationType modificationType;
54+
55+
@Column(name = "temporaryLimitsModificationType")
56+
@Enumerated(EnumType.STRING)
57+
private TemporaryLimitModificationType temporaryLimitsModificationType;
58+
59+
@Column(name = "side")
60+
private String side;
61+
62+
public static List<OperationalLimitsGroupModificationEntity> toOperationalLimitsGroupsEntities(@NonNull List<OperationalLimitsGroupModificationInfos> limitsGroups) {
63+
return limitsGroups.stream()
64+
.filter(Objects::nonNull)
65+
.map(limitsGroup ->
66+
new OperationalLimitsGroupModificationEntity(
67+
null,
68+
limitsGroup.getId(),
69+
new CurrentLimitsModificationEntity(limitsGroup.getCurrentLimits()),
70+
limitsGroup.getModificationType(),
71+
limitsGroup.getTemporaryLimitsModificationType(),
72+
limitsGroup.getSide()
73+
)
74+
)
75+
.toList();
76+
}
77+
78+
public static List<OperationalLimitsGroupModificationInfos> fromOperationalLimitsGroupsEntities(List<OperationalLimitsGroupModificationEntity> limitsGroupsEntities) {
79+
return CollectionUtils.isEmpty(limitsGroupsEntities) ? null :
80+
limitsGroupsEntities.stream()
81+
.map(limitsGroupEntity ->
82+
OperationalLimitsGroupModificationInfos.builder()
83+
.id(limitsGroupEntity.getId())
84+
.currentLimits(limitsGroupEntity.getCurrentLimits().toCurrentLimitsInfos())
85+
.modificationType(limitsGroupEntity.getModificationType())
86+
.temporaryLimitsModificationType(limitsGroupEntity.getTemporaryLimitsModificationType())
87+
.side(limitsGroupEntity.getSide())
88+
.build()
89+
)
90+
.collect(Collectors.toList());
91+
}
92+
93+
public OperationalLimitsGroupModificationEntity(OperationalLimitsGroupModificationInfos operationalLimitsGroupModificationInfos) {
94+
this(null, operationalLimitsGroupModificationInfos.getId(), new CurrentLimitsModificationEntity(operationalLimitsGroupModificationInfos.getCurrentLimits()), operationalLimitsGroupModificationInfos.getModificationType(), operationalLimitsGroupModificationInfos.getTemporaryLimitsModificationType(), operationalLimitsGroupModificationInfos.getSide());
95+
}
96+
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
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="marcelinhug (generated)" id="1753286288227-31">
4+
<createTable tableName="line_modification_op_limits_groups1">
5+
<column name="branch_id" type="UUID">
6+
<constraints nullable="false" primaryKey="true" primaryKeyName="line_modification_op_limits_groups1PK"/>
7+
</column>
8+
<column name="operational_limits_groups_id" type="UUID">
9+
<constraints nullable="false"/>
10+
</column>
11+
<column name="pos_operational_limits_groups" type="INT">
12+
<constraints nullable="false" primaryKey="true" primaryKeyName="line_modification_op_limits_groups1PK"/>
13+
</column>
14+
</createTable>
15+
</changeSet>
16+
<changeSet author="marcelinhug (generated)" id="1753286288227-32">
17+
<createTable tableName="line_modification_op_limits_groups2">
18+
<column name="branch_id" type="UUID">
19+
<constraints nullable="false" primaryKey="true" primaryKeyName="line_modification_op_limits_groups2PK"/>
20+
</column>
21+
<column name="operational_limits_groups_id" type="UUID">
22+
<constraints nullable="false"/>
23+
</column>
24+
<column name="pos_operational_limits_groups" type="INT">
25+
<constraints nullable="false" primaryKey="true" primaryKeyName="line_modification_op_limits_groups2PK"/>
26+
</column>
27+
</createTable>
28+
</changeSet>
29+
<changeSet author="marcelinhug (generated)" id="1753286288227-33">
30+
<createTable tableName="operational_limits_group_modification">
31+
<column name="uuid" type="UUID">
32+
<constraints nullable="false" primaryKey="true" primaryKeyName="operational_limits_group_modificationPK"/>
33+
</column>
34+
<column name="id" type="VARCHAR(255)"/>
35+
<column name="modification_type" type="VARCHAR(255)"/>
36+
<column name="side" type="VARCHAR(255)"/>
37+
<column name="temporary_limits_modification_type" type="VARCHAR(255)"/>
38+
<column name="current_limits_id" type="UUID"/>
39+
</createTable>
40+
</changeSet>
41+
<changeSet author="marcelinhug (generated)" id="1753286288227-34">
42+
<createTable tableName="two_windings_transformer_modification_op_limits_groups1">
43+
<column name="branch_id" type="UUID">
44+
<constraints nullable="false" primaryKey="true" primaryKeyName="two_windings_transformer_modification_op_limits_groups1PK"/>
45+
</column>
46+
<column name="operational_limits_groups_id" type="UUID">
47+
<constraints nullable="false"/>
48+
</column>
49+
<column name="pos_operational_limits_groups" type="INT">
50+
<constraints nullable="false" primaryKey="true" primaryKeyName="two_windings_transformer_modification_op_limits_groups1PK"/>
51+
</column>
52+
</createTable>
53+
</changeSet>
54+
<changeSet author="marcelinhug (generated)" id="1753286288227-35">
55+
<createTable tableName="two_windings_transformer_modification_op_limits_groups2">
56+
<column name="branch_id" type="UUID">
57+
<constraints nullable="false" primaryKey="true" primaryKeyName="two_windings_transformer_modification_op_limits_groups2PK"/>
58+
</column>
59+
<column name="operational_limits_groups_id" type="UUID">
60+
<constraints nullable="false"/>
61+
</column>
62+
<column name="pos_operational_limits_groups" type="INT">
63+
<constraints nullable="false" primaryKey="true" primaryKeyName="two_windings_transformer_modification_op_limits_groups2PK"/>
64+
</column>
65+
</createTable>
66+
</changeSet>
67+
<changeSet author="marcelinhug (generated)" id="1753286288227-54">
68+
<addForeignKeyConstraint baseColumnNames="branch_id" baseTableName="line_modification_op_limits_groups1" constraintName="line_op1_branch_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="line_modification" validate="true"/>
69+
</changeSet>
70+
<changeSet author="marcelinhug (generated)" id="1753286288227-55">
71+
<addForeignKeyConstraint baseColumnNames="branch_id" baseTableName="line_modification_op_limits_groups2" constraintName="line_op2_branch_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="line_modification" validate="true"/>
72+
</changeSet>
73+
<changeSet author="marcelinhug (generated)" id="1753286288227-56">
74+
<addForeignKeyConstraint baseColumnNames="branch_id" baseTableName="two_windings_transformer_modification_op_limits_groups1" constraintName="twt_op1_branch_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="two_windings_transformer_modification" validate="true"/>
75+
</changeSet>
76+
<changeSet author="marcelinhug (generated)" id="1753286288227-57">
77+
<addForeignKeyConstraint baseColumnNames="branch_id" baseTableName="two_windings_transformer_modification_op_limits_groups2" constraintName="twt_op2_branch_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="two_windings_transformer_modification" validate="true"/>
78+
</changeSet>
79+
<changeSet author="marcelinhug (generated)" id="1753286288227-60">
80+
<addForeignKeyConstraint baseColumnNames="current_limits_id" baseTableName="operational_limits_group_modification" constraintName="current_limits_op_id_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="current_limits_modification" validate="true"/>
81+
</changeSet>
82+
<changeSet author="marcelinhug (generated)" id="1753286288227-61">
83+
<addForeignKeyConstraint baseColumnNames="current_limits_modification_id1" baseTableName="two_windings_transformer_modification" constraintName="twt_mod_current_limits_modification_id1_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="current_limits_modification" validate="true"/>
84+
</changeSet>
85+
<changeSet author="marcelinhug (generated)" id="1753286288227-62">
86+
<addForeignKeyConstraint baseColumnNames="current_limits_modification_id2" baseTableName="two_windings_transformer_modification" constraintName="twt_mod_current_limits_modification_id2_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="id" referencedTableName="current_limits_modification" validate="true"/>
87+
</changeSet>
88+
<changeSet author="marcelinhug (generated)" id="1753286288227-63">
89+
<addForeignKeyConstraint baseColumnNames="operational_limits_groups_id" baseTableName="line_modification_op_limits_groups1" constraintName="line_mod_operational_limits_groups_id1_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="uuid" referencedTableName="operational_limits_group_modification" validate="true"/>
90+
</changeSet>
91+
<changeSet author="marcelinhug (generated)" id="1753286288227-64">
92+
<addForeignKeyConstraint baseColumnNames="operational_limits_groups_id" baseTableName="two_windings_transformer_modification_op_limits_groups1" constraintName="twt_mod_operational_limits_groups_id1_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="uuid" referencedTableName="operational_limits_group_modification" validate="true"/>
93+
</changeSet>
94+
<changeSet author="marcelinhug (generated)" id="1753286288227-65">
95+
<addForeignKeyConstraint baseColumnNames="operational_limits_groups_id" baseTableName="line_modification_op_limits_groups2" constraintName="line_mod_operational_limits_groups_id2_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="uuid" referencedTableName="operational_limits_group_modification" validate="true"/>
96+
</changeSet>
97+
<changeSet author="marcelinhug (generated)" id="1753286288227-66">
98+
<addForeignKeyConstraint baseColumnNames="operational_limits_groups_id" baseTableName="two_windings_transformer_modification_op_limits_groups2" constraintName="twt_mod_operational_limits_groups_id2_fk" deferrable="false" initiallyDeferred="false" referencedColumnNames="uuid" referencedTableName="operational_limits_group_modification" validate="true"/>
99+
</changeSet>
100+
</databaseChangeLog>

0 commit comments

Comments
 (0)