From 516b0afc0b9af5222c59b73135e61e3ddf17f7d7 Mon Sep 17 00:00:00 2001 From: Etienne LESOT Date: Mon, 28 Oct 2024 11:47:18 +0100 Subject: [PATCH] fix regulating by setting phasetapchanger equals and hashcode Signed-off-by: Etienne LESOT --- .../store/iidm/impl/AbstractTapChanger.java | 4 +++ .../store/iidm/impl/PhaseTapChangerImpl.java | 35 +++++++++++++++++-- .../iidm/impl/TwoWindingsTransformerTest.java | 17 +++++++-- 3 files changed, 50 insertions(+), 6 deletions(-) diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/AbstractTapChanger.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/AbstractTapChanger.java index bce13f106..6ca6334fb 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/AbstractTapChanger.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/AbstractTapChanger.java @@ -41,6 +41,10 @@ abstract class AbstractTapChanger getResource() { return getTransformer().getResource(); } diff --git a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/PhaseTapChangerImpl.java b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/PhaseTapChangerImpl.java index a206305b5..e697eec9a 100644 --- a/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/PhaseTapChangerImpl.java +++ b/network-store-iidm-impl/src/main/java/com/powsybl/network/store/iidm/impl/PhaseTapChangerImpl.java @@ -9,9 +9,7 @@ import com.powsybl.iidm.network.*; import com.powsybl.network.store.model.*; -import java.util.HashSet; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.function.Function; /** @@ -148,4 +146,35 @@ public static void validateStep(TapChangerStepAttributes step, TapChangerParent throw new ValidationException(parent, "step alpha is not set"); } } + + // equals and hashcode are override because of ValidationUtil.checkPhaseTapChangerRegulation that + // remove the tap changer of the list of allRegulatingTapChanger + // and it does not work if equals and hascode check this.attributesGetter + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PhaseTapChangerImpl that = (PhaseTapChangerImpl) o; + // check phase tap changer are on same leg + if (!Objects.equals(that.getTransformer().getClass(), getTransformer().getClass())) { + return false; + } + if (that.getTransformer() instanceof ThreeWindingsTransformerImpl && + !Objects.equals(((ThreeWindingsTransformerImpl.LegImpl) parent).getSide(), + ((ThreeWindingsTransformerImpl.LegImpl) that.getParent()).getSide())) { + return false; + } + return Objects.equals(getTransformer().getId(), that.getTransformer().getId()) && + Objects.equals(getRegulationMode(), that.getRegulationMode()) && + Objects.equals(getRegulationValue(), that.getRegulationValue()); + } + + @Override + public int hashCode() { + return Objects.hash(getParent(), getTransformer().getId(), getRegulationMode(), getRegulationValue()); + } } diff --git a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TwoWindingsTransformerTest.java b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TwoWindingsTransformerTest.java index 11dabae7e..3d487036f 100644 --- a/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TwoWindingsTransformerTest.java +++ b/network-store-iidm-impl/src/test/java/com/powsybl/network/store/iidm/impl/TwoWindingsTransformerTest.java @@ -11,9 +11,7 @@ import com.powsybl.iidm.network.*; import org.junit.jupiter.api.Test; -import java.util.Collections; -import java.util.List; -import java.util.Properties; +import java.util.*; import static org.junit.jupiter.api.Assertions.*; @@ -37,6 +35,19 @@ void testTapChangerRemoval() { assertNull(twtWithPhaseTapChanger.getPhaseTapChanger()); } + @Test + void testPhaseTapChangerEqualsAndHashCode() { + Network network = createNetwork(); + TwoWindingsTransformer twtWithPhaseTapChanger = network.getTwoWindingsTransformer("a708c3bc-465d-4fe7-b6ef-6fa6408a62b0"); + Set phaseTapChangers = new HashSet<>(); + phaseTapChangers.add(twtWithPhaseTapChanger.getPhaseTapChanger()); + + // use the equals and the hashcode of PhaseTapChangerImpl + phaseTapChangers.remove(twtWithPhaseTapChanger.getPhaseTapChanger()); + + assertEquals(0, phaseTapChangers.size()); + } + @Test void testTapChangerStepsReplacement() { Network network = createNetwork();