Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -25,20 +25,20 @@
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "currentLimits")
@Table(name = "current_limits")
public class CurrentLimitsEntity {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private UUID id;

@Column(name = "permanentLimit")
@Column(name = "permanent_limit")
private Double permanentLimit;

@ElementCollection
@CollectionTable(
name = "currentTemporaryLimits",
name = "current_temporary_limits",
joinColumns = @JoinColumn(name = "id", foreignKey = @ForeignKey(name = "temporaryLimits_fk_constraint"))
)
private List<CurrentTemporaryLimitCreationEmbeddable> temporaryLimits;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,12 @@

import jakarta.persistence.*;
import lombok.*;
import org.gridsuite.modification.dto.LimitsPropertyInfos;
import org.gridsuite.modification.dto.OperationalLimitsGroupInfos;
import org.gridsuite.modification.server.entities.equipment.modification.LimitsPropertyEntity;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
Expand Down Expand Up @@ -38,6 +41,10 @@ public class OperationalLimitsGroupEntity {
@Enumerated(EnumType.STRING)
private OperationalLimitsGroupInfos.Applicability applicability;

@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "operational_limit_group_id", foreignKey = @ForeignKey(name = "operational_limit_group_id_fk"))
private List<LimitsPropertyEntity> limitsProperties;

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
@JoinColumn(name = "current_limits_id",
referencedColumnName = "id",
Expand All @@ -46,6 +53,14 @@ public class OperationalLimitsGroupEntity {
))
private CurrentLimitsEntity currentLimits;

private static List<LimitsPropertyEntity> toLimitPropertyEntities(List<LimitsPropertyInfos> properties) {
List<LimitsPropertyEntity> result = new ArrayList<>();
if (!CollectionUtils.isEmpty(properties)) {
result = properties.stream().map(LimitsPropertyEntity::fromLimitsPropertyInfos).toList();
}
return result;
}

public static List<OperationalLimitsGroupEntity> toOperationalLimitsGroupsEntities(@NonNull List<OperationalLimitsGroupInfos> limitsGroups) {
return limitsGroups.stream()
.filter(Objects::nonNull)
Expand All @@ -54,6 +69,7 @@ public static List<OperationalLimitsGroupEntity> toOperationalLimitsGroupsEntiti
null,
limitsGroup.getId(),
limitsGroup.getApplicability(),
toLimitPropertyEntities(limitsGroup.getLimitsProperties()),
new CurrentLimitsEntity(limitsGroup.getCurrentLimits())
)
)
Expand All @@ -68,6 +84,8 @@ public static List<OperationalLimitsGroupInfos> fromOperationalLimitsGroupsEntit
.id(limitsGroupEntity.getId())
.applicability(limitsGroupEntity.getApplicability())
.currentLimits(limitsGroupEntity.getCurrentLimits().toCurrentLimitsInfos())
.limitsProperties(limitsGroupEntity.getLimitsProperties()
.stream().map(LimitsPropertyEntity::toLimitsPropertyInfos).toList())
.build()
)
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
/*
* Copyright (c) 2025, 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.modification;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.gridsuite.modification.dto.LimitsPropertyInfos;

import java.util.UUID;

/**
* @author basseche <bassel.el-cheikh_externe at rte-france.com>
*/

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "limits_property")
public class LimitsPropertyEntity {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private UUID id;

@Column(name = "name", nullable = false)
private String name;

@Column(name = "value", nullable = false)
private String value;

public static LimitsPropertyEntity fromLimitsPropertyInfos(LimitsPropertyInfos propertyInfos) {
return new LimitsPropertyEntity(null, propertyInfos.name(), propertyInfos.value());
}

public LimitsPropertyInfos toLimitsPropertyInfos() {
return new LimitsPropertyInfos(name, value);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,11 +49,11 @@ public class OperationalLimitsGroupModificationEntity {
))
private CurrentLimitsModificationEntity currentLimits;

@Column(name = "modificationType")
@Column(name = "modification_type")
@Enumerated(EnumType.STRING)
private OperationalLimitsGroupModificationType modificationType;

@Column(name = "temporaryLimitsModificationType")
@Column(name = "temporary_limits_modification_type")
@Enumerated(EnumType.STRING)
private TemporaryLimitModificationType temporaryLimitsModificationType;

Expand All @@ -72,9 +72,7 @@ public static List<OperationalLimitsGroupModificationEntity> toOperationalLimits
limitsGroup.getModificationType(),
limitsGroup.getTemporaryLimitsModificationType(),
limitsGroup.getApplicability()
)
)
.toList();
)).toList();
}

public static List<OperationalLimitsGroupModificationInfos> fromOperationalLimitsGroupsEntities(List<OperationalLimitsGroupModificationEntity> limitsGroupsEntities) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<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">
<changeSet author="elcheikhbas (generated)" id="1760014971491-1">
<createTable tableName="limits_property">
<column name="id" type="UUID">
<constraints nullable="false" primaryKey="true" primaryKeyName="limits_propertyPK"/>
</column>
<column name="name" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="value" type="VARCHAR(255)">
<constraints nullable="false"/>
</column>
<column name="operational_limit_group_id" type="UUID"/>
</createTable>
</changeSet>
<changeSet author="elcheikhbas (generated)" id="1760014971491-2">
<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"/>
</changeSet>
</databaseChangeLog>
6 changes: 4 additions & 2 deletions src/main/resources/db/changelog/db.changelog-master.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -417,10 +417,12 @@ databaseChangeLog:
- include:
file: changesets/changelog_20250923T141508Z.xml
relativeToChangelogFile: true

- include:
file: changesets/changelog_20250930T101841Z.xml
relativeToChangelogFile: true
- include:
file: changesets/changelog_20250930T132326Z.xml
relativeToChangelogFile: true
relativeToChangelogFile: true
- include:
file: changesets/changelog_20251009T130154Z.xml
relativeToChangelogFile: true
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
package org.gridsuite.modification.server.modifications;

import com.fasterxml.jackson.core.type.TypeReference;
import com.powsybl.iidm.network.Line;
import com.powsybl.iidm.network.Network;
import com.powsybl.iidm.network.OperationalLimitsGroup;
import com.powsybl.iidm.network.extensions.ConnectablePosition;
import org.gridsuite.modification.NetworkModificationException;
import org.gridsuite.modification.dto.*;
Expand All @@ -32,6 +34,10 @@
class LineCreationInNodeBreakerTest extends AbstractNetworkModificationTest {
private static final String PROPERTY_NAME = "property-name";
private static final String PROPERTY_VALUE = "property-value";
private static final String PROP1_NAME = "prop1";
private static final String PROP2_NAME = "prop2";
private static final String PROP1_VALUE = "value1";
private static final String PROP2_VALUE = "value2";

@Test
void testCreateWithBadVariant() throws Exception {
Expand Down Expand Up @@ -252,11 +258,37 @@ void testCreateLineWithBothCurrentLimits() throws Exception {
testNetworkModificationsCount(getGroupId(), 1);

assertEquals(
"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)",
"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)",
lineCreation.toString()
);
}

@Test
void testCreateLimitsProperties() {
LineCreationInfos modificationInfos = (LineCreationInfos) buildModification();
modificationInfos.setOperationalLimitsGroups(List.of(
OperationalLimitsGroupInfos.builder()
.id("newLimit")
.applicability(SIDE1)
.limitsProperties(List.of(new LimitsPropertyInfos(PROP1_NAME, PROP1_VALUE),
new LimitsPropertyInfos(PROP2_NAME, PROP2_VALUE)))
.currentLimits(CurrentLimitsInfos.builder().permanentLimit(10.0)
.build())
.build()));

modificationInfos.toModification().apply(getNetwork());
Line line = getNetwork().getLine("idLine");
assertNotNull(line);
Optional<OperationalLimitsGroup> limitSet = line.getOperationalLimitsGroup1("newLimit");
assertTrue(limitSet.isPresent());
Set<String> propertiesName = limitSet.get().getPropertyNames();
assertEquals(2, propertiesName.size());
assertTrue(propertiesName.contains(PROP1_NAME));
assertTrue(propertiesName.contains(PROP2_NAME));
assertEquals(PROP1_VALUE, limitSet.get().getProperty(PROP1_NAME));
assertEquals(PROP2_VALUE, limitSet.get().getProperty(PROP2_NAME));
}

@Override
protected Network createNetwork(UUID networkUuid) {
return NetworkCreation.create(networkUuid, true);
Expand Down
Loading