diff --git a/CHANGELOG.md b/CHANGELOG.md index a7593a97d..a176bc37f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325) -- -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331) +- Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331) +- Fixed valid fields for `EmInput` [#1360](https://github.com/ie3-institute/PowerSystemDataModel/issues/1360) ### Changed - Updated dependabot workflow and added CODEOWNERS [#1328](https://github.com/ie3-institute/PowerSystemDataModel/issues/1328) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java index b9a104137..9670eca99 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java @@ -24,8 +24,9 @@ public abstract class AssetInputEntityFactory extends UniqueEntityFactory { - private static final String OPERATES_FROM = "operatesFrom"; - private static final String OPERATES_UNTIL = "operatesUntil"; + protected static final String OPERATOR = "operator"; + protected static final String OPERATES_FROM = "operatesFrom"; + protected static final String OPERATES_UNTIL = "operatesUntil"; @SafeVarargs protected AssetInputEntityFactory(Class... allowedClasses) { @@ -48,14 +49,33 @@ protected List> getFields(Class entityClass) { Set constructorParamsUntil = expandSet(constructorParamsMin, OPERATES_UNTIL); Set constructorParamsBoth = expandSet(constructorParamsFrom, OPERATES_UNTIL); + // with operator field + Set constructorParamsOperator = expandSet(constructorParamsMin, OPERATOR); + Set constructorParamsOperatorFrom = expandSet(constructorParamsFrom, OPERATOR); + Set constructorParamsOperatorUntil = expandSet(constructorParamsUntil, OPERATOR); + Set constructorParamsOperatorBoth = expandSet(constructorParamsBoth, OPERATOR); + final String[] additionalFields = getAdditionalFields(); constructorParamsMin = expandSet(constructorParamsMin, additionalFields); constructorParamsFrom = expandSet(constructorParamsFrom, additionalFields); constructorParamsUntil = expandSet(constructorParamsUntil, additionalFields); constructorParamsBoth = expandSet(constructorParamsBoth, additionalFields); + + constructorParamsOperator = expandSet(constructorParamsOperator, additionalFields); + constructorParamsOperatorFrom = expandSet(constructorParamsOperatorFrom, additionalFields); + constructorParamsOperatorUntil = expandSet(constructorParamsOperatorUntil, additionalFields); + constructorParamsOperatorBoth = expandSet(constructorParamsOperatorBoth, additionalFields); + return Arrays.asList( - constructorParamsMin, constructorParamsFrom, constructorParamsUntil, constructorParamsBoth); + constructorParamsMin, + constructorParamsFrom, + constructorParamsUntil, + constructorParamsBoth, + constructorParamsOperator, + constructorParamsOperatorFrom, + constructorParamsOperatorUntil, + constructorParamsOperatorBoth); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java index 4e2535f70..85e15822d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/EmInputFactory.java @@ -8,10 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.ArrayList; -import java.util.List; -import java.util.Set; -import java.util.UUID; +import java.util.*; public class EmInputFactory extends AssetInputEntityFactory { @@ -23,21 +20,9 @@ public EmInputFactory() { super(EmInput.class); } - @Override - protected List> getFields(Class entityClass) { - List> fields = new ArrayList<>(super.getFields(entityClass)); - - List> withEm = - fields.stream().map(f -> (Set) expandSet(f, CONTROLLING_EM)).toList(); - - fields.addAll(withEm); - - return fields; - } - @Override protected String[] getAdditionalFields() { - return new String[] {CONTROL_STRATEGY}; + return new String[] {CONTROL_STRATEGY, CONTROLLING_EM}; } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy index f6fa90645..a468dfc4e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactoryTest.groovy @@ -289,7 +289,11 @@ class AssetInputEntityFactoryTest extends Specification implements FactoryTestHe "0: [id, uuid] or [id, uuid]\n" + "1: [id, operatesFrom, uuid] or [id, operates_from, uuid]\n" + "2: [id, operatesUntil, uuid] or [id, operates_until, uuid]\n" + - "3: [id, operatesFrom, operatesUntil, uuid] or [id, operates_from, operates_until, uuid]\n" + "3: [id, operatesFrom, operatesUntil, uuid] or [id, operates_from, operates_until, uuid]\n" + + "4: [id, operator, uuid] or [id, operator, uuid]\n" + + "5: [id, operatesFrom, operator, uuid] or [id, operates_from, operator, uuid]\n" + + "6: [id, operatesUntil, operator, uuid] or [id, operates_until, operator, uuid]\n" + + "7: [id, operatesFrom, operatesUntil, operator, uuid] or [id, operates_from, operates_until, operator, uuid]\n" } private static class TestAssetInput extends AssetInput { diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy index 113fc739e..5cc32ca9d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/EmInputFactoryTest.groovy @@ -12,6 +12,7 @@ import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.time.ZonedDateTime +import java.util.stream.Collectors class EmInputFactoryTest extends Specification { @@ -24,6 +25,79 @@ class EmInputFactoryTest extends Specification { inputFactory.supportedClasses == expectedClasses } + def "An EmInputFactory should return the valid fields correctly"() { + given: + def inputFactory = new EmInputFactory() + def validCombinations = [ + [ + "uuid", + "id", + "controlStrategy", + "controllingEm" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesFrom" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesUntil" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operatesFrom", + "operatesUntil" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesUntil" + ], + [ + "uuid", + "id", + "controlStrategy", + "controllingEm", + "operator", + "operatesFrom", + "operatesUntil" + ] + ].collect { it as Set } + + when: + def fieldCombinations = inputFactory.getFields(EmInput) + + then: + fieldCombinations == validCombinations + } + def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { given: def inputFactory = new EmInputFactory() diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy index f43e60e6e..3f4eeb84a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactoryTest.groovy @@ -92,9 +92,17 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe "1: [cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + "2: [cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + "3: [cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + - "4: [controllingEm, cosPhiRated, id, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, q_characteristics, s_rated, uuid]\n" + - "5: [controllingEm, cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + - "6: [controllingEm, cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + - "7: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + "4: [cosPhiRated, id, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operator, q_characteristics, s_rated, uuid]\n" + + "5: [cosPhiRated, id, operatesFrom, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operator, q_characteristics, s_rated, uuid]\n" + + "6: [cosPhiRated, id, operatesUntil, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "7: [cosPhiRated, id, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [cos_phi_rated, id, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "8: [controllingEm, cosPhiRated, id, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, q_characteristics, s_rated, uuid]\n" + + "9: [controllingEm, cosPhiRated, id, operatesFrom, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, q_characteristics, s_rated, uuid]\n" + + "10: [controllingEm, cosPhiRated, id, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, q_characteristics, s_rated, uuid]\n" + + "11: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, q_characteristics, s_rated, uuid]\n" + + "12: [controllingEm, cosPhiRated, id, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operator, q_characteristics, s_rated, uuid]\n" + + "13: [controllingEm, cosPhiRated, id, operatesFrom, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operator, q_characteristics, s_rated, uuid]\n" + + "14: [controllingEm, cosPhiRated, id, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_until, operator, q_characteristics, s_rated, uuid]\n" + + "15: [controllingEm, cosPhiRated, id, operatesFrom, operatesUntil, operator, qCharacteristics, sRated, uuid] or [controlling_em, cos_phi_rated, id, operates_from, operates_until, operator, q_characteristics, s_rated, uuid]\n" } }