From 518d498ff5a32214f690a135cd13a324eb44711b Mon Sep 17 00:00:00 2001 From: Ghazoua Rehili Date: Tue, 18 Feb 2025 08:46:10 +0100 Subject: [PATCH 1/2] release 0.8.0 network modification version (#603) Signed-off-by: Ghazwa Rehili --- pom.xml | 2 +- .../server/ModificationControllerTest.java | 3 +-- .../TwoWindingsTransformerModificationTest.java | 10 +++++----- ...TabularTwoWindingsTransformerModificationsTest.java | 2 +- .../modification/server/utils/NetworkCreation.java | 2 +- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 2a4e4aea4..e24c89782 100644 --- a/pom.xml +++ b/pom.xml @@ -49,7 +49,7 @@ 5.0.0-alpha.14 org.gridsuite.modification.server **/migration/**/* - 0.7.0 + 0.8.0 diff --git a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java index 0f6009e64..32181b486 100644 --- a/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java +++ b/src/test/java/org/gridsuite/modification/server/ModificationControllerTest.java @@ -208,8 +208,7 @@ void testEquipmentIdNonNull() { String errorMessage = "equipmentId is marked non-null but is null"; LoadCreationInfosBuilder loadCreationBuilder = LoadCreationInfos.builder(); assertEquals(errorMessage, assertThrows(NullPointerException.class, loadCreationBuilder::build).getMessage()); - LoadCreationInfosBuilder loadCreationBuilder1 = loadCreationBuilder.equipmentId(null); - assertEquals(errorMessage, assertThrows(NullPointerException.class, loadCreationBuilder1::build).getMessage()); + assertEquals(errorMessage, assertThrows(NullPointerException.class, () -> loadCreationBuilder.equipmentId(null)).getMessage()); LoadCreationInfos loadCreationInfos = LoadCreationInfos.builder().equipmentId("idLoad").build(); assertEquals(errorMessage, assertThrows(NullPointerException.class, () -> loadCreationInfos.setEquipmentId(null)).getMessage()); } diff --git a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java index 97aebeb04..18bc6ec0c 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/TwoWindingsTransformerModificationTest.java @@ -305,7 +305,7 @@ void testCreateWithErrors() throws Exception { .content(modificationInfosJson) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()); - assertLogMessage(new NetworkModificationException(TWO_WINDINGS_TRANSFORMER_NOT_FOUND, "Two windings transformer with ID '2wt_not_existing' does not exist in the network").getMessage(), + assertLogMessage(new NetworkModificationException(TWO_WINDINGS_TRANSFORMER_NOT_FOUND, "Two windings transformer with ID '2wt_not_existing' : it does not exist in the network").getMessage(), twoWindingsTransformerModificationInfos.getErrorType().name(), reportService); } @@ -589,7 +589,7 @@ private TwoWindingsTransformer createPhaseTapChanger(PhaseTapChanger.RegulationM Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(getNetwork(), "v3load", "LOAD", - "V3"); + "v3"); twt3.newPhaseTapChanger() .setLowTapPosition(0) .setTapPosition(1) @@ -938,7 +938,7 @@ private void preparePhaseTapChangerAdder(PhaseTapChangerAdder phaseTapChangerAdd Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(getNetwork(), "v3load", "LOAD", - "V3"); + "v3"); phaseTapChangerAdder.setLowTapPosition(0) .setTapPosition(1) .setRegulationTerminal(phaseTapChangerTerminal) @@ -982,7 +982,7 @@ void testPhaseTapChangerRegulationCreation() throws Exception { .tapPosition(new AttributeModification<>(1, OperationType.SET)) .regulatingTerminalId(new AttributeModification<>("v3load", OperationType.SET)) .regulatingTerminalType(new AttributeModification<>("LOAD", OperationType.SET)) - .regulatingTerminalVlId(new AttributeModification<>("V3", OperationType.SET)) + .regulatingTerminalVlId(new AttributeModification<>("v3", OperationType.SET)) .steps(List.of(TapChangerStepCreationInfos.builder() .index(0) .r(0) @@ -1029,7 +1029,7 @@ void testPhaseTapChangerRegulationCreation() throws Exception { .tapPosition(new AttributeModification<>(1, OperationType.SET)) .regulatingTerminalId(new AttributeModification<>("v3load", OperationType.SET)) .regulatingTerminalType(new AttributeModification<>("LOAD", OperationType.SET)) - .regulatingTerminalVlId(new AttributeModification<>("V3", OperationType.SET)) + .regulatingTerminalVlId(new AttributeModification<>("v3", OperationType.SET)) .steps(List.of(TapChangerStepCreationInfos.builder() .index(0) .r(0) diff --git a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java index 174855e54..a6992d147 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/tabularmodifications/TabularTwoWindingsTransformerModificationsTest.java @@ -68,7 +68,7 @@ protected TwoWindingsTransformerModificationInfos buildOneModification(String eq protected void assertAfterNetworkModificationCreation() { assertEquals(0.0, getNetwork().getTwoWindingsTransformer("trf1").getR(), 0.001); assertEquals(1.0, getNetwork().getTwoWindingsTransformer("trf2").getR(), 0.001); - assertLogMessage("TWO_WINDINGS_TRANSFORMER_NOT_FOUND : Two windings transformer with ID 'unknownTwt' does not exist in the network", ModificationType.TWO_WINDINGS_TRANSFORMER_MODIFICATION.name() + "1", reportService); + assertLogMessage("TWO_WINDINGS_TRANSFORMER_NOT_FOUND : Two windings transformer with ID 'unknownTwt' : it does not exist in the network", ModificationType.TWO_WINDINGS_TRANSFORMER_MODIFICATION.name() + "1", reportService); } @Override diff --git a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java index 6886f233a..2097626f9 100644 --- a/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java +++ b/src/test/java/org/gridsuite/modification/server/utils/NetworkCreation.java @@ -207,7 +207,7 @@ public static Network create(UUID uuid, boolean createHvdcLine, NetworkFactory n Terminal phaseTapChangerTerminal = ModificationUtils.getInstance().getTerminalFromIdentifiable(network, "v3load", "LOAD", - "V3"); + "v3"); twt2.newPhaseTapChanger() .setLowTapPosition(0) .setTapPosition(1) From 782caf01665687679d0ae56f7f9f9bfe5d0d71f0 Mon Sep 17 00:00:00 2001 From: dbraquart <107846716+dbraquart@users.noreply.github.com> Date: Tue, 18 Feb 2025 11:22:45 +0100 Subject: [PATCH 2/2] Add measurements for line and 2wt update modification (#601) Signed-off-by: David BRAQUART --- .../BranchModificationEntity.java | 64 +++++++ .../modification/LineModificationEntity.java | 8 + ...WindingsTransformerModificationEntity.java | 8 + .../changesets/changelog_20250212T095646Z.xml | 163 ++++++++++++++++++ .../db/changelog/db.changelog-master.yaml | 3 + .../modifications/LineModificationTest.java | 36 ++++ 6 files changed, 282 insertions(+) create mode 100644 src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java index 4f1c4fdcd..b12ff7131 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/BranchModificationEntity.java @@ -136,6 +136,62 @@ public class BranchModificationEntity extends BasicEquipmentModificationEntity { }) private BooleanModificationEmbedded terminal2Connected; + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "p1MeasurementValue")), + @AttributeOverride(name = "opType", column = @Column(name = "p1MeasurementValueOp")) + }) + private DoubleModificationEmbedded p1MeasurementValue; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "p1MeasurementValidity")), + @AttributeOverride(name = "opType", column = @Column(name = "p1MeasurementValidityOp")) + }) + private BooleanModificationEmbedded p1MeasurementValidity; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "q1MeasurementValue")), + @AttributeOverride(name = "opType", column = @Column(name = "q1MeasurementValueOp")) + }) + private DoubleModificationEmbedded q1MeasurementValue; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "q1MeasurementValidity")), + @AttributeOverride(name = "opType", column = @Column(name = "q1MeasurementValidityOp")) + }) + private BooleanModificationEmbedded q1MeasurementValidity; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "p2MeasurementValue")), + @AttributeOverride(name = "opType", column = @Column(name = "p2MeasurementValueOp")) + }) + private DoubleModificationEmbedded p2MeasurementValue; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "p2MeasurementValidity")), + @AttributeOverride(name = "opType", column = @Column(name = "p2MeasurementValidityOp")) + }) + private BooleanModificationEmbedded p2MeasurementValidity; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "q2MeasurementValue")), + @AttributeOverride(name = "opType", column = @Column(name = "q2MeasurementValueOp")) + }) + private DoubleModificationEmbedded q2MeasurementValue; + + @Embedded + @AttributeOverrides(value = { + @AttributeOverride(name = "value", column = @Column(name = "q2MeasurementValidity")), + @AttributeOverride(name = "opType", column = @Column(name = "q2MeasurementValidityOp")) + }) + private BooleanModificationEmbedded q2MeasurementValidity; + protected BranchModificationEntity(BranchModificationInfos branchModificationInfos) { super(branchModificationInfos); assignAttributes(branchModificationInfos); @@ -173,5 +229,13 @@ private void assignAttributes(BranchModificationInfos branchModificationInfos) { this.connectionPosition2 = branchModificationInfos.getConnectionPosition2() != null ? new IntegerModificationEmbedded(branchModificationInfos.getConnectionPosition2()) : null; this.terminal1Connected = branchModificationInfos.getTerminal1Connected() != null ? new BooleanModificationEmbedded(branchModificationInfos.getTerminal1Connected()) : null; this.terminal2Connected = branchModificationInfos.getTerminal2Connected() != null ? new BooleanModificationEmbedded(branchModificationInfos.getTerminal2Connected()) : null; + this.p1MeasurementValue = branchModificationInfos.getP1MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getP1MeasurementValue()) : null; + this.p1MeasurementValidity = branchModificationInfos.getP1MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getP1MeasurementValidity()) : null; + this.q1MeasurementValue = branchModificationInfos.getQ1MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getQ1MeasurementValue()) : null; + this.q1MeasurementValidity = branchModificationInfos.getQ1MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getQ1MeasurementValidity()) : null; + this.p2MeasurementValue = branchModificationInfos.getP2MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getP2MeasurementValue()) : null; + this.p2MeasurementValidity = branchModificationInfos.getP2MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getP2MeasurementValidity()) : null; + this.q2MeasurementValue = branchModificationInfos.getQ2MeasurementValue() != null ? new DoubleModificationEmbedded(branchModificationInfos.getQ2MeasurementValue()) : null; + this.q2MeasurementValidity = branchModificationInfos.getQ2MeasurementValidity() != null ? new BooleanModificationEmbedded(branchModificationInfos.getQ2MeasurementValidity()) : null; } } diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java index d42f734ec..2b7afe3e2 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/LineModificationEntity.java @@ -106,6 +106,14 @@ public LineModificationInfos toModificationInfos() { .b1(toAttributeModification(getB1())) .g2(toAttributeModification(getG2())) .b2(toAttributeModification(getB2())) + .p1MeasurementValue(toAttributeModification(getP1MeasurementValue())) + .p1MeasurementValidity(toAttributeModification(getP1MeasurementValidity())) + .q1MeasurementValue(toAttributeModification(getQ1MeasurementValue())) + .q1MeasurementValidity(toAttributeModification(getQ1MeasurementValidity())) + .p2MeasurementValue(toAttributeModification(getP2MeasurementValue())) + .p2MeasurementValidity(toAttributeModification(getP2MeasurementValidity())) + .q2MeasurementValue(toAttributeModification(getQ2MeasurementValue())) + .q2MeasurementValidity(toAttributeModification(getQ2MeasurementValidity())) // properties .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() diff --git a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java index 07b5abb18..71d18cd4b 100644 --- a/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java +++ b/src/main/java/org/gridsuite/modification/server/entities/equipment/modification/TwoWindingsTransformerModificationEntity.java @@ -374,6 +374,14 @@ public TwoWindingsTransformerModificationInfos toModificationInfos() { .ratedU1(IAttributeModificationEmbeddable.toAttributeModification(getRatedU1())) .ratedU2(IAttributeModificationEmbeddable.toAttributeModification(getRatedU2())) .ratedS(IAttributeModificationEmbeddable.toAttributeModification(getRatedS())) + .p1MeasurementValue(toAttributeModification(getP1MeasurementValue())) + .p1MeasurementValidity(toAttributeModification(getP1MeasurementValidity())) + .q1MeasurementValue(toAttributeModification(getQ1MeasurementValue())) + .q1MeasurementValidity(toAttributeModification(getQ1MeasurementValidity())) + .p2MeasurementValue(toAttributeModification(getP2MeasurementValue())) + .p2MeasurementValidity(toAttributeModification(getP2MeasurementValidity())) + .q2MeasurementValue(toAttributeModification(getQ2MeasurementValue())) + .q2MeasurementValidity(toAttributeModification(getQ2MeasurementValidity())) // properties .properties(CollectionUtils.isEmpty(getProperties()) ? null : getProperties().stream() diff --git a/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml b/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml new file mode 100644 index 000000000..2153574fc --- /dev/null +++ b/src/main/resources/db/changelog/changesets/changelog_20250212T095646Z.xml @@ -0,0 +1,163 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/db/changelog/db.changelog-master.yaml b/src/main/resources/db/changelog/db.changelog-master.yaml index 92e1f0486..d5f644c40 100644 --- a/src/main/resources/db/changelog/db.changelog-master.yaml +++ b/src/main/resources/db/changelog/db.changelog-master.yaml @@ -336,3 +336,6 @@ databaseChangeLog: - include: file: changesets/changelog_20250116T103740Z.xml relativeToChangelogFile: true + - include: + file: changesets/changelog_20250212T095646Z.xml + relativeToChangelogFile: true diff --git a/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java b/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java index 6884b125c..f97ba1951 100644 --- a/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java +++ b/src/test/java/org/gridsuite/modification/server/modifications/LineModificationTest.java @@ -12,6 +12,10 @@ import com.powsybl.iidm.network.Network; import com.powsybl.iidm.network.extensions.ConnectablePosition; import com.powsybl.iidm.network.extensions.ConnectablePositionAdder; +import com.powsybl.iidm.network.extensions.Measurement; +import com.powsybl.iidm.network.extensions.Measurements; +import org.apache.commons.collections4.CollectionUtils; +import org.assertj.core.api.Assertions; import org.gridsuite.modification.NetworkModificationException; import org.gridsuite.modification.dto.*; import org.gridsuite.modification.server.utils.NetworkCreation; @@ -19,6 +23,7 @@ import org.junit.jupiter.api.Test; import org.springframework.http.MediaType; +import java.util.Collection; import java.util.List; import java.util.Map; import java.util.UUID; @@ -27,7 +32,10 @@ import static org.gridsuite.modification.server.utils.TestUtils.assertLogMessage; import static org.gridsuite.modification.server.utils.assertions.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -39,6 +47,10 @@ class LineModificationTest extends AbstractNetworkModificationTest { private static final String PROPERTY_NAME = "property-name"; private static final String PROPERTY_VALUE = "property-value"; + private static final Double MEASUREMENT_P_VALUE = 10.0; + private static final Double MEASUREMENT_Q_VALUE = -10.0; + private static final Boolean MEASUREMENT_P_VALID = true; + private static final Boolean MEASUREMENT_Q_VALID = false; @Override protected Network createNetwork(UUID networkUuid) { @@ -61,6 +73,14 @@ protected ModificationInfos buildModification() { .connectionDirection2(new AttributeModification<>(ConnectablePosition.Direction.TOP, OperationType.SET)) .connectionPosition1(new AttributeModification<>(1, OperationType.SET)) .connectionPosition2(new AttributeModification<>(1, OperationType.SET)) + .p1MeasurementValue(new AttributeModification<>(MEASUREMENT_P_VALUE, OperationType.SET)) + .p1MeasurementValidity(new AttributeModification<>(MEASUREMENT_P_VALID, OperationType.SET)) + .p2MeasurementValue(new AttributeModification<>(MEASUREMENT_P_VALUE, OperationType.SET)) + .p2MeasurementValidity(new AttributeModification<>(MEASUREMENT_P_VALID, OperationType.SET)) + .q1MeasurementValue(new AttributeModification<>(MEASUREMENT_Q_VALUE, OperationType.SET)) + .q1MeasurementValidity(new AttributeModification<>(MEASUREMENT_Q_VALID, OperationType.SET)) + .q2MeasurementValue(new AttributeModification<>(MEASUREMENT_Q_VALUE, OperationType.SET)) + .q2MeasurementValidity(new AttributeModification<>(MEASUREMENT_Q_VALID, OperationType.SET)) .currentLimits1(CurrentLimitsModificationInfos.builder() .permanentLimit(12.0) .temporaryLimits(List.of(CurrentTemporaryLimitModificationInfos.builder() @@ -135,6 +155,19 @@ protected void assertAfterNetworkModificationCreation() { assertEquals("name32", temporaryLimit.getName()); assertEquals(42.0, temporaryLimit.getValue()); assertEquals(PROPERTY_VALUE, modifiedLine.getProperty(PROPERTY_NAME)); + assertMeasurements(modifiedLine); // measurements extension are added + } + + private void assertMeasurements(Line line) { + Measurements measurements = (Measurements) line.getExtension(Measurements.class); + assertNotNull(measurements); + Collection activePowerMeasurements = measurements.getMeasurements(Measurement.Type.ACTIVE_POWER).stream().toList(); + assertNotNull(activePowerMeasurements); + assertFalse(CollectionUtils.isEmpty(activePowerMeasurements)); + Assertions.assertThat(activePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_P_VALUE && m.isValid() == MEASUREMENT_P_VALID); + Collection reactivePowerMeasurements = measurements.getMeasurements(Measurement.Type.REACTIVE_POWER).stream().toList(); + assertFalse(CollectionUtils.isEmpty(reactivePowerMeasurements)); + Assertions.assertThat(reactivePowerMeasurements).allMatch(m -> m.getValue() == MEASUREMENT_Q_VALUE && m.isValid() == MEASUREMENT_Q_VALID); } @Override @@ -150,6 +183,9 @@ protected void assertAfterNetworkModificationDeletion() { assertNull(line.getNullableCurrentLimits1()); assertNull(line.getNullableCurrentLimits2()); assertNull(line.getProperty(PROPERTY_NAME)); + // no more measurements extension + Measurements measurements = (Measurements) line.getExtension(Measurements.class); + assertTrue(measurements == null || CollectionUtils.isEmpty(measurements.getMeasurements())); } @Test