From ef410ae508b49ae781f036809cf351d7a44360fd Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 13 Dec 2023 11:45:11 +0100 Subject: [PATCH 01/31] Removing connectedAssets and turning controlStrategy into a String --- .../input/participant/EmInputFactory.java | 26 +----- .../ie3/datamodel/io/processor/Processor.java | 3 - .../ie3/datamodel/models/ControlStrategy.java | 35 -------- .../datamodel/models/EmControlStrategy.java | 45 ---------- .../models/input/system/EmInput.java | 90 +++---------------- .../participant/EmInputFactoryTest.groovy | 68 ++------------ .../models/EmControlStrategyTest.groovy | 45 ---------- .../models/input/system/EmInputTest.groovy | 20 +---- .../common/EnergyManagementTestData.groovy | 1 - .../io/source/csv/_participants/em_input.csv | 4 +- 10 files changed, 29 insertions(+), 308 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/models/ControlStrategy.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java delete mode 100644 src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index 3e2e39d60..c9aefede5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -5,21 +5,14 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; -import edu.ie3.datamodel.models.ControlStrategy; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EmInput; import java.util.UUID; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; public class EmInputFactory extends AssetInputEntityFactory { - private static final Logger logger = LoggerFactory.getLogger(EmInputFactory.class); - - private static final String CONNECTED_ASSETS = "connectedassets"; private static final String CONTROL_STRATEGY = "controlstrategy"; @@ -29,7 +22,7 @@ public EmInputFactory() { @Override protected String[] getAdditionalFields() { - return new String[] {CONNECTED_ASSETS, CONTROL_STRATEGY}; + return new String[] {CONTROL_STRATEGY}; } @Override @@ -39,21 +32,8 @@ protected EmInput buildModel( String id, OperatorInput operator, OperationTime operationTime) { - ControlStrategy controlStrategy; - try { - controlStrategy = ControlStrategy.parse(data.getField(CONTROL_STRATEGY)); - } catch (ParsingException e) { - logger.warn( - "Cannot parse control strategy \"{}\" of energy management system \"{}\". Assign no control strategy instead.", - data.getField(CONTROL_STRATEGY), - id); - controlStrategy = ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; - } - final UUID[] connectedAssets = data.getUUIDs(CONNECTED_ASSETS); - - if (connectedAssets.length == 0) - logger.warn("There are no connected assets for energy management system \"{}\".", id); + String controlStrategy = data.getField(CONTROL_STRATEGY); - return new EmInput(uuid, id, operator, operationTime, connectedAssets, controlStrategy); + return new EmInput(uuid, id, operator, operationTime, controlStrategy); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 830fbef02..06eb1b951 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -8,7 +8,6 @@ import edu.ie3.datamodel.exceptions.EntityProcessorException; import edu.ie3.datamodel.io.factory.input.NodeInputFactory; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; -import edu.ie3.datamodel.models.ControlStrategy; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; @@ -290,8 +289,6 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "CharacteristicInput" -> resultStringBuilder.append( ((CharacteristicInput) methodReturnObject).serialize()); case "UUID[]" -> resultStringBuilder.append(processUUIDArray((UUID[]) methodReturnObject)); - case "ControlStrategy" -> resultStringBuilder.append( - ((ControlStrategy) methodReturnObject).getKey()); default -> throw new EntityProcessorException( "Unable to process value for attribute/field '" + fieldName diff --git a/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java deleted file mode 100644 index 61ad82ddf..000000000 --- a/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models; - -import edu.ie3.datamodel.exceptions.ParsingException; -import java.io.Serializable; -import java.util.Arrays; - -public interface ControlStrategy extends Serializable { - String getKey(); - - static ControlStrategy parse(String key) throws ParsingException { - if (key == null || key.isEmpty()) - return ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; - - String filterKey = key.toLowerCase().replace("-", "_"); - return Arrays.stream(EmControlStrategy.values()) - .filter(profile -> profile.getKey().equals(filterKey)) - .findFirst() - .orElseThrow( - () -> new ParsingException("Cannot parse \"" + key + "\" to a valid control strategy")); - } - - enum DefaultControlStrategies implements ControlStrategy { - NO_CONTROL_STRATEGY; - - @Override - public String getKey() { - return "No control strategy assigned"; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java deleted file mode 100644 index ffb216a35..000000000 --- a/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models; - -import java.util.Arrays; -import java.util.Locale; -import java.util.stream.Collectors; - -public enum EmControlStrategy implements ControlStrategy { - SELF_OPTIMIZATION("self_optimization"); - - private final String key; - - EmControlStrategy(String key) { - this.key = key.toLowerCase(Locale.ROOT); - } - - public static EmControlStrategy get(String key) { - return Arrays.stream(EmControlStrategy.values()) - .filter(controlStrategy -> controlStrategy.key.equalsIgnoreCase(key)) - .findFirst() - .orElseThrow( - () -> - new IllegalArgumentException( - "No predefined energy management control strategy '" - + key - + "' found. Please provide one of the following keys: " - + Arrays.stream(EmControlStrategy.values()) - .map(EmControlStrategy::getKey) - .collect(Collectors.joining(", ")))); - } - - @Override - public String getKey() { - return key; - } - - @Override - public String toString() { - return "EmControlStrategy{" + "key='" + key + '\'' + '}'; - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java index f9bbbaa9f..b58a054ef 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java @@ -5,43 +5,16 @@ */ package edu.ie3.datamodel.models.input.system; -import edu.ie3.datamodel.models.ControlStrategy; -import edu.ie3.datamodel.models.EmControlStrategy; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Arrays; import java.util.Objects; import java.util.UUID; public class EmInput extends AssetInput { - /** Reference via UUID to all SystemParticipantInputs connected to this model */ - private final UUID[] connectedAssets; - /** Reference to the control strategy to be used for this model */ - private final ControlStrategy controlStrategy; - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param operator of the asset - * @param operationTime time for which the entity is operated - * @param connectedAssets array of all connected assets - * @param controlStrategy control strategy used for this model - */ - public EmInput( - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime, - UUID[] connectedAssets, - ControlStrategy controlStrategy) { - super(uuid, id, operator, operationTime); - this.connectedAssets = connectedAssets; - this.controlStrategy = controlStrategy; - } + private final String controlStrategy; /** * Constructor for an operated energy management system @@ -50,20 +23,16 @@ public EmInput( * @param id of the asset * @param operator of the asset * @param operationTime time for which the entity is operated - * @param connectedAssets array of all connected assets - * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy - * key + * @param emControlStrategy the control strategy */ public EmInput( UUID uuid, String id, OperatorInput operator, OperationTime operationTime, - UUID[] connectedAssets, String emControlStrategy) { super(uuid, id, operator, operationTime); - this.connectedAssets = connectedAssets; - this.controlStrategy = EmControlStrategy.get(emControlStrategy); + this.controlStrategy = emControlStrategy; } /** @@ -71,35 +40,14 @@ public EmInput( * * @param uuid of the input entity * @param id of the asset - * @param connectedAssets array of all connected assets - * @param controlStrategy control strategy used for this model + * @param emControlStrategy the control strategy */ - public EmInput(UUID uuid, String id, UUID[] connectedAssets, ControlStrategy controlStrategy) { + public EmInput(UUID uuid, String id, String emControlStrategy) { super(uuid, id); - this.connectedAssets = connectedAssets; - this.controlStrategy = controlStrategy; + this.controlStrategy = emControlStrategy; } - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param connectedAssets array of all connected assets - * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy - * key - */ - public EmInput(UUID uuid, String id, UUID[] connectedAssets, String emControlStrategy) { - super(uuid, id); - this.connectedAssets = connectedAssets; - this.controlStrategy = EmControlStrategy.get(emControlStrategy); - } - - public UUID[] getConnectedAssets() { - return connectedAssets; - } - - public ControlStrategy getControlStrategy() { + public String getControlStrategy() { return controlStrategy; } @@ -113,13 +61,12 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof EmInput emInput)) return false; if (!super.equals(o)) return false; - return Arrays.equals(connectedAssets, emInput.connectedAssets) - && controlStrategy == emInput.controlStrategy; + return Objects.equals(controlStrategy, emInput.controlStrategy); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), Arrays.hashCode(connectedAssets), controlStrategy); + return Objects.hash(super.hashCode(), controlStrategy); } @Override @@ -133,39 +80,28 @@ public String toString() { + getOperator().getUuid() + ", operationTime=" + getOperationTime() - + ", connectedAssets=" - + Arrays.toString(connectedAssets) + ", controlStrategy=" - + controlStrategy + + getControlStrategy() + '}'; } public static class EmInputCopyBuilder extends AssetInputCopyBuilder { - private UUID[] connectedAssets; - - private ControlStrategy controlStrategy; + private String controlStrategy; protected EmInputCopyBuilder(EmInput entity) { super(entity); - this.connectedAssets = entity.getConnectedAssets(); this.controlStrategy = entity.getControlStrategy(); } - public EmInputCopyBuilder connectedAssets(UUID[] connectedAssets) { - this.connectedAssets = connectedAssets; - return this; - } - - public EmInputCopyBuilder controlStrategy(ControlStrategy controlStrategy) { + public EmInputCopyBuilder controlStrategy(String controlStrategy) { this.controlStrategy = controlStrategy; return this; } @Override public EmInput build() { - return new EmInput( - getUuid(), getId(), getOperator(), getOperationTime(), connectedAssets, controlStrategy); + return new EmInput(getUuid(), getId(), getOperator(), getOperationTime(), controlStrategy); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy index 707a71ccd..ccc0379db 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy @@ -7,15 +7,12 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.io.factory.input.AssetInputEntityData -import edu.ie3.datamodel.models.ControlStrategy -import edu.ie3.datamodel.models.EmControlStrategy import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.time.ZonedDateTime -import javax.measure.quantity.Dimensionless class EmInputFactoryTest extends Specification { @@ -36,8 +33,7 @@ class EmInputFactoryTest extends Specification { "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", "id" : "TestID", - "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914 a17aa6f0-e663-4186-ac34-a7b68573938b", - "controlstrategy" : "self_optimization" + "controlstrategy" : "no_control" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) @@ -57,24 +53,17 @@ class EmInputFactoryTest extends Specification { assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) assert operator == operatorInput assert id == parameter["id"] - assert connectedAssets == [ - UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914"), - UUID.fromString("a17aa6f0-e663-4186-ac34-a7b68573938b") - ] as UUID[] - assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION + assert controlStrategy == parameter["controlstrategy"] } } - def "A EmInputFactory should parse a valid EmInput with zero connected assets correctly"() { + def "A EmInputFactory should fail when passing an invalid UUID"() { given: def inputFactory = new EmInputFactory() Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", - "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "uuid" : "- broken -", "id" : "TestID", - "connectedassets" : "", - "controlstrategy" : "self_optimization" + "controlstrategy" : "no_control" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) @@ -84,50 +73,7 @@ class EmInputFactoryTest extends Specification { new AssetInputEntityData(parameter, inputClass, operatorInput)) then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.present - assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) - assert operationTime.endDate.present - assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) - assert operator == operatorInput - assert id == parameter["id"] - assert connectedAssets == [] as UUID[] - assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION - } - } - - def "A EmInputFactory should use a default control strategy if value cannot be parsed"() { - given: - def inputFactory = new EmInputFactory() - Map parameter = [ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "TestID", - "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914", - "controlstrategy" : " -- invalid --" - ] - def inputClass = EmInput - def operatorInput = Mock(OperatorInput) - - when: - Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) - - then: - input.success - input.data.get().getClass() == inputClass - input.data.get().with { - assert uuid == UUID.fromString(parameter["uuid"]) - assert operationTime.startDate.empty - assert operationTime.endDate.empty - assert operator == operatorInput - assert id == parameter["id"] - assert connectedAssets == [ - UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914") - ] as UUID[] - assert controlStrategy == ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY - } + input.failure + input.exception.get().cause.message == "Exception while trying to parse UUID of field \"uuid\" with value \"- broken -\"" } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy deleted file mode 100644 index ea13b2f35..000000000 --- a/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy +++ /dev/null @@ -1,45 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.models - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.FixedFeedInInputFactory -import edu.ie3.datamodel.models.input.NodeInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import spock.lang.Specification - -import java.util.stream.Collectors - -class EmControlStrategyTest extends Specification { - - def "An em control strategy should be gotten by their key"() { - given: - EmControlStrategy actual = EmControlStrategy.get(key) - - expect: - actual == expected - - where: - key || expected - EmControlStrategy.SELF_OPTIMIZATION.getKey() || EmControlStrategy.SELF_OPTIMIZATION - } - - def "An em control strategy should throw an exception when calling get on unkown key"() { - given: - String unknownKey = "nobody_knows_me" - - when: - EmControlStrategy _ = EmControlStrategy.get(unknownKey) - - then: - IllegalArgumentException ex = thrown() - ex.message == "No predefined energy management control strategy '" + - unknownKey + - "' found. Please provide one of the following keys: " + - Arrays.stream(EmControlStrategy.values()).map(EmControlStrategy::getKey).collect(Collectors.joining(", ")) - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 755699e22..5427810e5 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -5,9 +5,6 @@ */ package edu.ie3.datamodel.models.input.system -import static edu.ie3.datamodel.models.ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY - -import edu.ie3.datamodel.models.ControlStrategy import edu.ie3.test.common.EnergyManagementTestData import spock.lang.Specification @@ -18,7 +15,6 @@ class EmInputTest extends Specification { def emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", - EnergyManagementTestData.connectedAssets, EnergyManagementTestData.emControlStrategy ) @@ -26,8 +22,7 @@ class EmInputTest extends Specification { emInput.with { assert uuid == UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792") assert id == "test_emInput" - assert connectedAssets == EnergyManagementTestData.connectedAssets - assert controlStrategy.key == EnergyManagementTestData.emControlStrategy + assert controlStrategy == EnergyManagementTestData.emControlStrategy } } @@ -61,8 +56,6 @@ class EmInputTest extends Specification { EnergyManagementTestData.emInput.operator.uuid + ", operationTime=" + EnergyManagementTestData.emInput.operationTime + - ", connectedAssets=" + - Arrays.toString(EnergyManagementTestData.emInput.connectedAssets) + ", controlStrategy=" + EnergyManagementTestData.emInput.controlStrategy + '}' @@ -71,14 +64,10 @@ class EmInputTest extends Specification { def "A EmInput copy method should work as expected"() { given: def emInput = EnergyManagementTestData.emInput - def newConnectedAssets = [ - UUID.randomUUID(), - UUID.randomUUID() - ] as UUID[] - + def newStrat = "new_strat" when: - def alteredUnit = emInput.copy().connectedAssets(newConnectedAssets).controlStrategy(ControlStrategy.parse("")).build() + def alteredUnit = emInput.copy().controlStrategy(newStrat).build() then: alteredUnit.with { @@ -86,8 +75,7 @@ class EmInputTest extends Specification { assert operationTime == emInput.operationTime assert operator == emInput.operator assert id == emInput.id - assert connectedAssets == newConnectedAssets - assert controlStrategy == NO_CONTROL_STRATEGY + assert controlStrategy == newStrat } } } diff --git a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy index 4d8714c6b..b747ca5c3 100644 --- a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy @@ -21,7 +21,6 @@ class EnergyManagementTestData { "test_emInput", SystemParticipantTestData.operator, SystemParticipantTestData.operationTime, - connectedAssets, emControlStrategy ) diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv index 5cc111444..97cea0978 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv @@ -1,2 +1,2 @@ -uuid,connected_assets,control_strategy,id,operates_from,operates_until,operator -977157f4-25e5-4c72-bf34-440edc778792,eaf77f7e-9001-479f-94ca-7fb657766f5f d56f15b7-8293-4b98-b5bd-58f6273ce229,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510 +uuid,control_strategy,id,operates_from,operates_until,operator +977157f4-25e5-4c72-bf34-440edc778792,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510 From 5ecbce6a173466975fee38843798272a72b3100a Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 14 Dec 2023 14:09:32 +0100 Subject: [PATCH 02/31] Backup --- docs/uml/main/EntitySourceClassDiagram.puml | 4 +- .../ie3/datamodel/io/factory/EntityData.java | 9 + .../ie3/datamodel/io/factory/FactoryData.java | 6 +- .../factory/input/AssetInputEntityData.java | 12 + .../input/NodeAssetInputEntityData.java | 12 + .../input/participant/BmInputFactory.java | 2 + .../input/participant/ChpInputFactory.java | 2 + .../input/participant/EmInputFactory.java | 22 +- .../input/participant/EvInputFactory.java | 3 +- .../input/participant/EvcsInputFactory.java | 13 +- .../participant/FixedFeedInInputFactory.java | 6 +- .../input/participant/HpInputFactory.java | 2 + .../input/participant/LoadInputFactory.java | 10 +- .../input/participant/PvInputFactory.java | 10 +- .../participant/StorageInputFactory.java | 4 +- .../SystemParticipantEntityData.java | 152 +++++++ .../SystemParticipantInputEntityFactory.java | 12 +- .../SystemParticipantTypedEntityData.java | 38 +- .../input/participant/WecInputFactory.java | 4 +- .../io/source/EnergyManagementSource.java | 27 +- .../ie3/datamodel/io/source/EntitySource.java | 38 +- .../datamodel/io/source/GraphicSource.java | 2 +- .../datamodel/io/source/RawGridSource.java | 2 +- .../io/source/SystemParticipantSource.java | 397 ++++++++---------- .../datamodel/io/source/ThermalSource.java | 2 +- .../ie3/datamodel/io/source/TypeSource.java | 2 +- .../container/EnergyManagementUnits.java | 100 ----- .../models/input/system/BmInput.java | 14 +- .../models/input/system/ChpInput.java | 12 +- .../models/input/system/EmInput.java | 31 +- .../models/input/system/EvInput.java | 12 +- .../models/input/system/EvcsInput.java | 38 +- .../models/input/system/FixedFeedInInput.java | 12 +- .../models/input/system/HpInput.java | 12 +- .../models/input/system/LoadInput.java | 18 +- .../models/input/system/PvInput.java | 12 +- .../models/input/system/StorageInput.java | 12 +- .../input/system/SystemParticipantInput.java | 43 +- .../models/input/system/WecInput.java | 12 +- .../io/extractor/ExtractorTest.groovy | 3 +- .../FixedFeedInInputFactoryTest.groovy | 6 +- .../io/source/EntitySourceTest.groovy | 2 +- .../csv/CsvSystemParticipantSourceTest.groovy | 2 +- .../container/SystemParticipantsTest.groovy | 6 +- .../models/input/system/EvcsInputTest.groovy | 2 +- .../InvalidSystemParticipantInput.groovy | 2 +- .../common/EnergyManagementTestData.groovy | 5 +- .../common/SystemParticipantTestData.groovy | 14 +- 48 files changed, 709 insertions(+), 454 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java diff --git a/docs/uml/main/EntitySourceClassDiagram.puml b/docs/uml/main/EntitySourceClassDiagram.puml index a160bc739..49be16965 100644 --- a/docs/uml/main/EntitySourceClassDiagram.puml +++ b/docs/uml/main/EntitySourceClassDiagram.puml @@ -104,8 +104,8 @@ class SystemParticipantSource{ - Set getChpPlants(Set, Set, Set, Set, Set) - Set getEvs() - Set getEvs(Set, Set, Set) - - Set getEvCS() - - Set getEvCS(Set, Set) + - Set getEvcs() + - Set getEvcs(Set, Set) - Set getFixedFeedIns() - Set getFixedFeedIns(Set, Set) - Set getHeatPumps() diff --git a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java index c958a2d9b..ce750f98f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java @@ -44,6 +44,15 @@ protected EntityData( super(fieldsToAttributes, entityClass); } + /** + * Creates a new EntityData object based on a given {@link FactoryData} object + * + * @param factoryData The factory data object to use attributes of + */ + protected EntityData(FactoryData factoryData) { + super(factoryData.getFieldsToValues(), factoryData.getTargetClass()); + } + @Override @SuppressWarnings("unchecked cast") public Class getTargetClass() { diff --git a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java index 95886864e..f88d24423 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java @@ -18,10 +18,8 @@ public abstract class FactoryData { protected FactoryData(Map fieldsToAttributes, Class targetClass) { // this does the magic: case-insensitive get/set calls on keys - TreeMap insensitiveFieldsToAttributes = - new TreeMap<>(String.CASE_INSENSITIVE_ORDER); - insensitiveFieldsToAttributes.putAll(fieldsToAttributes); - this.fieldsToAttributes = insensitiveFieldsToAttributes; + this.fieldsToAttributes = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + this.fieldsToAttributes.putAll(fieldsToAttributes); this.targetClass = targetClass; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java index 614ca25cb..10f93153e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityData.java @@ -45,6 +45,18 @@ public AssetInputEntityData( this.operator = operator; } + /** + * Creates a new AssetInputEntityData object based on a given {@link EntityData} object and given + * operator + * + * @param entityData The entity data object to use attributes of + * @param operator The operator input to use + */ + public AssetInputEntityData(EntityData entityData, OperatorInput operator) { + super(entityData); + this.operator = operator; + } + public OperatorInput getOperatorInput() { return operator; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java index bce3c4117..4916e78ad 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/NodeAssetInputEntityData.java @@ -53,6 +53,18 @@ public NodeAssetInputEntityData( this.node = node; } + /** + * Creates a new NodeAssetInputEntityData object based on a given {@link AssetInputEntityData} + * object and given node + * + * @param assetInputEntityData The asset entity data object to use attributes of + * @param node input node + */ + public NodeAssetInputEntityData(AssetInputEntityData assetInputEntityData, NodeInput node) { + super(assetInputEntityData, assetInputEntityData.getOperatorInput()); + this.node = node; + } + public NodeInput getNode() { return node; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java index 799837d3c..427a2d821 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java @@ -39,6 +39,7 @@ protected BmInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { final BmTypeInput typeInput = data.getTypeInput(); @@ -54,6 +55,7 @@ protected BmInput buildModel( operationTime, node, qCharacteristics, + em, typeInput, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java index f04b85e86..73b9674f2 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java @@ -32,6 +32,7 @@ protected ChpInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { final boolean marketReaction = data.getBoolean(MARKET_REACTION); @@ -44,6 +45,7 @@ protected ChpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, + em, data.getTypeInput(), data.getThermalStorageInput(), marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index c9aefede5..9b9886e65 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -10,16 +10,33 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EmInput; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; import java.util.UUID; public class EmInputFactory extends AssetInputEntityFactory { private static final String CONTROL_STRATEGY = "controlstrategy"; + private static final String PARENT_EM = "parentem"; + public EmInputFactory() { super(EmInput.class); } + @Override + protected List> getFields(AssetInputEntityData data) { + List> fields = new ArrayList<>(super.getFields(data)); + + List> withEm = + fields.stream().map(f -> (Set) expandSet(f, PARENT_EM)).toList(); + + fields.addAll(withEm); + + return fields; + } + @Override protected String[] getAdditionalFields() { return new String[] {CONTROL_STRATEGY}; @@ -34,6 +51,9 @@ protected EmInput buildModel( OperationTime operationTime) { String controlStrategy = data.getField(CONTROL_STRATEGY); - return new EmInput(uuid, id, operator, operationTime, controlStrategy); + UUID parentEm = null; + if (data.containsKey(PARENT_EM)) parentEm = data.getUUID(PARENT_EM); + + return new EmInput(uuid, id, operator, operationTime, controlStrategy, parentEm); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java index 1f0f8e80c..7cea1d006 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java @@ -33,9 +33,10 @@ protected EvInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { return new EvInput( - uuid, id, operator, operationTime, node, qCharacteristics, data.getTypeInput()); + uuid, id, operator, operationTime, node, qCharacteristics, em, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java index fb7419a75..83a24bbb1 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java @@ -8,7 +8,6 @@ import edu.ie3.datamodel.exceptions.ChargingPointTypeException; import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -18,16 +17,17 @@ import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointTypeUtils; import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationType; import edu.ie3.datamodel.models.input.system.type.evcslocation.EvcsLocationTypeUtils; +import java.util.UUID; /** - * Factory to create instances of {@link EvcsInput}s based on {@link NodeAssetInputEntityData} and - * additional fields. + * Factory to create instances of {@link EvcsInput}s based on {@link SystemParticipantEntityData} + * and additional fields. * * @version 0.1 * @since 26.07.20 */ public class EvcsInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String TYPE = "type"; private static final String CHARGING_POINTS = "chargingpoints"; @@ -46,8 +46,8 @@ protected String[] getAdditionalFields() { @Override protected EvcsInput buildModel( - NodeAssetInputEntityData data, - java.util.UUID uuid, + SystemParticipantEntityData data, + UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, @@ -87,6 +87,7 @@ protected EvcsInput buildModel( operationTime, node, qCharacteristics, + em, type, chargingPoints, cosPhi, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java index 03ff6636f..773a7d0e6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java @@ -12,6 +12,7 @@ import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.FixedFeedInInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; +import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -33,16 +34,17 @@ protected String[] getAdditionalFields() { @Override protected FixedFeedInInput buildModel( NodeAssetInputEntityData data, - java.util.UUID uuid, + UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); final double cosPhiRated = data.getDouble(COSPHI_RATED); return new FixedFeedInInput( - uuid, id, operator, operationTime, node, qCharacteristics, sRated, cosPhiRated); + uuid, id, operator, operationTime, node, qCharacteristics, em, sRated, cosPhiRated); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java index cd814e044..616effa98 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java @@ -31,6 +31,7 @@ protected HpInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { return new HpInput( @@ -41,6 +42,7 @@ protected HpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, + em, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index eb86cefc3..12b763abe 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; @@ -14,6 +13,7 @@ import edu.ie3.datamodel.models.input.system.LoadInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.profile.LoadProfile; +import java.util.UUID; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import org.slf4j.Logger; @@ -21,7 +21,7 @@ import tech.units.indriya.ComparableQuantity; public class LoadInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final Logger logger = LoggerFactory.getLogger(LoadInputFactory.class); private static final String LOAD_PROFILE = "loadprofile"; @@ -41,11 +41,12 @@ protected String[] getAdditionalFields() { @Override protected LoadInput buildModel( - NodeAssetInputEntityData data, - java.util.UUID uuid, + SystemParticipantEntityData data, + UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { LoadProfile loadProfile; @@ -71,6 +72,7 @@ protected LoadInput buildModel( operationTime, node, qCharacteristics, + em, loadProfile, dsm, eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java index 9812354e3..41997f445 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java @@ -5,20 +5,20 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.PvInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; +import java.util.UUID; import javax.measure.quantity.Angle; import javax.measure.quantity.Dimensionless; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; public class PvInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String ALBEDO = "albedo"; private static final String AZIMUTH = "azimuth"; private static final String ETA_CONV = "etaconv"; @@ -42,11 +42,12 @@ protected String[] getAdditionalFields() { @Override protected PvInput buildModel( - NodeAssetInputEntityData data, - java.util.UUID uuid, + SystemParticipantEntityData data, + UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { final double albedo = data.getDouble(ALBEDO); @@ -68,6 +69,7 @@ protected PvInput buildModel( operationTime, node, qCharacteristics, + em, albedo, azimuth, etaConv, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java index 04645c459..24adbec5a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java @@ -33,9 +33,11 @@ protected StorageInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, OperatorInput operator, OperationTime operationTime) { final StorageTypeInput typeInput = data.getTypeInput(); - return new StorageInput(uuid, id, operator, operationTime, node, qCharacteristics, typeInput); + return new StorageInput( + uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java new file mode 100644 index 000000000..f65fea7b7 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java @@ -0,0 +1,152 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input.participant; + +import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; +import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; +import edu.ie3.datamodel.utils.Try; + +import java.util.Map; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; + +/** + * Data used for those classes of {@link + * edu.ie3.datamodel.models.input.system.SystemParticipantInput}, including an (optional) link to an + * {@link EmInput} entity. + */ +public class SystemParticipantEntityData extends NodeAssetInputEntityData { + + /** Energy management unit that is managing the system participant. Can be null. */ + private final EmInput em; + + /** + * Creates a new SystemParticipantEntityData object for an operated, always on system participant + * input + * + * @param fieldsToAttributes attribute map: field name to value + * @param entityClass class of the entity to be created with this data + * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + Map fieldsToAttributes, + Class entityClass, + NodeInput node, + EmInput em) { + super(fieldsToAttributes, entityClass, node); + this.em = em; + } + + public Optional getEm() { + return Optional.ofNullable(em); + } + + /** + * Creates a new SystemParticipantEntityData object for an operable system participant input + * + * @param fieldsToAttributes attribute map: field name to value + * @param entityClass class of the entity to be created with this data + * @param operator operator input + * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + Map fieldsToAttributes, + Class entityClass, + OperatorInput operator, + NodeInput node, + EmInput em) { + super(fieldsToAttributes, entityClass, operator, node); + this.em = em; + } + + /** + * Creates a new SystemParticipantEntityData object based on a given {@link + * NodeAssetInputEntityData} object and given energy management unit + * + * @param nodeAssetInputEntityData The node asset entity data object to use attributes of + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. + */ + public SystemParticipantEntityData( + NodeAssetInputEntityData nodeAssetInputEntityData, EmInput em) { + super(nodeAssetInputEntityData, nodeAssetInputEntityData.getNode()); + this.em = em; + } + + @Override + public String toString() { + return "SystemParticipantEntityData{" + + "em=" + + getEm().map(EmInput::toString).orElse("") + + ", node=" + + getNode().getUuid() + + ", operatorInput=" + + getOperatorInput().getUuid() + + ", fieldsToValues=" + + getFieldsToValues() + + ", targetClass=" + + getTargetClass() + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + SystemParticipantEntityData that = (SystemParticipantEntityData) o; + return getEm().equals(that.getEm()); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), getEm()); + } + + public static Try build( + NodeAssetInputEntityData nodeAssetInputEntityData, Map ems) { + + Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); + + Try, SourceException> tryEm = + Optional.ofNullable( + nodeAssetInputEntityData.getUUID(SystemParticipantInputEntityFactory.EM)) + .map( + // System participant has been given a proper UUID. This means we either... + emUuid -> + Optional.ofNullable(ems.get(emUuid)) + // ... find a matching EmInput for given UUID, thus return a success with + // the EM + .map( + emInput -> + (Try, SourceException>) + new Try.Success, SourceException>( + Optional.of(emInput))) + // ... or find no matching EmInput, returning a failure. + .orElse(new Try.Failure<>(new SourceException("")))) + // If, on the other hand, no UUID was given (column does not exist, or field is empty), + // this is totally fine - we return an "empty success" + .orElse(new Try.Success<>(Optional.empty())); + + return tryEm.map( + // if the operation was successful, transform and return to the data + optionalEm -> { + // remove fields that are passed as objects to constructor + fieldsToAttributes.keySet().remove(SystemParticipantInputEntityFactory.EM); + + return new SystemParticipantEntityData(nodeAssetInputEntityData, optionalEm.orElse(null)); + }); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java index 212f9db96..e8101b582 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java @@ -26,21 +26,27 @@ * @version 0.1 * @since 28.01.20 */ -abstract class SystemParticipantInputEntityFactory< - T extends SystemParticipantInput, D extends NodeAssetInputEntityData> +public abstract class SystemParticipantInputEntityFactory< + T extends SystemParticipantInput, D extends SystemParticipantEntityData> extends AssetInputEntityFactory { private static final String Q_CHARACTERISTICS = "qcharacteristics"; + public static final String EM = "em"; + protected SystemParticipantInputEntityFactory(Class... allowedClasses) { super(allowedClasses); } @Override protected List> getFields(D data) { - List> fields = super.getFields(data); + List> fields = new ArrayList<>(super.getFields(data)); for (Set set : fields) set.add(Q_CHARACTERISTICS); + List> withEm = fields.stream().map(f -> (Set) expandSet(f, EM)).toList(); + + fields.addAll(withEm); + return fields; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java index 5fcb3e00a..4a28b210c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; import java.util.Map; import java.util.Objects; @@ -22,7 +22,7 @@ * of the SystemParticipantInput */ public class SystemParticipantTypedEntityData - extends NodeAssetInputEntityData { + extends SystemParticipantEntityData { private final T typeInput; @@ -33,14 +33,17 @@ public class SystemParticipantTypedEntityData fieldsToAttributes, Class entityClass, NodeInput node, + EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, node); + super(fieldsToAttributes, entityClass, node, em); this.typeInput = typeInput; } @@ -52,6 +55,8 @@ public SystemParticipantTypedEntityData( * @param entityClass class of the entity to be created with this data * @param operator operator input * @param node input node + * @param em The energy management unit that is managing the system participant. Null, if the + * system participant is not managed. * @param typeInput type input */ public SystemParticipantTypedEntityData( @@ -59,16 +64,37 @@ public SystemParticipantTypedEntityData( Class entityClass, OperatorInput operator, NodeInput node, + EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, operator, node); + super(fieldsToAttributes, entityClass, operator, node, em); this.typeInput = typeInput; } + /** + * Creates a new SystemParticipantTypedEntityData object based on a given {@link + * SystemParticipantEntityData} object and given type input + * + * @param systemParticipantEntityData The system participant entity data object to use attributes + * of + * @param typeInput type input + */ + public SystemParticipantTypedEntityData( + SystemParticipantEntityData systemParticipantEntityData, T typeInput) { + super(systemParticipantEntityData, systemParticipantEntityData.getEm().orElse(null)); + this.typeInput = typeInput; + } + + public T getTypeInput() { + return typeInput; + } + @Override public String toString() { return "SystemParticipantTypedEntityData{" + "typeInput=" + typeInput.getUuid() + + ", em=" + + getEm().map(EmInput::toString).orElse("") + ", node=" + getNode().getUuid() + ", operatorInput=" @@ -93,8 +119,4 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(super.hashCode(), getTypeInput()); } - - public T getTypeInput() { - return typeInput; - } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java index 83bbbdd43..17b780c33 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.WecInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.WecTypeInput; @@ -37,9 +38,10 @@ protected WecInput buildModel( OperatorInput operator, OperationTime operationTime) { WecTypeInput typeInput = data.getTypeInput(); + EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new WecInput( - uuid, id, operator, operationTime, node, qCharacteristics, typeInput, marketReaction); + uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput, marketReaction); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 51e120b1f..882704450 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -8,10 +8,13 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.input.participant.EmInputFactory; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.container.EnergyManagementUnits; import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.utils.Try; +import java.util.Map; import java.util.Set; +import java.util.UUID; +import java.util.function.Function; +import java.util.stream.Collectors; public class EnergyManagementSource extends EntitySource { @@ -20,8 +23,8 @@ public class EnergyManagementSource extends EntitySource { private final EmInputFactory emInputFactory; public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { + super(dataSource); this.typeSource = typeSource; - this.dataSource = dataSource; this.emInputFactory = new EmInputFactory(); } @@ -33,9 +36,9 @@ public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. * - * @return a set of object and uuid unique {@link EmInput} entities + * @return a map of uuid to {@link EmInput} entities */ - public EnergyManagementUnits getEmUnits() throws SourceException { + public Map getEmUnits() throws SourceException { Set operators = typeSource.getOperators(); return getEmUnits(operators); } @@ -55,14 +58,14 @@ public EnergyManagementUnits getEmUnits() throws SourceException { * * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for * the returning instances - * @return a set of object and uuid unique {@link EmInput} entities + * @return a map of uuid to {@link EmInput} entities */ - public EnergyManagementUnits getEmUnits(Set operators) throws SourceException { - Set emUnits = - Try.scanCollection( - buildAssetInputEntities(EmInput.class, emInputFactory, operators), EmInput.class) - .transformF(SourceException::new) - .getOrThrow(); - return new EnergyManagementUnits(emUnits); + public Map getEmUnits(Set operators) throws SourceException { + return Try.scanCollection( + buildAssetInputEntities(EmInput.class, emInputFactory, operators), EmInput.class) + .transformF(SourceException::new) + .getOrThrow() + .stream() + .collect(Collectors.toMap(EmInput::getUuid, Function.identity())); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 550c76111..f505ed4b5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -35,7 +35,11 @@ public abstract class EntitySource { protected static final String TYPE = "type"; protected static final String FIELDS_TO_VALUES_MAP = "fieldsToValuesMap"; - DataSource dataSource; + protected final DataSource dataSource; + + protected EntitySource(DataSource dataSource) { + this.dataSource = dataSource; + } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= @@ -109,8 +113,7 @@ protected Try getAssetType( Optional.ofNullable(fieldsToAttributes.get(TYPE)) .flatMap(typeUuid -> findFirstEntityByUuid(UUID.fromString(typeUuid), types)); - // if the type is not present we return an empty element and - // log a warning + // if the type is not present we return a failure if (assetType.isEmpty()) { String skippingMessage = buildSkippingMessage( @@ -239,12 +242,7 @@ protected Stream> nodeAssetInputE // remove fields that are passed as objects to constructor fieldsToAttributes.keySet().remove(NODE); - return new Success<>( - new NodeAssetInputEntityData( - fieldsToAttributes, - assetInputEntityData.getTargetClass(), - assetInputEntityData.getOperatorInput(), - node.get())); + return new Success<>(new NodeAssetInputEntityData(assetInputEntityData, node.get())); }); } @@ -313,6 +311,17 @@ protected Stream> assetInputEnti return assetInputEntityDataStream(entityClass, operators).map(factory::get); } + protected Stream> nodeAssetEntityStream( + Class entityClass, + EntityFactory factory, + Collection nodes, + Collection operators) { + return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) + .map(factory::get); + } + + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + /** * Returns a stream of {@link Try} entities that can be build by using {@link * NodeAssetInputEntityData} and their corresponding factory. @@ -326,17 +335,6 @@ protected Stream> assetInputEnti * @param Type of the {@link AssetInput} to expect * @return stream of tries of the entities that has been built by the factory */ - protected Stream> nodeAssetEntityStream( - Class entityClass, - EntityFactory factory, - Collection nodes, - Collection operators) { - return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) - .map(factory::get); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - public Set> buildNodeAssetEntities( Class entityClass, EntityFactory factory, diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index 2ecd52c59..904b33f3a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -42,9 +42,9 @@ public class GraphicSource extends EntitySource { private final NodeGraphicInputFactory nodeGraphicInputFactory; public GraphicSource(TypeSource typeSource, RawGridSource rawGridSource, DataSource dataSource) { + super(dataSource); this.typeSource = typeSource; this.rawGridSource = rawGridSource; - this.dataSource = dataSource; this.lineGraphicInputFactory = new LineGraphicInputFactory(); this.nodeGraphicInputFactory = new NodeGraphicInputFactory(); diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index 70c228c96..ba90ea3ff 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -57,8 +57,8 @@ public class RawGridSource extends EntitySource { private final MeasurementUnitInputFactory measurementUnitInputFactory; public RawGridSource(TypeSource typeSource, DataSource dataSource) { + super(dataSource); this.typeSource = typeSource; - this.dataSource = dataSource; // init factories this.nodeInputFactory = new NodeInputFactory(); diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 53b727bd8..76e1713a8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -38,6 +38,7 @@ public class SystemParticipantSource extends EntitySource { private final TypeSource typeSource; private final RawGridSource rawGridSource; private final ThermalSource thermalSource; + private final EnergyManagementSource energyManagementSource; // factories private final BmInputFactory bmInputFactory; @@ -55,12 +56,14 @@ public SystemParticipantSource( TypeSource typeSource, ThermalSource thermalSource, RawGridSource rawGridSource, + EnergyManagementSource energyManagementSource, DataSource dataSource) { + super(dataSource); this.typeSource = typeSource; this.rawGridSource = rawGridSource; this.thermalSource = thermalSource; - this.dataSource = dataSource; + this.energyManagementSource = energyManagementSource; // init factories this.bmInputFactory = new BmInputFactory(); @@ -104,6 +107,7 @@ public SystemParticipants getSystemParticipants() throws SourceException { Set hpTypes = typeSource.getHpTypes(); Set storageTypes = typeSource.getStorageTypes(); Set wecTypes = typeSource.getWecTypes(); + Map emUnits = energyManagementSource.getEmUnits(); /// go on with the thermal assets Set thermalBuses = thermalSource.getThermalBuses(operators); @@ -127,7 +131,7 @@ public SystemParticipants getSystemParticipants() throws SourceException { Try, SourceException> evs = Try.of(() -> getEvs(nodes, operators, evTypes), SourceException.class); Try, SourceException> evcs = - Try.of(() -> getEvCS(nodes, operators), SourceException.class); + Try.of(() -> getEvcs(nodes, operators), SourceException.class); Try, SourceException> chpInputs = Try.of( () -> getChpPlants(nodes, operators, chpTypes, thermalBuses, thermalStorages), @@ -307,9 +311,9 @@ public Set getLoads(Set nodes, Set operator * * @return a set of object and uuid unique {@link EvcsInput} entities */ - public Set getEvCS() throws SourceException { + public Set getEvcs() throws SourceException { Set operators = typeSource.getOperators(); - return getEvCS(rawGridSource.getNodes(operators), operators); + return getEvcs(rawGridSource.getNodes(operators), operators); } /** @@ -318,7 +322,7 @@ public Set getEvCS() throws SourceException { * EvcsInput} which has to be checked manually, as {@link EvcsInput#equals(Object)} is NOT * restricted on the uuid of {@link EvcsInput}. * - *

In contrast to {@link #getEvCS()} this method provides the ability to pass in an already + *

In contrast to {@link #getEvcs()} this method provides the ability to pass in an already * existing set of {@link NodeInput} and {@link OperatorInput} entities, the {@link EvcsInput} * instances depend on. Doing so, already loaded nodes can be recycled to improve performance and * prevent unnecessary loading operations. @@ -331,7 +335,7 @@ public Set getEvCS() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link EvcsInput} entities */ - public Set getEvCS(Set nodes, Set operators) + public Set getEvcs(Set nodes, Set operators) throws SourceException { return Try.scanCollection( buildNodeAssetEntities(EvcsInput.class, evcsInputFactory, nodes, operators), @@ -550,8 +554,8 @@ public Set getChpPlants( Set thermalStorages) throws SourceException { return Try.scanCollection( - buildChpInputEntities( - chpInputFactory, nodes, operators, types, thermalBuses, thermalStorages), + chpInputStream(chpInputFactory, nodes, operators, types, thermalBuses, thermalStorages) + .collect(Collectors.toSet()), ChpInput.class) .transformF(SourceException::new) .getOrThrow(); @@ -583,7 +587,8 @@ public Set getHeatPumps( Set thermalBuses) throws SourceException { return Try.scanCollection( - buildHpInputEntities(hpInputFactory, nodes, operators, types, thermalBuses), + hpInputStream(hpInputFactory, nodes, operators, types, thermalBuses) + .collect(Collectors.toSet()), HpInput.class) .transformF(SourceException::new) .getOrThrow(); @@ -591,40 +596,6 @@ public Set getHeatPumps( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - private - Set> buildTypedSystemParticipantEntities( - Class entityClass, - EntityFactory> factory, - Collection nodes, - Collection operators, - Collection types) { - return typedSystemParticipantEntityStream(entityClass, factory, nodes, operators, types) - .collect(Collectors.toSet()); - } - - private Set> buildChpInputEntities( - ChpInputFactory factory, - Collection nodes, - Collection operators, - Collection chpTypes, - Collection thermalBuses, - Collection thermalStorages) { - return chpInputStream(factory, nodes, operators, chpTypes, thermalBuses, thermalStorages) - .collect(Collectors.toSet()); - } - - private Set> buildHpInputEntities( - HpInputFactory factory, - Collection nodes, - Collection operators, - Collection types, - Collection thermalBuses) { - return hpInputStream(factory, nodes, operators, types, thermalBuses) - .collect(Collectors.toSet()); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - /** * Constructs a stream of {@link SystemParticipantInput} entities wrapped in {@link Try}'s. * @@ -633,25 +604,28 @@ private Set> buildHpInputEntities( * @param nodes the nodes that should be considered for these entities * @param operators the operators that should be considered for these entities * @param types the types that should be considered for these entities - * @param the type of the resulting entity - * @param the type of the type model of the resulting entity + * @param the type of the resulting entity + * @param the type of the type model of the resulting entity * @return a stream of tries being either empty or holding an instance of a {@link * SystemParticipantInput} of the requested entity class */ - private - Stream> typedSystemParticipantEntityStream( - Class entityClass, - EntityFactory> factory, + private + Set> buildTypedSystemParticipantEntities( + Class entityClass, + EntityFactory> factory, Collection nodes, Collection operators, - Collection types) { + Collection types) { return buildTypedSystemParticipantEntityData( nodeAssetInputEntityDataStream( assetInputEntityDataStream(entityClass, operators), nodes), types) - .map(factory::get); + .map(factory::get) + .collect(Collectors.toSet()); } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + private Stream> chpInputStream( ChpInputFactory factory, Collection nodes, @@ -660,7 +634,7 @@ private Stream> chpInputStream( Collection thermalBuses, Collection thermalStorages) { return buildChpEntityData( - buildTypedEntityData( + buildTypedSystemParticipantEntityData( nodeAssetInputEntityDataStream( assetInputEntityDataStream(ChpInput.class, operators), nodes), types), @@ -669,122 +643,95 @@ private Stream> chpInputStream( .map(factory::get); } - private Stream> hpInputStream( - HpInputFactory factory, - Collection nodes, - Collection operators, - Collection types, + private Stream> buildChpEntityData( + Stream, SourceException>> + typedEntityDataStream, + Collection thermalStorages, Collection thermalBuses) { - return buildHpEntityData( - buildTypedEntityData( - nodeAssetInputEntityDataStream( - assetInputEntityDataStream(HpInput.class, operators), nodes), - types), - thermalBuses) - .map(factory::get); - } - /** - * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of - * {@link SystemParticipantTypeInput} based on the provided collection of types and the fields to - * values mapping that inside the already provided {@link NodeAssetInputEntityData} instance. - * - * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} {@link - * Try} objects - * @param types the types that should be used for enrichment and to build {@link - * SystemParticipantTypedEntityData} from - * @param the type of the provided entity types as well as the type parameter of the resulting - * {@link SystemParticipantTypedEntityData} - * @return a stream of tries of {@link SystemParticipantTypedEntityData} instances - */ - private - Stream, SourceException>> - buildTypedSystemParticipantEntityData( - Stream> nodeAssetEntityDataStream, - Collection types) { - return nodeAssetEntityDataStream + return typedEntityDataStream .parallel() .map( - nodeAssetInputEntityDataOpt -> - nodeAssetInputEntityDataOpt.flatMap( - nodeAssetInputEntityData -> - buildTypedSystemParticipantEntityData(nodeAssetInputEntityData, types))); + typedEntityDataOpt -> + typedEntityDataOpt.flatMap( + typedEntityData -> + buildChpEntityData(typedEntityData, thermalStorages, thermalBuses))); } - protected - Try, SourceException> - buildTypedSystemParticipantEntityData( - NodeAssetInputEntityData nodeAssetInputEntityData, Collection types) { - return getAssetType( - types, - nodeAssetInputEntityData.getFieldsToValues(), - nodeAssetInputEntityData.getClass().getSimpleName()) - .map( - // if the optional is present, transform and return to the data, - // otherwise return an empty optional - assetType -> { - Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); + private Try buildChpEntityData( + SystemParticipantTypedEntityData typedEntityData, + Collection thermalStorages, + Collection thermalBuses) { - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(TYPE); + // get the raw data + Map fieldsToAttributes = typedEntityData.getFieldsToValues(); - return new SystemParticipantTypedEntityData<>( - fieldsToAttributes, - nodeAssetInputEntityData.getTargetClass(), - nodeAssetInputEntityData.getOperatorInput(), - nodeAssetInputEntityData.getNode(), - assetType); - }); - } + // get the thermal storage input for this chp unit + Optional thermalStorage = + Optional.ofNullable(fieldsToAttributes.get(THERMAL_STORAGE)) + .flatMap( + thermalStorageUuid -> + findFirstEntityByUuid(UUID.fromString(thermalStorageUuid), thermalStorages)); - /** - * Enriches a given stream of {@link NodeAssetInputEntityData} tries with a type of {@link - * SystemParticipantTypeInput} based on the provided collection of types and the fields to values - * mapping that inside the already provided {@link NodeAssetInputEntityData} instance. - * - * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} tries - * @param types the types that should be used for enrichment and to build {@link - * SystemParticipantTypedEntityData} from - * @param the type of the provided entity types as well as the type parameter of the resulting - * {@link SystemParticipantTypedEntityData} - * @return a stream of tries of {@link SystemParticipantTypedEntityData} instances - */ - private - Stream, SourceException>> buildTypedEntityData( - Stream> nodeAssetEntityDataStream, - Collection types) { - return nodeAssetEntityDataStream - .parallel() - .map( - nodeAssetInputEntityDataOpt -> - nodeAssetInputEntityDataOpt.flatMap( - nodeAssetInputEntityData -> - buildTypedEntityData(nodeAssetInputEntityData, types))); - } + // get the thermal bus input for this chp unit + Optional thermalBus = + Optional.ofNullable(fieldsToAttributes.get("thermalBus")) + .flatMap( + thermalBusUuid -> + findFirstEntityByUuid(UUID.fromString(thermalBusUuid), thermalBuses)); - protected - Try, SourceException> buildTypedEntityData( - NodeAssetInputEntityData nodeAssetInputEntityData, Collection types) { - return getAssetType( - types, - nodeAssetInputEntityData.getFieldsToValues(), - nodeAssetInputEntityData.getClass().getSimpleName()) - .map( - // if the optional is present, transform and return to the data, - // otherwise return an empty optional - assetType -> { - Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); + // if the thermal storage or the thermal bus are not present we return an + // empty element and log a warning + if (thermalStorage.isEmpty() || thermalBus.isEmpty()) { + StringBuilder sB = new StringBuilder(); + if (thermalStorage.isEmpty()) { + sB.append("thermalStorage: ") + .append(safeMapGet(fieldsToAttributes, THERMAL_STORAGE, FIELDS_TO_VALUES_MAP)); + } + if (thermalBus.isEmpty()) { + sB.append("\nthermalBus: ") + .append(safeMapGet(fieldsToAttributes, THERMAL_BUS, FIELDS_TO_VALUES_MAP)); + } - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(TYPE); + String skippingMessage = + buildSkippingMessage( + typedEntityData.getTargetClass().getSimpleName(), + safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), + safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), + sB.toString()); + return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); + } - return new SystemParticipantTypedEntityData<>( - fieldsToAttributes, - nodeAssetInputEntityData.getTargetClass(), - nodeAssetInputEntityData.getOperatorInput(), - nodeAssetInputEntityData.getNode(), - assetType); - }); + // remove fields that are passed as objects to constructor + fieldsToAttributes + .keySet() + .removeAll(new HashSet<>(Arrays.asList("thermalBus", "thermalStorage"))); + + return new Success<>( + new ChpInputEntityData( + fieldsToAttributes, + typedEntityData.getOperatorInput(), + typedEntityData.getNode(), + typedEntityData.getTypeInput(), + thermalBus.get(), + thermalStorage.get())); + } + + private Stream> hpInputStream( + HpInputFactory factory, + Collection nodes, + Collection operators, + Collection types, + Collection thermalBuses) { + return buildHpEntityData( + buildTypedSystemParticipantEntityData( + buildSystemParticipantEntityData( + nodeAssetInputEntityDataStream( + assetInputEntityDataStream(HpInput.class, operators), nodes), + ems), + types), + thermalBuses) + .map(factory::get); } /** @@ -855,77 +802,85 @@ protected Try buildHpEntityData( return new Success<>(hpInputEntityDataOpt.get()); } - private Stream> buildChpEntityData( - Stream, SourceException>> - typedEntityDataStream, - Collection thermalStorages, - Collection thermalBuses) { - - return typedEntityDataStream + /** + * Enriches a given stream of {@link SystemParticipantEntityData} {@link Try} objects with a type + * of {@link SystemParticipantTypeInput} based on the provided collection of types and the fields + * to values mapping that inside the already provided {@link SystemParticipantEntityData} + * instance. + * + * @param systemParticipantEntityDataStream the data stream of {@link SystemParticipantEntityData} + * {@link Try} objects + * @param types the types that should be used for enrichment and to build {@link + * SystemParticipantTypedEntityData} from + * @param the type of the provided entity types as well as the type parameter of the resulting + * {@link SystemParticipantTypedEntityData} + * @return a stream of tries of {@link SystemParticipantTypedEntityData} instances + */ + private + Stream, SourceException>> + buildTypedSystemParticipantEntityData( + Stream> + systemParticipantEntityDataStream, + Collection types) { + return systemParticipantEntityDataStream .parallel() .map( - typedEntityDataOpt -> - typedEntityDataOpt.flatMap( - typedEntityData -> - buildChpEntityData(typedEntityData, thermalStorages, thermalBuses))); + participantEntityDataTry -> + participantEntityDataTry.flatMap( + participantEntityData -> + buildTypedSystemParticipantEntityData(participantEntityData, types))); } - protected Try buildChpEntityData( - SystemParticipantTypedEntityData typedEntityData, - Collection thermalStorages, - Collection thermalBuses) { - - // get the raw data - Map fieldsToAttributes = typedEntityData.getFieldsToValues(); - - // get the thermal storage input for this chp unit - Optional thermalStorage = - Optional.ofNullable(fieldsToAttributes.get(THERMAL_STORAGE)) - .flatMap( - thermalStorageUuid -> - findFirstEntityByUuid(UUID.fromString(thermalStorageUuid), thermalStorages)); - - // get the thermal bus input for this chp unit - Optional thermalBus = - Optional.ofNullable(fieldsToAttributes.get("thermalBus")) - .flatMap( - thermalBusUuid -> - findFirstEntityByUuid(UUID.fromString(thermalBusUuid), thermalBuses)); - - // if the thermal storage or the thermal bus are not present we return an - // empty element and log a warning - if (thermalStorage.isEmpty() || thermalBus.isEmpty()) { - StringBuilder sB = new StringBuilder(); - if (thermalStorage.isEmpty()) { - sB.append("thermalStorage: ") - .append(safeMapGet(fieldsToAttributes, THERMAL_STORAGE, FIELDS_TO_VALUES_MAP)); - } - if (thermalBus.isEmpty()) { - sB.append("\nthermalBus: ") - .append(safeMapGet(fieldsToAttributes, THERMAL_BUS, FIELDS_TO_VALUES_MAP)); - } + private + Try, SourceException> + buildTypedSystemParticipantEntityData( + SystemParticipantEntityData systemParticipantEntityDataStream, Collection types) { + return getAssetType( + types, + systemParticipantEntityDataStream.getFieldsToValues(), + systemParticipantEntityDataStream.getClass().getSimpleName()) + .map( + // if the operation was successful, transform and return to the data + assetType -> { + Map fieldsToAttributes = + systemParticipantEntityDataStream.getFieldsToValues(); - String skippingMessage = - buildSkippingMessage( - typedEntityData.getTargetClass().getSimpleName(), - safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), - safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), - sB.toString()); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } + // remove fields that are passed as objects to constructor + fieldsToAttributes.keySet().remove(TYPE); - // remove fields that are passed as objects to constructor - fieldsToAttributes - .keySet() - .removeAll(new HashSet<>(Arrays.asList("thermalBus", "thermalStorage"))); + return new SystemParticipantTypedEntityData<>( + fieldsToAttributes, + systemParticipantEntityDataStream.getTargetClass(), + systemParticipantEntityDataStream.getOperatorInput(), + systemParticipantEntityDataStream.getNode(), + systemParticipantEntityDataStream.getEm().orElse(null), + assetType); + }); + } - return new Success<>( - new ChpInputEntityData( - fieldsToAttributes, - typedEntityData.getOperatorInput(), - typedEntityData.getNode(), - typedEntityData.getTypeInput(), - thermalBus.get(), - thermalStorage.get())); + /** + * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of + * {@link EmInput} based on the provided collection of EMs and the fields to + * values mapping that inside the already provided {@link NodeAssetInputEntityData} instance. + * + * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} {@link + * Try} objects + * @param ems the energy management units that should be used for enrichment and to build {@link + * SystemParticipantEntityData} from + * @return a stream of tries of {@link SystemParticipantEntityData} instances + */ + private + Stream> + buildSystemParticipantEntityData( + Stream> nodeAssetEntityDataStream, + Map ems) { + return nodeAssetEntityDataStream + .parallel() + .map( + nodeAssetInputEntityDataOpt -> + nodeAssetInputEntityDataOpt.flatMap( + nodeAssetInputEntityData -> + SystemParticipantEntityData.build(nodeAssetInputEntityData, ems))); } + } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 48384565f..d83ed8c42 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -38,8 +38,8 @@ public class ThermalSource extends EntitySource { private final ThermalHouseInputFactory thermalHouseInputFactory; public ThermalSource(TypeSource typeSource, DataSource dataSource) { + super(dataSource); this.typeSource = typeSource; - this.dataSource = dataSource; this.thermalBusInputFactory = new ThermalBusInputFactory(); this.cylindricalStorageInputFactory = new CylindricalStorageInputFactory(); diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index a7412cedc..501dfac15 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -36,7 +36,7 @@ public class TypeSource extends EntitySource { private final SystemParticipantTypeInputFactory systemParticipantTypeInputFactory; public TypeSource(DataSource dataSource) { - this.dataSource = dataSource; + super(dataSource); this.operatorInputFactory = new OperatorInputFactory(); this.transformer2WTypeInputFactory = new Transformer2WTypeInputFactory(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java b/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java deleted file mode 100644 index 4142a745d..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.input.container; - -import edu.ie3.datamodel.models.input.system.EmInput; -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -/** Represents the accumulation of energy management units */ -public class EnergyManagementUnits implements InputContainer { - - protected final Map emUnits; - - public EnergyManagementUnits(Set emUnits) { - this.emUnits = - emUnits.stream().collect(Collectors.toMap(EmInput::getUuid, Function.identity())); - } - - /** - * Combine different already existing containers - * - * @param emUnits already existing containers - */ - public EnergyManagementUnits(Collection emUnits) { - this.emUnits = - emUnits.stream() - .flatMap(units -> units.emUnits.entrySet().stream()) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - } - - public Set getEmUnits() { - return new HashSet<>(emUnits.values()); - } - - @Override - public List allEntitiesAsList() { - return emUnits.values().stream().toList(); - } - - // TODO useful once #957 is implemented - public Map getEmUnitsMap() { - return emUnits; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof EnergyManagementUnits that)) return false; - return Objects.equals(emUnits, that.emUnits); - } - - @Override - public int hashCode() { - return Objects.hash(emUnits); - } - - @Override - public EnergyManagementUnitsCopyBuilder copy() { - return new EnergyManagementUnitsCopyBuilder(this); - } - - /** - * A builder pattern based approach to create copies of {@link EnergyManagementUnits} containers - * with altered field values. For detailed field descriptions refer to java docs of {@link - * EnergyManagementUnits} - */ - public static class EnergyManagementUnitsCopyBuilder - implements InputContainerCopyBuilder { - protected Set emUnits; - - /** - * Constructor for {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} - * - * @param energyManagementUnits instance of {@link EnergyManagementUnits} - */ - protected EnergyManagementUnitsCopyBuilder(EnergyManagementUnits energyManagementUnits) { - this.emUnits = energyManagementUnits.getEmUnits(); - } - - /** - * Method to alter the {@link EmInput}s - * - * @param emUnits set of altered {@link EmInput}s - * @return this instance of {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} - */ - public EnergyManagementUnits.EnergyManagementUnitsCopyBuilder emUnits(Set emUnits) { - this.emUnits = emUnits; - return this; - } - - @Override - public EnergyManagementUnits build() { - return new EnergyManagementUnits(emUnits); - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java index ec6003abe..99cb8a9bf 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java @@ -39,6 +39,7 @@ public class BmInput extends SystemParticipantInput implements HasType { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of BM * @param marketReaction Is this asset market oriented? * @param costControlled Does this plant increase the output power if the revenues exceed the @@ -52,11 +53,12 @@ public BmInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, BmTypeInput type, boolean marketReaction, boolean costControlled, ComparableQuantity feedInTariff) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -70,6 +72,7 @@ public BmInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of BM * @param marketReaction Is this asset market oriented? * @param costControlled Does this plant increase the output power if the revenues exceed the @@ -81,11 +84,12 @@ public BmInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, + UUID em, BmTypeInput type, boolean marketReaction, boolean costControlled, ComparableQuantity feedInTariff) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -144,8 +148,9 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' - + "type=" + + "', em=" + + getEm() + + ", type=" + type.getUuid() + ", marketReaction=" + marketReaction @@ -208,6 +213,7 @@ public BmInput build() { getOperationTime(), getNode(), getqCharacteristics(), + getEm(), type, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java index 422817ecb..16b5c183f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java @@ -41,6 +41,7 @@ public class ChpInput extends SystemParticipantInput * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -53,10 +54,11 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + UUID em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, operator, operationTime, node, qCharacteristics); + super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -72,6 +74,7 @@ public ChpInput( * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic + * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -82,10 +85,11 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, + UUID em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, node, qCharacteristics); + super(uuid, id, node, qCharacteristics, em); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -145,7 +149,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + '\'' + + "', em=" + + getEm() + ", thermalBus=" + thermalBus.getUuid() + ", type=" @@ -190,6 +195,7 @@ public ChpInput build() { getNode(), thermalBus, getqCharacteristics(), + getEm(), type, thermalStorage, marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java index b58a054ef..a169c6c1b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java @@ -16,6 +16,12 @@ public class EmInput extends AssetInput { /** Reference to the control strategy to be used for this model */ private final String controlStrategy; + /** + * Optional UUID of the parent {@link EmInput} that is controlling this em unit. If null, this em + * unit is not em-controlled. + */ + private final UUID parentEm; + /** * Constructor for an operated energy management system * @@ -24,15 +30,18 @@ public class EmInput extends AssetInput { * @param operator of the asset * @param operationTime time for which the entity is operated * @param emControlStrategy the control strategy + * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. */ public EmInput( UUID uuid, String id, OperatorInput operator, OperationTime operationTime, - String emControlStrategy) { + String emControlStrategy, + UUID parentEm) { super(uuid, id, operator, operationTime); this.controlStrategy = emControlStrategy; + this.parentEm = parentEm; } /** @@ -41,16 +50,22 @@ public EmInput( * @param uuid of the input entity * @param id of the asset * @param emControlStrategy the control strategy + * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. */ - public EmInput(UUID uuid, String id, String emControlStrategy) { + public EmInput(UUID uuid, String id, String emControlStrategy, UUID parentEm) { super(uuid, id); this.controlStrategy = emControlStrategy; + this.parentEm = parentEm; } public String getControlStrategy() { return controlStrategy; } + public UUID getParentEm() { + return parentEm; + } + @Override public EmInputCopyBuilder copy() { return new EmInputCopyBuilder(this); @@ -82,6 +97,8 @@ public String toString() { + getOperationTime() + ", controlStrategy=" + getControlStrategy() + + ", parentEm=" + + getParentEm() + '}'; } @@ -89,6 +106,8 @@ public static class EmInputCopyBuilder extends AssetInputCopyBuilder csvSystemParticipantSource.getEvCS(nodes as Set, operators as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(nodes as Set, operators as Set), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/SystemParticipantsTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/SystemParticipantsTest.groovy index 612dd50ad..e75cf6526 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/SystemParticipantsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/SystemParticipantsTest.groovy @@ -49,7 +49,7 @@ class SystemParticipantsTest extends Specification { def modifiedBmInput = SystemParticipantTestData.bmInput.copy().id("modified").build() def modifiedChpInput = SystemParticipantTestData.chpInput.copy().id("modified").build() - def modifiedEvCSInput = SystemParticipantTestData.evcsInput.copy().id("modified").build() + def modifiedEvcsInput = SystemParticipantTestData.evcsInput.copy().id("modified").build() def modifiedEvInput = SystemParticipantTestData.evInput.copy().id("modified").build() def modifiedFixedFeedInInput = SystemParticipantTestData.fixedFeedInInput.copy().id("modified").build() def modifiedHpInput = SystemParticipantTestData.hpInput.copy().id("modified").build() @@ -62,7 +62,7 @@ class SystemParticipantsTest extends Specification { def modifiedSystemParticipants = systemParticipants.copy() .bmPlants(Set.of(modifiedBmInput)) .chpPlants(Set.of(modifiedChpInput)) - .evcs(Set.of(modifiedEvCSInput)) + .evcs(Set.of(modifiedEvcsInput)) .evs(Set.of(modifiedEvInput)) .fixedFeedIn(Set.of(modifiedFixedFeedInInput)) .heatPumps(Set.of(modifiedHpInput)) @@ -75,7 +75,7 @@ class SystemParticipantsTest extends Specification { then: modifiedSystemParticipants.bmPlants.first() == modifiedBmInput modifiedSystemParticipants.chpPlants.first() == modifiedChpInput - modifiedSystemParticipants.evcs.first() == modifiedEvCSInput + modifiedSystemParticipants.evcs.first() == modifiedEvcsInput modifiedSystemParticipants.evs.first() == modifiedEvInput modifiedSystemParticipants.fixedFeedIns.first() == modifiedFixedFeedInInput modifiedSystemParticipants.heatPumps.first() == modifiedHpInput diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy index d27e95008..65dd93c14 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy @@ -12,7 +12,7 @@ import spock.lang.Specification class EvcsInputTest extends Specification { - def "A EvCsInput copy method should work as expected"() { + def "A EvcsInput copy method should work as expected"() { given: def evcsInput = SystemParticipantTestData.evcsInput diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy index 9aee7acf6..e8f27b4df 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy @@ -13,7 +13,7 @@ import java.time.ZonedDateTime class InvalidSystemParticipantInput extends SystemParticipantInput { InvalidSystemParticipantInput(NodeInput node) { - super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC) + super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC, null) } @Override diff --git a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy index b747ca5c3..0fae3df5c 100644 --- a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy @@ -15,13 +15,16 @@ class EnergyManagementTestData { SystemParticipantTestData.pvInput.uuid } public static final String emControlStrategy = "self_optimization" + public static final UUID parentEm = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") + public static final emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", SystemParticipantTestData.operator, SystemParticipantTestData.operationTime, - emControlStrategy + emControlStrategy, + parentEm ) public static EnergyManagementUnits emptyEnergyManagementUnits = diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index 8db7f21cf..a36f165f2 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -40,6 +40,7 @@ class SystemParticipantTestData { static final OperatorInput operator = new OperatorInput( UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "TestOperator") public static final NodeInput participantNode = GridTestData.nodeA + static final UUID em = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") // general type data static final CosPhiFixed cosPhiFixed = new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}") @@ -64,6 +65,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + em, sRated, cosPhiRated ) @@ -81,6 +83,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + em, albedo, azimuth, etaConv, @@ -117,6 +120,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiP, + em, wecType, false ) @@ -170,6 +174,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, + em, chpTypeInput, thermalStorage, false @@ -196,6 +201,7 @@ class SystemParticipantTestData { operationTime, participantNode, qV, + em, bmTypeInput, false, false, @@ -221,6 +227,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + em, evTypeInput ) @@ -234,6 +241,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + em, standardLoadProfile, false, eConsAnnual, @@ -267,10 +275,10 @@ class SystemParticipantTestData { UUID.fromString("06b58276-8350-40fb-86c0-2414aa4a0452"), "test_storageInput", operator, - operationTime - , + operationTime, participantNode, cosPhiFixed, + em, storageTypeInput ) @@ -293,6 +301,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, + em, hpTypeInput ) @@ -305,6 +314,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + em, ChargingPointTypeUtils.HouseholdSocket, 4, cosPhiRated, From 46c19fb2923034a4c0659e0f2aa1bd4d648dc65a Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Fri, 15 Dec 2023 22:32:01 +0100 Subject: [PATCH 03/31] Compiles --- .../input/participant/BmInputFactory.java | 3 +- .../input/participant/ChpInputEntityData.java | 7 +- .../input/participant/ChpInputFactory.java | 3 +- .../input/participant/EvInputFactory.java | 4 +- .../input/participant/EvcsInputFactory.java | 3 +- .../participant/FixedFeedInInputFactory.java | 8 +- .../input/participant/HpInputEntityData.java | 7 +- .../input/participant/HpInputFactory.java | 4 +- .../input/participant/LoadInputFactory.java | 3 +- .../input/participant/PvInputFactory.java | 3 +- .../participant/StorageInputFactory.java | 3 +- .../SystemParticipantEntityData.java | 39 -- .../ie3/datamodel/io/source/EntitySource.java | 126 +++--- .../datamodel/io/source/RawGridSource.java | 2 +- .../io/source/ResultEntitySource.java | 83 ++-- .../io/source/SystemParticipantSource.java | 397 +++++++++--------- .../ie3/datamodel/io/source/TypeSource.java | 94 +++-- .../csv/CsvJointGridContainerSource.java | 7 +- .../models/input/container/GridContainer.java | 30 +- .../input/container/JointGridContainer.java | 9 +- .../input/container/SubGridContainer.java | 10 +- .../models/input/system/BmInput.java | 4 +- .../models/input/system/ChpInput.java | 4 +- .../models/input/system/EvInput.java | 4 +- .../models/input/system/EvcsInput.java | 8 +- .../models/input/system/FixedFeedInInput.java | 4 +- .../models/input/system/HpInput.java | 4 +- .../models/input/system/LoadInput.java | 8 +- .../models/input/system/PvInput.java | 4 +- .../models/input/system/StorageInput.java | 4 +- .../input/system/SystemParticipantInput.java | 26 +- .../utils/ContainerNodeUpdateUtil.java | 2 - .../ie3/datamodel/utils/ContainerUtils.java | 23 +- .../io/source/EntitySourceTest.groovy | 2 +- .../csv/CsvSystemParticipantSourceTest.groovy | 2 +- 35 files changed, 438 insertions(+), 506 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java index 427a2d821..3824982f0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java @@ -10,6 +10,7 @@ import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.BmInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.BmTypeInput; import edu.ie3.util.quantities.interfaces.EnergyPrice; @@ -39,9 +40,9 @@ protected BmInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final BmTypeInput typeInput = data.getTypeInput(); final boolean marketReaction = data.getBoolean(MARKET_REACTION); final boolean costControlled = data.getBoolean(COST_CONTROLLED); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java index 800102fb9..12067138f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.type.ChpTypeInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; @@ -21,10 +22,11 @@ public class ChpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, + EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, node, typeInput); + super(fieldsToAttributes, ChpInput.class, node, em, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } @@ -33,10 +35,11 @@ public ChpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, + EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, operator, node, typeInput); + super(fieldsToAttributes, ChpInput.class, operator, node, em, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java index 73b9674f2..ebe33ccf1 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; @@ -32,9 +33,9 @@ protected ChpInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new ChpInput( diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java index 7cea1d006..8d4779e0c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.EvInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.EvTypeInput; @@ -33,9 +34,10 @@ protected EvInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); + return new EvInput( uuid, id, operator, operationTime, node, qCharacteristics, em, data.getTypeInput()); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java index 83a24bbb1..aae2f8b6a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java @@ -11,6 +11,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.EvcsInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointType; @@ -53,7 +54,7 @@ protected EvcsInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - + final EmInput em = data.getEm().orElse(null); final ChargingPointType type; try { type = ChargingPointTypeUtils.parse(data.getField(TYPE)); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java index 773a7d0e6..9e379d4b0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java @@ -5,11 +5,11 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.FixedFeedInInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; @@ -17,7 +17,7 @@ import tech.units.indriya.ComparableQuantity; public class FixedFeedInInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String S_RATED = "srated"; private static final String COSPHI_RATED = "cosphirated"; @@ -33,14 +33,14 @@ protected String[] getAdditionalFields() { @Override protected FixedFeedInInput buildModel( - NodeAssetInputEntityData data, + SystemParticipantEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); final double cosPhiRated = data.getDouble(COSPHI_RATED); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java index 38eacea63..e782b40d5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.HpInput; import edu.ie3.datamodel.models.input.system.type.HpTypeInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; @@ -19,9 +20,10 @@ public class HpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, + EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, node, typeInput); + super(fieldsToAttributes, HpInput.class, node, em, typeInput); this.thermalBusInput = thermalBusInput; } @@ -29,9 +31,10 @@ public HpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, + EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, operator, node, typeInput); + super(fieldsToAttributes, HpInput.class, operator, node, em, typeInput); this.thermalBusInput = thermalBusInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java index 616effa98..774a09ec8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.HpInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; @@ -31,9 +32,10 @@ protected HpInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); + return new HpInput( uuid, id, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index 12b763abe..b77853495 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -10,6 +10,7 @@ import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.LoadInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.profile.LoadProfile; @@ -46,7 +47,6 @@ protected LoadInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { LoadProfile loadProfile; @@ -59,6 +59,7 @@ protected LoadInput buildModel( id); loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; } + final EmInput em = data.getEm().orElse(null); final boolean dsm = data.getBoolean(DSM); final ComparableQuantity eConsAnnual = data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java index 41997f445..29a3389fb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.PvInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; @@ -47,9 +48,9 @@ protected PvInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final double albedo = data.getDouble(ALBEDO); final ComparableQuantity azimuth = data.getQuantity(AZIMUTH, StandardUnits.AZIMUTH); final ComparableQuantity etaConv = diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java index 24adbec5a..d9790117d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.StorageInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; @@ -33,9 +34,9 @@ protected StorageInput buildModel( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, OperatorInput operator, OperationTime operationTime) { + final EmInput em = data.getEm().orElse(null); final StorageTypeInput typeInput = data.getTypeInput(); return new StorageInput( uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java index f65fea7b7..204b72b3c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java @@ -5,18 +5,14 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EmInput; -import edu.ie3.datamodel.utils.Try; - import java.util.Map; import java.util.Objects; import java.util.Optional; -import java.util.UUID; /** * Data used for those classes of {@link @@ -114,39 +110,4 @@ public boolean equals(Object o) { public int hashCode() { return Objects.hash(super.hashCode(), getEm()); } - - public static Try build( - NodeAssetInputEntityData nodeAssetInputEntityData, Map ems) { - - Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); - - Try, SourceException> tryEm = - Optional.ofNullable( - nodeAssetInputEntityData.getUUID(SystemParticipantInputEntityFactory.EM)) - .map( - // System participant has been given a proper UUID. This means we either... - emUuid -> - Optional.ofNullable(ems.get(emUuid)) - // ... find a matching EmInput for given UUID, thus return a success with - // the EM - .map( - emInput -> - (Try, SourceException>) - new Try.Success, SourceException>( - Optional.of(emInput))) - // ... or find no matching EmInput, returning a failure. - .orElse(new Try.Failure<>(new SourceException("")))) - // If, on the other hand, no UUID was given (column does not exist, or field is empty), - // this is totally fine - we return an "empty success" - .orElse(new Try.Success<>(Optional.empty())); - - return tryEm.map( - // if the operation was successful, transform and return to the data - optionalEm -> { - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(SystemParticipantInputEntityFactory.EM); - - return new SystemParticipantEntityData(nodeAssetInputEntityData, optionalEm.orElse(null)); - }); - } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index f505ed4b5..b3e9aaf96 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -15,7 +15,6 @@ import edu.ie3.datamodel.io.factory.input.TypedConnectorInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.*; -import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; import java.util.*; @@ -43,7 +42,7 @@ protected EntitySource(DataSource dataSource) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - protected String buildSkippingMessage( + protected static String buildSkippingMessage( String entityDesc, String entityUuid, String entityId, String missingElementsString) { return "Skipping " + entityDesc @@ -66,7 +65,7 @@ protected String buildSkippingMessage( * @param mapName name of the map used for the error message * @return either the value or an error message */ - protected String safeMapGet(Map map, String key, String mapName) { + protected static String safeMapGet(Map map, String key, String mapName) { return Optional.ofNullable(map.get(key)) .orElse( "Key '" @@ -85,7 +84,7 @@ protected String safeMapGet(Map map, String key, String mapName) * @return either an optional containing the first entity that has the provided uuid or an empty * optional if no matching entity with the provided uuid can be found */ - protected Optional findFirstEntityByUuid( + protected static Optional findFirstEntityByUuid( UUID entityUuid, Collection entities) { return entities.stream() .parallel() @@ -106,7 +105,7 @@ protected Optional findFirstEntityByUuid( * @param the type of the resulting type instance * @return a {@link Success} containing the type or a {@link Failure} if the type cannot be found */ - protected Try getAssetType( + protected static Try getAssetType( Collection types, Map fieldsToAttributes, String skippedClassString) { Optional assetType = @@ -246,6 +245,53 @@ protected Stream> nodeAssetInputE }); } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + + /** + * Returns a stream of {@link Try} entities that can be build by using {@link + * NodeAssetInputEntityData} and their corresponding factory. + * + * @param entityClass the entity class that should be build + * @param factory the factory that should be used for the building process + * @param nodes a collection of {@link NodeInput} entities that should be used to build the + * entities + * @param operators a collection of {@link OperatorInput} entities should be used to build the + * entities + * @param Type of the {@link AssetInput} to expect + * @return stream of tries of the entities that has been built by the factory + */ + public Set> buildNodeAssetEntities( + Class entityClass, + EntityFactory factory, + Collection operators, + Collection nodes) { + return nodeAssetEntityStream(entityClass, factory, operators, nodes) + .collect(Collectors.toSet()); + } + + protected Stream> nodeAssetEntityStream( + Class entityClass, + EntityFactory factory, + Collection operators, + Collection nodes) { + return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) + .map(factory::get); + } + + public Set> buildAssetInputEntities( + Class entityClass, + EntityFactory factory, + Collection operators) { + return assetInputEntityStream(entityClass, factory, operators).collect(Collectors.toSet()); + } + + protected Stream> assetInputEntityStream( + Class entityClass, + EntityFactory factory, + Collection operators) { + return assetInputEntityDataStream(entityClass, operators).map(factory::get); + } + /** * Returns a stream of optional {@link AssetInputEntityData} that can be used to build instances * of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} that @@ -263,10 +309,10 @@ protected Stream assetInputEntityDa .getSourceData(entityClass) .map( fieldsToAttributes -> - assetInputEntityDataStream(entityClass, fieldsToAttributes, operators)); + createAssetInputEntityData(entityClass, fieldsToAttributes, operators)); } - protected AssetInputEntityData assetInputEntityDataStream( + protected AssetInputEntityData createAssetInputEntityData( Class entityClass, Map fieldsToAttributes, Collection operators) { @@ -294,73 +340,21 @@ protected AssetInputEntityData assetInputEntityDataStream * fields-to-attributes map. * * @param entityClass the entity class that should be build - * @param Type of the {@link ResultEntity} to expect + * @param Type of the {@link UniqueEntity} to expect * @return stream of {@link SimpleEntityData} */ - protected Stream simpleEntityDataStream( + protected Stream simpleEntityDataStream( Class entityClass) { return dataSource .getSourceData(entityClass) .map(fieldsToAttributes -> new SimpleEntityData(fieldsToAttributes, entityClass)); } - protected Stream> assetInputEntityStream( - Class entityClass, - EntityFactory factory, - Collection operators) { - return assetInputEntityDataStream(entityClass, operators).map(factory::get); - } - - protected Stream> nodeAssetEntityStream( - Class entityClass, - EntityFactory factory, - Collection nodes, - Collection operators) { - return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) - .map(factory::get); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - /** - * Returns a stream of {@link Try} entities that can be build by using {@link - * NodeAssetInputEntityData} and their corresponding factory. - * - * @param entityClass the entity class that should be build - * @param factory the factory that should be used for the building process - * @param nodes a collection of {@link NodeInput} entities that should be used to build the - * entities - * @param operators a collection of {@link OperatorInput} entities should be used to build the - * entities - * @param Type of the {@link AssetInput} to expect - * @return stream of tries of the entities that has been built by the factory - */ - public Set> buildNodeAssetEntities( - Class entityClass, - EntityFactory factory, - Collection nodes, - Collection operators) { - return nodeAssetEntityStream(entityClass, factory, nodes, operators) - .collect(Collectors.toSet()); - } - - public Set> buildAssetInputEntities( - Class entityClass, - EntityFactory factory, - Collection operators) { - return assetInputEntityStream(entityClass, factory, operators).collect(Collectors.toSet()); - } - - @SuppressWarnings("unchecked") - public Set> buildEntities( - Class entityClass, EntityFactory factory) { - return dataSource - .getSourceData(entityClass) - .map( - fieldsToAttributes -> { - SimpleEntityData data = new SimpleEntityData(fieldsToAttributes, entityClass); - return (Try) factory.get(data); - }) + protected static Set unpack( + Stream> inputStream, Class entityClass) throws SourceException { + return Try.scanStream(inputStream, entityClass.getSimpleName()) + .transformF(SourceException::new) + .getOrThrow() .collect(Collectors.toSet()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index ba90ea3ff..283a635f5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -403,7 +403,7 @@ public Set getMeasurementUnits( Set nodes, Set operators) throws SourceException { return Try.scanCollection( buildNodeAssetEntities( - MeasurementUnitInput.class, measurementUnitInputFactory, nodes, operators), + MeasurementUnitInput.class, measurementUnitInputFactory, operators, nodes), MeasurementUnitInput.class) .transformF(SourceException::new) .getOrThrow(); diff --git a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java index 87d9fcc21..3f8029158 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.source; +import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.SimpleEntityFactory; import edu.ie3.datamodel.io.factory.result.*; import edu.ie3.datamodel.models.result.NodeResult; @@ -16,9 +17,7 @@ import edu.ie3.datamodel.models.result.system.*; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult; -import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; /** * Interface that provides the capability to build entities of type {@link ResultEntity} container @@ -37,7 +36,7 @@ public class ResultEntitySource extends EntitySource { private final FlexOptionsResultFactory flexOptionsResultFactory; public ResultEntitySource(DataSource dataSource) { - this.dataSource = dataSource; + super(dataSource); // init factories this.systemParticipantResultFactory = new SystemParticipantResultFactory(); @@ -49,7 +48,7 @@ public ResultEntitySource(DataSource dataSource) { } public ResultEntitySource(DataSource dataSource, String dtfPattern) { - this.dataSource = dataSource; + super(dataSource); // init factories this.systemParticipantResultFactory = new SystemParticipantResultFactory(dtfPattern); @@ -69,7 +68,7 @@ public ResultEntitySource(DataSource dataSource, String dtfPattern) { * * @return a set of object and uuid unique {@link NodeResult} entities */ - public Set getNodeResults() { + public Set getNodeResults() throws SourceException { return getResultEntities(NodeResult.class, nodeResultFactory); } @@ -83,7 +82,7 @@ public Set getNodeResults() { * * @return a set of object and uuid unique {@link SwitchResult} entities */ - public Set getSwitchResults() { + public Set getSwitchResults() throws SourceException { return getResultEntities(SwitchResult.class, switchResultFactory); } @@ -96,7 +95,7 @@ public Set getSwitchResults() { * * @return a set of object and uuid unique {@link LineResult} entities */ - public Set getLineResults() { + public Set getLineResults() throws SourceException { return getResultEntities(LineResult.class, connectorResultFactory); } @@ -110,7 +109,7 @@ public Set getLineResults() { * * @return a set of object and uuid unique {@link Transformer2WResult} entities */ - public Set getTransformer2WResultResults() { + public Set getTransformer2WResultResults() throws SourceException { return getResultEntities(Transformer2WResult.class, connectorResultFactory); } @@ -124,7 +123,7 @@ public Set getTransformer2WResultResults() { * * @return a set of object and uuid unique {@link Transformer3WResult} entities */ - public Set getTransformer3WResultResults() { + public Set getTransformer3WResultResults() throws SourceException { return getResultEntities(Transformer3WResult.class, connectorResultFactory); } @@ -138,7 +137,7 @@ public Set getTransformer3WResultResults() { * * @return a set of object and uuid unique {@link FlexOptionsResult} entities */ - public Set getFlexOptionsResults() { + public Set getFlexOptionsResults() throws SourceException { return getResultEntities(FlexOptionsResult.class, flexOptionsResultFactory); } @@ -151,7 +150,7 @@ public Set getFlexOptionsResults() { * * @return a set of object and uuid unique {@link LoadResult} entities */ - public Set getLoadResults() { + public Set getLoadResults() throws SourceException { return getResultEntities(LoadResult.class, systemParticipantResultFactory); } @@ -164,7 +163,7 @@ public Set getLoadResults() { * * @return a set of object and uuid unique {@link PvResult} entities */ - public Set getPvResults() { + public Set getPvResults() throws SourceException { return getResultEntities(PvResult.class, systemParticipantResultFactory); } @@ -178,7 +177,7 @@ public Set getPvResults() { * * @return a set of object and uuid unique {@link FixedFeedInResult} entities */ - public Set getFixedFeedInResults() { + public Set getFixedFeedInResults() throws SourceException { return getResultEntities(FixedFeedInResult.class, systemParticipantResultFactory); } @@ -191,7 +190,7 @@ public Set getFixedFeedInResults() { * * @return a set of object and uuid unique {@link BmResult} entities */ - public Set getBmResults() { + public Set getBmResults() throws SourceException { return getResultEntities(BmResult.class, systemParticipantResultFactory); } @@ -204,7 +203,7 @@ public Set getBmResults() { * * @return a set of object and uuid unique {@link ChpResult} entities */ - public Set getChpResults() { + public Set getChpResults() throws SourceException { return getResultEntities(ChpResult.class, systemParticipantResultFactory); } @@ -217,7 +216,7 @@ public Set getChpResults() { * * @return a set of object and uuid unique {@link WecResult} entities */ - public Set getWecResults() { + public Set getWecResults() throws SourceException { return getResultEntities(WecResult.class, systemParticipantResultFactory); } @@ -231,7 +230,7 @@ public Set getWecResults() { * * @return a set of object and uuid unique {@link StorageResult} entities */ - public Set getStorageResults() { + public Set getStorageResults() throws SourceException { return getResultEntities(StorageResult.class, systemParticipantResultFactory); } @@ -244,7 +243,7 @@ public Set getStorageResults() { * * @return a set of object and uuid unique {@link EvcsResult} entities */ - public Set getEvcsResults() { + public Set getEvcsResults() throws SourceException { return getResultEntities(EvcsResult.class, systemParticipantResultFactory); } @@ -257,7 +256,7 @@ public Set getEvcsResults() { * * @return a set of object and uuid unique {@link EvResult} entities */ - public Set getEvResults() { + public Set getEvResults() throws SourceException { return getResultEntities(EvResult.class, systemParticipantResultFactory); } @@ -270,7 +269,7 @@ public Set getEvResults() { * * @return a set of object and uuid unique {@link HpResult} entities */ - public Set getHpResults() { + public Set getHpResults() throws SourceException { return getResultEntities(HpResult.class, systemParticipantResultFactory); } @@ -284,7 +283,7 @@ public Set getHpResults() { * * @return a set of object and uuid unique {@link CylindricalStorageResult} entities */ - public Set getCylindricalStorageResult() { + public Set getCylindricalStorageResult() throws SourceException { return getResultEntities(CylindricalStorageResult.class, thermalResultFactory); } @@ -298,7 +297,7 @@ public Set getCylindricalStorageResult() { * * @return a set of object and uuid unique {@link ThermalHouseResult} entities */ - public Set getThermalHouseResults() { + public Set getThermalHouseResults() throws SourceException { return getResultEntities(ThermalHouseResult.class, thermalResultFactory); } @@ -311,32 +310,28 @@ public Set getThermalHouseResults() { * * @return a set of object and uuid unique {@link EmResult} entities */ - public Set getEmResults() { + public Set getEmResults() throws SourceException { return getResultEntities(EmResult.class, systemParticipantResultFactory); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - private Set getResultEntities( - Class entityClass, SimpleEntityFactory factory) { - return simpleEntityDataStream(entityClass) - .map( - entityData -> - factory - .get(entityData) - .getData() - .flatMap(loadResult -> cast(entityClass, loadResult))) - .flatMap(Optional::stream) - .collect(Collectors.toSet()); - } - private Optional cast( - Class entityClass, ResultEntity resultEntity) { - if (resultEntity.getClass().equals(entityClass)) { - // safe here as a) type is checked and b) csv data stream already filters non-fitting input - // data - return Optional.of(entityClass.cast(resultEntity)); - } else { - return Optional.empty(); - } + /** + * Build and cast entities to the correct type, since result factories outputs result entities of + * some general type. + * + * @param entityClass + * @param factory + * @return + * @param + */ + @SuppressWarnings("unchecked") + private Set getResultEntities( + Class entityClass, SimpleEntityFactory factory) + throws SourceException { + return unpack( + simpleEntityDataStream(entityClass) + .map(entityData -> factory.get(entityData).map(data -> (T) data)), + entityClass); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 76e1713a8..c6d7acb86 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -5,10 +5,8 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.SystemParticipantsException; -import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.*; import edu.ie3.datamodel.models.input.NodeInput; @@ -19,10 +17,9 @@ import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.*; +import edu.ie3.datamodel.utils.Try.Failure; +import edu.ie3.datamodel.utils.Try.Success; import java.util.*; -import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -117,27 +114,29 @@ public SystemParticipants getSystemParticipants() throws SourceException { /// go on with the nodes Set nodes = rawGridSource.getNodes(operators); Try, SourceException> fixedFeedInInputs = - Try.of(() -> getFixedFeedIns(nodes, operators), SourceException.class); + Try.of(() -> getFixedFeedIns(operators, nodes, emUnits), SourceException.class); Try, SourceException> pvInputs = - Try.of(() -> getPvPlants(nodes, operators), SourceException.class); + Try.of(() -> getPvPlants(operators, nodes, emUnits), SourceException.class); Try, SourceException> loads = - Try.of(() -> getLoads(nodes, operators), SourceException.class); + Try.of(() -> getLoads(operators, nodes, emUnits), SourceException.class); Try, SourceException> bmInputs = - Try.of(() -> getBmPlants(nodes, operators, bmTypes), SourceException.class); + Try.of(() -> getBmPlants(operators, nodes, emUnits, bmTypes), SourceException.class); Try, SourceException> storages = - Try.of(() -> getStorages(nodes, operators, storageTypes), SourceException.class); + Try.of(() -> getStorages(operators, nodes, emUnits, storageTypes), SourceException.class); Try, SourceException> wecInputs = - Try.of(() -> getWecPlants(nodes, operators, wecTypes), SourceException.class); + Try.of(() -> getWecPlants(operators, nodes, emUnits, wecTypes), SourceException.class); Try, SourceException> evs = - Try.of(() -> getEvs(nodes, operators, evTypes), SourceException.class); + Try.of(() -> getEvs(operators, nodes, emUnits, evTypes), SourceException.class); Try, SourceException> evcs = - Try.of(() -> getEvcs(nodes, operators), SourceException.class); + Try.of(() -> getEvcs(operators, nodes, emUnits), SourceException.class); Try, SourceException> chpInputs = Try.of( - () -> getChpPlants(nodes, operators, chpTypes, thermalBuses, thermalStorages), + () -> getChpPlants(operators, nodes, emUnits, chpTypes, thermalBuses, thermalStorages), SourceException.class); Try, SourceException> hpInputs = - Try.of(() -> getHeatPumps(nodes, operators, hpTypes, thermalBuses), SourceException.class); + Try.of( + () -> getHeatPumps(operators, nodes, emUnits, hpTypes, thermalBuses), + SourceException.class); List exceptions = Try.getExceptions( @@ -187,7 +186,8 @@ public SystemParticipants getSystemParticipants() throws SourceException { */ public Set getFixedFeedIns() throws SourceException { Set operators = typeSource.getOperators(); - return getFixedFeedIns(rawGridSource.getNodes(operators), operators); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getFixedFeedIns(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -209,14 +209,13 @@ public Set getFixedFeedIns() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link FixedFeedInInput} entities */ - public Set getFixedFeedIns(Set nodes, Set operators) + public Set getFixedFeedIns( + Set operators, Set nodes, Map emUnits) throws SourceException { - return Try.scanCollection( - buildNodeAssetEntities( - FixedFeedInInput.class, fixedFeedInInputFactory, nodes, operators), - FixedFeedInInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildSystemParticipantEntityData(FixedFeedInInput.class, operators, nodes, emUnits) + .map(fixedFeedInInputFactory::get), + FixedFeedInInput.class); } /** @@ -230,7 +229,8 @@ public Set getFixedFeedIns(Set nodes, Set getPvPlants() throws SourceException { Set operators = typeSource.getOperators(); - return getPvPlants(rawGridSource.getNodes(operators), operators); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getPvPlants(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -252,12 +252,13 @@ public Set getPvPlants() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link PvInput} entities */ - public Set getPvPlants(Set nodes, Set operators) + public Set getPvPlants( + Set operators, Set nodes, Map emUnits) throws SourceException { - return Try.scanCollection( - buildNodeAssetEntities(PvInput.class, pvInputFactory, nodes, operators), PvInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildSystemParticipantEntityData(PvInput.class, operators, nodes, emUnits) + .map(pvInputFactory::get), + PvInput.class); } /** @@ -271,7 +272,8 @@ public Set getPvPlants(Set nodes, Set operato */ public Set getLoads() throws SourceException { Set operators = typeSource.getOperators(); - return getLoads(rawGridSource.getNodes(operators), operators); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getLoads(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -293,13 +295,13 @@ public Set getLoads() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link LoadInput} entities */ - public Set getLoads(Set nodes, Set operators) + public Set getLoads( + Set operators, Set nodes, Map emUnits) throws SourceException { - return Try.scanCollection( - buildNodeAssetEntities(LoadInput.class, loadInputFactory, nodes, operators), - LoadInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildSystemParticipantEntityData(LoadInput.class, operators, nodes, emUnits) + .map(loadInputFactory::get), + LoadInput.class); } /** @@ -313,7 +315,8 @@ public Set getLoads(Set nodes, Set operator */ public Set getEvcs() throws SourceException { Set operators = typeSource.getOperators(); - return getEvcs(rawGridSource.getNodes(operators), operators); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getEvcs(operators, rawGridSource.getNodes(operators), emUnits); } /** @@ -335,13 +338,13 @@ public Set getEvcs() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link EvcsInput} entities */ - public Set getEvcs(Set nodes, Set operators) + public Set getEvcs( + Set operators, Set nodes, Map emUnits) throws SourceException { - return Try.scanCollection( - buildNodeAssetEntities(EvcsInput.class, evcsInputFactory, nodes, operators), - EvcsInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildSystemParticipantEntityData(EvcsInput.class, operators, nodes, emUnits) + .map(evcsInputFactory::get), + EvcsInput.class); } /** @@ -355,7 +358,9 @@ public Set getEvcs(Set nodes, Set operators */ public Set getBmPlants() throws SourceException { Set operators = typeSource.getOperators(); - return getBmPlants(rawGridSource.getNodes(operators), operators, typeSource.getBmTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getBmPlants( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getBmTypes()); } /** @@ -379,14 +384,15 @@ public Set getBmPlants() throws SourceException { * @return a set of object and uuid unique {@link BmInput} entities */ public Set getBmPlants( - Set nodes, Set operators, Set types) + Set operators, + Set nodes, + Map emUnits, + Set types) throws SourceException { - return Try.scanCollection( - buildTypedSystemParticipantEntities( - BmInput.class, bmInputFactory, nodes, operators, types), - BmInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, emUnits, types) + .map(bmInputFactory::get), + BmInput.class); } /** @@ -401,7 +407,9 @@ public Set getBmPlants( */ public Set getStorages() throws SourceException { Set operators = typeSource.getOperators(); - return getStorages(rawGridSource.getNodes(operators), operators, typeSource.getStorageTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getStorages( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getStorageTypes()); } /** @@ -425,14 +433,15 @@ public Set getStorages() throws SourceException { * @return a set of object and uuid unique {@link StorageInput} entities */ public Set getStorages( - Set nodes, Set operators, Set types) + Set operators, + Set nodes, + Map emUnits, + Set types) throws SourceException { - return Try.scanCollection( - buildTypedSystemParticipantEntities( - StorageInput.class, storageInputFactory, nodes, operators, types), - StorageInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, emUnits, types) + .map(storageInputFactory::get), + StorageInput.class); } /** @@ -446,7 +455,9 @@ public Set getStorages( */ public Set getWecPlants() throws SourceException { Set operators = typeSource.getOperators(); - return getWecPlants(rawGridSource.getNodes(operators), operators, typeSource.getWecTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getWecPlants( + operators, rawGridSource.getNodes(operators), emUnits, typeSource.getWecTypes()); } /** @@ -470,14 +481,15 @@ public Set getWecPlants() throws SourceException { * @return a set of object and uuid unique {@link WecInput} entities */ public Set getWecPlants( - Set nodes, Set operators, Set types) + Set operators, + Set nodes, + Map emUnits, + Set types) throws SourceException { - return Try.scanCollection( - buildTypedSystemParticipantEntities( - WecInput.class, wecInputFactory, nodes, operators, types), - WecInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, emUnits, types) + .map(wecInputFactory::get), + WecInput.class); } /** @@ -491,7 +503,8 @@ public Set getWecPlants( */ public Set getEvs() throws SourceException { Set operators = typeSource.getOperators(); - return getEvs(rawGridSource.getNodes(operators), operators, typeSource.getEvTypes()); + Map emUnits = energyManagementSource.getEmUnits(operators); + return getEvs(operators, rawGridSource.getNodes(operators), emUnits, typeSource.getEvTypes()); } /** @@ -515,22 +528,25 @@ public Set getEvs() throws SourceException { * @return a set of object and uuid unique {@link EvInput} entities */ public Set getEvs( - Set nodes, Set operators, Set types) + Set operators, + Set nodes, + Map emUnits, + Set types) throws SourceException { - return Try.scanCollection( - buildTypedSystemParticipantEntities( - EvInput.class, evInputFactory, nodes, operators, types), - EvInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, emUnits, types) + .map(evInputFactory::get), + EvInput.class); } public Set getChpPlants() throws SourceException { Set operators = typeSource.getOperators(); + Map emUnits = energyManagementSource.getEmUnits(operators); Set thermalBuses = thermalSource.getThermalBuses(operators); return getChpPlants( - rawGridSource.getNodes(operators), operators, + rawGridSource.getNodes(operators), + emUnits, typeSource.getChpTypes(), thermalBuses, thermalSource.getThermalStorages(operators, thermalBuses)); @@ -547,25 +563,30 @@ public Set getChpPlants() throws SourceException { * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} */ public Set getChpPlants( - Set nodes, Set operators, + Set nodes, + Map emUnits, Set types, Set thermalBuses, Set thermalStorages) throws SourceException { - return Try.scanCollection( - chpInputStream(chpInputFactory, nodes, operators, types, thermalBuses, thermalStorages) - .collect(Collectors.toSet()), - ChpInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildChpEntityData( + buildTypedSystemParticipantEntityData( + ChpInput.class, operators, nodes, emUnits, types), + thermalStorages, + thermalBuses) + .map(chpInputFactory::get), + ChpInput.class); } public Set getHeatPumps() throws SourceException { Set operators = typeSource.getOperators(); + Map emUnits = energyManagementSource.getEmUnits(operators); return getHeatPumps( - rawGridSource.getNodes(operators), operators, + rawGridSource.getNodes(operators), + emUnits, typeSource.getHpTypes(), thermalSource.getThermalBuses()); } @@ -581,69 +602,24 @@ public Set getHeatPumps() throws SourceException { * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} */ public Set getHeatPumps( - Set nodes, Set operators, + Set nodes, + Map emUnits, Set types, Set thermalBuses) throws SourceException { - return Try.scanCollection( - hpInputStream(hpInputFactory, nodes, operators, types, thermalBuses) - .collect(Collectors.toSet()), - HpInput.class) - .transformF(SourceException::new) - .getOrThrow(); - } - - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - /** - * Constructs a stream of {@link SystemParticipantInput} entities wrapped in {@link Try}'s. - * - * @param entityClass the class of the entities that should be built - * @param factory the corresponding factory that is capable of building this entities - * @param nodes the nodes that should be considered for these entities - * @param operators the operators that should be considered for these entities - * @param types the types that should be considered for these entities - * @param the type of the resulting entity - * @param the type of the type model of the resulting entity - * @return a stream of tries being either empty or holding an instance of a {@link - * SystemParticipantInput} of the requested entity class - */ - private - Set> buildTypedSystemParticipantEntities( - Class entityClass, - EntityFactory> factory, - Collection nodes, - Collection operators, - Collection types) { - return buildTypedSystemParticipantEntityData( - nodeAssetInputEntityDataStream( - assetInputEntityDataStream(entityClass, operators), nodes), - types) - .map(factory::get) - .collect(Collectors.toSet()); + return unpack( + buildHpEntityData( + buildTypedSystemParticipantEntityData( + HpInput.class, operators, nodes, emUnits, types), + thermalBuses) + .map(hpInputFactory::get), + HpInput.class); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - private Stream> chpInputStream( - ChpInputFactory factory, - Collection nodes, - Collection operators, - Collection types, - Collection thermalBuses, - Collection thermalStorages) { - return buildChpEntityData( - buildTypedSystemParticipantEntityData( - nodeAssetInputEntityDataStream( - assetInputEntityDataStream(ChpInput.class, operators), nodes), - types), - thermalStorages, - thermalBuses) - .map(factory::get); - } - - private Stream> buildChpEntityData( + private static Stream> buildChpEntityData( Stream, SourceException>> typedEntityDataStream, Collection thermalStorages, @@ -655,10 +631,10 @@ private Stream> buildChpEntityData( typedEntityDataOpt -> typedEntityDataOpt.flatMap( typedEntityData -> - buildChpEntityData(typedEntityData, thermalStorages, thermalBuses))); + createChpEntityData(typedEntityData, thermalStorages, thermalBuses))); } - private Try buildChpEntityData( + private static Try createChpEntityData( SystemParticipantTypedEntityData typedEntityData, Collection thermalStorages, Collection thermalBuses) { @@ -712,28 +688,12 @@ private Try buildChpEntityData( fieldsToAttributes, typedEntityData.getOperatorInput(), typedEntityData.getNode(), + typedEntityData.getEm().orElse(null), typedEntityData.getTypeInput(), thermalBus.get(), thermalStorage.get())); } - private Stream> hpInputStream( - HpInputFactory factory, - Collection nodes, - Collection operators, - Collection types, - Collection thermalBuses) { - return buildHpEntityData( - buildTypedSystemParticipantEntityData( - buildSystemParticipantEntityData( - nodeAssetInputEntityDataStream( - assetInputEntityDataStream(HpInput.class, operators), nodes), - ems), - types), - thermalBuses) - .map(factory::get); - } - /** * Enriches a given stream of {@link SystemParticipantTypedEntityData} tries with a type of {@link * ThermalBusInput} based on the provided collection of buses and the fields to values mapping @@ -744,7 +704,7 @@ private Stream> hpInputStream( * HpInputEntityData} * @return stream of tries of {@link HpInputEntityData} instances */ - private Stream> buildHpEntityData( + private static Stream> buildHpEntityData( Stream, SourceException>> typedEntityDataStream, Collection thermalBuses) { @@ -754,16 +714,16 @@ private Stream> buildHpEntityData( .map( typedEntityDataOpt -> typedEntityDataOpt.flatMap( - typedEntityData -> buildHpEntityData(typedEntityData, thermalBuses))); + typedEntityData -> createHpEntityData(typedEntityData, thermalBuses))); } - protected Try buildHpEntityData( + private static Try createHpEntityData( SystemParticipantTypedEntityData typedEntityData, Collection thermalBuses) { // get the raw data Map fieldsToAttributes = typedEntityData.getFieldsToValues(); - // get the thermal bus input for this chp unit and try to built the entity data + // get the thermal bus input for this chp unit and try to build the entity data Optional hpInputEntityDataOpt = Optional.ofNullable(fieldsToAttributes.get(THERMAL_BUS)) .flatMap( @@ -783,6 +743,7 @@ protected Try buildHpEntityData( fieldsToAttributes, typedEntityData.getOperatorInput(), typedEntityData.getNode(), + typedEntityData.getEm().orElse(null), typedEntityData.getTypeInput(), thermalBus); })); @@ -802,6 +763,28 @@ protected Try buildHpEntityData( return new Success<>(hpInputEntityDataOpt.get()); } + /** + * Constructs a stream of {@link SystemParticipantTypedEntityData} wrapped in {@link Try}'s. + * + * @param entityClass the class of the entities that should be built + * @param nodes the nodes that should be considered for these entities + * @param operators the operators that should be considered for these entities + * @param types the types that should be considered for these entities + * @param the type of the type model of the resulting entity + * @return a stream of tries holding an instance of a {@link SystemParticipantTypedEntityData} + */ + private + Stream, SourceException>> + buildTypedSystemParticipantEntityData( + Class entityClass, + Collection operators, + Collection nodes, + Map emUnits, + Collection types) { + return buildTypedSystemParticipantEntityData( + buildSystemParticipantEntityData(entityClass, operators, nodes, emUnits), types); + } + /** * Enriches a given stream of {@link SystemParticipantEntityData} {@link Try} objects with a type * of {@link SystemParticipantTypeInput} based on the provided collection of types and the fields @@ -816,7 +799,7 @@ protected Try buildHpEntityData( * {@link SystemParticipantTypedEntityData} * @return a stream of tries of {@link SystemParticipantTypedEntityData} instances */ - private + private static Stream, SourceException>> buildTypedSystemParticipantEntityData( Stream> @@ -828,59 +811,99 @@ protected Try buildHpEntityData( participantEntityDataTry -> participantEntityDataTry.flatMap( participantEntityData -> - buildTypedSystemParticipantEntityData(participantEntityData, types))); + createTypedSystemParticipantEntityData(participantEntityData, types))); } - private + private static Try, SourceException> - buildTypedSystemParticipantEntityData( - SystemParticipantEntityData systemParticipantEntityDataStream, Collection types) { + createTypedSystemParticipantEntityData( + SystemParticipantEntityData systemParticipantEntityData, Collection types) { return getAssetType( types, - systemParticipantEntityDataStream.getFieldsToValues(), - systemParticipantEntityDataStream.getClass().getSimpleName()) + systemParticipantEntityData.getFieldsToValues(), + systemParticipantEntityData.getClass().getSimpleName()) .map( // if the operation was successful, transform and return to the data assetType -> { Map fieldsToAttributes = - systemParticipantEntityDataStream.getFieldsToValues(); + systemParticipantEntityData.getFieldsToValues(); // remove fields that are passed as objects to constructor fieldsToAttributes.keySet().remove(TYPE); - return new SystemParticipantTypedEntityData<>( - fieldsToAttributes, - systemParticipantEntityDataStream.getTargetClass(), - systemParticipantEntityDataStream.getOperatorInput(), - systemParticipantEntityDataStream.getNode(), - systemParticipantEntityDataStream.getEm().orElse(null), - assetType); + return new SystemParticipantTypedEntityData<>(systemParticipantEntityData, assetType); }); } + private + Stream> buildSystemParticipantEntityData( + Class entityClass, + Collection operators, + Collection nodes, + Map emUnits) { + return buildSystemParticipantEntityData( + nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes), + emUnits); + } + /** * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of - * {@link EmInput} based on the provided collection of EMs and the fields to - * values mapping that inside the already provided {@link NodeAssetInputEntityData} instance. + * {@link EmInput} based on the provided collection of EMs and the fields to values mapping that + * inside the already provided {@link NodeAssetInputEntityData} instance. * * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} {@link * Try} objects - * @param ems the energy management units that should be used for enrichment and to build {@link - * SystemParticipantEntityData} from + * @param emUnits the energy management units that should be used for enrichment and to build + * {@link SystemParticipantEntityData} from * @return a stream of tries of {@link SystemParticipantEntityData} instances */ - private - Stream> - buildSystemParticipantEntityData( - Stream> nodeAssetEntityDataStream, - Map ems) { + private static Stream> + buildSystemParticipantEntityData( + Stream> nodeAssetEntityDataStream, + Map emUnits) { return nodeAssetEntityDataStream .parallel() .map( nodeAssetInputEntityDataOpt -> nodeAssetInputEntityDataOpt.flatMap( nodeAssetInputEntityData -> - SystemParticipantEntityData.build(nodeAssetInputEntityData, ems))); + createSystemParticipantEntityData(nodeAssetInputEntityData, emUnits))); + } + + private static Try + createSystemParticipantEntityData( + NodeAssetInputEntityData nodeAssetInputEntityData, Map emUnits) { + + Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); + + Try, SourceException> tryEm = + Optional.ofNullable( + nodeAssetInputEntityData.getUUID(SystemParticipantInputEntityFactory.EM)) + .map( + // System participant has given a proper UUID for EM. In case of success, we wrap in + // Optional + emUuid -> getEntity(emUuid, emUnits).map(Optional::of)) + // No UUID was given (column does not exist, or field is empty), + // this is totally fine - we return an "empty success" + .orElse(new Try.Success<>(Optional.empty())); + + return tryEm.map( + // if the operation was successful, transform and return to the data + optionalEm -> { + // remove fields that are passed as objects to constructor + fieldsToAttributes.keySet().remove(SystemParticipantInputEntityFactory.EM); + + return new SystemParticipantEntityData(nodeAssetInputEntityData, optionalEm.orElse(null)); + }); } + private static Try getEntity(UUID uuid, Map entityMap) { + return Optional.ofNullable(entityMap.get(uuid)) + // We either find a matching entity for given UUID, thus return a success + .map(entity -> (Try) new Try.Success(entity)) + // ... or find no matching entity, returning a failure. + .orElse( + new Try.Failure<>( + new SourceException("Entity with uuid " + uuid + " was not provided."))); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 501dfac15..9db4d0f22 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -5,12 +5,17 @@ */ package edu.ie3.datamodel.io.source; +import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.input.OperatorInputFactory; import edu.ie3.datamodel.io.factory.typeinput.LineTypeInputFactory; import edu.ie3.datamodel.io.factory.typeinput.SystemParticipantTypeInputFactory; import edu.ie3.datamodel.io.factory.typeinput.Transformer2WTypeInputFactory; import edu.ie3.datamodel.io.factory.typeinput.Transformer3WTypeInputFactory; +import edu.ie3.datamodel.models.input.AssetTypeInput; +import edu.ie3.datamodel.models.input.InputEntity; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; @@ -18,6 +23,7 @@ import edu.ie3.datamodel.models.input.system.type.*; import edu.ie3.datamodel.utils.Try; import java.util.Set; +import java.util.stream.Stream; /** * Interface that provides the capability to build entities of type {@link @@ -55,11 +61,10 @@ public TypeSource(DataSource dataSource) { * @return a set of object and uuid unique {@link Transformer2WTypeInput} entities */ public Set getTransformer2WTypes() throws SourceException { - return Try.scanCollection( - buildEntities(Transformer2WTypeInput.class, transformer2WTypeInputFactory), - Transformer2WTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + simpleEntityDataStream(Transformer2WTypeInput.class) + .map(transformer2WTypeInputFactory::get), + Transformer2WTypeInput.class); } /** @@ -71,10 +76,9 @@ public Set getTransformer2WTypes() throws SourceExceptio * @return a set of object and uuid unique {@link OperatorInput} entities */ public Set getOperators() throws SourceException { - return Try.scanCollection( - buildEntities(OperatorInput.class, operatorInputFactory), OperatorInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + simpleEntityDataStream(OperatorInput.class).map(operatorInputFactory::get), + OperatorInput.class); } /** @@ -86,10 +90,9 @@ public Set getOperators() throws SourceException { * @return a set of object and uuid unique {@link LineTypeInput} entities */ public Set getLineTypes() throws SourceException { - return Try.scanCollection( - buildEntities(LineTypeInput.class, lineTypeInputFactory), LineTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + simpleEntityDataStream(LineTypeInput.class).map(lineTypeInputFactory::get), + LineTypeInput.class); } /** @@ -102,11 +105,10 @@ public Set getLineTypes() throws SourceException { * @return a set of object and uuid unique {@link Transformer3WTypeInput} entities */ public Set getTransformer3WTypes() throws SourceException { - return Try.scanCollection( - buildEntities(Transformer3WTypeInput.class, transformer3WTypeInputFactory), - Transformer3WTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + simpleEntityDataStream(Transformer3WTypeInput.class) + .map(transformer3WTypeInputFactory::get), + Transformer3WTypeInput.class); } /** @@ -118,10 +120,8 @@ public Set getTransformer3WTypes() throws SourceExceptio * @return a set of object and uuid unique {@link BmTypeInput} entities */ public Set getBmTypes() throws SourceException { - return Try.scanCollection( - buildEntities(BmTypeInput.class, systemParticipantTypeInputFactory), BmTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(BmTypeInput.class, systemParticipantTypeInputFactory), BmTypeInput.class); } /** @@ -133,11 +133,8 @@ public Set getBmTypes() throws SourceException { * @return a set of object and uuid unique {@link ChpTypeInput} entities */ public Set getChpTypes() throws SourceException { - return Try.scanCollection( - buildEntities(ChpTypeInput.class, systemParticipantTypeInputFactory), - ChpTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(ChpTypeInput.class, systemParticipantTypeInputFactory), ChpTypeInput.class); } /** @@ -149,10 +146,8 @@ public Set getChpTypes() throws SourceException { * @return a set of object and uuid unique {@link HpTypeInput} entities */ public Set getHpTypes() throws SourceException { - return Try.scanCollection( - buildEntities(HpTypeInput.class, systemParticipantTypeInputFactory), HpTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(HpTypeInput.class, systemParticipantTypeInputFactory), HpTypeInput.class); } /** @@ -164,11 +159,9 @@ public Set getHpTypes() throws SourceException { * @return a set of object and uuid unique {@link StorageTypeInput} entities */ public Set getStorageTypes() throws SourceException { - return Try.scanCollection( - buildEntities(StorageTypeInput.class, systemParticipantTypeInputFactory), - StorageTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(StorageTypeInput.class, systemParticipantTypeInputFactory), + StorageTypeInput.class); } /** @@ -180,11 +173,8 @@ public Set getStorageTypes() throws SourceException { * @return a set of object and uuid unique {@link WecTypeInput} entities */ public Set getWecTypes() throws SourceException { - return Try.scanCollection( - buildEntities(WecTypeInput.class, systemParticipantTypeInputFactory), - WecTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(WecTypeInput.class, systemParticipantTypeInputFactory), WecTypeInput.class); } /** @@ -196,9 +186,23 @@ public Set getWecTypes() throws SourceException { * @return a set of object and uuid unique {@link EvTypeInput} entities */ public Set getEvTypes() throws SourceException { - return Try.scanCollection( - buildEntities(EvTypeInput.class, systemParticipantTypeInputFactory), EvTypeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpack( + buildEntities(EvTypeInput.class, systemParticipantTypeInputFactory), EvTypeInput.class); + } + + /** + * Build and cast entities to the correct type, since {@link SystemParticipantTypeInputFactory} + * outputs {@link SystemParticipantTypeInput} of general type. + * + * @param entityClass + * @param factory + * @return + * @param + */ + @SuppressWarnings("unchecked") + private Stream> buildEntities( + Class entityClass, EntityFactory factory) { + return simpleEntityDataStream(entityClass) + .map(data -> (Try) factory.get(data)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java index 708d546e6..f2e113816 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java @@ -45,9 +45,9 @@ public static JointGridContainer read( TypeSource typeSource = new TypeSource(dataSource); RawGridSource rawGridSource = new RawGridSource(typeSource, dataSource); ThermalSource thermalSource = new ThermalSource(typeSource, dataSource); - SystemParticipantSource systemParticipantSource = - new SystemParticipantSource(typeSource, thermalSource, rawGridSource, dataSource); EnergyManagementSource emSource = new EnergyManagementSource(typeSource, dataSource); + SystemParticipantSource systemParticipantSource = + new SystemParticipantSource(typeSource, thermalSource, rawGridSource, emSource, dataSource); GraphicSource graphicSource = new GraphicSource(typeSource, rawGridSource, dataSource); /* Loading models */ @@ -55,8 +55,6 @@ public static JointGridContainer read( Try.of(rawGridSource::getGridData, SourceException.class); Try systemParticipants = Try.of(systemParticipantSource::getSystemParticipants, SourceException.class); - Try emUnits = - Try.of(emSource::getEmUnits, SourceException.class); Try graphicElements = Try.of(graphicSource::getGraphicElements, SourceException.class); @@ -73,7 +71,6 @@ public static JointGridContainer read( gridName, rawGridElements.getOrThrow(), systemParticipants.getOrThrow(), - emUnits.getOrThrow(), graphicElements.getOrThrow()); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java index 12f5b7c9d..3c076cfff 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java +++ b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java @@ -15,8 +15,6 @@ public abstract class GridContainer implements InputContainer { protected final RawGridElements rawGrid; /** Accumulated system participant elements */ protected final SystemParticipants systemParticipants; - /** Accumulated energy management units */ - protected final EnergyManagementUnits emUnits; /** Accumulated graphic data entities (node graphics, line graphics) */ protected final GraphicElements graphics; @@ -24,13 +22,11 @@ protected GridContainer( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, - EnergyManagementUnits emUnits, GraphicElements graphics) { this.gridName = gridName; this.rawGrid = rawGrid; this.systemParticipants = systemParticipants; - this.emUnits = emUnits; this.graphics = graphics; } @@ -39,7 +35,6 @@ public List allEntitiesAsList() { List allEntities = new LinkedList<>(); allEntities.addAll(rawGrid.allEntitiesAsList()); allEntities.addAll(systemParticipants.allEntitiesAsList()); - allEntities.addAll(emUnits.allEntitiesAsList()); allEntities.addAll(graphics.allEntitiesAsList()); return Collections.unmodifiableList(allEntities); } @@ -60,10 +55,6 @@ public SystemParticipants getSystemParticipants() { return systemParticipants; } - public EnergyManagementUnits getEmUnits() { - return emUnits; - } - public GraphicElements getGraphics() { return graphics; } @@ -75,13 +66,12 @@ public boolean equals(Object o) { return gridName.equals(that.gridName) && rawGrid.equals(that.rawGrid) && systemParticipants.equals(that.systemParticipants) - && emUnits.equals(that.emUnits) && graphics.equals(that.graphics); } @Override public int hashCode() { - return Objects.hash(gridName, rawGrid, systemParticipants, emUnits, graphics); + return Objects.hash(gridName, rawGrid, systemParticipants, graphics); } @Override @@ -101,7 +91,6 @@ protected abstract static class GridContainerCopyBuilder sRated, double cosPhiRated) { super(uuid, id, operator, operationTime, node, qCharacteristics, em); @@ -66,7 +66,7 @@ public FixedFeedInInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, ComparableQuantity sRated, double cosPhiRated) { super(uuid, id, node, qCharacteristics, em); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java index 6ef942406..1c0dd2370 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java @@ -44,7 +44,7 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, HpTypeInput type) { super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.thermalBus = thermalBus; @@ -68,7 +68,7 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, HpTypeInput type) { super(uuid, id, node, qCharacteristics, em); this.thermalBus = thermalBus; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 31e43ef76..1889e2937 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -61,7 +61,7 @@ public LoadInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, @@ -100,7 +100,7 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, @@ -142,7 +142,7 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, @@ -177,7 +177,7 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java index 4df99309a..abe86cd09 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java @@ -66,7 +66,7 @@ public PvInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, @@ -111,7 +111,7 @@ public PvInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java index c66b5dd13..ff56bf7ad 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java @@ -38,7 +38,7 @@ public StorageInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, StorageTypeInput type) { super(uuid, id, operator, operationTime, node, qCharacteristics, em); this.type = type; @@ -59,7 +59,7 @@ public StorageInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - UUID em, + EmInput em, StorageTypeInput type) { super(uuid, id, node, qCharacteristics, em); this.type = type; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java index a9d4196ee..0a0c6a42c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java @@ -5,18 +5,12 @@ */ package edu.ie3.datamodel.models.input.system; -import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.extractor.HasNodes; -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantEntityData; -import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantInputEntityFactory; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; -import edu.ie3.datamodel.utils.Try; - import java.util.*; /** Describes a system asset that is connected to a node */ @@ -29,10 +23,10 @@ public abstract class SystemParticipantInput extends AssetInput implements HasNo private final ReactivePowerCharacteristic qCharacteristics; /** - * Optional UUID of the {@link EmInput} that is controlling this system participant. If null, this - * system participant is not em-controlled. + * Optional {@link EmInput} that is controlling this system participant. If null, this system + * participant is not em-controlled. */ - private final UUID em; + private final EmInput em; /** * Constructor for an operated system participant @@ -69,7 +63,11 @@ protected SystemParticipantInput( * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. */ protected SystemParticipantInput( - UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, UUID em) { + UUID uuid, + String id, + NodeInput node, + ReactivePowerCharacteristic qCharacteristics, + EmInput em) { super(uuid, id); this.node = node; this.qCharacteristics = qCharacteristics; @@ -84,7 +82,7 @@ public ReactivePowerCharacteristic getqCharacteristics() { return qCharacteristics; } - public Optional getEm() { + public Optional getEm() { return Optional.ofNullable(em); } @@ -143,7 +141,7 @@ public abstract static class SystemParticipantInputCopyBuilder< private NodeInput node; private ReactivePowerCharacteristic qCharacteristics; - private UUID em; + private EmInput em; protected SystemParticipantInputCopyBuilder(SystemParticipantInput entity) { super(entity); @@ -161,7 +159,7 @@ public B qCharacteristics(ReactivePowerCharacteristic qCharacteristics) { return thisInstance(); } - public B em(UUID em) { + public B em(EmInput em) { this.em = em; return thisInstance(); } @@ -175,7 +173,7 @@ protected ReactivePowerCharacteristic getqCharacteristics() { } /** @return The {@link EmInput} controlling this system participant. CAN BE NULL. */ - public UUID getEm() { + public EmInput getEm() { return em; } diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java index a482ce658..4778fabea 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java @@ -77,7 +77,6 @@ public static JointGridContainer updateGridWithNodes( grid.getGridName(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), - grid.getEmUnits(), updatedEntities.graphicElements()); } @@ -113,7 +112,6 @@ public static SubGridContainer updateGridWithNodes( grid.getSubnet(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), - grid.getEmUnits(), updatedEntities.graphicElements()); } diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java index d0484a499..5033221a2 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java @@ -501,7 +501,6 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, - EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { /* Collect the different sub nets. Through the validation of lines, it is ensured, that no galvanically connected @@ -510,8 +509,7 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( /* Build the single sub grid models */ HashMap subgrids = - buildSubGridContainers( - gridName, subnetNumbers, rawGrid, systemParticipants, energyManagementUnits, graphics); + buildSubGridContainers(gridName, subnetNumbers, rawGrid, systemParticipants, graphics); /* Build the graph structure denoting the topology of the grid */ return buildSubGridTopologyGraph(subgrids, rawGrid); @@ -542,7 +540,6 @@ private static HashMap buildSubGridContainers( SortedSet subnetNumbers, RawGridElements rawGrid, SystemParticipants systemParticipants, - EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { HashMap subGrids = new HashMap<>(subnetNumbers.size()); @@ -555,12 +552,7 @@ private static HashMap buildSubGridContainers( subGrids.put( subnetNumber, new SubGridContainer( - gridName, - subnetNumber, - rawGridElements, - systemParticipantElements, - energyManagementUnits, // TODO filtering (part of #957) - graphicElements)); + gridName, subnetNumber, rawGridElements, systemParticipantElements, graphicElements)); } return subGrids; } @@ -812,9 +804,6 @@ public static JointGridContainer combineToJointGrid( GraphicElements graphicElements = new GraphicElements( subGridContainers.stream().map(GridContainer::getGraphics).collect(Collectors.toSet())); - EnergyManagementUnits energyManagementUnits = - new EnergyManagementUnits( - subGridContainers.stream().map(GridContainer::getEmUnits).collect(Collectors.toSet())); Map subGridMapping = subGridContainers.stream() @@ -823,12 +812,7 @@ public static JointGridContainer combineToJointGrid( SubGridTopologyGraph subGridTopologyGraph = buildSubGridTopologyGraph(subGridMapping, rawGrid); return new JointGridContainer( - gridName, - rawGrid, - systemParticipants, - energyManagementUnits, - graphicElements, - subGridTopologyGraph); + gridName, rawGrid, systemParticipants, graphicElements, subGridTopologyGraph); } /** @@ -1001,7 +985,6 @@ public static SubGridContainer withTrafoNodeAsSlack(final SubGridContainer subGr subGridContainer.getRawGrid().getSwitches(), subGridContainer.getRawGrid().getMeasurementUnits()), subGridContainer.getSystemParticipants(), - subGridContainer.getEmUnits(), new GraphicElements(newNodeGraphics, subGridContainer.getGraphics().getLineGraphics())); } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 5bb63b42b..0bde14b7b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -95,7 +95,7 @@ class EntitySourceTest extends Specification { ] when: - def thermalBusInputEntity = new ThermalBusInputFactory().get(dummyEntitySource.assetInputEntityDataStream(ThermalBusInput, thermalBusInputFieldsToAttributesMap, Collections.emptyList())) + def thermalBusInputEntity = new ThermalBusInputFactory().get(dummyEntitySource.createAssetInputEntityData(ThermalBusInput, thermalBusInputFieldsToAttributesMap, Collections.emptyList())) then: noExceptionThrown() // no NPE should be thrown diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 85bf98585..2c6cb53c2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -136,7 +136,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat def sysPartTypedEntityData = new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, sptd.hpInput.operator, sptd.hpInput.node, sptd.hpTypeInput) when: - def hpInputEntityDataOpt = csvSystemParticipantSource.buildHpEntityData(sysPartTypedEntityData, thermalBuses) + def hpInputEntityDataOpt = csvSystemParticipantSource.createHpEntityData(sysPartTypedEntityData, thermalBuses) then: hpInputEntityDataOpt.success == resultIsPresent From 3999d9f347e32899b26bed1204f4022411464d97 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 16 Dec 2023 01:02:18 +0100 Subject: [PATCH 04/31] Maps for types that are searched by uuid --- .../io/source/EnergyManagementSource.java | 5 +- .../ie3/datamodel/io/source/EntitySource.java | 66 ++++---- .../datamodel/io/source/GraphicSource.java | 28 ++-- .../datamodel/io/source/RawGridSource.java | 129 +++++++-------- .../io/source/ResultEntitySource.java | 2 +- .../io/source/SystemParticipantSource.java | 152 +++++++++--------- .../datamodel/io/source/ThermalSource.java | 122 ++++++-------- .../ie3/datamodel/io/source/TypeSource.java | 43 ++--- .../datamodel/io/sink/CsvFileSinkTest.groovy | 2 +- .../io/source/EntitySourceTest.groovy | 18 --- .../csv/CsvEnergyManagementSourceTest.groovy | 8 +- .../io/source/csv/CsvGraphicSourceTest.groovy | 9 +- .../io/source/csv/CsvThermalSourceTest.groovy | 4 +- .../EnergyManagementUnitsTest.groovy | 29 ---- .../container/JointGridContainerTest.groovy | 5 - .../models/input/system/EmInputTest.groovy | 31 ++-- .../datamodel/utils/ContainerUtilsTest.groovy | 8 - .../ie3/test/common/ComplexTopology.groovy | 8 - .../common/EnergyManagementTestData.groovy | 32 ---- .../ie3/test/common/SampleJointGrid.groovy | 6 +- .../common/SystemParticipantTestData.groovy | 33 ++-- 21 files changed, 304 insertions(+), 436 deletions(-) delete mode 100644 src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy delete mode 100644 src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 882704450..3c3bc0326 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -11,7 +11,6 @@ import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.utils.Try; import java.util.Map; -import java.util.Set; import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; @@ -39,7 +38,7 @@ public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { * @return a map of uuid to {@link EmInput} entities */ public Map getEmUnits() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return getEmUnits(operators); } @@ -60,7 +59,7 @@ public Map getEmUnits() throws SourceException { * the returning instances * @return a map of uuid to {@link EmInput} entities */ - public Map getEmUnits(Set operators) throws SourceException { + public Map getEmUnits(Map operators) throws SourceException { return Try.scanCollection( buildAssetInputEntities(EmInput.class, emInputFactory, operators), EmInput.class) .transformF(SourceException::new) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index b3e9aaf96..bc5ba964a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -18,6 +18,7 @@ import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import org.slf4j.Logger; @@ -74,24 +75,6 @@ protected static String safeMapGet(Map map, String key, String m + (mapName.isEmpty() ? "!" : " in map '" + mapName + "'!")); } - /** - * Returns an {@link Optional} of the first {@link UniqueEntity} element of this collection - * matching the provided UUID or an empty {@code Optional} if no matching entity can be found. - * - * @param entityUuid uuid of the entity that should be looked for - * @param entities collection of entities that should be - * @param type of the entity that will be returned, derived from the provided collection - * @return either an optional containing the first entity that has the provided uuid or an empty - * optional if no matching entity with the provided uuid can be found - */ - protected static Optional findFirstEntityByUuid( - UUID entityUuid, Collection entities) { - return entities.stream() - .parallel() - .filter(uniqueEntity -> uniqueEntity.getUuid().equals(entityUuid)) - .findFirst(); - } - /** * Checks if the requested type of asset can be found in the provided collection of types based on * the provided fields to values mapping. The provided fields to values mapping needs to have one @@ -106,11 +89,11 @@ protected static Optional findFirstEntityByUuid( * @return a {@link Success} containing the type or a {@link Failure} if the type cannot be found */ protected static Try getAssetType( - Collection types, Map fieldsToAttributes, String skippedClassString) { + Map types, Map fieldsToAttributes, String skippedClassString) { Optional assetType = Optional.ofNullable(fieldsToAttributes.get(TYPE)) - .flatMap(typeUuid -> findFirstEntityByUuid(UUID.fromString(typeUuid), types)); + .flatMap(typeUuid -> Optional.ofNullable(types.get(UUID.fromString(typeUuid)))); // if the type is not present we return a failure if (assetType.isEmpty()) { @@ -125,6 +108,7 @@ protected static Try getAssetType return new Success<>(assetType.get()); } + // TODO /** * Finds the required asset type and if present, adds it to the untyped entity data * @@ -135,7 +119,7 @@ protected static Try getAssetType */ protected Try, SourceException> findAndAddType( - ConnectorInputEntityData untypedEntityData, Collection availableTypes) { + ConnectorInputEntityData untypedEntityData, Map availableTypes) { Try assetTypeOption = getAssetType( availableTypes, @@ -179,7 +163,7 @@ protected TypedConnectorInputEntityData addTypeToE * OperatorInput#NO_OPERATOR_ASSIGNED} */ protected OperatorInput getFirstOrDefaultOperator( - Collection operators, + Map operators, Optional operatorUuid, String entityClassName, String requestEntityUuid) { @@ -191,7 +175,7 @@ protected OperatorInput getFirstOrDefaultOperator( entityClassName); return OperatorInput.NO_OPERATOR_ASSIGNED; } else { - return findFirstEntityByUuid(operatorUuid.get(), operators) + return Optional.ofNullable(operators.get(operatorUuid.get())) .orElseGet( () -> { log.debug( @@ -215,7 +199,7 @@ protected OperatorInput getFirstOrDefaultOperator( * @return stream of the entity data wrapped in a {@link Try} */ protected Stream> nodeAssetInputEntityDataStream( - Stream assetInputEntityDataStream, Collection nodes) { + Stream assetInputEntityDataStream, Map nodes) { return assetInputEntityDataStream .parallel() .map( @@ -224,7 +208,7 @@ protected Stream> nodeAssetInputE Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); // get the node of the entity UUID nodeUuid = UUID.fromString(fieldsToAttributes.get(NODE)); - Optional node = findFirstEntityByUuid(nodeUuid, nodes); + Optional node = Optional.ofNullable(nodes.get(nodeUuid)); // if the node is not present we return an empty element and // log a warning @@ -263,8 +247,8 @@ protected Stream> nodeAssetInputE public Set> buildNodeAssetEntities( Class entityClass, EntityFactory factory, - Collection operators, - Collection nodes) { + Map operators, + Map nodes) { return nodeAssetEntityStream(entityClass, factory, operators, nodes) .collect(Collectors.toSet()); } @@ -272,8 +256,8 @@ public Set> buildNodeAssetEntiti protected Stream> nodeAssetEntityStream( Class entityClass, EntityFactory factory, - Collection operators, - Collection nodes) { + Map operators, + Map nodes) { return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) .map(factory::get); } @@ -281,14 +265,14 @@ protected Stream> nodeAssetEntit public Set> buildAssetInputEntities( Class entityClass, EntityFactory factory, - Collection operators) { + Map operators) { return assetInputEntityStream(entityClass, factory, operators).collect(Collectors.toSet()); } protected Stream> assetInputEntityStream( Class entityClass, EntityFactory factory, - Collection operators) { + Map operators) { return assetInputEntityDataStream(entityClass, operators).map(factory::get); } @@ -304,7 +288,7 @@ protected Stream> assetInputEnti * @return stream of the entity data wrapped in a {@link Try} */ protected Stream assetInputEntityDataStream( - Class entityClass, Collection operators) { + Class entityClass, Map operators) { return dataSource .getSourceData(entityClass) .map( @@ -315,7 +299,7 @@ protected Stream assetInputEntityDa protected AssetInputEntityData createAssetInputEntityData( Class entityClass, Map fieldsToAttributes, - Collection operators) { + Map operators) { // get the operator of the entity Optional operatorUuid = @@ -350,11 +334,21 @@ protected Stream simpleEntityDataStre .map(fieldsToAttributes -> new SimpleEntityData(fieldsToAttributes, entityClass)); } - protected static Set unpack( + protected static Map unpackMap( + Stream> inputStream, Class entityClass) throws SourceException { + return unpack(inputStream, entityClass) + .collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())); + } + + protected static Set unpackSet( + Stream> inputStream, Class entityClass) throws SourceException { + return unpack(inputStream, entityClass).collect(Collectors.toSet()); + } + + private static Stream unpack( Stream> inputStream, Class entityClass) throws SourceException { return Try.scanStream(inputStream, entityClass.getSimpleName()) .transformF(SourceException::new) - .getOrThrow() - .collect(Collectors.toSet()); + .getOrThrow(); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index 904b33f3a..72982144b 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -55,11 +55,11 @@ public GraphicElements getGraphicElements() throws SourceException { // read all needed entities /// start with types and operators - Set operators = typeSource.getOperators(); - Set lineTypes = typeSource.getLineTypes(); + Map operators = typeSource.getOperators(); + Map lineTypes = typeSource.getLineTypes(); - Set nodes = rawGridSource.getNodes(operators); - Set lines = rawGridSource.getLines(nodes, lineTypes, operators); + Map nodes = rawGridSource.getNodes(operators); + Map lines = rawGridSource.getLines(nodes, lineTypes, operators); Try, SourceException> nodeGraphics = Try.of(() -> getNodeGraphicInput(nodes), SourceException.class); @@ -89,7 +89,8 @@ public Set getNodeGraphicInput() throws SourceException { return getNodeGraphicInput(rawGridSource.getNodes(typeSource.getOperators())); } - public Set getNodeGraphicInput(Set nodes) throws SourceException { + public Set getNodeGraphicInput(Map nodes) + throws SourceException { return Try.scanCollection( buildNodeGraphicEntityData(nodes) .map(nodeGraphicInputFactory::get) @@ -105,13 +106,14 @@ public Set getNodeGraphicInput(Set nodes) throws So * SourceException} is thrown, else all entities that has been able to be built are returned. */ public Set getLineGraphicInput() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return getLineGraphicInput( rawGridSource.getLines( rawGridSource.getNodes(operators), typeSource.getLineTypes(), operators)); } - public Set getLineGraphicInput(Set lines) throws SourceException { + public Set getLineGraphicInput(Map lines) + throws SourceException { return Try.scanCollection( buildLineGraphicEntityData(lines) .map(lineGraphicInputFactory::get) @@ -140,18 +142,18 @@ public Set getLineGraphicInput(Set lines) throws So * @return a stream of tries of {@link NodeGraphicInput} entities */ protected Stream> buildNodeGraphicEntityData( - Set nodes) { + Map nodes) { return dataSource .getSourceData(NodeGraphicInput.class) .map(fieldsToAttributes -> buildNodeGraphicEntityData(fieldsToAttributes, nodes)); } protected Try buildNodeGraphicEntityData( - Map fieldsToAttributes, Set nodes) { + Map fieldsToAttributes, Map nodes) { // get the node of the entity UUID nodeUuid = UUID.fromString(fieldsToAttributes.get(NODE)); - Optional node = findFirstEntityByUuid(nodeUuid, nodes); + Optional node = Optional.ofNullable(nodes.get(nodeUuid)); // if the node is not present we return a failure // log a warning @@ -187,18 +189,18 @@ protected Try buildNodeGraphicEntit * @return a stream of tries of {@link LineGraphicInput} entities */ protected Stream> buildLineGraphicEntityData( - Set lines) { + Map lines) { return dataSource .getSourceData(LineGraphicInput.class) .map(fieldsToAttributes -> buildLineGraphicEntityData(fieldsToAttributes, lines)); } protected Try buildLineGraphicEntityData( - Map fieldsToAttributes, Set lines) { + Map fieldsToAttributes, Map lines) { // get the node of the entity UUID lineUuid = UUID.fromString(fieldsToAttributes.get("line")); - Optional line = findFirstEntityByUuid(lineUuid, lines); + Optional line = Optional.ofNullable(lines.get(lineUuid)); // if the node is not present we return an empty element and // log a warning diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index 283a635f5..c38047193 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -89,14 +89,14 @@ public RawGridSource(TypeSource typeSource, DataSource dataSource) { */ public RawGridElements getGridData() throws SourceException { /* read all needed entities start with the types and operators */ - Set operators = typeSource.getOperators(); - Set lineTypes = typeSource.getLineTypes(); - Set transformer2WTypeInputs = typeSource.getTransformer2WTypes(); - Set transformer3WTypeInputs = typeSource.getTransformer3WTypes(); + Map operators = typeSource.getOperators(); + Map lineTypes = typeSource.getLineTypes(); + Map transformer2WTypeInputs = typeSource.getTransformer2WTypes(); + Map transformer3WTypeInputs = typeSource.getTransformer3WTypes(); /* assets */ - Set nodes = getNodes(operators); - Try, SourceException> lineInputs = + Map nodes = getNodes(operators); + Try, SourceException> lineInputs = Try.of(() -> getLines(nodes, lineTypes, operators), SourceException.class); Try, SourceException> transformer2WInputs = Try.of( @@ -124,8 +124,8 @@ public RawGridElements getGridData() throws SourceException { // getOrThrow should not throw an exception in this context, because all exception are // filtered and thrown before return new RawGridElements( - nodes, - lineInputs.getOrThrow(), + new HashSet<>(nodes.values()), + new HashSet<>(lineInputs.getOrThrow().values()), transformer2WInputs.getOrThrow(), transformer3WInputs.getOrThrow(), switches.getOrThrow(), @@ -142,7 +142,7 @@ public RawGridElements getGridData() throws SourceException { * * @return a set of object and uuid unique {@link NodeInput} entities */ - public Set getNodes() throws SourceException { + public Map getNodes() throws SourceException { return getNodes(typeSource.getOperators()); } @@ -164,14 +164,10 @@ public Set getNodes() throws SourceException { * the returning instances * @return a set of object and uuid unique {@link NodeInput} entities */ - public Set getNodes(Set operators) throws SourceException { - return Try.scanCollection( - assetInputEntityDataStream(NodeInput.class, operators) - .map(nodeInputFactory::get) - .collect(Collectors.toSet()), - NodeInput.class) - .transformF(SourceException::new) - .getOrThrow(); + public Map getNodes(Map operators) throws SourceException { + return unpackMap( + assetInputEntityDataStream(NodeInput.class, operators).map(nodeInputFactory::get), + NodeInput.class); } /** @@ -183,8 +179,8 @@ public Set getNodes(Set operators) throws SourceExcept * * @return a set of object and uuid unique {@link LineInput} entities */ - public Set getLines() throws SourceException { - Set operators = typeSource.getOperators(); + public Map getLines() throws SourceException { + Map operators = typeSource.getOperators(); return getLines(getNodes(operators), typeSource.getLineTypes(), operators); } @@ -208,15 +204,14 @@ public Set getLines() throws SourceException { * @param lineTypeInputs a set of object and uuid unique {@link LineTypeInput} entities * @return a set of object and uuid unique {@link LineInput} entities */ - public Set getLines( - Set nodes, Set lineTypeInputs, Set operators) + public Map getLines( + Map nodes, + Map lineTypeInputs, + Map operators) throws SourceException { - return Try.scanCollection( - typedEntityStream(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs) - .collect(Collectors.toSet()), - LineInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackMap( + typedEntityStream(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs), + LineInput.class); } /** @@ -230,7 +225,7 @@ public Set getLines( * @return a set of object and uuid unique {@link Transformer2WInput} entities */ public Set get2WTransformers() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return get2WTransformers(getNodes(operators), typeSource.getTransformer2WTypes(), operators); } @@ -257,9 +252,9 @@ public Set get2WTransformers() throws SourceException { * @return a set of object and uuid unique {@link Transformer2WInput} entities */ public Set get2WTransformers( - Set nodes, - Set transformer2WTypes, - Set operators) + Map nodes, + Map transformer2WTypes, + Map operators) throws SourceException { return Try.scanCollection( typedEntityStream( @@ -285,7 +280,7 @@ public Set get2WTransformers( * @return a set of object and uuid unique {@link Transformer3WInput} entities */ public Set get3WTransformers() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return get3WTransformers(getNodes(operators), typeSource.getTransformer3WTypes(), operators); } @@ -312,9 +307,9 @@ public Set get3WTransformers() throws SourceException { * @return a set of object and uuid unique {@link Transformer3WInput} entities */ public Set get3WTransformers( - Set nodes, - Set transformer3WTypeInputs, - Set operators) + Map nodes, + Map transformer3WTypeInputs, + Map operators) throws SourceException { return Try.scanCollection( buildTransformer3WEntities( @@ -335,7 +330,7 @@ public Set get3WTransformers( * @return a set of object and uuid unique {@link SwitchInput} entities */ public Set getSwitches() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return getSwitches(getNodes(operators), operators); } @@ -358,8 +353,8 @@ public Set getSwitches() throws SourceException { * @param nodes a set of object and uuid unique {@link NodeInput} entities * @return a set of object and uuid unique {@link SwitchInput} entities */ - public Set getSwitches(Set nodes, Set operators) - throws SourceException { + public Set getSwitches( + Map nodes, Map operators) throws SourceException { return buildUntypedConnectorInputEntities( SwitchInput.class, switchInputFactory, nodes, operators); } @@ -375,7 +370,7 @@ public Set getSwitches(Set nodes, Set ope * @return a set of object and uuid unique {@link MeasurementUnitInput} entities */ public Set getMeasurementUnits() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); return getMeasurementUnits(getNodes(operators), operators); } @@ -400,7 +395,7 @@ public Set getMeasurementUnits() throws SourceException { * @return a set of object and uuid unique {@link MeasurementUnitInput} entities */ public Set getMeasurementUnits( - Set nodes, Set operators) throws SourceException { + Map nodes, Map operators) throws SourceException { return Try.scanCollection( buildNodeAssetEntities( MeasurementUnitInput.class, measurementUnitInputFactory, operators, nodes), @@ -413,7 +408,7 @@ public Set getMeasurementUnits( public Set> buildNodeInputEntities( Class entityClass, EntityFactory factory, - Collection operators) { + Map operators) { return assetInputEntityDataStream(entityClass, operators) .map(factory::get) .collect(Collectors.toSet()); @@ -422,8 +417,8 @@ public Set> buildNodeInputEntiti public Set buildUntypedConnectorInputEntities( Class entityClass, EntityFactory factory, - Collection nodes, - Collection operators) + Map nodes, + Map operators) throws SourceException { return Try.scanCollection( untypedConnectorInputEntityStream(entityClass, factory, nodes, operators) @@ -435,9 +430,9 @@ public Set buildUntypedConnectorInputEntities( public Set> buildTransformer3WEntities( Transformer3WInputFactory transformer3WInputFactory, - Collection nodes, - Collection transformer3WTypeInputs, - Collection operators) { + Map nodes, + Map transformer3WTypeInputs, + Map operators) { return buildTransformer3WEntityData( buildTypedConnectorEntityData( buildUntypedConnectorInputEntityData( @@ -452,9 +447,9 @@ public Set> buildTransformer3WEntities Set> buildTypedEntities( Class entityClass, EntityFactory> factory, - Collection nodes, - Collection operators, - Collection types) { + Map nodes, + Map operators, + Map types) { return typedEntityStream(entityClass, factory, nodes, operators, types) .collect(Collectors.toSet()); } @@ -471,7 +466,7 @@ Set> buildTypedEntities( protected Stream, SourceException>> buildTypedConnectorEntityData( Stream> noTypeConnectorEntityDataStream, - Collection availableTypes) { + Map availableTypes) { return noTypeConnectorEntityDataStream .parallel() .map( @@ -490,7 +485,7 @@ Stream, SourceException>> buildTypedConnect */ protected Stream> buildUntypedConnectorInputEntityData( - Stream assetInputEntityDataStream, Collection nodes) { + Stream assetInputEntityDataStream, Map nodes) { return assetInputEntityDataStream .parallel() .map( @@ -508,15 +503,15 @@ Stream, SourceException>> buildTypedConnect * @return A {@link Try} to matching {@link ConnectorInputEntityData} */ protected Try buildUntypedConnectorInputEntityData( - AssetInputEntityData assetInputEntityData, Collection nodes) { + AssetInputEntityData assetInputEntityData, Map nodes) { // get the raw data Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); // get the two connector nodes UUID nodeAUuid = UUID.fromString(fieldsToAttributes.get(NODE_A)); UUID nodeBUuid = UUID.fromString(fieldsToAttributes.get(NODE_B)); - Optional nodeA = findFirstEntityByUuid(nodeAUuid, nodes); - Optional nodeB = findFirstEntityByUuid(nodeBUuid, nodes); + Optional nodeA = Optional.ofNullable(nodes.get(nodeAUuid)); + Optional nodeB = Optional.ofNullable(nodes.get(nodeBUuid)); // if nodeA or nodeB are not present we return a failure and log a // warning @@ -555,9 +550,9 @@ protected Try buildUntypedConnectorIn Stream> typedEntityStream( Class entityClass, EntityFactory> factory, - Collection nodes, - Collection operators, - Collection types) { + Map nodes, + Map operators, + Map types) { return buildTypedConnectorEntityData( buildUntypedConnectorInputEntityData( assetInputEntityDataStream(entityClass, operators), nodes), @@ -569,23 +564,13 @@ Stream> typedEntityStream( Stream> untypedConnectorInputEntityStream( Class entityClass, EntityFactory factory, - Set nodes, - Set operators) { + Map nodes, + Map operators) { return buildUntypedConnectorInputEntityData( assetInputEntityDataStream(entityClass, operators), nodes) .map(factory::get); } - private - Stream> untypedConnectorInputEntityStream( - Class entityClass, - EntityFactory factory, - Collection nodes, - Collection operators) { - return untypedConnectorInputEntityStream( - entityClass, factory, new HashSet<>(nodes), new HashSet<>(operators)); - } - /** * Enriches the Stream of tries on {@link Transformer3WInputEntityData} with the information of * the internal node. @@ -597,7 +582,7 @@ Stream> untypedConnectorInputEntityStream( protected Stream> buildTransformer3WEntityData( Stream, SourceException>> typedConnectorEntityDataStream, - Collection nodes) { + Map nodes) { return typedConnectorEntityDataStream .parallel() .map( @@ -615,14 +600,14 @@ protected Stream> buildTransf */ protected Try addThirdNode( TypedConnectorInputEntityData typeEntityData, - Collection nodes) { + Map nodes) { // get the raw data Map fieldsToAttributes = typeEntityData.getFieldsToValues(); // get nodeC of the transformer UUID nodeCUuid = UUID.fromString(fieldsToAttributes.get("nodeC")); - Optional nodeC = findFirstEntityByUuid(nodeCUuid, nodes); + Optional nodeC = Optional.ofNullable(nodes.get(nodeCUuid)); // if nodeC is not present we return a failure // log a warning diff --git a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java index 3f8029158..bc6b194d4 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java @@ -329,7 +329,7 @@ public Set getEmResults() throws SourceException { private Set getResultEntities( Class entityClass, SimpleEntityFactory factory) throws SourceException { - return unpack( + return unpackSet( simpleEntityDataStream(entityClass) .map(entityData -> factory.get(entityData).map(data -> (T) data)), entityClass); diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index c6d7acb86..801ba7a52 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -97,22 +97,22 @@ public SystemParticipants getSystemParticipants() throws SourceException { // read all needed entities /// start with types and operators - Set operators = typeSource.getOperators(); - Set bmTypes = typeSource.getBmTypes(); - Set chpTypes = typeSource.getChpTypes(); - Set evTypes = typeSource.getEvTypes(); - Set hpTypes = typeSource.getHpTypes(); - Set storageTypes = typeSource.getStorageTypes(); - Set wecTypes = typeSource.getWecTypes(); + Map operators = typeSource.getOperators(); + Map bmTypes = typeSource.getBmTypes(); + Map chpTypes = typeSource.getChpTypes(); + Map evTypes = typeSource.getEvTypes(); + Map hpTypes = typeSource.getHpTypes(); + Map storageTypes = typeSource.getStorageTypes(); + Map wecTypes = typeSource.getWecTypes(); Map emUnits = energyManagementSource.getEmUnits(); /// go on with the thermal assets - Set thermalBuses = thermalSource.getThermalBuses(operators); - Set thermalStorages = + Map thermalBuses = thermalSource.getThermalBuses(operators); + Map thermalStorages = thermalSource.getThermalStorages(operators, thermalBuses); /// go on with the nodes - Set nodes = rawGridSource.getNodes(operators); + Map nodes = rawGridSource.getNodes(operators); Try, SourceException> fixedFeedInInputs = Try.of(() -> getFixedFeedIns(operators, nodes, emUnits), SourceException.class); Try, SourceException> pvInputs = @@ -185,7 +185,7 @@ public SystemParticipants getSystemParticipants() throws SourceException { * @return a set of object and uuid unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getFixedFeedIns(operators, rawGridSource.getNodes(operators), emUnits); } @@ -210,9 +210,9 @@ public Set getFixedFeedIns() throws SourceException { * @return a set of object and uuid unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns( - Set operators, Set nodes, Map emUnits) + Map operators, Map nodes, Map emUnits) throws SourceException { - return unpack( + return unpackSet( buildSystemParticipantEntityData(FixedFeedInInput.class, operators, nodes, emUnits) .map(fixedFeedInInputFactory::get), FixedFeedInInput.class); @@ -228,7 +228,7 @@ public Set getFixedFeedIns( * @return a set of object and uuid unique {@link PvInput} entities */ public Set getPvPlants() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getPvPlants(operators, rawGridSource.getNodes(operators), emUnits); } @@ -253,9 +253,9 @@ public Set getPvPlants() throws SourceException { * @return a set of object and uuid unique {@link PvInput} entities */ public Set getPvPlants( - Set operators, Set nodes, Map emUnits) + Map operators, Map nodes, Map emUnits) throws SourceException { - return unpack( + return unpackSet( buildSystemParticipantEntityData(PvInput.class, operators, nodes, emUnits) .map(pvInputFactory::get), PvInput.class); @@ -271,7 +271,7 @@ public Set getPvPlants( * @return a set of object and uuid unique {@link LoadInput} entities */ public Set getLoads() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getLoads(operators, rawGridSource.getNodes(operators), emUnits); } @@ -296,9 +296,9 @@ public Set getLoads() throws SourceException { * @return a set of object and uuid unique {@link LoadInput} entities */ public Set getLoads( - Set operators, Set nodes, Map emUnits) + Map operators, Map nodes, Map emUnits) throws SourceException { - return unpack( + return unpackSet( buildSystemParticipantEntityData(LoadInput.class, operators, nodes, emUnits) .map(loadInputFactory::get), LoadInput.class); @@ -314,7 +314,7 @@ public Set getLoads( * @return a set of object and uuid unique {@link EvcsInput} entities */ public Set getEvcs() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getEvcs(operators, rawGridSource.getNodes(operators), emUnits); } @@ -339,9 +339,9 @@ public Set getEvcs() throws SourceException { * @return a set of object and uuid unique {@link EvcsInput} entities */ public Set getEvcs( - Set operators, Set nodes, Map emUnits) + Map operators, Map nodes, Map emUnits) throws SourceException { - return unpack( + return unpackSet( buildSystemParticipantEntityData(EvcsInput.class, operators, nodes, emUnits) .map(evcsInputFactory::get), EvcsInput.class); @@ -357,7 +357,7 @@ public Set getEvcs( * @return a set of object and uuid unique {@link BmInput} entities */ public Set getBmPlants() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getBmPlants( operators, rawGridSource.getNodes(operators), emUnits, typeSource.getBmTypes()); @@ -384,12 +384,12 @@ public Set getBmPlants() throws SourceException { * @return a set of object and uuid unique {@link BmInput} entities */ public Set getBmPlants( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types) + Map types) throws SourceException { - return unpack( + return unpackSet( buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, emUnits, types) .map(bmInputFactory::get), BmInput.class); @@ -406,7 +406,7 @@ public Set getBmPlants( * @return a set of object and uuid unique {@link StorageInput} entities */ public Set getStorages() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getStorages( operators, rawGridSource.getNodes(operators), emUnits, typeSource.getStorageTypes()); @@ -433,12 +433,12 @@ public Set getStorages() throws SourceException { * @return a set of object and uuid unique {@link StorageInput} entities */ public Set getStorages( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types) + Map types) throws SourceException { - return unpack( + return unpackSet( buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, emUnits, types) .map(storageInputFactory::get), StorageInput.class); @@ -454,7 +454,7 @@ public Set getStorages( * @return a set of object and uuid unique {@link WecInput} entities */ public Set getWecPlants() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getWecPlants( operators, rawGridSource.getNodes(operators), emUnits, typeSource.getWecTypes()); @@ -481,12 +481,12 @@ public Set getWecPlants() throws SourceException { * @return a set of object and uuid unique {@link WecInput} entities */ public Set getWecPlants( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types) + Map types) throws SourceException { - return unpack( + return unpackSet( buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, emUnits, types) .map(wecInputFactory::get), WecInput.class); @@ -502,7 +502,7 @@ public Set getWecPlants( * @return a set of object and uuid unique {@link EvInput} entities */ public Set getEvs() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getEvs(operators, rawGridSource.getNodes(operators), emUnits, typeSource.getEvTypes()); } @@ -528,21 +528,21 @@ public Set getEvs() throws SourceException { * @return a set of object and uuid unique {@link EvInput} entities */ public Set getEvs( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types) + Map types) throws SourceException { - return unpack( + return unpackSet( buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, emUnits, types) .map(evInputFactory::get), EvInput.class); } public Set getChpPlants() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); - Set thermalBuses = thermalSource.getThermalBuses(operators); + Map thermalBuses = thermalSource.getThermalBuses(operators); return getChpPlants( operators, rawGridSource.getNodes(operators), @@ -563,14 +563,14 @@ public Set getChpPlants() throws SourceException { * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} */ public Set getChpPlants( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types, - Set thermalBuses, - Set thermalStorages) + Map types, + Map thermalBuses, + Map thermalStorages) throws SourceException { - return unpack( + return unpackSet( buildChpEntityData( buildTypedSystemParticipantEntityData( ChpInput.class, operators, nodes, emUnits, types), @@ -581,7 +581,7 @@ public Set getChpPlants( } public Set getHeatPumps() throws SourceException { - Set operators = typeSource.getOperators(); + Map operators = typeSource.getOperators(); Map emUnits = energyManagementSource.getEmUnits(operators); return getHeatPumps( operators, @@ -602,13 +602,13 @@ public Set getHeatPumps() throws SourceException { * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} */ public Set getHeatPumps( - Set operators, - Set nodes, + Map operators, + Map nodes, Map emUnits, - Set types, - Set thermalBuses) + Map types, + Map thermalBuses) throws SourceException { - return unpack( + return unpackSet( buildHpEntityData( buildTypedSystemParticipantEntityData( HpInput.class, operators, nodes, emUnits, types), @@ -622,8 +622,8 @@ public Set getHeatPumps( private static Stream> buildChpEntityData( Stream, SourceException>> typedEntityDataStream, - Collection thermalStorages, - Collection thermalBuses) { + Map thermalStorages, + Map thermalBuses) { return typedEntityDataStream .parallel() @@ -636,8 +636,8 @@ private static Stream> buildChpEntityDa private static Try createChpEntityData( SystemParticipantTypedEntityData typedEntityData, - Collection thermalStorages, - Collection thermalBuses) { + Map thermalStorages, + Map thermalBuses) { // get the raw data Map fieldsToAttributes = typedEntityData.getFieldsToValues(); @@ -647,14 +647,14 @@ private static Try createChpEntityData( Optional.ofNullable(fieldsToAttributes.get(THERMAL_STORAGE)) .flatMap( thermalStorageUuid -> - findFirstEntityByUuid(UUID.fromString(thermalStorageUuid), thermalStorages)); + Optional.ofNullable(thermalStorages.get(UUID.fromString(thermalStorageUuid)))); // get the thermal bus input for this chp unit Optional thermalBus = Optional.ofNullable(fieldsToAttributes.get("thermalBus")) .flatMap( thermalBusUuid -> - findFirstEntityByUuid(UUID.fromString(thermalBusUuid), thermalBuses)); + Optional.ofNullable(thermalBuses.get(UUID.fromString(thermalBusUuid)))); // if the thermal storage or the thermal bus are not present we return an // empty element and log a warning @@ -707,7 +707,7 @@ private static Try createChpEntityData( private static Stream> buildHpEntityData( Stream, SourceException>> typedEntityDataStream, - Collection thermalBuses) { + Map thermalBuses) { return typedEntityDataStream .parallel() @@ -719,7 +719,7 @@ private static Stream> buildHpEntityData private static Try createHpEntityData( SystemParticipantTypedEntityData typedEntityData, - Collection thermalBuses) { + Map thermalBuses) { // get the raw data Map fieldsToAttributes = typedEntityData.getFieldsToValues(); @@ -728,11 +728,7 @@ private static Try createHpEntityData( Optional.ofNullable(fieldsToAttributes.get(THERMAL_BUS)) .flatMap( thermalBusUuid -> - thermalBuses.stream() - .filter( - storage -> - storage.getUuid().toString().equalsIgnoreCase(thermalBusUuid)) - .findFirst() + Optional.ofNullable(thermalBuses.get(UUID.fromString(thermalBusUuid))) .map( thermalBus -> { @@ -751,13 +747,13 @@ private static Try createHpEntityData( // if the requested entity is not present we return an empty element and // log a warning if (hpInputEntityDataOpt.isEmpty()) { - String skippingMessage = + String failureMessage = buildSkippingMessage( typedEntityData.getTargetClass().getSimpleName(), safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), "thermalBus: " + safeMapGet(fieldsToAttributes, THERMAL_BUS, FIELDS_TO_VALUES_MAP)); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); + return new Failure<>(new SourceException("Failure due to: " + failureMessage)); } return new Success<>(hpInputEntityDataOpt.get()); @@ -777,10 +773,10 @@ private static Try createHpEntityData( Stream, SourceException>> buildTypedSystemParticipantEntityData( Class entityClass, - Collection operators, - Collection nodes, + Map operators, + Map nodes, Map emUnits, - Collection types) { + Map types) { return buildTypedSystemParticipantEntityData( buildSystemParticipantEntityData(entityClass, operators, nodes, emUnits), types); } @@ -804,7 +800,7 @@ private static Try createHpEntityData( buildTypedSystemParticipantEntityData( Stream> systemParticipantEntityDataStream, - Collection types) { + Map types) { return systemParticipantEntityDataStream .parallel() .map( @@ -817,7 +813,7 @@ private static Try createHpEntityData( private static Try, SourceException> createTypedSystemParticipantEntityData( - SystemParticipantEntityData systemParticipantEntityData, Collection types) { + SystemParticipantEntityData systemParticipantEntityData, Map types) { return getAssetType( types, systemParticipantEntityData.getFieldsToValues(), @@ -838,8 +834,8 @@ private static Try createHpEntityData( private Stream> buildSystemParticipantEntityData( Class entityClass, - Collection operators, - Collection nodes, + Map operators, + Map nodes, Map emUnits) { return buildSystemParticipantEntityData( nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes), diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index d83ed8c42..a8e5d3e11 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.exceptions.FailureException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.input.*; +import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.thermal.CylindricalStorageInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; @@ -17,6 +18,7 @@ import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; import java.util.*; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -56,7 +58,7 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { * * @return a set of object and uuid unique {@link ThermalBusInput} entities */ - public Set getThermalBuses() throws SourceException { + public Map getThermalBuses() throws SourceException { return getThermalBuses(typeSource.getOperators()); } @@ -78,12 +80,11 @@ public Set getThermalBuses() throws SourceException { * the returning instances * @return a set of object and uuid unique {@link ThermalBusInput} entities */ - public Set getThermalBuses(Set operators) throws SourceException { - return Try.scanCollection( - buildAssetInputEntities(ThermalBusInput.class, thermalBusInputFactory, operators), - ThermalBusInput.class) - .transformF(SourceException::new) - .getOrThrow(); + public Map getThermalBuses(Map operators) + throws SourceException { + return unpackMap( + assetInputEntityStream(ThermalBusInput.class, thermalBusInputFactory, operators), + ThermalBusInput.class); } /** @@ -97,8 +98,9 @@ public Set getThermalBuses(Set operators) throws * * @return a set of object and uuid unique {@link ThermalStorageInput} entities */ - public Set getThermalStorages() throws SourceException { - return new HashSet<>(getCylindricStorages()); + public Map getThermalStorages() throws SourceException { + return getCylindricalStorages().stream() + .collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())); } /** @@ -122,9 +124,11 @@ public Set getThermalStorages() throws SourceException { * for the returning instances * @return a set of object and uuid unique {@link ThermalStorageInput} entities */ - public Set getThermalStorages( - Set operators, Set thermalBuses) throws SourceException { - return new HashSet<>(getCylindricStorages(operators, thermalBuses)); + public Map getThermalStorages( + Map operators, Map thermalBuses) + throws SourceException { + return getCylindricalStorages(operators, thermalBuses).stream() + .collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())); } /** @@ -137,10 +141,11 @@ public Set getThermalStorages( * * @return a set of object and uuid unique {@link ThermalHouseInput} entities */ - public Set getThermalHouses() throws SourceException { - return buildThermalHouseInputEntities(thermalHouseInputFactory) - .transformF(SourceException::new) - .getOrThrow(); + public Map getThermalHouses() throws SourceException { + Map operators = typeSource.getOperators(); + Map thermalBuses = getThermalBuses(); + + return getThermalHouses(operators, thermalBuses); } /** @@ -163,11 +168,16 @@ public Set getThermalHouses() throws SourceException { * for the returning instances * @return a set of object and uuid unique {@link ThermalHouseInput} entities */ - public Set getThermalHouses( - Set operators, Set thermalBuses) throws SourceException { - return buildThermalHouseInputEntities(thermalHouseInputFactory, operators, thermalBuses) - .transformF(SourceException::new) - .getOrThrow(); + public Map getThermalHouses( + Map operators, Map thermalBuses) + throws SourceException { + return unpackMap( + assetInputEntityDataStream(ThermalHouseInput.class, operators) + .flatMap( + assetInputEntityData -> + buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) + .map(thermalHouseInputFactory::get)), + ThermalHouseInput.class); } /** @@ -180,7 +190,7 @@ public Set getThermalHouses( * * @return a set of object and uuid unique {@link CylindricalStorageInput} entities */ - public Set getCylindricStorages() throws SourceException { + public Set getCylindricalStorages() throws SourceException { return buildCylindricalStorageInputEntities(cylindricalStorageInputFactory) .transformF(SourceException::new) .getOrThrow(); @@ -193,7 +203,7 @@ public Set getCylindricStorages() throws SourceExceptio * CylindricalStorageInput#equals(Object)} is NOT restricted on the uuid of {@link * CylindricalStorageInput}. * - *

In contrast to {@link #getCylindricStorages()} this interface provides the ability to pass + *

In contrast to {@link #getCylindricalStorages()} this interface provides the ability to pass * in an already existing set of {@link OperatorInput} entities, the {@link * CylindricalStorageInput} instances depend on. Doing so, already loaded nodes can be recycled to * improve performance and prevent unnecessary loading operations. @@ -207,31 +217,27 @@ public Set getCylindricStorages() throws SourceExceptio * for the returning instances * @return a set of object and uuid unique {@link CylindricalStorageInput} entities */ - public Set getCylindricStorages( - Set operators, Set thermalBuses) throws SourceException { - return Try.scanCollection( - buildCylindricalStorageInputEntities( - cylindricalStorageInputFactory, operators, thermalBuses), - CylindricalStorageInput.class) - .transformF(SourceException::new) - .getOrThrow(); + public Set getCylindricalStorages( + Map operators, Map thermalBuses) + throws SourceException { + return unpackSet( + buildCylindricalStorageInputEntities( + cylindricalStorageInputFactory, operators, thermalBuses), + CylindricalStorageInput.class); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- protected Stream> buildThermalUnitInputEntityData( - AssetInputEntityData assetInputEntityData, Collection thermalBuses) { + AssetInputEntityData assetInputEntityData, Map thermalBuses) { // get the raw data Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); // get the thermal bus input for this chp unit - String thermalBusUuid = fieldsToAttributes.get("thermalbus"); - Optional thermalBus = - thermalBuses.stream() - .filter(storage -> storage.getUuid().toString().equalsIgnoreCase(thermalBusUuid)) - .findFirst(); + UUID thermalBusUuid = UUID.fromString(fieldsToAttributes.get("thermalbus")); + Optional thermalBus = Optional.ofNullable(thermalBuses.get(thermalBusUuid)); // remove fields that are passed as objects to constructor fieldsToAttributes.keySet().removeAll(new HashSet<>(Collections.singletonList("thermalbus"))); @@ -257,37 +263,9 @@ public Set getCylindricStorages( thermalBus.get()))); } - public Try, FailureException> buildThermalHouseInputEntities( - ThermalHouseInputFactory factory) throws SourceException { - Set thermalBuses = getThermalBuses(); - - return Try.scanCollection( - assetInputEntityDataStream(ThermalHouseInput.class, typeSource.getOperators()) - .flatMap( - assetInputEntityData -> - buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(factory::get)) - .collect(Collectors.toSet()), - ThermalHouseInput.class); - } - - public Try, FailureException> buildThermalHouseInputEntities( - ThermalHouseInputFactory factory, - Collection operators, - Collection thermalBuses) { - return Try.scanCollection( - assetInputEntityDataStream(ThermalHouseInput.class, operators) - .flatMap( - assetInputEntityData -> - buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(factory::get)) - .collect(Collectors.toSet()), - ThermalHouseInput.class); - } - public Try, FailureException> buildCylindricalStorageInputEntities( CylindricalStorageInputFactory factory) throws SourceException { - Set thermalBuses = getThermalBuses(); + Map thermalBuses = getThermalBuses(); return Try.scanCollection( assetInputEntityDataStream(CylindricalStorageInput.class, typeSource.getOperators()) @@ -299,15 +277,15 @@ public Try, FailureException> buildCylindricalStora CylindricalStorageInput.class); } - public Set> buildCylindricalStorageInputEntities( - CylindricalStorageInputFactory factory, - Collection operators, - Collection thermalBuses) { + public Stream> + buildCylindricalStorageInputEntities( + CylindricalStorageInputFactory factory, + Map operators, + Map thermalBuses) { return assetInputEntityDataStream(CylindricalStorageInput.class, operators) .flatMap( assetInputEntityData -> buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(factory::get)) - .collect(Collectors.toSet()); + .map(factory::get)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 9db4d0f22..75d86f0c6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -22,7 +22,8 @@ import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; import edu.ie3.datamodel.models.input.system.type.*; import edu.ie3.datamodel.utils.Try; -import java.util.Set; +import java.util.Map; +import java.util.UUID; import java.util.stream.Stream; /** @@ -60,8 +61,8 @@ public TypeSource(DataSource dataSource) { * * @return a set of object and uuid unique {@link Transformer2WTypeInput} entities */ - public Set getTransformer2WTypes() throws SourceException { - return unpack( + public Map getTransformer2WTypes() throws SourceException { + return unpackMap( simpleEntityDataStream(Transformer2WTypeInput.class) .map(transformer2WTypeInputFactory::get), Transformer2WTypeInput.class); @@ -75,8 +76,8 @@ public Set getTransformer2WTypes() throws SourceExceptio * * @return a set of object and uuid unique {@link OperatorInput} entities */ - public Set getOperators() throws SourceException { - return unpack( + public Map getOperators() throws SourceException { + return unpackMap( simpleEntityDataStream(OperatorInput.class).map(operatorInputFactory::get), OperatorInput.class); } @@ -89,8 +90,8 @@ public Set getOperators() throws SourceException { * * @return a set of object and uuid unique {@link LineTypeInput} entities */ - public Set getLineTypes() throws SourceException { - return unpack( + public Map getLineTypes() throws SourceException { + return unpackMap( simpleEntityDataStream(LineTypeInput.class).map(lineTypeInputFactory::get), LineTypeInput.class); } @@ -104,8 +105,8 @@ public Set getLineTypes() throws SourceException { * * @return a set of object and uuid unique {@link Transformer3WTypeInput} entities */ - public Set getTransformer3WTypes() throws SourceException { - return unpack( + public Map getTransformer3WTypes() throws SourceException { + return unpackMap( simpleEntityDataStream(Transformer3WTypeInput.class) .map(transformer3WTypeInputFactory::get), Transformer3WTypeInput.class); @@ -119,8 +120,8 @@ public Set getTransformer3WTypes() throws SourceExceptio * * @return a set of object and uuid unique {@link BmTypeInput} entities */ - public Set getBmTypes() throws SourceException { - return unpack( + public Map getBmTypes() throws SourceException { + return unpackMap( buildEntities(BmTypeInput.class, systemParticipantTypeInputFactory), BmTypeInput.class); } @@ -132,8 +133,8 @@ public Set getBmTypes() throws SourceException { * * @return a set of object and uuid unique {@link ChpTypeInput} entities */ - public Set getChpTypes() throws SourceException { - return unpack( + public Map getChpTypes() throws SourceException { + return unpackMap( buildEntities(ChpTypeInput.class, systemParticipantTypeInputFactory), ChpTypeInput.class); } @@ -145,8 +146,8 @@ public Set getChpTypes() throws SourceException { * * @return a set of object and uuid unique {@link HpTypeInput} entities */ - public Set getHpTypes() throws SourceException { - return unpack( + public Map getHpTypes() throws SourceException { + return unpackMap( buildEntities(HpTypeInput.class, systemParticipantTypeInputFactory), HpTypeInput.class); } @@ -158,8 +159,8 @@ public Set getHpTypes() throws SourceException { * * @return a set of object and uuid unique {@link StorageTypeInput} entities */ - public Set getStorageTypes() throws SourceException { - return unpack( + public Map getStorageTypes() throws SourceException { + return unpackMap( buildEntities(StorageTypeInput.class, systemParticipantTypeInputFactory), StorageTypeInput.class); } @@ -172,8 +173,8 @@ public Set getStorageTypes() throws SourceException { * * @return a set of object and uuid unique {@link WecTypeInput} entities */ - public Set getWecTypes() throws SourceException { - return unpack( + public Map getWecTypes() throws SourceException { + return unpackMap( buildEntities(WecTypeInput.class, systemParticipantTypeInputFactory), WecTypeInput.class); } @@ -185,8 +186,8 @@ public Set getWecTypes() throws SourceException { * * @return a set of object and uuid unique {@link EvTypeInput} entities */ - public Set getEvTypes() throws SourceException { - return unpack( + public Map getEvTypes() throws SourceException { + return unpackMap( buildEntities(EvTypeInput.class, systemParticipantTypeInputFactory), EvTypeInput.class); } diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 6c98e7b53..3ae4943b1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -45,7 +45,6 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value -import edu.ie3.test.common.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SampleJointGrid import edu.ie3.test.common.SystemParticipantTestData @@ -252,6 +251,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { OperationTime.notLimited(), Mock(NodeInput), new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), + Mock(EmInput), 0.2, Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), Quantities.getQuantity(95d, PERCENT), diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 0bde14b7b..acf8ee7c1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -36,24 +36,6 @@ class EntitySourceTest extends Specification { DummyEntitySource dummyEntitySource = new DummyEntitySource(csvDataSource) - def "A csv data source is able to find the correct first entity by uuid"() { - given: - def uuid = UUID.randomUUID() - def queriedOperator = new OperatorInput(uuid, "b") - def entities = Arrays.asList( - new OperatorInput(UUID.randomUUID(), "a"), - queriedOperator, - new OperatorInput(UUID.randomUUID(), "c") - ) - - when: - def actual = dummyEntitySource.findFirstEntityByUuid(uuid, entities) - - then: - actual.present - actual.get() == queriedOperator - } - def "A CsvDataSource should always return an operator. Either the found one (if any) or OperatorInput.NO_OPERATOR_ASSIGNED"() { expect: diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index 8e595a467..f87d80c81 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -10,7 +10,7 @@ import edu.ie3.datamodel.io.source.EnergyManagementSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.EnergyManagementTestData +import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { @@ -29,8 +29,8 @@ class CsvEnergyManagementSourceTest extends Specification implements CsvTestData emUnits.data.get().emUnits == resultingSet as Set where: - operators || resultingSet - [EnergyManagementTestData.emInput.operator] || [EnergyManagementTestData.emInput] - [] || [EnergyManagementTestData.emInput.copy().operator(OperatorInput.NO_OPERATOR_ASSIGNED).build()] + operators || resultingSet + [SystemParticipantTestData.emInput.operator] || [SystemParticipantTestData.emInput] + [] || [SystemParticipantTestData.emInput.copy().operator(OperatorInput.NO_OPERATOR_ASSIGNED).build()] } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy index 38f15b346..8946bf585 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy @@ -22,7 +22,6 @@ import spock.lang.Specification class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { - def "A CsvGraphicSource should provide an instance of GraphicElements based on valid input data correctly"() { given: def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, fileNamingStrategy)) @@ -44,13 +43,13 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { def rawGridSource = new RawGridSource(typeSource, new CsvDataSource(csvSep, gridDefaultFolderPath, fileNamingStrategy)) { @Override - Set getNodes() { - return Collections.emptySet() + Map getNodes() { + return Collections.emptyMap() } @Override - Set getNodes(Set operators) { - return Collections.emptySet() + Map getNodes(Map operators) { + return Collections.emptyMap() } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index eba4c636a..e94c288e1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -59,7 +59,7 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { //test method when operators and thermal buses are not provided as constructor parameters when: - def resultingCylindricalStorageWoOperator = csvThermalSource.getCylindricStorages() + def resultingCylindricalStorageWoOperator = csvThermalSource.getCylindricalStorages() then: resultingCylindricalStorageWoOperator.size() == 1 @@ -76,7 +76,7 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { //test method when operators and thermal buses are provided as constructor parameters when: - def resultingCylindricalStorage = csvThermalSource.getCylindricStorages(operators, thermalBuses) + def resultingCylindricalStorage = csvThermalSource.getCylindricalStorages(operators, thermalBuses) then: resultingCylindricalStorage.size() == 1 diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy deleted file mode 100644 index 7bb2e6902..000000000 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy +++ /dev/null @@ -1,29 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.models.input.container - -import edu.ie3.test.common.EnergyManagementTestData -import spock.lang.Specification - -class EnergyManagementUnitsTest extends Specification { - - def "An EnergyManagementUnits' copy method should work as expected"() { - given: - def energyManagementUnits = new EnergyManagementUnits( - Collections.singleton(EnergyManagementTestData.emInput) - ) - - def modifiedEmInput = EnergyManagementTestData.emInput.copy().id("modified").build() - - when: - def modifiedEnergyManagementUnits = energyManagementUnits.copy() - .emUnits(Set.of(modifiedEmInput)) - .build() - - then: - modifiedEnergyManagementUnits.emUnits.first() == modifiedEmInput - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy index 21bc87957..bb614d5c8 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy @@ -5,10 +5,8 @@ */ package edu.ie3.datamodel.models.input.container -import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants -import edu.ie3.test.common.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification @@ -43,7 +41,6 @@ class JointGridContainerTest extends Specification { def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) def rawGrid = new RawGridElements(List.of(GridTestData.lineAtoB, GridTestData.transformerAtoBtoC)) def systemParticipants = new SystemParticipants(List.of(SystemParticipantTestData.bmInput)) - def emUnits = new EnergyManagementUnits(Set.of(EnergyManagementTestData.emInput)) def graphics = new GraphicElements(Set.of(GridTestData.nodeGraphicD), Set.of(GridTestData.lineGraphicCtoD)) when: @@ -51,7 +48,6 @@ class JointGridContainerTest extends Specification { .gridName("new grid name") .rawGrid(rawGrid) .systemParticipants(systemParticipants) - .emUnits(emUnits) .graphics(graphics) .build() @@ -59,7 +55,6 @@ class JointGridContainerTest extends Specification { modifiedJointGridContainer.gridName == "new grid name" modifiedJointGridContainer.rawGrid == rawGrid modifiedJointGridContainer.systemParticipants == systemParticipants - modifiedJointGridContainer.emUnits == emUnits modifiedJointGridContainer.graphics == graphics } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 5427810e5..4bafff366 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.models.input.system -import edu.ie3.test.common.EnergyManagementTestData +import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification class EmInputTest extends Specification { @@ -15,55 +15,56 @@ class EmInputTest extends Specification { def emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", - EnergyManagementTestData.emControlStrategy + SystemParticipantTestData.emControlStrategy, + SystemParticipantTestData.parentEm ) then: emInput.with { assert uuid == UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792") assert id == "test_emInput" - assert controlStrategy == EnergyManagementTestData.emControlStrategy + assert controlStrategy == SystemParticipantTestData.emControlStrategy } } def "EmInputs are comparable"() { given: - def emInputA = EnergyManagementTestData.emInput + def emInputA = SystemParticipantTestData.emInput expect: (emInputA == emInputB) == isEqual where: - emInputB || isEqual - EnergyManagementTestData.emInput || true - EnergyManagementTestData.emInput.copy().build() || true - EnergyManagementTestData.emInput.copy().id("otherId").build() || false + emInputB || isEqual + SystemParticipantTestData.emInput || true + SystemParticipantTestData.emInput.copy().build() || true + SystemParticipantTestData.emInput.copy().id("otherId").build() || false } def "The EmInput to String method work as expected"() { given: - def emInputToString = EnergyManagementTestData.emInput.toString() + def emInputToString = SystemParticipantTestData.emInput.toString() expect: emInputToString == "EmInput{" + "uuid=" + - EnergyManagementTestData.emInput.uuid + + SystemParticipantTestData.emInput.uuid + ", id='" + - EnergyManagementTestData.emInput.id + + SystemParticipantTestData.emInput.id + ", operator=" + - EnergyManagementTestData.emInput.operator.uuid + + SystemParticipantTestData.emInput.operator.uuid + ", operationTime=" + - EnergyManagementTestData.emInput.operationTime + + SystemParticipantTestData.emInput.operationTime + ", controlStrategy=" + - EnergyManagementTestData.emInput.controlStrategy + + SystemParticipantTestData.emInput.controlStrategy + '}' } def "A EmInput copy method should work as expected"() { given: - def emInput = EnergyManagementTestData.emInput + def emInput = SystemParticipantTestData.emInput def newStrat = "new_strat" when: diff --git a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy index 72461b659..c07ff0d54 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy @@ -294,7 +294,6 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics HashMap expectedSubGrids = ComplexTopology.expectedSubGrids @@ -305,7 +304,6 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGrid, systemParticipants, - emUnits, graphics) then: @@ -325,7 +323,6 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGridInput= ComplexTopology.grid.rawGrid SystemParticipants systemParticipantsInput = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphicsInput = ComplexTopology.grid.graphics HashMap unmodifiedSubGrids = ComplexTopology.expectedSubGrids @@ -335,7 +332,6 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGridInput, systemParticipantsInput, - emUnits, graphicsInput) when: @@ -390,14 +386,12 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics Map subgrids = ContainerUtils.buildSubGridContainers( gridName, subNetNumbers, rawGrid, systemParticipants, - emUnits, graphics) SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -415,7 +409,6 @@ class ContainerUtilsTest extends Specification { String gridName = ComplexTopology.gridName RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticpants = ComplexTopology.grid.systemParticipants - EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -424,7 +417,6 @@ class ContainerUtilsTest extends Specification { gridName, rawGrid, systemParticpants, - emUnits, graphics) then: diff --git a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy index 172675589..1c56b3838 100644 --- a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy +++ b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy @@ -5,7 +5,6 @@ */ package edu.ie3.test.common -import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants import edu.ie3.datamodel.graph.SubGridGate @@ -46,7 +45,6 @@ class ComplexTopology extends GridTestData { gridName, rawGrid, emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set)) @@ -67,7 +65,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -84,7 +81,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -101,7 +97,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -118,7 +113,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -138,7 +132,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -158,7 +151,6 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, - emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) diff --git a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy deleted file mode 100644 index 0fae3df5c..000000000 --- a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy +++ /dev/null @@ -1,32 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.test.common - -import edu.ie3.datamodel.models.input.container.EnergyManagementUnits -import edu.ie3.datamodel.models.input.system.EmInput - -class EnergyManagementTestData { - - public static final UUID[] connectedAssets = new UUID[]{ - SystemParticipantTestData.loadInput.uuid, - SystemParticipantTestData.pvInput.uuid - } - public static final String emControlStrategy = "self_optimization" - public static final UUID parentEm = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") - - - public static final emInput = new EmInput( - UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), - "test_emInput", - SystemParticipantTestData.operator, - SystemParticipantTestData.operationTime, - emControlStrategy, - parentEm - ) - - public static EnergyManagementUnits emptyEnergyManagementUnits = - new EnergyManagementUnits([] as List) -} diff --git a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy index 44243df05..ea7ea00ec 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -15,7 +15,6 @@ import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput -import edu.ie3.datamodel.models.input.container.EnergyManagementUnits import edu.ie3.datamodel.models.input.container.GraphicElements import edu.ie3.datamodel.models.input.container.JointGridContainer import edu.ie3.datamodel.models.input.container.RawGridElements @@ -48,7 +47,6 @@ class SampleJointGrid extends SystemParticipantTestData { "sampleGrid", rawGridElements, systemParticipants(rawGridElements), - new EnergyManagementUnits(Collections.emptySet()), new GraphicElements(Collections.emptySet())) } @@ -72,6 +70,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, albedo, azimuth, etaConv, @@ -91,6 +90,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, standardLoadProfile, false, eConsAnnual, @@ -105,6 +105,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, standardLoadProfile, false, eConsAnnual, @@ -120,6 +121,7 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, + emInput, storageTypeInput) return new SystemParticipants( diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index a36f165f2..0345a4acc 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -40,7 +40,6 @@ class SystemParticipantTestData { static final OperatorInput operator = new OperatorInput( UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "TestOperator") public static final NodeInput participantNode = GridTestData.nodeA - static final UUID em = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") // general type data static final CosPhiFixed cosPhiFixed = new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}") @@ -56,6 +55,18 @@ class SystemParticipantTestData { private static final ComparableQuantity opex = Quantities.getQuantity(50d, ENERGY_PRICE) static final ComparableQuantity etaConv = Quantities.getQuantity(98d, EFFICIENCY) + // EmInput + public static final String emControlStrategy = "self_optimization" + public static final UUID parentEm = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") + + public static final emInput = new EmInput( + UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), + "test_emInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + emControlStrategy, + parentEm + ) // FixedFeedInput public static final FixedFeedInInput fixedFeedInInput = new FixedFeedInInput( @@ -65,7 +76,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, sRated, cosPhiRated ) @@ -83,7 +94,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, albedo, azimuth, etaConv, @@ -120,7 +131,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiP, - em, + emInput, wecType, false ) @@ -174,7 +185,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, - em, + emInput, chpTypeInput, thermalStorage, false @@ -201,7 +212,7 @@ class SystemParticipantTestData { operationTime, participantNode, qV, - em, + emInput, bmTypeInput, false, false, @@ -227,7 +238,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, evTypeInput ) @@ -241,7 +252,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, standardLoadProfile, false, eConsAnnual, @@ -278,7 +289,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, storageTypeInput ) @@ -301,7 +312,7 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, - em, + emInput, hpTypeInput ) @@ -314,7 +325,7 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - em, + emInput, ChargingPointTypeUtils.HouseholdSocket, 4, cosPhiRated, From 7f197ad73171ff10d64ea4fd0d8628af958a2721 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Mon, 18 Dec 2023 19:51:06 +0100 Subject: [PATCH 05/31] Further progress. Simplified EntitySource and subclasses a lot. --- .../ie3/datamodel/io/factory/EntityData.java | 4 +- .../input/ConnectorInputEntityData.java | 15 + .../input/ThermalUnitInputEntityData.java | 12 + .../input/Transformer3WInputEntityData.java | 13 + .../input/TypedConnectorInputEntityData.java | 16 +- .../graphics/LineGraphicInputEntityData.java | 12 + .../graphics/NodeGraphicInputEntityData.java | 12 + .../input/participant/BmInputFactory.java | 2 +- .../input/participant/ChpInputEntityData.java | 19 +- .../input/participant/ChpInputFactory.java | 2 +- .../input/participant/EmInputFactory.java | 2 +- .../input/participant/EvInputFactory.java | 2 +- .../input/participant/EvcsInputFactory.java | 2 +- .../participant/FixedFeedInInputFactory.java | 2 +- .../input/participant/HpInputEntityData.java | 16 +- .../input/participant/HpInputFactory.java | 2 +- .../input/participant/LoadInputFactory.java | 2 +- .../input/participant/PvInputFactory.java | 2 +- .../participant/StorageInputFactory.java | 2 +- .../SystemParticipantEntityData.java | 2 +- .../SystemParticipantTypedEntityData.java | 2 +- .../input/participant/WecInputFactory.java | 2 +- .../io/source/EnergyManagementSource.java | 14 +- .../ie3/datamodel/io/source/EntitySource.java | 466 ++++++++++-------- .../datamodel/io/source/GraphicSource.java | 92 +--- .../datamodel/io/source/RawGridSource.java | 218 ++------ .../io/source/ResultEntitySource.java | 2 +- .../io/source/SystemParticipantSource.java | 217 ++------ .../datamodel/io/source/ThermalSource.java | 117 ++--- .../ie3/datamodel/io/source/TypeSource.java | 12 +- .../models/input/{system => }/EmInput.java | 4 +- .../models/input/system/BmInput.java | 1 + .../models/input/system/ChpInput.java | 1 + .../models/input/system/EvInput.java | 1 + .../models/input/system/EvcsInput.java | 1 + .../models/input/system/FixedFeedInInput.java | 1 + .../models/input/system/HpInput.java | 1 + .../models/input/system/LoadInput.java | 1 + .../models/input/system/PvInput.java | 1 + .../models/input/system/StorageInput.java | 1 + .../input/system/SystemParticipantInput.java | 1 + .../models/input/system/WecInput.java | 1 + .../models/result/system/EmResult.java | 3 +- .../participant/BmInputFactoryTest.groovy | 5 +- .../participant/ChpInputFactoryTest.groovy | 5 +- .../participant/EmInputFactoryTest.groovy | 2 +- .../participant/EvInputFactoryTest.groovy | 5 +- .../participant/EvcsInputFactoryTest.groovy | 12 +- .../FixedFeedInInputFactoryTest.groovy | 9 +- .../participant/HpInputFactoryTest.groovy | 5 +- .../participant/LoadInputFactoryTest.groovy | 6 +- .../participant/PvInputFactoryTest.groovy | 5 +- .../StorageInputFactoryTest.groovy | 5 +- .../participant/WecInputFactoryTest.groovy | 5 +- ...EntityPersistenceNamingStrategyTest.groovy | 2 +- .../io/processor/ProcessorProviderTest.groovy | 1 + .../datamodel/io/sink/CsvFileSinkTest.groovy | 4 +- .../io/source/EntitySourceTest.groovy | 2 +- .../models/input/system/EmInputTest.groovy | 1 + .../common/SystemParticipantTestData.groovy | 1 + 60 files changed, 605 insertions(+), 771 deletions(-) rename src/main/java/edu/ie3/datamodel/models/input/{system => }/EmInput.java (95%) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java index ce750f98f..189279f5d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java @@ -29,7 +29,7 @@ * @version 0.1 * @since 28.01.20 */ -public abstract class EntityData extends FactoryData { +public class EntityData extends FactoryData { private static final Logger logger = LoggerFactory.getLogger(EntityData.class); private static final GeoJsonReader geoJsonReader = new GeoJsonReader(); @@ -39,7 +39,7 @@ public abstract class EntityData extends FactoryData { * @param fieldsToAttributes attribute map: field name to value * @param entityClass class of the entity to be created with this data */ - protected EntityData( + public EntityData( Map fieldsToAttributes, Class entityClass) { super(fieldsToAttributes, entityClass); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java index 758883595..4c795e89d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ConnectorInputEntityData.java @@ -42,6 +42,21 @@ public ConnectorInputEntityData( this.nodeB = nodeB; } + /** + * Creates a new ConnectorInputEntityData object based on a given {@link AssetInputEntityData} + * object and given nodes + * + * @param entityData The AssetInputEntityData object to enhance + * @param nodeA The first node to add + * @param nodeB The second node to add + */ + public ConnectorInputEntityData( + AssetInputEntityData entityData, NodeInput nodeA, NodeInput nodeB) { + super(entityData, entityData.getOperatorInput()); + this.nodeA = nodeA; + this.nodeB = nodeB; + } + public NodeInput getNodeA() { return nodeA; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java index b9b67f836..c936b58f9 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/ThermalUnitInputEntityData.java @@ -31,6 +31,18 @@ public ThermalUnitInputEntityData( this.busInput = busInput; } + /** + * Creates a new ThermalUnitInputEntityData object based on a given {@link AssetInputEntityData} + * object and a bus input + * + * @param entityData The AssetInputEntityData object to enhance + * @param busInput The thermal bus input + */ + public ThermalUnitInputEntityData(AssetInputEntityData entityData, ThermalBusInput busInput) { + super(entityData, entityData.getOperatorInput()); + this.busInput = busInput; + } + public ThermalBusInput getBusInput() { return busInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java index 47da51e48..e53678f1a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/Transformer3WInputEntityData.java @@ -39,6 +39,19 @@ public Transformer3WInputEntityData( this.nodeC = nodeC; } + /** + * Creates a new Transformer3WInputEntityData object based on a given {@link + * TypedConnectorInputEntityData} object and given third node + * + * @param entityData The TypedConnectorInputEntityData object to enhance + * @param nodeC The third node + */ + public Transformer3WInputEntityData( + TypedConnectorInputEntityData entityData, NodeInput nodeC) { + super(entityData, entityData.getType()); + this.nodeC = nodeC; + } + public NodeInput getNodeC() { return nodeC; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java index 7f3a56f83..c70bb2231 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/TypedConnectorInputEntityData.java @@ -46,8 +46,8 @@ public TypedConnectorInputEntityData( } /** - * Creates a new TypedConnectorInputEntityData object for an operable connector input input that - * input that needs a type input as well + * Creates a new TypedConnectorInputEntityData object for an operable connector input that needs a + * type input as well * * @param fieldsToAttributes attribute map: field name to value * @param entityClass class of the entity to be created with this data @@ -67,6 +67,18 @@ public TypedConnectorInputEntityData( this.type = type; } + /** + * Creates a new TypedConnectorInputEntityData object based on a given {@link + * ConnectorInputEntityData} object and given type + * + * @param entityData The ConnectorInputEntityData object to enhance + * @param type type input + */ + public TypedConnectorInputEntityData(ConnectorInputEntityData entityData, T type) { + super(entityData, entityData.getNodeA(), entityData.getNodeB()); + this.type = type; + } + public T getType() { return type; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java index 41bcc8b6e..48b87b088 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/LineGraphicInputEntityData.java @@ -31,6 +31,18 @@ public LineGraphicInputEntityData(Map fieldsToAttributes, LineIn this.line = line; } + /** + * Creates a new LineGraphicInputEntityData object based on a given {@link EntityData} object and + * a line + * + * @param entityData The EntityData object to enhance + * @param line Referenced electrical line + */ + public LineGraphicInputEntityData(EntityData entityData, LineInput line) { + super(entityData); + this.line = line; + } + public LineInput getLine() { return line; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java index a1a213cd9..edba66b27 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/NodeGraphicInputEntityData.java @@ -31,6 +31,18 @@ public NodeGraphicInputEntityData(Map fieldsToAttributes, NodeIn this.node = node; } + /** + * Creates a new NodeGraphicInputEntityData object based on a given {@link EntityData} object and + * a node + * + * @param entityData The EntityData object to enhance + * @param node node input element of this graphic + */ + public NodeGraphicInputEntityData(EntityData entityData, NodeInput node) { + super(entityData); + this.node = node; + } + public NodeInput getNode() { return node; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java index 3824982f0..bf8079394 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java @@ -7,10 +7,10 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.BmInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.BmTypeInput; import edu.ie3.util.quantities.interfaces.EnergyPrice; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java index 12067138f..81c11572a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.type.ChpTypeInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; @@ -44,6 +44,23 @@ public ChpInputEntityData( this.thermalStorageInput = thermalStorageInput; } + /** + * Creates a new ChpInputEntityData object based on a given {@link + * SystemParticipantTypedEntityData} object and a thermal bus and storage input + * + * @param entityData The SystemParticipantTypedEntityData object to enhance + * @param thermalBusInput The thermal bus input + * @param thermalStorageInput The thermal storage input + */ + public ChpInputEntityData( + SystemParticipantTypedEntityData entityData, + ThermalBusInput thermalBusInput, + ThermalStorageInput thermalStorageInput) { + super(entityData, entityData.getTypeInput()); + this.thermalBusInput = thermalBusInput; + this.thermalStorageInput = thermalStorageInput; + } + public ThermalBusInput getThermalBusInput() { return thermalBusInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java index ebe33ccf1..4ad47b060 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java @@ -6,10 +6,10 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index 9b9886e65..ebfb6a7b8 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -8,8 +8,8 @@ import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import java.util.ArrayList; import java.util.List; import java.util.Set; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java index 8d4779e0c..b2d492ce5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.EvInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.EvTypeInput; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java index aae2f8b6a..183cbf08b 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java @@ -9,9 +9,9 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.EvcsInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.chargingpoint.ChargingPointType; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java index 9e379d4b0..bdede37bc 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java @@ -7,9 +7,9 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.FixedFeedInInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java index e782b40d5..a240b5f04 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java @@ -5,9 +5,10 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.HpInput; import edu.ie3.datamodel.models.input.system.type.HpTypeInput; import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; @@ -38,6 +39,19 @@ public HpInputEntityData( this.thermalBusInput = thermalBusInput; } + /** + * Creates a new HpInputEntityData object based on a given {@link ConnectorInputEntityData} object + * and given thermal bus input + * + * @param entityData The SystemParticipantTypedEntityData object to enhance + * @param thermalBusInput The thermal bus input + */ + public HpInputEntityData( + SystemParticipantTypedEntityData entityData, ThermalBusInput thermalBusInput) { + super(entityData, entityData.getTypeInput()); + this.thermalBusInput = thermalBusInput; + } + public ThermalBusInput getThermalBusInput() { return thermalBusInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java index 774a09ec8..b01ede298 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.HpInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index b77853495..188504bb6 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -8,9 +8,9 @@ import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.LoadInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.profile.LoadProfile; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java index 29a3389fb..3d359fde2 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java @@ -7,9 +7,9 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.PvInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import java.util.UUID; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java index d9790117d..aea43ba85 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.StorageInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.StorageTypeInput; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java index 204b72b3c..971832be4 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java @@ -7,9 +7,9 @@ import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import java.util.Map; import java.util.Objects; import java.util.Optional; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java index 4a28b210c..ab0bbe4b3 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; import java.util.Map; import java.util.Objects; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java index 17b780c33..c6159adeb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; import edu.ie3.datamodel.models.input.system.WecInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; import edu.ie3.datamodel.models.input.system.type.WecTypeInput; diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 3c3bc0326..552df1163 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -7,13 +7,10 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.input.participant.EmInputFactory; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.models.input.system.EmInput; -import edu.ie3.datamodel.utils.Try; import java.util.Map; import java.util.UUID; -import java.util.function.Function; -import java.util.stream.Collectors; public class EnergyManagementSource extends EntitySource { @@ -60,11 +57,8 @@ public Map getEmUnits() throws SourceException { * @return a map of uuid to {@link EmInput} entities */ public Map getEmUnits(Map operators) throws SourceException { - return Try.scanCollection( - buildAssetInputEntities(EmInput.class, emInputFactory, operators), EmInput.class) - .transformF(SourceException::new) - .getOrThrow() - .stream() - .collect(Collectors.toMap(EmInput::getUuid, Function.identity())); + return unpackMap( + buildAssetInputEntityData(EmInput.class, operators).map(emInputFactory::get), + EmInput.class); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index bc5ba964a..bb273f293 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -7,20 +7,21 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.TypedConnectorInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.*; import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; import java.util.*; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; +import org.apache.commons.lang3.function.TriFunction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -33,7 +34,6 @@ public abstract class EntitySource { protected static final String OPERATOR = "operator"; protected static final String NODE = "node"; protected static final String TYPE = "type"; - protected static final String FIELDS_TO_VALUES_MAP = "fieldsToValuesMap"; protected final DataSource dataSource; @@ -43,192 +43,217 @@ protected EntitySource(DataSource dataSource) { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= - protected static String buildSkippingMessage( - String entityDesc, String entityUuid, String entityId, String missingElementsString) { - return "Skipping " - + entityDesc - + " with uuid " - + entityUuid - + " and id " - + entityId - + ". Not all required entities found or map is missing entity key!\nMissing elements:\n" - + missingElementsString; - } - - /** - * Method for retrieving an element from a map. If the map doesn't contain the key an error - * message is build and returned instead. - * - *

Should not be used for other purposes than creating error messages. - * - * @param map with value - * @param key for the value - * @param mapName name of the map used for the error message - * @return either the value or an error message - */ - protected static String safeMapGet(Map map, String key, String mapName) { - return Optional.ofNullable(map.get(key)) - .orElse( - "Key '" - + key - + "' not found" - + (mapName.isEmpty() ? "!" : " in map '" + mapName + "'!")); - } - /** - * Checks if the requested type of asset can be found in the provided collection of types based on - * the provided fields to values mapping. The provided fields to values mapping needs to have one - * and only one field with key {@link #TYPE} and a corresponding UUID value. If the type can be - * found in the provided collection based on the UUID it is returned wrapped in a {@link Success}. - * Otherwise, a {@link Failure} is returned and a warning is logged. + * Enhances given entity data with an entity from the given entity map. The linked entity is + * chosen by taking into account the UUID found by retrieving the field with given fieldName from + * entityData. * - * @param types a collection of types that should be used for searching - * @param fieldsToAttributes the field name to value mapping incl. the key {@link #TYPE} - * @param skippedClassString debug string of the class that will be skipping - * @param the type of the resulting type instance - * @return a {@link Success} containing the type or a {@link Failure} if the type cannot be found + * @param entityData The entity data of the entity that provides a link to another entity via UUID + * @param fieldName The field name of the field that provides the UUID of the linked entity + * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity + * data + * @param createEntityData The function that creates the resulting entity data given entityData + * and the linked entity + * @param Type of input entity data + * @param Type of the linked entity + * @param Type of resulting entity data that combines the given entityData and linked entity + * @return {@link Try} to enhanced data */ - protected static Try getAssetType( - Map types, Map fieldsToAttributes, String skippedClassString) { + protected static + Try enrichEntityData( + E entityData, + String fieldName, + Map linkedEntities, + BiFunction createEntityData) { + return getLinkedEntity(entityData, fieldName, linkedEntities) + .map( + linkedEntity -> { + Map fieldsToAttributes = entityData.getFieldsToValues(); - Optional assetType = - Optional.ofNullable(fieldsToAttributes.get(TYPE)) - .flatMap(typeUuid -> Optional.ofNullable(types.get(UUID.fromString(typeUuid)))); + // remove fields that are passed as objects to constructor + fieldsToAttributes.keySet().remove(fieldName); - // if the type is not present we return a failure - if (assetType.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - skippedClassString, - safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), - safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), - TYPE + ": " + safeMapGet(fieldsToAttributes, TYPE, FIELDS_TO_VALUES_MAP)); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - return new Success<>(assetType.get()); + // build resulting entity data + return createEntityData.apply(entityData, linkedEntity); + }); } - // TODO /** - * Finds the required asset type and if present, adds it to the untyped entity data + * Enhances given entity data with two entities from the given entity maps. The linked entities + * are chosen by taking into account the UUIDs found by retrieving the fields with given + * fieldNameA and fieldNameB from entityData. * - * @param untypedEntityData Untyped entity data to enrich - * @param availableTypes Yet available asset types - * @param Type of the asset type + * @param entityData The entity data of the entity that provides links to two other entities via + * UUID + * @param fieldNameA The field name of the field that provides the UUID of the first linked entity + * @param linkedEntitiesA The first map of UUID to entities, of which one should be linked to + * given entity data + * @param fieldNameB The field name of the field that provides the UUID of the second linked + * entity + * @param linkedEntitiesB The second map of UUID to entities, of which one should be linked to + * given entity data + * @param createEntityData The function that creates the resulting entity data given entityData + * and the linked entities + * @param Type of input entity data + * @param Type of the first linked entity + * @param Type of the second linked entity + * @param Type of resulting entity data that combines the given entityData and two linked + * entities * @return {@link Try} to enhanced data */ - protected - Try, SourceException> findAndAddType( - ConnectorInputEntityData untypedEntityData, Map availableTypes) { - Try assetTypeOption = - getAssetType( - availableTypes, - untypedEntityData.getFieldsToValues(), - untypedEntityData.getClass().getSimpleName()); - return assetTypeOption.map(assetType -> addTypeToEntityData(untypedEntityData, assetType)); + protected static < + E extends EntityData, TA extends UniqueEntity, TB extends UniqueEntity, R extends E> + Try enrichEntityData( + E entityData, + String fieldNameA, + Map linkedEntitiesA, + String fieldNameB, + Map linkedEntitiesB, + TriFunction createEntityData) { + return getLinkedEntity(entityData, fieldNameA, linkedEntitiesA) + .flatMap( + linkedEntityA -> + getLinkedEntity(entityData, fieldNameB, linkedEntitiesB) + .map( + linkedEntityB -> { + Map fieldsToAttributes = entityData.getFieldsToValues(); + + // remove fields that are passed as objects to constructor + fieldsToAttributes.keySet().remove(fieldNameA); + fieldsToAttributes.keySet().remove(fieldNameB); + + // build resulting entity data + return createEntityData.apply(entityData, linkedEntityA, linkedEntityB); + })); } /** - * Enriches the given, untyped entity data with the provided asset type + * todo javadoc * - * @param untypedEntityData Untyped entity data to enrich - * @param assetType Asset type to add - * @param Type of the asset type - * @return The enriched entity data - */ - protected TypedConnectorInputEntityData addTypeToEntityData( - ConnectorInputEntityData untypedEntityData, T assetType) { - Map fieldsToAttributes = untypedEntityData.getFieldsToValues(); - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(TYPE); - - // build result object - return new TypedConnectorInputEntityData<>( - fieldsToAttributes, - untypedEntityData.getTargetClass(), - untypedEntityData.getOperatorInput(), - untypedEntityData.getNodeA(), - untypedEntityData.getNodeB(), - assetType); - } - - /** - * Returns either the first instance of a {@link OperatorInput} in the provided collection of or - * {@link OperatorInput#NO_OPERATOR_ASSIGNED} + *

Checks if the requested type of asset can be found in the provided collection of types based + * on the provided fields to values mapping. The provided fields to values mapping needs to have + * one and only one field with key {@link #TYPE} and a corresponding UUID value. If the type can + * be found in the provided collection based on the UUID it is returned wrapped in a {@link + * Success}. Otherwise, a {@link Failure} is returned and a warning is logged. * - * @param operators the collections of {@link OperatorInput}s that should be searched in - * @param operatorUuid the operator uuid that is requested - * @return either the first found instancen of {@link OperatorInput} or {@link - * OperatorInput#NO_OPERATOR_ASSIGNED} + * @param entityData The entity data of the entity that provides a link to another entity + * @param fieldName The field name of the field that provides the UUID of the linked entity + * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity + * data + * @param the type of the resulting linked entity instance + * @return a {@link Success} containing the entity or a {@link Failure} if the entity cannot be + * found */ - protected OperatorInput getFirstOrDefaultOperator( - Map operators, - Optional operatorUuid, - String entityClassName, - String requestEntityUuid) { - if (operatorUuid.isEmpty()) { - log.warn( - "Input source for class '{}' is missing the 'operator' field. " - + "This is okay, but you should consider fixing the file by adding the field. " - + "Defaulting to 'NO OPERATOR ASSIGNED'", - entityClassName); - return OperatorInput.NO_OPERATOR_ASSIGNED; - } else { - return Optional.ofNullable(operators.get(operatorUuid.get())) - .orElseGet( - () -> { - log.debug( - "Cannot find operator with uuid '{}' for element '{}' and uuid '{}'. Defaulting to 'NO OPERATOR ASSIGNED'.", - operatorUuid, - entityClassName, - requestEntityUuid); - return OperatorInput.NO_OPERATOR_ASSIGNED; - }); - } + protected static Try getLinkedEntity( + EntityData entityData, String fieldName, Map linkedEntities) { + + return Try.of(() -> entityData.getUUID(fieldName), FactoryException.class) + .transformF( + exception -> + new SourceException( + "Extracting UUID field " + + fieldName + + " from entity data " + + entityData.toString() + + " failed.", + exception)) + .flatMap( + entityUuid -> + getEntity(entityUuid, linkedEntities) + .transformF( + exception -> + new SourceException( + "Linked entity " + + fieldName + + " was not found for entity " + + entityData.toString(), + exception))); } /** - * Returns a stream of tries of {@link NodeAssetInputEntityData} that can be used to build - * instances of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} - * that consumes this data. param assetInputEntityDataStream + * Enhances given entity data with an entity from the given entity map or the default value. The + * linked entity is chosen by taking into account the UUID found by retrieving the field with + * given fieldName from entityData. If no entity is linked, the default value is used. * - * @param assetInputEntityDataStream a stream consisting of {@link AssetInputEntityData} that is - * enriched with {@link NodeInput} data - * @param nodes a collection of {@link NodeInput} entities that should be used to build the data - * @return stream of the entity data wrapped in a {@link Try} + * @param entityData The entity data of the entity that provides a link to another entity via UUID + * @param fieldName The field name of the field that provides the UUID of the linked entity + * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity + * data + * @param defaultEntity The default linked entity to use, if no actual linked entity could be + * found + * @param createEntityData The function that creates the resulting entity data given entityData + * and the linked entity + * @param Type of input entity data + * @param Type of the linked entity + * @param Type of resulting entity data that combines the given entityData and linked entity + * @return {@link Try} to enhanced data */ - protected Stream> nodeAssetInputEntityDataStream( - Stream assetInputEntityDataStream, Map nodes) { - return assetInputEntityDataStream - .parallel() + protected static + Try optionallyEnrichEntityData( + E entityData, + String fieldName, + Map linkedEntities, + T defaultEntity, + BiFunction createEntityData) { + return entityData + .getFieldOptional(fieldName) + .filter(s -> !s.isBlank()) .map( - assetInputEntityData -> { - // get the raw data - Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); - // get the node of the entity - UUID nodeUuid = UUID.fromString(fieldsToAttributes.get(NODE)); - Optional node = Optional.ofNullable(nodes.get(nodeUuid)); - - // if the node is not present we return an empty element and - // log a warning - if (node.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - assetInputEntityData.getTargetClass().getSimpleName(), - fieldsToAttributes.get("uuid"), - fieldsToAttributes.get("id"), - NODE + ": " + nodeUuid); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } + // Entity data includes a proper UUID for the desired entity + uuidString -> + Try.of(() -> UUID.fromString(uuidString), IllegalArgumentException.class) + .transformF( + iae -> + new SourceException( + String.format( + "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", + fieldName, uuidString), + iae)) + .flatMap( + entityUuid -> + getEntity(entityUuid, linkedEntities) + .transformF( + exception -> + new SourceException( + "Linked entity " + + fieldName + + " was not found for entity of class" + + entityData.getTargetClass().getSimpleName(), + exception)))) + .orElseGet( + () -> { + // No UUID was given (column does not exist, or field is empty), + // this is totally fine - we return the default value + log.debug( + "Input source for class {} is missing the '{}' field. " + + "Default value '{}' is used.", + entityData.getTargetClass().getSimpleName(), + fieldName, + defaultEntity); + return new Try.Success<>(defaultEntity); + }) + .map( + linkedEntity -> { + Map fieldsToAttributes = entityData.getFieldsToValues(); // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(NODE); + fieldsToAttributes.keySet().remove(fieldName); - return new Success<>(new NodeAssetInputEntityData(assetInputEntityData, node.get())); + // build resulting entity data + return createEntityData.apply(entityData, linkedEntity); }); } + private static Try getEntity(UUID uuid, Map entityMap) { + return Optional.ofNullable(entityMap.get(uuid)) + // We either find a matching entity for given UUID, thus return a success + .map(entity -> (Try) new Try.Success(entity)) + // ... or find no matching entity, returning a failure. + .orElse( + new Try.Failure<>( + new SourceException("Entity with uuid " + uuid + " was not provided."))); + } + // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** @@ -236,44 +261,84 @@ protected Stream> nodeAssetInputE * NodeAssetInputEntityData} and their corresponding factory. * * @param entityClass the entity class that should be build - * @param factory the factory that should be used for the building process * @param nodes a collection of {@link NodeInput} entities that should be used to build the * entities * @param operators a collection of {@link OperatorInput} entities should be used to build the * entities - * @param Type of the {@link AssetInput} to expect * @return stream of tries of the entities that has been built by the factory */ - public Set> buildNodeAssetEntities( - Class entityClass, - EntityFactory factory, + protected Stream> buildNodeAssetEntityData( + Class entityClass, Map operators, Map nodes) { - return nodeAssetEntityStream(entityClass, factory, operators, nodes) - .collect(Collectors.toSet()); + return nodeAssetInputEntityDataStream(buildAssetInputEntityData(entityClass, operators), nodes); } - protected Stream> nodeAssetEntityStream( - Class entityClass, - EntityFactory factory, - Map operators, - Map nodes) { - return nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes) - .map(factory::get); + /** + * Returns a stream of tries of {@link NodeAssetInputEntityData} that can be used to build + * instances of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} + * that consumes this data. + * + * @param assetInputEntityDataStream a stream consisting of {@link AssetInputEntityData} that is + * enriched with {@link NodeInput} data + * @param nodes a collection of {@link NodeInput} entities that should be used to build the data + * @return stream of the entity data wrapped in a {@link Try} + */ + protected static Stream> + nodeAssetInputEntityDataStream( + Stream> assetInputEntityDataStream, + Map nodes) { + return assetInputEntityDataStream + .parallel() + .map( + assetInputEntityDataTry -> + assetInputEntityDataTry.flatMap( + assetInputEntityData -> + enrichEntityData( + assetInputEntityData, NODE, nodes, NodeAssetInputEntityData::new))); } - public Set> buildAssetInputEntities( - Class entityClass, - EntityFactory factory, - Map operators) { - return assetInputEntityStream(entityClass, factory, operators).collect(Collectors.toSet()); + /** + * Returns a stream of optional {@link AssetInputEntityData} that can be used to build instances + * of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} that + * consumes this data. + * + * @param entityClass the entity class that should be build + * @param operators a collection of {@link OperatorInput} entities that should be used to build + * the data + * @return stream of the entity data wrapped in a {@link Try} + */ + protected Stream> buildAssetInputEntityData( + Class entityClass, Map operators) { + return assetInputEntityDataStream(buildEntityData(entityClass), operators); } - protected Stream> assetInputEntityStream( - Class entityClass, - EntityFactory factory, + /** + * Returns a stream of tries of {@link AssetInputEntityData} that can be used to build instances + * of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} that + * consumes this data. + * + * @param entityDataStream a stream consisting of {@link EntityData} that is enriched with {@link + * OperatorInput} data + * @param operators a collection of {@link OperatorInput} entities that should be used to build + * the data + * @return stream of the entity data wrapped in a {@link Try} + */ + private static Stream> assetInputEntityDataStream( + Stream> entityDataStream, Map operators) { - return assetInputEntityDataStream(entityClass, operators).map(factory::get); + return entityDataStream + .parallel() + .map( + entityDataTry -> + entityDataTry.flatMap( + entityData -> + optionallyEnrichEntityData( + entityData, + OPERATOR, + operators, + OperatorInput.NO_OPERATOR_ASSIGNED, + AssetInputEntityData::new))); } /** @@ -282,41 +347,14 @@ protected Stream> assetInputEnti * consumes this data. * * @param entityClass the entity class that should be build - * @param operators a collection of {@link OperatorInput} entities that should be used to build - * the data * @param type of the entity that should be build * @return stream of the entity data wrapped in a {@link Try} */ - protected Stream assetInputEntityDataStream( - Class entityClass, Map operators) { + private Stream> buildEntityData( + Class entityClass) { return dataSource .getSourceData(entityClass) - .map( - fieldsToAttributes -> - createAssetInputEntityData(entityClass, fieldsToAttributes, operators)); - } - - protected AssetInputEntityData createAssetInputEntityData( - Class entityClass, - Map fieldsToAttributes, - Map operators) { - - // get the operator of the entity - Optional operatorUuid = - Optional.ofNullable(fieldsToAttributes.get(OPERATOR)) - .filter(s -> !s.isBlank()) - .map(UUID::fromString); - OperatorInput operator = - getFirstOrDefaultOperator( - operators, - operatorUuid, - entityClass.getSimpleName(), - safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP)); - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().removeAll(new HashSet<>(Collections.singletonList(OPERATOR))); - - return new AssetInputEntityData(fieldsToAttributes, entityClass, operator); + .map(fieldsToAttributes -> new Success<>(new EntityData(fieldsToAttributes, entityClass))); } /** @@ -327,7 +365,7 @@ protected AssetInputEntityData createAssetInputEntityData * @param Type of the {@link UniqueEntity} to expect * @return stream of {@link SimpleEntityData} */ - protected Stream simpleEntityDataStream( + protected Stream buildSimpleEntityData( Class entityClass) { return dataSource .getSourceData(entityClass) diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index 72982144b..a487f01bc 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.exceptions.GraphicSourceException; import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputEntityData; import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputFactory; import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputEntityData; @@ -22,7 +23,6 @@ import edu.ie3.datamodel.utils.Try; import edu.ie3.datamodel.utils.Try.*; import java.util.*; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -83,7 +83,7 @@ public GraphicElements getGraphicElements() throws SourceException { /** * If the set of {@link NodeInput} entities is not exhaustive for all available {@link * NodeGraphicInput} entities or if an error during the building process occurs a {@link - * SourceException} is thrown, else all entities that has been able to be built are returned. + * SourceException} is thrown, else all entities that have been able to be built, are returned. */ public Set getNodeGraphicInput() throws SourceException { return getNodeGraphicInput(rawGridSource.getNodes(typeSource.getOperators())); @@ -91,19 +91,15 @@ public Set getNodeGraphicInput() throws SourceException { public Set getNodeGraphicInput(Map nodes) throws SourceException { - return Try.scanCollection( - buildNodeGraphicEntityData(nodes) - .map(nodeGraphicInputFactory::get) - .collect(Collectors.toSet()), - NodeGraphicInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + buildNodeGraphicEntityData(nodes).map(nodeGraphicInputFactory::get), + NodeGraphicInput.class); } /** * If the set of {@link LineInput} entities is not exhaustive for all available {@link * LineGraphicInput} entities or if an error during the building process occurs a {@link - * SourceException} is thrown, else all entities that has been able to be built are returned. + * SourceException} is thrown, else all entities that have been able to be built are returned. */ public Set getLineGraphicInput() throws SourceException { Map operators = typeSource.getOperators(); @@ -114,13 +110,9 @@ public Set getLineGraphicInput() throws SourceException { public Set getLineGraphicInput(Map lines) throws SourceException { - return Try.scanCollection( - buildLineGraphicEntityData(lines) - .map(lineGraphicInputFactory::get) - .collect(Collectors.toSet()), - LineGraphicInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + buildLineGraphicEntityData(lines).map(lineGraphicInputFactory::get), + LineGraphicInput.class); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @@ -145,32 +137,13 @@ protected Stream> buildNodeGrap Map nodes) { return dataSource .getSourceData(NodeGraphicInput.class) - .map(fieldsToAttributes -> buildNodeGraphicEntityData(fieldsToAttributes, nodes)); - } - - protected Try buildNodeGraphicEntityData( - Map fieldsToAttributes, Map nodes) { - - // get the node of the entity - UUID nodeUuid = UUID.fromString(fieldsToAttributes.get(NODE)); - Optional node = Optional.ofNullable(nodes.get(nodeUuid)); - - // if the node is not present we return a failure - // log a warning - if (node.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - NodeGraphicInput.class.getSimpleName(), - fieldsToAttributes.get("uuid"), - "no id (graphic entities don't have one)", - NODE + ": " + nodeUuid); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(NODE); - - return new Success<>(new NodeGraphicInputEntityData(fieldsToAttributes, node.get())); + .map( + fieldsToAttributes -> + enrichEntityData( + new EntityData(fieldsToAttributes, NodeGraphicInput.class), + NODE, + nodes, + NodeGraphicInputEntityData::new)); } /** @@ -192,31 +165,12 @@ protected Stream> buildLineGrap Map lines) { return dataSource .getSourceData(LineGraphicInput.class) - .map(fieldsToAttributes -> buildLineGraphicEntityData(fieldsToAttributes, lines)); - } - - protected Try buildLineGraphicEntityData( - Map fieldsToAttributes, Map lines) { - - // get the node of the entity - UUID lineUuid = UUID.fromString(fieldsToAttributes.get("line")); - Optional line = Optional.ofNullable(lines.get(lineUuid)); - - // if the node is not present we return an empty element and - // log a warning - if (line.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - LineGraphicInput.class.getSimpleName(), - fieldsToAttributes.get("uuid"), - "no id (graphic entities don't have one)", - "line: " + lineUuid); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove("line"); - - return new Success<>(new LineGraphicInputEntityData(fieldsToAttributes, line.get())); + .map( + fieldsToAttributes -> + enrichEntityData( + new EntityData(fieldsToAttributes, LineGraphicInput.class), + "line", + lines, + LineGraphicInputEntityData::new)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index c38047193..2783c0adc 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -27,7 +27,6 @@ import edu.ie3.datamodel.utils.Try.*; import java.util.*; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; /** @@ -166,7 +165,7 @@ public Map getNodes() throws SourceException { */ public Map getNodes(Map operators) throws SourceException { return unpackMap( - assetInputEntityDataStream(NodeInput.class, operators).map(nodeInputFactory::get), + buildAssetInputEntityData(NodeInput.class, operators).map(nodeInputFactory::get), NodeInput.class); } @@ -256,17 +255,14 @@ public Set get2WTransformers( Map transformer2WTypes, Map operators) throws SourceException { - return Try.scanCollection( - typedEntityStream( - Transformer2WInput.class, - transformer2WInputFactory, - nodes, - operators, - transformer2WTypes) - .collect(Collectors.toSet()), - Transformer2WInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + typedEntityStream( + Transformer2WInput.class, + transformer2WInputFactory, + nodes, + operators, + transformer2WTypes), + Transformer2WInput.class); } /** @@ -311,12 +307,10 @@ public Set get3WTransformers( Map transformer3WTypeInputs, Map operators) throws SourceException { - return Try.scanCollection( - buildTransformer3WEntities( - transformer3WInputFactory, nodes, transformer3WTypeInputs, operators), - Transformer3WInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + buildTransformer3WEntities( + transformer3WInputFactory, nodes, transformer3WTypeInputs, operators), + Transformer3WInput.class); } /** @@ -396,23 +390,13 @@ public Set getMeasurementUnits() throws SourceException { */ public Set getMeasurementUnits( Map nodes, Map operators) throws SourceException { - return Try.scanCollection( - buildNodeAssetEntities( - MeasurementUnitInput.class, measurementUnitInputFactory, operators, nodes), - MeasurementUnitInput.class) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + buildNodeAssetEntityData(MeasurementUnitInput.class, operators, nodes) + .map(measurementUnitInputFactory::get), + MeasurementUnitInput.class); } // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - public Set> buildNodeInputEntities( - Class entityClass, - EntityFactory factory, - Map operators) { - return assetInputEntityDataStream(entityClass, operators) - .map(factory::get) - .collect(Collectors.toSet()); - } public Set buildUntypedConnectorInputEntities( Class entityClass, @@ -420,15 +404,14 @@ public Set buildUntypedConnectorInputEntities( Map nodes, Map operators) throws SourceException { - return Try.scanCollection( - untypedConnectorInputEntityStream(entityClass, factory, nodes, operators) - .collect(Collectors.toSet()), - entityClass) - .transformF(SourceException::new) - .getOrThrow(); + return unpackSet( + buildUntypedConnectorInputEntityData( + buildAssetInputEntityData(entityClass, operators), nodes) + .map(factory::get), + entityClass); } - public Set> buildTransformer3WEntities( + public Stream> buildTransformer3WEntities( Transformer3WInputFactory transformer3WInputFactory, Map nodes, Map transformer3WTypeInputs, @@ -436,22 +419,10 @@ public Set> buildTransformer3WEntities return buildTransformer3WEntityData( buildTypedConnectorEntityData( buildUntypedConnectorInputEntityData( - assetInputEntityDataStream(Transformer3WInput.class, operators), nodes), + buildAssetInputEntityData(Transformer3WInput.class, operators), nodes), transformer3WTypeInputs), nodes) - .map(transformer3WInputFactory::get) - .collect(Collectors.toSet()); - } - - public - Set> buildTypedEntities( - Class entityClass, - EntityFactory> factory, - Map nodes, - Map operators, - Map types) { - return typedEntityStream(entityClass, factory, nodes, operators, types) - .collect(Collectors.toSet()); + .map(transformer3WInputFactory::get); } /** @@ -472,7 +443,12 @@ Stream, SourceException>> buildTypedConnect .map( noTypeEntityDataOpt -> noTypeEntityDataOpt.flatMap( - noTypeEntityData -> findAndAddType(noTypeEntityData, availableTypes))); + noTypeEntityData -> + enrichEntityData( + noTypeEntityData, + TYPE, + availableTypes, + TypedConnectorInputEntityData::new))); } /** @@ -485,67 +461,24 @@ Stream, SourceException>> buildTypedConnect */ protected Stream> buildUntypedConnectorInputEntityData( - Stream assetInputEntityDataStream, Map nodes) { + Stream> assetInputEntityDataStream, + Map nodes) { return assetInputEntityDataStream .parallel() .map( - assetInputEntityData -> - buildUntypedConnectorInputEntityData(assetInputEntityData, nodes)); - } - - /** - * Converts a single given {@link AssetInputEntityData} in connection with a collection of known - * {@link NodeInput}s to {@link ConnectorInputEntityData}. If this is not possible, a {@link - * Failure}. - * - * @param assetInputEntityData Input entity data to convert - * @param nodes A collection of known nodes - * @return A {@link Try} to matching {@link ConnectorInputEntityData} - */ - protected Try buildUntypedConnectorInputEntityData( - AssetInputEntityData assetInputEntityData, Map nodes) { - // get the raw data - Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); - - // get the two connector nodes - UUID nodeAUuid = UUID.fromString(fieldsToAttributes.get(NODE_A)); - UUID nodeBUuid = UUID.fromString(fieldsToAttributes.get(NODE_B)); - Optional nodeA = Optional.ofNullable(nodes.get(nodeAUuid)); - Optional nodeB = Optional.ofNullable(nodes.get(nodeBUuid)); - - // if nodeA or nodeB are not present we return a failure and log a - // warning - if (nodeA.isEmpty() || nodeB.isEmpty()) { - String debugString = - Stream.of( - new AbstractMap.SimpleEntry<>(nodeA, NODE_A + ": " + nodeAUuid), - new AbstractMap.SimpleEntry<>(nodeB, NODE_B + ": " + nodeBUuid)) - .filter(entry -> entry.getKey().isEmpty()) - .map(AbstractMap.SimpleEntry::getValue) - .collect(Collectors.joining("\n")); - - String skippingMessage = - buildSkippingMessage( - assetInputEntityData.getTargetClass().getSimpleName(), - fieldsToAttributes.get("uuid"), - fieldsToAttributes.get("id"), - debugString); - - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().removeAll(new HashSet<>(Arrays.asList(NODE_A, NODE_B))); - - return new Success<>( - new ConnectorInputEntityData( - fieldsToAttributes, - assetInputEntityData.getTargetClass(), - assetInputEntityData.getOperatorInput(), - nodeA.get(), - nodeB.get())); + assetInputEntityDataTry -> + assetInputEntityDataTry.flatMap( + assetInputEntityData -> + enrichEntityData( + assetInputEntityData, + NODE_A, + nodes, + NODE_B, + nodes, + ConnectorInputEntityData::new))); } + // todo needed? private Stream> typedEntityStream( Class entityClass, @@ -555,22 +488,11 @@ Stream> typedEntityStream( Map types) { return buildTypedConnectorEntityData( buildUntypedConnectorInputEntityData( - assetInputEntityDataStream(entityClass, operators), nodes), + buildAssetInputEntityData(entityClass, operators), nodes), types) .map(factory::get); } - public - Stream> untypedConnectorInputEntityStream( - Class entityClass, - EntityFactory factory, - Map nodes, - Map operators) { - return buildUntypedConnectorInputEntityData( - assetInputEntityDataStream(entityClass, operators), nodes) - .map(factory::get); - } - /** * Enriches the Stream of tries on {@link Transformer3WInputEntityData} with the information of * the internal node. @@ -587,51 +509,9 @@ protected Stream> buildTransf .parallel() .map( typedEntityDataOpt -> - typedEntityDataOpt.flatMap(typeEntityData -> addThirdNode(typeEntityData, nodes))); - } - - /** - * Enriches the third node to the already typed entity data of a three winding transformer. If no - * matching node can be found, return a {@link Failure}. - * - * @param typeEntityData Already typed entity data - * @param nodes Yet available nodes - * @return a {@link Try} to the enriched data - */ - protected Try addThirdNode( - TypedConnectorInputEntityData typeEntityData, - Map nodes) { - - // get the raw data - Map fieldsToAttributes = typeEntityData.getFieldsToValues(); - - // get nodeC of the transformer - UUID nodeCUuid = UUID.fromString(fieldsToAttributes.get("nodeC")); - Optional nodeC = Optional.ofNullable(nodes.get(nodeCUuid)); - - // if nodeC is not present we return a failure - // log a warning - if (nodeC.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - typeEntityData.getTargetClass().getSimpleName(), - fieldsToAttributes.get("uuid"), - fieldsToAttributes.get("id"), - "nodeC: " + nodeCUuid); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove("nodeC"); - - return new Success<>( - new Transformer3WInputEntityData( - fieldsToAttributes, - typeEntityData.getTargetClass(), - typeEntityData.getOperatorInput(), - typeEntityData.getNodeA(), - typeEntityData.getNodeB(), - nodeC.get(), - typeEntityData.getType())); + typedEntityDataOpt.flatMap( + typeEntityData -> + enrichEntityData( + typeEntityData, "nodeC", nodes, Transformer3WInputEntityData::new))); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java index bc6b194d4..c0bc3fae5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java @@ -330,7 +330,7 @@ private Set getResultEntities( Class entityClass, SimpleEntityFactory factory) throws SourceException { return unpackSet( - simpleEntityDataStream(entityClass) + buildSimpleEntityData(entityClass) .map(entityData -> factory.get(entityData).map(data -> (T) data)), entityClass); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 801ba7a52..4a71536f0 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.exceptions.SystemParticipantsException; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.*; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.container.SystemParticipants; @@ -17,8 +18,6 @@ import edu.ie3.datamodel.models.input.thermal.ThermalBusInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.Failure; -import edu.ie3.datamodel.utils.Try.Success; import java.util.*; import java.util.stream.Stream; @@ -571,7 +570,7 @@ public Set getChpPlants( Map thermalStorages) throws SourceException { return unpackSet( - buildChpEntityData( + chpEntityStream( buildTypedSystemParticipantEntityData( ChpInput.class, operators, nodes, emUnits, types), thermalStorages, @@ -609,7 +608,7 @@ public Set getHeatPumps( Map thermalBuses) throws SourceException { return unpackSet( - buildHpEntityData( + hpEntityStream( buildTypedSystemParticipantEntityData( HpInput.class, operators, nodes, emUnits, types), thermalBuses) @@ -619,7 +618,7 @@ public Set getHeatPumps( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - private static Stream> buildChpEntityData( + private static Stream> chpEntityStream( Stream, SourceException>> typedEntityDataStream, Map thermalStorages, @@ -631,67 +630,13 @@ private static Stream> buildChpEntityDa typedEntityDataOpt -> typedEntityDataOpt.flatMap( typedEntityData -> - createChpEntityData(typedEntityData, thermalStorages, thermalBuses))); - } - - private static Try createChpEntityData( - SystemParticipantTypedEntityData typedEntityData, - Map thermalStorages, - Map thermalBuses) { - - // get the raw data - Map fieldsToAttributes = typedEntityData.getFieldsToValues(); - - // get the thermal storage input for this chp unit - Optional thermalStorage = - Optional.ofNullable(fieldsToAttributes.get(THERMAL_STORAGE)) - .flatMap( - thermalStorageUuid -> - Optional.ofNullable(thermalStorages.get(UUID.fromString(thermalStorageUuid)))); - - // get the thermal bus input for this chp unit - Optional thermalBus = - Optional.ofNullable(fieldsToAttributes.get("thermalBus")) - .flatMap( - thermalBusUuid -> - Optional.ofNullable(thermalBuses.get(UUID.fromString(thermalBusUuid)))); - - // if the thermal storage or the thermal bus are not present we return an - // empty element and log a warning - if (thermalStorage.isEmpty() || thermalBus.isEmpty()) { - StringBuilder sB = new StringBuilder(); - if (thermalStorage.isEmpty()) { - sB.append("thermalStorage: ") - .append(safeMapGet(fieldsToAttributes, THERMAL_STORAGE, FIELDS_TO_VALUES_MAP)); - } - if (thermalBus.isEmpty()) { - sB.append("\nthermalBus: ") - .append(safeMapGet(fieldsToAttributes, THERMAL_BUS, FIELDS_TO_VALUES_MAP)); - } - - String skippingMessage = - buildSkippingMessage( - typedEntityData.getTargetClass().getSimpleName(), - safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), - safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), - sB.toString()); - return new Failure<>(new SourceException("Failure due to: " + skippingMessage)); - } - - // remove fields that are passed as objects to constructor - fieldsToAttributes - .keySet() - .removeAll(new HashSet<>(Arrays.asList("thermalBus", "thermalStorage"))); - - return new Success<>( - new ChpInputEntityData( - fieldsToAttributes, - typedEntityData.getOperatorInput(), - typedEntityData.getNode(), - typedEntityData.getEm().orElse(null), - typedEntityData.getTypeInput(), - thermalBus.get(), - thermalStorage.get())); + enrichEntityData( + typedEntityData, + THERMAL_BUS, + thermalBuses, + THERMAL_STORAGE, + thermalStorages, + ChpInputEntityData::new))); } /** @@ -704,7 +649,7 @@ private static Try createChpEntityData( * HpInputEntityData} * @return stream of tries of {@link HpInputEntityData} instances */ - private static Stream> buildHpEntityData( + private static Stream> hpEntityStream( Stream, SourceException>> typedEntityDataStream, Map thermalBuses) { @@ -714,49 +659,9 @@ private static Stream> buildHpEntityData .map( typedEntityDataOpt -> typedEntityDataOpt.flatMap( - typedEntityData -> createHpEntityData(typedEntityData, thermalBuses))); - } - - private static Try createHpEntityData( - SystemParticipantTypedEntityData typedEntityData, - Map thermalBuses) { - // get the raw data - Map fieldsToAttributes = typedEntityData.getFieldsToValues(); - - // get the thermal bus input for this chp unit and try to build the entity data - Optional hpInputEntityDataOpt = - Optional.ofNullable(fieldsToAttributes.get(THERMAL_BUS)) - .flatMap( - thermalBusUuid -> - Optional.ofNullable(thermalBuses.get(UUID.fromString(thermalBusUuid))) - .map( - thermalBus -> { - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(THERMAL_BUS); - - return new HpInputEntityData( - fieldsToAttributes, - typedEntityData.getOperatorInput(), - typedEntityData.getNode(), - typedEntityData.getEm().orElse(null), - typedEntityData.getTypeInput(), - thermalBus); - })); - - // if the requested entity is not present we return an empty element and - // log a warning - if (hpInputEntityDataOpt.isEmpty()) { - String failureMessage = - buildSkippingMessage( - typedEntityData.getTargetClass().getSimpleName(), - safeMapGet(fieldsToAttributes, "uuid", FIELDS_TO_VALUES_MAP), - safeMapGet(fieldsToAttributes, "id", FIELDS_TO_VALUES_MAP), - "thermalBus: " + safeMapGet(fieldsToAttributes, THERMAL_BUS, FIELDS_TO_VALUES_MAP)); - return new Failure<>(new SourceException("Failure due to: " + failureMessage)); - } - - return new Success<>(hpInputEntityDataOpt.get()); + typedEntityData -> + enrichEntityData( + typedEntityData, THERMAL_BUS, thermalBuses, HpInputEntityData::new))); } /** @@ -777,7 +682,7 @@ private static Try createHpEntityData( Map nodes, Map emUnits, Map types) { - return buildTypedSystemParticipantEntityData( + return typedSystemParticipantEntityStream( buildSystemParticipantEntityData(entityClass, operators, nodes, emUnits), types); } @@ -797,7 +702,7 @@ private static Try createHpEntityData( */ private static Stream, SourceException>> - buildTypedSystemParticipantEntityData( + typedSystemParticipantEntityStream( Stream> systemParticipantEntityDataStream, Map types) { @@ -807,39 +712,21 @@ private static Try createHpEntityData( participantEntityDataTry -> participantEntityDataTry.flatMap( participantEntityData -> - createTypedSystemParticipantEntityData(participantEntityData, types))); - } - - private static - Try, SourceException> - createTypedSystemParticipantEntityData( - SystemParticipantEntityData systemParticipantEntityData, Map types) { - return getAssetType( - types, - systemParticipantEntityData.getFieldsToValues(), - systemParticipantEntityData.getClass().getSimpleName()) - .map( - // if the operation was successful, transform and return to the data - assetType -> { - Map fieldsToAttributes = - systemParticipantEntityData.getFieldsToValues(); - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(TYPE); - - return new SystemParticipantTypedEntityData<>(systemParticipantEntityData, assetType); - }); + enrichEntityData( + participantEntityData, + TYPE, + types, + SystemParticipantTypedEntityData::new))); } - private - Stream> buildSystemParticipantEntityData( - Class entityClass, + private Stream> + buildSystemParticipantEntityData( + Class entityClass, Map operators, Map nodes, Map emUnits) { - return buildSystemParticipantEntityData( - nodeAssetInputEntityDataStream(assetInputEntityDataStream(entityClass, operators), nodes), - emUnits); + return systemParticipantEntityStream( + buildNodeAssetEntityData(entityClass, operators, nodes), emUnits); } /** @@ -854,52 +741,20 @@ Stream> buildSystemParticipant * @return a stream of tries of {@link SystemParticipantEntityData} instances */ private static Stream> - buildSystemParticipantEntityData( + systemParticipantEntityStream( Stream> nodeAssetEntityDataStream, Map emUnits) { return nodeAssetEntityDataStream .parallel() .map( - nodeAssetInputEntityDataOpt -> - nodeAssetInputEntityDataOpt.flatMap( + nodeAssetInputEntityDataTry -> + nodeAssetInputEntityDataTry.flatMap( nodeAssetInputEntityData -> - createSystemParticipantEntityData(nodeAssetInputEntityData, emUnits))); - } - - private static Try - createSystemParticipantEntityData( - NodeAssetInputEntityData nodeAssetInputEntityData, Map emUnits) { - - Map fieldsToAttributes = nodeAssetInputEntityData.getFieldsToValues(); - - Try, SourceException> tryEm = - Optional.ofNullable( - nodeAssetInputEntityData.getUUID(SystemParticipantInputEntityFactory.EM)) - .map( - // System participant has given a proper UUID for EM. In case of success, we wrap in - // Optional - emUuid -> getEntity(emUuid, emUnits).map(Optional::of)) - // No UUID was given (column does not exist, or field is empty), - // this is totally fine - we return an "empty success" - .orElse(new Try.Success<>(Optional.empty())); - - return tryEm.map( - // if the operation was successful, transform and return to the data - optionalEm -> { - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(SystemParticipantInputEntityFactory.EM); - - return new SystemParticipantEntityData(nodeAssetInputEntityData, optionalEm.orElse(null)); - }); - } - - private static Try getEntity(UUID uuid, Map entityMap) { - return Optional.ofNullable(entityMap.get(uuid)) - // We either find a matching entity for given UUID, thus return a success - .map(entity -> (Try) new Try.Success(entity)) - // ... or find no matching entity, returning a failure. - .orElse( - new Try.Failure<>( - new SourceException("Entity with uuid " + uuid + " was not provided."))); + optionallyEnrichEntityData( + nodeAssetInputEntityData, + SystemParticipantInputEntityFactory.EM, + emUnits, + null, + SystemParticipantEntityData::new))); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index a8e5d3e11..84afd2e44 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -5,8 +5,6 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.exceptions.FailureException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.input.*; import edu.ie3.datamodel.models.UniqueEntity; @@ -16,14 +14,15 @@ import edu.ie3.datamodel.models.input.thermal.ThermalHouseInput; import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput; import edu.ie3.datamodel.utils.Try; -import edu.ie3.datamodel.utils.Try.*; -import java.util.*; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; /** - * Interface that provides the capability to build thermal {@link + * todo javadoc Interface that provides the capability to build thermal {@link * edu.ie3.datamodel.models.input.AssetInput} entities from persistent data e.g. .csv files or * databases * @@ -83,7 +82,8 @@ public Map getThermalBuses() throws SourceException { public Map getThermalBuses(Map operators) throws SourceException { return unpackMap( - assetInputEntityStream(ThermalBusInput.class, thermalBusInputFactory, operators), + buildAssetInputEntityData(ThermalBusInput.class, operators) + .map(thermalBusInputFactory::get), ThermalBusInput.class); } @@ -172,11 +172,9 @@ public Map getThermalHouses( Map operators, Map thermalBuses) throws SourceException { return unpackMap( - assetInputEntityDataStream(ThermalHouseInput.class, operators) - .flatMap( - assetInputEntityData -> - buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(thermalHouseInputFactory::get)), + thermalUnitInputEntityDataStream( + buildAssetInputEntityData(ThermalHouseInput.class, operators), thermalBuses) + .map(thermalHouseInputFactory::get), ThermalHouseInput.class); } @@ -191,9 +189,10 @@ public Map getThermalHouses( * @return a set of object and uuid unique {@link CylindricalStorageInput} entities */ public Set getCylindricalStorages() throws SourceException { - return buildCylindricalStorageInputEntities(cylindricalStorageInputFactory) - .transformF(SourceException::new) - .getOrThrow(); + Map operators = typeSource.getOperators(); + Map thermalBuses = getThermalBuses(); + + return getCylindricalStorages(operators, thermalBuses); } /** @@ -221,71 +220,37 @@ public Set getCylindricalStorages( Map operators, Map thermalBuses) throws SourceException { return unpackSet( - buildCylindricalStorageInputEntities( - cylindricalStorageInputFactory, operators, thermalBuses), + thermalUnitInputEntityDataStream( + buildAssetInputEntityData(CylindricalStorageInput.class, operators), thermalBuses) + .map(cylindricalStorageInputFactory::get), CylindricalStorageInput.class); } - // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - - protected Stream> - buildThermalUnitInputEntityData( - AssetInputEntityData assetInputEntityData, Map thermalBuses) { - - // get the raw data - Map fieldsToAttributes = assetInputEntityData.getFieldsToValues(); - - // get the thermal bus input for this chp unit - UUID thermalBusUuid = UUID.fromString(fieldsToAttributes.get("thermalbus")); - Optional thermalBus = Optional.ofNullable(thermalBuses.get(thermalBusUuid)); - - // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().removeAll(new HashSet<>(Collections.singletonList("thermalbus"))); - - // if the type is not present we return an empty element and - // log a warning - if (thermalBus.isEmpty()) { - String skippingMessage = - buildSkippingMessage( - assetInputEntityData.getTargetClass().getSimpleName(), - fieldsToAttributes.get("uuid"), - fieldsToAttributes.get("id"), - "thermalBus: " + thermalBusUuid); - return Stream.of(new Failure<>(new SourceException("Failure due to: " + skippingMessage))); - } - - return Stream.of( - new Success<>( - new ThermalUnitInputEntityData( - assetInputEntityData.getFieldsToValues(), - assetInputEntityData.getTargetClass(), - assetInputEntityData.getOperatorInput(), - thermalBus.get()))); - } - - public Try, FailureException> buildCylindricalStorageInputEntities( - CylindricalStorageInputFactory factory) throws SourceException { - Map thermalBuses = getThermalBuses(); - - return Try.scanCollection( - assetInputEntityDataStream(CylindricalStorageInput.class, typeSource.getOperators()) - .flatMap( - assetInputEntityData -> - buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(factory::get)) - .collect(Collectors.toSet()), - CylindricalStorageInput.class); - } - - public Stream> - buildCylindricalStorageInputEntities( - CylindricalStorageInputFactory factory, - Map operators, + /** + * Enriches a given stream of {@link AssetInputEntityData} {@link Try} objects with a type of + * {@link ThermalBusInput} based on the provided collection of types and the fields to values + * mapping that inside the already provided {@link AssetInputEntityData} instance. + * + * @param assetInputEntityDataStream the data stream of {@link AssetInputEntityData} {@link Try} + * objects + * @param thermalBuses the thermal buses that should be used for enrichment and to build {@link + * ThermalUnitInputEntityData} from + * @return a stream of tries of {@link ThermalUnitInputEntityData} instances + */ + private static Stream> + thermalUnitInputEntityDataStream( + Stream> assetInputEntityDataStream, Map thermalBuses) { - return assetInputEntityDataStream(CylindricalStorageInput.class, operators) - .flatMap( - assetInputEntityData -> - buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses) - .map(factory::get)); + return assetInputEntityDataStream + .parallel() + .map( + assetInputEntityDataTry -> + assetInputEntityDataTry.flatMap( + assetInputEntityData -> + enrichEntityData( + assetInputEntityData, + "thermalbus", + thermalBuses, + ThermalUnitInputEntityData::new))); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 75d86f0c6..8671ebad7 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -63,8 +63,7 @@ public TypeSource(DataSource dataSource) { */ public Map getTransformer2WTypes() throws SourceException { return unpackMap( - simpleEntityDataStream(Transformer2WTypeInput.class) - .map(transformer2WTypeInputFactory::get), + buildSimpleEntityData(Transformer2WTypeInput.class).map(transformer2WTypeInputFactory::get), Transformer2WTypeInput.class); } @@ -78,7 +77,7 @@ public Map getTransformer2WTypes() throws SourceEx */ public Map getOperators() throws SourceException { return unpackMap( - simpleEntityDataStream(OperatorInput.class).map(operatorInputFactory::get), + buildSimpleEntityData(OperatorInput.class).map(operatorInputFactory::get), OperatorInput.class); } @@ -92,7 +91,7 @@ public Map getOperators() throws SourceException { */ public Map getLineTypes() throws SourceException { return unpackMap( - simpleEntityDataStream(LineTypeInput.class).map(lineTypeInputFactory::get), + buildSimpleEntityData(LineTypeInput.class).map(lineTypeInputFactory::get), LineTypeInput.class); } @@ -107,8 +106,7 @@ public Map getLineTypes() throws SourceException { */ public Map getTransformer3WTypes() throws SourceException { return unpackMap( - simpleEntityDataStream(Transformer3WTypeInput.class) - .map(transformer3WTypeInputFactory::get), + buildSimpleEntityData(Transformer3WTypeInput.class).map(transformer3WTypeInputFactory::get), Transformer3WTypeInput.class); } @@ -203,7 +201,7 @@ public Map getEvTypes() throws SourceException { @SuppressWarnings("unchecked") private Stream> buildEntities( Class entityClass, EntityFactory factory) { - return simpleEntityDataStream(entityClass) + return buildSimpleEntityData(entityClass) .map(data -> (Try) factory.get(data)); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java similarity index 95% rename from src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java rename to src/main/java/edu/ie3/datamodel/models/input/EmInput.java index a169c6c1b..6df13c3fd 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java @@ -3,11 +3,9 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.models.input.system; +package edu.ie3.datamodel.models.input; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.AssetInput; -import edu.ie3.datamodel.models.input.OperatorInput; import java.util.Objects; import java.util.UUID; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java index e0bd7aca5..5ebb38e9d 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/BmInput.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java index cbb50f11b..1478c949b 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.io.extractor.HasThermalStorage; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java index 8b3e96088..b4796b844 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java index b0496b5f7..8513edd5c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java @@ -6,6 +6,7 @@ package edu.ie3.datamodel.models.input.system; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java index baf2e61c5..b765ca695 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java index 1c0dd2370..89771ae58 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.io.extractor.HasThermalBus; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 1889e2937..196952d65 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.models.*; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java index abe86cd09..2117ef313 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java index ff56bf7ad..ed37c1448 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java index 0a0c6a42c..378742074 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.io.extractor.HasNodes; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java index 47e66feea..05d170e59 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java @@ -7,6 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java index d27667b8f..0935b4b5b 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java @@ -5,12 +5,13 @@ */ package edu.ie3.datamodel.models.result.system; +import edu.ie3.datamodel.models.input.EmInput; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -/** Represents calculation results of an {@link edu.ie3.datamodel.models.input.system.EmInput} */ +/** Represents calculation results of an {@link EmInput} */ public class EmResult extends SystemParticipantResult { /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy index 48b7a5410..bd9e10266 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy @@ -9,6 +9,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.BmInput @@ -48,11 +49,12 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = BmInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(BmTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -72,6 +74,7 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert !marketReaction assert costControlled diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy index eba32b0f9..aedb04fce 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.ChpInput @@ -47,13 +48,14 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = ChpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(ChpTypeInput) def thermalBusInput = Mock(ThermalBusInput) def thermalStorageInput = Mock(ThermalStorageInput) when: Try input = inputFactory.get( - new ChpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput, thermalStorageInput)) + new ChpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput, thermalStorageInput)) then: input.success @@ -73,6 +75,7 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy index ccc0379db..2c49ac48c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy @@ -7,8 +7,8 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.utils.Try import spock.lang.Specification diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy index 34a68ea5c..b9c492de7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvInput @@ -44,11 +45,12 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(EvTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy index 10d2be4f1..7f59dedd2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvcsInput @@ -55,10 +55,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -78,6 +79,7 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PowerSystemUnits.PU), Quantities.getQuantity(1d, PowerSystemUnits.PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == ChargingPointTypeUtils.HouseholdSocket assert chargingPoints == Integer.parseInt(parameter["chargingpoints"]) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) @@ -104,10 +106,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.failure @@ -132,10 +135,11 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.failure 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 2b3e7c345..e209d1f08 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 @@ -8,8 +8,8 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput @@ -47,9 +47,10 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe def inputClass = FixedFeedInInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: - Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -68,6 +69,7 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) } @@ -84,9 +86,10 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe ] def inputClass = FixedFeedInInput def nodeInput = Mock(NodeInput) + def emUnit = Mock(EmInput) when: - Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) + Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy index a24587257..550a088fc 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.HpInput @@ -45,12 +46,13 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = HpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(HpTypeInput) def thermalBusInput = Mock(ThermalBusInput) when: Try input = inputFactory.get( - new HpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput)) + new HpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput)) then: input.success @@ -70,6 +72,7 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert thermalBus == thermalBusInput } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy index 910d59195..c0bc33bfa 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy @@ -8,9 +8,9 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.LoadInput @@ -38,6 +38,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { given: "a system participant input type factory and model data" def inputClass = LoadInput def nodeInput = Mock(NodeInput) + def emUnit = Mock(EmInput) when: def inputFactory = new LoadInputFactory() @@ -52,7 +53,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { "cosphirated" : "5" ] Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) + new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) then: input.success @@ -69,6 +70,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert loadProfile == profile assert dsm assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy index a3a6d42ae..6c56ecd4f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy @@ -10,6 +10,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.PvInput @@ -54,10 +55,11 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = PvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) + new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success @@ -77,6 +79,7 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert albedo == Double.parseDouble(parameter["albedo"]) assert azimuth == getQuant(parameter["azimuth"], StandardUnits.AZIMUTH) assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy index 453e294f2..d20685662 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.StorageInput @@ -44,11 +45,12 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper def inputClass = StorageInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(StorageTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy index e97d47a09..d258837ec 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy @@ -8,6 +8,7 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.WecInput @@ -45,11 +46,12 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = WecInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) + def emUnit = Mock(EmInput) def typeInput = Mock(WecTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) then: input.success @@ -68,6 +70,7 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } + assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f3e89647b..f34873c24 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -6,6 +6,7 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.source.TimeSeriesMappingSource +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -20,7 +21,6 @@ import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.input.system.BmInput import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 5fffb0fa1..296be7a8c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -11,6 +11,7 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 3ae4943b1..21c527359 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -17,6 +17,7 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -25,7 +26,6 @@ import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput -import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput @@ -170,7 +170,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, - EnergyManagementTestData.emInput + SystemParticipantTestData.emInput ]) csvFileSink.shutdown() diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index acf8ee7c1..17b93bbfd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -50,7 +50,7 @@ class EntitySourceTest extends Specification { def "A CsvDataSource should be able to handle the extraction process of an asset type correctly"() { when: - def assetTypeOpt = dummyEntitySource.getAssetType(types, fieldsToAttributes, "TestClassName") + def assetTypeOpt = dummyEntitySource.getLinkedEntity(types, fieldsToAttributes, "TestClassName") then: assetTypeOpt.data.present == resultIsPresent diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 4bafff366..4ac22b127 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.models.input.system +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index 0345a4acc..c915b0f35 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -8,6 +8,7 @@ package edu.ie3.test.common import static edu.ie3.datamodel.models.StandardUnits.* import edu.ie3.datamodel.models.OperationTime +import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.container.SystemParticipants From ba59ffd7182cdab0074ee1845be918b94a003159 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 15:13:34 +0100 Subject: [PATCH 06/31] Enhancing Try with commonly used methods --- .../java/edu/ie3/datamodel/utils/Try.java | 55 ++++++++ .../edu/ie3/datamodel/utils/TryTest.groovy | 121 +++++++++++++++--- 2 files changed, 157 insertions(+), 19 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/utils/Try.java b/src/main/java/edu/ie3/datamodel/utils/Try.java index 06a9a5526..df86150f1 100644 --- a/src/main/java/edu/ie3/datamodel/utils/Try.java +++ b/src/main/java/edu/ie3/datamodel/utils/Try.java @@ -11,6 +11,7 @@ import edu.ie3.datamodel.exceptions.TryException; import java.util.*; import java.util.function.Function; +import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -234,6 +235,30 @@ public abstract Try transformF( public abstract Try transform( Function successFunc, Function failureFunc); + /** + * If this is a Success, the value is returned, otherwise given default is returned. + * + * @param defaultData the value to be returned, if this is a failure. + * @return the value of a success, otherwise {@code defaultData} + */ + public abstract T getOrElse(Supplier defaultData); + + /** + * If this is a Success, it is returned, otherwise given default Try is returned. + * + * @param defaultTry the Try to be returned, if this is a failure. + * @return this try object if it is a Success, otherwise {@code defaultTry} + */ + public abstract Try orElse(Supplier> defaultTry); + + /** + * Turns this Try into an {@link Optional} by returning the wrapped value if this is a success, + * and an empty optional if this is a failure. + * + * @return an optional of the value + */ + public abstract Optional toOptional(); + /** Implementation of {@link Try} class. This class is used to present a successful try. */ public static final class Success extends Try { private final T data; @@ -298,6 +323,21 @@ public Try transform( return new Success<>(successFunc.apply(data)); } + @Override + public T getOrElse(Supplier defaultData) { + return data; + } + + @Override + public Try orElse(Supplier> defaultTry) { + return this; + } + + @Override + public Optional toOptional() { + return Optional.of(data); + } + /** Returns the stored data. */ public T get() { return data; @@ -382,6 +422,21 @@ public Try transform( return Failure.of(failureFunc.apply(exception)); } + @Override + public T getOrElse(Supplier defaultData) { + return defaultData.get(); + } + + @Override + public Try orElse(Supplier> defaultTry) { + return defaultTry.get(); + } + + @Override + public Optional toOptional() { + return Optional.empty(); + } + /** Returns the thrown exception. */ public E get() { return exception; diff --git a/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy index 4a0ff0762..61fdc9e0c 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy @@ -55,12 +55,10 @@ class TryTest extends Specification { }, FailureException) then: - Exception ex = thrown() - ex.class == TryException + TryException ex = thrown(TryException) ex.message == "Wrongly caught exception: " - Throwable cause = ex.cause - cause.class == SourceException - cause.message == "source exception" + ex.cause.class == SourceException + ex.cause.message == "source exception" } def "A failure is returned when using Failure#ofVoid() with an exception"() { @@ -102,12 +100,10 @@ class TryTest extends Specification { }, FailureException) then: - Exception ex = thrown() - ex.class == TryException + TryException ex = thrown(TryException) ex.message == "Wrongly caught exception: " - Throwable cause = ex.cause - cause.class == SourceException - cause.message == "source exception" + ex.cause.class == SourceException + ex.cause.message == "source exception" } def "A Try object can be creates by a boolean and an exception"() { @@ -160,11 +156,9 @@ class TryTest extends Specification { Try.ofVoid(FailureException, one, two) then: - Exception ex = thrown() - ex.class == TryException - Throwable cause = ex.cause - cause.class == SourceException - cause.message == "source exception" + TryException ex = thrown(TryException) + ex.cause.class == SourceException + ex.cause.message == "source exception" } def "A void method can be applied to a try object"() { @@ -241,16 +235,28 @@ class TryTest extends Specification { scan.data.get().size() == 3 } - def "The getOrThrow method should work as expected"() { + def "The getOrThrow method should work as expected on a success"() { + given: + def value = "some value" + Try success = new Try.Success<>(value) + + when: + def result = success.getOrThrow() + + then: + noExceptionThrown() + result == value + } + + def "The getOrThrow method should work as expected on a failure"() { given: Try failure = new Try.Failure<>(new SourceException("source exception")) when: - failure.orThrow + failure.getOrThrow() then: - Exception ex = thrown() - ex.class == SourceException + SourceException ex = thrown(SourceException) ex.message == "source exception" } @@ -311,6 +317,83 @@ class TryTest extends Specification { flatMapF.exception.get() == failure.get() } + def "The getOrElse method should work as expected on a success"() { + given: + def value = "some value" + Try success = new Try.Success<>(value) + + when: + def result = success.getOrElse(() -> "other") + + then: + result == value + } + + def "The getOrElse method should work as expected on a failure"() { + given: + Try failure = new Try.Failure<>(new SourceException("source exception")) + def defaultString = "other" + + when: + def result = failure.getOrElse(() -> defaultString) + + then: + result == defaultString + } + + def "The orElse method should work as expected on a success"() { + given: + def otherSuccess = new Try.Success<>("other success") + def otherFailure = new Try.Failure<>(new SourceException("other failure")) + Try success = new Try.Success<>("some value") + + when: + def result1 = success.orElse(() -> otherSuccess) + def result2 = success.orElse(() -> otherFailure) + + then: + result1 == success + result2 == success + } + + def "The orElse method should work as expected on a failure"() { + given: + def otherSuccess = new Try.Success<>("other success") + def otherFailure = new Try.Failure<>(new SourceException("other failure")) + Try failure = new Try.Failure<>(new SourceException("source exception")) + + when: + def result1 = failure.orElse(() -> otherSuccess) + def result2 = failure.orElse(() -> otherFailure) + + then: + result1 == otherSuccess + result2 == otherFailure + } + + def "The toOptional method should work as expected on a success"() { + given: + def value = "some value" + Try success = new Try.Success<>(value) + + when: + def result = success.toOptional() + + then: + result == Optional.of(value) + } + + def "The toOptional method should work as expected on a failure"() { + given: + Try failure = new Try.Failure<>(new SourceException("some failure")) + + when: + def result = failure.toOptional() + + then: + result == Optional.empty() + } + def "All exceptions of a collection of try objects should be returned"() { given: List> tries = List.of( From 3c1f0495c7c759bee7b88b8d3b91b238feb63445 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 15:26:54 +0100 Subject: [PATCH 07/31] More simplifications in entity data, implementing hierarchical EM creation --- docs/uml/main/EntitySourceClassDiagram.puml | 3 +- .../ie3/datamodel/io/factory/EntityData.java | 4 +- .../io/factory/SimpleEntityData.java | 26 ---- .../io/factory/SimpleEntityFactory.java | 23 ---- .../factory/input/EmAssetInputEntityData.java | 55 ++++++++ .../factory/input/OperatorInputFactory.java | 8 +- .../input/participant/EmInputFactory.java | 13 +- .../result/ConnectorResultFactory.java | 8 +- .../result/FlexOptionsResultFactory.java | 6 +- .../io/factory/result/NodeResultFactory.java | 6 +- .../factory/result/ResultEntityFactory.java | 5 +- .../factory/result/SwitchResultFactory.java | 6 +- .../SystemParticipantResultFactory.java | 8 +- .../factory/result/ThermalResultFactory.java | 10 +- .../timeseries/TimeSeriesMappingFactory.java | 8 +- .../TimeSeriesMetaInformationFactory.java | 8 +- .../AssetTypeInputEntityFactory.java | 5 +- .../typeinput/LineTypeInputFactory.java | 6 +- .../SystemParticipantTypeInputFactory.java | 18 +-- .../Transformer2WTypeInputFactory.java | 6 +- .../Transformer3WTypeInputFactory.java | 6 +- .../io/source/EnergyManagementSource.java | 128 +++++++++++++++++- .../ie3/datamodel/io/source/EntitySource.java | 47 +++---- .../datamodel/io/source/GraphicSource.java | 32 ++--- .../datamodel/io/source/RawGridSource.java | 35 ++--- .../io/source/ResultEntitySource.java | 7 +- .../datamodel/io/source/ThermalSource.java | 4 +- .../io/source/TimeSeriesMappingSource.java | 4 +- .../ie3/datamodel/io/source/TypeSource.java | 17 +-- .../SqlTimeSeriesMetaInformationSource.java | 6 +- .../ie3/datamodel/models/input/EmInput.java | 14 +- .../input/OperatorInputFactoryTest.groovy | 4 +- .../participant/PvInputFactoryTest.groovy | 3 +- .../result/ConnectorResultFactoryTest.groovy | 4 +- .../FlexOptionsResultFactoryTest.groovy | 6 +- .../result/NodeResultFactoryTest.groovy | 6 +- .../result/SwitchResultFactoryTest.groovy | 4 +- .../SystemParticipantResultFactoryTest.groovy | 10 +- .../result/ThermalResultFactoryTest.groovy | 6 +- .../typeinput/LineTypeInputFactoryTest.groovy | 4 +- ...stemParticipantTypeInputFactoryTest.groovy | 16 +-- .../Transformer2WTypeInputFactoryTest.groovy | 4 +- .../Transformer3WTypeInputFactoryTest.groovy | 4 +- .../io/source/EntitySourceTest.groovy | 2 +- .../io/source/csv/CsvGraphicSourceTest.groovy | 115 +++++++--------- .../models/input/system/EmInputTest.groovy | 11 +- 46 files changed, 421 insertions(+), 310 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityData.java delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java diff --git a/docs/uml/main/EntitySourceClassDiagram.puml b/docs/uml/main/EntitySourceClassDiagram.puml index 49be16965..03723a79d 100644 --- a/docs/uml/main/EntitySourceClassDiagram.puml +++ b/docs/uml/main/EntitySourceClassDiagram.puml @@ -1,5 +1,6 @@ @startuml +' todo apapt note "Assuming all classes to implement \nthe abstract methods of their interfaces\n\n" as generalNotes abstract class EntitySource { @@ -7,7 +8,7 @@ abstract class EntitySource { - Set buildNodeAssetEntities(Class, EntityFactory, Collection, Collection, ConcurrentMap, LongAdder>) - Set buildNodeAssetEntities(Class, EntityFactory, Collection, Collection) - Set buildAssetInputEntities(Class, EntityFactory, Collection) - - Set buildAssetInputEntities(Class, EntityFactory) + - Set buildAssetInputEntities(Class, EntityFactory) } EntitySource <|-- GraphicSource EntitySource <|-- RawGridSource diff --git a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java index 189279f5d..8f874087d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/EntityData.java @@ -24,7 +24,9 @@ import tech.units.indriya.ComparableQuantity; /** - * Internal API Contains data that is needed by an {@link EntityFactory} to generate an entity + * Data used by {@link EntityFactory} to create an instance of an entity than can be created based + * only on a mapping of fieldName to value. This class can be used whenever no additional data is + * needed, but also functions as a parent class for extensions. * * @version 0.1 * @since 28.01.20 diff --git a/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityData.java deleted file mode 100644 index 267255c70..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityData.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory; - -import edu.ie3.datamodel.models.UniqueEntity; -import java.util.Map; - -/** - * Data used by {@link SimpleEntityFactory} to create an instance of an entity than can be created - * based only on a mapping of fieldName to value. This class can be used whenever no additional data - * is needed, but should not be used as parent class for extensions. Use {@link EntityData} for - * extensions instead. - * - * @version 0.1 - * @since 28.01.20 - */ -public final class SimpleEntityData extends EntityData { - - public SimpleEntityData( - Map fieldsToAttributes, Class clazz) { - super(fieldsToAttributes, clazz); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityFactory.java deleted file mode 100644 index a420212c2..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/SimpleEntityFactory.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * © 2021. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory; - -import edu.ie3.datamodel.models.UniqueEntity; - -/** - * Internal API Interface for Entities that can be build without any dependencies on other complex - * pojos - * - * @version 0.1 - * @since 28.01.20 - */ -public abstract class SimpleEntityFactory - extends EntityFactory { - - protected SimpleEntityFactory(Class... allowedClasses) { - super(allowedClasses); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java new file mode 100644 index 000000000..43d6babb2 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java @@ -0,0 +1,55 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.factory.input; + +import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.input.EmInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import java.util.Map; + +/** + * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities + * which also require an EM attribute. This data object can include additional information about the + * {@link EmInput}, which cannot be provided through the attribute map as it is a complex shared + * entity. + */ +public class EmAssetInputEntityData extends AssetInputEntityData { + + private final EmInput emUnit; + + public EmAssetInputEntityData( + Map fieldsToAttributes, + Class entityClass, + EmInput emUnit) { + super(fieldsToAttributes, entityClass); + this.emUnit = emUnit; + } + + public EmAssetInputEntityData( + Map fieldsToAttributes, + Class entityClass, + OperatorInput operator, + EmInput emUnit) { + super(fieldsToAttributes, entityClass, operator); + this.emUnit = emUnit; + } + + public EmInput getEmUnit() { + return emUnit; + } + + /** + * Creates a new EmAssetInputEntityData object based on a given {@link AssetInputEntityData} + * object and given em unit + * + * @param entityData The entity data object to use attributes of + * @param emUnit The em input to use + */ + public EmAssetInputEntityData(AssetInputEntityData entityData, EmInput emUnit) { + super(entityData, entityData.getOperatorInput()); + this.emUnit = emUnit; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java index 09dcdc881..3bde8039b 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/OperatorInputFactory.java @@ -5,14 +5,14 @@ */ package edu.ie3.datamodel.io.factory.input; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.models.input.OperatorInput; import java.util.Collections; import java.util.List; import java.util.Set; -public class OperatorInputFactory extends EntityFactory { +public class OperatorInputFactory extends EntityFactory { private static final String ENTITY_UUID = "uuid"; private static final String ENTITY_ID = "id"; @@ -22,13 +22,13 @@ public OperatorInputFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set constructorParams = newSet(ENTITY_UUID, ENTITY_ID); return Collections.singletonList(constructorParams); } @Override - protected OperatorInput buildModel(SimpleEntityData data) { + protected OperatorInput buildModel(EntityData data) { return new OperatorInput(data.getUUID(ENTITY_UUID), data.getField(ENTITY_ID)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index ebfb6a7b8..30c280383 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -5,8 +5,8 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -15,18 +15,18 @@ import java.util.Set; import java.util.UUID; -public class EmInputFactory extends AssetInputEntityFactory { +public class EmInputFactory extends AssetInputEntityFactory { private static final String CONTROL_STRATEGY = "controlstrategy"; - private static final String PARENT_EM = "parentem"; + public static final String PARENT_EM = "parentem"; public EmInputFactory() { super(EmInput.class); } @Override - protected List> getFields(AssetInputEntityData data) { + protected List> getFields(EmAssetInputEntityData data) { List> fields = new ArrayList<>(super.getFields(data)); List> withEm = @@ -44,15 +44,14 @@ protected String[] getAdditionalFields() { @Override protected EmInput buildModel( - AssetInputEntityData data, + EmAssetInputEntityData data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { String controlStrategy = data.getField(CONTROL_STRATEGY); - UUID parentEm = null; - if (data.containsKey(PARENT_EM)) parentEm = data.getUUID(PARENT_EM); + EmInput parentEm = data.getEmUnit(); return new EmInput(uuid, id, operator, operationTime, controlStrategy, parentEm); } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java index 9444350ab..070f05b95 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ConnectorResultFactory.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result; import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.result.connector.ConnectorResult; @@ -44,12 +44,12 @@ public ConnectorResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData simpleEntityData) { + protected List> getFields(EntityData entityData) { /// all result models have the same constructor except StorageResult Set minConstructorParams = newSet(TIME, INPUT_MODEL, IAMAG, IAANG, IBMAG, IBANG); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); - final Class entityClass = simpleEntityData.getTargetClass(); + final Class entityClass = entityData.getTargetClass(); if (entityClass.equals(Transformer2WResult.class)) { minConstructorParams = newSet(TIME, INPUT_MODEL, IAMAG, IAANG, IBMAG, IBANG, TAPPOS); optionalFields = expandSet(minConstructorParams, ENTITY_UUID); @@ -63,7 +63,7 @@ protected List> getFields(SimpleEntityData simpleEntityData) { } @Override - protected ConnectorResult buildModel(SimpleEntityData data) { + protected ConnectorResult buildModel(EntityData data) { final Class entityClass = data.getTargetClass(); ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java index 10ccfd1ba..a891035ad 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.result; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.system.FlexOptionsResult; import java.time.ZonedDateTime; @@ -34,7 +34,7 @@ public FlexOptionsResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set minConstructorParams = newSet(TIME, INPUT_MODEL, P_REF, P_MIN, P_MAX); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); @@ -42,7 +42,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected FlexOptionsResult buildModel(SimpleEntityData data) { + protected FlexOptionsResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); UUID inputModelUuid = data.getUUID(INPUT_MODEL); ComparableQuantity pRef = data.getQuantity(P_REF, StandardUnits.ACTIVE_POWER_RESULT); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java index 9f4a9b016..7fd8b5416 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/NodeResultFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.result; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.result.NodeResult; import java.time.ZonedDateTime; @@ -33,7 +33,7 @@ public NodeResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData entityData) { + protected List> getFields(EntityData entityData) { Set minConstructorParams = newSet(TIME, INPUT_MODEL, VMAG, VANG); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); @@ -41,7 +41,7 @@ protected List> getFields(SimpleEntityData entityData) { } @Override - protected NodeResult buildModel(SimpleEntityData data) { + protected NodeResult buildModel(EntityData data) { ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); UUID inputModelUuid = data.getUUID(INPUT_MODEL); ComparableQuantity vMagValue = diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java index 15a815511..1b2bd2dc3 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ResultEntityFactory.java @@ -5,7 +5,8 @@ */ package edu.ie3.datamodel.io.factory.result; -import edu.ie3.datamodel.io.factory.SimpleEntityFactory; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.util.TimeUtil; import java.time.ZoneId; @@ -18,7 +19,7 @@ * @version 0.1 * @since 11.02.20 */ -abstract class ResultEntityFactory extends SimpleEntityFactory { +abstract class ResultEntityFactory extends EntityFactory { protected static final String ENTITY_UUID = "uuid"; protected static final String TIME = "time"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java index df24fe8ab..ebb4db615 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SwitchResultFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.result; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.result.connector.SwitchResult; import java.time.ZonedDateTime; import java.util.*; @@ -29,7 +29,7 @@ public SwitchResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set minConstructorParams = newSet(TIME, INPUT_MODEL, CLOSED); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); @@ -38,7 +38,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected SwitchResult buildModel(SimpleEntityData data) { + protected SwitchResult buildModel(EntityData data) { Optional uuidOpt = data.containsKey(ENTITY_UUID) ? Optional.of(data.getUUID(ENTITY_UUID)) : Optional.empty(); ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME)); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java index 62aa0dc03..b37cbae3c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactory.java @@ -8,7 +8,7 @@ import static tech.units.indriya.unit.Units.PERCENT; import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.result.system.*; @@ -20,7 +20,7 @@ /** * Factory class for creating {@link SystemParticipantResult} entities from provided {@link - * SimpleEntityData} data objects. + * EntityData} data objects. */ public class SystemParticipantResultFactory extends ResultEntityFactory { @@ -67,7 +67,7 @@ public SystemParticipantResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { /// all result models have the same constructor except StorageResult Set minConstructorParams = newSet(TIME, INPUT_MODEL, POWER, REACTIVE_POWER); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); @@ -87,7 +87,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected SystemParticipantResult buildModel(SimpleEntityData data) { + protected SystemParticipantResult buildModel(EntityData data) { Class entityClass = data.getTargetClass(); ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java index 2d3e2c77c..576c2947f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/result/ThermalResultFactory.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result; import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult; @@ -41,13 +41,13 @@ public ThermalResultFactory(String dtfPattern) { } @Override - protected List> getFields(SimpleEntityData simpleEntityData) { + protected List> getFields(EntityData entityData) { Set minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT); Set optionalFields = expandSet(minConstructorParams, ENTITY_UUID); - if (simpleEntityData.getTargetClass().equals(ThermalHouseResult.class)) { + if (entityData.getTargetClass().equals(ThermalHouseResult.class)) { minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT, INDOOR_TEMPERATURE); - } else if (simpleEntityData.getTargetClass().equals(CylindricalStorageResult.class)) { + } else if (entityData.getTargetClass().equals(CylindricalStorageResult.class)) { minConstructorParams = newSet(TIME, INPUT_MODEL, Q_DOT, ENERGY, FILL_LEVEL); } @@ -55,7 +55,7 @@ protected List> getFields(SimpleEntityData simpleEntityData) { } @Override - protected ThermalUnitResult buildModel(SimpleEntityData data) { + protected ThermalUnitResult buildModel(EntityData data) { Class clazz = data.getTargetClass(); ZonedDateTime zdtTime = timeUtil.toZonedDateTime(data.getField(TIME)); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java index 64aa90af4..201bdd0d4 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMappingFactory.java @@ -5,8 +5,8 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import java.util.Collections; import java.util.List; @@ -16,7 +16,7 @@ import java.util.stream.Stream; public class TimeSeriesMappingFactory - extends EntityFactory { + extends EntityFactory { private static final String UUID = "uuid"; private static final String PARTICIPANT = "participant"; private static final String TIME_SERIES = "timeSeries"; @@ -26,13 +26,13 @@ public TimeSeriesMappingFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { return Collections.singletonList( Stream.of(UUID, PARTICIPANT, TIME_SERIES).collect(Collectors.toSet())); } @Override - protected TimeSeriesMappingSource.MappingEntry buildModel(SimpleEntityData data) { + protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) { UUID uuid = data.getUUID(UUID); UUID participant = data.getUUID(PARTICIPANT); UUID timeSeries = data.getUUID(TIME_SERIES); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java index fba7317a7..46cda47f4 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesMetaInformationFactory.java @@ -5,8 +5,8 @@ */ package edu.ie3.datamodel.io.factory.timeseries; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import java.util.Collections; @@ -21,7 +21,7 @@ * mappings */ public class TimeSeriesMetaInformationFactory - extends EntityFactory { + extends EntityFactory { private static final String TIME_SERIES = "timeSeries"; private static final String COLUMN_SCHEME = "columnScheme"; @@ -30,13 +30,13 @@ public TimeSeriesMetaInformationFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { return Collections.singletonList( Stream.of(TIME_SERIES, COLUMN_SCHEME).collect(Collectors.toSet())); } @Override - protected IndividualTimeSeriesMetaInformation buildModel(SimpleEntityData data) { + protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) { UUID timeSeries = data.getUUID(TIME_SERIES); ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java index 13de960ee..a318f7621 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/AssetTypeInputEntityFactory.java @@ -5,7 +5,8 @@ */ package edu.ie3.datamodel.io.factory.typeinput; -import edu.ie3.datamodel.io.factory.SimpleEntityFactory; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.models.input.AssetTypeInput; /** @@ -17,7 +18,7 @@ * @since 11.02.20 */ abstract class AssetTypeInputEntityFactory - extends SimpleEntityFactory { + extends EntityFactory { protected static final String ENTITY_UUID = "uuid"; protected static final String ENTITY_ID = "id"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java index 609a11849..8184f569a 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.typeinput; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.util.quantities.interfaces.SpecificConductance; @@ -31,14 +31,14 @@ public LineTypeInputFactory() { } @Override - protected List> getFields(SimpleEntityData entityData) { + protected List> getFields(EntityData entityData) { Set constructorParams = newSet(ENTITY_UUID, ENTITY_ID, B, G, R, X, I_MAX, V_RATED); return Collections.singletonList(constructorParams); } @Override - protected LineTypeInput buildModel(SimpleEntityData data) { + protected LineTypeInput buildModel(EntityData data) { UUID uuid = data.getUUID(ENTITY_UUID); String id = data.getField(ENTITY_ID); ComparableQuantity b = diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java index e0aa91bdf..312cb3603 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactory.java @@ -7,7 +7,7 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.system.characteristic.WecCharacteristicInput; import edu.ie3.datamodel.models.input.system.type.*; @@ -71,7 +71,7 @@ public SystemParticipantTypeInputFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set standardConstructorParams = newSet(ENTITY_UUID, ENTITY_ID, CAP_EX, OP_EX, S_RATED, COS_PHI_RATED); @@ -105,7 +105,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected SystemParticipantTypeInput buildModel(SimpleEntityData data) { + protected SystemParticipantTypeInput buildModel(EntityData data) { UUID uuid = data.getUUID(ENTITY_UUID); String id = data.getField(ENTITY_ID); ComparableQuantity capEx = data.getQuantity(CAP_EX, StandardUnits.CAPEX); @@ -132,7 +132,7 @@ else if (data.getTargetClass().equals(StorageTypeInput.class)) } private SystemParticipantTypeInput buildEvTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, @@ -148,7 +148,7 @@ private SystemParticipantTypeInput buildEvTypeInput( } private SystemParticipantTypeInput buildHpTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, @@ -161,7 +161,7 @@ private SystemParticipantTypeInput buildHpTypeInput( } private SystemParticipantTypeInput buildBmTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, @@ -177,7 +177,7 @@ private SystemParticipantTypeInput buildBmTypeInput( } private SystemParticipantTypeInput buildWecTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, @@ -207,7 +207,7 @@ private SystemParticipantTypeInput buildWecTypeInput( } private SystemParticipantTypeInput buildChpTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, @@ -228,7 +228,7 @@ private SystemParticipantTypeInput buildChpTypeInput( } private SystemParticipantTypeInput buildStorageTypeInput( - SimpleEntityData data, + EntityData data, UUID uuid, String id, ComparableQuantity capEx, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java index a79236d49..f70dc5593 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.typeinput; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput; import java.util.Collections; @@ -36,7 +36,7 @@ public Transformer2WTypeInputFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set constructorParams = newSet( ENTITY_UUID, @@ -59,7 +59,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected Transformer2WTypeInput buildModel(SimpleEntityData data) { + protected Transformer2WTypeInput buildModel(EntityData data) { UUID uuid = data.getUUID(ENTITY_UUID); String id = data.getField(ENTITY_ID); ComparableQuantity rSc = data.getQuantity(R_SC, StandardUnits.RESISTANCE); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java index a51f2ec7b..d64b52a1e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.typeinput; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput; import java.util.Collections; @@ -42,7 +42,7 @@ public Transformer3WTypeInputFactory() { } @Override - protected List> getFields(SimpleEntityData data) { + protected List> getFields(EntityData data) { Set constructorParams = newSet( ENTITY_UUID, @@ -71,7 +71,7 @@ protected List> getFields(SimpleEntityData data) { } @Override - protected Transformer3WTypeInput buildModel(SimpleEntityData data) { + protected Transformer3WTypeInput buildModel(EntityData data) { UUID uuid = data.getUUID(ENTITY_UUID); String id = data.getField(ENTITY_ID); ComparableQuantity sRatedA = data.getQuantity(S_RATED_A, StandardUnits.S_RATED); diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 552df1163..59cae4a0b 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -5,12 +5,20 @@ */ package edu.ie3.datamodel.io.source; +import static edu.ie3.datamodel.io.factory.input.participant.EmInputFactory.PARENT_EM; + import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.EmInputFactory; import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.utils.Try; +import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class EnergyManagementSource extends EntitySource { @@ -57,8 +65,122 @@ public Map getEmUnits() throws SourceException { * @return a map of uuid to {@link EmInput} entities */ public Map getEmUnits(Map operators) throws SourceException { - return unpackMap( - buildAssetInputEntityData(EmInput.class, operators).map(emInputFactory::get), - EmInput.class); + return buildHierarchicalEmInputs(operators); + } + + private Map buildHierarchicalEmInputs(Map operators) + throws SourceException { + Stream> assetEntityDataStream = + buildAssetInputEntityData(EmInput.class, operators); + + // Split stream by failures and EMs that are themselves EM-controlled on one side, and EMs at + // root position (that have not failed so far) on the other side, which do not have parents per + // definition. + Map>> split = + assetEntityDataStream.collect( + Collectors.partitioningBy( + dataTry -> + dataTry + .map( + data -> + data.containsKey(PARENT_EM) && !data.getField(PARENT_EM).isBlank()) + .getOrElse(() -> true))); + + List> rootEmsEntityData = split.get(false); + List> others = split.get(true); + + // at the start, this is only root ems + Map allEms = + unpackMap( + rootEmsEntityData.stream() + .parallel() + .map( + entityDataTry -> + entityDataTry.map( + entityData -> new EmAssetInputEntityData(entityData, null))) + .map(emInputFactory::get), + EmInput.class); + + if (!others.isEmpty()) { + // there's more levels beyond EMs at root level. Build them recursively + Stream othersWithParentUuid = + unpack( + others.stream() + .map( + dataTry -> + dataTry.flatMap( + data -> { + // we already filtered out those entities that do not have a parent, + // so the field should exist + String uuidString = data.getField(PARENT_EM); + return Try.of( + () -> UUID.fromString(uuidString), + IllegalArgumentException.class) + .transformF( + iae -> + new SourceException( + String.format( + "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", + PARENT_EM, uuidString), + iae)) + // failed UUID parses are filtered out at this point. We save + // the parsed UUID with the asset data + .map( + parentUuid -> + new AssetDataAndValidParentUuid(data, parentUuid)); + })), + AssetDataAndValidParentUuid.class); + + allEms.putAll(buildHierarchicalEmInputs(othersWithParentUuid, allEms)); + } + + return allEms; } + + private Map buildHierarchicalEmInputs( + Stream assetEntityDataStream, Map builtEms) + throws SourceException { + + // Split stream by assets whose parent is already built (which can be built at this level), and + // those whose parents are not built yet (which have to be built at some lower recursion level + // or not at all) + Map> split = + assetEntityDataStream.collect( + Collectors.partitioningBy(data -> builtEms.containsKey(data.parentEm))); + + List toBeBuiltAtThisLevel = split.get(true); + List others = split.get(false); + + if (toBeBuiltAtThisLevel.isEmpty()) { + // Since we only start a new recursion step if the asset data stream is not empty, + // we can conclude at this point that from all asset data at this recursion level, + // no new EMs can be built - thus, parents must be missing + throw new SourceException( + "EMs " + others + " were assigned a parent EM that does not exist."); + } else { + // New EMs can be built at this level + Map newEms = + unpackMap( + toBeBuiltAtThisLevel.stream() + .map( + data -> + emInputFactory.get( + new EmAssetInputEntityData( + data.entityData, builtEms.get(data.parentEm)))), + EmInput.class); + + // This also means that if there's more EMs left to build, the new EMs might function as + // parents there + if (!others.isEmpty()) { + newEms.putAll(buildHierarchicalEmInputs(others.stream(), newEms)); + } + return newEms; + } + } + + /** + * Helper data record that holds an {@link AssetInputEntityData} and the UUID successfully parsed + * from {@link EmInputFactory#PARENT_EM} field + */ + private record AssetDataAndValidParentUuid(AssetInputEntityData entityData, UUID parentEm) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index bb273f293..20f61e40d 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -9,7 +9,6 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; @@ -27,6 +26,7 @@ /** Class that provides all functionalities to build entities */ public abstract class EntitySource { + // TODO make all subclasses static? protected static final Logger log = LoggerFactory.getLogger(EntitySource.class); @@ -163,10 +163,12 @@ protected static Try getLinkedEntit .transformF( exception -> new SourceException( - "Linked entity " + "Linked " + fieldName + + " with UUID " + + entityUuid + " was not found for entity " - + entityData.toString(), + + entityData, exception))); } @@ -215,10 +217,12 @@ Try optionallyEnrichEntityData( .transformF( exception -> new SourceException( - "Linked entity " + "Linked " + fieldName - + " was not found for entity of class" - + entityData.getTargetClass().getSimpleName(), + + " with UUID " + + entityUuid + + " was not found for entity " + + entityData, exception)))) .orElseGet( () -> { @@ -324,7 +328,7 @@ protected Stream> buildAssetInputEnti * the data * @return stream of the entity data wrapped in a {@link Try} */ - private static Stream> assetInputEntityDataStream( + protected static Stream> assetInputEntityDataStream( Stream> entityDataStream, Map operators) { return entityDataStream @@ -342,36 +346,21 @@ private static Stream> assetInputEnti } /** - * Returns a stream of optional {@link AssetInputEntityData} that can be used to build instances - * of several subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} that - * consumes this data. + * Returns a stream of optional {@link EntityData} that can be used to build instances of several + * subtypes of {@link UniqueEntity} by a corresponding {@link EntityFactory} that consumes this + * data. * * @param entityClass the entity class that should be build * @param type of the entity that should be build * @return stream of the entity data wrapped in a {@link Try} */ - private Stream> buildEntityData( + protected Stream> buildEntityData( Class entityClass) { return dataSource .getSourceData(entityClass) .map(fieldsToAttributes -> new Success<>(new EntityData(fieldsToAttributes, entityClass))); } - /** - * Returns a stream of {@link SimpleEntityData} for result entity classes, using a - * fields-to-attributes map. - * - * @param entityClass the entity class that should be build - * @param Type of the {@link UniqueEntity} to expect - * @return stream of {@link SimpleEntityData} - */ - protected Stream buildSimpleEntityData( - Class entityClass) { - return dataSource - .getSourceData(entityClass) - .map(fieldsToAttributes -> new SimpleEntityData(fieldsToAttributes, entityClass)); - } - protected static Map unpackMap( Stream> inputStream, Class entityClass) throws SourceException { return unpack(inputStream, entityClass) @@ -383,9 +372,9 @@ protected static Set unpackSet( return unpack(inputStream, entityClass).collect(Collectors.toSet()); } - private static Stream unpack( - Stream> inputStream, Class entityClass) throws SourceException { - return Try.scanStream(inputStream, entityClass.getSimpleName()) + protected static Stream unpack( + Stream> inputStream, Class clazz) throws SourceException { + return Try.scanStream(inputStream, clazz.getSimpleName()) .transformF(SourceException::new) .getOrThrow(); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index a487f01bc..8bd81a3be 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.exceptions.GraphicSourceException; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputEntityData; import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputFactory; import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputEntityData; @@ -55,7 +54,8 @@ public GraphicElements getGraphicElements() throws SourceException { // read all needed entities /// start with types and operators - Map operators = typeSource.getOperators(); + Map operators = + typeSource.getOperators(); // fixme those only need to be fetched once, if done smartly Map lineTypes = typeSource.getLineTypes(); Map nodes = rawGridSource.getNodes(operators); @@ -135,15 +135,13 @@ public Set getLineGraphicInput(Map lines) */ protected Stream> buildNodeGraphicEntityData( Map nodes) { - return dataSource - .getSourceData(NodeGraphicInput.class) + return buildEntityData(NodeGraphicInput.class) .map( - fieldsToAttributes -> - enrichEntityData( - new EntityData(fieldsToAttributes, NodeGraphicInput.class), - NODE, - nodes, - NodeGraphicInputEntityData::new)); + entityDataTry -> + entityDataTry.flatMap( + entityData -> + enrichEntityData( + entityData, NODE, nodes, NodeGraphicInputEntityData::new))); } /** @@ -163,14 +161,12 @@ protected Stream> buildNodeGrap */ protected Stream> buildLineGraphicEntityData( Map lines) { - return dataSource - .getSourceData(LineGraphicInput.class) + return buildEntityData(LineGraphicInput.class) .map( - fieldsToAttributes -> - enrichEntityData( - new EntityData(fieldsToAttributes, LineGraphicInput.class), - "line", - lines, - LineGraphicInputEntityData::new)); + entityDataTry -> + entityDataTry.flatMap( + entityData -> + enrichEntityData( + entityData, "line", lines, LineGraphicInputEntityData::new))); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index 2783c0adc..f427bd9f6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -209,7 +209,7 @@ public Map getLines( Map operators) throws SourceException { return unpackMap( - typedEntityStream(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs), + buildTypedEntityData(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs), LineInput.class); } @@ -256,7 +256,7 @@ public Set get2WTransformers( Map operators) throws SourceException { return unpackSet( - typedEntityStream( + buildTypedEntityData( Transformer2WInput.class, transformer2WInputFactory, nodes, @@ -398,6 +398,22 @@ public Set getMeasurementUnits( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- + // todo refactoring + + private + Stream> buildTypedEntityData( + Class entityClass, + EntityFactory> factory, + Map nodes, + Map operators, + Map types) { + return buildTypedConnectorEntityData( + buildUntypedConnectorInputEntityData( + buildAssetInputEntityData(entityClass, operators), nodes), + types) + .map(factory::get); + } + public Set buildUntypedConnectorInputEntities( Class entityClass, EntityFactory factory, @@ -478,21 +494,6 @@ Stream, SourceException>> buildTypedConnect ConnectorInputEntityData::new))); } - // todo needed? - private - Stream> typedEntityStream( - Class entityClass, - EntityFactory> factory, - Map nodes, - Map operators, - Map types) { - return buildTypedConnectorEntityData( - buildUntypedConnectorInputEntityData( - buildAssetInputEntityData(entityClass, operators), nodes), - types) - .map(factory::get); - } - /** * Enriches the Stream of tries on {@link Transformer3WInputEntityData} with the information of * the internal node. diff --git a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java index c0bc3fae5..b8f21a545 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ResultEntitySource.java @@ -6,7 +6,8 @@ package edu.ie3.datamodel.io.source; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.io.factory.SimpleEntityFactory; +import edu.ie3.datamodel.io.factory.EntityData; +import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.factory.result.*; import edu.ie3.datamodel.models.result.NodeResult; import edu.ie3.datamodel.models.result.ResultEntity; @@ -327,10 +328,10 @@ public Set getEmResults() throws SourceException { */ @SuppressWarnings("unchecked") private Set getResultEntities( - Class entityClass, SimpleEntityFactory factory) + Class entityClass, EntityFactory factory) throws SourceException { return unpackSet( - buildSimpleEntityData(entityClass) + buildEntityData(entityClass) .map(entityData -> factory.get(entityData).map(data -> (T) data)), entityClass); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 84afd2e44..7fada86a1 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -22,7 +22,9 @@ import java.util.stream.Stream; /** - * todo javadoc Interface that provides the capability to build thermal {@link + * todo javadoc + * + *

Interface that provides the capability to build thermal {@link * edu.ie3.datamodel.models.input.AssetInput} entities from persistent data e.g. .csv files or * databases * diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java index 09d4530f9..66a22d8f9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.source; import edu.ie3.datamodel.exceptions.FactoryException; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory; import edu.ie3.datamodel.models.input.InputEntity; import edu.ie3.datamodel.utils.Try; @@ -65,7 +65,7 @@ public Optional getTimeSeriesUuid(UUID modelIdentifier) { private Try createMappingEntry( Map fieldToValues) { - SimpleEntityData entityData = new SimpleEntityData(fieldToValues, MappingEntry.class); + EntityData entityData = new EntityData(fieldToValues, MappingEntry.class); return mappingFactory.get(entityData); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 8671ebad7..1271c29f5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -7,8 +7,8 @@ import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.SourceException; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.EntityFactory; -import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.input.OperatorInputFactory; import edu.ie3.datamodel.io.factory.typeinput.LineTypeInputFactory; import edu.ie3.datamodel.io.factory.typeinput.SystemParticipantTypeInputFactory; @@ -63,7 +63,7 @@ public TypeSource(DataSource dataSource) { */ public Map getTransformer2WTypes() throws SourceException { return unpackMap( - buildSimpleEntityData(Transformer2WTypeInput.class).map(transformer2WTypeInputFactory::get), + buildEntityData(Transformer2WTypeInput.class).map(transformer2WTypeInputFactory::get), Transformer2WTypeInput.class); } @@ -77,8 +77,7 @@ public Map getTransformer2WTypes() throws SourceEx */ public Map getOperators() throws SourceException { return unpackMap( - buildSimpleEntityData(OperatorInput.class).map(operatorInputFactory::get), - OperatorInput.class); + buildEntityData(OperatorInput.class).map(operatorInputFactory::get), OperatorInput.class); } /** @@ -91,8 +90,7 @@ public Map getOperators() throws SourceException { */ public Map getLineTypes() throws SourceException { return unpackMap( - buildSimpleEntityData(LineTypeInput.class).map(lineTypeInputFactory::get), - LineTypeInput.class); + buildEntityData(LineTypeInput.class).map(lineTypeInputFactory::get), LineTypeInput.class); } /** @@ -106,7 +104,7 @@ public Map getLineTypes() throws SourceException { */ public Map getTransformer3WTypes() throws SourceException { return unpackMap( - buildSimpleEntityData(Transformer3WTypeInput.class).map(transformer3WTypeInputFactory::get), + buildEntityData(Transformer3WTypeInput.class).map(transformer3WTypeInputFactory::get), Transformer3WTypeInput.class); } @@ -200,8 +198,7 @@ public Map getEvTypes() throws SourceException { */ @SuppressWarnings("unchecked") private Stream> buildEntities( - Class entityClass, EntityFactory factory) { - return buildSimpleEntityData(entityClass) - .map(data -> (Try) factory.get(data)); + Class entityClass, EntityFactory factory) { + return buildEntityData(entityClass).map(data -> (Try) factory.get(data)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java index ad01ebe62..f0144b986 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMetaInformationSource.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.source.sql; import edu.ie3.datamodel.io.connectors.SqlConnector; -import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.factory.EntityData; import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMetaInformationFactory; import edu.ie3.datamodel.io.naming.DatabaseNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; @@ -92,8 +92,8 @@ public Optional getTimeSeriesMetaInformatio private Optional createEntity( Map fieldToValues) { - SimpleEntityData entityData = - new SimpleEntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); + EntityData entityData = + new EntityData(fieldToValues, IndividualTimeSeriesMetaInformation.class); return mappingFactory.get(entityData).getData(); } } diff --git a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java index 6df13c3fd..a7b429ed5 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java @@ -18,7 +18,7 @@ public class EmInput extends AssetInput { * Optional UUID of the parent {@link EmInput} that is controlling this em unit. If null, this em * unit is not em-controlled. */ - private final UUID parentEm; + private final EmInput parentEm; /** * Constructor for an operated energy management system @@ -36,7 +36,7 @@ public EmInput( OperatorInput operator, OperationTime operationTime, String emControlStrategy, - UUID parentEm) { + EmInput parentEm) { super(uuid, id, operator, operationTime); this.controlStrategy = emControlStrategy; this.parentEm = parentEm; @@ -50,7 +50,7 @@ public EmInput( * @param emControlStrategy the control strategy * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. */ - public EmInput(UUID uuid, String id, String emControlStrategy, UUID parentEm) { + public EmInput(UUID uuid, String id, String emControlStrategy, EmInput parentEm) { super(uuid, id); this.controlStrategy = emControlStrategy; this.parentEm = parentEm; @@ -60,7 +60,7 @@ public String getControlStrategy() { return controlStrategy; } - public UUID getParentEm() { + public EmInput getParentEm() { return parentEm; } @@ -96,7 +96,7 @@ public String toString() { + ", controlStrategy=" + getControlStrategy() + ", parentEm=" - + getParentEm() + + getParentEm().getUuid() + '}'; } @@ -104,7 +104,7 @@ public static class EmInputCopyBuilder extends AssetInputCopyBuilder input = inputFactory.get(new SimpleEntityData(parameter, inputClass)) + Try input = inputFactory.get(new EntityData(parameter, inputClass)) then: input.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy index 6c56ecd4f..8ea8a4cf8 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput @@ -59,7 +58,7 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { when: Try input = inputFactory.get( - new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) then: input.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy index d22c8abac..9711dd7f7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ConnectorResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.connector.ConnectorResult import edu.ie3.datamodel.models.result.connector.LineResult @@ -53,7 +53,7 @@ class ConnectorResultFactoryTest extends Specification implements FactoryTestHel } when: - Try result = resultFactory.get(new SimpleEntityData(parameter, modelClass)) + Try result = resultFactory.get(new EntityData(parameter, modelClass)) then: result.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy index c46eabaea..539da36b6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/FlexOptionsResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.system.FlexOptionsResult import edu.ie3.datamodel.utils.Try @@ -36,7 +36,7 @@ class FlexOptionsResultFactoryTest extends Specification implements FactoryTestH ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, FlexOptionsResult)) + Try result = resultFactory.get(new EntityData(parameter, FlexOptionsResult)) then: result.success @@ -61,7 +61,7 @@ class FlexOptionsResultFactoryTest extends Specification implements FactoryTestH ] when: - Try input = resultFactory.get(new SimpleEntityData(parameter, FlexOptionsResult)) + Try input = resultFactory.get(new EntityData(parameter, FlexOptionsResult)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy index 9dbc4e294..5779a6f10 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/NodeResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.NodeResult import edu.ie3.datamodel.utils.Try @@ -35,7 +35,7 @@ class NodeResultFactoryTest extends Specification implements FactoryTestHelper { ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, NodeResult)) + Try result = resultFactory.get(new EntityData(parameter, NodeResult)) then: result.success @@ -58,7 +58,7 @@ class NodeResultFactoryTest extends Specification implements FactoryTestHelper { ] when: - Try input = resultFactory.get(new SimpleEntityData(parameter, NodeResult)) + Try input = resultFactory.get(new EntityData(parameter, NodeResult)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy index ff05a4ff8..618d3291a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SwitchResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.result.connector.SwitchResult import edu.ie3.datamodel.utils.Try import edu.ie3.test.helper.FactoryTestHelper @@ -35,7 +35,7 @@ class SwitchResultFactoryTest extends Specification implements FactoryTestHelper ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, SwitchResult)) + Try result = resultFactory.get(new EntityData(parameter, SwitchResult)) then: result.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy index 664749ca6..58ef25854 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/SystemParticipantResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.system.* import edu.ie3.datamodel.utils.Try @@ -56,7 +56,7 @@ class SystemParticipantResultFactoryTest extends Specification implements Factor } when: - Try result = resultFactory.get(new SimpleEntityData(parameter, modelClass)) + Try result = resultFactory.get(new EntityData(parameter, modelClass)) then: result.success @@ -110,7 +110,7 @@ class SystemParticipantResultFactoryTest extends Specification implements Factor "q" : "2" ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, StorageResult)) + Try result = resultFactory.get(new EntityData(parameter, StorageResult)) then: result.success @@ -133,7 +133,7 @@ class SystemParticipantResultFactoryTest extends Specification implements Factor "q" : "2" ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, WecResult)) + Try result = resultFactory.get(new EntityData(parameter, WecResult)) then: result.failure @@ -159,7 +159,7 @@ class SystemParticipantResultFactoryTest extends Specification implements Factor expect: "that the factory should not need more than 3 seconds for processing 10.000 entities" Long startTime = System.currentTimeMillis() 10000.times { - resultFactory.get(new SimpleEntityData(parameter, StorageResult)) + resultFactory.get(new EntityData(parameter, StorageResult)) } BigDecimal elapsedTime = (System .currentTimeMillis() - startTime) / 1000.0 diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy index 3e9456fe2..12b3c1364 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/result/ThermalResultFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.result import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.result.thermal.CylindricalStorageResult import edu.ie3.datamodel.models.result.thermal.ThermalHouseResult @@ -41,7 +41,7 @@ class ThermalResultFactoryTest extends Specification implements FactoryTestHelpe "fillLevel" : "20" ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, CylindricalStorageResult)) + Try result = resultFactory.get(new EntityData(parameter, CylindricalStorageResult)) then: result.success @@ -65,7 +65,7 @@ class ThermalResultFactoryTest extends Specification implements FactoryTestHelpe "indoorTemperature": "21" ] when: - Try result = resultFactory.get(new SimpleEntityData(parameter, ThermalHouseResult)) + Try result = resultFactory.get(new EntityData(parameter, ThermalHouseResult)) then: result.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy index e32f91720..321576903 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/LineTypeInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.typeinput import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.utils.Try @@ -40,7 +40,7 @@ class LineTypeInputFactoryTest extends Specification implements FactoryTestHelpe def typeInputClass = LineTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy index 6204419c1..0fd0575ab 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/SystemParticipantTypeInputFactoryTest.groovy @@ -9,7 +9,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.METRE_PER_SECOND import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.system.characteristic.CharacteristicPoint import edu.ie3.datamodel.models.input.system.type.* @@ -56,7 +56,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = EvTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -91,7 +91,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = HpTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -125,7 +125,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = BmTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -163,7 +163,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = WecTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -210,7 +210,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = ChpTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -253,7 +253,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac def typeInputClass = StorageTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success @@ -296,7 +296,7 @@ class SystemParticipantTypeInputFactoryTest extends Specification implements Fac ] when: - Try input = typeInputFactory.get(new SimpleEntityData(parameter, StorageTypeInput)) + Try input = typeInputFactory.get(new EntityData(parameter, StorageTypeInput)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy index 848de5662..b6f094353 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer2WTypeInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.typeinput import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.utils.Try @@ -47,7 +47,7 @@ class Transformer2WTypeInputFactoryTest extends Specification implements Factory def typeInputClass = Transformer2WTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy index bd844da36..e040a2132 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/typeinput/Transformer3WTypeInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.typeinput import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.SimpleEntityData +import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.connector.type.Transformer3WTypeInput import edu.ie3.datamodel.utils.Try @@ -53,7 +53,7 @@ class Transformer3WTypeInputFactoryTest extends Specification implements Factory def typeInputClass = Transformer3WTypeInput when: - Try typeInput = typeInputFactory.get(new SimpleEntityData(parameter, typeInputClass)) + Try typeInput = typeInputFactory.get(new EntityData(parameter, typeInputClass)) then: typeInput.success diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 17b93bbfd..9c4f86d48 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -36,7 +36,7 @@ class EntitySourceTest extends Specification { DummyEntitySource dummyEntitySource = new DummyEntitySource(csvDataSource) - def "A CsvDataSource should always return an operator. Either the found one (if any) or OperatorInput.NO_OPERATOR_ASSIGNED"() { + def "An EntitySource should always return an operator. Either the found one (if any) or OperatorInput.NO_OPERATOR_ASSIGNED"() { expect: dummyEntitySource.getFirstOrDefaultOperator(operators, Optional.of(UUID.fromString(operatorUuid)), entityClassName, requestEntityUuid) == expectedOperator diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy index 8946bf585..ae366cd53 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy @@ -5,14 +5,14 @@ */ package edu.ie3.datamodel.io.source.csv +import edu.ie3.datamodel.exceptions.FailureException import edu.ie3.datamodel.exceptions.SourceException -import edu.ie3.datamodel.io.factory.input.graphics.LineGraphicInputEntityData -import edu.ie3.datamodel.io.factory.input.graphics.NodeGraphicInputEntityData import edu.ie3.datamodel.io.source.GraphicSource import edu.ie3.datamodel.io.source.RawGridSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData as gtd @@ -20,16 +20,19 @@ import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.Point import spock.lang.Specification +import java.util.function.Function +import java.util.stream.Collectors + class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { def "A CsvGraphicSource should provide an instance of GraphicElements based on valid input data correctly"() { given: def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, fileNamingStrategy)) def rawGridSource = new RawGridSource(typeSource, new CsvDataSource(csvSep, gridDefaultFolderPath, fileNamingStrategy)) - def csvGraphicSource = new GraphicSource(typeSource, rawGridSource, new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) + def graphicSource = new GraphicSource(typeSource, rawGridSource, new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) when: - def graphicElements = csvGraphicSource.graphicElements + def graphicElements = graphicSource.graphicElements then: graphicElements.allEntitiesAsList().size() == 3 @@ -53,10 +56,10 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { } } - def csvGraphicSource = new GraphicSource(typeSource, rawGridSource, new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) + def graphicSource = new GraphicSource(typeSource, rawGridSource, new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) when: - def graphicElements = Try.of(() -> csvGraphicSource.graphicElements, SourceException) + def graphicElements = Try.of(() -> graphicSource.graphicElements, SourceException) then: graphicElements.failure @@ -64,13 +67,13 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { Exception ex = graphicElements.exception.get() ex.class == SourceException - ex.message.startsWith("edu.ie3.datamodel.exceptions.FailureException: 2 exception(s) occurred within \"LineInput\" data, one is: edu.ie3.datamodel.exceptions.FactoryException: edu.ie3.datamodel.exceptions.SourceException: Failure due to: Skipping LineInput with uuid") + ex.message.startsWith("edu.ie3.datamodel.exceptions.FailureException: 2 exception(s) occurred within \"LineInput\" data, one is: edu.ie3.datamodel.exceptions.FactoryException: edu.ie3.datamodel.exceptions.SourceException: Linked nodeA with UUID 4ca90220-74c2-4369-9afa-a18bf068840d was not found for entity") } def "A CsvGraphicSource should read and handle a valid node graphics file as expected"() { given: - def csvGraphicSource = new GraphicSource( + def graphicSource = new GraphicSource( Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) @@ -89,8 +92,13 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { gtd.nodeGraphicC.point ) + Map nodeMap = [ + (gtd.nodeC.getUuid()) : gtd.nodeC, + (gtd.nodeD.getUuid()) : gtd.nodeD + ] + when: - def nodeGraphics = csvGraphicSource.getNodeGraphicInput([gtd.nodeC, gtd.nodeD] as Set) + def nodeGraphics = graphicSource.getNodeGraphicInput(nodeMap) then: nodeGraphics.size() == 2 @@ -100,91 +108,68 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { ] as Set } - def "A CsvGraphicSource should read and handle a valid line graphics file as expected"() { + def "A GraphicSource should read and handle a valid line graphics file as expected"() { given: - def csvGraphicSource = new GraphicSource( + def graphicSource = new GraphicSource( Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) + Map lineMap = [ + (gtd.lineCtoD.getUuid()) : gtd.lineCtoD + ] + when: - def lineGraphics = csvGraphicSource.getLineGraphicInput([gtd.lineCtoD] as Set) + def lineGraphics = graphicSource.getLineGraphicInput(lineMap) then: lineGraphics.size() == 1 lineGraphics.first() == gtd.lineGraphicCtoD } - def "A CsvGraphicSource should build node graphic entity data from valid and invalid input data correctly"() { + def "A GraphicSource when building node graphic data should fail when required node data is not provided"() { given: - def csvGraphicSource = new GraphicSource( + def graphicSource = new GraphicSource( Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) - def fieldsToAttributesMap = [ - "uuid" : "09aec636-791b-45aa-b981-b14edf171c4c", - "graphic_layer": "main", - "node" : "bd837a25-58f3-44ac-aa90-c6b6e3cd91b2", - "path" : "", - "point" : "{\"type\":\"Point\",\"coordinates\":[0.0,10],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}" - ] + Map nodeMap = nodeCollection.stream().collect(Collectors.toMap(NodeInput::getUuid, Function.identity())) - expect: - def res = csvGraphicSource.buildNodeGraphicEntityData(fieldsToAttributesMap, nodeCollection as Set) - res.success == isPresent - - if (isPresent) { - def value = res.data.get() + when: + graphicSource.getNodeGraphicInput(nodeMap) - assert value == new NodeGraphicInputEntityData([ - "uuid" : "09aec636-791b-45aa-b981-b14edf171c4c", - "graphic_layer": "main", - "path" : "", - "point" : "{\"type\":\"Point\",\"coordinates\":[0.0,10],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}" - ], gtd.nodeC) - assert value.node == gtd.nodeC - } + then: + def e = thrown(SourceException) + e.cause.class == FailureException + e.cause.message.startsWith(expectedFailures + " exception(s) occurred") where: - nodeCollection || isPresent - []|| false // no nodes provide - [gtd.nodeA, gtd.nodeB]|| false // node cannot be found - [gtd.nodeC]|| true // node found + nodeCollection || expectedFailures + [] || 2 // no nodes provided + [gtd.nodeA, gtd.nodeB] || 2 // wrongs nodes provided + [gtd.nodeC] || 1 // one node provided + [gtd.nodeD] || 1 // one node provided } - def "A CsvGraphicSource should build line graphic entity data from valid and invalid input data correctly"() { + def "A GraphicSource when building line graphic data should fail when required line data is not provided"() { given: - def csvGraphicSource = new GraphicSource( + def graphicSource = new GraphicSource( Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) - def fieldsToAttributesMap = [ - "uuid" : "ece86139-3238-4a35-9361-457ecb4258b0", - "graphic_layer": "main", - "line" : "92ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "path" : "{\"type\":\"LineString\",\"coordinates\":[[0.0,0.0],[0.0,10]],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}" - ] - - expect: - def res = csvGraphicSource.buildLineGraphicEntityData(fieldsToAttributesMap, nodeCollection as Set) - res.success == isPresent + Map lineMap = lineCollection.stream().collect(Collectors.toMap(LineInput::getUuid, Function.identity())) - if (isPresent) { - def value = res.data.get() - - assert value == new LineGraphicInputEntityData(["uuid" : "ece86139-3238-4a35-9361-457ecb4258b0", - "graphic_layer": "main", - "path" : "{\"type\":\"LineString\",\"coordinates\":[[0.0,0.0],[0.0,10]],\"crs\":{\"type\":\"name\",\"properties\":{\"name\":\"EPSG:4326\"}}}" - ] - , gtd.lineAtoB) - assert value.line == gtd.lineAtoB - } + when: + graphicSource.getLineGraphicInput(lineMap) + then: + def e = thrown(SourceException) + e.cause.class == FailureException + e.cause.message.startsWith(expectedFailures + " exception(s) occurred") where: - nodeCollection || isPresent - []|| false // no nodes provide - [gtd.lineCtoD]|| false // line cannot be found - [gtd.lineAtoB]|| true // line found + lineCollection || expectedFailures + [] || 1 // no lines provided + [gtd.lineAtoB] || 1 // line cannot be found } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 4ac22b127..dc6cd683a 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -60,6 +60,8 @@ class EmInputTest extends Specification { SystemParticipantTestData.emInput.operationTime + ", controlStrategy=" + SystemParticipantTestData.emInput.controlStrategy + + ", parentEm=" + + SystemParticipantTestData.emInput.parentEm.uuid + '}' } @@ -67,9 +69,15 @@ class EmInputTest extends Specification { given: def emInput = SystemParticipantTestData.emInput def newStrat = "new_strat" + def parentEm = new EmInput( + UUID.fromString("cfc0639b-65bc-47e5-a8e5-82703de3c650"), + "testParent", + "controlStrat", + null + ) when: - def alteredUnit = emInput.copy().controlStrategy(newStrat).build() + def alteredUnit = emInput.copy().controlStrategy(newStrat).parentEm(parentEm).build() then: alteredUnit.with { @@ -78,6 +86,7 @@ class EmInputTest extends Specification { assert operator == emInput.operator assert id == emInput.id assert controlStrategy == newStrat + assert parentEm == parentEm } } } From 399dccd3d2b54b02878cb52dea5ba07eaf25397e Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 17:26:44 +0100 Subject: [PATCH 08/31] Fixing some tests --- .../participant/EmInputFactoryTest.groovy | 43 +++++++++++++++++-- .../csv/CsvEnergyManagementSourceTest.groovy | 1 + .../common/SystemParticipantTestData.groovy | 9 +++- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy index 2c49ac48c..9fddd081c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try @@ -25,7 +25,7 @@ class EmInputFactoryTest extends Specification { inputFactory.supportedClasses == expectedClasses } - def "A EmInputFactory should parse a valid EmInput correctly"() { + def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { given: def inputFactory = new EmInputFactory() Map parameter = [ @@ -37,10 +37,11 @@ class EmInputFactoryTest extends Specification { ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) + def parentEmUnit = Mock(EmInput) when: Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) + new EmAssetInputEntityData(parameter, inputClass, operatorInput, parentEmUnit)) then: input.success @@ -54,6 +55,40 @@ class EmInputFactoryTest extends Specification { assert operator == operatorInput assert id == parameter["id"] assert controlStrategy == parameter["controlstrategy"] + assert parentEm == parentEmUnit + } + } + + def "A EmInputFactory should parse a valid EmInput without parent EM correctly"() { + given: + def inputFactory = new EmInputFactory() + Map parameter = [ + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", + "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", + "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", + "id" : "TestID", + "controlstrategy" : "no_control" + ] + def inputClass = EmInput + def operatorInput = Mock(OperatorInput) + + when: + Try input = inputFactory.get( + new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) + + then: + input.success + input.data.get().getClass() == inputClass + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.present + assert operationTime.startDate.get() == ZonedDateTime.parse(parameter["operatesfrom"]) + assert operationTime.endDate.present + assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) + assert operator == operatorInput + assert id == parameter["id"] + assert controlStrategy == parameter["controlstrategy"] + assert parentEm == null } } @@ -70,7 +105,7 @@ class EmInputFactoryTest extends Specification { when: Try input = inputFactory.get( - new AssetInputEntityData(parameter, inputClass, operatorInput)) + new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) then: input.failure diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index f87d80c81..f79dd9ee1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -13,6 +13,7 @@ import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification +// TODO test recursion class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { def "An EnergyManagementSource with csv input should return data from valid em input file as expected"() { diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index c915b0f35..ed1a190a1 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -58,7 +58,14 @@ class SystemParticipantTestData { // EmInput public static final String emControlStrategy = "self_optimization" - public static final UUID parentEm = UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd") + private static final EmInput parentEm = new EmInput( + UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd"), + "test_parentEmInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + emControlStrategy, + null + ) public static final emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), From 2ce6630cb4342d9fe226533778517d7ada1db321 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 17:27:24 +0100 Subject: [PATCH 09/31] EM javadoc --- .../io/source/EnergyManagementSource.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 59cae4a0b..14550060f 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -60,14 +60,24 @@ public Map getEmUnits() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances + * @param operators a map of uuid to {@link OperatorInput} that should be used for the returning + * instances * @return a map of uuid to {@link EmInput} entities */ public Map getEmUnits(Map operators) throws SourceException { return buildHierarchicalEmInputs(operators); } + /** + * Since each EM can itself be controlled by another EM, it does not suffice to link {@link + * EmInput}s via {@link EntitySource#optionallyEnrichEntityData} as we do for system participants + * in {@link SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at + * root level (which are not EM-controlled themselves). + * + * @param operators a map of uuid to {@link OperatorInput} that should be used for the returning + * instances + * @return a map of uuid to {@link EmInput} entities + */ private Map buildHierarchicalEmInputs(Map operators) throws SourceException { Stream> assetEntityDataStream = From 8af8d14574624d768cec114a5ea092cb0bd28dd8 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 18:16:42 +0100 Subject: [PATCH 10/31] equals and hashcode in Try --- .../java/edu/ie3/datamodel/utils/Try.java | 62 +++++++++++++++++++ .../edu/ie3/datamodel/utils/TryTest.groovy | 25 ++++++++ 2 files changed, 87 insertions(+) diff --git a/src/main/java/edu/ie3/datamodel/utils/Try.java b/src/main/java/edu/ie3/datamodel/utils/Try.java index df86150f1..ba3672741 100644 --- a/src/main/java/edu/ie3/datamodel/utils/Try.java +++ b/src/main/java/edu/ie3/datamodel/utils/Try.java @@ -364,6 +364,37 @@ public static Success of(D data) { public static Success empty() { return (Success) emptySuccess; } + + /** + * Indicates whether some other object is "equal to" this {@code Success}. The other object is + * considered equal if: + * + *

+ * + * @param obj an object to be tested for equality + * @return {@code true} if the other object is "equal to" this object otherwise {@code false} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + return obj instanceof Success other && Objects.equals(data, other.data); + } + + /** + * Returns the hash code of the value. + * + * @return hash code value of the value + */ + @Override + public int hashCode() { + return Objects.hashCode(data); + } } /** Implementation of {@link Try} class. This class is used to present a failed try. */ @@ -464,6 +495,37 @@ public static Failure of(E exception) { public static Failure ofVoid(E exception) { return new Failure<>(exception); } + + /** + * Indicates whether some other object is "equal to" this {@code Failure}. The other object is + * considered equal if: + * + *
    + *
  • it is also a {@code Failure} and; + *
  • the exceptions are "equal to" each other via {@code equals()}. + *
+ * + * @param obj an object to be tested for equality + * @return {@code true} if the other object is "equal to" this object otherwise {@code false} + */ + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + return obj instanceof Failure other && Objects.equals(exception, other.exception); + } + + /** + * Returns the hash code of the exception. + * + * @return hash code value of the exception + */ + @Override + public int hashCode() { + return Objects.hashCode(exception); + } } /** diff --git a/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy index 61fdc9e0c..ffb332697 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/TryTest.groovy @@ -394,6 +394,31 @@ class TryTest extends Specification { result == Optional.empty() } + def "The equals and hashCode method should work as expected on a success"() { + given: + def value = "some value" + Try success1 = new Try.Success<>(value) + Try success2 = new Try.Success<>(value) + Try success3 = new Try.Success<>("other value") + + expect: + success1 == success2 + success1.hashCode() == success2.hashCode() + success1 != success3 + success1.hashCode() != success3.hashCode() + } + + def "The equals and hashCode method should work as expected on a failure"() { + given: + // exceptions usually do not implement #equals, this is difficult to test + Try failure1 = new Try.Failure<>(new SourceException("some failure")) + Try failure2 = new Try.Failure<>(new SourceException("other failure")) + + expect: + failure1 != failure2 + failure1.hashCode() != failure2.hashCode() + } + def "All exceptions of a collection of try objects should be returned"() { given: List> tries = List.of( From b01226ba05300d9232def2272cccfc69bd479c28 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 20 Dec 2023 18:17:13 +0100 Subject: [PATCH 11/31] Fixing EntitySourceTest --- .../io/source/EntitySourceTest.groovy | 97 ++++++++++++------- .../common/SystemParticipantTestData.groovy | 2 +- 2 files changed, 63 insertions(+), 36 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 9c4f86d48..1356f5426 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -5,17 +5,25 @@ */ package edu.ie3.datamodel.io.source -import edu.ie3.datamodel.io.factory.input.ThermalBusInputFactory +import edu.ie3.datamodel.exceptions.SourceException +import edu.ie3.datamodel.io.factory.EntityData +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.csv.CsvDataSource -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.test.common.GridTestData as gtd +import edu.ie3.datamodel.models.UniqueEntity +import edu.ie3.datamodel.models.input.AssetInput +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Shared import spock.lang.Specification import java.nio.file.Path +import java.util.function.Function +import java.util.stream.Collectors class EntitySourceTest extends Specification { @@ -36,52 +44,71 @@ class EntitySourceTest extends Specification { DummyEntitySource dummyEntitySource = new DummyEntitySource(csvDataSource) - def "An EntitySource should always return an operator. Either the found one (if any) or OperatorInput.NO_OPERATOR_ASSIGNED"() { + def "An EntitySource should find a linked entity, if it was provided"() { + given: + Map parameter = [ + "linked_entity" : sptd.emInput.uuid.toString(), + ] + def entityData = new EntityData(parameter, AssetInput.class) - expect: - dummyEntitySource.getFirstOrDefaultOperator(operators, Optional.of(UUID.fromString(operatorUuid)), entityClassName, requestEntityUuid) == expectedOperator + Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) - where: - operatorUuid | operators | entityClassName | requestEntityUuid || expectedOperator - "8f9682df-0744-4b58-a122-f0dc730f6510" | [sptd.hpInput.operator] | "TestEntityClass" | "8f9682df-0744-4b58-a122-f0dc730f6511" || sptd.hpInput.operator - "8f9682df-0744-4b58-a122-f0dc730f6520" | [sptd.hpInput.operator] | "TestEntityClass" | "8f9682df-0744-4b58-a122-f0dc730f6511" || OperatorInput.NO_OPERATOR_ASSIGNED - "8f9682df-0744-4b58-a122-f0dc730f6510" | [] | "TestEntityClass" | "8f9682df-0744-4b58-a122-f0dc730f6511" || OperatorInput.NO_OPERATOR_ASSIGNED + when: + def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) + + then: + result == new Try.Success(sptd.emInput) } - def "A CsvDataSource should be able to handle the extraction process of an asset type correctly"() { + def "An EntitySource trying to find a linked entity should fail, if no matching linked entity was provided"() { + given: + Map parameter = [ + "linked_entity" : sptd.emInput.parentEm.uuid.toString(), + ] + def entityData = new EntityData(parameter, AssetInput.class) + + Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + when: - def assetTypeOpt = dummyEntitySource.getLinkedEntity(types, fieldsToAttributes, "TestClassName") + def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) then: - assetTypeOpt.data.present == resultIsPresent - assetTypeOpt.data.ifPresent({ assetType -> - assert (assetType == resultData) - }) - - where: - types | fieldsToAttributes || resultIsPresent || resultData - [] | ["type": "202069a7-bcf8-422c-837c-273575220c8a"] || false || null - [] | ["bla": "foo"] || false || null - [gtd.transformerTypeBtoD] | ["type": "202069a7-bcf8-422c-837c-273575220c8a"] || true || gtd.transformerTypeBtoD - [sptd.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || sptd.chpTypeInput + result.isFailure() + result.getException().get().message == "Linked linked_entity with UUID 897bfc17-8e54-43d0-8d98-740786fd94dd was not found for entity EntityData{fieldsToAttributes={linked_entity=897bfc17-8e54-43d0-8d98-740786fd94dd}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" } - def "A CsvDataSource should not throw an exception but assume NO_OPERATOR_ASSIGNED if the operator field is missing in the headline"() { + def "An EntitySource should enrich entity data with a linked entity, if it was provided"() { + given: + Map parameter = [ + "linked_entity" : GridTestData.nodeA.uuid.toString(), + ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) + + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + when: + def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) + + then: + result == new Try.Success(new NodeAssetInputEntityData(entityData, GridTestData.nodeA)) + } + + def "An EntitySource trying to enrich entity data should fail, if no matching linked entity was provided"() { given: - def thermalBusInputFieldsToAttributesMap = [ - "uuid" : "0d95d7f2-49fb-4d49-8636-383a5220384e", - "id" : "test_thermalBusInput", - "operatesuntil": "2020-03-25T15:11:31Z[UTC]", - "operatesfrom" : "2020-03-24T15:11:31Z[UTC]" + Map parameter = [ + "linked_entity" : GridTestData.nodeB.uuid.toString(), ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) + + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: - def thermalBusInputEntity = new ThermalBusInputFactory().get(dummyEntitySource.createAssetInputEntityData(ThermalBusInput, thermalBusInputFieldsToAttributesMap, Collections.emptyList())) + def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) then: - noExceptionThrown() // no NPE should be thrown - thermalBusInputEntity.success - thermalBusInputEntity.data.get().operator.id == OperatorInput.NO_OPERATOR_ASSIGNED.id // operator id should be set accordingly + result.isFailure() + result.getException().get().message.startsWith("Linked linked_entity with UUID 47d29df0-ba2d-4d23-8e75-c82229c5c758 was not found for entity AssetInputEntityData") } + + // todo test enrich with two linked entities, optionallyEnrich, and various failures } diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index ed1a190a1..b4cc960b0 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -67,7 +67,7 @@ class SystemParticipantTestData { null ) - public static final emInput = new EmInput( + public static final EmInput emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", SystemParticipantTestData.operator, From 2f9e3e1c0389839faecebaf6c30e812539929453 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 26 Dec 2023 21:46:58 +0100 Subject: [PATCH 12/31] Re-writing EntitySourceTest --- .../ie3/datamodel/io/source/EntitySource.java | 9 +- .../io/source/EntitySourceTest.groovy | 149 ++++++++++++++++-- 2 files changed, 138 insertions(+), 20 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 20f61e40d..672a14a6c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -201,11 +201,12 @@ Try optionallyEnrichEntityData( .getFieldOptional(fieldName) .filter(s -> !s.isBlank()) .map( - // Entity data includes a proper UUID for the desired entity + // Entity data includes a non-empty UUID String for the desired entity uuidString -> Try.of(() -> UUID.fromString(uuidString), IllegalArgumentException.class) .transformF( iae -> + // Parsing error still results in a failure, ... new SourceException( String.format( "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", @@ -214,6 +215,8 @@ Try optionallyEnrichEntityData( .flatMap( entityUuid -> getEntity(entityUuid, linkedEntities) + // ... as well as a provided entity UUID that does not match any + // given data .transformF( exception -> new SourceException( @@ -226,8 +229,8 @@ Try optionallyEnrichEntityData( exception)))) .orElseGet( () -> { - // No UUID was given (column does not exist, or field is empty), - // this is totally fine - we return the default value + // No UUID was given (column does not exist, or field is empty). + // This is totally fine - we successfully return the default value log.debug( "Input source for class {} is missing the '{}' field. " + "Default value '{}' is used.", diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 1356f5426..06a7af9c1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -9,19 +9,23 @@ import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.io.factory.input.AssetInputEntityData import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData -import edu.ie3.datamodel.io.naming.FileNamingStrategy +import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.AssetInput import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.models.input.system.ChpInput +import edu.ie3.datamodel.models.input.system.type.ChpTypeInput +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Shared import spock.lang.Specification -import java.nio.file.Path import java.util.function.Function import java.util.stream.Collectors @@ -29,20 +33,82 @@ class EntitySourceTest extends Specification { private final class DummyEntitySource extends EntitySource { DummyEntitySource(CsvDataSource dataSource) { - super(dataSource); + super(dataSource) } } @Shared - String csvSep = "," - @Shared - Path testBaseFolderPath = Path.of("testBaseFolderPath") // does not have to exist for this test - @Shared - FileNamingStrategy fileNamingStrategy = new FileNamingStrategy() + DummyEntitySource dummyEntitySource = new DummyEntitySource(Mock(CsvDataSource)) + + def "An EntitySource should enrich entity data with a linked entity, if it was provided"() { + given: + Map parameter = [ + "linked_entity" : GridTestData.nodeA.uuid.toString(), + ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) + + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) + + then: + result == new Try.Success(new NodeAssetInputEntityData(entityData, GridTestData.nodeA)) + } + + def "An EntitySource trying to enrich entity data should fail, if no matching linked entity was provided"() { + given: + Map parameter = [ + "linked_entity" : GridTestData.nodeB.uuid.toString(), + ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) - CsvDataSource csvDataSource = new CsvDataSource(csvSep, testBaseFolderPath, fileNamingStrategy) + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) + + then: + result.isFailure() + result.getException().get().message.startsWith("Linked linked_entity with UUID 47d29df0-ba2d-4d23-8e75-c82229c5c758 was not found for entity AssetInputEntityData") + } + + def "An EntitySource should enrich entity data with two linked entities, if they are provided"() { + given: + Map parameter = [ + "t_bus" : sptd.thermalBus.uuid.toString(), + "t_storage" : sptd.thermalStorage.uuid.toString() + ] + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) - DummyEntitySource dummyEntitySource = new DummyEntitySource(csvDataSource) + Map busMap = [sptd.thermalBus].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map storageMap = [sptd.thermalStorage].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.enrichEntityData(entityData, "t_bus", busMap, "t_storage", storageMap, ChpInputEntityData::new) + + then: + result == new Try.Success(new ChpInputEntityData(entityData, sptd.thermalBus, sptd.thermalStorage)) + } + + def "An EntitySource trying to enrich entity data should fail, if one of two linked entities is not provided"() { + given: + Map parameter = [ + "t_bus" : sptd.thermalBus.uuid.toString(), + "t_storage" : "8851813b-3a7d-4fee-874b-4df9d724e4b4" + ] + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) + + Map busMap = [sptd.thermalBus].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map storageMap = [sptd.thermalStorage].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.enrichEntityData(entityData, "t_bus", busMap, "t_storage", storageMap, ChpInputEntityData::new) + + then: + result.isFailure() + result.getException().get().message.startsWith("Linked t_storage with UUID 8851813b-3a7d-4fee-874b-4df9d724e4b4 was not found for entity SystemParticipantTypedEntityData") + } def "An EntitySource should find a linked entity, if it was provided"() { given: @@ -77,7 +143,24 @@ class EntitySourceTest extends Specification { result.getException().get().message == "Linked linked_entity with UUID 897bfc17-8e54-43d0-8d98-740786fd94dd was not found for entity EntityData{fieldsToAttributes={linked_entity=897bfc17-8e54-43d0-8d98-740786fd94dd}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" } - def "An EntitySource should enrich entity data with a linked entity, if it was provided"() { + def "An EntitySource trying to find a linked entity should fail, if corresponding UUID is malformed"() { + given: + Map parameter = [ + "linked_entity" : "not-a-uuid", + ] + def entityData = new EntityData(parameter, AssetInput.class) + + Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) + + then: + result.isFailure() + result.getException().get().message == "Extracting UUID field linked_entity from entity data EntityData{fieldsToAttributes={linked_entity=not-a-uuid}, targetClass=class edu.ie3.datamodel.models.input.AssetInput} failed." + } + + def "An EntitySource should optionally enrich entity data with a linked entity, if it was provided"() { given: Map parameter = [ "linked_entity" : GridTestData.nodeA.uuid.toString(), @@ -87,28 +170,60 @@ class EntitySourceTest extends Specification { Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: - def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) + def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) then: result == new Try.Success(new NodeAssetInputEntityData(entityData, GridTestData.nodeA)) } - def "An EntitySource trying to enrich entity data should fail, if no matching linked entity was provided"() { + def "An EntitySource should (optionally) enrich entity data with the default entity, if no linked entity is specified"() { given: Map parameter = [ - "linked_entity" : GridTestData.nodeB.uuid.toString(), + "linked_entity" : "", ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: - def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) + def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) + + then: + result == new Try.Success(new NodeAssetInputEntityData(entityData, GridTestData.nodeB)) + } + + def "An EntitySource trying to optionally find a linked entity should fail, if no matching linked entity was provided"() { + given: + Map parameter = [ + "linked_entity" : "4ca90220-74c2-4369-9afa-a18bf068840e", + ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) + + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) then: result.isFailure() - result.getException().get().message.startsWith("Linked linked_entity with UUID 47d29df0-ba2d-4d23-8e75-c82229c5c758 was not found for entity AssetInputEntityData") + result.getException().get().message.startsWith("Linked linked_entity with UUID 4ca90220-74c2-4369-9afa-a18bf068840e was not found for entity AssetInputEntityData{fieldsToValues={linked_entity=4ca90220-74c2-4369-9afa-a18bf068840e}, targetClass=class edu.ie3.datamodel.models.input.AssetInput") } - // todo test enrich with two linked entities, optionallyEnrich, and various failures + + def "An EntitySource trying to optionally find a linked entity should fail, if corresponding UUID is malformed"() { + given: + Map parameter = [ + "linked_entity" : "not-a-uuid", + ] + def entityData = new AssetInputEntityData(parameter, AssetInput.class) + + Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + + when: + def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) + + then: + result.isFailure() + result.getException().get().message == "Exception while trying to parse UUID of field \"linked_entity\" with value \"not-a-uuid\"" + } } From 73df774090d623ae32d6c7f00a24e4d59e195c27 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 26 Dec 2023 22:11:05 +0100 Subject: [PATCH 13/31] Fixing Processor --- .../ie3/datamodel/io/factory/FactoryData.java | 23 ------------------- .../ie3/datamodel/io/processor/Processor.java | 17 +++++--------- 2 files changed, 6 insertions(+), 34 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java index f88d24423..6ed7dcb7e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java @@ -135,29 +135,6 @@ field, getField(field)), } } - /** - * Parses and returns an array of UUIDs from field value of given field name. Throws {@link - * FactoryException} if field does not exist or parsing fails. - * - * @param field field name - * @return UUID - */ - public UUID[] getUUIDs(String field) { - try { - String fieldValue = getField(field); - if (fieldValue.trim().isEmpty()) return new UUID[0]; - - String[] uuidFields = fieldValue.split(" "); - return Arrays.stream(uuidFields).map(UUID::fromString).toArray(UUID[]::new); - } catch (IllegalArgumentException iae) { - throw new FactoryException( - String.format( - "Exception while trying to parse UUIDs of field \"%s\" with value \"%s\"", - field, getField(field)), - iae); - } - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 06eb1b951..163d51b74 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -235,10 +235,12 @@ protected String processMethodResult(Object methodReturnObject, Method method, S ((Optional) methodReturnObject) .map( o -> { - if (o instanceof Quantity) { + if (o instanceof Quantity quantity) { return Try.of( - () -> handleQuantity((Quantity) o, fieldName), + () -> handleQuantity(quantity, fieldName), EntityProcessorException.class); + } else if (o instanceof UniqueEntity entity) { + return Try.of(entity::getUuid, EntityProcessorException.class); } else { return Failure.of( new EntityProcessorException( @@ -273,8 +275,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "TimeSeries", "Transformer2WTypeInput", "Transformer3WTypeInput", - "WecTypeInput" -> resultStringBuilder.append( - ((UniqueEntity) methodReturnObject).getUuid()); + "WecTypeInput", + "EmInput" -> resultStringBuilder.append(((UniqueEntity) methodReturnObject).getUuid()); case "OperatorInput" -> resultStringBuilder.append( ((OperatorInput) methodReturnObject).getId().equalsIgnoreCase("NO_OPERATOR_ASSIGNED") ? "" @@ -288,7 +290,6 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "ReactivePowerCharacteristic", "CharacteristicInput" -> resultStringBuilder.append( ((CharacteristicInput) methodReturnObject).serialize()); - case "UUID[]" -> resultStringBuilder.append(processUUIDArray((UUID[]) methodReturnObject)); default -> throw new EntityProcessorException( "Unable to process value for attribute/field '" + fieldName @@ -369,12 +370,6 @@ protected String handleQuantity(Quantity quantity, String fieldName) protected abstract Try handleProcessorSpecificQuantity( Quantity quantity, String fieldName); - protected String processUUIDArray(UUID[] uuids) { - StringBuilder strb = new StringBuilder(); - for (UUID uuid : uuids) strb.append(uuid.toString()).append(" "); - return strb.toString().strip(); - } - /** * Handling of elements of type {@link OperationTime} * From e603ef5b06f583f255a6095dd26980102ce6d255 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 26 Dec 2023 22:11:19 +0100 Subject: [PATCH 14/31] Fixing InputEntityProcessorTest --- .../input/InputEntityProcessorTest.groovy | 74 +++++++++++-------- 1 file changed, 43 insertions(+), 31 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index ac2c24ab9..0f25a83ba 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -9,6 +9,7 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits +import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -143,9 +144,10 @@ class InputEntityProcessorTest extends Specification { def processingResult = processor.handleEntity(validInput) then: "make sure that the result is as expected " - processingResult.forEach { k, v -> + processingResult.forEach { + k, v -> if (k != "nodeInternal") // the internal 3w node is always randomly generated, hence we can skip to test on this - assert (v == expectedResult.get(k)) + assert (v == expectedResult.get(k)) } where: @@ -159,7 +161,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.fixedFeedInInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.fixedFeedInInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() + "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), + "em" : SystemParticipantTestData.fixedFeedInInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] PvInput | SystemParticipantTestData.pvInput || [ "uuid" : SystemParticipantTestData.pvInput.uuid.toString(), @@ -177,7 +180,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.pvInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.pvInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() + "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), + "em" : SystemParticipantTestData.pvInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] WecInput | SystemParticipantTestData.wecInput || [ "uuid" : SystemParticipantTestData.wecInput.uuid.toString(), @@ -188,7 +192,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.wecInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.wecInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiPSerialized, - "type" : SystemParticipantTestData.wecInput.type.uuid.toString() + "type" : SystemParticipantTestData.wecInput.type.uuid.toString(), + "em" : SystemParticipantTestData.wecInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] ChpInput | SystemParticipantTestData.chpInput || [ "uuid" : SystemParticipantTestData.chpInput.uuid.toString(), @@ -202,6 +207,7 @@ class InputEntityProcessorTest extends Specification { "thermalBus" : SystemParticipantTestData.chpInput.thermalBus.uuid.toString(), "thermalStorage" : SystemParticipantTestData.chpInput.thermalStorage.uuid.toString(), "type" : SystemParticipantTestData.chpInput.type.uuid.toString(), + "em" : SystemParticipantTestData.chpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] BmInput | SystemParticipantTestData.bmInput || [ "uuid" : SystemParticipantTestData.bmInput.uuid.toString(), @@ -214,7 +220,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.bmInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.bmInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.qVSerialized, - "type" : SystemParticipantTestData.bmInput.type.uuid.toString() + "type" : SystemParticipantTestData.bmInput.type.uuid.toString(), + "em" : SystemParticipantTestData.bmInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] EvInput | SystemParticipantTestData.evInput || [ "uuid" : SystemParticipantTestData.evInput.uuid.toString(), @@ -224,7 +231,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.evInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.evInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.evInput.type.getUuid().toString() + "type" : SystemParticipantTestData.evInput.type.getUuid().toString(), + "em" : SystemParticipantTestData.evInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] LoadInput | SystemParticipantTestData.loadInput || [ @@ -239,7 +247,8 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.loadInput.operator.uuid.toString(), "qCharacteristics" : SystemParticipantTestData.cosPhiFixedSerialized, "sRated" : SystemParticipantTestData.loadInput.sRated.getValue().doubleValue().toString(), - "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key + "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key, + "em" : SystemParticipantTestData.loadInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] StorageInput | SystemParticipantTestData.storageInput || [ "uuid" : SystemParticipantTestData.storageInput.uuid.toString(), @@ -249,7 +258,8 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.storageInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.storageInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.storageInput.type.uuid.toString() + "type" : SystemParticipantTestData.storageInput.type.uuid.toString(), + "em" : SystemParticipantTestData.storageInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] HpInput | SystemParticipantTestData.hpInput || [ "uuid" : SystemParticipantTestData.hpInput.uuid.toString(), @@ -260,7 +270,8 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.hpInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, "thermalBus" : SystemParticipantTestData.hpInput.thermalBus.uuid.toString(), - "type" : SystemParticipantTestData.hpInput.type.uuid.toString() + "type" : SystemParticipantTestData.hpInput.type.uuid.toString(), + "em" : SystemParticipantTestData.hpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] EvcsInput | SystemParticipantTestData.evcsInput || [ "uuid" : SystemParticipantTestData.evcsInput.uuid.toString(), @@ -274,7 +285,8 @@ class InputEntityProcessorTest extends Specification { "cosPhiRated" : SystemParticipantTestData.evcsInput.cosPhiRated.toString(), "chargingPoints" : SystemParticipantTestData.evcsInput.chargingPoints.toString(), "locationType" : SystemParticipantTestData.evcsInput.locationType.name(), - "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString() + "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString(), + "em" : SystemParticipantTestData.evcsInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] } @@ -354,18 +366,18 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) + UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), + 4, + 1.2, + 2.3, + 3.4, + 4.5, + 5.6, + 6.7, + 7.8, + 8.9, + 9.10 + ) Map expected = [ "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", "quarterHour": "4", @@ -617,14 +629,14 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(NodeInput) def nodeWithOutOperator = new NodeInput( - UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, - OperationTime.notLimited() - , - Quantities.getQuantity(1d, PU), - false, - null, - GermanVoltageLevelUtils.MV_20KV, - 4) + UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, + OperationTime.notLimited() + , + Quantities.getQuantity(1d, PU), + false, + null, + GermanVoltageLevelUtils.MV_20KV, + 4) Map expected = [ "geoPosition" : "", From af38616bf6f7a07b66570a9cde78293ed38e1b30 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 26 Dec 2023 23:18:28 +0100 Subject: [PATCH 15/31] More fixes --- .../ie3/datamodel/models/input/EmInput.java | 14 +- .../input/system/SystemParticipantInput.java | 9 +- .../participant/EmInputFactoryTest.groovy | 4 +- .../io/source/EntitySourceTest.groovy | 2 +- .../csv/CsvEnergyManagementSourceTest.groovy | 17 +- .../io/source/csv/CsvGraphicSourceTest.groovy | 3 +- .../io/source/csv/CsvRawGridSourceTest.groovy | 255 +++--------------- .../models/input/system/BmInputTest.groovy | 1 + .../models/input/system/ChpInputTest.groovy | 1 + .../models/input/system/EmInputTest.groovy | 8 +- .../models/input/system/EvInputTest.groovy | 1 + .../models/input/system/EvcsInputTest.groovy | 1 + .../input/system/FixedFeedInInputTest.groovy | 1 + .../models/input/system/HpInputTest.groovy | 1 + .../models/input/system/LoadInputTest.groovy | 1 + .../models/input/system/PvInputTest.groovy | 1 + .../input/system/StorageInputTest.groovy | 1 + .../models/input/system/WecInputTest.groovy | 1 + .../common/SystemParticipantTestData.groovy | 14 +- .../io/source/csv/_participants/em_input.csv | 5 +- 20 files changed, 82 insertions(+), 259 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java index a7b429ed5..1376caa1c 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java @@ -6,7 +6,9 @@ package edu.ie3.datamodel.models.input; import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.UniqueEntity; import java.util.Objects; +import java.util.Optional; import java.util.UUID; public class EmInput extends AssetInput { @@ -60,8 +62,8 @@ public String getControlStrategy() { return controlStrategy; } - public EmInput getParentEm() { - return parentEm; + public Optional getParentEm() { + return Optional.ofNullable(parentEm); } @Override @@ -74,12 +76,13 @@ public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof EmInput emInput)) return false; if (!super.equals(o)) return false; - return Objects.equals(controlStrategy, emInput.controlStrategy); + return Objects.equals(controlStrategy, emInput.controlStrategy) + && Objects.equals(parentEm, emInput.parentEm); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), controlStrategy); + return Objects.hash(super.hashCode(), controlStrategy, parentEm); } @Override @@ -96,7 +99,7 @@ public String toString() { + ", controlStrategy=" + getControlStrategy() + ", parentEm=" - + getParentEm().getUuid() + + getParentEm().map(UniqueEntity::getUuid).map(UUID::toString).orElse("") + '}'; } @@ -109,6 +112,7 @@ public static class EmInputCopyBuilder extends AssetInputCopyBuilder parameter = [ - "linked_entity" : sptd.emInput.parentEm.uuid.toString(), + "linked_entity" : sptd.parentEm.uuid.toString(), ] def entityData = new EntityData(parameter, AssetInput.class) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index f79dd9ee1..e9a9a3512 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -8,11 +8,15 @@ package edu.ie3.datamodel.io.source.csv import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.source.EnergyManagementSource import edu.ie3.datamodel.io.source.TypeSource +import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification +import java.util.function.Function +import java.util.stream.Collectors + // TODO test recursion class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { @@ -22,16 +26,13 @@ class CsvEnergyManagementSourceTest extends Specification implements CsvTestData Mock(TypeSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + Map operatorMap = [SystemParticipantTestData.emInput.operator].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + expect: - def emUnits = Try.of(() -> csvEnergyManagementSource.getEmUnits(operators.toSet()), SourceException) + def emUnits = Try.of(() -> csvEnergyManagementSource.getEmUnits(operatorMap), SourceException) emUnits.success - emUnits.data.get().emUnits.size() == 1 - emUnits.data.get().emUnits == resultingSet as Set - - where: - operators || resultingSet - [SystemParticipantTestData.emInput.operator] || [SystemParticipantTestData.emInput] - [] || [SystemParticipantTestData.emInput.copy().operator(OperatorInput.NO_OPERATOR_ASSIGNED).build()] + emUnits.data.get().size() == 2 + emUnits.data.get() == [SystemParticipantTestData.emInput, SystemParticipantTestData.parentEm].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy index ae366cd53..18cfb8bcf 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy @@ -10,6 +10,7 @@ import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.source.GraphicSource import edu.ie3.datamodel.io.source.RawGridSource import edu.ie3.datamodel.io.source.TypeSource +import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -133,7 +134,7 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) - Map nodeMap = nodeCollection.stream().collect(Collectors.toMap(NodeInput::getUuid, Function.identity())) + Map nodeMap = nodeCollection.stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: graphicSource.getNodeGraphicInput(nodeMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy index 5049b4bb7..bd50817db 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy @@ -12,6 +12,7 @@ import edu.ie3.datamodel.io.factory.input.Transformer3WInputEntityData import edu.ie3.datamodel.io.factory.input.TypedConnectorInputEntityData import edu.ie3.datamodel.io.source.RawGridSource import edu.ie3.datamodel.io.source.TypeSource +import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer3WInput @@ -22,6 +23,7 @@ import edu.ie3.test.common.GridTestData as rgtd import spock.lang.Shared import spock.lang.Specification +import java.util.function.Function import java.util.stream.Collectors import java.util.stream.Stream @@ -56,20 +58,23 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { "closed" : "true" ] - def validAssetEntityInputData = new AssetInputEntityData(fieldsToAttributes, SwitchInput) + def validAssetEntityInputData = Stream.of(Try.Success.of(new AssetInputEntityData(fieldsToAttributes, SwitchInput))) - def nodes = [rgtd.nodeA, rgtd.nodeB] + def nodes = [rgtd.nodeA, rgtd.nodeB].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: "the source tries to convert it" def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) then: "everything is fine" - connectorDataOption.success - connectorDataOption.data.get().with { - assert fieldsToValues == expectedFieldsToAttributes - assert targetClass == SwitchInput - assert nodeA == rgtd.nodeA - assert nodeB == rgtd.nodeB + connectorDataOption.forEach { + actualTry -> + assert actualTry.isSuccess() + actualTry.data.get().with { + assert fieldsToValues == expectedFieldsToAttributes + assert targetClass == SwitchInput + assert nodeA == rgtd.nodeA + assert nodeB == rgtd.nodeB + } } } @@ -86,22 +91,22 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { "closed" : "true" ] - def validAssetEntityInputData = new AssetInputEntityData(fieldsToAttributes, SwitchInput) + def validAssetEntityInputData = Stream.of(Try.Success.of(new AssetInputEntityData(fieldsToAttributes, SwitchInput))) - def nodes = [rgtd.nodeA, rgtd.nodeB] + def nodes = [rgtd.nodeA, rgtd.nodeB].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: "the source tries to convert it" def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) then: "it returns en empty Optional" - connectorDataOption.failure + connectorDataOption.allMatch(Try::isFailure) } def "The CsvRawGridSource is able to convert a stream of valid AssetInputEntityData to ConnectorInputEntityData"() { given: "valid input data" def validStream = Stream.of( - new AssetInputEntityData([ + Try.Success.of(new AssetInputEntityData([ "uuid" : "5dc88077-aeb6-4711-9142-db57287640b1", "id" : "test_switch_AtoB", "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", @@ -110,8 +115,8 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { "nodeA" : "4ca90220-74c2-4369-9afa-a18bf068840d", "nodeB" : "47d29df0-ba2d-4d23-8e75-c82229c5c758", "closed" : "true" - ], SwitchInput), - new AssetInputEntityData([ + ], SwitchInput)), + Try.Success.of(new AssetInputEntityData([ "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "test_lineCtoD", "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", @@ -126,7 +131,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { "olmCharacteristic" : "olm:{(0.0,1.0)}" ], LineInput) - ) + )) def expectedSet = [ new ConnectorInputEntityData([ @@ -164,7 +169,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { rgtd.nodeB, rgtd.nodeC, rgtd.nodeD - ] + ].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: "the source tries to convert it" def actualSet = source.buildUntypedConnectorInputEntityData(validStream, nodes).collect(Collectors.toSet()) @@ -175,129 +180,14 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { it.success } - actualSet.stream().map { it.data.get() }.toList().containsAll(expectedSet) - } - - def "The CsvRawGridSource is able to add a type to untyped ConnectorInputEntityData correctly"() { - given: "valid input data" - def validConnectorEntityData = new ConnectorInputEntityData([ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "test_lineCtoD", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "2", - "type" : "3bed3eb3-9790-4874-89b5-a5434d408088", - "length" : "0.003", - "geoPosition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmCharacteristic" : "olm:{(0.0,1.0)}" - ], - LineInput, - rgtd.nodeC, - rgtd.nodeD - ) - - def expectedTypedEntityData = new TypedConnectorInputEntityData([ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "test_lineCtoD", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "2", - "length" : "0.003", - "geoPosition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmCharacteristic" : "olm:{(0.0,1.0)}" - ], - LineInput, - rgtd.nodeC, - rgtd.nodeD, - rgtd.lineTypeInputCtoD - ) - - when: "the source tries to convert it" - def actual = source.addTypeToEntityData(validConnectorEntityData, rgtd.lineTypeInputCtoD) - - then: "everything is fine" - actual == expectedTypedEntityData - } - - def "The CsvRawGridSource is able to find and add a type to untyped ConnectorInputEntityData correctly"() { - given: "valid input data" - def validConnectorEntityData = new ConnectorInputEntityData([ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "test_lineCtoD", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "2", - "type" : "3bed3eb3-9790-4874-89b5-a5434d408088", - "length" : "0.003", - "geoPosition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmCharacteristic" : "olm:{(0.0,1.0)}" - ], - LineInput, - rgtd.nodeC, - rgtd.nodeD - ) - - def expectedTypedEntityData = new TypedConnectorInputEntityData([ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "test_lineCtoD", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "2", - "length" : "0.003", - "geoPosition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmCharacteristic" : "olm:{(0.0,1.0)}" - ], - LineInput, - rgtd.nodeC, - rgtd.nodeD, - rgtd.lineTypeInputCtoD - ) - - def availableTypes = [rgtd.lineTypeInputCtoD] - - when: "the source tries to convert it" - def actual = source.findAndAddType(validConnectorEntityData, availableTypes) - - then: "everything is fine" - actual.success - actual.data.get() == expectedTypedEntityData - } - - def "The CsvRawGridSource is able to identify ConnectorInputEntityData data with non matching type requirements correctly"() { - given: "valid input data" - def validConnectorEntityData = new ConnectorInputEntityData([ - "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", - "id" : "test_lineCtoD", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "2", - "type" : "fd5b128d-ed35-4355-94b6-7518c55425fe", - "length" : "0.003", - "geoPosition" : "{ \"type\": \"LineString\", \"coordinates\": [[7.411111, 51.492528], [7.414116, 51.484136]]}", - "olmCharacteristic" : "olm:{(0.0,1.0)}" - ], - LineInput, - rgtd.nodeC, - rgtd.nodeD - ) - - def availableTypes = [rgtd.lineTypeInputCtoD] - - when: "the source tries to convert it" - def actual = source.findAndAddType(validConnectorEntityData, availableTypes) - - then: "everything is fine" - actual.failure + actualSet.stream().map { + it.data.get() + }.toList().containsAll(expectedSet) } def "The CsvRawGridSource is able to convert a stream of valid ConnectorInputEntityData to TypedConnectorInputEntityData"() { given: "valid input data" - def validStream = Stream.of(new Try.Success<>( + def validStream = Stream.of(Try.Success.of( new ConnectorInputEntityData([ "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "test_lineCtoD", @@ -314,7 +204,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { rgtd.nodeC, rgtd.nodeD )), - new Try.Success<>(new ConnectorInputEntityData([ + Try.Success.of(new ConnectorInputEntityData([ "uuid" : "92ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "test_line_AtoB", "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", @@ -364,7 +254,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { ) ] - def availableTypes = [rgtd.lineTypeInputCtoD] + def availableTypes = [rgtd.lineTypeInputCtoD].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) when: "the source tries to convert it" def actualSet = source.buildTypedConnectorEntityData(validStream, availableTypes).collect(Collectors.toSet()) @@ -379,85 +269,6 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { }.toList().containsAll(expectedSet) } - def "The CsvRawGridSource is able to add the third node for a three winding transformer correctly"() { - given: "valid input data" - def typedEntityData = new TypedConnectorInputEntityData([ - "uuid" : "cc327469-7d56-472b-a0df-edbb64f90e8f", - "id" : "3w_test", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "nodeC" : "bd837a25-58f3-44ac-aa90-c6b6e3cd91b2", - "parallelDevices" : "1", - "tapPos" : "0", - "autoTap" : "true" - ], - Transformer3WInput, - rgtd.nodeA, - rgtd.nodeB, - rgtd.transformerTypeAtoBtoC) - - def expected = new Transformer3WInputEntityData([ - "uuid" : "cc327469-7d56-472b-a0df-edbb64f90e8f", - "id" : "3w_test", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "parallelDevices" : "1", - "tapPos" : "0", - "autoTap" : "true" - ], - Transformer3WInput, - rgtd.nodeA, - rgtd.nodeB, - rgtd.nodeC, - rgtd.transformerTypeAtoBtoC) - - def availableNodes = [ - rgtd.nodeA, - rgtd.nodeB, - rgtd.nodeC - ] - - when: "the sources tries to add the node" - def actual = source.addThirdNode(typedEntityData, availableNodes) - - then: "everything is fine" - actual.success - actual.data.get() == expected - } - - def "The CsvRawGridSource is NOT able to add the third node for a three winding transformer, if it is not available"() { - given: "valid input data" - def typedEntityData = new TypedConnectorInputEntityData([ - "uuid" : "cc327469-7d56-472b-a0df-edbb64f90e8f", - "id" : "3w_test", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-24 15:11:31", - "nodeC" : "bd8927b4-0ca9-4dd3-b645-468e6e433160", - "parallelDevices" : "1", - "tapPos" : "0", - "autoTap" : "true" - ], - Transformer3WInput, - rgtd.nodeA, - rgtd.nodeB, - rgtd.transformerTypeAtoBtoC) - - def availableNodes = [ - rgtd.nodeA, - rgtd.nodeB, - rgtd.nodeC - ] - - when: "the sources tries to add the node" - def actual = source.addThirdNode(typedEntityData, availableNodes) - - then: "everything is fine" - actual.failure - } - def "The CsvRawGridSource is able to add the third node for a three winding transformer to a stream of candidates"() { given: "suitable input data" def inputStream = Stream.of(Try.of(() -> new TypedConnectorInputEntityData([ @@ -495,7 +306,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { rgtd.nodeA, rgtd.nodeB, rgtd.nodeC - ] + ].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) def expected = new Transformer3WInputEntityData([ "uuid" : "cc327469-7d56-472b-a0df-edbb64f90e8f", @@ -544,8 +355,11 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { then: "all nodes are there" actualSet.size() == expectedSet.size() - actualSet.each {actual -> - def expected = expectedSet.find {it.uuid == actual.uuid} + actualSet.each { entry -> + def actual = entry.value + def expected = expectedSet.find { + it.uuid == actual.uuid + } assert expected != null actual.with { @@ -622,7 +436,8 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { then: "all lines are there" actualSet.size() == expectedSet.size() - actualSet.each {actual -> + actualSet.each {entry -> + def actual = entry.value def expected = expectedSet.find {it.uuid == actual.uuid} assert expected != null diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy index 877a35be1..6088e7218 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy @@ -33,6 +33,7 @@ class BmInputTest extends Specification { assert qCharacteristics == bmInput.qCharacteristics assert feedInTariff == Quantities.getQuantity(15, EURO_PER_MEGAWATTHOUR) assert type == SystemParticipantTestData.bmTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy index bc6f7f93e..8eee5450b 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy @@ -31,6 +31,7 @@ class ChpInputTest extends Specification { assert thermalStorage == SystemParticipantTestData.thermalStorage assert marketReaction assert type == SystemParticipantTestData.chpTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index dc6cd683a..3c1c6f706 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -61,7 +61,7 @@ class EmInputTest extends Specification { ", controlStrategy=" + SystemParticipantTestData.emInput.controlStrategy + ", parentEm=" + - SystemParticipantTestData.emInput.parentEm.uuid + + SystemParticipantTestData.parentEm.uuid + '}' } @@ -69,7 +69,7 @@ class EmInputTest extends Specification { given: def emInput = SystemParticipantTestData.emInput def newStrat = "new_strat" - def parentEm = new EmInput( + def givenParentEm = new EmInput( UUID.fromString("cfc0639b-65bc-47e5-a8e5-82703de3c650"), "testParent", "controlStrat", @@ -77,7 +77,7 @@ class EmInputTest extends Specification { ) when: - def alteredUnit = emInput.copy().controlStrategy(newStrat).parentEm(parentEm).build() + def alteredUnit = emInput.copy().controlStrategy(newStrat).parentEm(givenParentEm).build() then: alteredUnit.with { @@ -86,7 +86,7 @@ class EmInputTest extends Specification { assert operator == emInput.operator assert id == emInput.id assert controlStrategy == newStrat - assert parentEm == parentEm + assert parentEm == Optional.of(givenParentEm) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy index f31375f45..507384dcb 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy @@ -26,6 +26,7 @@ class EvInputTest extends Specification { assert id == ev.id assert qCharacteristics == ev.qCharacteristics assert type == SystemParticipantTestData.evTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy index 65dd93c14..eadd65ea7 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy @@ -36,6 +36,7 @@ class EvcsInputTest extends Specification { assert chargingPoints == 1 assert locationType == EvcsLocationType.CHARGING_HUB_HIGHWAY assert v2gSupport + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy index 500da895b..5c29f2544 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy @@ -29,6 +29,7 @@ class FixedFeedInInputTest extends Specification { assert qCharacteristics == ffIn.qCharacteristics assert sRated == Quantities.getQuantity(10d, PowerSystemUnits.VOLTAMPERE) assert cosPhiRated == 0.8d + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy index 9e40de6d6..98a15d0df 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy @@ -28,6 +28,7 @@ class HpInputTest extends Specification { assert qCharacteristics == hpInput.qCharacteristics assert thermalBus == SystemParticipantTestData.thermalBus assert type == SystemParticipantTestData.hpTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy index a1d04cc30..166406e36 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy @@ -41,6 +41,7 @@ class LoadInputTest extends Specification { assert eConsAnnual == Quantities.getQuantity(6000, KILOWATTHOUR) assert sRated == Quantities.getQuantity(0d, KILOVOLTAMPERE) assert cosPhiRated == 0.8d + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy index ea9a0262d..5506582e8 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy @@ -40,6 +40,7 @@ class PvInputTest extends Specification { assert elevationAngle == Quantities.getQuantity(50, DEGREE_GEOM) assert kG == 10 assert kT == 5 + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy index 0bea4865f..da2e9d233 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy @@ -26,6 +26,7 @@ class StorageInputTest extends Specification { assert id == storageInput.id assert qCharacteristics == storageInput.qCharacteristics assert type == SystemParticipantTestData.storageTypeInput + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy index 9d8b823af..135adc2fb 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy @@ -27,6 +27,7 @@ class WecInputTest extends Specification { assert qCharacteristics == wec.qCharacteristics assert type == SystemParticipantTestData.wecType assert marketReaction + assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index b4cc960b0..97c38532e 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -58,7 +58,7 @@ class SystemParticipantTestData { // EmInput public static final String emControlStrategy = "self_optimization" - private static final EmInput parentEm = new EmInput( + public static final EmInput parentEm = new EmInput( UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd"), "test_parentEmInput", SystemParticipantTestData.operator, @@ -341,18 +341,6 @@ class SystemParticipantTestData { v2gSupport ) - public static allParticipants = [ - fixedFeedInInput, - pvInput, - loadInput, - bmInput, - storageInput, - wecInput, - evInput, - chpInput, - hpInput - ] - public static SystemParticipants emptySystemParticipants = new SystemParticipants( [] as Set, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv index 97cea0978..e1bd3d5fa 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv @@ -1,2 +1,3 @@ -uuid,control_strategy,id,operates_from,operates_until,operator -977157f4-25e5-4c72-bf34-440edc778792,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510 +uuid,control_strategy,id,operates_from,operates_until,operator,parent_em +977157f4-25e5-4c72-bf34-440edc778792,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,897bfc17-8e54-43d0-8d98-740786fd94dd +897bfc17-8e54-43d0-8d98-740786fd94dd,self_optimization,test_parentEmInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510, \ No newline at end of file From 910cc01b81336286e72d83e2be38399a3fff66f4 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 30 Dec 2023 01:38:25 +0100 Subject: [PATCH 16/31] Fixing SystemParticipantSource tests --- .../io/source/EntitySourceTest.groovy | 32 +- .../source/SystemParticipantSourceTest.groovy | 121 ++++++++ .../csv/CsvEnergyManagementSourceTest.groovy | 10 +- .../io/source/csv/CsvGraphicSourceTest.groovy | 10 +- .../io/source/csv/CsvRawGridSourceTest.groovy | 21 +- .../csv/CsvSystemParticipantSourceTest.groovy | 279 ++++++------------ .../edu/ie3/test/helper/EntityMap.groovy | 17 ++ .../cylindrical_storage_input.csv | 2 +- 8 files changed, 268 insertions(+), 224 deletions(-) create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy create mode 100644 src/test/groovy/edu/ie3/test/helper/EntityMap.groovy diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index aee2eb181..bebec151a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.source +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.factory.EntityData import edu.ie3.datamodel.io.factory.input.AssetInputEntityData @@ -12,7 +14,6 @@ import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.io.source.csv.CsvDataSource -import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.AssetInput import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput @@ -26,9 +27,6 @@ import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Shared import spock.lang.Specification -import java.util.function.Function -import java.util.stream.Collectors - class EntitySourceTest extends Specification { private final class DummyEntitySource extends EntitySource { @@ -47,7 +45,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) @@ -63,7 +61,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.enrichEntityData(entityData, "linked_entity", entityMap, NodeAssetInputEntityData::new) @@ -81,8 +79,8 @@ class EntitySourceTest extends Specification { ] def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) - Map busMap = [sptd.thermalBus].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) - Map storageMap = [sptd.thermalStorage].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map busMap = map([sptd.thermalBus]) + Map storageMap = map([sptd.thermalStorage]) when: def result = dummyEntitySource.enrichEntityData(entityData, "t_bus", busMap, "t_storage", storageMap, ChpInputEntityData::new) @@ -99,8 +97,8 @@ class EntitySourceTest extends Specification { ] def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) - Map busMap = [sptd.thermalBus].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) - Map storageMap = [sptd.thermalStorage].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map busMap = map([sptd.thermalBus]) + Map storageMap = map([sptd.thermalStorage]) when: def result = dummyEntitySource.enrichEntityData(entityData, "t_bus", busMap, "t_storage", storageMap, ChpInputEntityData::new) @@ -117,7 +115,7 @@ class EntitySourceTest extends Specification { ] def entityData = new EntityData(parameter, AssetInput.class) - Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) @@ -133,7 +131,7 @@ class EntitySourceTest extends Specification { ] def entityData = new EntityData(parameter, AssetInput.class) - Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) @@ -150,7 +148,7 @@ class EntitySourceTest extends Specification { ] def entityData = new EntityData(parameter, AssetInput.class) - Map entityMap = [sptd.emInput].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([sptd.emInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) @@ -167,7 +165,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) @@ -183,7 +181,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) @@ -199,7 +197,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) @@ -217,7 +215,7 @@ class EntitySourceTest extends Specification { ] def entityData = new AssetInputEntityData(parameter, AssetInput.class) - Map entityMap = [GridTestData.nodeA].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map entityMap = map([GridTestData.nodeA]) when: def result = dummyEntitySource.optionallyEnrichEntityData(entityData, "linked_entity", entityMap, GridTestData.nodeB, NodeAssetInputEntityData::new) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy new file mode 100644 index 000000000..57e7a5566 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy @@ -0,0 +1,121 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.test.helper.EntityMap.map + +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.HpInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantEntityData +import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData +import edu.ie3.datamodel.models.input.system.ChpInput +import edu.ie3.datamodel.models.input.system.HpInput +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput +import edu.ie3.datamodel.utils.Try +import edu.ie3.test.common.SystemParticipantTestData +import spock.lang.Specification + +import java.util.stream.Stream + +class SystemParticipantSourceTest extends Specification { + + def "A SystemParticipantSource should build system participant entity from valid and invalid input data as expected"() { + given: + def nodeAssetInputEntityData = Stream.of(new Try.Success<>(new NodeAssetInputEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node))) + + when: + def sysPartEntityDataStream = SystemParticipantSource.systemParticipantEntityStream(nodeAssetInputEntityData, map(emUnits)) + + then: + def element = sysPartEntityDataStream.findFirst().get() + element.success == resultIsPresent + element.data.ifPresent({ + typedEntityData -> + assert (typedEntityData == resultData) + }) + + where: + emUnits | fieldsToAttributes || resultIsPresent || resultData + [] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || false || null + [SystemParticipantTestData.emInput] | ["bla": "foo"] || true || new SystemParticipantEntityData(["bla": "foo"], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) + [SystemParticipantTestData.emInput] | [:] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) + [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778793"] || false || null + [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput) + } + + def "A SystemParticipantSource should build typed entity from valid and invalid input data as expected"() { + given: + def systemParticipantEntityData = Stream.of(new Try.Success<>(new SystemParticipantEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null))) + + when: + def typedEntityDataStream = SystemParticipantSource.typedSystemParticipantEntityStream(systemParticipantEntityData, map(types)) + + then: + def element = typedEntityDataStream.findFirst().get() + element.success == resultIsPresent + element.data.ifPresent({ + typedEntityData -> + assert (typedEntityData == resultData) + }) + + where: + types | fieldsToAttributes || resultIsPresent || resultData + [] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || false || null + [SystemParticipantTestData.chpTypeInput] | ["bla": "foo"] || false || null + [SystemParticipantTestData.chpTypeInput] | [:] || false || null + [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb9"] || false || null + [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || new SystemParticipantTypedEntityData<>([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null, SystemParticipantTestData.chpTypeInput) + } + + def "A SystemParticipantSource should build hp input entity from valid and invalid input data as expected"() { + given: + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput))) + + when: + def hpInputEntityDataOpt = SystemParticipantSource.hpEntityStream(sysPartTypedEntityData, map(thermalBuses)) + + then: + def element = hpInputEntityDataOpt.findFirst().get() + element.success == resultIsPresent + element.data.ifPresent({ + hpInputEntityData -> + assert (hpInputEntityData == resultData) + }) + + where: + thermalBuses | fieldsToAttributes || resultIsPresent || resultData + [] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || false || null + [SystemParticipantTestData.hpInput.thermalBus] | ["bla": "foo"] || false || null + [SystemParticipantTestData.hpInput.thermalBus] | [:] || false || null + [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384f"] || false || null + [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput, SystemParticipantTestData.hpInput.thermalBus) + } + + def "A SystemParticipantSource should build chp input entity from valid and invalid input data as expected"(List thermalStorages, List thermalBuses, Map fieldsToAttributes, boolean resultIsPresent, ChpInputEntityData resultData) { + given: + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput))) + + when: + def hpInputEntityDataOpt = SystemParticipantSource.chpEntityStream(sysPartTypedEntityData, map(thermalStorages), map(thermalBuses)) + + then: + def element = hpInputEntityDataOpt.findFirst().get() + element.success == resultIsPresent + element.data.ifPresent({ + hpInputEntityData -> + assert (hpInputEntityData == resultData) + }) + + where: + thermalStorages | thermalBuses | fieldsToAttributes || resultIsPresent | resultData + [] | [] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || false | null + [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["bla": "foo"] || false | null + [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | [:] || false | null + [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput, SystemParticipantTestData.chpInput.thermalBus, SystemParticipantTestData.chpInput.thermalStorage) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index e9a9a3512..f16a275bb 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -5,18 +5,16 @@ */ package edu.ie3.datamodel.io.source.csv +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.source.EnergyManagementSource import edu.ie3.datamodel.io.source.TypeSource -import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification -import java.util.function.Function -import java.util.stream.Collectors - // TODO test recursion class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { @@ -26,13 +24,13 @@ class CsvEnergyManagementSourceTest extends Specification implements CsvTestData Mock(TypeSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - Map operatorMap = [SystemParticipantTestData.emInput.operator].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map operatorMap = map([SystemParticipantTestData.emInput.operator]) expect: def emUnits = Try.of(() -> csvEnergyManagementSource.getEmUnits(operatorMap), SourceException) emUnits.success emUnits.data.get().size() == 2 - emUnits.data.get() == [SystemParticipantTestData.emInput, SystemParticipantTestData.parentEm].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + emUnits.data.get() == map([SystemParticipantTestData.emInput, SystemParticipantTestData.parentEm]) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy index 18cfb8bcf..05677834b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvGraphicSourceTest.groovy @@ -5,12 +5,13 @@ */ package edu.ie3.datamodel.io.source.csv +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.FailureException import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.source.GraphicSource import edu.ie3.datamodel.io.source.RawGridSource import edu.ie3.datamodel.io.source.TypeSource -import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -21,9 +22,6 @@ import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.Point import spock.lang.Specification -import java.util.function.Function -import java.util.stream.Collectors - class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { def "A CsvGraphicSource should provide an instance of GraphicElements based on valid input data correctly"() { @@ -134,7 +132,7 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) - Map nodeMap = nodeCollection.stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + Map nodeMap = map(nodeCollection) when: graphicSource.getNodeGraphicInput(nodeMap) @@ -158,7 +156,7 @@ class CsvGraphicSourceTest extends Specification implements CsvTestDataMeta { Mock(TypeSource), Mock(RawGridSource), new CsvDataSource(csvSep, graphicsFolderPath, fileNamingStrategy)) - Map lineMap = lineCollection.stream().collect(Collectors.toMap(LineInput::getUuid, Function.identity())) + Map lineMap = map(lineCollection) when: graphicSource.getLineGraphicInput(lineMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy index bd50817db..cf03c2db7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.source.csv +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.factory.input.AssetInputEntityData import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData @@ -12,7 +14,6 @@ import edu.ie3.datamodel.io.factory.input.Transformer3WInputEntityData import edu.ie3.datamodel.io.factory.input.TypedConnectorInputEntityData import edu.ie3.datamodel.io.source.RawGridSource import edu.ie3.datamodel.io.source.TypeSource -import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.SwitchInput import edu.ie3.datamodel.models.input.connector.Transformer3WInput @@ -23,7 +24,6 @@ import edu.ie3.test.common.GridTestData as rgtd import spock.lang.Shared import spock.lang.Specification -import java.util.function.Function import java.util.stream.Collectors import java.util.stream.Stream @@ -60,14 +60,13 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { def validAssetEntityInputData = Stream.of(Try.Success.of(new AssetInputEntityData(fieldsToAttributes, SwitchInput))) - def nodes = [rgtd.nodeA, rgtd.nodeB].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + def nodes = map([rgtd.nodeA, rgtd.nodeB]) when: "the source tries to convert it" def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) then: "everything is fine" - connectorDataOption.forEach { - actualTry -> + connectorDataOption.forEach { actualTry -> assert actualTry.isSuccess() actualTry.data.get().with { assert fieldsToValues == expectedFieldsToAttributes @@ -93,7 +92,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { def validAssetEntityInputData = Stream.of(Try.Success.of(new AssetInputEntityData(fieldsToAttributes, SwitchInput))) - def nodes = [rgtd.nodeA, rgtd.nodeB].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + def nodes = map([rgtd.nodeA, rgtd.nodeB]) when: "the source tries to convert it" def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) @@ -164,12 +163,12 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { ) ] as Set - def nodes = [ + def nodes = map([ rgtd.nodeA, rgtd.nodeB, rgtd.nodeC, rgtd.nodeD - ].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + ]) when: "the source tries to convert it" def actualSet = source.buildUntypedConnectorInputEntityData(validStream, nodes).collect(Collectors.toSet()) @@ -254,7 +253,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { ) ] - def availableTypes = [rgtd.lineTypeInputCtoD].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + def availableTypes = map([rgtd.lineTypeInputCtoD]) when: "the source tries to convert it" def actualSet = source.buildTypedConnectorEntityData(validStream, availableTypes).collect(Collectors.toSet()) @@ -302,11 +301,11 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { rgtd.nodeB, rgtd.transformerTypeAtoBtoC), SourceException)) - def availableNodes = [ + def availableNodes = map([ rgtd.nodeA, rgtd.nodeB, rgtd.nodeC - ].stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + ]) def expected = new Transformer3WInputEntityData([ "uuid" : "cc327469-7d56-472b-a0df-edbb64f90e8f", diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 2c6cb53c2..e18f9aa46 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -5,30 +5,14 @@ */ package edu.ie3.datamodel.io.source.csv +import static edu.ie3.test.helper.EntityMap.map + import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.exceptions.SystemParticipantsException -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.HpInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData -import edu.ie3.datamodel.io.source.RawGridSource -import edu.ie3.datamodel.io.source.SystemParticipantSource -import edu.ie3.datamodel.io.source.ThermalSource -import edu.ie3.datamodel.io.source.TypeSource +import edu.ie3.datamodel.io.source.* import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.system.BmInput -import edu.ie3.datamodel.models.input.system.ChpInput -import edu.ie3.datamodel.models.input.system.EvInput -import edu.ie3.datamodel.models.input.system.EvcsInput -import edu.ie3.datamodel.models.input.system.FixedFeedInInput -import edu.ie3.datamodel.models.input.system.HpInput -import edu.ie3.datamodel.models.input.system.LoadInput -import edu.ie3.datamodel.models.input.system.PvInput -import edu.ie3.datamodel.models.input.system.StorageInput -import edu.ie3.datamodel.models.input.system.WecInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalStorageInput +import edu.ie3.datamodel.models.input.system.* import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Specification @@ -40,10 +24,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, fileNamingStrategy)) def thermalSource = new ThermalSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def rawGridSource = new RawGridSource(typeSource, new CsvDataSource(csvSep, gridDefaultFolderPath, fileNamingStrategy)) + def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, + energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -73,13 +59,15 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat ]) { // partly fake the return method of the csv raw grid source to always return empty node sets // -> elements to build NodeGraphicInputs are missing - getNodes() >> new HashSet() - getNodes(_) >> new HashSet() + getNodes() >> new HashMap() + getNodes(_) >> new HashMap() } as RawGridSource + def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, + energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -94,96 +82,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat ex.message.startsWith("10 error(s) occurred while initializing system participants. " + "edu.ie3.datamodel.exceptions.FailureException: 1 exception(s) occurred within \"FixedFeedInInput\" data, one is: " + "edu.ie3.datamodel.exceptions.FactoryException: edu.ie3.datamodel.exceptions.SourceException: " + - "Failure due to: Skipping FixedFeedInInput with uuid ") - } - - def "A SystemParticipantSource with csv input should build typed entity from valid and invalid input data as expected"() { - given: - def csvSystemParticipantSource = new SystemParticipantSource( - Mock(TypeSource), - Mock(ThermalSource), - Mock(RawGridSource), - new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - - def nodeAssetInputEntityData = new NodeAssetInputEntityData(fieldsToAttributes, clazz, operator, node) - - when: - def typedEntityDataOpt = csvSystemParticipantSource.buildTypedEntityData(nodeAssetInputEntityData, types) - - then: - typedEntityDataOpt.success == resultIsPresent - typedEntityDataOpt.data.ifPresent({ typedEntityData -> - assert (typedEntityData == resultData) - }) - - where: - types | node | operator | fieldsToAttributes | clazz || resultIsPresent || resultData - []| sptd.chpInput.node | sptd.chpInput.operator | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] | ChpInput || false || null - [sptd.chpTypeInput] | sptd.chpInput.node | sptd.chpInput.operator | ["bla": "foo"] | ChpInput || false || null - [sptd.chpTypeInput] | sptd.chpInput.node | sptd.chpInput.operator | [:] | ChpInput || false || null - [sptd.chpTypeInput] | sptd.chpInput.node | sptd.chpInput.operator | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb9"] | ChpInput || false || null - [sptd.chpTypeInput] | sptd.chpInput.node | sptd.chpInput.operator | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] | ChpInput || true || new SystemParticipantTypedEntityData<>([:], clazz, operator, node, sptd.chpTypeInput) - } - - def "A SystemParticipantSource with csv input should build hp input entity from valid and invalid input data as expected"() { - given: - def csvSystemParticipantSource = new SystemParticipantSource( - Mock(TypeSource), - Mock(ThermalSource), - Mock(RawGridSource), - new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - - def sysPartTypedEntityData = new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, sptd.hpInput.operator, sptd.hpInput.node, sptd.hpTypeInput) - - when: - def hpInputEntityDataOpt = csvSystemParticipantSource.createHpEntityData(sysPartTypedEntityData, thermalBuses) - - then: - hpInputEntityDataOpt.success == resultIsPresent - hpInputEntityDataOpt.data.ifPresent({ hpInputEntityData -> - assert (hpInputEntityData == resultData) - }) - - where: - thermalBuses | fieldsToAttributes || resultIsPresent || resultData - [] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || false || null - [sptd.hpInput.thermalBus] | ["bla": "foo"] || false || null - [sptd.hpInput.thermalBus] | [:] || false || null - [sptd.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384f"] || false || null - [sptd.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], sptd.hpInput.operator, sptd.hpInput.node, sptd.hpTypeInput, sptd.hpInput.thermalBus) - } - - def "A SystemParticipantSource with csv input should build chp input entity from valid and invalid input data as expected"(List thermalStorages, List thermalBuses, Map fieldsToAttributes, boolean resultIsPresent, ChpInputEntityData resultData) { - given: - def csvSystemParticipantSource = new SystemParticipantSource( - Mock(TypeSource), - Mock(ThermalSource), - Mock(RawGridSource), - new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - - def sysPartTypedEntityData = new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, sptd.chpInput.operator, sptd.chpInput.node, sptd.chpTypeInput) - - when: - def hpInputEntityDataOpt = csvSystemParticipantSource.buildChpEntityData(sysPartTypedEntityData, thermalStorages, thermalBuses) - - then: - hpInputEntityDataOpt.success == resultIsPresent - hpInputEntityDataOpt.data.ifPresent({ hpInputEntityData -> - assert (hpInputEntityData == resultData) - }) - - where: - thermalStorages | thermalBuses | fieldsToAttributes || resultIsPresent | resultData - [] as List | [] as List | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || false | null - [ - sptd.chpInput.thermalStorage - ] as List | [sptd.chpInput.thermalBus] as List | ["bla": "foo"] || false | null - [ - sptd.chpInput.thermalStorage - ] as List | [sptd.chpInput.thermalBus] as List | [:] || false | null - [ - sptd.chpInput.thermalStorage - ] as List | [sptd.chpInput.thermalBus] as List | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], sptd.chpInput.operator, sptd.chpInput.node, sptd.chpTypeInput, sptd.chpInput.thermalBus, sptd.chpInput.thermalStorage) + "Linked node with UUID 4ca90220-74c2-4369-9afa-a18bf068840d was not found for entity AssetInputEntityData") } def "A SystemParticipantSource with csv input should return data from a valid heat pump input file as expected"() { @@ -192,10 +91,13 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def nodeMap = map([sptd.hpInput.node]) + def emUnitsMap = map([sptd.emInput]) expect: - def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(nodes as Set, operators as Set, types as Set, thermalBuses as Set), SourceException) + def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses)), SourceException) if (heatPumps.success) { heatPumps.data.get().size() == resultingSize @@ -205,15 +107,15 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat } where: - nodes | operators | types | thermalBuses || resultingSize || resultingSet - [sptd.hpInput.node] | [sptd.hpInput.operator] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 || [sptd.hpInput] - [sptd.hpInput.node] | [] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 || [ - new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.hpInput.type) + nodes | operators | types | thermalBuses || resultingSize | resultingSet + [sptd.hpInput.node] | [sptd.hpInput.operator] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [sptd.hpInput] + [sptd.hpInput.node] | [] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [ + new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.emInput, sptd.hpInput.type) ] - [] | [] | [] | [] || 0 || [] - [sptd.hpInput.node] | [] | [] | [] || 0 || [] - [sptd.hpInput.node] | [sptd.hpInput.operator] | [] | [] || 0 || [] - [sptd.hpInput.node] | [sptd.hpInput.operator] | [sptd.hpInput.type] | [] || 0 || [] + [] | [] | [] | [] || 0 | [] + [sptd.hpInput.node] | [] | [] | [] || 0 | [] + [sptd.hpInput.node] | [sptd.hpInput.operator] | [] | [] || 0 | [] + [sptd.hpInput.node] | [sptd.hpInput.operator] | [sptd.hpInput.type] | [] || 0 | [] } def "A SystemParticipantSource with csv input should return data from a valid chp input file as expected"() { @@ -222,10 +124,13 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def nodeMap = map([sptd.hpInput.node]) + def emUnitsMap = map([sptd.emInput]) expect: - def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(nodes as Set, operators as Set, types as Set, thermalBuses as Set, thermalStorages as Set), SourceException) + def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses), map(thermalStorages)), SourceException) if (chpUnits.success) { chpUnits.data.get().size() == resultingSize @@ -235,19 +140,15 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat } where: - nodes | operators | types | thermalBuses | thermalStorages || resultingSize || resultingSet - [sptd.chpInput.node]| [sptd.chpInput.operator]| [sptd.chpInput.type]| [sptd.chpInput.thermalBus]| [ - sptd.chpInput.thermalStorage - ] as List || 1 || [sptd.chpInput] - [sptd.chpInput.node]| []| [sptd.chpInput.type]| [sptd.chpInput.thermalBus]| [ - sptd.chpInput.thermalStorage - ] as List || 1 || [ - new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction) + operators | types | thermalBuses | thermalStorages || resultingSize || resultingSet + [sptd.chpInput.operator] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || 1 || [sptd.chpInput] + [] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || 1 || [ + new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.emInput, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction) ] - [] | [] | [] | [] | [] as List || 0 || [] - [sptd.chpInput.node] | [] | [] | [] | [] as List || 0 || [] - [sptd.chpInput.node] | [sptd.chpInput.operator] | [] | [] | [] as List || 0 || [] - [sptd.chpInput.node] | [sptd.chpInput.operator] | [sptd.chpInput.type] | [] | [] as List || 0 || [] + [] | [] | [] | [] || 0 || [] + [] | [] | [] | [] || 0 || [] + [sptd.chpInput.operator] | [] | [] | [] || 0 || [] + [sptd.chpInput.operator] | [sptd.chpInput.type] | [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid ev input file as expected"() { @@ -256,10 +157,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(nodes as Set, operators as Set, types as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -271,12 +174,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators | types || resultingSize || resultingSet [sptd.evInput.node] | [sptd.evInput.operator] | [sptd.evInput.type] || 1 || [sptd.evInput] - [sptd.evInput.node] | [] | [sptd.evInput.type] || 1 || [ - new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.evInput.type) + [sptd.evInput.node] | [] | [sptd.evInput.type] || 1 || [ + new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.emInput, sptd.evInput.type) ] - [sptd.evInput.node] | [sptd.evInput.operator] | [] || 0 || [] - [sptd.evInput.node] | [] | [] || 0 || [] - [] | [] | [] || 0 || [] + [sptd.evInput.node] | [sptd.evInput.operator] | [] || 0 || [] + [sptd.evInput.node] | [] | [] || 0 || [] + [] | [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid wec input file as expected"() { @@ -285,10 +188,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(nodes as Set, operators as Set, types as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -300,12 +205,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators | types || resultingSize || resultingSet [sptd.wecInput.node] | [sptd.wecInput.operator] | [sptd.wecInput.type] || 1 || [sptd.wecInput] - [sptd.wecInput.node] | [] | [sptd.wecInput.type] || 1 || [ - new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.wecInput.type, sptd.wecInput.marketReaction) + [sptd.wecInput.node] | [] | [sptd.wecInput.type] || 1 || [ + new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.emInput, sptd.wecInput.type, sptd.wecInput.marketReaction) ] - [sptd.wecInput.node] | [sptd.wecInput.operator] | [] || 0 || [] - [sptd.wecInput.node] | [] | [] || 0 || [] - [] | [] | [] || 0 || [] + [sptd.wecInput.node] | [sptd.wecInput.operator] | [] || 0 || [] + [sptd.wecInput.node] | [] | [] || 0 || [] + [] | [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid storage input file as expected"() { @@ -314,10 +219,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(nodes as Set, operators as Set, types as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -329,12 +236,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators | types || resultingSize || resultingSet [sptd.storageInput.node] | [sptd.storageInput.operator] | [sptd.storageInput.type] || 1 || [sptd.storageInput] - [sptd.storageInput.node] | [] | [sptd.storageInput.type] || 1 || [ - new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.storageInput.type) + [sptd.storageInput.node] | [] | [sptd.storageInput.type] || 1 || [ + new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.emInput, sptd.storageInput.type) ] - [sptd.storageInput.node] | [sptd.storageInput.operator] | [] || 0 || [] - [sptd.storageInput.node] | [] | [] || 0 || [] - [] | [] | [] || 0 || [] + [sptd.storageInput.node] | [sptd.storageInput.operator] | [] || 0 || [] + [sptd.storageInput.node] | [] | [] || 0 || [] + [] | [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid bm input file as expected"() { @@ -343,10 +250,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(nodes as Set, operators as Set, types as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -358,12 +267,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators | types || resultingSize || resultingSet [sptd.bmInput.node] | [sptd.bmInput.operator] | [sptd.bmInput.type] || 1 || [sptd.bmInput] - [sptd.bmInput.node] | [] | [sptd.bmInput.type] || 1 || [ - new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff) + [sptd.bmInput.node] | [] | [sptd.bmInput.type] || 1 || [ + new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.emInput, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff) ] - [sptd.bmInput.node] | [sptd.bmInput.operator] | [] || 0 || [] - [sptd.bmInput.node] | [] | [] || 0 || [] - [] | [] | [] || 0 || [] + [sptd.bmInput.node] | [sptd.bmInput.operator] | [] || 0 || [] + [sptd.bmInput.node] | [] | [] || 0 || [] + [] | [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid ev charging station input file as expected"() { @@ -372,10 +281,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(nodes as Set, operators as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(map(operators), map(nodes), emUnitsMap), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -388,10 +299,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators || resultingSize || resultingSet [sptd.evcsInput.node] | [sptd.evcsInput.operator] || 1 || [sptd.evcsInput] [sptd.evcsInput.node] | [] || 1 || [ - new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport) + new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.emInput, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport) ] - []| [sptd.evcsInput.operator]|| 0 || [] - []| []|| 0 || [] + [] | [sptd.evcsInput.operator] || 0 || [] + [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid load input file as expected"() { @@ -400,10 +311,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(nodes as Set, operators as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(map(operators), map(nodes), emUnitsMap), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -415,11 +328,11 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators || resultingSize || resultingSet [sptd.loadInput.node] | [sptd.loadInput.operator] || 1 || [sptd.loadInput] - [sptd.loadInput.node] | [] || 1 || [ - new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated) + [sptd.loadInput.node] | [] || 1 || [ + new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.emInput, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated) ] - [] | [sptd.loadInput.operator] || 0 || [] - [] | [] || 0 || [] + [] | [sptd.loadInput.operator] || 0 || [] + [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid pv input file as expected"() { @@ -428,10 +341,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(nodes as Set, operators as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(map(operators), map(nodes), emUnitsMap), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -443,11 +358,11 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat where: nodes | operators || resultingSize || resultingSet [sptd.pvInput.node] | [sptd.pvInput.operator] || 1 || [sptd.pvInput] - [sptd.pvInput.node] | [] || 1 || [ - new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated) + [sptd.pvInput.node] | [] || 1 || [ + new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.emInput, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated) ] - [] | [sptd.pvInput.operator] || 0 || [] - [] | [] || 0 || [] + [] | [sptd.pvInput.operator] || 0 || [] + [] | [] || 0 || [] } def "A SystemParticipantSource with csv input should return data from valid fixedFeedIn input file as expected"() { @@ -456,10 +371,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), + Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) + def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(nodes as Set, operators as Set), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(map(operators), map(nodes), emUnitsMap), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -469,16 +386,12 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat } where: - nodes | operators || resultingSize || resultingSet - [sptd.fixedFeedInInput.node] | [ - sptd.fixedFeedInInput.operator - ] as List || 1 || [sptd.fixedFeedInInput] - [sptd.fixedFeedInInput.node] | [] as List || 1 || [ - new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated) + nodes | operators || resultingSize || resultingSet + [sptd.fixedFeedInInput.node] | [sptd.fixedFeedInInput.operator] || 1 || [sptd.fixedFeedInInput] + [sptd.fixedFeedInInput.node] | [] || 1 || [ + new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.emInput, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated) ] - [] | [ - sptd.fixedFeedInInput.operator - ] as List || 0 || [] - [] | [] as List || 0 || [] + [] | [sptd.fixedFeedInInput.operator] || 0 || [] + [] | [] || 0 || [] } } diff --git a/src/test/groovy/edu/ie3/test/helper/EntityMap.groovy b/src/test/groovy/edu/ie3/test/helper/EntityMap.groovy new file mode 100644 index 000000000..3e24b2508 --- /dev/null +++ b/src/test/groovy/edu/ie3/test/helper/EntityMap.groovy @@ -0,0 +1,17 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.test.helper + +import edu.ie3.datamodel.models.UniqueEntity + +import java.util.function.Function +import java.util.stream.Collectors + +class EntityMap { + static Map map(Collection entities) { + entities.stream().collect(Collectors.toMap(UniqueEntity::getUuid, Function.identity())) + } +} diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv index 7d9de239a..4a11cda89 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,7d6f1763-0c1d-4266-a76f-59163ad3808b,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e From 4f9b4380adcb7f3fdb23d27f7f4b27ac47a01e95 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 30 Dec 2023 20:55:36 +0100 Subject: [PATCH 17/31] Fixing ThermalSource tests --- .../io/source/ThermalSourceTest.groovy | 62 ++++++++++ .../io/source/csv/CsvThermalSourceTest.groovy | 112 ++++++------------ .../models/input/system/ChpInputTest.groovy | 2 - .../common/SystemParticipantTestData.groovy | 2 + .../_thermal/cylindrical_storage_input.csv | 2 +- 5 files changed, 99 insertions(+), 81 deletions(-) create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy new file mode 100644 index 000000000..224773490 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/ThermalSourceTest.groovy @@ -0,0 +1,62 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.test.helper.EntityMap.map + +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.io.factory.input.ThermalUnitInputEntityData +import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.thermal.ThermalBusInput +import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput +import edu.ie3.datamodel.utils.Try +import spock.lang.Specification + +import java.util.stream.Collectors +import java.util.stream.Stream + +class ThermalSourceTest extends Specification { + + def "A ThermalSource should build thermal unit input entity from valid and invalid input data as expected"() { + given: + def operator = new OperatorInput(UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "testOperator") + def validFieldsToAttributes = [ + "uuid" : "717af017-cc69-406f-b452-e022d7fb516a", + "id" : "test_thermal_unit", + "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", + "operatesFrom" : "2020-03-24 15:11:31", + "operatesUntil" : "2020-03-25 15:11:31", + "thermalBus" : "0d95d7f2-49fb-4d49-8636-383a5220384e" + ] + def assetInputEntityData = Stream.of(new Try.Success(new AssetInputEntityData(validFieldsToAttributes, ThermalUnitInput, operator))) + + when: + def resultingDataOpt = ThermalSource.thermalUnitInputEntityDataStream(assetInputEntityData, map(thermalBuses)).collect(Collectors.toList()) + + then: + resultingDataOpt.size() == 1 + resultingDataOpt.first().data.present == resultIsPresent + resultingDataOpt.first().data.ifPresent({ resultingData -> + assert (resultingData == expectedThermalUnitInputEntityData) + }) + + where: + thermalBuses || resultIsPresent | expectedThermalUnitInputEntityData + [] || false | null // thermal buses are not present -> method should return an empty optional -> do not check for thermal unit entity data + [ + new ThermalBusInput(UUID.fromString("0d95d7f2-49fb-4d49-8636-383a5220384e"), "test_thermal_bus") + ] || true | + new ThermalUnitInputEntityData([ + "uuid" : "717af017-cc69-406f-b452-e022d7fb516a", + "id" : "test_thermal_unit", + "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", + "operatesFrom" : "2020-03-24 15:11:31", + "operatesUntil": "2020-03-25 15:11:31"], + ThermalUnitInput, + new OperatorInput(UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "testOperator"), + new ThermalBusInput(UUID.fromString("0d95d7f2-49fb-4d49-8636-383a5220384e"), "test_thermal_bus")) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index e94c288e1..0098dbf53 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -5,20 +5,13 @@ */ package edu.ie3.datamodel.io.source.csv -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData -import edu.ie3.datamodel.io.factory.input.ThermalUnitInputEntityData import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.source.ThermalSource import edu.ie3.datamodel.io.source.TypeSource -import edu.ie3.datamodel.models.input.OperatorInput -import edu.ie3.datamodel.models.input.thermal.ThermalBusInput -import edu.ie3.datamodel.models.input.thermal.ThermalUnitInput import edu.ie3.test.common.SystemParticipantTestData as sptd import edu.ie3.test.common.ThermalUnitInputTestData import spock.lang.Specification -import java.util.stream.Collectors - class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { def "A CsvThermalSource should return ThermalBuses from valid and invalid input data as expected"() { @@ -33,10 +26,11 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalBusesWoOperator.size() == 1 - resultingThermalBusesWoOperator.first().uuid == sptd.thermalBus.uuid - resultingThermalBusesWoOperator.first().id == sptd.thermalBus.id - resultingThermalBusesWoOperator.first().operator == sptd.thermalBus.operator - resultingThermalBusesWoOperator.first().operationTime == sptd.thermalBus.operationTime + def thermalBusWoOp = resultingThermalBusesWoOperator.values().first() + thermalBusWoOp.uuid == sptd.thermalBus.uuid + thermalBusWoOp.id == sptd.thermalBus.id + thermalBusWoOp.operator == sptd.thermalBus.operator + thermalBusWoOp.operationTime == sptd.thermalBus.operationTime //test method when operators are provided as constructor parameters when: @@ -44,10 +38,11 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalBuses.size() == 1 - resultingThermalBuses.first().uuid == sptd.thermalBus.uuid - resultingThermalBuses.first().id == sptd.thermalBus.id - resultingThermalBuses.first().operator == sptd.thermalBus.operator - resultingThermalBuses.first().operationTime == sptd.thermalBus.operationTime + def thermalBus = resultingThermalBuses.values().first() + thermalBus.uuid == sptd.thermalBus.uuid + thermalBus.id == sptd.thermalBus.id + thermalBus.operator == sptd.thermalBus.operator + thermalBus.operationTime == sptd.thermalBus.operationTime } def "A CsvThermalSource should return a CylindricalStorageInput from valid and invalid input data as expected"() { @@ -92,47 +87,6 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { resultingCylindricalStorage.first().c == sptd.c } - def "A CsvThermalSource should build thermal unit input entity from valid and invalid input data as expected"() { - given: - def csvTypeSource = new TypeSource(new CsvDataSource(",", typeFolderPath, new FileNamingStrategy())) - def csvThermalSource = new ThermalSource(csvTypeSource, new CsvDataSource(csvSep, thermalFolderPath, fileNamingStrategy)) - def operator = new OperatorInput(UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "testOperator") - def validFieldsToAttributes = [ - "uuid" : "717af017-cc69-406f-b452-e022d7fb516a", - "id" : "test_thermal_unit", - "operator" : "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom" : "2020-03-24 15:11:31", - "operatesUntil" : "2020-03-25 15:11:31", - "thermalBus" : "0d95d7f2-49fb-4d49-8636-383a5220384e" - ] - def assetInputEntityData = new AssetInputEntityData(validFieldsToAttributes, ThermalUnitInput, operator) - - when: - def resultingDataOpt = csvThermalSource.buildThermalUnitInputEntityData(assetInputEntityData, thermalBuses).collect(Collectors.toList()) - - then: - resultingDataOpt.size() == 1 - resultingDataOpt.first().data.present == resultIsPresent - resultingDataOpt.first().data.ifPresent({ resultingData -> - assert (resultingData == expectedThermalUnitInputEntityData) - }) - - where: - thermalBuses || resultIsPresent || expectedThermalUnitInputEntityData - []|| false || null // thermal buses are not present -> method should return an empty optional -> do not check for thermal unit entity data - [ - new ThermalBusInput(UUID.fromString("0d95d7f2-49fb-4d49-8636-383a5220384e"), "test_thermal_bus") - ]|| true || - new ThermalUnitInputEntityData(["uuid": "717af017-cc69-406f-b452-e022d7fb516a", - "id": "test_thermal_unit", - "operator": "8f9682df-0744-4b58-a122-f0dc730f6510", - "operatesFrom": "2020-03-24 15:11:31", - "operatesUntil": "2020-03-25 15:11:31"], - ThermalUnitInput, - new OperatorInput(UUID.fromString("8f9682df-0744-4b58-a122-f0dc730f6510"), "testOperator"), - new ThermalBusInput(UUID.fromString("0d95d7f2-49fb-4d49-8636-383a5220384e"), "test_thermal_bus")) - } - def "A CsvThermalSource should return a ThermalHouseInput from valid and invalid input data as expected"() { given: def csvTypeSource = new TypeSource(new CsvDataSource(",", typeFolderPath, new FileNamingStrategy())) @@ -146,17 +100,18 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalHouseWoOperator.size() == 1 - resultingThermalHouseWoOperator.first().uuid == ThermalUnitInputTestData.thermalHouseInput.uuid - resultingThermalHouseWoOperator.first().id == ThermalUnitInputTestData.thermalHouseInput.id - resultingThermalHouseWoOperator.first().operator == ThermalUnitInputTestData.thermalHouseInput.operator - resultingThermalHouseWoOperator.first().operationTime.isLimited() - resultingThermalHouseWoOperator.first().operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime - resultingThermalHouseWoOperator.first().thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus - resultingThermalHouseWoOperator.first().ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses - resultingThermalHouseWoOperator.first().ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa - resultingThermalHouseWoOperator.first().targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature - resultingThermalHouseWoOperator.first().upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit - resultingThermalHouseWoOperator.first().lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + def thermalHouseWoOp = resultingThermalHouseWoOperator.values().first() + thermalHouseWoOp.uuid == ThermalUnitInputTestData.thermalHouseInput.uuid + thermalHouseWoOp.id == ThermalUnitInputTestData.thermalHouseInput.id + thermalHouseWoOp.operator == ThermalUnitInputTestData.thermalHouseInput.operator + thermalHouseWoOp.operationTime.isLimited() + thermalHouseWoOp.operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime + thermalHouseWoOp.thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus + thermalHouseWoOp.ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses + thermalHouseWoOp.ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa + thermalHouseWoOp.targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature + thermalHouseWoOp.upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit + thermalHouseWoOp.lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit //test method when operators and thermal buses are provided as constructor parameters when: @@ -164,16 +119,17 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalHouse.size() == 1 - resultingThermalHouse.first().uuid == ThermalUnitInputTestData.thermalHouseInput.uuid - resultingThermalHouse.first().id == ThermalUnitInputTestData.thermalHouseInput.id - resultingThermalHouse.first().operator == ThermalUnitInputTestData.thermalHouseInput.operator - resultingThermalHouse.first().operationTime.isLimited() - resultingThermalHouse.first().operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime - resultingThermalHouseWoOperator.first().thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus - resultingThermalHouse.first().ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses - resultingThermalHouse.first().ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa - resultingThermalHouse.first().targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature - resultingThermalHouse.first().upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit - resultingThermalHouse.first().lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + def thermalHouse = resultingThermalHouse.values().first() + thermalHouse .uuid == ThermalUnitInputTestData.thermalHouseInput.uuid + thermalHouse.id == ThermalUnitInputTestData.thermalHouseInput.id + thermalHouse.operator == ThermalUnitInputTestData.thermalHouseInput.operator + thermalHouse.operationTime.isLimited() + thermalHouse.operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime + thermalHouse.thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus + thermalHouse.ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses + thermalHouse.ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa + thermalHouse.targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature + thermalHouse.upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit + thermalHouse.lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy index 8eee5450b..b21f73dfe 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.models.input.system import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification - class ChpInputTest extends Specification { def "A ChpInput copy method should work as expected"() { @@ -19,7 +18,6 @@ class ChpInputTest extends Specification { def alteredUnit = chpInput.copy().thermalBus(SystemParticipantTestData.thermalBus) .type(SystemParticipantTestData.chpTypeInput).thermalStorage(SystemParticipantTestData.thermalStorage).marketReaction(true).build() - then: alteredUnit.with { assert uuid == chpInput.uuid diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index 97c38532e..dbcc06e33 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -177,6 +177,8 @@ class SystemParticipantTestData { public static final ThermalStorageInput thermalStorage = new CylindricalStorageInput( UUID.fromString("8851813b-3a7d-4fee-874b-4df9d724e4b3"), "test_cylindricThermalStorage", + GridTestData.profBroccoli, + OperationTime.notLimited(), thermalBus, storageVolumeLvl, storageVolumeLvlMin, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv index 7d9de239a..4a11cda89 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_thermal/cylindrical_storage_input.csv @@ -1,2 +1,2 @@ uuid,c,id,inlet_temp,operates_from,operates_until,operator,return_temp,storage_volume_lvl,storage_volume_lvl_min,thermal_bus -8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,7d6f1763-0c1d-4266-a76f-59163ad3808b,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e +8851813b-3a7d-4fee-874b-4df9d724e4b3,1.0,test_cylindricThermalStorage,110.0,,,f15105c4-a2de-4ab8-a621-4bc98e372d92,80.0,1.039154027,0.3,0d95d7f2-49fb-4d49-8636-383a5220384e From 67a13002969e972a6e48f9c01c48948bbc6b3f0d Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 30 Dec 2023 22:42:53 +0100 Subject: [PATCH 18/31] Fixing TypeSource tests --- .../io/source/csv/CsvTypeSourceTest.groovy | 189 ++++++++---------- 1 file changed, 88 insertions(+), 101 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy index ecc205a40..922166edd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy @@ -12,7 +12,6 @@ import edu.ie3.test.common.GridTestData as gtd import edu.ie3.test.common.SystemParticipantTestData as sptd import spock.lang.Specification - class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def "A CsvTypeSource should read and handle valid 2W Transformer type file as expected"() { @@ -21,9 +20,7 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { expect: def transformer2WTypes = typeSource.transformer2WTypes - def transformerToBeFound = transformer2WTypes.find {trafoType -> - trafoType.uuid ==gtd.transformerTypeBtoD.uuid - } + def transformerToBeFound = transformer2WTypes.get(gtd.transformerTypeBtoD.uuid) transformerToBeFound.id == gtd.transformerTypeBtoD.id transformerToBeFound.rSc == gtd.transformerTypeBtoD.rSc transformerToBeFound.xSc == gtd.transformerTypeBtoD.xSc @@ -50,10 +47,8 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { expect: def operators = typeSource.operators - operators.first().uuid == firstOperator.uuid - operators.first().id == firstOperator.id - operators[1].uuid == secondOperator.uuid - operators[1].id == secondOperator.id + operators.get(firstOperator.uuid) == firstOperator + operators.get(secondOperator.uuid) == secondOperator } def "A CsvTypeSource should read and handle valid line type file as expected"() { @@ -61,15 +56,14 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def lineTypes = typeSource.lineTypes - lineTypes.first().uuid == gtd.lineTypeInputCtoD.uuid - lineTypes.first().id == gtd.lineTypeInputCtoD.id - lineTypes.first().b == gtd.lineTypeInputCtoD.b - lineTypes.first().g == gtd.lineTypeInputCtoD.g - lineTypes.first().r == gtd.lineTypeInputCtoD.r - lineTypes.first().x == gtd.lineTypeInputCtoD.x - lineTypes.first().iMax == gtd.lineTypeInputCtoD.iMax - lineTypes.first().vRated == gtd.lineTypeInputCtoD.vRated + def lineType = typeSource.lineTypes.get(gtd.lineTypeInputCtoD.uuid) + lineType.id == gtd.lineTypeInputCtoD.id + lineType.b == gtd.lineTypeInputCtoD.b + lineType.g == gtd.lineTypeInputCtoD.g + lineType.r == gtd.lineTypeInputCtoD.r + lineType.x == gtd.lineTypeInputCtoD.x + lineType.iMax == gtd.lineTypeInputCtoD.iMax + lineType.vRated == gtd.lineTypeInputCtoD.vRated } def "A CsvTypeSource should read and handle valid 3W Transformer type file as expected"() { @@ -77,28 +71,27 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def transformer3WTypes = typeSource.transformer3WTypes - transformer3WTypes.first().uuid == gtd.transformerTypeAtoBtoC.uuid - transformer3WTypes.first().id == gtd.transformerTypeAtoBtoC.id - transformer3WTypes.first().sRatedA == gtd.transformerTypeAtoBtoC.sRatedA - transformer3WTypes.first().sRatedB == gtd.transformerTypeAtoBtoC.sRatedB - transformer3WTypes.first().sRatedC == gtd.transformerTypeAtoBtoC.sRatedC - transformer3WTypes.first().vRatedA == gtd.transformerTypeAtoBtoC.vRatedA - transformer3WTypes.first().vRatedB == gtd.transformerTypeAtoBtoC.vRatedB - transformer3WTypes.first().vRatedC == gtd.transformerTypeAtoBtoC.vRatedC - transformer3WTypes.first().rScA == gtd.transformerTypeAtoBtoC.rScA - transformer3WTypes.first().rScB == gtd.transformerTypeAtoBtoC.rScB - transformer3WTypes.first().rScC == gtd.transformerTypeAtoBtoC.rScC - transformer3WTypes.first().xScA == gtd.transformerTypeAtoBtoC.xScA - transformer3WTypes.first().xScB == gtd.transformerTypeAtoBtoC.xScB - transformer3WTypes.first().xScC == gtd.transformerTypeAtoBtoC.xScC - transformer3WTypes.first().gM == gtd.transformerTypeAtoBtoC.gM - transformer3WTypes.first().bM == gtd.transformerTypeAtoBtoC.bM - transformer3WTypes.first().dV == gtd.transformerTypeAtoBtoC.dV - transformer3WTypes.first().dPhi == gtd.transformerTypeAtoBtoC.dPhi - transformer3WTypes.first().tapNeutr == gtd.transformerTypeAtoBtoC.tapNeutr - transformer3WTypes.first().tapMin == gtd.transformerTypeAtoBtoC.tapMin - transformer3WTypes.first().tapMax == gtd.transformerTypeAtoBtoC.tapMax + def transformer3WType = typeSource.transformer3WTypes.get(gtd.transformerTypeAtoBtoC.uuid) + transformer3WType.id == gtd.transformerTypeAtoBtoC.id + transformer3WType.sRatedA == gtd.transformerTypeAtoBtoC.sRatedA + transformer3WType.sRatedB == gtd.transformerTypeAtoBtoC.sRatedB + transformer3WType.sRatedC == gtd.transformerTypeAtoBtoC.sRatedC + transformer3WType.vRatedA == gtd.transformerTypeAtoBtoC.vRatedA + transformer3WType.vRatedB == gtd.transformerTypeAtoBtoC.vRatedB + transformer3WType.vRatedC == gtd.transformerTypeAtoBtoC.vRatedC + transformer3WType.rScA == gtd.transformerTypeAtoBtoC.rScA + transformer3WType.rScB == gtd.transformerTypeAtoBtoC.rScB + transformer3WType.rScC == gtd.transformerTypeAtoBtoC.rScC + transformer3WType.xScA == gtd.transformerTypeAtoBtoC.xScA + transformer3WType.xScB == gtd.transformerTypeAtoBtoC.xScB + transformer3WType.xScC == gtd.transformerTypeAtoBtoC.xScC + transformer3WType.gM == gtd.transformerTypeAtoBtoC.gM + transformer3WType.bM == gtd.transformerTypeAtoBtoC.bM + transformer3WType.dV == gtd.transformerTypeAtoBtoC.dV + transformer3WType.dPhi == gtd.transformerTypeAtoBtoC.dPhi + transformer3WType.tapNeutr == gtd.transformerTypeAtoBtoC.tapNeutr + transformer3WType.tapMin == gtd.transformerTypeAtoBtoC.tapMin + transformer3WType.tapMax == gtd.transformerTypeAtoBtoC.tapMax } def "A CsvTypeSource should read and handle valid bm type file as expected"() { @@ -106,14 +99,13 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def bmTypes = typeSource.bmTypes - bmTypes.first().uuid == sptd.bmTypeInput.uuid - bmTypes.first().id == sptd.bmTypeInput.id - bmTypes.first().capex == sptd.bmTypeInput.capex - bmTypes.first().opex == sptd.bmTypeInput.opex - bmTypes.first().cosPhiRated == sptd.bmTypeInput.cosPhiRated - bmTypes.first().activePowerGradient == sptd.bmTypeInput.activePowerGradient - bmTypes.first().etaConv == sptd.bmTypeInput.etaConv + def bmType = typeSource.bmTypes.get(sptd.bmTypeInput.uuid) + bmType.id == sptd.bmTypeInput.id + bmType.capex == sptd.bmTypeInput.capex + bmType.opex == sptd.bmTypeInput.opex + bmType.cosPhiRated == sptd.bmTypeInput.cosPhiRated + bmType.activePowerGradient == sptd.bmTypeInput.activePowerGradient + bmType.etaConv == sptd.bmTypeInput.etaConv } def "A CsvTypeSource should read and handle valid chp type file as expected"() { @@ -121,16 +113,15 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def chpTypes = typeSource.chpTypes - chpTypes.first().uuid == sptd.chpTypeInput.uuid - chpTypes.first().id == sptd.chpTypeInput.id - chpTypes.first().capex == sptd.chpTypeInput.capex - chpTypes.first().opex == sptd.chpTypeInput.opex - chpTypes.first().etaEl == sptd.chpTypeInput.etaEl - chpTypes.first().etaThermal == sptd.chpTypeInput.etaThermal - chpTypes.first().sRated == sptd.chpTypeInput.sRated - chpTypes.first().pThermal == sptd.chpTypeInput.pThermal - chpTypes.first().pOwn == sptd.chpTypeInput.pOwn + def chpType = typeSource.chpTypes.get(sptd.chpTypeInput.uuid) + chpType.id == sptd.chpTypeInput.id + chpType.capex == sptd.chpTypeInput.capex + chpType.opex == sptd.chpTypeInput.opex + chpType.etaEl == sptd.chpTypeInput.etaEl + chpType.etaThermal == sptd.chpTypeInput.etaThermal + chpType.sRated == sptd.chpTypeInput.sRated + chpType.pThermal == sptd.chpTypeInput.pThermal + chpType.pOwn == sptd.chpTypeInput.pOwn } def "A CsvTypeSource should read and handle valid hp type file as expected"() { @@ -138,14 +129,13 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def hpTypes = typeSource.hpTypes - hpTypes.first().uuid == sptd.hpTypeInput.uuid - hpTypes.first().id == sptd.hpTypeInput.id - hpTypes.first().capex == sptd.hpTypeInput.capex - hpTypes.first().opex == sptd.hpTypeInput.opex - hpTypes.first().sRated == sptd.hpTypeInput.sRated - hpTypes.first().cosPhiRated == sptd.hpTypeInput.cosPhiRated - hpTypes.first().pThermal == sptd.hpTypeInput.pThermal + def hpType = typeSource.hpTypes.get(sptd.hpTypeInput.uuid) + hpType.id == sptd.hpTypeInput.id + hpType.capex == sptd.hpTypeInput.capex + hpType.opex == sptd.hpTypeInput.opex + hpType.sRated == sptd.hpTypeInput.sRated + hpType.cosPhiRated == sptd.hpTypeInput.cosPhiRated + hpType.pThermal == sptd.hpTypeInput.pThermal } def "A CsvTypeSource should read and handle valid storage type file as expected"() { @@ -153,20 +143,19 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def storageTypes = typeSource.storageTypes - storageTypes.first().uuid == sptd.storageTypeInput.uuid - storageTypes.first().id == sptd.storageTypeInput.id - storageTypes.first().capex == sptd.storageTypeInput.capex - storageTypes.first().opex == sptd.storageTypeInput.opex - storageTypes.first().eStorage == sptd.storageTypeInput.eStorage - storageTypes.first().sRated == sptd.storageTypeInput.sRated - storageTypes.first().cosPhiRated == sptd.storageTypeInput.cosPhiRated - storageTypes.first().pMax == sptd.storageTypeInput.pMax - storageTypes.first().activePowerGradient == sptd.storageTypeInput.activePowerGradient - storageTypes.first().eta == sptd.storageTypeInput.eta - storageTypes.first().dod == sptd.storageTypeInput.dod - storageTypes.first().lifeTime == sptd.storageTypeInput.lifeTime - storageTypes.first().lifeCycle == sptd.storageTypeInput.lifeCycle + def storageType = typeSource.storageTypes.get(sptd.storageTypeInput.uuid) + storageType.id == sptd.storageTypeInput.id + storageType.capex == sptd.storageTypeInput.capex + storageType.opex == sptd.storageTypeInput.opex + storageType.eStorage == sptd.storageTypeInput.eStorage + storageType.sRated == sptd.storageTypeInput.sRated + storageType.cosPhiRated == sptd.storageTypeInput.cosPhiRated + storageType.pMax == sptd.storageTypeInput.pMax + storageType.activePowerGradient == sptd.storageTypeInput.activePowerGradient + storageType.eta == sptd.storageTypeInput.eta + storageType.dod == sptd.storageTypeInput.dod + storageType.lifeTime == sptd.storageTypeInput.lifeTime + storageType.lifeCycle == sptd.storageTypeInput.lifeCycle } def "A CsvTypeSource should read and handle valid wec type file as expected"() { @@ -174,20 +163,19 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def wecTypes = typeSource.wecTypes - wecTypes.first().uuid == sptd.wecType.uuid - wecTypes.first().id == sptd.wecType.id - wecTypes.first().capex == sptd.wecType.capex - wecTypes.first().opex == sptd.wecType.opex - wecTypes.first().cosPhiRated == sptd.wecType.cosPhiRated - wecTypes.first().etaConv == sptd.wecType.etaConv - wecTypes.first().sRated == sptd.wecType.sRated - wecTypes.first().rotorArea == sptd.wecType.rotorArea - wecTypes.first().hubHeight == sptd.wecType.hubHeight - wecTypes.first().cpCharacteristic == sptd.wecType.cpCharacteristic + def wecType = typeSource.wecTypes.get(sptd.wecType.uuid) + wecType.id == sptd.wecType.id + wecType.capex == sptd.wecType.capex + wecType.opex == sptd.wecType.opex + wecType.cosPhiRated == sptd.wecType.cosPhiRated + wecType.etaConv == sptd.wecType.etaConv + wecType.sRated == sptd.wecType.sRated + wecType.rotorArea == sptd.wecType.rotorArea + wecType.hubHeight == sptd.wecType.hubHeight + wecType.cpCharacteristic == sptd.wecType.cpCharacteristic //check for the individual points - if (wecTypes.first().cpCharacteristic.points.iterator().hasNext()) - wecTypes.first().cpCharacteristic.points.iterator().next() == sptd.wecType.cpCharacteristic.points.iterator().next() + if (wecType.cpCharacteristic.points.iterator().hasNext()) + wecType.cpCharacteristic.points.iterator().next() == sptd.wecType.cpCharacteristic.points.iterator().next() } def "A CsvTypeSource should read and handle valid ev type file as expected"() { @@ -195,14 +183,13 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def evTypes = typeSource.evTypes - evTypes.first().uuid == sptd.evTypeInput.uuid - evTypes.first().id == sptd.evTypeInput.id - evTypes.first().capex == sptd.evTypeInput.capex - evTypes.first().opex == sptd.evTypeInput.opex - evTypes.first().eStorage == sptd.evTypeInput.eStorage - evTypes.first().eCons == sptd.evTypeInput.eCons - evTypes.first().sRated == sptd.evTypeInput.sRated - evTypes.first().cosPhiRated == sptd.evTypeInput.cosPhiRated + def evType = typeSource.evTypes.get(sptd.evTypeInput.uuid) + evType.id == sptd.evTypeInput.id + evType.capex == sptd.evTypeInput.capex + evType.opex == sptd.evTypeInput.opex + evType.eStorage == sptd.evTypeInput.eStorage + evType.eCons == sptd.evTypeInput.eCons + evType.sRated == sptd.evTypeInput.sRated + evType.cosPhiRated == sptd.evTypeInput.cosPhiRated } } From 69ada8e465044f7ace4ac70681f18a0dfc2eab0b Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 30 Dec 2023 22:43:30 +0100 Subject: [PATCH 19/31] Fixing JointGridContainer tests --- .../models/input/container/JointGridContainerTest.groovy | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy index bb614d5c8..5b8147f20 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy @@ -29,7 +29,7 @@ class JointGridContainerTest extends Specification { def "A single subgrid can be used to build a JointGridContainer"() { when: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) then: noExceptionThrown() @@ -38,7 +38,7 @@ class JointGridContainerTest extends Specification { def "A JointGridContainer's copy method should work as expected"() { given: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) def rawGrid = new RawGridElements(List.of(GridTestData.lineAtoB, GridTestData.transformerAtoBtoC)) def systemParticipants = new SystemParticipants(List.of(SystemParticipantTestData.bmInput)) def graphics = new GraphicElements(Set.of(GridTestData.nodeGraphicD), Set.of(GridTestData.lineGraphicCtoD)) From 8c26f18a37bd1d60728eecac99b4135dd0cbd496 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Sat, 30 Dec 2023 23:14:33 +0100 Subject: [PATCH 20/31] Fixing some code smells --- .../factory/input/EmAssetInputEntityData.java | 23 +++++++++-- .../ie3/datamodel/io/source/EntitySource.java | 40 +++++++++---------- 2 files changed, 39 insertions(+), 24 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java index 43d6babb2..d001c405e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java @@ -9,6 +9,7 @@ import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; import java.util.Map; +import java.util.Objects; /** * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities @@ -37,10 +38,6 @@ public EmAssetInputEntityData( this.emUnit = emUnit; } - public EmInput getEmUnit() { - return emUnit; - } - /** * Creates a new EmAssetInputEntityData object based on a given {@link AssetInputEntityData} * object and given em unit @@ -52,4 +49,22 @@ public EmAssetInputEntityData(AssetInputEntityData entityData, EmInput emUnit) { super(entityData, entityData.getOperatorInput()); this.emUnit = emUnit; } + + public EmInput getEmUnit() { + return emUnit; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + EmAssetInputEntityData that = (EmAssetInputEntityData) o; + return Objects.equals(emUnit, that.emUnit); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), emUnit); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 672a14a6c..7eeebda49 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -85,45 +85,45 @@ Try enrichEntityData( * * @param entityData The entity data of the entity that provides links to two other entities via * UUID - * @param fieldNameA The field name of the field that provides the UUID of the first linked entity - * @param linkedEntitiesA The first map of UUID to entities, of which one should be linked to + * @param fieldName1 The field name of the field that provides the UUID of the first linked entity + * @param linkedEntities1 The first map of UUID to entities, of which one should be linked to * given entity data - * @param fieldNameB The field name of the field that provides the UUID of the second linked + * @param fieldName2 The field name of the field that provides the UUID of the second linked * entity - * @param linkedEntitiesB The second map of UUID to entities, of which one should be linked to + * @param linkedEntities2 The second map of UUID to entities, of which one should be linked to * given entity data * @param createEntityData The function that creates the resulting entity data given entityData * and the linked entities * @param Type of input entity data - * @param Type of the first linked entity - * @param Type of the second linked entity + * @param Type of the first linked entity + * @param Type of the second linked entity * @param Type of resulting entity data that combines the given entityData and two linked * entities * @return {@link Try} to enhanced data */ protected static < - E extends EntityData, TA extends UniqueEntity, TB extends UniqueEntity, R extends E> + E extends EntityData, T1 extends UniqueEntity, T2 extends UniqueEntity, R extends E> Try enrichEntityData( E entityData, - String fieldNameA, - Map linkedEntitiesA, - String fieldNameB, - Map linkedEntitiesB, - TriFunction createEntityData) { - return getLinkedEntity(entityData, fieldNameA, linkedEntitiesA) + String fieldName1, + Map linkedEntities1, + String fieldName2, + Map linkedEntities2, + TriFunction createEntityData) { + return getLinkedEntity(entityData, fieldName1, linkedEntities1) .flatMap( - linkedEntityA -> - getLinkedEntity(entityData, fieldNameB, linkedEntitiesB) + linkedEntity1 -> + getLinkedEntity(entityData, fieldName2, linkedEntities2) .map( - linkedEntityB -> { + linkedEntity2 -> { Map fieldsToAttributes = entityData.getFieldsToValues(); // remove fields that are passed as objects to constructor - fieldsToAttributes.keySet().remove(fieldNameA); - fieldsToAttributes.keySet().remove(fieldNameB); + fieldsToAttributes.keySet().remove(fieldName1); + fieldsToAttributes.keySet().remove(fieldName2); // build resulting entity data - return createEntityData.apply(entityData, linkedEntityA, linkedEntityB); + return createEntityData.apply(entityData, linkedEntity1, linkedEntity2); })); } @@ -254,7 +254,7 @@ Try optionallyEnrichEntityData( private static Try getEntity(UUID uuid, Map entityMap) { return Optional.ofNullable(entityMap.get(uuid)) // We either find a matching entity for given UUID, thus return a success - .map(entity -> (Try) new Try.Success(entity)) + .map(entity -> Try.of(() -> entity, SourceException.class)) // ... or find no matching entity, returning a failure. .orElse( new Try.Failure<>( From d6e5432a349ff44efc0d5701d0253757372c9eff Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 10:32:00 +0100 Subject: [PATCH 21/31] Improving EnergyManagementSource a bit, providing test --- .../io/source/EnergyManagementSource.java | 55 ++-- .../source/EnergyManagementSourceTest.groovy | 284 ++++++++++++++++++ .../csv/CsvEnergyManagementSourceTest.groovy | 1 - 3 files changed, 312 insertions(+), 28 deletions(-) create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 14550060f..2b8a2f4b6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -24,13 +24,11 @@ public class EnergyManagementSource extends EntitySource { private final TypeSource typeSource; - private final EmInputFactory emInputFactory; + private static final EmInputFactory emInputFactory = new EmInputFactory(); public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; - - this.emInputFactory = new EmInputFactory(); } /** @@ -65,7 +63,7 @@ public Map getEmUnits() throws SourceException { * @return a map of uuid to {@link EmInput} entities */ public Map getEmUnits(Map operators) throws SourceException { - return buildHierarchicalEmInputs(operators); + return createEmInputs(buildAssetInputEntityData(EmInput.class, operators)); } /** @@ -74,14 +72,13 @@ public Map getEmUnits(Map operators) throws * in {@link SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at * root level (which are not EM-controlled themselves). * - * @param operators a map of uuid to {@link OperatorInput} that should be used for the returning - * instances + * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} * {@link Try} + * objects * @return a map of uuid to {@link EmInput} entities */ - private Map buildHierarchicalEmInputs(Map operators) + private static Map createEmInputs( + Stream> assetEntityDataStream) throws SourceException { - Stream> assetEntityDataStream = - buildAssetInputEntityData(EmInput.class, operators); // Split stream by failures and EMs that are themselves EM-controlled on one side, and EMs at // root position (that have not failed so far) on the other side, which do not have parents per @@ -112,8 +109,11 @@ private Map buildHierarchicalEmInputs(Map op EmInput.class); if (!others.isEmpty()) { - // there's more levels beyond EMs at root level. Build them recursively + // there's more EM levels beyond root level. Build them recursively Stream othersWithParentUuid = + // We try to keep the Tries as long as possible so that as many failures as possible can + // be reported. At this point however, we need to "unpack" (and throw, if applicable), + // because without valid parent EM UUID, we cannot proceed. unpack( others.stream() .map( @@ -141,14 +141,14 @@ private Map buildHierarchicalEmInputs(Map op })), AssetDataAndValidParentUuid.class); - allEms.putAll(buildHierarchicalEmInputs(othersWithParentUuid, allEms)); + allEms.putAll(createHierarchicalEmInputs(othersWithParentUuid, allEms)); } return allEms; } - private Map buildHierarchicalEmInputs( - Stream assetEntityDataStream, Map builtEms) + private static Map createHierarchicalEmInputs( + Stream assetEntityDataStream, Map lastLevelEms) throws SourceException { // Split stream by assets whose parent is already built (which can be built at this level), and @@ -156,33 +156,34 @@ private Map buildHierarchicalEmInputs( // or not at all) Map> split = assetEntityDataStream.collect( - Collectors.partitioningBy(data -> builtEms.containsKey(data.parentEm))); + Collectors.partitioningBy(data -> lastLevelEms.containsKey(data.parentEm))); List toBeBuiltAtThisLevel = split.get(true); - List others = split.get(false); + List toBeBuiltAtNextLevel = split.get(false); if (toBeBuiltAtThisLevel.isEmpty()) { - // Since we only start a new recursion step if the asset data stream is not empty, - // we can conclude at this point that from all asset data at this recursion level, - // no new EMs can be built - thus, parents must be missing + // Since we only start a new recursion step if the asset data stream is not empty, there have + // to be EMs to be built at next level. This does not work if there's no EMs at the current + // recursion level. throw new SourceException( - "EMs " + others + " were assigned a parent EM that does not exist."); + "EMs " + toBeBuiltAtNextLevel + " were assigned a parent EM that does not exist."); } else { // New EMs can be built at this level Map newEms = unpackMap( toBeBuiltAtThisLevel.stream() .map( - data -> - emInputFactory.get( - new EmAssetInputEntityData( - data.entityData, builtEms.get(data.parentEm)))), + data -> { + // exists because we checked above + EmInput parentEm = lastLevelEms.get(data.parentEm); + return emInputFactory.get( + new EmAssetInputEntityData(data.entityData, parentEm)); + }), EmInput.class); - // This also means that if there's more EMs left to build, the new EMs might function as - // parents there - if (!others.isEmpty()) { - newEms.putAll(buildHierarchicalEmInputs(others.stream(), newEms)); + if (!toBeBuiltAtNextLevel.isEmpty()) { + // If there's more EMs left to build, the new EMs have to function as parents there + newEms.putAll(createHierarchicalEmInputs(toBeBuiltAtNextLevel.stream(), newEms)); } return newEms; } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy new file mode 100644 index 000000000..4dcb4546e --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -0,0 +1,284 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.io.source + +import static edu.ie3.test.helper.EntityMap.map + +import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.exceptions.SourceException +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.utils.Try +import spock.lang.Specification + +import java.util.stream.Stream + +class EnergyManagementSourceTest extends Specification { + + def "An EnergyManagementSource should construct hierarchical EmInputs with two branches as expected"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-0", + "id": "root", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "child 1", + "parentem" : "0-0-0-0-0", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-11", + "id": "child 1-1", + "parentem" : "0-0-0-0-1", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "child 2", + "parentem" : "0-0-0-0-0", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-21", + "id": "child 2-1", + "parentem" : "0-0-0-0-2", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + expect: + def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) + + def expectedRootEm = new EmInput( + UUID.fromString("0-0-0-0-0"), + "root", + "", + null + ) + def expectedEm1 = new EmInput( + UUID.fromString("0-0-0-0-1"), + "child 1", + "", + expectedRootEm + ) + def expectedEm11 = new EmInput( + UUID.fromString("0-0-0-0-11"), + "child 1-1", + "", + expectedEm1 + ) + def expectedEm2 = new EmInput( + UUID.fromString("0-0-0-0-2"), + "child 2", + "", + expectedRootEm + ) + def expectedEm21 = new EmInput( + UUID.fromString("0-0-0-0-21"), + "child 2-1", + "", + expectedEm2 + ) + + emUnits == map([expectedRootEm, expectedEm1, expectedEm11, expectedEm2, expectedEm21]) + } + + def "An EnergyManagementSource should construct flat EmInputs without hierarchy as expected"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "", + "controlstrategy" : "strat_b"], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-3", + "id": "em 3", + "parentem" : "", + "controlstrategy" : "other"], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + expect: + def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) + + def expectedEm1 = new EmInput( + UUID.fromString("0-0-0-0-1"), + "em 1", + "", + null + ) + def expectedEm2 = new EmInput( + UUID.fromString("0-0-0-0-2"), + "em 2", + "strat_b", + null + ) + def expectedEm3 = new EmInput( + UUID.fromString("0-0-0-0-3"), + "em 3", + "other", + null + ) + + emUnits == map([expectedEm1, expectedEm2, expectedEm3]) + } + + def "An EnergyManagementSource should fail if any entity data already failed before"() { + given: + def assetEntityDataStream = Stream.of( + new Try.Success(new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + )), + new Try.Success(new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "", + "controlstrategy" : ""], + EmInput + )), + new Try.Failure(new SourceException("test failure abc")) + ) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("test failure abc") + } + + def "An EnergyManagementSource should fail if a parent EM UUID is malformed"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "not-a-uuid", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("Exception while trying to parse UUID of field \"parentem\" with value \"not-a-uuid\"") + } + + def "An EnergyManagementSource should fail if the factory fails for one EM"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", // id is missing + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.cause.message.contains("An error occurred when creating instance of EmInput.class") + exc.cause.cause.class == FactoryException + } + + def "An EnergyManagementSource should fail if a parent em is not provided"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "", + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.message.contains("were assigned a parent EM that does not exist.") + } + + def "An EnergyManagementSource should fail if no parent ems are provided"() { + given: + def assetEntityDataStream = Stream.of( + new AssetInputEntityData( + ["uuid": "0-0-0-0-1", + "id": "em 1", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + new AssetInputEntityData( + ["uuid": "0-0-0-0-2", + "id": "em 2", + "parentem" : "1-2-3-4-5", // does not exist + "controlstrategy" : ""], + EmInput + ), + ).map(data -> Try.of(() -> data, SourceException.class)) + + when: + EnergyManagementSource.createEmInputs(assetEntityDataStream) + + then: + def exc = thrown(SourceException) + exc.message.contains("were assigned a parent EM that does not exist.") + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index f16a275bb..7f5cb7124 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -15,7 +15,6 @@ import edu.ie3.datamodel.utils.Try import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification -// TODO test recursion class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { def "An EnergyManagementSource with csv input should return data from valid em input file as expected"() { From 5bbce85d1a7fdef315f08cbdd8ded1ed12302c99 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 11:26:57 +0100 Subject: [PATCH 22/31] Re-using input data that is used multiple times --- .../datamodel/io/source/GraphicSource.java | 20 ++++- .../datamodel/io/source/RawGridSource.java | 85 +++++++++++++------ .../io/source/SystemParticipantSource.java | 38 ++++++++- .../csv/CsvJointGridContainerSource.java | 22 ++++- 4 files changed, 129 insertions(+), 36 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index 8bd81a3be..d2c387f27 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -54,13 +54,25 @@ public GraphicElements getGraphicElements() throws SourceException { // read all needed entities /// start with types and operators - Map operators = - typeSource.getOperators(); // fixme those only need to be fetched once, if done smartly + Map operators = typeSource.getOperators(); Map lineTypes = typeSource.getLineTypes(); Map nodes = rawGridSource.getNodes(operators); - Map lines = rawGridSource.getLines(nodes, lineTypes, operators); + Map lines = rawGridSource.getLines(operators, nodes, lineTypes); + + return getGraphicElements(nodes, lines); + } + /** + * Returns the graphic elements of the grid or throws a {@link SourceException}. + * + *

This constructor reuses some basic input data to improve performance. + * + * @param nodes All nodes of the grid in a map UUID -> node + * @param lines All lines of the grid in a map UUID -> line + */ + public GraphicElements getGraphicElements(Map nodes, Map lines) + throws SourceException { Try, SourceException> nodeGraphics = Try.of(() -> getNodeGraphicInput(nodes), SourceException.class); Try, SourceException> lineGraphics = @@ -105,7 +117,7 @@ public Set getLineGraphicInput() throws SourceException { Map operators = typeSource.getOperators(); return getLineGraphicInput( rawGridSource.getLines( - rawGridSource.getNodes(operators), typeSource.getLineTypes(), operators)); + operators, rawGridSource.getNodes(operators), typeSource.getLineTypes())); } public Set getLineGraphicInput(Map lines) diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index f427bd9f6..bbd0410af 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -30,7 +30,9 @@ import java.util.stream.Stream; /** - * Implementation that provides the capability to build entities that are hold by a {@link + * todo javadoc + * + *

Implementation that provides the capability to build entities that are hold by a {@link * RawGridElements} as well as the {@link RawGridElements} container as well from different data * sources e.g. .csv files or databases. * @@ -84,36 +86,69 @@ public RawGridSource(TypeSource typeSource, DataSource dataSource) { * e.g. in the sense that not duplicate UUIDs exist within all entities contained in the returning * instance. * - * @return either a valid, complete {@link RawGridElements} or throws a {@link SourceException} + * @return a valid, complete {@link RawGridElements} + * @throws SourceException on error */ public RawGridElements getGridData() throws SourceException { /* read all needed entities start with the types and operators */ Map operators = typeSource.getOperators(); Map lineTypes = typeSource.getLineTypes(); + + /* assets */ + Map nodes = getNodes(operators); + Map lines = getLines(operators, nodes, lineTypes); + + return getGridData(operators, nodes, lines); + } + + /** + * Should return either a consistent instance of {@link RawGridElements} or throw a {@link + * SourceException}. The decision to throw a {@link SourceException} instead of returning the + * incomplete {@link RawGridElements} instance is motivated by the fact, that a {@link + * RawGridElements} is a container instance that depends on several other entities. Without being + * complete, it is useless for further processing. + * + *

Hence, whenever at least one entity {@link RawGridElements} depends on cannot be provided, + * {@link SourceException} should be thrown. The thrown exception should provide enough + * information to debug the error and fix the persistent data that has been failed to processed. + * + *

Furthermore, it is expected, that the specific implementation of this method ensures not + * only the completeness of the resulting {@link RawGridElements} instance, but also its validity + * e.g. in the sense that not duplicate UUIDs exist within all entities contained in the returning + * instance. + * + *

This constructor reuses some basic input data to improve performance. + * + * @param operators All operators of the grid in a map UUID -> operator + * @param nodes All nodes of the grid in a map UUID -> node + * @param lines All lines of the grid in a map UUID -> line + * @return a valid, complete {@link RawGridElements} + * @throws SourceException on error + */ + public RawGridElements getGridData( + Map operators, Map nodes, Map lines) + throws SourceException { + /* read all needed entities start with the types and operators */ Map transformer2WTypeInputs = typeSource.getTransformer2WTypes(); Map transformer3WTypeInputs = typeSource.getTransformer3WTypes(); /* assets */ - Map nodes = getNodes(operators); - Try, SourceException> lineInputs = - Try.of(() -> getLines(nodes, lineTypes, operators), SourceException.class); Try, SourceException> transformer2WInputs = Try.of( - () -> get2WTransformers(nodes, transformer2WTypeInputs, operators), + () -> get2WTransformers(operators, nodes, transformer2WTypeInputs), SourceException.class); Try, SourceException> transformer3WInputs = Try.of( - () -> get3WTransformers(nodes, transformer3WTypeInputs, operators), + () -> get3WTransformers(operators, nodes, transformer3WTypeInputs), SourceException.class); Try, SourceException> switches = - Try.of(() -> getSwitches(nodes, operators), SourceException.class); + Try.of(() -> getSwitches(operators, nodes), SourceException.class); Try, SourceException> measurementUnits = - Try.of(() -> getMeasurementUnits(nodes, operators), SourceException.class); + Try.of(() -> getMeasurementUnits(operators, nodes), SourceException.class); List exceptions = Try.getExceptions( - List.of( - lineInputs, transformer2WInputs, transformer3WInputs, switches, measurementUnits)); + List.of(transformer2WInputs, transformer3WInputs, switches, measurementUnits)); if (!exceptions.isEmpty()) { throw new RawGridException( @@ -124,7 +159,7 @@ public RawGridElements getGridData() throws SourceException { // filtered and thrown before return new RawGridElements( new HashSet<>(nodes.values()), - new HashSet<>(lineInputs.getOrThrow().values()), + new HashSet<>(lines.values()), transformer2WInputs.getOrThrow(), transformer3WInputs.getOrThrow(), switches.getOrThrow(), @@ -180,7 +215,7 @@ public Map getNodes(Map operators) throws */ public Map getLines() throws SourceException { Map operators = typeSource.getOperators(); - return getLines(getNodes(operators), typeSource.getLineTypes(), operators); + return getLines(operators, getNodes(operators), typeSource.getLineTypes()); } /** @@ -204,9 +239,9 @@ public Map getLines() throws SourceException { * @return a set of object and uuid unique {@link LineInput} entities */ public Map getLines( + Map operators, Map nodes, - Map lineTypeInputs, - Map operators) + Map lineTypeInputs) throws SourceException { return unpackMap( buildTypedEntityData(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs), @@ -225,7 +260,7 @@ public Map getLines( */ public Set get2WTransformers() throws SourceException { Map operators = typeSource.getOperators(); - return get2WTransformers(getNodes(operators), typeSource.getTransformer2WTypes(), operators); + return get2WTransformers(operators, getNodes(operators), typeSource.getTransformer2WTypes()); } /** @@ -251,9 +286,9 @@ public Set get2WTransformers() throws SourceException { * @return a set of object and uuid unique {@link Transformer2WInput} entities */ public Set get2WTransformers( + Map operators, Map nodes, - Map transformer2WTypes, - Map operators) + Map transformer2WTypes) throws SourceException { return unpackSet( buildTypedEntityData( @@ -277,7 +312,7 @@ public Set get2WTransformers( */ public Set get3WTransformers() throws SourceException { Map operators = typeSource.getOperators(); - return get3WTransformers(getNodes(operators), typeSource.getTransformer3WTypes(), operators); + return get3WTransformers(operators, getNodes(operators), typeSource.getTransformer3WTypes()); } /** @@ -303,9 +338,9 @@ public Set get3WTransformers() throws SourceException { * @return a set of object and uuid unique {@link Transformer3WInput} entities */ public Set get3WTransformers( + Map operators, Map nodes, - Map transformer3WTypeInputs, - Map operators) + Map transformer3WTypeInputs) throws SourceException { return unpackSet( buildTransformer3WEntities( @@ -325,7 +360,7 @@ public Set get3WTransformers( */ public Set getSwitches() throws SourceException { Map operators = typeSource.getOperators(); - return getSwitches(getNodes(operators), operators); + return getSwitches(operators, getNodes(operators)); } /** @@ -348,7 +383,7 @@ public Set getSwitches() throws SourceException { * @return a set of object and uuid unique {@link SwitchInput} entities */ public Set getSwitches( - Map nodes, Map operators) throws SourceException { + Map operators, Map nodes) throws SourceException { return buildUntypedConnectorInputEntities( SwitchInput.class, switchInputFactory, nodes, operators); } @@ -365,7 +400,7 @@ public Set getSwitches( */ public Set getMeasurementUnits() throws SourceException { Map operators = typeSource.getOperators(); - return getMeasurementUnits(getNodes(operators), operators); + return getMeasurementUnits(operators, getNodes(operators)); } /** @@ -389,7 +424,7 @@ public Set getMeasurementUnits() throws SourceException { * @return a set of object and uuid unique {@link MeasurementUnitInput} entities */ public Set getMeasurementUnits( - Map nodes, Map operators) throws SourceException { + Map operators, Map nodes) throws SourceException { return unpackSet( buildNodeAssetEntityData(MeasurementUnitInput.class, operators, nodes) .map(measurementUnitInputFactory::get), diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 4a71536f0..7b99e604a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -90,13 +90,45 @@ public SystemParticipantSource( * validity e.g. in the sense that not duplicate UUIDs exist within all entities contained in the * returning instance. * - * @return either a valid, complete {@link SystemParticipants} or throws a {@link SourceException} + * @return a valid, complete {@link SystemParticipants} + * @throws SourceException on error */ public SystemParticipants getSystemParticipants() throws SourceException { + Map operators = typeSource.getOperators(); + Map nodes = rawGridSource.getNodes(operators); + + return getSystemParticipants(operators, nodes); + } + + /** + * Should return either a consistent instance of {@link SystemParticipants} or throw a {@link + * SourceException}. The decision to throw a {@link SourceException} instead of returning the + * incomplete {@link SystemParticipants} instance is motivated by the fact, that a {@link + * SystemParticipants} is a container instance that depends on several other entities. Without + * being complete, it is useless for further processing. + * + *

Hence, whenever at least one entity {@link SystemParticipants} depends on cannot be + * provided, {@link SourceException} should be thrown. The thrown exception should provide enough + * information to debug the error and fix the persistent data that has been failed to processed. + * + *

Furthermore, it is expected, that the specific implementation of this method ensures not + * only the completeness of the resulting {@link SystemParticipants} instance, but also its + * validity e.g. in the sense that not duplicate UUIDs exist within all entities contained in the + * returning instance. + * + *

This constructor reuses some basic input data to improve performance. + * + * @param operators All operators of the grid in a map UUID -> operator + * @param nodes All nodes of the grid in a map UUID -> node + * @return a valid, complete {@link SystemParticipants} + * @throws SourceException on error + */ + public SystemParticipants getSystemParticipants( + Map operators, Map nodes) throws SourceException { + // read all needed entities /// start with types and operators - Map operators = typeSource.getOperators(); Map bmTypes = typeSource.getBmTypes(); Map chpTypes = typeSource.getChpTypes(); Map evTypes = typeSource.getEvTypes(); @@ -110,8 +142,6 @@ public SystemParticipants getSystemParticipants() throws SourceException { Map thermalStorages = thermalSource.getThermalStorages(operators, thermalBuses); - /// go on with the nodes - Map nodes = rawGridSource.getNodes(operators); Try, SourceException> fixedFeedInInputs = Try.of(() -> getFixedFeedIns(operators, nodes, emUnits), SourceException.class); Try, SourceException> pvInputs = diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java index f2e113816..1ea0f0afd 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java @@ -12,10 +12,16 @@ import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.source.*; +import edu.ie3.datamodel.models.input.NodeInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import edu.ie3.datamodel.models.input.connector.LineInput; +import edu.ie3.datamodel.models.input.connector.type.LineTypeInput; import edu.ie3.datamodel.models.input.container.*; import edu.ie3.datamodel.utils.Try; import java.nio.file.Path; import java.util.List; +import java.util.Map; +import java.util.UUID; /** Convenience class for cases where all used data comes from CSV sources */ public class CsvJointGridContainerSource { @@ -50,13 +56,23 @@ public static JointGridContainer read( new SystemParticipantSource(typeSource, thermalSource, rawGridSource, emSource, dataSource); GraphicSource graphicSource = new GraphicSource(typeSource, rawGridSource, dataSource); + /* Loading basic inputs that are used multiple times */ + Map operators = typeSource.getOperators(); + + Map lineTypes = typeSource.getLineTypes(); + + Map nodes = rawGridSource.getNodes(operators); + Map lines = rawGridSource.getLines(operators, nodes, lineTypes); + /* Loading models */ Try rawGridElements = - Try.of(rawGridSource::getGridData, SourceException.class); + Try.of(() -> rawGridSource.getGridData(operators, nodes, lines), SourceException.class); Try systemParticipants = - Try.of(systemParticipantSource::getSystemParticipants, SourceException.class); + Try.of( + () -> systemParticipantSource.getSystemParticipants(operators, nodes), + SourceException.class); Try graphicElements = - Try.of(graphicSource::getGraphicElements, SourceException.class); + Try.of(() -> graphicSource.getGraphicElements(nodes, lines), SourceException.class); List exceptions = Try.getExceptions(List.of(rawGridElements, systemParticipants, graphicElements)); From 8c3d29196a98ba562310cc978589d6270328c4e4 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 12:01:18 +0100 Subject: [PATCH 23/31] Fixing codacy issues --- .../io/source/EntitySourceTest.groovy | 22 +- .../io/source/csv/CsvRawGridSourceTest.groovy | 2 +- .../csv/CsvSystemParticipantSourceTest.groovy | 4 +- .../io/source/csv/CsvThermalSourceTest.groovy | 94 ++++---- .../io/source/csv/CsvTypeSourceTest.groovy | 212 +++++++++--------- 5 files changed, 175 insertions(+), 159 deletions(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index bebec151a..076bd98a2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -43,7 +43,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : GridTestData.nodeA.uuid.toString(), ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) @@ -59,7 +59,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : GridTestData.nodeB.uuid.toString(), ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) @@ -77,7 +77,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : sptd.thermalStorage.uuid.toString() ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -95,7 +95,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : "8851813b-3a7d-4fee-874b-4df9d724e4b4" ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput.class, sptd.participantNode, null, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -113,7 +113,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : sptd.emInput.uuid.toString(), ] - def entityData = new EntityData(parameter, AssetInput.class) + def entityData = new EntityData(parameter, AssetInput) Map entityMap = map([sptd.emInput]) @@ -129,7 +129,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : sptd.parentEm.uuid.toString(), ] - def entityData = new EntityData(parameter, AssetInput.class) + def entityData = new EntityData(parameter, AssetInput) Map entityMap = map([sptd.emInput]) @@ -146,7 +146,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : "not-a-uuid", ] - def entityData = new EntityData(parameter, AssetInput.class) + def entityData = new EntityData(parameter, AssetInput) Map entityMap = map([sptd.emInput]) @@ -163,7 +163,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : GridTestData.nodeA.uuid.toString(), ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) @@ -179,7 +179,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : "", ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) @@ -195,7 +195,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : "4ca90220-74c2-4369-9afa-a18bf068840e", ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) @@ -213,7 +213,7 @@ class EntitySourceTest extends Specification { Map parameter = [ "linked_entity" : "not-a-uuid", ] - def entityData = new AssetInputEntityData(parameter, AssetInput.class) + def entityData = new AssetInputEntityData(parameter, AssetInput) Map entityMap = map([GridTestData.nodeA]) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy index cf03c2db7..da933fc65 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy @@ -435,7 +435,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { then: "all lines are there" actualSet.size() == expectedSet.size() - actualSet.each {entry -> + actualSet.each { entry -> def actual = entry.value def expected = expectedSet.find {it.uuid == actual.uuid} assert expected != null diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index e18f9aa46..8d1bd118d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -59,8 +59,8 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat ]) { // partly fake the return method of the csv raw grid source to always return empty node sets // -> elements to build NodeGraphicInputs are missing - getNodes() >> new HashMap() - getNodes(_) >> new HashMap() + getNodes() >> [:] + getNodes(_) >> [:] } as RawGridSource def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy index 0098dbf53..7351cf1a2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvThermalSourceTest.groovy @@ -58,16 +58,18 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingCylindricalStorageWoOperator.size() == 1 - resultingCylindricalStorageWoOperator.first().uuid == sptd.thermalStorage.uuid - resultingCylindricalStorageWoOperator.first().id == sptd.thermalStorage.id - resultingCylindricalStorageWoOperator.first().operator == sptd.thermalStorage.operator - resultingCylindricalStorageWoOperator.first().operationTime == sptd.thermalStorage.operationTime - resultingCylindricalStorageWoOperator.first().thermalBus == sptd.thermalStorage.thermalBus - resultingCylindricalStorageWoOperator.first().storageVolumeLvl == sptd.storageVolumeLvl - resultingCylindricalStorageWoOperator.first().storageVolumeLvlMin == sptd.storageVolumeLvlMin - resultingCylindricalStorageWoOperator.first().inletTemp == sptd.inletTemp - resultingCylindricalStorageWoOperator.first().returnTemp == sptd.returnTemp - resultingCylindricalStorageWoOperator.first().c == sptd.c + with(resultingCylindricalStorageWoOperator.first()) { + uuid == sptd.thermalStorage.uuid + id == sptd.thermalStorage.id + operator == sptd.thermalStorage.operator + operationTime == sptd.thermalStorage.operationTime + thermalBus == sptd.thermalStorage.thermalBus + storageVolumeLvl == sptd.storageVolumeLvl + storageVolumeLvlMin == sptd.storageVolumeLvlMin + inletTemp == sptd.inletTemp + returnTemp == sptd.returnTemp + c == sptd.c + } //test method when operators and thermal buses are provided as constructor parameters when: @@ -75,16 +77,18 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingCylindricalStorage.size() == 1 - resultingCylindricalStorage.first().uuid == sptd.thermalStorage.uuid - resultingCylindricalStorage.first().id == sptd.thermalStorage.id - resultingCylindricalStorage.first().operator == sptd.thermalStorage.operator - resultingCylindricalStorage.first().operationTime == sptd.thermalStorage.operationTime - resultingCylindricalStorage.first().thermalBus == sptd.thermalStorage.thermalBus - resultingCylindricalStorage.first().storageVolumeLvl == sptd.storageVolumeLvl - resultingCylindricalStorage.first().storageVolumeLvlMin == sptd.storageVolumeLvlMin - resultingCylindricalStorage.first().inletTemp == sptd.inletTemp - resultingCylindricalStorage.first().returnTemp == sptd.returnTemp - resultingCylindricalStorage.first().c == sptd.c + with(resultingCylindricalStorage.first()) { + uuid == sptd.thermalStorage.uuid + id == sptd.thermalStorage.id + operator == sptd.thermalStorage.operator + operationTime == sptd.thermalStorage.operationTime + thermalBus == sptd.thermalStorage.thermalBus + storageVolumeLvl == sptd.storageVolumeLvl + storageVolumeLvlMin == sptd.storageVolumeLvlMin + inletTemp == sptd.inletTemp + returnTemp == sptd.returnTemp + c == sptd.c + } } def "A CsvThermalSource should return a ThermalHouseInput from valid and invalid input data as expected"() { @@ -100,18 +104,19 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalHouseWoOperator.size() == 1 - def thermalHouseWoOp = resultingThermalHouseWoOperator.values().first() - thermalHouseWoOp.uuid == ThermalUnitInputTestData.thermalHouseInput.uuid - thermalHouseWoOp.id == ThermalUnitInputTestData.thermalHouseInput.id - thermalHouseWoOp.operator == ThermalUnitInputTestData.thermalHouseInput.operator - thermalHouseWoOp.operationTime.isLimited() - thermalHouseWoOp.operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime - thermalHouseWoOp.thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus - thermalHouseWoOp.ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses - thermalHouseWoOp.ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa - thermalHouseWoOp.targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature - thermalHouseWoOp.upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit - thermalHouseWoOp.lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + with(resultingThermalHouseWoOperator.values().first()) { + uuid == ThermalUnitInputTestData.thermalHouseInput.uuid + id == ThermalUnitInputTestData.thermalHouseInput.id + operator == ThermalUnitInputTestData.thermalHouseInput.operator + operationTime.isLimited() + operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime + thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus + ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses + ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa + targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature + upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit + lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + } //test method when operators and thermal buses are provided as constructor parameters when: @@ -119,17 +124,18 @@ class CsvThermalSourceTest extends Specification implements CsvTestDataMeta { then: resultingThermalHouse.size() == 1 - def thermalHouse = resultingThermalHouse.values().first() - thermalHouse .uuid == ThermalUnitInputTestData.thermalHouseInput.uuid - thermalHouse.id == ThermalUnitInputTestData.thermalHouseInput.id - thermalHouse.operator == ThermalUnitInputTestData.thermalHouseInput.operator - thermalHouse.operationTime.isLimited() - thermalHouse.operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime - thermalHouse.thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus - thermalHouse.ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses - thermalHouse.ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa - thermalHouse.targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature - thermalHouse.upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit - thermalHouse.lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + with(resultingThermalHouse.values().first()) { + uuid == ThermalUnitInputTestData.thermalHouseInput.uuid + id == ThermalUnitInputTestData.thermalHouseInput.id + operator == ThermalUnitInputTestData.thermalHouseInput.operator + operationTime.isLimited() + operationTime == ThermalUnitInputTestData.thermalHouseInput.operationTime + thermalBus == ThermalUnitInputTestData.thermalHouseInput.thermalBus + ethLosses == ThermalUnitInputTestData.thermalHouseInput.ethLosses + ethCapa == ThermalUnitInputTestData.thermalHouseInput.ethCapa + targetTemperature == ThermalUnitInputTestData.thermalHouseInput.targetTemperature + upperTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.upperTemperatureLimit + lowerTemperatureLimit == ThermalUnitInputTestData.thermalHouseInput.lowerTemperatureLimit + } } } \ No newline at end of file diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy index 922166edd..44e2716ce 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTypeSourceTest.groovy @@ -20,21 +20,22 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { expect: def transformer2WTypes = typeSource.transformer2WTypes - def transformerToBeFound = transformer2WTypes.get(gtd.transformerTypeBtoD.uuid) - transformerToBeFound.id == gtd.transformerTypeBtoD.id - transformerToBeFound.rSc == gtd.transformerTypeBtoD.rSc - transformerToBeFound.xSc == gtd.transformerTypeBtoD.xSc - transformerToBeFound.sRated == gtd.transformerTypeBtoD.sRated - transformerToBeFound.vRatedA == gtd.transformerTypeBtoD.vRatedA - transformerToBeFound.vRatedB == gtd.transformerTypeBtoD.vRatedB - transformerToBeFound.gM == gtd.transformerTypeBtoD.gM - transformerToBeFound.bM == gtd.transformerTypeBtoD.bM - transformerToBeFound.dV == gtd.transformerTypeBtoD.dV - transformerToBeFound.dPhi == gtd.transformerTypeBtoD.dPhi - transformerToBeFound.tapSide == gtd.transformerTypeBtoD.tapSide - transformerToBeFound.tapNeutr == gtd.transformerTypeBtoD.tapNeutr - transformerToBeFound.tapMin == gtd.transformerTypeBtoD.tapMin - transformerToBeFound.tapMax == gtd.transformerTypeBtoD.tapMax + with(transformer2WTypes.get(gtd.transformerTypeBtoD.uuid)) { + id == gtd.transformerTypeBtoD.id + rSc == gtd.transformerTypeBtoD.rSc + xSc == gtd.transformerTypeBtoD.xSc + sRated == gtd.transformerTypeBtoD.sRated + vRatedA == gtd.transformerTypeBtoD.vRatedA + vRatedB == gtd.transformerTypeBtoD.vRatedB + gM == gtd.transformerTypeBtoD.gM + bM == gtd.transformerTypeBtoD.bM + dV == gtd.transformerTypeBtoD.dV + dPhi == gtd.transformerTypeBtoD.dPhi + tapSide == gtd.transformerTypeBtoD.tapSide + tapNeutr == gtd.transformerTypeBtoD.tapNeutr + tapMin == gtd.transformerTypeBtoD.tapMin + tapMax == gtd.transformerTypeBtoD.tapMax + } } def "A CsvTypeSource should read and handle valid operator file as expected"() { @@ -56,14 +57,15 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def lineType = typeSource.lineTypes.get(gtd.lineTypeInputCtoD.uuid) - lineType.id == gtd.lineTypeInputCtoD.id - lineType.b == gtd.lineTypeInputCtoD.b - lineType.g == gtd.lineTypeInputCtoD.g - lineType.r == gtd.lineTypeInputCtoD.r - lineType.x == gtd.lineTypeInputCtoD.x - lineType.iMax == gtd.lineTypeInputCtoD.iMax - lineType.vRated == gtd.lineTypeInputCtoD.vRated + with(typeSource.lineTypes.get(gtd.lineTypeInputCtoD.uuid)) { + id == gtd.lineTypeInputCtoD.id + b == gtd.lineTypeInputCtoD.b + g == gtd.lineTypeInputCtoD.g + r == gtd.lineTypeInputCtoD.r + x == gtd.lineTypeInputCtoD.x + iMax == gtd.lineTypeInputCtoD.iMax + vRated == gtd.lineTypeInputCtoD.vRated + } } def "A CsvTypeSource should read and handle valid 3W Transformer type file as expected"() { @@ -71,27 +73,28 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def transformer3WType = typeSource.transformer3WTypes.get(gtd.transformerTypeAtoBtoC.uuid) - transformer3WType.id == gtd.transformerTypeAtoBtoC.id - transformer3WType.sRatedA == gtd.transformerTypeAtoBtoC.sRatedA - transformer3WType.sRatedB == gtd.transformerTypeAtoBtoC.sRatedB - transformer3WType.sRatedC == gtd.transformerTypeAtoBtoC.sRatedC - transformer3WType.vRatedA == gtd.transformerTypeAtoBtoC.vRatedA - transformer3WType.vRatedB == gtd.transformerTypeAtoBtoC.vRatedB - transformer3WType.vRatedC == gtd.transformerTypeAtoBtoC.vRatedC - transformer3WType.rScA == gtd.transformerTypeAtoBtoC.rScA - transformer3WType.rScB == gtd.transformerTypeAtoBtoC.rScB - transformer3WType.rScC == gtd.transformerTypeAtoBtoC.rScC - transformer3WType.xScA == gtd.transformerTypeAtoBtoC.xScA - transformer3WType.xScB == gtd.transformerTypeAtoBtoC.xScB - transformer3WType.xScC == gtd.transformerTypeAtoBtoC.xScC - transformer3WType.gM == gtd.transformerTypeAtoBtoC.gM - transformer3WType.bM == gtd.transformerTypeAtoBtoC.bM - transformer3WType.dV == gtd.transformerTypeAtoBtoC.dV - transformer3WType.dPhi == gtd.transformerTypeAtoBtoC.dPhi - transformer3WType.tapNeutr == gtd.transformerTypeAtoBtoC.tapNeutr - transformer3WType.tapMin == gtd.transformerTypeAtoBtoC.tapMin - transformer3WType.tapMax == gtd.transformerTypeAtoBtoC.tapMax + with(typeSource.transformer3WTypes.get(gtd.transformerTypeAtoBtoC.uuid)) { + id == gtd.transformerTypeAtoBtoC.id + sRatedA == gtd.transformerTypeAtoBtoC.sRatedA + sRatedB == gtd.transformerTypeAtoBtoC.sRatedB + sRatedC == gtd.transformerTypeAtoBtoC.sRatedC + vRatedA == gtd.transformerTypeAtoBtoC.vRatedA + vRatedB == gtd.transformerTypeAtoBtoC.vRatedB + vRatedC == gtd.transformerTypeAtoBtoC.vRatedC + rScA == gtd.transformerTypeAtoBtoC.rScA + rScB == gtd.transformerTypeAtoBtoC.rScB + rScC == gtd.transformerTypeAtoBtoC.rScC + xScA == gtd.transformerTypeAtoBtoC.xScA + xScB == gtd.transformerTypeAtoBtoC.xScB + xScC == gtd.transformerTypeAtoBtoC.xScC + gM == gtd.transformerTypeAtoBtoC.gM + bM == gtd.transformerTypeAtoBtoC.bM + dV == gtd.transformerTypeAtoBtoC.dV + dPhi == gtd.transformerTypeAtoBtoC.dPhi + tapNeutr == gtd.transformerTypeAtoBtoC.tapNeutr + tapMin == gtd.transformerTypeAtoBtoC.tapMin + tapMax == gtd.transformerTypeAtoBtoC.tapMax + } } def "A CsvTypeSource should read and handle valid bm type file as expected"() { @@ -99,13 +102,14 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def bmType = typeSource.bmTypes.get(sptd.bmTypeInput.uuid) - bmType.id == sptd.bmTypeInput.id - bmType.capex == sptd.bmTypeInput.capex - bmType.opex == sptd.bmTypeInput.opex - bmType.cosPhiRated == sptd.bmTypeInput.cosPhiRated - bmType.activePowerGradient == sptd.bmTypeInput.activePowerGradient - bmType.etaConv == sptd.bmTypeInput.etaConv + with(typeSource.bmTypes.get(sptd.bmTypeInput.uuid)) { + id == sptd.bmTypeInput.id + capex == sptd.bmTypeInput.capex + opex == sptd.bmTypeInput.opex + cosPhiRated == sptd.bmTypeInput.cosPhiRated + activePowerGradient == sptd.bmTypeInput.activePowerGradient + etaConv == sptd.bmTypeInput.etaConv + } } def "A CsvTypeSource should read and handle valid chp type file as expected"() { @@ -113,15 +117,16 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def chpType = typeSource.chpTypes.get(sptd.chpTypeInput.uuid) - chpType.id == sptd.chpTypeInput.id - chpType.capex == sptd.chpTypeInput.capex - chpType.opex == sptd.chpTypeInput.opex - chpType.etaEl == sptd.chpTypeInput.etaEl - chpType.etaThermal == sptd.chpTypeInput.etaThermal - chpType.sRated == sptd.chpTypeInput.sRated - chpType.pThermal == sptd.chpTypeInput.pThermal - chpType.pOwn == sptd.chpTypeInput.pOwn + with(typeSource.chpTypes.get(sptd.chpTypeInput.uuid)) { + id == sptd.chpTypeInput.id + capex == sptd.chpTypeInput.capex + opex == sptd.chpTypeInput.opex + etaEl == sptd.chpTypeInput.etaEl + etaThermal == sptd.chpTypeInput.etaThermal + sRated == sptd.chpTypeInput.sRated + pThermal == sptd.chpTypeInput.pThermal + pOwn == sptd.chpTypeInput.pOwn + } } def "A CsvTypeSource should read and handle valid hp type file as expected"() { @@ -129,13 +134,14 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def hpType = typeSource.hpTypes.get(sptd.hpTypeInput.uuid) - hpType.id == sptd.hpTypeInput.id - hpType.capex == sptd.hpTypeInput.capex - hpType.opex == sptd.hpTypeInput.opex - hpType.sRated == sptd.hpTypeInput.sRated - hpType.cosPhiRated == sptd.hpTypeInput.cosPhiRated - hpType.pThermal == sptd.hpTypeInput.pThermal + with(typeSource.hpTypes.get(sptd.hpTypeInput.uuid)) { + id == sptd.hpTypeInput.id + capex == sptd.hpTypeInput.capex + opex == sptd.hpTypeInput.opex + sRated == sptd.hpTypeInput.sRated + cosPhiRated == sptd.hpTypeInput.cosPhiRated + pThermal == sptd.hpTypeInput.pThermal + } } def "A CsvTypeSource should read and handle valid storage type file as expected"() { @@ -143,19 +149,20 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def storageType = typeSource.storageTypes.get(sptd.storageTypeInput.uuid) - storageType.id == sptd.storageTypeInput.id - storageType.capex == sptd.storageTypeInput.capex - storageType.opex == sptd.storageTypeInput.opex - storageType.eStorage == sptd.storageTypeInput.eStorage - storageType.sRated == sptd.storageTypeInput.sRated - storageType.cosPhiRated == sptd.storageTypeInput.cosPhiRated - storageType.pMax == sptd.storageTypeInput.pMax - storageType.activePowerGradient == sptd.storageTypeInput.activePowerGradient - storageType.eta == sptd.storageTypeInput.eta - storageType.dod == sptd.storageTypeInput.dod - storageType.lifeTime == sptd.storageTypeInput.lifeTime - storageType.lifeCycle == sptd.storageTypeInput.lifeCycle + with(typeSource.storageTypes.get(sptd.storageTypeInput.uuid)) { + id == sptd.storageTypeInput.id + capex == sptd.storageTypeInput.capex + opex == sptd.storageTypeInput.opex + eStorage == sptd.storageTypeInput.eStorage + sRated == sptd.storageTypeInput.sRated + cosPhiRated == sptd.storageTypeInput.cosPhiRated + pMax == sptd.storageTypeInput.pMax + activePowerGradient == sptd.storageTypeInput.activePowerGradient + eta == sptd.storageTypeInput.eta + dod == sptd.storageTypeInput.dod + lifeTime == sptd.storageTypeInput.lifeTime + lifeCycle == sptd.storageTypeInput.lifeCycle + } } def "A CsvTypeSource should read and handle valid wec type file as expected"() { @@ -163,19 +170,21 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def wecType = typeSource.wecTypes.get(sptd.wecType.uuid) - wecType.id == sptd.wecType.id - wecType.capex == sptd.wecType.capex - wecType.opex == sptd.wecType.opex - wecType.cosPhiRated == sptd.wecType.cosPhiRated - wecType.etaConv == sptd.wecType.etaConv - wecType.sRated == sptd.wecType.sRated - wecType.rotorArea == sptd.wecType.rotorArea - wecType.hubHeight == sptd.wecType.hubHeight - wecType.cpCharacteristic == sptd.wecType.cpCharacteristic - //check for the individual points - if (wecType.cpCharacteristic.points.iterator().hasNext()) - wecType.cpCharacteristic.points.iterator().next() == sptd.wecType.cpCharacteristic.points.iterator().next() + with(typeSource.wecTypes.get(sptd.wecType.uuid)) { + id == sptd.wecType.id + capex == sptd.wecType.capex + opex == sptd.wecType.opex + cosPhiRated == sptd.wecType.cosPhiRated + etaConv == sptd.wecType.etaConv + sRated == sptd.wecType.sRated + rotorArea == sptd.wecType.rotorArea + hubHeight == sptd.wecType.hubHeight + cpCharacteristic == sptd.wecType.cpCharacteristic + //check for the individual points + if (cpCharacteristic.points.iterator().hasNext()) { + assert cpCharacteristic.points.iterator().next() == sptd.wecType.cpCharacteristic.points.iterator().next() + } + } } def "A CsvTypeSource should read and handle valid ev type file as expected"() { @@ -183,13 +192,14 @@ class CsvTypeSourceTest extends Specification implements CsvTestDataMeta { def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, new FileNamingStrategy())) expect: - def evType = typeSource.evTypes.get(sptd.evTypeInput.uuid) - evType.id == sptd.evTypeInput.id - evType.capex == sptd.evTypeInput.capex - evType.opex == sptd.evTypeInput.opex - evType.eStorage == sptd.evTypeInput.eStorage - evType.eCons == sptd.evTypeInput.eCons - evType.sRated == sptd.evTypeInput.sRated - evType.cosPhiRated == sptd.evTypeInput.cosPhiRated + with(typeSource.evTypes.get(sptd.evTypeInput.uuid)) { + id == sptd.evTypeInput.id + capex == sptd.evTypeInput.capex + opex == sptd.evTypeInput.opex + eStorage == sptd.evTypeInput.eStorage + eCons == sptd.evTypeInput.eCons + sRated == sptd.evTypeInput.sRated + cosPhiRated == sptd.evTypeInput.cosPhiRated + } } } From 84cae6bc1496db1f486078e231de5e61736deaa6 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 13:25:20 +0100 Subject: [PATCH 24/31] Adapting JavaDoc to changes --- .../io/source/EnergyManagementSource.java | 15 +-- .../ie3/datamodel/io/source/EntitySource.java | 46 ++++--- .../datamodel/io/source/GraphicSource.java | 12 +- .../datamodel/io/source/RawGridSource.java | 107 ++++++++------- .../io/source/SystemParticipantSource.java | 115 +++++++++------- .../datamodel/io/source/ThermalSource.java | 76 +++++------ .../ie3/datamodel/io/source/TypeSource.java | 123 ++++++++++-------- .../source/EnergyManagementSourceTest.groovy | 16 +-- 8 files changed, 265 insertions(+), 245 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index 2b8a2f4b6..b64c10edc 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -36,9 +36,9 @@ public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. * - * @return a map of uuid to {@link EmInput} entities + * @return a map of UUID to {@link EmInput} entities */ public Map getEmUnits() throws SourceException { Map operators = typeSource.getOperators(); @@ -48,7 +48,7 @@ public Map getEmUnits() throws SourceException { /** * This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. * *

In contrast to {@link #getEmUnits()} this method provides the ability to pass in an already * existing set of {@link OperatorInput} entities, the {@link EmInput} instances depend on. Doing @@ -58,9 +58,8 @@ public Map getEmUnits() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a map of uuid to {@link OperatorInput} that should be used for the returning - * instances - * @return a map of uuid to {@link EmInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @return a map of UUID to {@link EmInput} entities */ public Map getEmUnits(Map operators) throws SourceException { return createEmInputs(buildAssetInputEntityData(EmInput.class, operators)); @@ -72,9 +71,9 @@ public Map getEmUnits(Map operators) throws * in {@link SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at * root level (which are not EM-controlled themselves). * - * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} * {@link Try} + * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} {@link Try} * objects - * @return a map of uuid to {@link EmInput} entities + * @return a map of UUID to {@link EmInput} entities */ private static Map createEmInputs( Stream> assetEntityDataStream) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 7eeebda49..08488121d 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -48,7 +48,8 @@ protected EntitySource(DataSource dataSource) { * chosen by taking into account the UUID found by retrieving the field with given fieldName from * entityData. * - * @param entityData The entity data of the entity that provides a link to another entity via UUID + * @param entityData The entity data to be enhanced, which also provides a link to another entity + * via UUID * @param fieldName The field name of the field that provides the UUID of the linked entity * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity * data @@ -81,10 +82,10 @@ Try enrichEntityData( /** * Enhances given entity data with two entities from the given entity maps. The linked entities * are chosen by taking into account the UUIDs found by retrieving the fields with given - * fieldNameA and fieldNameB from entityData. + * fieldName1 and fieldName2 from entityData. * - * @param entityData The entity data of the entity that provides links to two other entities via - * UUID + * @param entityData The entity data to be enhanced, which also provides links to two other + * entities via UUID * @param fieldName1 The field name of the field that provides the UUID of the first linked entity * @param linkedEntities1 The first map of UUID to entities, of which one should be linked to * given entity data @@ -128,15 +129,11 @@ Try enrichEntityData( } /** - * todo javadoc - * - *

Checks if the requested type of asset can be found in the provided collection of types based - * on the provided fields to values mapping. The provided fields to values mapping needs to have - * one and only one field with key {@link #TYPE} and a corresponding UUID value. If the type can - * be found in the provided collection based on the UUID it is returned wrapped in a {@link - * Success}. Otherwise, a {@link Failure} is returned and a warning is logged. + * Checks if the linked entity can be found in the provided map of entities. The linked entities + * are chosen by taking into account the UUIDs found by retrieving the fields with given + * fieldName1 and fieldName2 from entityData. * - * @param entityData The entity data of the entity that provides a link to another entity + * @param entityData The entity data of the entity that provides a link to another entity via UUID * @param fieldName The field name of the field that provides the UUID of the linked entity * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity * data @@ -174,17 +171,18 @@ protected static Try getLinkedEntit /** * Enhances given entity data with an entity from the given entity map or the default value. The - * linked entity is chosen by taking into account the UUID found by retrieving the field with - * given fieldName from entityData. If no entity is linked, the default value is used. + * linked entity is possibly chosen by taking into account the UUID found by retrieving the field + * with given fieldName from entityData. If no entity is linked, the default value is used. * - * @param entityData The entity data of the entity that provides a link to another entity via UUID - * @param fieldName The field name of the field that provides the UUID of the linked entity + * @param entityData The entity data to be enhanced, which also might provide a link to another + * entity via UUID + * @param fieldName The field name of the field that might provide the UUID of the linked entity * @param linkedEntities A map of UUID to entities, of which one should be linked to given entity * data * @param defaultEntity The default linked entity to use, if no actual linked entity could be * found * @param createEntityData The function that creates the resulting entity data given entityData - * and the linked entity + * and the linked entity (either retrieved from the map or the standard entity) * @param Type of input entity data * @param Type of the linked entity * @param Type of resulting entity data that combines the given entityData and linked entity @@ -264,13 +262,13 @@ private static Try getEntity(UUID uuid, Map ent // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- /** - * Returns a stream of {@link Try} entities that can be build by using {@link + * Returns a stream of {@link Try} entities that can be built by using {@link * NodeAssetInputEntityData} and their corresponding factory. * * @param entityClass the entity class that should be build - * @param nodes a collection of {@link NodeInput} entities that should be used to build the + * @param nodes a map of UUID to {@link NodeInput} entities that should be used to build the * entities - * @param operators a collection of {@link OperatorInput} entities should be used to build the + * @param operators a map of UUID to {@link OperatorInput} entities should be used to build the * entities * @return stream of tries of the entities that has been built by the factory */ @@ -288,7 +286,7 @@ protected Stream> buildNodeAssetE * * @param assetInputEntityDataStream a stream consisting of {@link AssetInputEntityData} that is * enriched with {@link NodeInput} data - * @param nodes a collection of {@link NodeInput} entities that should be used to build the data + * @param nodes a map of UUID to {@link NodeInput} entities that should be used to build the data * @return stream of the entity data wrapped in a {@link Try} */ protected static Stream> @@ -311,7 +309,7 @@ protected Stream> buildNodeAssetE * consumes this data. * * @param entityClass the entity class that should be build - * @param operators a collection of {@link OperatorInput} entities that should be used to build + * @param operators a map of UUID to {@link OperatorInput} entities that should be used to build * the data * @return stream of the entity data wrapped in a {@link Try} */ @@ -327,8 +325,8 @@ protected Stream> buildAssetInputEnti * * @param entityDataStream a stream consisting of {@link EntityData} that is enriched with {@link * OperatorInput} data - * @param operators a collection of {@link OperatorInput} entities that should be used to build - * the data + * @param operators map of UUID to {@link OperatorInput} entities that should be used to build the + * data * @return stream of the entity data wrapped in a {@link Try} */ protected static Stream> assetInputEntityDataStream( diff --git a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java index d2c387f27..d171ef979 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/GraphicSource.java @@ -66,10 +66,12 @@ public GraphicElements getGraphicElements() throws SourceException { /** * Returns the graphic elements of the grid or throws a {@link SourceException}. * - *

This constructor reuses some basic input data to improve performance. + *

In contrast to {@link #getGraphicElements()}, this method provides the ability to pass in + * already existing input objects that this method depends on. Doing so, already loaded nodes and + * lines can be recycled to improve performance and prevent unnecessary loading operations. * - * @param nodes All nodes of the grid in a map UUID -> node - * @param lines All lines of the grid in a map UUID -> line + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param lines a map of UUID to object- and uuid-unique {@link LineInput} entities */ public GraphicElements getGraphicElements(Map nodes, Map lines) throws SourceException { @@ -142,7 +144,7 @@ public Set getLineGraphicInput(Map lines) * NodeGraphicInputEntityData} instance, a {@link Failure} is included in the stream and warning * is logged. * - * @param nodes a set of nodes with unique uuids + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities * @return a stream of tries of {@link NodeGraphicInput} entities */ protected Stream> buildNodeGraphicEntityData( @@ -168,7 +170,7 @@ protected Stream> buildNodeGrap * LineGraphicInputEntityData} instance, a {@link Failure} is included in the stream and warning * is logged. * - * @param lines a set of lines with unique uuids + * @param lines a map of UUID to object- and uuid-unique {@link LineInput} entities * @return a stream of tries of {@link LineGraphicInput} entities */ protected Stream> buildLineGraphicEntityData( diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index bbd0410af..8d6264bf5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -30,11 +30,9 @@ import java.util.stream.Stream; /** - * todo javadoc - * - *

Implementation that provides the capability to build entities that are hold by a {@link - * RawGridElements} as well as the {@link RawGridElements} container as well from different data - * sources e.g. .csv files or databases. + * Implementation that provides the capability to build entities held by {@link RawGridElements} as + * well as the {@link RawGridElements} container from different data sources e.g. .csv files or + * databases. * * @version 0.1 * @since 08.04.20 @@ -117,11 +115,13 @@ public RawGridElements getGridData() throws SourceException { * e.g. in the sense that not duplicate UUIDs exist within all entities contained in the returning * instance. * - *

This constructor reuses some basic input data to improve performance. + *

In contrast to {@link #getGridData()}, this method provides the ability to pass in already + * existing input objects that this method depends on. Doing so, already loaded operators, nodes + * and lines can be recycled to improve performance and prevent unnecessary loading operations. * - * @param operators All operators of the grid in a map UUID -> operator - * @param nodes All nodes of the grid in a map UUID -> node - * @param lines All lines of the grid in a map UUID -> line + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param lines a map of UUID to object- and uuid-unique {@link LineInput} entities * @return a valid, complete {@link RawGridElements} * @throws SourceException on error */ @@ -168,23 +168,24 @@ public RawGridElements getGridData( } /** - * Returns a unique set of {@link NodeInput} instances. + * Returns a unique set of {@link NodeInput} instances within a map by UUID. * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link NodeInput} which has to be checked manually, * as {@link NodeInput#equals(Object)} is NOT restricted on the uuid of {@link NodeInput}. * - * @return a set of object and uuid unique {@link NodeInput} entities + * @return a map of UUID to object- and uuid-unique {@link NodeInput} entities */ public Map getNodes() throws SourceException { return getNodes(typeSource.getOperators()); } /** - * Returns a set of {@link NodeInput} instances. This set has to be unique in the sense of object - * uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided {@link - * NodeInput} which has to be checked manually, as {@link NodeInput#equals(Object)} is NOT - * restricted on the uuid of {@link NodeInput}. + * Returns a unique set of {@link NodeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link NodeInput} which has to be checked manually, + * as {@link NodeInput#equals(Object)} is NOT restricted on the uuid of {@link NodeInput}. * *

In contrast to {@link #getNodes} this method provides the ability to pass in an already * existing set of {@link OperatorInput} entities, the {@link NodeInput} instances depend on. @@ -194,9 +195,8 @@ public Map getNodes() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @return a set of object and uuid unique {@link NodeInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @return a map of UUID to object- and uuid-unique {@link NodeInput} entities */ public Map getNodes(Map operators) throws SourceException { return unpackMap( @@ -205,13 +205,13 @@ public Map getNodes(Map operators) throws } /** - * Returns a unique set of {@link LineInput} instances. + * Returns a unique set of {@link LineInput} instances within a map by UUID. * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link LineInput} which has to be checked manually, * as {@link LineInput#equals(Object)} is NOT restricted on the uuid of {@link LineInput}. * - * @return a set of object and uuid unique {@link LineInput} entities + * @return a map of UUID to object- and uuid-unique {@link LineInput} entities */ public Map getLines() throws SourceException { Map operators = typeSource.getOperators(); @@ -219,10 +219,11 @@ public Map getLines() throws SourceException { } /** - * Returns a set of {@link LineInput} instances. This set has to be unique in the sense of object - * uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided {@link - * LineInput} which has to be checked manually, as {@link LineInput#equals(Object)} is NOT - * restricted on the uuid of {@link LineInput}. + * Returns a unique set of {@link LineInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link LineInput} which has to be checked manually, + * as {@link LineInput#equals(Object)} is NOT restricted on the uuid of {@link LineInput}. * *

In contrast to {@link #getNodes} this method provides the ability to pass in an already * existing set of {@link NodeInput}, {@link LineTypeInput} and {@link OperatorInput} entities, @@ -232,11 +233,10 @@ public Map getLines() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param lineTypeInputs a set of object and uuid unique {@link LineTypeInput} entities - * @return a set of object and uuid unique {@link LineInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param lineTypeInputs a map of UUID to object- and uuid-unique {@link LineTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link LineInput} entities */ public Map getLines( Map operators, @@ -256,7 +256,7 @@ public Map getLines( * manually, as {@link Transformer2WInput#equals(Object)} is NOT restricted on the uuid of {@link * Transformer2WInput}. * - * @return a set of object and uuid unique {@link Transformer2WInput} entities + * @return a set of object- and uuid-unique {@link Transformer2WInput} entities */ public Set get2WTransformers() throws SourceException { Map operators = typeSource.getOperators(); @@ -278,12 +278,11 @@ public Set get2WTransformers() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param transformer2WTypes a set of object and uuid unique {@link Transformer2WTypeInput} - * entities - * @return a set of object and uuid unique {@link Transformer2WInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param transformer2WTypes a map of UUID to object- and uuid-unique {@link + * Transformer2WTypeInput} entities + * @return a set of object- and uuid-unique {@link Transformer2WInput} entities */ public Set get2WTransformers( Map operators, @@ -308,7 +307,7 @@ public Set get2WTransformers( * manually, as {@link Transformer3WInput#equals(Object)} is NOT restricted on the uuid of {@link * Transformer3WInput}. * - * @return a set of object and uuid unique {@link Transformer3WInput} entities + * @return a set of object- and uuid-unique {@link Transformer3WInput} entities */ public Set get3WTransformers() throws SourceException { Map operators = typeSource.getOperators(); @@ -330,21 +329,19 @@ public Set get3WTransformers() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param transformer3WTypeInputs a set of object and uuid unique {@link Transformer3WTypeInput} - * entities - * @return a set of object and uuid unique {@link Transformer3WInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param transformer3WTypes a map of UUID to object- and uuid-unique {@link + * Transformer3WTypeInput} entities + * @return a set of object- and uuid-unique {@link Transformer3WInput} entities */ public Set get3WTransformers( Map operators, Map nodes, - Map transformer3WTypeInputs) + Map transformer3WTypes) throws SourceException { return unpackSet( - buildTransformer3WEntities( - transformer3WInputFactory, nodes, transformer3WTypeInputs, operators), + buildTransformer3WEntities(transformer3WInputFactory, nodes, transformer3WTypes, operators), Transformer3WInput.class); } @@ -356,7 +353,7 @@ public Set get3WTransformers( * manually, as {@link SwitchInput#equals(Object)} is NOT restricted on the uuid of {@link * SwitchInput}. * - * @return a set of object and uuid unique {@link SwitchInput} entities + * @return a set of object- and uuid-unique {@link SwitchInput} entities */ public Set getSwitches() throws SourceException { Map operators = typeSource.getOperators(); @@ -377,10 +374,9 @@ public Set getSwitches() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link SwitchInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @return a set of object- and uuid-unique {@link SwitchInput} entities */ public Set getSwitches( Map operators, Map nodes) throws SourceException { @@ -396,7 +392,7 @@ public Set getSwitches( * manually, as {@link MeasurementUnitInput#equals(Object)} is NOT restricted on the uuid of * {@link MeasurementUnitInput}. * - * @return a set of object and uuid unique {@link MeasurementUnitInput} entities + * @return a set of object- and uuid-unique {@link MeasurementUnitInput} entities */ public Set getMeasurementUnits() throws SourceException { Map operators = typeSource.getOperators(); @@ -418,10 +414,9 @@ public Set getMeasurementUnits() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link MeasurementUnitInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @return a set of object- and uuid-unique {@link MeasurementUnitInput} entities */ public Set getMeasurementUnits( Map operators, Map nodes) throws SourceException { diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 7b99e604a..29d44be56 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -117,10 +117,12 @@ public SystemParticipants getSystemParticipants() throws SourceException { * validity e.g. in the sense that not duplicate UUIDs exist within all entities contained in the * returning instance. * - *

This constructor reuses some basic input data to improve performance. + *

In contrast to {@link #getSystemParticipants()}, this method provides the ability to pass in + * already existing input objects that this method depends on. Doing so, already loaded operators + * and nodes can be recycled to improve performance and prevent unnecessary loading operations. * - * @param operators All operators of the grid in a map UUID -> operator - * @param nodes All nodes of the grid in a map UUID -> node + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities * @return a valid, complete {@link SystemParticipants} * @throws SourceException on error */ @@ -211,7 +213,7 @@ public SystemParticipants getSystemParticipants( * manually, as {@link FixedFeedInInput#equals(Object)} is NOT restricted on the uuid of {@link * FixedFeedInInput}. * - * @return a set of object and uuid unique {@link FixedFeedInInput} entities + * @return a set of object- and uuid-unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns() throws SourceException { Map operators = typeSource.getOperators(); @@ -233,10 +235,10 @@ public Set getFixedFeedIns() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link FixedFeedInInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @return a set of object- and uuid-unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns( Map operators, Map nodes, Map emUnits) @@ -254,7 +256,7 @@ public Set getFixedFeedIns( * java.util.UUID} uniqueness of the provided {@link PvInput} which has to be checked manually, as * {@link PvInput#equals(Object)} is NOT restricted on the uuid of {@link PvInput}. * - * @return a set of object and uuid unique {@link PvInput} entities + * @return a set of object- and uuid-unique {@link PvInput} entities */ public Set getPvPlants() throws SourceException { Map operators = typeSource.getOperators(); @@ -276,10 +278,10 @@ public Set getPvPlants() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link PvInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @return a set of object- and uuid-unique {@link PvInput} entities */ public Set getPvPlants( Map operators, Map nodes, Map emUnits) @@ -297,7 +299,7 @@ public Set getPvPlants( * java.util.UUID} uniqueness of the provided {@link LoadInput} which has to be checked manually, * as {@link LoadInput#equals(Object)} is NOT restricted on the uuid of {@link LoadInput}. * - * @return a set of object and uuid unique {@link LoadInput} entities + * @return a set of object- and uuid-unique {@link LoadInput} entities */ public Set getLoads() throws SourceException { Map operators = typeSource.getOperators(); @@ -319,10 +321,10 @@ public Set getLoads() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link LoadInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @return a set of object- and uuid-unique {@link LoadInput} entities */ public Set getLoads( Map operators, Map nodes, Map emUnits) @@ -340,7 +342,7 @@ public Set getLoads( * java.util.UUID} uniqueness of the provided {@link EvcsInput} which has to be checked manually, * as {@link EvcsInput#equals(Object)} is NOT restricted on the uuid of {@link EvcsInput}. * - * @return a set of object and uuid unique {@link EvcsInput} entities + * @return a set of object- and uuid-unique {@link EvcsInput} entities */ public Set getEvcs() throws SourceException { Map operators = typeSource.getOperators(); @@ -362,10 +364,10 @@ public Set getEvcs() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @return a set of object and uuid unique {@link EvcsInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @return a set of object- and uuid-unique {@link EvcsInput} entities */ public Set getEvcs( Map operators, Map nodes, Map emUnits) @@ -383,7 +385,7 @@ public Set getEvcs( * java.util.UUID} uniqueness of the provided {@link BmInput} which has to be checked manually, as * {@link BmInput#equals(Object)} is NOT restricted on the uuid of {@link BmInput}. * - * @return a set of object and uuid unique {@link BmInput} entities + * @return a set of object- and uuid-unique {@link BmInput} entities */ public Set getBmPlants() throws SourceException { Map operators = typeSource.getOperators(); @@ -406,11 +408,11 @@ public Set getBmPlants() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param types a set of object and uuid unique {@link BmTypeInput} entities - * @return a set of object and uuid unique {@link BmInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link BmTypeInput} entities + * @return a set of object- and uuid-unique {@link BmInput} entities */ public Set getBmPlants( Map operators, @@ -432,7 +434,7 @@ public Set getBmPlants( * manually, as {@link StorageInput#equals(Object)} is NOT restricted on the uuid of {@link * StorageInput}. * - * @return a set of object and uuid unique {@link StorageInput} entities + * @return a set of object- and uuid-unique {@link StorageInput} entities */ public Set getStorages() throws SourceException { Map operators = typeSource.getOperators(); @@ -455,11 +457,12 @@ public Set getStorages() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param types a set of object and uuid unique {@link StorageTypeInput} entities - * @return a set of object and uuid unique {@link StorageInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} that should be + * used for the returning instances + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link StorageTypeInput} entities + * @return a set of object- and uuid-unique {@link StorageInput} entities */ public Set getStorages( Map operators, @@ -480,7 +483,7 @@ public Set getStorages( * java.util.UUID} uniqueness of the provided {@link WecInput} which has to be checked manually, * as {@link WecInput#equals(Object)} is NOT restricted on the uuid of {@link WecInput}. * - * @return a set of object and uuid unique {@link WecInput} entities + * @return a set of object- and uuid-unique {@link WecInput} entities */ public Set getWecPlants() throws SourceException { Map operators = typeSource.getOperators(); @@ -503,11 +506,11 @@ public Set getWecPlants() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param types a set of object and uuid unique {@link WecTypeInput} entities - * @return a set of object and uuid unique {@link WecInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link WecTypeInput} entities + * @return a set of object- and uuid-unique {@link WecInput} entities */ public Set getWecPlants( Map operators, @@ -528,7 +531,7 @@ public Set getWecPlants( * java.util.UUID} uniqueness of the provided {@link EvInput} which has to be checked manually, as * {@link EvInput#equals(Object)} is NOT restricted on the uuid of {@link EvInput}. * - * @return a set of object and uuid unique {@link EvInput} entities + * @return a set of object- and uuid-unique {@link EvInput} entities */ public Set getEvs() throws SourceException { Map operators = typeSource.getOperators(); @@ -550,11 +553,11 @@ public Set getEvs() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param nodes a set of object and uuid unique {@link NodeInput} entities - * @param types a set of object and uuid unique {@link EvTypeInput} entities - * @return a set of object and uuid unique {@link EvInput} entities + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link EvTypeInput} entities + * @return a set of object- and uuid-unique {@link EvInput} entities */ public Set getEvs( Map operators, @@ -590,6 +593,15 @@ public Set getChpPlants() throws SourceException { * *

If the set with {@link OperatorInput} is not exhaustive, the corresponding operator is set * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} + * + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link ChpTypeInput} entities + * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities + * @param thermalStorages a map of UUID to object- and uuid-unique {@link ThermalStorageInput} + * entities + * @return a set of object- and uuid-unique {@link ChpInput} entities */ public Set getChpPlants( Map operators, @@ -629,6 +641,13 @@ public Set getHeatPumps() throws SourceException { * *

If the set with {@link OperatorInput} is not exhaustive, the corresponding operator is set * to {@link OperatorInput#NO_OPERATOR_ASSIGNED} + * + * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities + * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities + * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities + * @param types a map of UUID to object- and uuid-unique {@link HpTypeInput} entities + * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities + * @return a set of object- and uuid-unique {@link HpInput} entities */ public Set getHeatPumps( Map operators, @@ -698,8 +717,8 @@ private static Stream> hpEntityStream( * Constructs a stream of {@link SystemParticipantTypedEntityData} wrapped in {@link Try}'s. * * @param entityClass the class of the entities that should be built - * @param nodes the nodes that should be considered for these entities * @param operators the operators that should be considered for these entities + * @param nodes the nodes that should be considered for these entities * @param types the types that should be considered for these entities * @param the type of the type model of the resulting entity * @return a stream of tries holding an instance of a {@link SystemParticipantTypedEntityData} diff --git a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java index 7fada86a1..024190824 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/ThermalSource.java @@ -22,9 +22,7 @@ import java.util.stream.Stream; /** - * todo javadoc - * - *

Interface that provides the capability to build thermal {@link + * Interface that provides the capability to build thermal {@link * edu.ie3.datamodel.models.input.AssetInput} entities from persistent data e.g. .csv files or * databases * @@ -50,24 +48,26 @@ public ThermalSource(TypeSource typeSource, DataSource dataSource) { } /** - * Returns a unique set of {@link ThermalBusInput} instances. + * Returns a unique set of {@link ThermalBusInput} instances within a map by UUID. * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link ThermalBusInput} which has to be checked * manually, as {@link ThermalBusInput#equals(Object)} is NOT restricted on the uuid of {@link * ThermalBusInput}. * - * @return a set of object and uuid unique {@link ThermalBusInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities */ public Map getThermalBuses() throws SourceException { return getThermalBuses(typeSource.getOperators()); } /** - * Returns a set of {@link ThermalBusInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link ThermalBusInput} which has to be checked manually, as {@link - * ThermalBusInput#equals(Object)} is NOT restricted on the uuid of {@link ThermalBusInput}. + * Returns a unique set of {@link ThermalBusInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link ThermalBusInput} which has to be checked + * manually, as {@link ThermalBusInput#equals(Object)} is NOT restricted on the uuid of {@link + * ThermalBusInput}. * *

In contrast to {@link #getThermalBuses()} this interface provides the ability to pass in an * already existing set of {@link OperatorInput} entities, the {@link ThermalBusInput} instances @@ -77,9 +77,8 @@ public Map getThermalBuses() throws SourceException { *

If something fails during the creation process it's up to the concrete implementation of an * empty set or a set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @return a set of object and uuid unique {@link ThermalBusInput} entities + * @param operators a set of object- and uuid-unique {@link OperatorInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities */ public Map getThermalBuses(Map operators) throws SourceException { @@ -91,14 +90,14 @@ public Map getThermalBuses(Map opera /** * Returns a unique set of instances of all entities implementing the {@link ThermalStorageInput} - * abstract class. + * abstract class within a map by UUID. * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link ThermalStorageInput} which has to be checked * manually, as {@link ThermalStorageInput#equals(Object)} is NOT restricted on the uuid of {@link * ThermalStorageInput}. * - * @return a set of object and uuid unique {@link ThermalStorageInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalStorageInput} entities */ public Map getThermalStorages() throws SourceException { return getCylindricalStorages().stream() @@ -120,11 +119,9 @@ public Map getThermalStorages() throws SourceExceptio *

If something fails during the creation process it's up to the concrete implementation of an * empty set or a set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param thermalBuses a set of object and uuid unique {@link ThermalBusInput} that should be used - * for the returning instances - * @return a set of object and uuid unique {@link ThermalStorageInput} entities + * @param operators a set of object- and uuid-unique {@link OperatorInput} entities + * @param thermalBuses a set of object- and uuid-unique {@link ThermalBusInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalStorageInput} entities */ public Map getThermalStorages( Map operators, Map thermalBuses) @@ -141,7 +138,7 @@ public Map getThermalStorages( * manually, as {@link ThermalHouseInput#equals(Object)} is NOT restricted on the uuid of {@link * ThermalHouseInput}. * - * @return a set of object and uuid unique {@link ThermalHouseInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalHouseInput} entities */ public Map getThermalHouses() throws SourceException { Map operators = typeSource.getOperators(); @@ -151,10 +148,12 @@ public Map getThermalHouses() throws SourceException { } /** - * Returns a set of {@link ThermalHouseInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link ThermalHouseInput} which has to be checked manually, as {@link - * ThermalHouseInput#equals(Object)} is NOT restricted on the uuid of {@link ThermalHouseInput}. + * Returns a set of {@link ThermalHouseInput} instances. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link ThermalHouseInput} which has to be checked + * manually, as {@link ThermalHouseInput#equals(Object)} is NOT restricted on the uuid of {@link + * ThermalHouseInput}. * *

In contrast to {@link #getThermalHouses()} this interface provides the ability to pass in an * already existing set of {@link OperatorInput} entities, the {@link ThermalHouseInput} instances @@ -164,11 +163,9 @@ public Map getThermalHouses() throws SourceException { *

If something fails during the creation process it's up to the concrete implementation of an * empty set or a set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param thermalBuses a set of object and uuid unique {@link ThermalBusInput} that should be used - * for the returning instances - * @return a set of object and uuid unique {@link ThermalHouseInput} entities + * @param operators a set of object- and uuid-unique {@link OperatorInput} entities + * @param thermalBuses a set of object- and uuid-unique {@link ThermalBusInput} entities + * @return a map of UUID to object- and uuid-unique {@link ThermalHouseInput} entities */ public Map getThermalHouses( Map operators, Map thermalBuses) @@ -188,7 +185,7 @@ public Map getThermalHouses( * checked manually, as {@link CylindricalStorageInput#equals(Object)} is NOT restricted on the * uuid of {@link CylindricalStorageInput}. * - * @return a set of object and uuid unique {@link CylindricalStorageInput} entities + * @return a set of object- and uuid-unique {@link CylindricalStorageInput} entities */ public Set getCylindricalStorages() throws SourceException { Map operators = typeSource.getOperators(); @@ -198,11 +195,12 @@ public Set getCylindricalStorages() throws SourceExcept } /** - * Returns a set of {@link CylindricalStorageInput} instances. This set has to be unique in the - * sense of object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the - * provided {@link CylindricalStorageInput} which has to be checked manually, as {@link - * CylindricalStorageInput#equals(Object)} is NOT restricted on the uuid of {@link - * CylindricalStorageInput}. + * Returns a set of {@link CylindricalStorageInput} instances. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * java.util.UUID} uniqueness of the provided {@link CylindricalStorageInput} which has to be + * checked manually, as {@link CylindricalStorageInput#equals(Object)} is NOT restricted on the + * uuid of {@link CylindricalStorageInput}. * *

In contrast to {@link #getCylindricalStorages()} this interface provides the ability to pass * in an already existing set of {@link OperatorInput} entities, the {@link @@ -212,11 +210,9 @@ public Set getCylindricalStorages() throws SourceExcept *

If something fails during the creation process it's up to the concrete implementation of an * empty set or a set with all entities that has been able to be build is returned. * - * @param operators a set of object and uuid unique {@link OperatorInput} that should be used for - * the returning instances - * @param thermalBuses a set of object and uuid unique {@link ThermalBusInput} that should be used - * for the returning instances - * @return a set of object and uuid unique {@link CylindricalStorageInput} entities + * @param operators a set of object- and uuid-unique {@link OperatorInput} entities + * @param thermalBuses a set of object- and uuid-unique {@link ThermalBusInput} entities + * @return a set of object- and uuid-unique {@link CylindricalStorageInput} entities */ public Set getCylindricalStorages( Map operators, Map thermalBuses) diff --git a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java index 1271c29f5..a74dcba57 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TypeSource.java @@ -53,13 +53,14 @@ public TypeSource(DataSource dataSource) { } /** - * Returns a set of {@link Transformer2WTypeInput} instances. This set has to be unique in the - * sense of object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the - * provided {@link Transformer2WTypeInput} which has to be checked manually, as {@link - * Transformer2WTypeInput#equals(Object)} is NOT restricted on the uuid of {@link - * Transformer2WTypeInput}. + * Returns a set of {@link Transformer2WTypeInput} instances within a map by UUID. * - * @return a set of object and uuid unique {@link Transformer2WTypeInput} entities + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link Transformer2WTypeInput} which has to be checked + * manually, as {@link Transformer2WTypeInput#equals(Object)} is NOT restricted on the uuid of + * {@link Transformer2WTypeInput}. + * + * @return a map of UUID to object- and uuid-unique {@link Transformer2WTypeInput} entities */ public Map getTransformer2WTypes() throws SourceException { return unpackMap( @@ -68,12 +69,13 @@ public Map getTransformer2WTypes() throws SourceEx } /** - * Returns a set of {@link OperatorInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link OperatorInput} which has to be checked manually, as {@link OperatorInput#equals(Object)} - * is NOT restricted on the uuid of {@link OperatorInput}. + * Returns a set of {@link OperatorInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link OperatorInput} which has to be checked manually, as + * {@link OperatorInput#equals(Object)} is NOT restricted on the uuid of {@link OperatorInput}. * - * @return a set of object and uuid unique {@link OperatorInput} entities + * @return a map of UUID to object- and uuid-unique {@link OperatorInput} entities */ public Map getOperators() throws SourceException { return unpackMap( @@ -81,12 +83,13 @@ public Map getOperators() throws SourceException { } /** - * Returns a set of {@link LineTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link LineTypeInput} which has to be checked manually, as {@link LineTypeInput#equals(Object)} - * is NOT restricted on the uuid of {@link LineTypeInput}. + * Returns a set of {@link LineTypeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link LineTypeInput} which has to be checked manually, as + * {@link LineTypeInput#equals(Object)} is NOT restricted on the uuid of {@link LineTypeInput}. * - * @return a set of object and uuid unique {@link LineTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link LineTypeInput} entities */ public Map getLineTypes() throws SourceException { return unpackMap( @@ -94,13 +97,14 @@ public Map getLineTypes() throws SourceException { } /** - * Returns a set of {@link Transformer3WTypeInput} instances. This set has to be unique in the - * sense of object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the - * provided {@link Transformer3WTypeInput} which has to be checked manually, as {@link - * Transformer3WTypeInput#equals(Object)} is NOT restricted on the uuid of {@link - * Transformer3WTypeInput}. + * Returns a set of {@link Transformer3WTypeInput} instances within a map by UUID. * - * @return a set of object and uuid unique {@link Transformer3WTypeInput} entities + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link Transformer3WTypeInput} which has to be checked + * manually, as {@link Transformer3WTypeInput#equals(Object)} is NOT restricted on the uuid of + * {@link Transformer3WTypeInput}. + * + * @return a map of UUID to object- and uuid-unique {@link Transformer3WTypeInput} entities */ public Map getTransformer3WTypes() throws SourceException { return unpackMap( @@ -109,12 +113,13 @@ public Map getTransformer3WTypes() throws SourceEx } /** - * Returns a set of {@link BmTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link BmTypeInput} which has to be checked manually, as {@link BmTypeInput#equals(Object)} is - * NOT restricted on the uuid of {@link BmTypeInput}. + * Returns a set of {@link BmTypeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link BmTypeInput} which has to be checked manually, as + * {@link BmTypeInput#equals(Object)} is NOT restricted on the uuid of {@link BmTypeInput}. * - * @return a set of object and uuid unique {@link BmTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link BmTypeInput} entities */ public Map getBmTypes() throws SourceException { return unpackMap( @@ -122,12 +127,13 @@ public Map getBmTypes() throws SourceException { } /** - * Returns a set of {@link ChpTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link ChpTypeInput} which has to be checked manually, as {@link ChpTypeInput#equals(Object)} - * is NOT restricted on the uuid of {@link ChpTypeInput}. + * Returns a set of {@link ChpTypeInput} instances within a map by UUID. * - * @return a set of object and uuid unique {@link ChpTypeInput} entities + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link ChpTypeInput} which has to be checked manually, as + * {@link ChpTypeInput#equals(Object)} is NOT restricted on the uuid of {@link ChpTypeInput}. + * + * @return a map of UUID to object- and uuid-unique {@link ChpTypeInput} entities */ public Map getChpTypes() throws SourceException { return unpackMap( @@ -135,12 +141,13 @@ public Map getChpTypes() throws SourceException { } /** - * Returns a set of {@link HpTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link HpTypeInput} which has to be checked manually, as {@link HpTypeInput#equals(Object)} is - * NOT restricted on the uuid of {@link HpTypeInput}. + * Returns a set of {@link HpTypeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link HpTypeInput} which has to be checked manually, as + * {@link HpTypeInput#equals(Object)} is NOT restricted on the uuid of {@link HpTypeInput}. * - * @return a set of object and uuid unique {@link HpTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link HpTypeInput} entities */ public Map getHpTypes() throws SourceException { return unpackMap( @@ -148,12 +155,14 @@ public Map getHpTypes() throws SourceException { } /** - * Returns a set of {@link StorageTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link StorageTypeInput} which has to be checked manually, as {@link - * StorageTypeInput#equals(Object)} is NOT restricted on the uuid of {@link StorageTypeInput}. + * Returns a set of {@link StorageTypeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link StorageTypeInput} which has to be checked manually, as + * {@link StorageTypeInput#equals(Object)} is NOT restricted on the uuid of {@link + * StorageTypeInput}. * - * @return a set of object and uuid unique {@link StorageTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link StorageTypeInput} entities */ public Map getStorageTypes() throws SourceException { return unpackMap( @@ -162,12 +171,13 @@ public Map getStorageTypes() throws SourceException { } /** - * Returns a set of {@link WecTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link WecTypeInput} which has to be checked manually, as {@link WecTypeInput#equals(Object)} - * is NOT restricted on the uuid of {@link WecTypeInput}. + * Returns a set of {@link WecTypeInput} instances within a map by UUID. * - * @return a set of object and uuid unique {@link WecTypeInput} entities + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link WecTypeInput} which has to be checked manually, as + * {@link WecTypeInput#equals(Object)} is NOT restricted on the uuid of {@link WecTypeInput}. + * + * @return a map of UUID to object- and uuid-unique {@link WecTypeInput} entities */ public Map getWecTypes() throws SourceException { return unpackMap( @@ -175,12 +185,13 @@ public Map getWecTypes() throws SourceException { } /** - * Returns a set of {@link EvTypeInput} instances. This set has to be unique in the sense of - * object uniqueness but also in the sense of {@link java.util.UUID} uniqueness of the provided - * {@link EvTypeInput} which has to be checked manually, as {@link EvTypeInput#equals(Object)} is - * NOT restricted on the uuid of {@link EvTypeInput}. + * Returns a set of {@link EvTypeInput} instances within a map by UUID. + * + *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link + * UUID} uniqueness of the provided {@link EvTypeInput} which has to be checked manually, as + * {@link EvTypeInput#equals(Object)} is NOT restricted on the uuid of {@link EvTypeInput}. * - * @return a set of object and uuid unique {@link EvTypeInput} entities + * @return a map of UUID to object- and uuid-unique {@link EvTypeInput} entities */ public Map getEvTypes() throws SourceException { return unpackMap( @@ -191,10 +202,10 @@ public Map getEvTypes() throws SourceException { * Build and cast entities to the correct type, since {@link SystemParticipantTypeInputFactory} * outputs {@link SystemParticipantTypeInput} of general type. * - * @param entityClass - * @param factory - * @return - * @param + * @param entityClass The class of type input entity to build + * @param factory The factory to use to build the entity + * @return a stream of {@link Try}s containing the desired entities + * @param The type of AssetType to return */ @SuppressWarnings("unchecked") private Stream> buildEntities( diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy index 4dcb4546e..00ea6e434 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -56,7 +56,7 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : ""], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) expect: def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) @@ -119,7 +119,7 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : "other"], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) expect: def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) @@ -191,7 +191,7 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : ""], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) when: EnergyManagementSource.createEmInputs(assetEntityDataStream) @@ -217,15 +217,15 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : ""], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) when: EnergyManagementSource.createEmInputs(assetEntityDataStream) then: def exc = thrown(SourceException) - exc.cause.message.contains("An error occurred when creating instance of EmInput.class") - exc.cause.cause.class == FactoryException + exc.cause.message.contains("An error occurred when creating instance of EmInput") + exc.cause.cause == FactoryException } def "An EnergyManagementSource should fail if a parent em is not provided"() { @@ -245,7 +245,7 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : ""], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) when: EnergyManagementSource.createEmInputs(assetEntityDataStream) @@ -272,7 +272,7 @@ class EnergyManagementSourceTest extends Specification { "controlstrategy" : ""], EmInput ), - ).map(data -> Try.of(() -> data, SourceException.class)) + ).map(data -> Try.of(() -> data, SourceException)) when: EnergyManagementSource.createEmInputs(assetEntityDataStream) From da48f0a81860ee70c8f3f51db5be3310f682eb4a Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 13:35:40 +0100 Subject: [PATCH 25/31] Fix --- .../ie3/datamodel/io/source/EnergyManagementSourceTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy index 00ea6e434..3b3503a35 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -225,7 +225,7 @@ class EnergyManagementSourceTest extends Specification { then: def exc = thrown(SourceException) exc.cause.message.contains("An error occurred when creating instance of EmInput") - exc.cause.cause == FactoryException + exc.cause.class == FactoryException } def "An EnergyManagementSource should fail if a parent em is not provided"() { From 136132bc0464fefb216c910ac50d5bafcdac5e2e Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 13:47:10 +0100 Subject: [PATCH 26/31] Ok, try again --- .../ie3/datamodel/io/source/EnergyManagementSourceTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy index 3b3503a35..288c6be0a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy @@ -225,7 +225,7 @@ class EnergyManagementSourceTest extends Specification { then: def exc = thrown(SourceException) exc.cause.message.contains("An error occurred when creating instance of EmInput") - exc.cause.class == FactoryException + exc.cause.cause.class == FactoryException } def "An EnergyManagementSource should fail if a parent em is not provided"() { From cfc9181444284c42c3ba10059a1a9a6ab19bef52 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 14:42:28 +0100 Subject: [PATCH 27/31] Refactored RawGridSource --- .../datamodel/io/source/RawGridSource.java | 130 +++++++----------- .../io/source/csv/CsvRawGridSourceTest.groovy | 14 +- 2 files changed, 59 insertions(+), 85 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java index 8d6264bf5..d63ac6398 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/RawGridSource.java @@ -5,10 +5,8 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.RawGridException; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.io.factory.EntityFactory; import edu.ie3.datamodel.io.factory.input.*; import edu.ie3.datamodel.models.input.*; import edu.ie3.datamodel.models.input.MeasurementUnitInput; @@ -244,7 +242,8 @@ public Map getLines( Map lineTypeInputs) throws SourceException { return unpackMap( - buildTypedEntityData(LineInput.class, lineInputFactory, nodes, operators, lineTypeInputs), + buildTypedEntityData(LineInput.class, operators, nodes, lineTypeInputs) + .map(lineInputFactory::get), LineInput.class); } @@ -290,12 +289,8 @@ public Set get2WTransformers( Map transformer2WTypes) throws SourceException { return unpackSet( - buildTypedEntityData( - Transformer2WInput.class, - transformer2WInputFactory, - nodes, - operators, - transformer2WTypes), + buildTypedEntityData(Transformer2WInput.class, operators, nodes, transformer2WTypes) + .map(transformer2WInputFactory::get), Transformer2WInput.class); } @@ -341,7 +336,11 @@ public Set get3WTransformers( Map transformer3WTypes) throws SourceException { return unpackSet( - buildTransformer3WEntities(transformer3WInputFactory, nodes, transformer3WTypes, operators), + transformer3WEntityDataStream( + buildTypedEntityData( + Transformer3WInput.class, operators, nodes, transformer3WTypes), + nodes) + .map(transformer3WInputFactory::get), Transformer3WInput.class); } @@ -380,8 +379,9 @@ public Set getSwitches() throws SourceException { */ public Set getSwitches( Map operators, Map nodes) throws SourceException { - return buildUntypedConnectorInputEntities( - SwitchInput.class, switchInputFactory, nodes, operators); + return unpackSet( + buildUntypedEntityData(SwitchInput.class, operators, nodes).map(switchInputFactory::get), + SwitchInput.class); } /** @@ -428,63 +428,53 @@ public Set getMeasurementUnits( // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- - // todo refactoring + /** + * Enriches the Stream of tries on {@link Transformer3WInputEntityData} with the information of + * the internal node. + * + * @param typedConnectorEntityDataStream Stream of already typed input entity data + * @param nodes Yet available nodes + * @return A stream of {@link Try} on enriched data + */ + protected Stream> + transformer3WEntityDataStream( + Stream, SourceException>> + typedConnectorEntityDataStream, + Map nodes) { + return typedConnectorEntityDataStream + .parallel() + .map( + typedEntityDataOpt -> + typedEntityDataOpt.flatMap( + typeEntityData -> + enrichEntityData( + typeEntityData, "nodeC", nodes, Transformer3WInputEntityData::new))); + } private - Stream> buildTypedEntityData( + Stream, SourceException>> buildTypedEntityData( Class entityClass, - EntityFactory> factory, - Map nodes, Map operators, + Map nodes, Map types) { - return buildTypedConnectorEntityData( - buildUntypedConnectorInputEntityData( - buildAssetInputEntityData(entityClass, operators), nodes), - types) - .map(factory::get); - } - - public Set buildUntypedConnectorInputEntities( - Class entityClass, - EntityFactory factory, - Map nodes, - Map operators) - throws SourceException { - return unpackSet( - buildUntypedConnectorInputEntityData( - buildAssetInputEntityData(entityClass, operators), nodes) - .map(factory::get), - entityClass); - } - - public Stream> buildTransformer3WEntities( - Transformer3WInputFactory transformer3WInputFactory, - Map nodes, - Map transformer3WTypeInputs, - Map operators) { - return buildTransformer3WEntityData( - buildTypedConnectorEntityData( - buildUntypedConnectorInputEntityData( - buildAssetInputEntityData(Transformer3WInput.class, operators), nodes), - transformer3WTypeInputs), - nodes) - .map(transformer3WInputFactory::get); + return typedConnectorEntityDataStream( + buildUntypedEntityData(entityClass, operators, nodes), types); } /** * Enriches the given untyped entity data with the equivalent asset type. If this is not possible, * a {@link Failure} is returned. * - * @param noTypeConnectorEntityDataStream Stream of untyped entity data + * @param connectorEntityDataStream Stream of untyped entity data * @param availableTypes Yet available asset types * @param Type of the asset type * @return Stream of {@link Try} to enhanced data */ protected - Stream, SourceException>> buildTypedConnectorEntityData( - Stream> noTypeConnectorEntityDataStream, + Stream, SourceException>> typedConnectorEntityDataStream( + Stream> connectorEntityDataStream, Map availableTypes) { - return noTypeConnectorEntityDataStream + return connectorEntityDataStream .parallel() .map( noTypeEntityDataOpt -> @@ -497,6 +487,13 @@ Stream, SourceException>> buildTypedConnect TypedConnectorInputEntityData::new))); } + public + Stream> buildUntypedEntityData( + Class entityClass, Map operators, Map nodes) { + return untypedConnectorEntityDataStream( + buildAssetInputEntityData(entityClass, operators), nodes); + } + /** * Converts a stream of {@link AssetInputEntityData} in connection with a collection of known * {@link NodeInput}s to a stream of {@link ConnectorInputEntityData}. @@ -505,10 +502,9 @@ Stream, SourceException>> buildTypedConnect * @param nodes A collection of known nodes * @return A stream on {@link Try} to matching {@link ConnectorInputEntityData} */ - protected Stream> - buildUntypedConnectorInputEntityData( - Stream> assetInputEntityDataStream, - Map nodes) { + protected Stream> untypedConnectorEntityDataStream( + Stream> assetInputEntityDataStream, + Map nodes) { return assetInputEntityDataStream .parallel() .map( @@ -523,26 +519,4 @@ Stream, SourceException>> buildTypedConnect nodes, ConnectorInputEntityData::new))); } - - /** - * Enriches the Stream of tries on {@link Transformer3WInputEntityData} with the information of - * the internal node. - * - * @param typedConnectorEntityDataStream Stream of already typed input entity data - * @param nodes Yet available nodes - * @return A stream of {@link Try} on enriched data - */ - protected Stream> buildTransformer3WEntityData( - Stream, SourceException>> - typedConnectorEntityDataStream, - Map nodes) { - return typedConnectorEntityDataStream - .parallel() - .map( - typedEntityDataOpt -> - typedEntityDataOpt.flatMap( - typeEntityData -> - enrichEntityData( - typeEntityData, "nodeC", nodes, Transformer3WInputEntityData::new))); - } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy index da933fc65..cca9a018b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvRawGridSourceTest.groovy @@ -63,7 +63,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { def nodes = map([rgtd.nodeA, rgtd.nodeB]) when: "the source tries to convert it" - def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) + def connectorDataOption = source.untypedConnectorEntityDataStream(validAssetEntityInputData, nodes) then: "everything is fine" connectorDataOption.forEach { actualTry -> @@ -95,9 +95,9 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { def nodes = map([rgtd.nodeA, rgtd.nodeB]) when: "the source tries to convert it" - def connectorDataOption = source.buildUntypedConnectorInputEntityData(validAssetEntityInputData, nodes) + def connectorDataOption = source.untypedConnectorEntityDataStream(validAssetEntityInputData, nodes) - then: "it returns en empty Optional" + then: "it returns a Failure" connectorDataOption.allMatch(Try::isFailure) } @@ -171,7 +171,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { ]) when: "the source tries to convert it" - def actualSet = source.buildUntypedConnectorInputEntityData(validStream, nodes).collect(Collectors.toSet()) + def actualSet = source.untypedConnectorEntityDataStream(validStream, nodes).collect(Collectors.toSet()) then: "everything is fine" actualSet.size() == expectedSet.size() @@ -256,7 +256,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { def availableTypes = map([rgtd.lineTypeInputCtoD]) when: "the source tries to convert it" - def actualSet = source.buildTypedConnectorEntityData(validStream, availableTypes).collect(Collectors.toSet()) + def actualSet = source.typedConnectorEntityDataStream(validStream, availableTypes).collect(Collectors.toSet()) then: "everything is fine" actualSet.size() == expectedSet.size() @@ -324,7 +324,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { rgtd.transformerTypeAtoBtoC) when: "the sources tries to add nodes" - def actualSet = source.buildTransformer3WEntityData(inputStream, availableNodes).collect(Collectors.toSet()) + def actualSet = source.transformer3WEntityDataStream(inputStream, availableNodes).collect(Collectors.toSet()) def successes = actualSet.stream().filter { it.success }.toList() @@ -553,7 +553,7 @@ class CsvRawGridSourceTest extends Specification implements CsvTestDataMeta { then: "all elements are there" actual != null actual.with { - /* It's okay, to only test the uuids, because content is tested with the other test mehtods */ + /* It's okay, to only test the uuids, because content is tested with the other test methods */ assert nodes.size() == expected.nodes.size() assert nodes.each {entry -> expected.nodes.contains({it.uuid == entry.uuid})} assert lines.size() == expected.lines.size() From b1ff33752a3b1f38298de21078d1e32f8fc2b6d6 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 14:55:21 +0100 Subject: [PATCH 28/31] Moved todo to issue #975 --- src/main/java/edu/ie3/datamodel/io/source/EntitySource.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 08488121d..70e057ae0 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -26,7 +26,6 @@ /** Class that provides all functionalities to build entities */ public abstract class EntitySource { - // TODO make all subclasses static? protected static final Logger log = LoggerFactory.getLogger(EntitySource.class); From 40fba631981530f870c44e8d95789f2897b8a362 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 17:52:04 +0100 Subject: [PATCH 29/31] Adapted EntitySourceClassDiagram.puml --- docs/uml/main/EntitySourceClassDiagram.puml | 188 ++++++++++-------- .../ie3/datamodel/io/source/EntitySource.java | 5 +- 2 files changed, 102 insertions(+), 91 deletions(-) diff --git a/docs/uml/main/EntitySourceClassDiagram.puml b/docs/uml/main/EntitySourceClassDiagram.puml index 03723a79d..56ac69c40 100644 --- a/docs/uml/main/EntitySourceClassDiagram.puml +++ b/docs/uml/main/EntitySourceClassDiagram.puml @@ -1,15 +1,23 @@ @startuml -' todo apapt note "Assuming all classes to implement \nthe abstract methods of their interfaces\n\n" as generalNotes abstract class EntitySource { - - DataSource dataSource - - Set buildNodeAssetEntities(Class, EntityFactory, Collection, Collection, ConcurrentMap, LongAdder>) - - Set buildNodeAssetEntities(Class, EntityFactory, Collection, Collection) - - Set buildAssetInputEntities(Class, EntityFactory, Collection) - - Set buildAssetInputEntities(Class, EntityFactory) + # DataSource dataSource + # {static} Try enrichEntityData(E, String, Map, BiFunction) + # {static} Try enrichEntityData(E, String, Map, String, Map, TriFunction) + # {static} Try getLinkedEntity(EntityData, String, Map) + # {static} Try optionallyEnrichEntityData(E, String, Map, T, BiFunction) + # Stream> buildNodeAssetEntities(Class, Map, Map) + # {static} Stream> nodeAssetInputEntityDataStream(Stream>, Map) + # Stream> buildAssetInputEntities(Class, Map) + # {static} Stream> assetInputEntityDataStream(Stream>, Map) + # Stream> buildEntityData(Class) + # {static} Map unpackMap(Stream>, Class) throws SourceException + # {static} Set unpackSet(Stream>, Class) throws SourceException + # {static} Stream unpackSet(Stream>, Class) throws SourceException } + EntitySource <|-- GraphicSource EntitySource <|-- RawGridSource EntitySource <|-- ResultEntitySource @@ -22,12 +30,13 @@ class GraphicSource { - RawGridSource rawGridSource - LineGraphicInputFactory lineGraphicInputFactory - NodeGraphicInputFactory nodeGraphicInputFactory - - GraphicSource(TypeSource, RawGridSource, DataSource) - - Optional getGraphicElements() - - Set getNodeGraphicInput() - - Set getNodeGraphicInput(Set) - - Set getLineGraphicInput() - - Set getLineGraphicInput(Set) + + GraphicSource(TypeSource, RawGridSource, DataSource) + + GraphicElements getGraphicElements() throws SourceException + + GraphicElements getGraphicElements(Map, Map) throws SourceException + + Set getNodeGraphicInput() throws SourceException + + Set getNodeGraphicInput(Map) throws SourceException + + Set getLineGraphicInput() throws SourceException + + Set getLineGraphicInput(Map) throws SourceException } class RawGridSource { @@ -38,19 +47,21 @@ class RawGridSource { - Transformer3WInputFactory transformer3WInputFactory - SwitchInputFactory switchInputFactory - MeasurementUnitInputFactory measurementUnitInputFactory - - Optional getGridData() - - Set getNodes() - - Set getNodes(Set) - - Set getLines() - - Set getLines(Set, Set, Set) - - Set get2WTransformers() - - Set get2WTransformers(Set, Set, Set) - - Set get3WTransformers() - - Set get3WTransformers(Set, Set, Set) - - Set getSwitches() - - Set getSwitches(Set, Set) - - Set getMeasurementUnits() - - Set getMeasurementUnits(Set, Set) + + RawGridSource(TypeSource typeSource, DataSource dataSource) + + RawGridElements getGridData() throws SourceException + + RawGridElements getGridData(Map, Map, Map) throws SourceException + + Map getNodes() throws SourceException + + Map getNodes(Map) throws SourceException + + Map getLines() throws SourceException + + Map getLines(Map, Map, Set) throws SourceException + + Set get2WTransformers() throws SourceException + + Set get2WTransformers(Map, Map, Set) throws SourceException + + Set get3WTransformers() throws SourceException + + Set get3WTransformers(Map, Map, Set) throws SourceException + + Set getSwitches() throws SourceException + + Set getSwitches(Map, Map) throws SourceException + + Set getMeasurementUnits() throws SourceException + + Set getMeasurementUnits(Map, Map) throws SourceException } class ResultEntitySource { @@ -60,27 +71,27 @@ class ResultEntitySource { - NodeResultFactory nodeResultFactory - ConnectorResultFactory connectorResultFactory - FlexOptionsResultFactory flexOptionsResultFactory - - ResultEntitySource(DataSource) - - ResultEntitySource(DataSource, String) - - Set getNodeResults() - - Set getSwitchResults() - - Set getLineResults() - - Set getTransformer2WResultResults() - - Set getTransformer3WResultResults() - - Set getFlexOptionsResults() - - Set getLoadResults() - - Set getPvResults() - - Set getFixedFeedInResults() - - Set getBmResults() - - Set getChpResults() - - Set getWecResults() - - Set getStorageResults() - - Set getEvcsResults() - - Set getEvResults() - - Set getHpResults() - - Set getCylindricalStorageResult() - - Set getThermalHouseResults() - - Set getEmResults() + + ResultEntitySource(DataSource) + + ResultEntitySource(DataSource, String) + + Set getNodeResults() throws SourceException + + Set getSwitchResults() throws SourceException + + Set getLineResults() throws SourceException + + Set getTransformer2WResultResults() throws SourceException + + Set getTransformer3WResultResults() throws SourceException + + Set getFlexOptionsResults() throws SourceException + + Set getLoadResults() throws SourceException + + Set getPvResults() throws SourceException + + Set getFixedFeedInResults() throws SourceException + + Set getBmResults() throws SourceException + + Set getChpResults() throws SourceException + + Set getWecResults() throws SourceException + + Set getStorageResults() throws SourceException + + Set getEvcsResults() throws SourceException + + Set getEvResults() throws SourceException + + Set getHpResults() throws SourceException + + Set getCylindricalStorageResult() throws SourceException + + Set getThermalHouseResults() throws SourceException + + Set getEmResults() throws SourceException } class SystemParticipantSource{ @@ -97,28 +108,29 @@ class SystemParticipantSource{ - StorageInputFactory storageInputFactory - WecInputFactory wecInputFactory - EvcsInputFactory evcsInputFactory - - SystemParticipantSource(TypeSource, ThermalSource, RawGridSource, DataSource) - - Optional getSystemParticipants() - - Set getBmPlants() - - Set getBmPlants(Set, Set, Set) - - Set getChpPlants() - - Set getChpPlants(Set, Set, Set, Set, Set) - - Set getEvs() - - Set getEvs(Set, Set, Set) - - Set getEvcs() - - Set getEvcs(Set, Set) - - Set getFixedFeedIns() - - Set getFixedFeedIns(Set, Set) - - Set getHeatPumps() - - Set getHeatPumps(Set, Set, Set, Set) - - Set getLoads() - - Set getLoads(Set, Set) - - Set getPvPlants() - - Set getPvPlants(Set, Set) - - Set getStorages() - - Set getStorages(Set, Set, Set) - - Set getWecPlants() - - Set getWecPlants(Set, Set, Set) + + SystemParticipantSource(TypeSource, ThermalSource, RawGridSource, DataSource) + + SystemParticipants getSystemParticipants() throws SourceException + + SystemParticipants getSystemParticipants(Map, Map) throws SourceException + + Set getBmPlants() throws SourceException + + Set getBmPlants(Map, Map, Set) throws SourceException + + Set getChpPlants() throws SourceException + + Set getChpPlants(Map, Map, Set, Map, Set) throws SourceException + + Set getEvs() throws SourceException + + Set getEvs(Map, Map, Set) throws SourceException + + Set getEvcs() throws SourceException + + Set getEvcs(Map, Map) throws SourceException + + Set getFixedFeedIns() throws SourceException + + Set getFixedFeedIns(Map, Map) throws SourceException + + Set getHeatPumps() throws SourceException + + Set getHeatPumps(Map, Map, Set, Map) throws SourceException + + Set getLoads() throws SourceException + + Set getLoads(Map, Map) throws SourceException + + Set getPvPlants() throws SourceException + + Set getPvPlants(Map, Map) throws SourceException + + Set getStorages() throws SourceException + + Set getStorages(Map, Map, Set) throws SourceException + + Set getWecPlants() throws SourceException + + Set getWecPlants(Map, Map, Set) throws SourceException } class ThermalSource { @@ -126,15 +138,15 @@ class ThermalSource { - ThermalBusInputFactory thermalBusInputFactory - CylindricalStorageInputFactory cylindricalStorageInputFactory - ThermalHouseInputFactory thermalHouseInputFactory - - ThermalSource(TypeSource, DataSource) - - Set getThermalBuses() - - Set getThermalBuses(Set) - - Set getThermalStorages() - - Set getThermalStorages(Set, Set) - - Set getThermalHouses() - - Set getThermalHouses(Set, Set) - - Set getCylindricStorages() - - Set getCylindricStorages(Set, Set) + + ThermalSource(TypeSource, DataSource) + + Map getThermalBuses() throws SourceException + + Map getThermalBuses(Map) throws SourceException + + Set getThermalStorages() throws SourceException + + Set getThermalStorages(Map, Map) throws SourceException + + Set getThermalHouses() throws SourceException + + Set getThermalHouses(Map, Map) throws SourceException + + Set getCylindricStorages() throws SourceException + + Set getCylindricStorages(Map, Map) throws SourceException } class TypeSource { @@ -143,16 +155,16 @@ class TypeSource { - LineTypeInputFactory lineTypeInputFactory - Transformer3WTypeInputFactory transformer3WTypeInputFactory - SystemParticipantTypeInputFactory systemParticipantTypeInputFactory - - TypeSource(DataSource) - - Set getTransformer2WTypes() - - Set getTransformer3WTypes() - - Set getOperators() - - Set getLineTypes() - - Set getBmTypes() - - Set getChpTypes() - - Set getHpTypes() - - Set getStorageTypes() - - Set getWecTypes() - - Set getEvTypes() + + TypeSource(DataSource) + + Map getTransformer2WTypes() throws SourceException + + Map getTransformer3WTypes() throws SourceException + + Map getOperators() throws SourceException + + Map getLineTypes() throws SourceException + + Map getBmTypes() throws SourceException + + Map getChpTypes() throws SourceException + + Map getHpTypes() throws SourceException + + Map getStorageTypes() throws SourceException + + Map getWecTypes() throws SourceException + + Map getEvTypes() throws SourceException } @enduml \ No newline at end of file diff --git a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java index 70e057ae0..3005945d4 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EntitySource.java @@ -351,11 +351,10 @@ protected static Stream> assetInputEn * data. * * @param entityClass the entity class that should be build - * @param type of the entity that should be build * @return stream of the entity data wrapped in a {@link Try} */ - protected Stream> buildEntityData( - Class entityClass) { + protected Stream> buildEntityData( + Class entityClass) { return dataSource .getSourceData(entityClass) .map(fieldsToAttributes -> new Success<>(new EntityData(fieldsToAttributes, entityClass))); From 79ba2c5454fb08bbf10e278e51d874a8f5f3e9c2 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Wed, 3 Jan 2024 19:33:20 +0100 Subject: [PATCH 30/31] Rolling back EmInput additions in this branch --- .../ie3/datamodel/io/factory/FactoryData.java | 23 ++ .../factory/input/EmAssetInputEntityData.java | 70 ----- .../input/participant/BmInputFactory.java | 3 - .../input/participant/ChpInputEntityData.java | 7 +- .../input/participant/ChpInputFactory.java | 3 - .../input/participant/EmInputFactory.java | 55 ++-- .../input/participant/EvInputFactory.java | 5 +- .../input/participant/EvcsInputFactory.java | 13 +- .../participant/FixedFeedInInputFactory.java | 9 +- .../input/participant/HpInputEntityData.java | 12 +- .../input/participant/HpInputFactory.java | 4 - .../input/participant/LoadInputFactory.java | 8 +- .../input/participant/PvInputFactory.java | 8 +- .../participant/StorageInputFactory.java | 5 +- .../SystemParticipantEntityData.java | 113 ------- .../SystemParticipantInputEntityFactory.java | 8 +- .../SystemParticipantTypedEntityData.java | 25 +- .../input/participant/WecInputFactory.java | 4 +- .../ie3/datamodel/io/processor/Processor.java | 20 +- .../io/source/EnergyManagementSource.java | 163 ++-------- .../io/source/SystemParticipantSource.java | 176 +++-------- .../csv/CsvJointGridContainerSource.java | 7 +- .../ie3/datamodel/models/ControlStrategy.java | 35 +++ .../datamodel/models/EmControlStrategy.java | 45 +++ .../ie3/datamodel/models/input/EmInput.java | 139 --------- .../container/EnergyManagementUnits.java | 100 ++++++ .../models/input/container/GridContainer.java | 30 +- .../input/container/JointGridContainer.java | 9 +- .../input/container/SubGridContainer.java | 10 +- .../models/input/system/BmInput.java | 15 +- .../models/input/system/ChpInput.java | 13 +- .../models/input/system/EmInput.java | 176 +++++++++++ .../models/input/system/EvInput.java | 13 +- .../models/input/system/EvcsInput.java | 19 +- .../models/input/system/FixedFeedInInput.java | 13 +- .../models/input/system/HpInput.java | 13 +- .../models/input/system/LoadInput.java | 19 +- .../models/input/system/PvInput.java | 13 +- .../models/input/system/StorageInput.java | 13 +- .../input/system/SystemParticipantInput.java | 49 +-- .../models/input/system/WecInput.java | 13 +- .../models/result/system/EmResult.java | 3 +- .../utils/ContainerNodeUpdateUtil.java | 2 + .../ie3/datamodel/utils/ContainerUtils.java | 23 +- .../io/extractor/ExtractorTest.groovy | 2 +- .../participant/BmInputFactoryTest.groovy | 5 +- .../participant/ChpInputFactoryTest.groovy | 5 +- .../participant/EmInputFactoryTest.groovy | 57 ++-- .../participant/EvInputFactoryTest.groovy | 5 +- .../participant/EvcsInputFactoryTest.groovy | 12 +- .../FixedFeedInInputFactoryTest.groovy | 15 +- .../participant/HpInputFactoryTest.groovy | 5 +- .../participant/LoadInputFactoryTest.groovy | 6 +- .../participant/PvInputFactoryTest.groovy | 6 +- .../StorageInputFactoryTest.groovy | 5 +- .../participant/WecInputFactoryTest.groovy | 5 +- ...EntityPersistenceNamingStrategyTest.groovy | 2 +- .../io/processor/ProcessorProviderTest.groovy | 1 - .../input/InputEntityProcessorTest.groovy | 74 ++--- .../datamodel/io/sink/CsvFileSinkTest.groovy | 6 +- .../source/EnergyManagementSourceTest.groovy | 284 ------------------ .../io/source/EntitySourceTest.groovy | 19 +- .../source/SystemParticipantSourceTest.groovy | 37 +-- .../csv/CsvEnergyManagementSourceTest.groovy | 8 +- .../csv/CsvSystemParticipantSourceTest.groovy | 65 ++-- .../models/EmControlStrategyTest.groovy | 45 +++ .../EnergyManagementUnitsTest.groovy | 29 ++ .../container/JointGridContainerTest.groovy | 9 +- .../models/input/system/BmInputTest.groovy | 1 - .../models/input/system/ChpInputTest.groovy | 1 - .../models/input/system/EmInputTest.groovy | 59 ++-- .../models/input/system/EvInputTest.groovy | 1 - .../models/input/system/EvcsInputTest.groovy | 1 - .../input/system/FixedFeedInInputTest.groovy | 1 - .../models/input/system/HpInputTest.groovy | 1 - .../models/input/system/LoadInputTest.groovy | 1 - .../models/input/system/PvInputTest.groovy | 1 - .../input/system/StorageInputTest.groovy | 1 - .../models/input/system/WecInputTest.groovy | 1 - .../datamodel/utils/ContainerUtilsTest.groovy | 8 + .../InvalidSystemParticipantInput.groovy | 2 +- .../ie3/test/common/ComplexTopology.groovy | 8 + .../common/EnergyManagementTestData.groovy | 30 ++ .../ie3/test/common/SampleJointGrid.groovy | 6 +- .../common/SystemParticipantTestData.groovy | 30 -- .../io/source/csv/_participants/em_input.csv | 5 +- 86 files changed, 916 insertions(+), 1455 deletions(-) delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java delete mode 100644 src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java create mode 100644 src/main/java/edu/ie3/datamodel/models/ControlStrategy.java create mode 100644 src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java delete mode 100644 src/main/java/edu/ie3/datamodel/models/input/EmInput.java create mode 100644 src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java create mode 100644 src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java delete mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy create mode 100644 src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy create mode 100644 src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy diff --git a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java index 6ed7dcb7e..f88d24423 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/FactoryData.java @@ -135,6 +135,29 @@ field, getField(field)), } } + /** + * Parses and returns an array of UUIDs from field value of given field name. Throws {@link + * FactoryException} if field does not exist or parsing fails. + * + * @param field field name + * @return UUID + */ + public UUID[] getUUIDs(String field) { + try { + String fieldValue = getField(field); + if (fieldValue.trim().isEmpty()) return new UUID[0]; + + String[] uuidFields = fieldValue.split(" "); + return Arrays.stream(uuidFields).map(UUID::fromString).toArray(UUID[]::new); + } catch (IllegalArgumentException iae) { + throw new FactoryException( + String.format( + "Exception while trying to parse UUIDs of field \"%s\" with value \"%s\"", + field, getField(field)), + iae); + } + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java deleted file mode 100644 index d001c405e..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/EmAssetInputEntityData.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input; - -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; - -/** - * Data used for the construction of {@link edu.ie3.datamodel.models.input.AssetInput} entities - * which also require an EM attribute. This data object can include additional information about the - * {@link EmInput}, which cannot be provided through the attribute map as it is a complex shared - * entity. - */ -public class EmAssetInputEntityData extends AssetInputEntityData { - - private final EmInput emUnit; - - public EmAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - EmInput emUnit) { - super(fieldsToAttributes, entityClass); - this.emUnit = emUnit; - } - - public EmAssetInputEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - EmInput emUnit) { - super(fieldsToAttributes, entityClass, operator); - this.emUnit = emUnit; - } - - /** - * Creates a new EmAssetInputEntityData object based on a given {@link AssetInputEntityData} - * object and given em unit - * - * @param entityData The entity data object to use attributes of - * @param emUnit The em input to use - */ - public EmAssetInputEntityData(AssetInputEntityData entityData, EmInput emUnit) { - super(entityData, entityData.getOperatorInput()); - this.emUnit = emUnit; - } - - public EmInput getEmUnit() { - return emUnit; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - EmAssetInputEntityData that = (EmAssetInputEntityData) o; - return Objects.equals(emUnit, that.emUnit); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), emUnit); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java index bf8079394..799837d3c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/BmInputFactory.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.BmInput; @@ -42,7 +41,6 @@ protected BmInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); final BmTypeInput typeInput = data.getTypeInput(); final boolean marketReaction = data.getBoolean(MARKET_REACTION); final boolean costControlled = data.getBoolean(COST_CONTROLLED); @@ -56,7 +54,6 @@ protected BmInput buildModel( operationTime, node, qCharacteristics, - em, typeInput, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java index 81c11572a..95b46c44c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputEntityData.java @@ -5,7 +5,6 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; @@ -22,11 +21,10 @@ public class ChpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, - EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, node, em, typeInput); + super(fieldsToAttributes, ChpInput.class, node, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } @@ -35,11 +33,10 @@ public ChpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, - EmInput em, ChpTypeInput typeInput, ThermalBusInput thermalBusInput, ThermalStorageInput thermalStorageInput) { - super(fieldsToAttributes, ChpInput.class, operator, node, em, typeInput); + super(fieldsToAttributes, ChpInput.class, operator, node, typeInput); this.thermalBusInput = thermalBusInput; this.thermalStorageInput = thermalStorageInput; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java index 4ad47b060..f04b85e86 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.ChpInput; @@ -35,7 +34,6 @@ protected ChpInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new ChpInput( @@ -46,7 +44,6 @@ protected ChpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, - em, data.getTypeInput(), data.getThermalStorageInput(), marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java index 30c280383..3e2e39d60 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EmInputFactory.java @@ -5,54 +5,55 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; import edu.ie3.datamodel.io.factory.input.AssetInputEntityFactory; -import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; +import edu.ie3.datamodel.models.ControlStrategy; 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 edu.ie3.datamodel.models.input.system.EmInput; import java.util.UUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -public class EmInputFactory extends AssetInputEntityFactory { +public class EmInputFactory extends AssetInputEntityFactory { + private static final Logger logger = LoggerFactory.getLogger(EmInputFactory.class); - private static final String CONTROL_STRATEGY = "controlstrategy"; + private static final String CONNECTED_ASSETS = "connectedassets"; - public static final String PARENT_EM = "parentem"; + private static final String CONTROL_STRATEGY = "controlstrategy"; public EmInputFactory() { super(EmInput.class); } - @Override - protected List> getFields(EmAssetInputEntityData data) { - List> fields = new ArrayList<>(super.getFields(data)); - - List> withEm = - fields.stream().map(f -> (Set) expandSet(f, PARENT_EM)).toList(); - - fields.addAll(withEm); - - return fields; - } - @Override protected String[] getAdditionalFields() { - return new String[] {CONTROL_STRATEGY}; + return new String[] {CONNECTED_ASSETS, CONTROL_STRATEGY}; } @Override protected EmInput buildModel( - EmAssetInputEntityData data, + AssetInputEntityData data, UUID uuid, String id, OperatorInput operator, OperationTime operationTime) { - String controlStrategy = data.getField(CONTROL_STRATEGY); - - EmInput parentEm = data.getEmUnit(); - - return new EmInput(uuid, id, operator, operationTime, controlStrategy, parentEm); + ControlStrategy controlStrategy; + try { + controlStrategy = ControlStrategy.parse(data.getField(CONTROL_STRATEGY)); + } catch (ParsingException e) { + logger.warn( + "Cannot parse control strategy \"{}\" of energy management system \"{}\". Assign no control strategy instead.", + data.getField(CONTROL_STRATEGY), + id); + controlStrategy = ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; + } + final UUID[] connectedAssets = data.getUUIDs(CONNECTED_ASSETS); + + if (connectedAssets.length == 0) + logger.warn("There are no connected assets for energy management system \"{}\".", id); + + return new EmInput(uuid, id, operator, operationTime, connectedAssets, controlStrategy); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java index b2d492ce5..1f0f8e80c 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EvInput; @@ -36,9 +35,7 @@ protected EvInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); - return new EvInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, data.getTypeInput()); + uuid, id, operator, operationTime, node, qCharacteristics, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java index 183cbf08b..8ed807267 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactory.java @@ -8,8 +8,8 @@ import edu.ie3.datamodel.exceptions.ChargingPointTypeException; import edu.ie3.datamodel.exceptions.FactoryException; import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.EvcsInput; @@ -21,14 +21,14 @@ import java.util.UUID; /** - * Factory to create instances of {@link EvcsInput}s based on {@link SystemParticipantEntityData} - * and additional fields. + * Factory to create instances of {@link EvcsInput}s based on {@link NodeAssetInputEntityData} and + * additional fields. * * @version 0.1 * @since 26.07.20 */ public class EvcsInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String TYPE = "type"; private static final String CHARGING_POINTS = "chargingpoints"; @@ -47,14 +47,14 @@ protected String[] getAdditionalFields() { @Override protected EvcsInput buildModel( - SystemParticipantEntityData data, + NodeAssetInputEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); + final ChargingPointType type; try { type = ChargingPointTypeUtils.parse(data.getField(TYPE)); @@ -88,7 +88,6 @@ protected EvcsInput buildModel( operationTime, node, qCharacteristics, - em, type, chargingPoints, cosPhi, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java index bdede37bc..36e527b61 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/FixedFeedInInputFactory.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.FixedFeedInInput; @@ -17,7 +17,7 @@ import tech.units.indriya.ComparableQuantity; public class FixedFeedInInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String S_RATED = "srated"; private static final String COSPHI_RATED = "cosphirated"; @@ -33,18 +33,17 @@ protected String[] getAdditionalFields() { @Override protected FixedFeedInInput buildModel( - SystemParticipantEntityData data, + NodeAssetInputEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); final ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); final double cosPhiRated = data.getDouble(COSPHI_RATED); return new FixedFeedInInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, sRated, cosPhiRated); + uuid, id, operator, operationTime, node, qCharacteristics, sRated, cosPhiRated); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java index a240b5f04..f4ea57dfb 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputEntityData.java @@ -5,8 +5,6 @@ */ package edu.ie3.datamodel.io.factory.input.participant; -import edu.ie3.datamodel.io.factory.input.ConnectorInputEntityData; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.HpInput; @@ -21,10 +19,9 @@ public class HpInputEntityData extends SystemParticipantTypedEntityData fieldsToAttributes, NodeInput node, - EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, node, em, typeInput); + super(fieldsToAttributes, HpInput.class, node, typeInput); this.thermalBusInput = thermalBusInput; } @@ -32,16 +29,15 @@ public HpInputEntityData( Map fieldsToAttributes, OperatorInput operator, NodeInput node, - EmInput em, HpTypeInput typeInput, ThermalBusInput thermalBusInput) { - super(fieldsToAttributes, HpInput.class, operator, node, em, typeInput); + super(fieldsToAttributes, HpInput.class, operator, node, typeInput); this.thermalBusInput = thermalBusInput; } /** - * Creates a new HpInputEntityData object based on a given {@link ConnectorInputEntityData} object - * and given thermal bus input + * Creates a new HpInputEntityData object based on a given {@link + * SystemParticipantTypedEntityData} object and given thermal bus input * * @param entityData The SystemParticipantTypedEntityData object to enhance * @param thermalBusInput The thermal bus input diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java index b01ede298..cd814e044 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/HpInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.HpInput; @@ -34,8 +33,6 @@ protected HpInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); - return new HpInput( uuid, id, @@ -44,7 +41,6 @@ protected HpInput buildModel( node, data.getThermalBusInput(), qCharacteristics, - em, data.getTypeInput()); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java index 188504bb6..9d2cd7396 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactory.java @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.exceptions.ParsingException; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.LoadInput; @@ -22,7 +22,7 @@ import tech.units.indriya.ComparableQuantity; public class LoadInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final Logger logger = LoggerFactory.getLogger(LoadInputFactory.class); private static final String LOAD_PROFILE = "loadprofile"; @@ -42,7 +42,7 @@ protected String[] getAdditionalFields() { @Override protected LoadInput buildModel( - SystemParticipantEntityData data, + NodeAssetInputEntityData data, UUID uuid, String id, NodeInput node, @@ -59,7 +59,6 @@ protected LoadInput buildModel( id); loadProfile = LoadProfile.DefaultLoadProfiles.NO_LOAD_PROFILE; } - final EmInput em = data.getEm().orElse(null); final boolean dsm = data.getBoolean(DSM); final ComparableQuantity eConsAnnual = data.getQuantity(E_CONS_ANNUAL, StandardUnits.ENERGY_IN); @@ -73,7 +72,6 @@ protected LoadInput buildModel( operationTime, node, qCharacteristics, - em, loadProfile, dsm, eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java index 3d359fde2..23f7f70ae 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/PvInputFactory.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.PvInput; @@ -19,7 +19,7 @@ import tech.units.indriya.ComparableQuantity; public class PvInputFactory - extends SystemParticipantInputEntityFactory { + extends SystemParticipantInputEntityFactory { private static final String ALBEDO = "albedo"; private static final String AZIMUTH = "azimuth"; private static final String ETA_CONV = "etaconv"; @@ -43,14 +43,13 @@ protected String[] getAdditionalFields() { @Override protected PvInput buildModel( - SystemParticipantEntityData data, + NodeAssetInputEntityData data, UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); final double albedo = data.getDouble(ALBEDO); final ComparableQuantity azimuth = data.getQuantity(AZIMUTH, StandardUnits.AZIMUTH); final ComparableQuantity etaConv = @@ -70,7 +69,6 @@ protected PvInput buildModel( operationTime, node, qCharacteristics, - em, albedo, azimuth, etaConv, diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java index aea43ba85..04645c459 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.StorageInput; @@ -36,9 +35,7 @@ protected StorageInput buildModel( ReactivePowerCharacteristic qCharacteristics, OperatorInput operator, OperationTime operationTime) { - final EmInput em = data.getEm().orElse(null); final StorageTypeInput typeInput = data.getTypeInput(); - return new StorageInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput); + return new StorageInput(uuid, id, operator, operationTime, node, qCharacteristics, typeInput); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java deleted file mode 100644 index 971832be4..000000000 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantEntityData.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * © 2023. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.io.factory.input.participant; - -import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; -import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; -import edu.ie3.datamodel.models.input.NodeInput; -import edu.ie3.datamodel.models.input.OperatorInput; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; - -/** - * Data used for those classes of {@link - * edu.ie3.datamodel.models.input.system.SystemParticipantInput}, including an (optional) link to an - * {@link EmInput} entity. - */ -public class SystemParticipantEntityData extends NodeAssetInputEntityData { - - /** Energy management unit that is managing the system participant. Can be null. */ - private final EmInput em; - - /** - * Creates a new SystemParticipantEntityData object for an operated, always on system participant - * input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param node input node - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. - */ - public SystemParticipantEntityData( - Map fieldsToAttributes, - Class entityClass, - NodeInput node, - EmInput em) { - super(fieldsToAttributes, entityClass, node); - this.em = em; - } - - public Optional getEm() { - return Optional.ofNullable(em); - } - - /** - * Creates a new SystemParticipantEntityData object for an operable system participant input - * - * @param fieldsToAttributes attribute map: field name to value - * @param entityClass class of the entity to be created with this data - * @param operator operator input - * @param node input node - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. - */ - public SystemParticipantEntityData( - Map fieldsToAttributes, - Class entityClass, - OperatorInput operator, - NodeInput node, - EmInput em) { - super(fieldsToAttributes, entityClass, operator, node); - this.em = em; - } - - /** - * Creates a new SystemParticipantEntityData object based on a given {@link - * NodeAssetInputEntityData} object and given energy management unit - * - * @param nodeAssetInputEntityData The node asset entity data object to use attributes of - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. - */ - public SystemParticipantEntityData( - NodeAssetInputEntityData nodeAssetInputEntityData, EmInput em) { - super(nodeAssetInputEntityData, nodeAssetInputEntityData.getNode()); - this.em = em; - } - - @Override - public String toString() { - return "SystemParticipantEntityData{" - + "em=" - + getEm().map(EmInput::toString).orElse("") - + ", node=" - + getNode().getUuid() - + ", operatorInput=" - + getOperatorInput().getUuid() - + ", fieldsToValues=" - + getFieldsToValues() - + ", targetClass=" - + getTargetClass() - + '}'; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - if (!super.equals(o)) return false; - SystemParticipantEntityData that = (SystemParticipantEntityData) o; - return getEm().equals(that.getEm()); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), getEm()); - } -} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java index e8101b582..cc7348200 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantInputEntityFactory.java @@ -27,13 +27,11 @@ * @since 28.01.20 */ public abstract class SystemParticipantInputEntityFactory< - T extends SystemParticipantInput, D extends SystemParticipantEntityData> + T extends SystemParticipantInput, D extends NodeAssetInputEntityData> extends AssetInputEntityFactory { private static final String Q_CHARACTERISTICS = "qcharacteristics"; - public static final String EM = "em"; - protected SystemParticipantInputEntityFactory(Class... allowedClasses) { super(allowedClasses); } @@ -43,10 +41,6 @@ protected List> getFields(D data) { List> fields = new ArrayList<>(super.getFields(data)); for (Set set : fields) set.add(Q_CHARACTERISTICS); - List> withEm = fields.stream().map(f -> (Set) expandSet(f, EM)).toList(); - - fields.addAll(withEm); - return fields; } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java index ab0bbe4b3..871c70bd0 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/SystemParticipantTypedEntityData.java @@ -5,8 +5,8 @@ */ package edu.ie3.datamodel.io.factory.input.participant; +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.models.UniqueEntity; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.type.SystemParticipantTypeInput; @@ -22,7 +22,7 @@ * of the SystemParticipantInput */ public class SystemParticipantTypedEntityData - extends SystemParticipantEntityData { + extends NodeAssetInputEntityData { private final T typeInput; @@ -33,17 +33,14 @@ public class SystemParticipantTypedEntityData fieldsToAttributes, Class entityClass, NodeInput node, - EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, node, em); + super(fieldsToAttributes, entityClass, node); this.typeInput = typeInput; } @@ -55,8 +52,6 @@ public SystemParticipantTypedEntityData( * @param entityClass class of the entity to be created with this data * @param operator operator input * @param node input node - * @param em The energy management unit that is managing the system participant. Null, if the - * system participant is not managed. * @param typeInput type input */ public SystemParticipantTypedEntityData( @@ -64,23 +59,21 @@ public SystemParticipantTypedEntityData( Class entityClass, OperatorInput operator, NodeInput node, - EmInput em, T typeInput) { - super(fieldsToAttributes, entityClass, operator, node, em); + super(fieldsToAttributes, entityClass, operator, node); this.typeInput = typeInput; } /** * Creates a new SystemParticipantTypedEntityData object based on a given {@link - * SystemParticipantEntityData} object and given type input + * NodeAssetInputEntityData} object and given type input * - * @param systemParticipantEntityData The system participant entity data object to use attributes - * of + * @param nodeAssetEntityData The system participant entity data object to use attributes of * @param typeInput type input */ public SystemParticipantTypedEntityData( - SystemParticipantEntityData systemParticipantEntityData, T typeInput) { - super(systemParticipantEntityData, systemParticipantEntityData.getEm().orElse(null)); + NodeAssetInputEntityData nodeAssetEntityData, T typeInput) { + super(nodeAssetEntityData, nodeAssetEntityData.getNode()); this.typeInput = typeInput; } @@ -93,8 +86,6 @@ public String toString() { return "SystemParticipantTypedEntityData{" + "typeInput=" + typeInput.getUuid() - + ", em=" - + getEm().map(EmInput::toString).orElse("") + ", node=" + getNode().getUuid() + ", operatorInput=" diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java index c6159adeb..83bbbdd43 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/participant/WecInputFactory.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.factory.input.participant; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.WecInput; @@ -38,10 +37,9 @@ protected WecInput buildModel( OperatorInput operator, OperationTime operationTime) { WecTypeInput typeInput = data.getTypeInput(); - EmInput em = data.getEm().orElse(null); final boolean marketReaction = data.getBoolean(MARKET_REACTION); return new WecInput( - uuid, id, operator, operationTime, node, qCharacteristics, em, typeInput, marketReaction); + uuid, id, operator, operationTime, node, qCharacteristics, typeInput, marketReaction); } } diff --git a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java index 163d51b74..830fbef02 100644 --- a/src/main/java/edu/ie3/datamodel/io/processor/Processor.java +++ b/src/main/java/edu/ie3/datamodel/io/processor/Processor.java @@ -8,6 +8,7 @@ import edu.ie3.datamodel.exceptions.EntityProcessorException; import edu.ie3.datamodel.io.factory.input.NodeInputFactory; import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor; +import edu.ie3.datamodel.models.ControlStrategy; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; import edu.ie3.datamodel.models.UniqueEntity; @@ -235,12 +236,10 @@ protected String processMethodResult(Object methodReturnObject, Method method, S ((Optional) methodReturnObject) .map( o -> { - if (o instanceof Quantity quantity) { + if (o instanceof Quantity) { return Try.of( - () -> handleQuantity(quantity, fieldName), + () -> handleQuantity((Quantity) o, fieldName), EntityProcessorException.class); - } else if (o instanceof UniqueEntity entity) { - return Try.of(entity::getUuid, EntityProcessorException.class); } else { return Failure.of( new EntityProcessorException( @@ -275,8 +274,8 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "TimeSeries", "Transformer2WTypeInput", "Transformer3WTypeInput", - "WecTypeInput", - "EmInput" -> resultStringBuilder.append(((UniqueEntity) methodReturnObject).getUuid()); + "WecTypeInput" -> resultStringBuilder.append( + ((UniqueEntity) methodReturnObject).getUuid()); case "OperatorInput" -> resultStringBuilder.append( ((OperatorInput) methodReturnObject).getId().equalsIgnoreCase("NO_OPERATOR_ASSIGNED") ? "" @@ -290,6 +289,9 @@ protected String processMethodResult(Object methodReturnObject, Method method, S "ReactivePowerCharacteristic", "CharacteristicInput" -> resultStringBuilder.append( ((CharacteristicInput) methodReturnObject).serialize()); + case "UUID[]" -> resultStringBuilder.append(processUUIDArray((UUID[]) methodReturnObject)); + case "ControlStrategy" -> resultStringBuilder.append( + ((ControlStrategy) methodReturnObject).getKey()); default -> throw new EntityProcessorException( "Unable to process value for attribute/field '" + fieldName @@ -370,6 +372,12 @@ protected String handleQuantity(Quantity quantity, String fieldName) protected abstract Try handleProcessorSpecificQuantity( Quantity quantity, String fieldName); + protected String processUUIDArray(UUID[] uuids) { + StringBuilder strb = new StringBuilder(); + for (UUID uuid : uuids) strb.append(uuid.toString()).append(" "); + return strb.toString().strip(); + } + /** * Handling of elements of type {@link OperationTime} * diff --git a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java index b64c10edc..1aae01392 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/EnergyManagementSource.java @@ -5,30 +5,26 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.datamodel.io.factory.input.participant.EmInputFactory.PARENT_EM; - import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData; -import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.EmInputFactory; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.OperatorInput; -import edu.ie3.datamodel.utils.Try; -import java.util.List; +import edu.ie3.datamodel.models.input.container.EnergyManagementUnits; +import edu.ie3.datamodel.models.input.system.EmInput; import java.util.Map; +import java.util.Set; import java.util.UUID; -import java.util.stream.Collectors; -import java.util.stream.Stream; public class EnergyManagementSource extends EntitySource { private final TypeSource typeSource; - private static final EmInputFactory emInputFactory = new EmInputFactory(); + private final EmInputFactory emInputFactory; public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; + + this.emInputFactory = new EmInputFactory(); } /** @@ -36,11 +32,11 @@ public EnergyManagementSource(TypeSource typeSource, DataSource dataSource) { * *

This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. * - * @return a map of UUID to {@link EmInput} entities + * @return a set of object and uuid unique {@link EmInput} entities */ - public Map getEmUnits() throws SourceException { + public EnergyManagementUnits getEmUnits() throws SourceException { Map operators = typeSource.getOperators(); return getEmUnits(operators); } @@ -48,7 +44,7 @@ public Map getEmUnits() throws SourceException { /** * This set has to be unique in the sense of object uniqueness but also in the sense of {@link * java.util.UUID} uniqueness of the provided {@link EmInput} which has to be checked manually, as - * {@link EmInput#equals(Object)} is NOT restricted on the UUID of {@link EmInput}. + * {@link EmInput#equals(Object)} is NOT restricted on the uuid of {@link EmInput}. * *

In contrast to {@link #getEmUnits()} this method provides the ability to pass in an already * existing set of {@link OperatorInput} entities, the {@link EmInput} instances depend on. Doing @@ -58,139 +54,16 @@ public Map getEmUnits() throws SourceException { *

If something fails during the creation process a {@link SourceException} is thrown, else a * set with all entities that has been able to be build is returned. * - * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities - * @return a map of UUID to {@link EmInput} entities - */ - public Map getEmUnits(Map operators) throws SourceException { - return createEmInputs(buildAssetInputEntityData(EmInput.class, operators)); - } - - /** - * Since each EM can itself be controlled by another EM, it does not suffice to link {@link - * EmInput}s via {@link EntitySource#optionallyEnrichEntityData} as we do for system participants - * in {@link SystemParticipantSource}. Instead, we use a recursive approach, starting with EMs at - * root level (which are not EM-controlled themselves). - * - * @param assetEntityDataStream the data stream of {@link AssetInputEntityData} {@link Try} - * objects - * @return a map of UUID to {@link EmInput} entities + * @param operators a map of UUID to object and uuid unique {@link OperatorInput} that should be + * used for the returning instances + * @return a set of object and uuid unique {@link EmInput} entities */ - private static Map createEmInputs( - Stream> assetEntityDataStream) + public EnergyManagementUnits getEmUnits(Map operators) throws SourceException { - - // Split stream by failures and EMs that are themselves EM-controlled on one side, and EMs at - // root position (that have not failed so far) on the other side, which do not have parents per - // definition. - Map>> split = - assetEntityDataStream.collect( - Collectors.partitioningBy( - dataTry -> - dataTry - .map( - data -> - data.containsKey(PARENT_EM) && !data.getField(PARENT_EM).isBlank()) - .getOrElse(() -> true))); - - List> rootEmsEntityData = split.get(false); - List> others = split.get(true); - - // at the start, this is only root ems - Map allEms = - unpackMap( - rootEmsEntityData.stream() - .parallel() - .map( - entityDataTry -> - entityDataTry.map( - entityData -> new EmAssetInputEntityData(entityData, null))) - .map(emInputFactory::get), + Set emUnits = + unpackSet( + buildAssetInputEntityData(EmInput.class, operators).map(emInputFactory::get), EmInput.class); - - if (!others.isEmpty()) { - // there's more EM levels beyond root level. Build them recursively - Stream othersWithParentUuid = - // We try to keep the Tries as long as possible so that as many failures as possible can - // be reported. At this point however, we need to "unpack" (and throw, if applicable), - // because without valid parent EM UUID, we cannot proceed. - unpack( - others.stream() - .map( - dataTry -> - dataTry.flatMap( - data -> { - // we already filtered out those entities that do not have a parent, - // so the field should exist - String uuidString = data.getField(PARENT_EM); - return Try.of( - () -> UUID.fromString(uuidString), - IllegalArgumentException.class) - .transformF( - iae -> - new SourceException( - String.format( - "Exception while trying to parse UUID of field \"%s\" with value \"%s\"", - PARENT_EM, uuidString), - iae)) - // failed UUID parses are filtered out at this point. We save - // the parsed UUID with the asset data - .map( - parentUuid -> - new AssetDataAndValidParentUuid(data, parentUuid)); - })), - AssetDataAndValidParentUuid.class); - - allEms.putAll(createHierarchicalEmInputs(othersWithParentUuid, allEms)); - } - - return allEms; + return new EnergyManagementUnits(emUnits); } - - private static Map createHierarchicalEmInputs( - Stream assetEntityDataStream, Map lastLevelEms) - throws SourceException { - - // Split stream by assets whose parent is already built (which can be built at this level), and - // those whose parents are not built yet (which have to be built at some lower recursion level - // or not at all) - Map> split = - assetEntityDataStream.collect( - Collectors.partitioningBy(data -> lastLevelEms.containsKey(data.parentEm))); - - List toBeBuiltAtThisLevel = split.get(true); - List toBeBuiltAtNextLevel = split.get(false); - - if (toBeBuiltAtThisLevel.isEmpty()) { - // Since we only start a new recursion step if the asset data stream is not empty, there have - // to be EMs to be built at next level. This does not work if there's no EMs at the current - // recursion level. - throw new SourceException( - "EMs " + toBeBuiltAtNextLevel + " were assigned a parent EM that does not exist."); - } else { - // New EMs can be built at this level - Map newEms = - unpackMap( - toBeBuiltAtThisLevel.stream() - .map( - data -> { - // exists because we checked above - EmInput parentEm = lastLevelEms.get(data.parentEm); - return emInputFactory.get( - new EmAssetInputEntityData(data.entityData, parentEm)); - }), - EmInput.class); - - if (!toBeBuiltAtNextLevel.isEmpty()) { - // If there's more EMs left to build, the new EMs have to function as parents there - newEms.putAll(createHierarchicalEmInputs(toBeBuiltAtNextLevel.stream(), newEms)); - } - return newEms; - } - } - - /** - * Helper data record that holds an {@link AssetInputEntityData} and the UUID successfully parsed - * from {@link EmInputFactory#PARENT_EM} field - */ - private record AssetDataAndValidParentUuid(AssetInputEntityData entityData, UUID parentEm) {} } diff --git a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java index 29d44be56..dbb9d0af8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/SystemParticipantSource.java @@ -9,7 +9,6 @@ import edu.ie3.datamodel.exceptions.SystemParticipantsException; import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData; import edu.ie3.datamodel.io.factory.input.participant.*; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.container.SystemParticipants; @@ -34,7 +33,6 @@ public class SystemParticipantSource extends EntitySource { private final TypeSource typeSource; private final RawGridSource rawGridSource; private final ThermalSource thermalSource; - private final EnergyManagementSource energyManagementSource; // factories private final BmInputFactory bmInputFactory; @@ -52,14 +50,12 @@ public SystemParticipantSource( TypeSource typeSource, ThermalSource thermalSource, RawGridSource rawGridSource, - EnergyManagementSource energyManagementSource, DataSource dataSource) { super(dataSource); this.typeSource = typeSource; this.rawGridSource = rawGridSource; this.thermalSource = thermalSource; - this.energyManagementSource = energyManagementSource; // init factories this.bmInputFactory = new BmInputFactory(); @@ -137,7 +133,6 @@ public SystemParticipants getSystemParticipants( Map hpTypes = typeSource.getHpTypes(); Map storageTypes = typeSource.getStorageTypes(); Map wecTypes = typeSource.getWecTypes(); - Map emUnits = energyManagementSource.getEmUnits(); /// go on with the thermal assets Map thermalBuses = thermalSource.getThermalBuses(operators); @@ -145,29 +140,27 @@ public SystemParticipants getSystemParticipants( thermalSource.getThermalStorages(operators, thermalBuses); Try, SourceException> fixedFeedInInputs = - Try.of(() -> getFixedFeedIns(operators, nodes, emUnits), SourceException.class); + Try.of(() -> getFixedFeedIns(operators, nodes), SourceException.class); Try, SourceException> pvInputs = - Try.of(() -> getPvPlants(operators, nodes, emUnits), SourceException.class); + Try.of(() -> getPvPlants(operators, nodes), SourceException.class); Try, SourceException> loads = - Try.of(() -> getLoads(operators, nodes, emUnits), SourceException.class); + Try.of(() -> getLoads(operators, nodes), SourceException.class); Try, SourceException> bmInputs = - Try.of(() -> getBmPlants(operators, nodes, emUnits, bmTypes), SourceException.class); + Try.of(() -> getBmPlants(operators, nodes, bmTypes), SourceException.class); Try, SourceException> storages = - Try.of(() -> getStorages(operators, nodes, emUnits, storageTypes), SourceException.class); + Try.of(() -> getStorages(operators, nodes, storageTypes), SourceException.class); Try, SourceException> wecInputs = - Try.of(() -> getWecPlants(operators, nodes, emUnits, wecTypes), SourceException.class); + Try.of(() -> getWecPlants(operators, nodes, wecTypes), SourceException.class); Try, SourceException> evs = - Try.of(() -> getEvs(operators, nodes, emUnits, evTypes), SourceException.class); + Try.of(() -> getEvs(operators, nodes, evTypes), SourceException.class); Try, SourceException> evcs = - Try.of(() -> getEvcs(operators, nodes, emUnits), SourceException.class); + Try.of(() -> getEvcs(operators, nodes), SourceException.class); Try, SourceException> chpInputs = Try.of( - () -> getChpPlants(operators, nodes, emUnits, chpTypes, thermalBuses, thermalStorages), + () -> getChpPlants(operators, nodes, chpTypes, thermalBuses, thermalStorages), SourceException.class); Try, SourceException> hpInputs = - Try.of( - () -> getHeatPumps(operators, nodes, emUnits, hpTypes, thermalBuses), - SourceException.class); + Try.of(() -> getHeatPumps(operators, nodes, hpTypes, thermalBuses), SourceException.class); List exceptions = Try.getExceptions( @@ -217,8 +210,7 @@ public SystemParticipants getSystemParticipants( */ public Set getFixedFeedIns() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getFixedFeedIns(operators, rawGridSource.getNodes(operators), emUnits); + return getFixedFeedIns(operators, rawGridSource.getNodes(operators)); } /** @@ -237,14 +229,12 @@ public Set getFixedFeedIns() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link FixedFeedInInput} entities */ public Set getFixedFeedIns( - Map operators, Map nodes, Map emUnits) - throws SourceException { + Map operators, Map nodes) throws SourceException { return unpackSet( - buildSystemParticipantEntityData(FixedFeedInInput.class, operators, nodes, emUnits) + buildNodeAssetEntityData(FixedFeedInInput.class, operators, nodes) .map(fixedFeedInInputFactory::get), FixedFeedInInput.class); } @@ -260,8 +250,7 @@ public Set getFixedFeedIns( */ public Set getPvPlants() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getPvPlants(operators, rawGridSource.getNodes(operators), emUnits); + return getPvPlants(operators, rawGridSource.getNodes(operators)); } /** @@ -280,15 +269,12 @@ public Set getPvPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link PvInput} entities */ - public Set getPvPlants( - Map operators, Map nodes, Map emUnits) + public Set getPvPlants(Map operators, Map nodes) throws SourceException { return unpackSet( - buildSystemParticipantEntityData(PvInput.class, operators, nodes, emUnits) - .map(pvInputFactory::get), + buildNodeAssetEntityData(PvInput.class, operators, nodes).map(pvInputFactory::get), PvInput.class); } @@ -303,8 +289,7 @@ public Set getPvPlants( */ public Set getLoads() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getLoads(operators, rawGridSource.getNodes(operators), emUnits); + return getLoads(operators, rawGridSource.getNodes(operators)); } /** @@ -323,15 +308,12 @@ public Set getLoads() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link LoadInput} entities */ - public Set getLoads( - Map operators, Map nodes, Map emUnits) + public Set getLoads(Map operators, Map nodes) throws SourceException { return unpackSet( - buildSystemParticipantEntityData(LoadInput.class, operators, nodes, emUnits) - .map(loadInputFactory::get), + buildNodeAssetEntityData(LoadInput.class, operators, nodes).map(loadInputFactory::get), LoadInput.class); } @@ -346,8 +328,7 @@ public Set getLoads( */ public Set getEvcs() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getEvcs(operators, rawGridSource.getNodes(operators), emUnits); + return getEvcs(operators, rawGridSource.getNodes(operators)); } /** @@ -366,15 +347,12 @@ public Set getEvcs() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @return a set of object- and uuid-unique {@link EvcsInput} entities */ - public Set getEvcs( - Map operators, Map nodes, Map emUnits) + public Set getEvcs(Map operators, Map nodes) throws SourceException { return unpackSet( - buildSystemParticipantEntityData(EvcsInput.class, operators, nodes, emUnits) - .map(evcsInputFactory::get), + buildNodeAssetEntityData(EvcsInput.class, operators, nodes).map(evcsInputFactory::get), EvcsInput.class); } @@ -389,9 +367,7 @@ public Set getEvcs( */ public Set getBmPlants() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getBmPlants( - operators, rawGridSource.getNodes(operators), emUnits, typeSource.getBmTypes()); + return getBmPlants(operators, rawGridSource.getNodes(operators), typeSource.getBmTypes()); } /** @@ -410,18 +386,14 @@ public Set getBmPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link BmTypeInput} entities * @return a set of object- and uuid-unique {@link BmInput} entities */ public Set getBmPlants( - Map operators, - Map nodes, - Map emUnits, - Map types) + Map operators, Map nodes, Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, emUnits, types) + buildTypedSystemParticipantEntityData(BmInput.class, operators, nodes, types) .map(bmInputFactory::get), BmInput.class); } @@ -438,9 +410,7 @@ public Set getBmPlants( */ public Set getStorages() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getStorages( - operators, rawGridSource.getNodes(operators), emUnits, typeSource.getStorageTypes()); + return getStorages(operators, rawGridSource.getNodes(operators), typeSource.getStorageTypes()); } /** @@ -460,18 +430,16 @@ public Set getStorages() throws SourceException { * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} that should be * used for the returning instances * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link StorageTypeInput} entities * @return a set of object- and uuid-unique {@link StorageInput} entities */ public Set getStorages( Map operators, Map nodes, - Map emUnits, Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, emUnits, types) + buildTypedSystemParticipantEntityData(StorageInput.class, operators, nodes, types) .map(storageInputFactory::get), StorageInput.class); } @@ -487,9 +455,7 @@ public Set getStorages( */ public Set getWecPlants() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getWecPlants( - operators, rawGridSource.getNodes(operators), emUnits, typeSource.getWecTypes()); + return getWecPlants(operators, rawGridSource.getNodes(operators), typeSource.getWecTypes()); } /** @@ -508,18 +474,14 @@ public Set getWecPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link WecTypeInput} entities * @return a set of object- and uuid-unique {@link WecInput} entities */ public Set getWecPlants( - Map operators, - Map nodes, - Map emUnits, - Map types) + Map operators, Map nodes, Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, emUnits, types) + buildTypedSystemParticipantEntityData(WecInput.class, operators, nodes, types) .map(wecInputFactory::get), WecInput.class); } @@ -535,8 +497,7 @@ public Set getWecPlants( */ public Set getEvs() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); - return getEvs(operators, rawGridSource.getNodes(operators), emUnits, typeSource.getEvTypes()); + return getEvs(operators, rawGridSource.getNodes(operators), typeSource.getEvTypes()); } /** @@ -555,30 +516,24 @@ public Set getEvs() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link EvTypeInput} entities * @return a set of object- and uuid-unique {@link EvInput} entities */ public Set getEvs( - Map operators, - Map nodes, - Map emUnits, - Map types) + Map operators, Map nodes, Map types) throws SourceException { return unpackSet( - buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, emUnits, types) + buildTypedSystemParticipantEntityData(EvInput.class, operators, nodes, types) .map(evInputFactory::get), EvInput.class); } public Set getChpPlants() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); Map thermalBuses = thermalSource.getThermalBuses(operators); return getChpPlants( operators, rawGridSource.getNodes(operators), - emUnits, typeSource.getChpTypes(), thermalBuses, thermalSource.getThermalStorages(operators, thermalBuses)); @@ -596,7 +551,6 @@ public Set getChpPlants() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link ChpTypeInput} entities * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities * @param thermalStorages a map of UUID to object- and uuid-unique {@link ThermalStorageInput} @@ -606,15 +560,13 @@ public Set getChpPlants() throws SourceException { public Set getChpPlants( Map operators, Map nodes, - Map emUnits, Map types, Map thermalBuses, Map thermalStorages) throws SourceException { return unpackSet( chpEntityStream( - buildTypedSystemParticipantEntityData( - ChpInput.class, operators, nodes, emUnits, types), + buildTypedSystemParticipantEntityData(ChpInput.class, operators, nodes, types), thermalStorages, thermalBuses) .map(chpInputFactory::get), @@ -623,11 +575,9 @@ public Set getChpPlants( public Set getHeatPumps() throws SourceException { Map operators = typeSource.getOperators(); - Map emUnits = energyManagementSource.getEmUnits(operators); return getHeatPumps( operators, rawGridSource.getNodes(operators), - emUnits, typeSource.getHpTypes(), thermalSource.getThermalBuses()); } @@ -644,7 +594,6 @@ public Set getHeatPumps() throws SourceException { * * @param operators a map of UUID to object- and uuid-unique {@link OperatorInput} entities * @param nodes a map of UUID to object- and uuid-unique {@link NodeInput} entities - * @param emUnits a map of UUID to object- and uuid-unique {@link EmInput} entities * @param types a map of UUID to object- and uuid-unique {@link HpTypeInput} entities * @param thermalBuses a map of UUID to object- and uuid-unique {@link ThermalBusInput} entities * @return a set of object- and uuid-unique {@link HpInput} entities @@ -652,14 +601,12 @@ public Set getHeatPumps() throws SourceException { public Set getHeatPumps( Map operators, Map nodes, - Map emUnits, Map types, Map thermalBuses) throws SourceException { return unpackSet( hpEntityStream( - buildTypedSystemParticipantEntityData( - HpInput.class, operators, nodes, emUnits, types), + buildTypedSystemParticipantEntityData(HpInput.class, operators, nodes, types), thermalBuses) .map(hpInputFactory::get), HpInput.class); @@ -729,19 +676,17 @@ private static Stream> hpEntityStream( Class entityClass, Map operators, Map nodes, - Map emUnits, Map types) { return typedSystemParticipantEntityStream( - buildSystemParticipantEntityData(entityClass, operators, nodes, emUnits), types); + buildNodeAssetEntityData(entityClass, operators, nodes), types); } /** - * Enriches a given stream of {@link SystemParticipantEntityData} {@link Try} objects with a type - * of {@link SystemParticipantTypeInput} based on the provided collection of types and the fields - * to values mapping that inside the already provided {@link SystemParticipantEntityData} - * instance. + * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of + * {@link SystemParticipantTypeInput} based on the provided collection of types and the fields to + * values mapping that inside the already provided {@link NodeAssetInputEntityData} instance. * - * @param systemParticipantEntityDataStream the data stream of {@link SystemParticipantEntityData} + * @param systemParticipantEntityDataStream the data stream of {@link NodeAssetInputEntityData} * {@link Try} objects * @param types the types that should be used for enrichment and to build {@link * SystemParticipantTypedEntityData} from @@ -752,7 +697,7 @@ private static Stream> hpEntityStream( private static Stream, SourceException>> typedSystemParticipantEntityStream( - Stream> + Stream> systemParticipantEntityDataStream, Map types) { return systemParticipantEntityDataStream @@ -767,43 +712,4 @@ private static Stream> hpEntityStream( types, SystemParticipantTypedEntityData::new))); } - - private Stream> - buildSystemParticipantEntityData( - Class entityClass, - Map operators, - Map nodes, - Map emUnits) { - return systemParticipantEntityStream( - buildNodeAssetEntityData(entityClass, operators, nodes), emUnits); - } - - /** - * Enriches a given stream of {@link NodeAssetInputEntityData} {@link Try} objects with a type of - * {@link EmInput} based on the provided collection of EMs and the fields to values mapping that - * inside the already provided {@link NodeAssetInputEntityData} instance. - * - * @param nodeAssetEntityDataStream the data stream of {@link NodeAssetInputEntityData} {@link - * Try} objects - * @param emUnits the energy management units that should be used for enrichment and to build - * {@link SystemParticipantEntityData} from - * @return a stream of tries of {@link SystemParticipantEntityData} instances - */ - private static Stream> - systemParticipantEntityStream( - Stream> nodeAssetEntityDataStream, - Map emUnits) { - return nodeAssetEntityDataStream - .parallel() - .map( - nodeAssetInputEntityDataTry -> - nodeAssetInputEntityDataTry.flatMap( - nodeAssetInputEntityData -> - optionallyEnrichEntityData( - nodeAssetInputEntityData, - SystemParticipantInputEntityFactory.EM, - emUnits, - null, - SystemParticipantEntityData::new))); - } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java index 1ea0f0afd..6815c3826 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvJointGridContainerSource.java @@ -51,9 +51,9 @@ public static JointGridContainer read( TypeSource typeSource = new TypeSource(dataSource); RawGridSource rawGridSource = new RawGridSource(typeSource, dataSource); ThermalSource thermalSource = new ThermalSource(typeSource, dataSource); - EnergyManagementSource emSource = new EnergyManagementSource(typeSource, dataSource); SystemParticipantSource systemParticipantSource = - new SystemParticipantSource(typeSource, thermalSource, rawGridSource, emSource, dataSource); + new SystemParticipantSource(typeSource, thermalSource, rawGridSource, dataSource); + EnergyManagementSource emSource = new EnergyManagementSource(typeSource, dataSource); GraphicSource graphicSource = new GraphicSource(typeSource, rawGridSource, dataSource); /* Loading basic inputs that are used multiple times */ @@ -71,6 +71,8 @@ public static JointGridContainer read( Try.of( () -> systemParticipantSource.getSystemParticipants(operators, nodes), SourceException.class); + Try emUnits = + Try.of(() -> emSource.getEmUnits(operators), SourceException.class); Try graphicElements = Try.of(() -> graphicSource.getGraphicElements(nodes, lines), SourceException.class); @@ -87,6 +89,7 @@ public static JointGridContainer read( gridName, rawGridElements.getOrThrow(), systemParticipants.getOrThrow(), + emUnits.getOrThrow(), graphicElements.getOrThrow()); } } diff --git a/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java new file mode 100644 index 000000000..61ad82ddf --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/ControlStrategy.java @@ -0,0 +1,35 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models; + +import edu.ie3.datamodel.exceptions.ParsingException; +import java.io.Serializable; +import java.util.Arrays; + +public interface ControlStrategy extends Serializable { + String getKey(); + + static ControlStrategy parse(String key) throws ParsingException { + if (key == null || key.isEmpty()) + return ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY; + + String filterKey = key.toLowerCase().replace("-", "_"); + return Arrays.stream(EmControlStrategy.values()) + .filter(profile -> profile.getKey().equals(filterKey)) + .findFirst() + .orElseThrow( + () -> new ParsingException("Cannot parse \"" + key + "\" to a valid control strategy")); + } + + enum DefaultControlStrategies implements ControlStrategy { + NO_CONTROL_STRATEGY; + + @Override + public String getKey() { + return "No control strategy assigned"; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java b/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java new file mode 100644 index 000000000..ffb216a35 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/EmControlStrategy.java @@ -0,0 +1,45 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models; + +import java.util.Arrays; +import java.util.Locale; +import java.util.stream.Collectors; + +public enum EmControlStrategy implements ControlStrategy { + SELF_OPTIMIZATION("self_optimization"); + + private final String key; + + EmControlStrategy(String key) { + this.key = key.toLowerCase(Locale.ROOT); + } + + public static EmControlStrategy get(String key) { + return Arrays.stream(EmControlStrategy.values()) + .filter(controlStrategy -> controlStrategy.key.equalsIgnoreCase(key)) + .findFirst() + .orElseThrow( + () -> + new IllegalArgumentException( + "No predefined energy management control strategy '" + + key + + "' found. Please provide one of the following keys: " + + Arrays.stream(EmControlStrategy.values()) + .map(EmControlStrategy::getKey) + .collect(Collectors.joining(", ")))); + } + + @Override + public String getKey() { + return key; + } + + @Override + public String toString() { + return "EmControlStrategy{" + "key='" + key + '\'' + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/EmInput.java deleted file mode 100644 index 1376caa1c..000000000 --- a/src/main/java/edu/ie3/datamodel/models/input/EmInput.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * © 2022. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation -*/ -package edu.ie3.datamodel.models.input; - -import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.UniqueEntity; -import java.util.Objects; -import java.util.Optional; -import java.util.UUID; - -public class EmInput extends AssetInput { - - /** Reference to the control strategy to be used for this model */ - private final String controlStrategy; - - /** - * Optional UUID of the parent {@link EmInput} that is controlling this em unit. If null, this em - * unit is not em-controlled. - */ - private final EmInput parentEm; - - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param operator of the asset - * @param operationTime time for which the entity is operated - * @param emControlStrategy the control strategy - * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. - */ - public EmInput( - UUID uuid, - String id, - OperatorInput operator, - OperationTime operationTime, - String emControlStrategy, - EmInput parentEm) { - super(uuid, id, operator, operationTime); - this.controlStrategy = emControlStrategy; - this.parentEm = parentEm; - } - - /** - * Constructor for an operated energy management system - * - * @param uuid of the input entity - * @param id of the asset - * @param emControlStrategy the control strategy - * @param parentEm The {@link EmInput} controlling this em unit. Null, if not applicable. - */ - public EmInput(UUID uuid, String id, String emControlStrategy, EmInput parentEm) { - super(uuid, id); - this.controlStrategy = emControlStrategy; - this.parentEm = parentEm; - } - - public String getControlStrategy() { - return controlStrategy; - } - - public Optional getParentEm() { - return Optional.ofNullable(parentEm); - } - - @Override - public EmInputCopyBuilder copy() { - return new EmInputCopyBuilder(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof EmInput emInput)) return false; - if (!super.equals(o)) return false; - return Objects.equals(controlStrategy, emInput.controlStrategy) - && Objects.equals(parentEm, emInput.parentEm); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), controlStrategy, parentEm); - } - - @Override - public String toString() { - return "EmInput{" - + "uuid=" - + getUuid() - + ", id='" - + getId() - + ", operator=" - + getOperator().getUuid() - + ", operationTime=" - + getOperationTime() - + ", controlStrategy=" - + getControlStrategy() - + ", parentEm=" - + getParentEm().map(UniqueEntity::getUuid).map(UUID::toString).orElse("") - + '}'; - } - - public static class EmInputCopyBuilder extends AssetInputCopyBuilder { - - private String controlStrategy; - - private EmInput parentEm; - - protected EmInputCopyBuilder(EmInput entity) { - super(entity); - this.controlStrategy = entity.getControlStrategy(); - this.parentEm = entity.parentEm; - } - - public EmInputCopyBuilder controlStrategy(String controlStrategy) { - this.controlStrategy = controlStrategy; - return this; - } - - public EmInputCopyBuilder parentEm(EmInput parentEm) { - this.parentEm = parentEm; - return thisInstance(); - } - - @Override - public EmInput build() { - return new EmInput( - getUuid(), getId(), getOperator(), getOperationTime(), controlStrategy, parentEm); - } - - @Override - protected EmInputCopyBuilder thisInstance() { - return this; - } - } -} diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java b/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java new file mode 100644 index 000000000..4142a745d --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/container/EnergyManagementUnits.java @@ -0,0 +1,100 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.container; + +import edu.ie3.datamodel.models.input.system.EmInput; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** Represents the accumulation of energy management units */ +public class EnergyManagementUnits implements InputContainer { + + protected final Map emUnits; + + public EnergyManagementUnits(Set emUnits) { + this.emUnits = + emUnits.stream().collect(Collectors.toMap(EmInput::getUuid, Function.identity())); + } + + /** + * Combine different already existing containers + * + * @param emUnits already existing containers + */ + public EnergyManagementUnits(Collection emUnits) { + this.emUnits = + emUnits.stream() + .flatMap(units -> units.emUnits.entrySet().stream()) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + public Set getEmUnits() { + return new HashSet<>(emUnits.values()); + } + + @Override + public List allEntitiesAsList() { + return emUnits.values().stream().toList(); + } + + // TODO useful once #957 is implemented + public Map getEmUnitsMap() { + return emUnits; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EnergyManagementUnits that)) return false; + return Objects.equals(emUnits, that.emUnits); + } + + @Override + public int hashCode() { + return Objects.hash(emUnits); + } + + @Override + public EnergyManagementUnitsCopyBuilder copy() { + return new EnergyManagementUnitsCopyBuilder(this); + } + + /** + * A builder pattern based approach to create copies of {@link EnergyManagementUnits} containers + * with altered field values. For detailed field descriptions refer to java docs of {@link + * EnergyManagementUnits} + */ + public static class EnergyManagementUnitsCopyBuilder + implements InputContainerCopyBuilder { + protected Set emUnits; + + /** + * Constructor for {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} + * + * @param energyManagementUnits instance of {@link EnergyManagementUnits} + */ + protected EnergyManagementUnitsCopyBuilder(EnergyManagementUnits energyManagementUnits) { + this.emUnits = energyManagementUnits.getEmUnits(); + } + + /** + * Method to alter the {@link EmInput}s + * + * @param emUnits set of altered {@link EmInput}s + * @return this instance of {@link EnergyManagementUnits.EnergyManagementUnitsCopyBuilder} + */ + public EnergyManagementUnits.EnergyManagementUnitsCopyBuilder emUnits(Set emUnits) { + this.emUnits = emUnits; + return this; + } + + @Override + public EnergyManagementUnits build() { + return new EnergyManagementUnits(emUnits); + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java index 3c076cfff..12f5b7c9d 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java +++ b/src/main/java/edu/ie3/datamodel/models/input/container/GridContainer.java @@ -15,6 +15,8 @@ public abstract class GridContainer implements InputContainer { protected final RawGridElements rawGrid; /** Accumulated system participant elements */ protected final SystemParticipants systemParticipants; + /** Accumulated energy management units */ + protected final EnergyManagementUnits emUnits; /** Accumulated graphic data entities (node graphics, line graphics) */ protected final GraphicElements graphics; @@ -22,11 +24,13 @@ protected GridContainer( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits emUnits, GraphicElements graphics) { this.gridName = gridName; this.rawGrid = rawGrid; this.systemParticipants = systemParticipants; + this.emUnits = emUnits; this.graphics = graphics; } @@ -35,6 +39,7 @@ public List allEntitiesAsList() { List allEntities = new LinkedList<>(); allEntities.addAll(rawGrid.allEntitiesAsList()); allEntities.addAll(systemParticipants.allEntitiesAsList()); + allEntities.addAll(emUnits.allEntitiesAsList()); allEntities.addAll(graphics.allEntitiesAsList()); return Collections.unmodifiableList(allEntities); } @@ -55,6 +60,10 @@ public SystemParticipants getSystemParticipants() { return systemParticipants; } + public EnergyManagementUnits getEmUnits() { + return emUnits; + } + public GraphicElements getGraphics() { return graphics; } @@ -66,12 +75,13 @@ public boolean equals(Object o) { return gridName.equals(that.gridName) && rawGrid.equals(that.rawGrid) && systemParticipants.equals(that.systemParticipants) + && emUnits.equals(that.emUnits) && graphics.equals(that.graphics); } @Override public int hashCode() { - return Objects.hash(gridName, rawGrid, systemParticipants, graphics); + return Objects.hash(gridName, rawGrid, systemParticipants, emUnits, graphics); } @Override @@ -91,6 +101,7 @@ protected abstract static class GridContainerCopyBuilder feedInTariff) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -73,7 +70,6 @@ public BmInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of BM * @param marketReaction Is this asset market oriented? * @param costControlled Does this plant increase the output power if the revenues exceed the @@ -85,12 +81,11 @@ public BmInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, BmTypeInput type, boolean marketReaction, boolean costControlled, ComparableQuantity feedInTariff) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.type = type; this.marketReaction = marketReaction; this.costControlled = costControlled; @@ -149,9 +144,8 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() - + ", type=" + + '\'' + + "type=" + type.getUuid() + ", marketReaction=" + marketReaction @@ -214,7 +208,6 @@ public BmInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), type, marketReaction, costControlled, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java index 1478c949b..422817ecb 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/ChpInput.java @@ -9,7 +9,6 @@ import edu.ie3.datamodel.io.extractor.HasThermalStorage; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -42,7 +41,6 @@ public class ChpInput extends SystemParticipantInput * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -55,11 +53,10 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -75,7 +72,6 @@ public ChpInput( * @param thermalBus The thermal bus, this model is connected to (normally equal to the thermal * bus of the provided thermal storage!) * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of CHP * @param thermalStorage Thermal storage model * @param marketReaction Is this asset market oriented? @@ -86,11 +82,10 @@ public ChpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChpTypeInput type, ThermalStorageInput thermalStorage, boolean marketReaction) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.thermalBus = thermalBus; this.type = type; this.thermalStorage = thermalStorage; @@ -150,8 +145,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", thermalBus=" + thermalBus.getUuid() + ", type=" @@ -196,7 +190,6 @@ public ChpInput build() { getNode(), thermalBus, getqCharacteristics(), - getEm(), type, thermalStorage, marketReaction); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java new file mode 100644 index 000000000..f9bbbaa9f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EmInput.java @@ -0,0 +1,176 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.models.input.system; + +import edu.ie3.datamodel.models.ControlStrategy; +import edu.ie3.datamodel.models.EmControlStrategy; +import edu.ie3.datamodel.models.OperationTime; +import edu.ie3.datamodel.models.input.AssetInput; +import edu.ie3.datamodel.models.input.OperatorInput; +import java.util.Arrays; +import java.util.Objects; +import java.util.UUID; + +public class EmInput extends AssetInput { + + /** Reference via UUID to all SystemParticipantInputs connected to this model */ + private final UUID[] connectedAssets; + + /** Reference to the control strategy to be used for this model */ + private final ControlStrategy controlStrategy; + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param operator of the asset + * @param operationTime time for which the entity is operated + * @param connectedAssets array of all connected assets + * @param controlStrategy control strategy used for this model + */ + public EmInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + UUID[] connectedAssets, + ControlStrategy controlStrategy) { + super(uuid, id, operator, operationTime); + this.connectedAssets = connectedAssets; + this.controlStrategy = controlStrategy; + } + + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param operator of the asset + * @param operationTime time for which the entity is operated + * @param connectedAssets array of all connected assets + * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy + * key + */ + public EmInput( + UUID uuid, + String id, + OperatorInput operator, + OperationTime operationTime, + UUID[] connectedAssets, + String emControlStrategy) { + super(uuid, id, operator, operationTime); + this.connectedAssets = connectedAssets; + this.controlStrategy = EmControlStrategy.get(emControlStrategy); + } + + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param connectedAssets array of all connected assets + * @param controlStrategy control strategy used for this model + */ + public EmInput(UUID uuid, String id, UUID[] connectedAssets, ControlStrategy controlStrategy) { + super(uuid, id); + this.connectedAssets = connectedAssets; + this.controlStrategy = controlStrategy; + } + + /** + * Constructor for an operated energy management system + * + * @param uuid of the input entity + * @param id of the asset + * @param connectedAssets array of all connected assets + * @param emControlStrategy {@link edu.ie3.datamodel.models.EmControlStrategy} control strategy + * key + */ + public EmInput(UUID uuid, String id, UUID[] connectedAssets, String emControlStrategy) { + super(uuid, id); + this.connectedAssets = connectedAssets; + this.controlStrategy = EmControlStrategy.get(emControlStrategy); + } + + public UUID[] getConnectedAssets() { + return connectedAssets; + } + + public ControlStrategy getControlStrategy() { + return controlStrategy; + } + + @Override + public EmInputCopyBuilder copy() { + return new EmInputCopyBuilder(this); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof EmInput emInput)) return false; + if (!super.equals(o)) return false; + return Arrays.equals(connectedAssets, emInput.connectedAssets) + && controlStrategy == emInput.controlStrategy; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), Arrays.hashCode(connectedAssets), controlStrategy); + } + + @Override + public String toString() { + return "EmInput{" + + "uuid=" + + getUuid() + + ", id='" + + getId() + + ", operator=" + + getOperator().getUuid() + + ", operationTime=" + + getOperationTime() + + ", connectedAssets=" + + Arrays.toString(connectedAssets) + + ", controlStrategy=" + + controlStrategy + + '}'; + } + + public static class EmInputCopyBuilder extends AssetInputCopyBuilder { + + private UUID[] connectedAssets; + + private ControlStrategy controlStrategy; + + protected EmInputCopyBuilder(EmInput entity) { + super(entity); + this.connectedAssets = entity.getConnectedAssets(); + this.controlStrategy = entity.getControlStrategy(); + } + + public EmInputCopyBuilder connectedAssets(UUID[] connectedAssets) { + this.connectedAssets = connectedAssets; + return this; + } + + public EmInputCopyBuilder controlStrategy(ControlStrategy controlStrategy) { + this.controlStrategy = controlStrategy; + return this; + } + + @Override + public EmInput build() { + return new EmInput( + getUuid(), getId(), getOperator(), getOperationTime(), connectedAssets, controlStrategy); + } + + @Override + protected EmInputCopyBuilder thisInstance() { + return this; + } + } +} diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java index b4796b844..5f2edeae9 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -29,7 +28,6 @@ public class EvInput extends SystemParticipantInput implements HasType { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of EV */ public EvInput( @@ -39,9 +37,8 @@ public EvInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, EvTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.type = type; } @@ -52,7 +49,6 @@ public EvInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of EV */ public EvInput( @@ -60,9 +56,8 @@ public EvInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, EvTypeInput type) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.type = type; } @@ -103,8 +98,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", type=" + type.getUuid() + '}'; @@ -136,7 +130,6 @@ public EvInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java index 8513edd5c..e3f3c381f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/EvcsInput.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.models.input.system; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -39,7 +38,6 @@ public class EvcsInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param chargingPoints number of charging points available at this charging station * @param cosPhiRated rated cos phi @@ -53,13 +51,12 @@ public EvcsInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChargingPointType type, int chargingPoints, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.type = type; this.chargingPoints = chargingPoints; this.cosPhiRated = cosPhiRated; @@ -74,7 +71,6 @@ public EvcsInput( * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param cosPhiRated rated cos phi * @param locationType the location type @@ -87,7 +83,6 @@ public EvcsInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChargingPointType type, double cosPhiRated, EvcsLocationType locationType, @@ -99,7 +94,6 @@ public EvcsInput( operationTime, node, qCharacteristics, - em, type, 1, cosPhiRated, @@ -111,7 +105,6 @@ public EvcsInput( * @param id Human readable identifier * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param chargingPoints number of charging points available at this charging station * @param cosPhiRated rated cos phi @@ -123,13 +116,12 @@ public EvcsInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChargingPointType type, int chargingPoints, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.type = type; this.chargingPoints = chargingPoints; this.cosPhiRated = cosPhiRated; @@ -142,7 +134,6 @@ public EvcsInput( * @param id Human readable identifier * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type type of the charging points available to this charging station * @param cosPhiRated rated cos phi * @param locationType the location type @@ -153,12 +144,11 @@ public EvcsInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ChargingPointType type, double cosPhiRated, EvcsLocationType locationType, boolean v2gSupport) { - this(uuid, id, node, qCharacteristics, em, type, 1, cosPhiRated, locationType, v2gSupport); + this(uuid, id, node, qCharacteristics, type, 1, cosPhiRated, locationType, v2gSupport); } public ChargingPointType getType() { @@ -218,8 +208,6 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + ", type=" + type + ", chargingPoints=" @@ -292,7 +280,6 @@ public EvcsInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), type, chargingPoints, cosPhiRated, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java index b765ca695..16ba19dc7 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/FixedFeedInInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -32,7 +31,6 @@ public class FixedFeedInInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param sRated Rated apparent power * @param cosPhiRated Power factor */ @@ -43,10 +41,9 @@ public FixedFeedInInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; } @@ -58,7 +55,6 @@ public FixedFeedInInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param sRated Rated apparent power * @param cosPhiRated Power factor */ @@ -67,10 +63,9 @@ public FixedFeedInInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.sRated = sRated.to(StandardUnits.S_RATED); this.cosPhiRated = cosPhiRated; } @@ -115,8 +110,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", sRated=" + sRated + ", cosphiRated=" @@ -153,7 +147,6 @@ public FixedFeedInInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), sRated, cosPhiRated); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java index 89771ae58..ef5bf7fea 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/HpInput.java @@ -8,7 +8,6 @@ import edu.ie3.datamodel.io.extractor.HasThermalBus; import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -34,7 +33,6 @@ public class HpInput extends SystemParticipantInput implements HasType, HasTherm * @param node the asset is connected to * @param thermalBus The thermal bus, this model is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of HP */ public HpInput( @@ -45,9 +43,8 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - EmInput em, HpTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.thermalBus = thermalBus; this.type = type; } @@ -60,7 +57,6 @@ public HpInput( * @param node the asset is connected to * @param thermalBus The thermal bus, this model is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of HP */ public HpInput( @@ -69,9 +65,8 @@ public HpInput( NodeInput node, ThermalBusInput thermalBus, ReactivePowerCharacteristic qCharacteristics, - EmInput em, HpTypeInput type) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.thermalBus = thermalBus; this.type = type; } @@ -118,8 +113,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", type=" + type.getUuid() + ", thermalBus=" @@ -156,7 +150,6 @@ public HpInput build() { getNode(), thermalBus, getqCharacteristics(), - getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java index 196952d65..9f320d851 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/LoadInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.exceptions.ParsingException; import edu.ie3.datamodel.models.*; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -48,7 +47,6 @@ public class LoadInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Load profile to use for this model * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) @@ -62,13 +60,12 @@ public LoadInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.loadProfile = loadProfile; this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); @@ -85,7 +82,6 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfileKey Load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} @@ -101,7 +97,6 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, @@ -116,7 +111,6 @@ public LoadInput( operationTime, node, qCharacteristics, - em, LoadProfile.parse(loadProfileKey), dsm, eConsAnnual, @@ -131,7 +125,6 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfile Standard load profile to use for this model * @param dsm True, if demand side management is activated for this load * @param eConsAnnual Annually consumed energy (typically in kWh) @@ -143,13 +136,12 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, LoadProfile loadProfile, boolean dsm, ComparableQuantity eConsAnnual, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.loadProfile = loadProfile; this.dsm = dsm; this.eConsAnnual = eConsAnnual.to(StandardUnits.ENERGY_IN); @@ -164,7 +156,6 @@ public LoadInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param loadProfileKey load profile key corresponding to {@link * edu.ie3.datamodel.models.profile.BdewStandardLoadProfile} or {@link * edu.ie3.datamodel.models.profile.NbwTemperatureDependantLoadProfile} @@ -178,7 +169,6 @@ public LoadInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, String loadProfileKey, boolean dsm, ComparableQuantity eConsAnnual, @@ -190,7 +180,6 @@ public LoadInput( id, node, qCharacteristics, - em, LoadProfile.parse(loadProfileKey), dsm, eConsAnnual, @@ -254,8 +243,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", dsm=" + dsm + ", eConsAnnual=" @@ -326,7 +314,6 @@ public LoadInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), loadProfile, dsm, eConsAnnual, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java index 2117ef313..49a68253f 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/PvInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.StandardUnits; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -49,7 +48,6 @@ public class PvInput extends SystemParticipantInput { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param albedo Albedo value (typically a value between 0 and 1) * @param azimuth Inclination in a compass direction (typically °: South 0◦; West 90◦; East -90◦) * @param etaConv Efficiency of converter (typically in %) @@ -67,7 +65,6 @@ public PvInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, @@ -77,7 +74,7 @@ public PvInput( boolean marketReaction, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.albedo = albedo; this.azimuth = azimuth.to(StandardUnits.AZIMUTH); this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); @@ -96,7 +93,6 @@ public PvInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param albedo Albedo value (typically a value between 0 and 1) * @param azimuth Inclination in a compass direction (typically °: South 0◦; West 90◦; East -90◦) * @param etaConv Efficiency of converter (typically in %) @@ -112,7 +108,6 @@ public PvInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, double albedo, ComparableQuantity azimuth, ComparableQuantity etaConv, @@ -122,7 +117,7 @@ public PvInput( boolean marketReaction, ComparableQuantity sRated, double cosPhiRated) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.albedo = albedo; this.azimuth = azimuth.to(StandardUnits.AZIMUTH); this.etaConv = etaConv.to(StandardUnits.EFFICIENCY); @@ -220,8 +215,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", albedo=" + albedo + ", azimuth=" @@ -330,7 +324,6 @@ public PvInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), albedo, azimuth, etaConv, diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java index ed37c1448..26726cb03 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/StorageInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -29,7 +28,6 @@ public class StorageInput extends SystemParticipantInput implements HasType { * @param operationTime time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic for integrated inverter - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of storage */ public StorageInput( @@ -39,9 +37,8 @@ public StorageInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, StorageTypeInput type) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.type = type; } @@ -52,7 +49,6 @@ public StorageInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of storage */ public StorageInput( @@ -60,9 +56,8 @@ public StorageInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, StorageTypeInput type) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.type = type; } @@ -103,8 +98,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", type=" + type.getUuid() + '}'; @@ -136,7 +130,6 @@ public StorageInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), type); } diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java index eea7df273..9fa4a00a6 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/SystemParticipantInput.java @@ -7,9 +7,7 @@ import edu.ie3.datamodel.io.extractor.HasNodes; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.AssetInput; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -24,12 +22,6 @@ public abstract class SystemParticipantInput extends AssetInput implements HasNo /** Description of a reactive power characteristic. For details see further documentation */ private final ReactivePowerCharacteristic qCharacteristics; - /** - * Optional {@link EmInput} that is controlling this system participant. If null, this system - * participant is not em-controlled. - */ - private final EmInput em; - /** * Constructor for an operated system participant * @@ -39,7 +31,6 @@ public abstract class SystemParticipantInput extends AssetInput implements HasNo * @param operationTime Time for which the entity is operated * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. */ protected SystemParticipantInput( UUID uuid, @@ -47,12 +38,10 @@ protected SystemParticipantInput( OperatorInput operator, OperationTime operationTime, NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - EmInput em) { + ReactivePowerCharacteristic qCharacteristics) { super(uuid, id, operator, operationTime); this.node = node; this.qCharacteristics = qCharacteristics; - this.em = em; } /** @@ -62,30 +51,20 @@ protected SystemParticipantInput( * @param id of the asset * @param node that the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. */ protected SystemParticipantInput( - UUID uuid, - String id, - NodeInput node, - ReactivePowerCharacteristic qCharacteristics, - EmInput em) { + UUID uuid, String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics) { super(uuid, id); this.node = node; this.qCharacteristics = qCharacteristics; - this.em = em; - } - - public NodeInput getNode() { - return node; } public ReactivePowerCharacteristic getqCharacteristics() { return qCharacteristics; } - public Optional getEm() { - return Optional.ofNullable(em); + public NodeInput getNode() { + return node; } @Override @@ -102,13 +81,12 @@ public boolean equals(Object o) { if (!(o instanceof SystemParticipantInput that)) return false; if (!super.equals(o)) return false; return Objects.equals(node, that.node) - && Objects.equals(qCharacteristics, that.qCharacteristics) - && Objects.equals(em, that.em); + && Objects.equals(qCharacteristics, that.qCharacteristics); } @Override public int hashCode() { - return Objects.hash(super.hashCode(), node, qCharacteristics, em); + return Objects.hash(super.hashCode(), node, qCharacteristics); } @Override @@ -126,8 +104,7 @@ public String toString() { + node.getUuid() + ", qCharacteristics='" + qCharacteristics - + "', em=" - + getEm().map(UniqueEntity::getUuid).map(UUID::toString).orElse("") + + '\'' + '}'; } @@ -144,13 +121,11 @@ public abstract static class SystemParticipantInputCopyBuilder< private NodeInput node; private ReactivePowerCharacteristic qCharacteristics; - private EmInput em; protected SystemParticipantInputCopyBuilder(SystemParticipantInput entity) { super(entity); this.node = entity.getNode(); this.qCharacteristics = entity.getqCharacteristics(); - this.em = entity.getEm().orElse(null); } public B node(NodeInput node) { @@ -163,11 +138,6 @@ public B qCharacteristics(ReactivePowerCharacteristic qCharacteristics) { return thisInstance(); } - public B em(EmInput em) { - this.em = em; - return thisInstance(); - } - protected NodeInput getNode() { return node; } @@ -176,11 +146,6 @@ protected ReactivePowerCharacteristic getqCharacteristics() { return qCharacteristics; } - /** @return The {@link EmInput} controlling this system participant. CAN BE NULL. */ - public EmInput getEm() { - return em; - } - @Override public abstract SystemParticipantInput build(); diff --git a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java index 05d170e59..d5c5122d5 100644 --- a/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java +++ b/src/main/java/edu/ie3/datamodel/models/input/system/WecInput.java @@ -7,7 +7,6 @@ import edu.ie3.datamodel.io.extractor.HasType; import edu.ie3.datamodel.models.OperationTime; -import edu.ie3.datamodel.models.input.EmInput; import edu.ie3.datamodel.models.input.NodeInput; import edu.ie3.datamodel.models.input.OperatorInput; import edu.ie3.datamodel.models.input.system.characteristic.ReactivePowerCharacteristic; @@ -32,7 +31,6 @@ public class WecInput extends SystemParticipantInput implements HasType { * @param operationTime Time for which the entity is operated * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of this WEC * @param marketReaction Is this asset market oriented? */ @@ -43,10 +41,9 @@ public WecInput( OperationTime operationTime, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, WecTypeInput type, boolean marketReaction) { - super(uuid, id, operator, operationTime, node, qCharacteristics, em); + super(uuid, id, operator, operationTime, node, qCharacteristics); this.type = type; this.marketReaction = marketReaction; } @@ -58,7 +55,6 @@ public WecInput( * @param id of the asset * @param node the asset is connected to * @param qCharacteristics Description of a reactive power characteristic - * @param em The {@link EmInput} controlling this system participant. Null, if not applicable. * @param type of this WEC * @param marketReaction Is this asset market oriented? */ @@ -67,10 +63,9 @@ public WecInput( String id, NodeInput node, ReactivePowerCharacteristic qCharacteristics, - EmInput em, WecTypeInput type, boolean marketReaction) { - super(uuid, id, node, qCharacteristics, em); + super(uuid, id, node, qCharacteristics); this.type = type; this.marketReaction = marketReaction; } @@ -117,8 +112,7 @@ public String toString() { + getNode().getUuid() + ", qCharacteristics='" + getqCharacteristics() - + "', em=" - + getEm() + + '\'' + ", type=" + type.getUuid() + ", marketReaction=" @@ -154,7 +148,6 @@ public WecInput build() { getOperationTime(), getNode(), getqCharacteristics(), - getEm(), type, marketReaction); } diff --git a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java index 0935b4b5b..d27667b8f 100644 --- a/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java +++ b/src/main/java/edu/ie3/datamodel/models/result/system/EmResult.java @@ -5,13 +5,12 @@ */ package edu.ie3.datamodel.models.result.system; -import edu.ie3.datamodel.models.input.EmInput; import java.time.ZonedDateTime; import java.util.UUID; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; -/** Represents calculation results of an {@link EmInput} */ +/** Represents calculation results of an {@link edu.ie3.datamodel.models.input.system.EmInput} */ public class EmResult extends SystemParticipantResult { /** diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java index 4778fabea..a482ce658 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerNodeUpdateUtil.java @@ -77,6 +77,7 @@ public static JointGridContainer updateGridWithNodes( grid.getGridName(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), + grid.getEmUnits(), updatedEntities.graphicElements()); } @@ -112,6 +113,7 @@ public static SubGridContainer updateGridWithNodes( grid.getSubnet(), updatedEntities.rawGridElements(), updatedEntities.systemParticipants(), + grid.getEmUnits(), updatedEntities.graphicElements()); } diff --git a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java index 5033221a2..eb8d431ff 100644 --- a/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java +++ b/src/main/java/edu/ie3/datamodel/utils/ContainerUtils.java @@ -501,6 +501,7 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( String gridName, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { /* Collect the different sub nets. Through the validation of lines, it is ensured, that no galvanically connected @@ -509,7 +510,8 @@ public static SubGridTopologyGraph buildSubGridTopologyGraph( /* Build the single sub grid models */ HashMap subgrids = - buildSubGridContainers(gridName, subnetNumbers, rawGrid, systemParticipants, graphics); + buildSubGridContainers( + gridName, subnetNumbers, rawGrid, systemParticipants, energyManagementUnits, graphics); /* Build the graph structure denoting the topology of the grid */ return buildSubGridTopologyGraph(subgrids, rawGrid); @@ -540,6 +542,7 @@ private static HashMap buildSubGridContainers( SortedSet subnetNumbers, RawGridElements rawGrid, SystemParticipants systemParticipants, + EnergyManagementUnits energyManagementUnits, GraphicElements graphics) throws InvalidGridException { HashMap subGrids = new HashMap<>(subnetNumbers.size()); @@ -552,7 +555,12 @@ private static HashMap buildSubGridContainers( subGrids.put( subnetNumber, new SubGridContainer( - gridName, subnetNumber, rawGridElements, systemParticipantElements, graphicElements)); + gridName, + subnetNumber, + rawGridElements, + systemParticipantElements, + energyManagementUnits, + graphicElements)); } return subGrids; } @@ -804,6 +812,9 @@ public static JointGridContainer combineToJointGrid( GraphicElements graphicElements = new GraphicElements( subGridContainers.stream().map(GridContainer::getGraphics).collect(Collectors.toSet())); + EnergyManagementUnits energyManagementUnits = + new EnergyManagementUnits( + subGridContainers.stream().map(GridContainer::getEmUnits).collect(Collectors.toSet())); Map subGridMapping = subGridContainers.stream() @@ -812,7 +823,12 @@ public static JointGridContainer combineToJointGrid( SubGridTopologyGraph subGridTopologyGraph = buildSubGridTopologyGraph(subGridMapping, rawGrid); return new JointGridContainer( - gridName, rawGrid, systemParticipants, graphicElements, subGridTopologyGraph); + gridName, + rawGrid, + systemParticipants, + energyManagementUnits, + graphicElements, + subGridTopologyGraph); } /** @@ -985,6 +1001,7 @@ public static SubGridContainer withTrafoNodeAsSlack(final SubGridContainer subGr subGridContainer.getRawGrid().getSwitches(), subGridContainer.getRawGrid().getMeasurementUnits()), subGridContainer.getSystemParticipants(), + subGridContainer.getEmUnits(), new GraphicElements(newNodeGraphics, subGridContainer.getGraphics().getLineGraphics())); } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy index c380d2418..20d14f658 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/extractor/ExtractorTest.groovy @@ -145,7 +145,7 @@ class ExtractorTest extends Specification { given: def sampleFixedFeedInput = new FixedFeedInInput(UUID.fromString("717af017-cc69-406f-b452-e022d7fb516a"), "test_fixedFeedInInput", OperatorInput.NO_OPERATOR_ASSIGNED, - sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.em.orElse(null), + sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.sRated,sptd.fixedFeedInInput.cosPhiRated) expect: Extractor.extractElements(sampleFixedFeedInput) as Set == [ diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy index bd9e10266..48b7a5410 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/BmInputFactoryTest.groovy @@ -9,7 +9,6 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.BmInput @@ -49,12 +48,11 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = BmInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(BmTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) then: input.success @@ -74,7 +72,6 @@ class BmInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput assert !marketReaction assert costControlled diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy index aedb04fce..eba32b0f9 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/ChpInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.ChpInput @@ -48,14 +47,13 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = ChpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(ChpTypeInput) def thermalBusInput = Mock(ThermalBusInput) def thermalStorageInput = Mock(ThermalStorageInput) when: Try input = inputFactory.get( - new ChpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput, thermalStorageInput)) + new ChpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput, thermalStorageInput)) then: input.success @@ -75,7 +73,6 @@ class ChpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy index 673185c12..707a71ccd 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EmInputFactoryTest.groovy @@ -6,13 +6,16 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.io.factory.input.EmAssetInputEntityData -import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.io.factory.input.AssetInputEntityData +import edu.ie3.datamodel.models.ControlStrategy +import edu.ie3.datamodel.models.EmControlStrategy import edu.ie3.datamodel.models.input.OperatorInput +import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.utils.Try import spock.lang.Specification import java.time.ZonedDateTime +import javax.measure.quantity.Dimensionless class EmInputFactoryTest extends Specification { @@ -25,7 +28,7 @@ class EmInputFactoryTest extends Specification { inputFactory.supportedClasses == expectedClasses } - def "A EmInputFactory should parse a valid EmInput with parent EM correctly"() { + def "A EmInputFactory should parse a valid EmInput correctly"() { given: def inputFactory = new EmInputFactory() Map parameter = [ @@ -33,15 +36,15 @@ class EmInputFactoryTest extends Specification { "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", "id" : "TestID", - "controlstrategy" : "no_control" + "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914 a17aa6f0-e663-4186-ac34-a7b68573938b", + "controlstrategy" : "self_optimization" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) - def parentEmUnit = Mock(EmInput) when: Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, parentEmUnit)) + new AssetInputEntityData(parameter, inputClass, operatorInput)) then: input.success @@ -54,12 +57,15 @@ class EmInputFactoryTest extends Specification { assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) assert operator == operatorInput assert id == parameter["id"] - assert controlStrategy == parameter["controlstrategy"] - assert parentEm == Optional.of(parentEmUnit) + assert connectedAssets == [ + UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914"), + UUID.fromString("a17aa6f0-e663-4186-ac34-a7b68573938b") + ] as UUID[] + assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION } } - def "A EmInputFactory should parse a valid EmInput without parent EM correctly"() { + def "A EmInputFactory should parse a valid EmInput with zero connected assets correctly"() { given: def inputFactory = new EmInputFactory() Map parameter = [ @@ -67,14 +73,15 @@ class EmInputFactoryTest extends Specification { "operatesfrom" : "2019-01-01T00:00:00+01:00[Europe/Berlin]", "operatesuntil" : "2019-12-31T23:59:00+01:00[Europe/Berlin]", "id" : "TestID", - "controlstrategy" : "no_control" + "connectedassets" : "", + "controlstrategy" : "self_optimization" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) when: Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) + new AssetInputEntityData(parameter, inputClass, operatorInput)) then: input.success @@ -87,28 +94,40 @@ class EmInputFactoryTest extends Specification { assert operationTime.endDate.get() == ZonedDateTime.parse(parameter["operatesuntil"]) assert operator == operatorInput assert id == parameter["id"] - assert controlStrategy == parameter["controlstrategy"] - assert parentEm == Optional.empty() + assert connectedAssets == [] as UUID[] + assert controlStrategy == EmControlStrategy.SELF_OPTIMIZATION } } - def "A EmInputFactory should fail when passing an invalid UUID"() { + def "A EmInputFactory should use a default control strategy if value cannot be parsed"() { given: def inputFactory = new EmInputFactory() Map parameter = [ - "uuid" : "- broken -", + "uuid" : "91ec3bcf-1777-4d38-af67-0bf7c9fa73c7", "id" : "TestID", - "controlstrategy" : "no_control" + "connectedassets" : "4e840ea0-fb72-422e-942f-4111312e9914", + "controlstrategy" : " -- invalid --" ] def inputClass = EmInput def operatorInput = Mock(OperatorInput) when: Try input = inputFactory.get( - new EmAssetInputEntityData(parameter, inputClass, operatorInput, null)) + new AssetInputEntityData(parameter, inputClass, operatorInput)) then: - input.failure - input.exception.get().cause.message == "Exception while trying to parse UUID of field \"uuid\" with value \"- broken -\"" + input.success + input.data.get().getClass() == inputClass + input.data.get().with { + assert uuid == UUID.fromString(parameter["uuid"]) + assert operationTime.startDate.empty + assert operationTime.endDate.empty + assert operator == operatorInput + assert id == parameter["id"] + assert connectedAssets == [ + UUID.fromString("4e840ea0-fb72-422e-942f-4111312e9914") + ] as UUID[] + assert controlStrategy == ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY + } } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy index b9c492de7..34a68ea5c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvInput @@ -45,12 +44,11 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(EvTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) then: input.success @@ -70,7 +68,6 @@ class EvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy index 7f59dedd2..10d2be4f1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/EvcsInputFactoryTest.groovy @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.input.participant import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.EvcsInput @@ -55,11 +55,10 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) then: input.success @@ -79,7 +78,6 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PowerSystemUnits.PU), Quantities.getQuantity(1d, PowerSystemUnits.PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == ChargingPointTypeUtils.HouseholdSocket assert chargingPoints == Integer.parseInt(parameter["chargingpoints"]) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) @@ -106,11 +104,10 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) then: input.failure @@ -135,11 +132,10 @@ class EvcsInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = EvcsInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) then: input.failure 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 e209d1f08..ff5ef36a1 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 @@ -8,8 +8,8 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput @@ -47,10 +47,9 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe def inputClass = FixedFeedInInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) when: - Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) then: input.success @@ -69,7 +68,6 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert sRated == getQuant(parameter["srated"], StandardUnits.S_RATED) assert cosPhiRated == Double.parseDouble(parameter["cosphirated"]) } @@ -86,10 +84,9 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe ] def inputClass = FixedFeedInInput def nodeInput = Mock(NodeInput) - def emUnit = Mock(EmInput) when: - Try input = inputFactory.get(new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) + Try input = inputFactory.get(new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) then: input.failure @@ -102,10 +99,6 @@ class FixedFeedInInputFactoryTest extends Specification implements FactoryTestHe "0: [cosphirated, id, qcharacteristics, srated, uuid]\n" + "1: [cosphirated, id, operatesfrom, qcharacteristics, srated, uuid]\n" + "2: [cosphirated, id, operatesuntil, qcharacteristics, srated, uuid]\n" + - "3: [cosphirated, id, operatesfrom, operatesuntil, qcharacteristics, srated, uuid]\n" + - "4: [cosphirated, em, id, qcharacteristics, srated, uuid]\n" + - "5: [cosphirated, em, id, operatesfrom, qcharacteristics, srated, uuid]\n" + - "6: [cosphirated, em, id, operatesuntil, qcharacteristics, srated, uuid]\n" + - "7: [cosphirated, em, id, operatesfrom, operatesuntil, qcharacteristics, srated, uuid]\n" + "3: [cosphirated, id, operatesfrom, operatesuntil, qcharacteristics, srated, uuid]\n" } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy index 550a088fc..a24587257 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/HpInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.HpInput @@ -46,13 +45,12 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = HpInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(HpTypeInput) def thermalBusInput = Mock(ThermalBusInput) when: Try input = inputFactory.get( - new HpInputEntityData(parameter, operatorInput, nodeInput, emUnit, typeInput, thermalBusInput)) + new HpInputEntityData(parameter, operatorInput, nodeInput, typeInput, thermalBusInput)) then: input.success @@ -72,7 +70,6 @@ class HpInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput assert thermalBus == thermalBusInput } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy index c0bc33bfa..910d59195 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/LoadInputFactoryTest.groovy @@ -8,9 +8,9 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.LoadInput @@ -38,7 +38,6 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { given: "a system participant input type factory and model data" def inputClass = LoadInput def nodeInput = Mock(NodeInput) - def emUnit = Mock(EmInput) when: def inputFactory = new LoadInputFactory() @@ -53,7 +52,7 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { "cosphirated" : "5" ] Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, nodeInput, emUnit)) + new NodeAssetInputEntityData(parameter, inputClass, nodeInput)) then: input.success @@ -70,7 +69,6 @@ class LoadInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert loadProfile == profile assert dsm assert eConsAnnual == getQuant(parameter["econsannual"], StandardUnits.ENERGY_IN) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy index 8ea8a4cf8..a3a6d42ae 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/PvInputFactoryTest.groovy @@ -8,8 +8,8 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.PvInput @@ -54,11 +54,10 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = PvInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) when: Try input = inputFactory.get( - new SystemParticipantEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit)) + new NodeAssetInputEntityData(parameter, inputClass, operatorInput, nodeInput)) then: input.success @@ -78,7 +77,6 @@ class PvInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert albedo == Double.parseDouble(parameter["albedo"]) assert azimuth == getQuant(parameter["azimuth"], StandardUnits.AZIMUTH) assert etaConv == getQuant(parameter["etaconv"], StandardUnits.EFFICIENCY) diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy index d20685662..453e294f2 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/StorageInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.StorageInput @@ -45,12 +44,11 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper def inputClass = StorageInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(StorageTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) then: input.success @@ -70,7 +68,6 @@ class StorageInputFactoryTest extends Specification implements FactoryTestHelper new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy index d258837ec..e97d47a09 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/input/participant/WecInputFactoryTest.groovy @@ -8,7 +8,6 @@ package edu.ie3.datamodel.io.factory.input.participant import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.WecInput @@ -46,12 +45,11 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { def inputClass = WecInput def nodeInput = Mock(NodeInput) def operatorInput = Mock(OperatorInput) - def emUnit = Mock(EmInput) def typeInput = Mock(WecTypeInput) when: Try input = inputFactory.get( - new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, emUnit, typeInput)) + new SystemParticipantTypedEntityData(parameter, inputClass, operatorInput, nodeInput, typeInput)) then: input.success @@ -70,7 +68,6 @@ class WecInputFactoryTest extends Specification implements FactoryTestHelper { new CharacteristicPoint(Quantities.getQuantity(0d, PU), Quantities.getQuantity(1d, PU)) ] as TreeSet) } - assert em == Optional.of(emUnit) assert type == typeInput assert marketReaction } diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index f34873c24..f3e89647b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.naming import edu.ie3.datamodel.io.source.TimeSeriesMappingSource -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -21,6 +20,7 @@ import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput import edu.ie3.datamodel.models.input.system.BmInput import edu.ie3.datamodel.models.input.system.ChpInput +import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.FixedFeedInInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy index 296be7a8c..5fffb0fa1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/ProcessorProviderTest.groovy @@ -11,7 +11,6 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.MeasurementUnitInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy index 0f25a83ba..ac2c24ab9 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/processor/input/InputEntityProcessorTest.groovy @@ -9,7 +9,6 @@ import static edu.ie3.util.quantities.PowerSystemUnits.PU import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.UniqueEntity import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.RandomLoadParameters @@ -144,10 +143,9 @@ class InputEntityProcessorTest extends Specification { def processingResult = processor.handleEntity(validInput) then: "make sure that the result is as expected " - processingResult.forEach { - k, v -> + processingResult.forEach { k, v -> if (k != "nodeInternal") // the internal 3w node is always randomly generated, hence we can skip to test on this - assert (v == expectedResult.get(k)) + assert (v == expectedResult.get(k)) } where: @@ -161,8 +159,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.fixedFeedInInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.fixedFeedInInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), - "em" : SystemParticipantTestData.fixedFeedInInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "sRated" : SystemParticipantTestData.fixedFeedInInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() ] PvInput | SystemParticipantTestData.pvInput || [ "uuid" : SystemParticipantTestData.pvInput.uuid.toString(), @@ -180,8 +177,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.pvInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.pvInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString(), - "em" : SystemParticipantTestData.pvInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "sRated" : SystemParticipantTestData.pvInput.sRated.to(StandardUnits.S_RATED).getValue().doubleValue().toString() ] WecInput | SystemParticipantTestData.wecInput || [ "uuid" : SystemParticipantTestData.wecInput.uuid.toString(), @@ -192,8 +188,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.wecInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.wecInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiPSerialized, - "type" : SystemParticipantTestData.wecInput.type.uuid.toString(), - "em" : SystemParticipantTestData.wecInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "type" : SystemParticipantTestData.wecInput.type.uuid.toString() ] ChpInput | SystemParticipantTestData.chpInput || [ "uuid" : SystemParticipantTestData.chpInput.uuid.toString(), @@ -207,7 +202,6 @@ class InputEntityProcessorTest extends Specification { "thermalBus" : SystemParticipantTestData.chpInput.thermalBus.uuid.toString(), "thermalStorage" : SystemParticipantTestData.chpInput.thermalStorage.uuid.toString(), "type" : SystemParticipantTestData.chpInput.type.uuid.toString(), - "em" : SystemParticipantTestData.chpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") ] BmInput | SystemParticipantTestData.bmInput || [ "uuid" : SystemParticipantTestData.bmInput.uuid.toString(), @@ -220,8 +214,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.bmInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.bmInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.qVSerialized, - "type" : SystemParticipantTestData.bmInput.type.uuid.toString(), - "em" : SystemParticipantTestData.bmInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "type" : SystemParticipantTestData.bmInput.type.uuid.toString() ] EvInput | SystemParticipantTestData.evInput || [ "uuid" : SystemParticipantTestData.evInput.uuid.toString(), @@ -231,8 +224,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.evInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.evInput.operator.getUuid().toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.evInput.type.getUuid().toString(), - "em" : SystemParticipantTestData.evInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "type" : SystemParticipantTestData.evInput.type.getUuid().toString() ] LoadInput | SystemParticipantTestData.loadInput || [ @@ -247,8 +239,7 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.loadInput.operator.uuid.toString(), "qCharacteristics" : SystemParticipantTestData.cosPhiFixedSerialized, "sRated" : SystemParticipantTestData.loadInput.sRated.getValue().doubleValue().toString(), - "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key, - "em" : SystemParticipantTestData.loadInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "loadProfile" : SystemParticipantTestData.loadInput.loadProfile.key ] StorageInput | SystemParticipantTestData.storageInput || [ "uuid" : SystemParticipantTestData.storageInput.uuid.toString(), @@ -258,8 +249,7 @@ class InputEntityProcessorTest extends Specification { "operatesFrom" : SystemParticipantTestData.storageInput.operationTime.startDate.orElse(ZonedDateTime.now()).toString(), "operator" : SystemParticipantTestData.storageInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, - "type" : SystemParticipantTestData.storageInput.type.uuid.toString(), - "em" : SystemParticipantTestData.storageInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "type" : SystemParticipantTestData.storageInput.type.uuid.toString() ] HpInput | SystemParticipantTestData.hpInput || [ "uuid" : SystemParticipantTestData.hpInput.uuid.toString(), @@ -270,8 +260,7 @@ class InputEntityProcessorTest extends Specification { "operator" : SystemParticipantTestData.hpInput.operator.uuid.toString(), "qCharacteristics": SystemParticipantTestData.cosPhiFixedSerialized, "thermalBus" : SystemParticipantTestData.hpInput.thermalBus.uuid.toString(), - "type" : SystemParticipantTestData.hpInput.type.uuid.toString(), - "em" : SystemParticipantTestData.hpInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "type" : SystemParticipantTestData.hpInput.type.uuid.toString() ] EvcsInput | SystemParticipantTestData.evcsInput || [ "uuid" : SystemParticipantTestData.evcsInput.uuid.toString(), @@ -285,8 +274,7 @@ class InputEntityProcessorTest extends Specification { "cosPhiRated" : SystemParticipantTestData.evcsInput.cosPhiRated.toString(), "chargingPoints" : SystemParticipantTestData.evcsInput.chargingPoints.toString(), "locationType" : SystemParticipantTestData.evcsInput.locationType.name(), - "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString(), - "em" : SystemParticipantTestData.evcsInput.em.map((UniqueEntity::getUuid).andThen(UUID::toString)).orElse("") + "v2gSupport" : SystemParticipantTestData.evcsInput.v2gSupport.toString() ] } @@ -366,18 +354,18 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(RandomLoadParameters) RandomLoadParameters parameters = new RandomLoadParameters( - UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), - 4, - 1.2, - 2.3, - 3.4, - 4.5, - 5.6, - 6.7, - 7.8, - 8.9, - 9.10 - ) + UUID.fromString("a5b0f432-27b5-4b3e-b87a-61867b9edd79"), + 4, + 1.2, + 2.3, + 3.4, + 4.5, + 5.6, + 6.7, + 7.8, + 8.9, + 9.10 + ) Map expected = [ "uuid" : "a5b0f432-27b5-4b3e-b87a-61867b9edd79", "quarterHour": "4", @@ -629,14 +617,14 @@ class InputEntityProcessorTest extends Specification { given: InputEntityProcessor processor = new InputEntityProcessor(NodeInput) def nodeWithOutOperator = new NodeInput( - UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, - OperationTime.notLimited() - , - Quantities.getQuantity(1d, PU), - false, - null, - GermanVoltageLevelUtils.MV_20KV, - 4) + UUID.fromString("6e0980e0-10f2-4e18-862b-eb2b7c90509b"), "node_d", OperatorInput.NO_OPERATOR_ASSIGNED, + OperationTime.notLimited() + , + Quantities.getQuantity(1d, PU), + false, + null, + GermanVoltageLevelUtils.MV_20KV, + 4) Map expected = [ "geoPosition" : "", diff --git a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy index 21c527359..6c98e7b53 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -17,7 +17,6 @@ import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.connector.LineInput @@ -26,6 +25,7 @@ import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput import edu.ie3.datamodel.models.input.graphics.LineGraphicInput import edu.ie3.datamodel.models.input.graphics.NodeGraphicInput +import edu.ie3.datamodel.models.input.system.EmInput import edu.ie3.datamodel.models.input.system.EvcsInput import edu.ie3.datamodel.models.input.system.LoadInput import edu.ie3.datamodel.models.input.system.PvInput @@ -45,6 +45,7 @@ import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.Value +import edu.ie3.test.common.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SampleJointGrid import edu.ie3.test.common.SystemParticipantTestData @@ -170,7 +171,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { ThermalUnitInputTestData.thermalHouseInput, SystemParticipantTestData.evcsInput, SystemParticipantTestData.loadInput, - SystemParticipantTestData.emInput + EnergyManagementTestData.emInput ]) csvFileSink.shutdown() @@ -251,7 +252,6 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { OperationTime.notLimited(), Mock(NodeInput), new CosPhiFixed("cosPhiFixed:{(0.0,0.95)}"), - Mock(EmInput), 0.2, Quantities.getQuantity(-8.926613807678223, DEGREE_GEOM), Quantities.getQuantity(95d, PERCENT), diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy deleted file mode 100644 index 288c6be0a..000000000 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EnergyManagementSourceTest.groovy +++ /dev/null @@ -1,284 +0,0 @@ -/* - * © 2024. TU Dortmund University, - * Institute of Energy Systems, Energy Efficiency and Energy Economics, - * Research group Distribution grid planning and operation - */ -package edu.ie3.datamodel.io.source - -import static edu.ie3.test.helper.EntityMap.map - -import edu.ie3.datamodel.exceptions.FactoryException -import edu.ie3.datamodel.exceptions.SourceException -import edu.ie3.datamodel.io.factory.input.AssetInputEntityData -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.datamodel.utils.Try -import spock.lang.Specification - -import java.util.stream.Stream - -class EnergyManagementSourceTest extends Specification { - - def "An EnergyManagementSource should construct hierarchical EmInputs with two branches as expected"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-0", - "id": "root", - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "child 1", - "parentem" : "0-0-0-0-0", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-11", - "id": "child 1-1", - "parentem" : "0-0-0-0-1", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "child 2", - "parentem" : "0-0-0-0-0", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-21", - "id": "child 2-1", - "parentem" : "0-0-0-0-2", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - expect: - def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) - - def expectedRootEm = new EmInput( - UUID.fromString("0-0-0-0-0"), - "root", - "", - null - ) - def expectedEm1 = new EmInput( - UUID.fromString("0-0-0-0-1"), - "child 1", - "", - expectedRootEm - ) - def expectedEm11 = new EmInput( - UUID.fromString("0-0-0-0-11"), - "child 1-1", - "", - expectedEm1 - ) - def expectedEm2 = new EmInput( - UUID.fromString("0-0-0-0-2"), - "child 2", - "", - expectedRootEm - ) - def expectedEm21 = new EmInput( - UUID.fromString("0-0-0-0-21"), - "child 2-1", - "", - expectedEm2 - ) - - emUnits == map([expectedRootEm, expectedEm1, expectedEm11, expectedEm2, expectedEm21]) - } - - def "An EnergyManagementSource should construct flat EmInputs without hierarchy as expected"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "parentem" : "", - "controlstrategy" : "strat_b"], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-3", - "id": "em 3", - "parentem" : "", - "controlstrategy" : "other"], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - expect: - def emUnits = EnergyManagementSource.createEmInputs(assetEntityDataStream) - - def expectedEm1 = new EmInput( - UUID.fromString("0-0-0-0-1"), - "em 1", - "", - null - ) - def expectedEm2 = new EmInput( - UUID.fromString("0-0-0-0-2"), - "em 2", - "strat_b", - null - ) - def expectedEm3 = new EmInput( - UUID.fromString("0-0-0-0-3"), - "em 3", - "other", - null - ) - - emUnits == map([expectedEm1, expectedEm2, expectedEm3]) - } - - def "An EnergyManagementSource should fail if any entity data already failed before"() { - given: - def assetEntityDataStream = Stream.of( - new Try.Success(new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "", - "controlstrategy" : ""], - EmInput - )), - new Try.Success(new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "parentem" : "", - "controlstrategy" : ""], - EmInput - )), - new Try.Failure(new SourceException("test failure abc")) - ) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.cause.message.contains("test failure abc") - } - - def "An EnergyManagementSource should fail if a parent EM UUID is malformed"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "parentem" : "not-a-uuid", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.cause.message.contains("Exception while trying to parse UUID of field \"parentem\" with value \"not-a-uuid\"") - } - - def "An EnergyManagementSource should fail if the factory fails for one EM"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", // id is missing - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.cause.message.contains("An error occurred when creating instance of EmInput") - exc.cause.cause.class == FactoryException - } - - def "An EnergyManagementSource should fail if a parent em is not provided"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "", - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "parentem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.message.contains("were assigned a parent EM that does not exist.") - } - - def "An EnergyManagementSource should fail if no parent ems are provided"() { - given: - def assetEntityDataStream = Stream.of( - new AssetInputEntityData( - ["uuid": "0-0-0-0-1", - "id": "em 1", - "parentem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - new AssetInputEntityData( - ["uuid": "0-0-0-0-2", - "id": "em 2", - "parentem" : "1-2-3-4-5", // does not exist - "controlstrategy" : ""], - EmInput - ), - ).map(data -> Try.of(() -> data, SourceException)) - - when: - EnergyManagementSource.createEmInputs(assetEntityDataStream) - - then: - def exc = thrown(SourceException) - exc.message.contains("were assigned a parent EM that does not exist.") - } -} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy index 076bd98a2..8e6fc4f4d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/EntitySourceTest.groovy @@ -15,7 +15,6 @@ import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.io.source.csv.CsvDataSource import edu.ie3.datamodel.models.input.AssetInput -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.type.ChpTypeInput @@ -77,7 +76,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : sptd.thermalStorage.uuid.toString() ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -95,7 +94,7 @@ class EntitySourceTest extends Specification { "t_bus" : sptd.thermalBus.uuid.toString(), "t_storage" : "8851813b-3a7d-4fee-874b-4df9d724e4b4" ] - def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, null, sptd.chpTypeInput) + def entityData = new SystemParticipantTypedEntityData(parameter, ChpInput, sptd.participantNode, sptd.chpTypeInput) Map busMap = map([sptd.thermalBus]) Map storageMap = map([sptd.thermalStorage]) @@ -111,34 +110,34 @@ class EntitySourceTest extends Specification { def "An EntitySource should find a linked entity, if it was provided"() { given: Map parameter = [ - "linked_entity" : sptd.emInput.uuid.toString(), + "linked_entity" : sptd.chpTypeInput.uuid.toString(), ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.emInput]) + Map entityMap = map([sptd.chpTypeInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) then: - result == new Try.Success(sptd.emInput) + result == new Try.Success(sptd.chpTypeInput) } def "An EntitySource trying to find a linked entity should fail, if no matching linked entity was provided"() { given: Map parameter = [ - "linked_entity" : sptd.parentEm.uuid.toString(), + "linked_entity" : "5ebd8f7e-dedb-4017-bb86-6373c4b60000", ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.emInput]) + Map entityMap = map([sptd.chpTypeInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) then: result.isFailure() - result.getException().get().message == "Linked linked_entity with UUID 897bfc17-8e54-43d0-8d98-740786fd94dd was not found for entity EntityData{fieldsToAttributes={linked_entity=897bfc17-8e54-43d0-8d98-740786fd94dd}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" + result.getException().get().message == "Linked linked_entity with UUID 5ebd8f7e-dedb-4017-bb86-6373c4b60000 was not found for entity EntityData{fieldsToAttributes={linked_entity=5ebd8f7e-dedb-4017-bb86-6373c4b60000}, targetClass=class edu.ie3.datamodel.models.input.AssetInput}" } def "An EntitySource trying to find a linked entity should fail, if corresponding UUID is malformed"() { @@ -148,7 +147,7 @@ class EntitySourceTest extends Specification { ] def entityData = new EntityData(parameter, AssetInput) - Map entityMap = map([sptd.emInput]) + Map entityMap = map([sptd.chpTypeInput]) when: def result = dummyEntitySource.getLinkedEntity(entityData, "linked_entity", entityMap) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy index 57e7a5566..402b657be 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/SystemParticipantSourceTest.groovy @@ -10,7 +10,6 @@ import static edu.ie3.test.helper.EntityMap.map import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData import edu.ie3.datamodel.io.factory.input.participant.ChpInputEntityData import edu.ie3.datamodel.io.factory.input.participant.HpInputEntityData -import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantEntityData import edu.ie3.datamodel.io.factory.input.participant.SystemParticipantTypedEntityData import edu.ie3.datamodel.models.input.system.ChpInput import edu.ie3.datamodel.models.input.system.HpInput @@ -24,33 +23,9 @@ import java.util.stream.Stream class SystemParticipantSourceTest extends Specification { - def "A SystemParticipantSource should build system participant entity from valid and invalid input data as expected"() { - given: - def nodeAssetInputEntityData = Stream.of(new Try.Success<>(new NodeAssetInputEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node))) - - when: - def sysPartEntityDataStream = SystemParticipantSource.systemParticipantEntityStream(nodeAssetInputEntityData, map(emUnits)) - - then: - def element = sysPartEntityDataStream.findFirst().get() - element.success == resultIsPresent - element.data.ifPresent({ - typedEntityData -> - assert (typedEntityData == resultData) - }) - - where: - emUnits | fieldsToAttributes || resultIsPresent || resultData - [] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || false || null - [SystemParticipantTestData.emInput] | ["bla": "foo"] || true || new SystemParticipantEntityData(["bla": "foo"], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) - [SystemParticipantTestData.emInput] | [:] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null) - [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778793"] || false || null - [SystemParticipantTestData.emInput] | ["em": "977157f4-25e5-4c72-bf34-440edc778792"] || true || new SystemParticipantEntityData([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput) - } - def "A SystemParticipantSource should build typed entity from valid and invalid input data as expected"() { given: - def systemParticipantEntityData = Stream.of(new Try.Success<>(new SystemParticipantEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null))) + def systemParticipantEntityData = Stream.of(new Try.Success<>(new NodeAssetInputEntityData(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node))) when: def typedEntityDataStream = SystemParticipantSource.typedSystemParticipantEntityStream(systemParticipantEntityData, map(types)) @@ -69,12 +44,12 @@ class SystemParticipantSourceTest extends Specification { [SystemParticipantTestData.chpTypeInput] | ["bla": "foo"] || false || null [SystemParticipantTestData.chpTypeInput] | [:] || false || null [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb9"] || false || null - [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || new SystemParticipantTypedEntityData<>([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, null, SystemParticipantTestData.chpTypeInput) + [SystemParticipantTestData.chpTypeInput] | ["type": "5ebd8f7e-dedb-4017-bb86-6373c4b68eb8"] || true || new SystemParticipantTypedEntityData<>([:], ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput) } def "A SystemParticipantSource should build hp input entity from valid and invalid input data as expected"() { given: - def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput))) + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, HpInput, SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.hpTypeInput))) when: def hpInputEntityDataOpt = SystemParticipantSource.hpEntityStream(sysPartTypedEntityData, map(thermalBuses)) @@ -93,12 +68,12 @@ class SystemParticipantSourceTest extends Specification { [SystemParticipantTestData.hpInput.thermalBus] | ["bla": "foo"] || false || null [SystemParticipantTestData.hpInput.thermalBus] | [:] || false || null [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384f"] || false || null - [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.hpTypeInput, SystemParticipantTestData.hpInput.thermalBus) + [SystemParticipantTestData.hpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e"] || true || new HpInputEntityData([:], SystemParticipantTestData.hpInput.operator, SystemParticipantTestData.hpInput.node, SystemParticipantTestData.hpTypeInput, SystemParticipantTestData.hpInput.thermalBus) } def "A SystemParticipantSource should build chp input entity from valid and invalid input data as expected"(List thermalStorages, List thermalBuses, Map fieldsToAttributes, boolean resultIsPresent, ChpInputEntityData resultData) { given: - def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput))) + def sysPartTypedEntityData = Stream.of(new Try.Success<>(new SystemParticipantTypedEntityData<>(fieldsToAttributes, ChpInput, SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput))) when: def hpInputEntityDataOpt = SystemParticipantSource.chpEntityStream(sysPartTypedEntityData, map(thermalStorages), map(thermalBuses)) @@ -116,6 +91,6 @@ class SystemParticipantSourceTest extends Specification { [] | [] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || false | null [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["bla": "foo"] || false | null [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | [:] || false | null - [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.emInput, SystemParticipantTestData.chpTypeInput, SystemParticipantTestData.chpInput.thermalBus, SystemParticipantTestData.chpInput.thermalStorage) + [SystemParticipantTestData.chpInput.thermalStorage] | [SystemParticipantTestData.chpInput.thermalBus] | ["thermalBus": "0d95d7f2-49fb-4d49-8636-383a5220384e", "thermalStorage": "8851813b-3a7d-4fee-874b-4df9d724e4b3"] || true | new ChpInputEntityData([:], SystemParticipantTestData.chpInput.operator, SystemParticipantTestData.chpInput.node, SystemParticipantTestData.chpTypeInput, SystemParticipantTestData.chpInput.thermalBus, SystemParticipantTestData.chpInput.thermalStorage) } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy index 7f5cb7124..15e528a93 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvEnergyManagementSourceTest.groovy @@ -12,7 +12,7 @@ import edu.ie3.datamodel.io.source.EnergyManagementSource import edu.ie3.datamodel.io.source.TypeSource import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.utils.Try -import edu.ie3.test.common.SystemParticipantTestData +import edu.ie3.test.common.EnergyManagementTestData import spock.lang.Specification class CsvEnergyManagementSourceTest extends Specification implements CsvTestDataMeta { @@ -23,13 +23,13 @@ class CsvEnergyManagementSourceTest extends Specification implements CsvTestData Mock(TypeSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - Map operatorMap = map([SystemParticipantTestData.emInput.operator]) + Map operatorMap = map([EnergyManagementTestData.emInput.operator]) expect: def emUnits = Try.of(() -> csvEnergyManagementSource.getEmUnits(operatorMap), SourceException) emUnits.success - emUnits.data.get().size() == 2 - emUnits.data.get() == map([SystemParticipantTestData.emInput, SystemParticipantTestData.parentEm]) + emUnits.data.get().emUnits.size() == 1 + emUnits.data.get().emUnits == [EnergyManagementTestData.emInput] as Set } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy index 8d1bd118d..cfb0cfb4b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvSystemParticipantSourceTest.groovy @@ -10,7 +10,6 @@ import static edu.ie3.test.helper.EntityMap.map import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.exceptions.SystemParticipantsException import edu.ie3.datamodel.io.source.* -import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.system.* import edu.ie3.datamodel.utils.Try @@ -24,12 +23,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat def typeSource = new TypeSource(new CsvDataSource(csvSep, typeFolderPath, fileNamingStrategy)) def thermalSource = new ThermalSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def rawGridSource = new RawGridSource(typeSource, new CsvDataSource(csvSep, gridDefaultFolderPath, fileNamingStrategy)) - def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, - energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -62,12 +59,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat getNodes() >> [:] getNodes(_) >> [:] } as RawGridSource - def energyManagementSource = new EnergyManagementSource(typeSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def csvSystemParticipantSource = new SystemParticipantSource( typeSource, thermalSource, rawGridSource, - energyManagementSource, new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) when: @@ -91,13 +86,11 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.hpInput.node]) - def emUnitsMap = map([sptd.emInput]) expect: - def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses)), SourceException) + def heatPumps = Try.of(() -> csvSystemParticipantSource.getHeatPumps(map(operators), nodeMap, map(types), map(thermalBuses)), SourceException) if (heatPumps.success) { heatPumps.data.get().size() == resultingSize @@ -110,7 +103,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators | types | thermalBuses || resultingSize | resultingSet [sptd.hpInput.node] | [sptd.hpInput.operator] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [sptd.hpInput] [sptd.hpInput.node] | [] | [sptd.hpInput.type] | [sptd.hpInput.thermalBus] || 1 | [ - new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.emInput, sptd.hpInput.type) + new HpInput(sptd.hpInput.uuid, sptd.hpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.hpInput.operationTime, sptd.hpInput.node, sptd.hpInput.thermalBus, sptd.hpInput.qCharacteristics, sptd.hpInput.type) ] [] | [] | [] | [] || 0 | [] [sptd.hpInput.node] | [] | [] | [] || 0 | [] @@ -124,13 +117,11 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) def nodeMap = map([sptd.hpInput.node]) - def emUnitsMap = map([sptd.emInput]) expect: - def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(map(operators), nodeMap, emUnitsMap, map(types), map(thermalBuses), map(thermalStorages)), SourceException) + def chpUnits = Try.of(() -> csvSystemParticipantSource.getChpPlants(map(operators), nodeMap, map(types), map(thermalBuses), map(thermalStorages)), SourceException) if (chpUnits.success) { chpUnits.data.get().size() == resultingSize @@ -143,7 +134,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat operators | types | thermalBuses | thermalStorages || resultingSize || resultingSet [sptd.chpInput.operator] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || 1 || [sptd.chpInput] [] | [sptd.chpInput.type] | [sptd.chpInput.thermalBus] | [sptd.chpInput.thermalStorage] || 1 || [ - new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.emInput, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction) + new ChpInput(sptd.chpInput.uuid, sptd.chpInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.chpInput.operationTime, sptd.chpInput.node, sptd.chpInput.thermalBus, sptd.chpInput.qCharacteristics, sptd.chpInput.type, sptd.chpInput.thermalStorage, sptd.chpInput.marketReaction) ] [] | [] | [] | [] || 0 || [] [] | [] | [] | [] || 0 || [] @@ -157,12 +148,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvs(map(operators), map(nodes), map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -175,7 +164,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators | types || resultingSize || resultingSet [sptd.evInput.node] | [sptd.evInput.operator] | [sptd.evInput.type] || 1 || [sptd.evInput] [sptd.evInput.node] | [] | [sptd.evInput.type] || 1 || [ - new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.emInput, sptd.evInput.type) + new EvInput(sptd.evInput.uuid, sptd.evInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evInput.operationTime, sptd.evInput.node, sptd.evInput.qCharacteristics, sptd.evInput.type) ] [sptd.evInput.node] | [sptd.evInput.operator] | [] || 0 || [] [sptd.evInput.node] | [] | [] || 0 || [] @@ -188,12 +177,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getWecPlants(map(operators), map(nodes), map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -206,7 +193,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators | types || resultingSize || resultingSet [sptd.wecInput.node] | [sptd.wecInput.operator] | [sptd.wecInput.type] || 1 || [sptd.wecInput] [sptd.wecInput.node] | [] | [sptd.wecInput.type] || 1 || [ - new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.emInput, sptd.wecInput.type, sptd.wecInput.marketReaction) + new WecInput(sptd.wecInput.uuid, sptd.wecInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.wecInput.operationTime, sptd.wecInput.node, sptd.wecInput.qCharacteristics, sptd.wecInput.type, sptd.wecInput.marketReaction) ] [sptd.wecInput.node] | [sptd.wecInput.operator] | [] || 0 || [] [sptd.wecInput.node] | [] | [] || 0 || [] @@ -219,12 +206,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getStorages(map(operators), map(nodes), map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -237,7 +222,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators | types || resultingSize || resultingSet [sptd.storageInput.node] | [sptd.storageInput.operator] | [sptd.storageInput.type] || 1 || [sptd.storageInput] [sptd.storageInput.node] | [] | [sptd.storageInput.type] || 1 || [ - new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.emInput, sptd.storageInput.type) + new StorageInput(sptd.storageInput.uuid, sptd.storageInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.storageInput.operationTime, sptd.storageInput.node, sptd.storageInput.qCharacteristics, sptd.storageInput.type) ] [sptd.storageInput.node] | [sptd.storageInput.operator] | [] || 0 || [] [sptd.storageInput.node] | [] | [] || 0 || [] @@ -250,12 +235,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(map(operators), map(nodes), emUnitsMap, map(types)), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getBmPlants(map(operators), map(nodes), map(types)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -268,7 +251,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators | types || resultingSize || resultingSet [sptd.bmInput.node] | [sptd.bmInput.operator] | [sptd.bmInput.type] || 1 || [sptd.bmInput] [sptd.bmInput.node] | [] | [sptd.bmInput.type] || 1 || [ - new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.emInput, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff) + new BmInput(sptd.bmInput.uuid, sptd.bmInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.bmInput.operationTime, sptd.bmInput.node, sptd.bmInput.qCharacteristics, sptd.bmInput.type, sptd.bmInput.marketReaction, sptd.bmInput.costControlled, sptd.bmInput.feedInTariff) ] [sptd.bmInput.node] | [sptd.bmInput.operator] | [] || 0 || [] [sptd.bmInput.node] | [] | [] || 0 || [] @@ -281,12 +264,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(map(operators), map(nodes), emUnitsMap), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getEvcs(map(operators), map(nodes)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -299,7 +280,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators || resultingSize || resultingSet [sptd.evcsInput.node] | [sptd.evcsInput.operator] || 1 || [sptd.evcsInput] [sptd.evcsInput.node] | [] || 1 || [ - new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.emInput, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport) + new EvcsInput(sptd.evcsInput.uuid, sptd.evcsInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.evcsInput.operationTime, sptd.evcsInput.node, sptd.evcsInput.qCharacteristics, sptd.evcsInput.type, sptd.evcsInput.chargingPoints, sptd.evcsInput.cosPhiRated, sptd.evcsInput.locationType, sptd.evcsInput.v2gSupport) ] [] | [sptd.evcsInput.operator] || 0 || [] [] | [] || 0 || [] @@ -311,12 +292,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(map(operators), map(nodes), emUnitsMap), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getLoads(map(operators), map(nodes)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -329,7 +308,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators || resultingSize || resultingSet [sptd.loadInput.node] | [sptd.loadInput.operator] || 1 || [sptd.loadInput] [sptd.loadInput.node] | [] || 1 || [ - new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.emInput, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated) + new LoadInput(sptd.loadInput.uuid, sptd.loadInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.loadInput.operationTime, sptd.loadInput.node, sptd.loadInput.qCharacteristics, sptd.loadInput.loadProfile, sptd.loadInput.dsm, sptd.loadInput.eConsAnnual, sptd.loadInput.sRated, sptd.loadInput.cosPhiRated) ] [] | [sptd.loadInput.operator] || 0 || [] [] | [] || 0 || [] @@ -341,12 +320,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(map(operators), map(nodes), emUnitsMap), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getPvPlants(map(operators), map(nodes)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -359,7 +336,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators || resultingSize || resultingSet [sptd.pvInput.node] | [sptd.pvInput.operator] || 1 || [sptd.pvInput] [sptd.pvInput.node] | [] || 1 || [ - new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.emInput, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated) + new PvInput(sptd.pvInput.uuid, sptd.pvInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.pvInput.operationTime, sptd.pvInput.node, sptd.pvInput.qCharacteristics, sptd.pvInput.albedo, sptd.pvInput.azimuth, sptd.pvInput.etaConv, sptd.pvInput.elevationAngle, sptd.pvInput.kG, sptd.pvInput.kT, sptd.pvInput.marketReaction, sptd.pvInput.sRated, sptd.pvInput.cosPhiRated) ] [] | [sptd.pvInput.operator] || 0 || [] [] | [] || 0 || [] @@ -371,12 +348,10 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat Mock(TypeSource), Mock(ThermalSource), Mock(RawGridSource), - Mock(EnergyManagementSource), new CsvDataSource(csvSep, participantsFolderPath, fileNamingStrategy)) - def emUnitsMap = map([sptd.emInput]) expect: - def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(map(operators), map(nodes), emUnitsMap), SourceException) + def sysParts = Try.of(() -> csvSystemParticipantSource.getFixedFeedIns(map(operators), map(nodes)), SourceException) if (sysParts.success) { sysParts.data.get().size() == resultingSize @@ -389,7 +364,7 @@ class CsvSystemParticipantSourceTest extends Specification implements CsvTestDat nodes | operators || resultingSize || resultingSet [sptd.fixedFeedInInput.node] | [sptd.fixedFeedInInput.operator] || 1 || [sptd.fixedFeedInInput] [sptd.fixedFeedInInput.node] | [] || 1 || [ - new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.emInput, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated) + new FixedFeedInInput(sptd.fixedFeedInInput.uuid, sptd.fixedFeedInInput.id, OperatorInput.NO_OPERATOR_ASSIGNED, sptd.fixedFeedInInput.operationTime, sptd.fixedFeedInInput.node, sptd.fixedFeedInInput.qCharacteristics, sptd.fixedFeedInInput.sRated, sptd.fixedFeedInInput.cosPhiRated) ] [] | [sptd.fixedFeedInInput.operator] || 0 || [] [] | [] || 0 || [] diff --git a/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy new file mode 100644 index 000000000..ea13b2f35 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/EmControlStrategyTest.groovy @@ -0,0 +1,45 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models + +import edu.ie3.datamodel.exceptions.FactoryException +import edu.ie3.datamodel.io.factory.input.NodeAssetInputEntityData +import edu.ie3.datamodel.io.factory.input.participant.FixedFeedInInputFactory +import edu.ie3.datamodel.models.input.NodeInput +import edu.ie3.datamodel.models.input.system.FixedFeedInInput +import spock.lang.Specification + +import java.util.stream.Collectors + +class EmControlStrategyTest extends Specification { + + def "An em control strategy should be gotten by their key"() { + given: + EmControlStrategy actual = EmControlStrategy.get(key) + + expect: + actual == expected + + where: + key || expected + EmControlStrategy.SELF_OPTIMIZATION.getKey() || EmControlStrategy.SELF_OPTIMIZATION + } + + def "An em control strategy should throw an exception when calling get on unkown key"() { + given: + String unknownKey = "nobody_knows_me" + + when: + EmControlStrategy _ = EmControlStrategy.get(unknownKey) + + then: + IllegalArgumentException ex = thrown() + ex.message == "No predefined energy management control strategy '" + + unknownKey + + "' found. Please provide one of the following keys: " + + Arrays.stream(EmControlStrategy.values()).map(EmControlStrategy::getKey).collect(Collectors.joining(", ")) + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy new file mode 100644 index 000000000..7bb2e6902 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/EnergyManagementUnitsTest.groovy @@ -0,0 +1,29 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.datamodel.models.input.container + +import edu.ie3.test.common.EnergyManagementTestData +import spock.lang.Specification + +class EnergyManagementUnitsTest extends Specification { + + def "An EnergyManagementUnits' copy method should work as expected"() { + given: + def energyManagementUnits = new EnergyManagementUnits( + Collections.singleton(EnergyManagementTestData.emInput) + ) + + def modifiedEmInput = EnergyManagementTestData.emInput.copy().id("modified").build() + + when: + def modifiedEnergyManagementUnits = energyManagementUnits.copy() + .emUnits(Set.of(modifiedEmInput)) + .build() + + then: + modifiedEnergyManagementUnits.emUnits.first() == modifiedEmInput + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy index 5b8147f20..21bc87957 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/container/JointGridContainerTest.groovy @@ -5,8 +5,10 @@ */ package edu.ie3.datamodel.models.input.container +import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants +import edu.ie3.test.common.EnergyManagementTestData import edu.ie3.test.common.GridTestData import edu.ie3.test.common.SystemParticipantTestData import spock.lang.Specification @@ -29,7 +31,7 @@ class JointGridContainerTest extends Specification { def "A single subgrid can be used to build a JointGridContainer"() { when: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) then: noExceptionThrown() @@ -38,9 +40,10 @@ class JointGridContainerTest extends Specification { def "A JointGridContainer's copy method should work as expected"() { given: - def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, GRAPHIC_ELEMENTS) + def jointGridContainer = new JointGridContainer(GRID_NAME, RAW_GRID, emptySystemParticipants, emptyEnergyManagementUnits, GRAPHIC_ELEMENTS) def rawGrid = new RawGridElements(List.of(GridTestData.lineAtoB, GridTestData.transformerAtoBtoC)) def systemParticipants = new SystemParticipants(List.of(SystemParticipantTestData.bmInput)) + def emUnits = new EnergyManagementUnits(Set.of(EnergyManagementTestData.emInput)) def graphics = new GraphicElements(Set.of(GridTestData.nodeGraphicD), Set.of(GridTestData.lineGraphicCtoD)) when: @@ -48,6 +51,7 @@ class JointGridContainerTest extends Specification { .gridName("new grid name") .rawGrid(rawGrid) .systemParticipants(systemParticipants) + .emUnits(emUnits) .graphics(graphics) .build() @@ -55,6 +59,7 @@ class JointGridContainerTest extends Specification { modifiedJointGridContainer.gridName == "new grid name" modifiedJointGridContainer.rawGrid == rawGrid modifiedJointGridContainer.systemParticipants == systemParticipants + modifiedJointGridContainer.emUnits == emUnits modifiedJointGridContainer.graphics == graphics } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy index 6088e7218..877a35be1 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/BmInputTest.groovy @@ -33,7 +33,6 @@ class BmInputTest extends Specification { assert qCharacteristics == bmInput.qCharacteristics assert feedInTariff == Quantities.getQuantity(15, EURO_PER_MEGAWATTHOUR) assert type == SystemParticipantTestData.bmTypeInput - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy index b21f73dfe..69dcb4f92 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/ChpInputTest.groovy @@ -29,7 +29,6 @@ class ChpInputTest extends Specification { assert thermalStorage == SystemParticipantTestData.thermalStorage assert marketReaction assert type == SystemParticipantTestData.chpTypeInput - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy index 3c1c6f706..755699e22 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EmInputTest.groovy @@ -5,8 +5,10 @@ */ package edu.ie3.datamodel.models.input.system -import edu.ie3.datamodel.models.input.EmInput -import edu.ie3.test.common.SystemParticipantTestData +import static edu.ie3.datamodel.models.ControlStrategy.DefaultControlStrategies.NO_CONTROL_STRATEGY + +import edu.ie3.datamodel.models.ControlStrategy +import edu.ie3.test.common.EnergyManagementTestData import spock.lang.Specification class EmInputTest extends Specification { @@ -16,68 +18,67 @@ class EmInputTest extends Specification { def emInput = new EmInput( UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), "test_emInput", - SystemParticipantTestData.emControlStrategy, - SystemParticipantTestData.parentEm + EnergyManagementTestData.connectedAssets, + EnergyManagementTestData.emControlStrategy ) then: emInput.with { assert uuid == UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792") assert id == "test_emInput" - assert controlStrategy == SystemParticipantTestData.emControlStrategy + assert connectedAssets == EnergyManagementTestData.connectedAssets + assert controlStrategy.key == EnergyManagementTestData.emControlStrategy } } def "EmInputs are comparable"() { given: - def emInputA = SystemParticipantTestData.emInput + def emInputA = EnergyManagementTestData.emInput expect: (emInputA == emInputB) == isEqual where: - emInputB || isEqual - SystemParticipantTestData.emInput || true - SystemParticipantTestData.emInput.copy().build() || true - SystemParticipantTestData.emInput.copy().id("otherId").build() || false + emInputB || isEqual + EnergyManagementTestData.emInput || true + EnergyManagementTestData.emInput.copy().build() || true + EnergyManagementTestData.emInput.copy().id("otherId").build() || false } def "The EmInput to String method work as expected"() { given: - def emInputToString = SystemParticipantTestData.emInput.toString() + def emInputToString = EnergyManagementTestData.emInput.toString() expect: emInputToString == "EmInput{" + "uuid=" + - SystemParticipantTestData.emInput.uuid + + EnergyManagementTestData.emInput.uuid + ", id='" + - SystemParticipantTestData.emInput.id + + EnergyManagementTestData.emInput.id + ", operator=" + - SystemParticipantTestData.emInput.operator.uuid + + EnergyManagementTestData.emInput.operator.uuid + ", operationTime=" + - SystemParticipantTestData.emInput.operationTime + + EnergyManagementTestData.emInput.operationTime + + ", connectedAssets=" + + Arrays.toString(EnergyManagementTestData.emInput.connectedAssets) + ", controlStrategy=" + - SystemParticipantTestData.emInput.controlStrategy + - ", parentEm=" + - SystemParticipantTestData.parentEm.uuid + + EnergyManagementTestData.emInput.controlStrategy + '}' } def "A EmInput copy method should work as expected"() { given: - def emInput = SystemParticipantTestData.emInput - def newStrat = "new_strat" - def givenParentEm = new EmInput( - UUID.fromString("cfc0639b-65bc-47e5-a8e5-82703de3c650"), - "testParent", - "controlStrat", - null - ) + def emInput = EnergyManagementTestData.emInput + def newConnectedAssets = [ + UUID.randomUUID(), + UUID.randomUUID() + ] as UUID[] + when: - def alteredUnit = emInput.copy().controlStrategy(newStrat).parentEm(givenParentEm).build() + def alteredUnit = emInput.copy().connectedAssets(newConnectedAssets).controlStrategy(ControlStrategy.parse("")).build() then: alteredUnit.with { @@ -85,8 +86,8 @@ class EmInputTest extends Specification { assert operationTime == emInput.operationTime assert operator == emInput.operator assert id == emInput.id - assert controlStrategy == newStrat - assert parentEm == Optional.of(givenParentEm) + assert connectedAssets == newConnectedAssets + assert controlStrategy == NO_CONTROL_STRATEGY } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy index 507384dcb..f31375f45 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvInputTest.groovy @@ -26,7 +26,6 @@ class EvInputTest extends Specification { assert id == ev.id assert qCharacteristics == ev.qCharacteristics assert type == SystemParticipantTestData.evTypeInput - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy index eadd65ea7..65dd93c14 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/EvcsInputTest.groovy @@ -36,7 +36,6 @@ class EvcsInputTest extends Specification { assert chargingPoints == 1 assert locationType == EvcsLocationType.CHARGING_HUB_HIGHWAY assert v2gSupport - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy index 5c29f2544..500da895b 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/FixedFeedInInputTest.groovy @@ -29,7 +29,6 @@ class FixedFeedInInputTest extends Specification { assert qCharacteristics == ffIn.qCharacteristics assert sRated == Quantities.getQuantity(10d, PowerSystemUnits.VOLTAMPERE) assert cosPhiRated == 0.8d - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy index 98a15d0df..9e40de6d6 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/HpInputTest.groovy @@ -28,7 +28,6 @@ class HpInputTest extends Specification { assert qCharacteristics == hpInput.qCharacteristics assert thermalBus == SystemParticipantTestData.thermalBus assert type == SystemParticipantTestData.hpTypeInput - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy index 166406e36..a1d04cc30 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/LoadInputTest.groovy @@ -41,7 +41,6 @@ class LoadInputTest extends Specification { assert eConsAnnual == Quantities.getQuantity(6000, KILOWATTHOUR) assert sRated == Quantities.getQuantity(0d, KILOVOLTAMPERE) assert cosPhiRated == 0.8d - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy index 5506582e8..ea9a0262d 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/PvInputTest.groovy @@ -40,7 +40,6 @@ class PvInputTest extends Specification { assert elevationAngle == Quantities.getQuantity(50, DEGREE_GEOM) assert kG == 10 assert kT == 5 - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy index da2e9d233..0bea4865f 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/StorageInputTest.groovy @@ -26,7 +26,6 @@ class StorageInputTest extends Specification { assert id == storageInput.id assert qCharacteristics == storageInput.qCharacteristics assert type == SystemParticipantTestData.storageTypeInput - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy index 135adc2fb..9d8b823af 100644 --- a/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/models/input/system/WecInputTest.groovy @@ -27,7 +27,6 @@ class WecInputTest extends Specification { assert qCharacteristics == wec.qCharacteristics assert type == SystemParticipantTestData.wecType assert marketReaction - assert em == Optional.of(SystemParticipantTestData.emInput) } } } diff --git a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy index c07ff0d54..72461b659 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/ContainerUtilsTest.groovy @@ -294,6 +294,7 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics HashMap expectedSubGrids = ComplexTopology.expectedSubGrids @@ -304,6 +305,7 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGrid, systemParticipants, + emUnits, graphics) then: @@ -323,6 +325,7 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGridInput= ComplexTopology.grid.rawGrid SystemParticipants systemParticipantsInput = ComplexTopology.grid.systemParticipants + EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphicsInput = ComplexTopology.grid.graphics HashMap unmodifiedSubGrids = ComplexTopology.expectedSubGrids @@ -332,6 +335,7 @@ class ContainerUtilsTest extends Specification { subNetNumbers, rawGridInput, systemParticipantsInput, + emUnits, graphicsInput) when: @@ -386,12 +390,14 @@ class ContainerUtilsTest extends Specification { Set subNetNumbers = ContainerUtils.determineSubnetNumbers(ComplexTopology.grid.rawGrid.nodes) RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticipants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics Map subgrids = ContainerUtils.buildSubGridContainers( gridName, subNetNumbers, rawGrid, systemParticipants, + emUnits, graphics) SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -409,6 +415,7 @@ class ContainerUtilsTest extends Specification { String gridName = ComplexTopology.gridName RawGridElements rawGrid = ComplexTopology.grid.rawGrid SystemParticipants systemParticpants = ComplexTopology.grid.systemParticipants + EnergyManagementUnits emUnits = ComplexTopology.grid.emUnits GraphicElements graphics = ComplexTopology.grid.graphics SubGridTopologyGraph expectedSubGridTopology = ComplexTopology.expectedSubGridTopology @@ -417,6 +424,7 @@ class ContainerUtilsTest extends Specification { gridName, rawGrid, systemParticpants, + emUnits, graphics) then: diff --git a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy index e8f27b4df..9aee7acf6 100644 --- a/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy +++ b/src/test/groovy/edu/ie3/datamodel/utils/validation/InvalidSystemParticipantInput.groovy @@ -13,7 +13,7 @@ import java.time.ZonedDateTime class InvalidSystemParticipantInput extends SystemParticipantInput { InvalidSystemParticipantInput(NodeInput node) { - super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC, null) + super(UUID.randomUUID(), "invalid_system_participant", node, CosPhiFixed.CONSTANT_CHARACTERISTIC) } @Override diff --git a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy index 1c56b3838..172675589 100644 --- a/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy +++ b/src/test/groovy/edu/ie3/test/common/ComplexTopology.groovy @@ -5,6 +5,7 @@ */ package edu.ie3.test.common +import static edu.ie3.test.common.EnergyManagementTestData.emptyEnergyManagementUnits import static edu.ie3.test.common.SystemParticipantTestData.emptySystemParticipants import edu.ie3.datamodel.graph.SubGridGate @@ -45,6 +46,7 @@ class ComplexTopology extends GridTestData { gridName, rawGrid, emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set)) @@ -65,6 +67,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -81,6 +84,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -97,6 +101,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -113,6 +118,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -132,6 +138,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) @@ -151,6 +158,7 @@ class ComplexTopology extends GridTestData { [] as Set, [] as Set), emptySystemParticipants, + emptyEnergyManagementUnits, new GraphicElements( [] as Set, [] as Set) diff --git a/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy new file mode 100644 index 000000000..4d8714c6b --- /dev/null +++ b/src/test/groovy/edu/ie3/test/common/EnergyManagementTestData.groovy @@ -0,0 +1,30 @@ +/* + * © 2023. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation + */ +package edu.ie3.test.common + +import edu.ie3.datamodel.models.input.container.EnergyManagementUnits +import edu.ie3.datamodel.models.input.system.EmInput + +class EnergyManagementTestData { + + public static final UUID[] connectedAssets = new UUID[]{ + SystemParticipantTestData.loadInput.uuid, + SystemParticipantTestData.pvInput.uuid + } + public static final String emControlStrategy = "self_optimization" + + public static final emInput = new EmInput( + UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), + "test_emInput", + SystemParticipantTestData.operator, + SystemParticipantTestData.operationTime, + connectedAssets, + emControlStrategy + ) + + public static EnergyManagementUnits emptyEnergyManagementUnits = + new EnergyManagementUnits([] as List) +} diff --git a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy index ea7ea00ec..44243df05 100644 --- a/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy +++ b/src/test/groovy/edu/ie3/test/common/SampleJointGrid.groovy @@ -15,6 +15,7 @@ import edu.ie3.datamodel.models.input.connector.LineInput import edu.ie3.datamodel.models.input.connector.Transformer2WInput import edu.ie3.datamodel.models.input.connector.type.LineTypeInput import edu.ie3.datamodel.models.input.connector.type.Transformer2WTypeInput +import edu.ie3.datamodel.models.input.container.EnergyManagementUnits import edu.ie3.datamodel.models.input.container.GraphicElements import edu.ie3.datamodel.models.input.container.JointGridContainer import edu.ie3.datamodel.models.input.container.RawGridElements @@ -47,6 +48,7 @@ class SampleJointGrid extends SystemParticipantTestData { "sampleGrid", rawGridElements, systemParticipants(rawGridElements), + new EnergyManagementUnits(Collections.emptySet()), new GraphicElements(Collections.emptySet())) } @@ -70,7 +72,6 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, albedo, azimuth, etaConv, @@ -90,7 +91,6 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, standardLoadProfile, false, eConsAnnual, @@ -105,7 +105,6 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, standardLoadProfile, false, eConsAnnual, @@ -121,7 +120,6 @@ class SampleJointGrid extends SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, storageTypeInput) return new SystemParticipants( diff --git a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy index dbcc06e33..bd0f2bf43 100644 --- a/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/SystemParticipantTestData.groovy @@ -8,7 +8,6 @@ package edu.ie3.test.common import static edu.ie3.datamodel.models.StandardUnits.* import edu.ie3.datamodel.models.OperationTime -import edu.ie3.datamodel.models.input.EmInput import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.input.OperatorInput import edu.ie3.datamodel.models.input.container.SystemParticipants @@ -56,25 +55,6 @@ class SystemParticipantTestData { private static final ComparableQuantity opex = Quantities.getQuantity(50d, ENERGY_PRICE) static final ComparableQuantity etaConv = Quantities.getQuantity(98d, EFFICIENCY) - // EmInput - public static final String emControlStrategy = "self_optimization" - public static final EmInput parentEm = new EmInput( - UUID.fromString("897bfc17-8e54-43d0-8d98-740786fd94dd"), - "test_parentEmInput", - SystemParticipantTestData.operator, - SystemParticipantTestData.operationTime, - emControlStrategy, - null - ) - - public static final EmInput emInput = new EmInput( - UUID.fromString("977157f4-25e5-4c72-bf34-440edc778792"), - "test_emInput", - SystemParticipantTestData.operator, - SystemParticipantTestData.operationTime, - emControlStrategy, - parentEm - ) // FixedFeedInput public static final FixedFeedInInput fixedFeedInInput = new FixedFeedInInput( @@ -84,7 +64,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, sRated, cosPhiRated ) @@ -102,7 +81,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, albedo, azimuth, etaConv, @@ -139,7 +117,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiP, - emInput, wecType, false ) @@ -195,7 +172,6 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, - emInput, chpTypeInput, thermalStorage, false @@ -222,7 +198,6 @@ class SystemParticipantTestData { operationTime, participantNode, qV, - emInput, bmTypeInput, false, false, @@ -248,7 +223,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, evTypeInput ) @@ -262,7 +236,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, standardLoadProfile, false, eConsAnnual, @@ -299,7 +272,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, storageTypeInput ) @@ -322,7 +294,6 @@ class SystemParticipantTestData { participantNode, thermalBus, cosPhiFixed, - emInput, hpTypeInput ) @@ -335,7 +306,6 @@ class SystemParticipantTestData { operationTime, participantNode, cosPhiFixed, - emInput, ChargingPointTypeUtils.HouseholdSocket, 4, cosPhiRated, diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv index e1bd3d5fa..5cc111444 100644 --- a/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_participants/em_input.csv @@ -1,3 +1,2 @@ -uuid,control_strategy,id,operates_from,operates_until,operator,parent_em -977157f4-25e5-4c72-bf34-440edc778792,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510,897bfc17-8e54-43d0-8d98-740786fd94dd -897bfc17-8e54-43d0-8d98-740786fd94dd,self_optimization,test_parentEmInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510, \ No newline at end of file +uuid,connected_assets,control_strategy,id,operates_from,operates_until,operator +977157f4-25e5-4c72-bf34-440edc778792,eaf77f7e-9001-479f-94ca-7fb657766f5f d56f15b7-8293-4b98-b5bd-58f6273ce229,self_optimization,test_emInput,2020-03-24T15:11:31Z[UTC],2020-03-25T15:11:31Z[UTC],8f9682df-0744-4b58-a122-f0dc730f6510 From 8d63f7436dd075e0c3600645d47108914c92dbda Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 4 Jan 2024 10:17:04 +0100 Subject: [PATCH 31/31] Changelog addition --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c9a1a69a1..2b33ad187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Adding JavaDoc to `EntitySource.safeMapGet` [#828](https://github.com/ie3-institute/PowerSystemDataModel/issues/828) - Abstracting some methods in `ValidationUtils` [#852](https://github.com/ie3-institute/PowerSystemDataModel/issues/852) - `EmInput` should not be connected to the grid [#955](https://github.com/ie3-institute/PowerSystemDataModel/issues/955) +- Refactored and abstracted `EntitySource`s and `EntityData` creation [#969](https://github.com/ie3-institute/PowerSystemDataModel/issues/969) ## [4.1.0] - 2023-11-02