From 83cf8d7ee3b7fa60b1e6afd36ea83a0c698e3bdd Mon Sep 17 00:00:00 2001 From: pierrepetersmeier <155652256+pierrepetersmeier@users.noreply.github.com> Date: Mon, 1 Sep 2025 14:45:27 +0200 Subject: [PATCH 1/3] Correctly persist EmInput entities in CsvFileSink --- CHANGELOG.md | 1 + .../edu/ie3/datamodel/io/sink/CsvFileSink.java | 18 +++++++++++++++++- .../datamodel/io/sink/CsvFileSinkTest.groovy | 1 + 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5416aa3b7..6a729d9cb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Fixed small issues in tests [#1400](https://github.com/ie3-institute/PowerSystemDataModel/issues/1400) - Fix transformer susceptance in readTheDocs to negative values [#1078](https://github.com/ie3-institute/PowerSystemDataModel/issues/1078) - Added mising fields to field validation [#1422](https://github.com/ie3-institute/PowerSystemDataModel/issues/1422) +- Correctly persist EmInput entities in CsvFileSink [#1337](https://github.com/ie3-institute/PowerSystemDataModel/issues/1337) ### Changed - Updated CI-Pipeline to run task `Deploy` and `Staging` only for `Main` [#1403](https://github.com/ie3-institute/PowerSystemDataModel/issues/1403) diff --git a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java index 4b08d00f6..996eceab7 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/CsvFileSink.java @@ -10,6 +10,7 @@ import edu.ie3.datamodel.io.csv.BufferedCsvWriter; import edu.ie3.datamodel.io.csv.CsvFileDefinition; import edu.ie3.datamodel.io.extractor.Extractor; +import edu.ie3.datamodel.io.extractor.HasEm; import edu.ie3.datamodel.io.extractor.NestedEntity; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.processor.ProcessorProvider; @@ -225,14 +226,29 @@ public void persistJointGrid(JointGridContainer jointGridContainer) { .flatMap(Optional::stream) .collect(Collectors.toSet()); + // extract all EmInput entities + Set emInputs = + systemParticipants.allEntitiesAsList().stream() + .filter(Objects::nonNull) + .map(HasEm.class::cast) + .map(HasEm::getControllingEm) + .flatMap(Optional::stream) + .flatMap( + em -> + Stream.iterate( + em, Objects::nonNull, current -> current.getControllingEm().orElse(null))) + .collect(Collectors.toSet()); + // persist all entities Stream.of( rawGridElements.allEntitiesAsList(), systemParticipants.allEntitiesAsList(), graphicElements.allEntitiesAsList(), types, - operators) + operators, + emInputs) .flatMap(Collection::stream) + .collect(Collectors.toSet()) .forEach(this::persistIgnoreNested); } 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 08b563aa4..d84fd302a 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -357,6 +357,7 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { testBaseFolderPath.resolve("storage_type_input.csv").toFile().exists() testBaseFolderPath.resolve("transformer_2_w_input.csv").toFile().exists() testBaseFolderPath.resolve("transformer_2_w_type_input.csv").toFile().exists() + testBaseFolderPath.resolve("em_input.csv").toFile().exists() cleanup: csvFileSink.shutdown() From 15eb11ad01ac6ec63b7c8dcd29def2608e4b50f9 Mon Sep 17 00:00:00 2001 From: pierrepetersmeier <155652256+pierrepetersmeier@users.noreply.github.com> Date: Mon, 29 Sep 2025 11:25:29 +0200 Subject: [PATCH 2/3] Add a test that reads in the persisted grid and compares it with the original grid --- .../datamodel/io/sink/CsvFileSinkTest.groovy | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) 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 d84fd302a..e0de935a1 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -15,6 +15,7 @@ import edu.ie3.datamodel.io.processor.input.InputEntityProcessor import edu.ie3.datamodel.io.processor.result.ResultEntityProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessor import edu.ie3.datamodel.io.processor.timeseries.TimeSeriesProcessorKey +import edu.ie3.datamodel.io.source.csv.CsvJointGridContainerSource import edu.ie3.datamodel.models.OperationTime import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.EmInput @@ -362,4 +363,29 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { cleanup: csvFileSink.shutdown() } + + def "A persisted JointGridContainer with EmInput entities can be read back in and is equal to the original"() { + given: + "a CsvFileSink that persists the grid to a temporary directory" + def csvFileSink = new CsvFileSink(testBaseFolderPath) + + and: + "a sample grid that contains EM entities" + def originalGrid = SampleJointGrid.grid() + + when: + "the grid is persisted" + csvFileSink.persistJointGrid(originalGrid) + csvFileSink.shutdown() + + and: + "then read back in from the temporary directory" + def gridName = "sampleGrid" + def separator = "," + def readBackGrid = CsvJointGridContainerSource.read(gridName, separator, testBaseFolderPath, false) + + then: + "the original grid and the read-back grid are equal" + originalGrid == readBackGrid + } } From 14416cac6f2d6e402f14004e8e2d725bfb87fd78 Mon Sep 17 00:00:00 2001 From: pierrepetersmeier <155652256+pierrepetersmeier@users.noreply.github.com> Date: Thu, 2 Oct 2025 11:00:05 +0200 Subject: [PATCH 3/3] Add em_inputs.csv for GridIoIT --- .../datamodel/io/sink/CsvFileSinkTest.groovy | 25 ------------------- .../io/source/csv/_joint_grid/em_input.csv | 6 +++++ 2 files changed, 6 insertions(+), 25 deletions(-) create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv 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 e0de935a1..0ffa7698e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/sink/CsvFileSinkTest.groovy @@ -363,29 +363,4 @@ class CsvFileSinkTest extends Specification implements TimeSeriesTestData { cleanup: csvFileSink.shutdown() } - - def "A persisted JointGridContainer with EmInput entities can be read back in and is equal to the original"() { - given: - "a CsvFileSink that persists the grid to a temporary directory" - def csvFileSink = new CsvFileSink(testBaseFolderPath) - - and: - "a sample grid that contains EM entities" - def originalGrid = SampleJointGrid.grid() - - when: - "the grid is persisted" - csvFileSink.persistJointGrid(originalGrid) - csvFileSink.shutdown() - - and: - "then read back in from the temporary directory" - def gridName = "sampleGrid" - def separator = "," - def readBackGrid = CsvJointGridContainerSource.read(gridName, separator, testBaseFolderPath, false) - - then: - "the original grid and the read-back grid are equal" - originalGrid == readBackGrid - } } diff --git a/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv new file mode 100644 index 000000000..4c960d870 --- /dev/null +++ b/src/test/resources/edu/ie3/datamodel/io/source/csv/_joint_grid/em_input.csv @@ -0,0 +1,6 @@ +uuid,id,operator,operates_from,operates_until,controlStrategy,controllingEm +4e2f47a6-40f4-4952-9b2f-7b7d2558a143,em_system_1,,,,"SelfConsumptionOptimized", +a3e8e4a3-7b1b-4b1e-9e7b-8d6e3f5a2b1d,em_system_2,,,,GridSupportive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +b8d9c5b2-6c2c-4c2d-8f8c-9e7f4a6b3c2e,em_system_3,,,,PriceReactive,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +c7f0d6c1-5d3d-4d3e-7a9d-1f8a5b7c4d3f,em__system_4,,,,StoragePriority,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 +d6a1e7d0-4e4e-4e4f-6b0e-2a9b6c8d5e4a,em_system_5,,,,FeedInLimitation,4e2f47a6-40f4-4952-9b2f-7b7d2558a143 \ No newline at end of file