diff --git a/src/main/java/edu/ie3/datamodel/io/factory/Factory.java b/src/main/java/edu/ie3/datamodel/io/factory/Factory.java index 9daff0c2d..04b8722c5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/Factory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/Factory.java @@ -102,6 +102,15 @@ private void isSupportedClass(Class desiredClass) { .collect(Collectors.joining("\n - "))); } + /** + * Returns a list of sets of field names that are required to be unique throughout the whole + * dataset. For each set, the combination of all members of the set must be unique. This means + * that individual members of the set are not required to be unique, but only their combination. + * Sets with only a single member are exempt here; the single field must be unique throughout the + * dataset. + */ + public abstract List> getUniqueFields(); + /** * Returns list of sets of attribute names that the entity requires to be built. At least one of * these sets needs to be delivered for entity creation to be successful. diff --git a/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java new file mode 100644 index 000000000..35e1dec0f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/UniqueEntityFactory.java @@ -0,0 +1,34 @@ +/* + * © 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.factory; + +import edu.ie3.datamodel.models.Entity; +import java.util.List; +import java.util.Set; + +/** + * Universal factory class for creating entities with unique fields uuid and id. + * + * @param Type of entity that this factory can create. Can be a subclass of the entities that + * this factory creates. + * @param Type of data class that is required for entity creation + */ +public abstract class UniqueEntityFactory + extends EntityFactory { + + protected static final String UUID = "uuid"; + + protected static final String ID = "id"; + + public UniqueEntityFactory(Class... allowedClasses) { + super(allowedClasses); + } + + @Override + public List> getUniqueFields() { + return List.of(newSet(UUID), newSet(ID)); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java index bfef41520..a5797cf9b 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/AssetInputEntityFactory.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.factory.input; -import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.factory.UniqueEntityFactory; import edu.ie3.datamodel.models.OperationTime; import edu.ie3.datamodel.models.input.AssetInput; import edu.ie3.datamodel.models.input.OperatorInput; @@ -22,12 +22,10 @@ * @since 19.02.20 */ public abstract class AssetInputEntityFactory - extends EntityFactory { + extends UniqueEntityFactory { - private static final String UUID = "uuid"; private static final String OPERATES_FROM = "operatesFrom"; private static final String OPERATES_UNTIL = "operatesUntil"; - private static final String ID = "id"; protected AssetInputEntityFactory(Class... allowedClasses) { super(allowedClasses); 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 706ba1250..76c01a6cc 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 @@ -6,16 +6,13 @@ 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.UniqueEntityFactory; import edu.ie3.datamodel.models.input.OperatorInput; import java.util.Collections; import java.util.List; import java.util.Set; -public class OperatorInputFactory extends EntityFactory { - - private static final String ENTITY_UUID = "uuid"; - private static final String ENTITY_ID = "id"; +public class OperatorInputFactory extends UniqueEntityFactory { public OperatorInputFactory() { super(OperatorInput.class); @@ -23,12 +20,12 @@ public OperatorInputFactory() { @Override protected List> getFields(Class entityClass) { - Set constructorParams = newSet(ENTITY_UUID, ENTITY_ID); + Set constructorParams = newSet(UUID, ID); return Collections.singletonList(constructorParams); } @Override protected OperatorInput buildModel(EntityData data) { - return new OperatorInput(data.getUUID(ENTITY_UUID), data.getField(ENTITY_ID)); + return new OperatorInput(data.getUUID(UUID), data.getField(ID)); } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java index c3a5a058b..31ad20acf 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/input/graphics/GraphicInputFactory.java @@ -47,6 +47,11 @@ protected List> getFields(Class entityClass) { return Collections.singletonList(constructorParamsMin); } + @Override + public List> getUniqueFields() { + return List.of(newSet(UUID)); + } + /** * Returns fields other than the required fields of {@link GraphicInput} that have to be present. * 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 98a1a1cea..76b4b7277 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 @@ -10,7 +10,9 @@ import edu.ie3.datamodel.models.result.ResultEntity; import edu.ie3.util.TimeUtil; import java.time.ZoneId; +import java.util.List; import java.util.Locale; +import java.util.Set; /** * Internal API for building {@link ResultEntity}s. This additional abstraction layer is necessary @@ -35,4 +37,9 @@ protected ResultEntityFactory(String dtfPattern, Class... allowedCl super(allowedClasses); timeUtil = new TimeUtil(ZoneId.of("UTC"), Locale.GERMANY, dtfPattern); } + + @Override + public List> getUniqueFields() { + return List.of(newSet(TIME, INPUT_MODEL)); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IdCoordinateFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IdCoordinateFactory.java index cca490869..2e603432f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IdCoordinateFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/IdCoordinateFactory.java @@ -7,6 +7,8 @@ import edu.ie3.datamodel.io.factory.Factory; import edu.ie3.datamodel.io.factory.SimpleFactoryData; +import java.util.List; +import java.util.Set; import org.apache.commons.lang3.tuple.Pair; import org.locationtech.jts.geom.Point; @@ -28,4 +30,9 @@ protected IdCoordinateFactory() { /** @return the field id for the coordinate longitude */ public abstract String getLonField(); + + @Override + public List> getUniqueFields() { + return List.of(newSet(getIdField())); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java index d290ea04e..33a2cff0e 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedSimpleValueFactory.java @@ -18,7 +18,6 @@ public class TimeBasedSimpleValueFactory extends TimeBasedValueFactory, V> { - private static final String UUID = "uuid"; private static final String TIME = "time"; /* Energy price */ private static final String PRICE = "price"; diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedValueFactory.java index 8acebdf05..ad0d8b08d 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedValueFactory.java @@ -8,6 +8,8 @@ import edu.ie3.datamodel.io.factory.Factory; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.Value; +import java.util.List; +import java.util.Set; /** * Abstract class that is able to build {@link TimeBasedValue}s from "flat" information @@ -17,7 +19,15 @@ */ public abstract class TimeBasedValueFactory, V extends Value> extends Factory> { + + protected static final String UUID = "uuid"; + protected TimeBasedValueFactory(Class... valueClasses) { super(valueClasses); } + + @Override + public List> getUniqueFields() { + return List.of(newSet(UUID)); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueFactory.java index 254de4a74..e6a4c53d5 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeBasedWeatherValueFactory.java @@ -16,7 +16,6 @@ */ public abstract class TimeBasedWeatherValueFactory extends TimeBasedValueFactory { - protected static final String UUID = "uuid"; protected static final String TIME = "time"; protected static final String COORDINATE_ID = "coordinateId"; 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 14d069c8a..065301ce8 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 @@ -38,4 +38,9 @@ protected TimeSeriesMappingSource.MappingEntry buildModel(EntityData data) { UUID timeSeries = data.getUUID(TIME_SERIES); return new TimeSeriesMappingSource.MappingEntry(uuid, participant, timeSeries); } + + @Override + public List> getUniqueFields() { + return List.of(newSet(UUID)); + } } 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 327f920eb..4f7576e6b 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 @@ -41,4 +41,9 @@ protected IndividualTimeSeriesMetaInformation buildModel(EntityData data) { ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme); } + + @Override + public List> getUniqueFields() { + return List.of(newSet(TIME_SERIES)); + } } 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 a318f7621..4aae38c09 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 @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.factory.typeinput; import edu.ie3.datamodel.io.factory.EntityData; -import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.factory.UniqueEntityFactory; import edu.ie3.datamodel.models.input.AssetTypeInput; /** @@ -18,10 +18,7 @@ * @since 11.02.20 */ abstract class AssetTypeInputEntityFactory - extends EntityFactory { - - protected static final String ENTITY_UUID = "uuid"; - protected static final String ENTITY_ID = "id"; + extends UniqueEntityFactory { protected AssetTypeInputEntityFactory(Class... allowedClasses) { super(allowedClasses); 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 504d0f09c..244a61839 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 @@ -32,15 +32,15 @@ public LineTypeInputFactory() { @Override protected List> getFields(Class entityClass) { - Set constructorParams = newSet(ENTITY_UUID, ENTITY_ID, B, G, R, X, I_MAX, V_RATED); + Set constructorParams = newSet(UUID, ID, B, G, R, X, I_MAX, V_RATED); return Collections.singletonList(constructorParams); } @Override protected LineTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(ENTITY_UUID); - String id = data.getField(ENTITY_ID); + UUID uuid = data.getUUID(UUID); + String id = data.getField(ID); ComparableQuantity b = data.getQuantity(B, StandardUnits.SUSCEPTANCE_PER_LENGTH); ComparableQuantity g = 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 014d7c69b..166cd93f8 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 @@ -72,8 +72,7 @@ public SystemParticipantTypeInputFactory() { @Override protected List> getFields(Class entityClass) { - Set standardConstructorParams = - newSet(ENTITY_UUID, ENTITY_ID, CAP_EX, OP_EX, S_RATED, COS_PHI_RATED); + Set standardConstructorParams = newSet(UUID, ID, CAP_EX, OP_EX, S_RATED, COS_PHI_RATED); Set constructorParameters = null; if (entityClass.equals(EvTypeInput.class)) { @@ -106,8 +105,8 @@ protected List> getFields(Class entityClass) { @Override protected SystemParticipantTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(ENTITY_UUID); - String id = data.getField(ENTITY_ID); + UUID uuid = data.getUUID(UUID); + String id = data.getField(ID); ComparableQuantity capEx = data.getQuantity(CAP_EX, StandardUnits.CAPEX); ComparableQuantity opEx = data.getQuantity(OP_EX, StandardUnits.ENERGY_PRICE); ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); 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 8746d24d8..6c3df5c0c 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 @@ -39,29 +39,16 @@ public Transformer2WTypeInputFactory() { protected List> getFields(Class entityClass) { Set constructorParams = newSet( - ENTITY_UUID, - ENTITY_ID, - R_SC, - X_SC, - S_RATED, - V_RATED_A, - V_RATED_B, - G_M, - B_M, - D_V, - D_PHI, - TAP_SIDE, - TAP_NEUTR, - TAP_MIN, - TAP_MAX); + UUID, ID, R_SC, X_SC, S_RATED, V_RATED_A, V_RATED_B, G_M, B_M, D_V, D_PHI, TAP_SIDE, + TAP_NEUTR, TAP_MIN, TAP_MAX); return Collections.singletonList(constructorParams); } @Override protected Transformer2WTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(ENTITY_UUID); - String id = data.getField(ENTITY_ID); + UUID uuid = data.getUUID(UUID); + String id = data.getField(ID); ComparableQuantity rSc = data.getQuantity(R_SC, StandardUnits.RESISTANCE); ComparableQuantity xSc = data.getQuantity(X_SC, StandardUnits.REACTANCE); ComparableQuantity sRated = data.getQuantity(S_RATED, StandardUnits.S_RATED); 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 5b45e0394..196eaf472 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 @@ -45,26 +45,8 @@ public Transformer3WTypeInputFactory() { protected List> getFields(Class entityClass) { Set constructorParams = newSet( - ENTITY_UUID, - ENTITY_ID, - S_RATED_A, - S_RATED_B, - S_RATED_C, - V_RATED_A, - V_RATED_B, - V_RATED_C, - R_SC_A, - R_SC_B, - R_SC_C, - X_SC_A, - X_SC_B, - X_SC_C, - G_M, - B_M, - D_V, - D_PHI, - TAP_NEUTR, - TAP_MIN, + UUID, ID, S_RATED_A, S_RATED_B, S_RATED_C, V_RATED_A, V_RATED_B, V_RATED_C, R_SC_A, + R_SC_B, R_SC_C, X_SC_A, X_SC_B, X_SC_C, G_M, B_M, D_V, D_PHI, TAP_NEUTR, TAP_MIN, TAP_MAX); return Collections.singletonList(constructorParams); @@ -72,8 +54,8 @@ protected List> getFields(Class entityClass) { @Override protected Transformer3WTypeInput buildModel(EntityData data) { - UUID uuid = data.getUUID(ENTITY_UUID); - String id = data.getField(ENTITY_ID); + UUID uuid = data.getUUID(UUID); + String id = data.getField(ID); ComparableQuantity sRatedA = data.getQuantity(S_RATED_A, StandardUnits.S_RATED); ComparableQuantity sRatedB = data.getQuantity(S_RATED_B, StandardUnits.S_RATED); ComparableQuantity sRatedC = data.getQuantity(S_RATED_C, StandardUnits.S_RATED); diff --git a/src/test/groovy/edu/ie3/datamodel/io/factory/FactoryTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/factory/FactoryTest.groovy index 33f657aed..ccab00d5c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/factory/FactoryTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/factory/FactoryTest.groovy @@ -90,6 +90,11 @@ class FactoryTest extends Specification { return null } + @Override + List> getUniqueFields() { + return null + } + @Override protected List> getFields(Class entityClass) { return [