diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e6a8091e..e76f38732 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Updated CI-Pipeline to run task `Deploy` and `Staging` only for `Main` [#1403](https://github.com/ie3-institute/PowerSystemDataModel/issues/1403) - Extend `GermanVoltageLevelUtils` with more synonymousIds [#143](https://github.com/ie3-institute/PowerSystemDataModel/issues/143) - Change spotless to use googleJavaFormat('1.28.0') [#1409](https://github.com/ie3-institute/PowerSystemDataModel/issues/1409) +- Change `TimeSeries` to no longer extend `UniqueEntity` [#1441](https://github.com/ie3-institute/PowerSystemDataModel/issues/1441) ## [8.1.0] - 2025-07-25 diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java index 32f3e4780..8c5343260 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/BdewLoadProfileFactory.java @@ -76,8 +76,7 @@ public BdewLoadProfileTimeSeries build( ComparableQuantity maxPower = calculateMaxPower(profile, entries); ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); - return new BdewLoadProfileTimeSeries( - metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); + return new BdewLoadProfileTimeSeries(profile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java index 6a07a3f40..e927adaed 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java @@ -24,7 +24,7 @@ * @param

type of load profile * @param type of load values */ -public abstract class LoadProfileFactory

+public abstract class LoadProfileFactory

> extends Factory, LoadProfileEntry> { protected static final String QUARTER_HOUR = "quarterHour"; @@ -37,7 +37,7 @@ protected LoadProfileFactory(Class... valueClass) { super(valueClass); } - public abstract LoadProfileTimeSeries build( + public abstract LoadProfileTimeSeries build( LoadProfileMetaInformation metaInformation, Set> entries); public abstract P parseProfile(String profile); diff --git a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java index 440639388..f3a88199f 100644 --- a/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/RandomLoadProfileFactory.java @@ -79,8 +79,7 @@ public RandomLoadProfileTimeSeries build( ComparableQuantity maxPower = calculateMaxPower(profile, entries); ComparableQuantity profileEnergyScaling = getLoadProfileEnergyScaling(profile); - return new RandomLoadProfileTimeSeries( - metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling); + return new RandomLoadProfileTimeSeries(profile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java index 7e720e2d2..3d4f63ff6 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -97,7 +97,7 @@ Optional getEntityName(T timeSeries) { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileTimeSeries) { + } else if (timeSeries instanceof LoadProfileTimeSeries) { return Optional.of(getLoadProfileEntityName()); } else { logger.error("There is no naming strategy defined for {}", timeSeries); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java index 0c6f5ca2a..12a42e922 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -349,7 +349,7 @@ public Optional getTimeSeriesMappingEntityName() { V extends Value, R extends Value> Optional getEntityName(T timeSeries) { - if (timeSeries instanceof IndividualTimeSeries) { + if (timeSeries instanceof IndividualTimeSeries its) { Optional maybeFirstElement = timeSeries.getEntries().stream().findFirst(); if (maybeFirstElement.isPresent()) { Class valueClass = maybeFirstElement.get().getValue().getClass(); @@ -361,17 +361,17 @@ Optional getEntityName(T timeSeries) { .concat("_") .concat(mayBeColumnScheme.get().getScheme()) .concat("_") - .concat(timeSeries.getUuid().toString()) + .concat(its.getUuid().toString()) .concat(suffix)); } else { - logger.error("Unsupported content of time series {}", timeSeries); + logger.error("Unsupported content of time series {}", its); return Optional.empty(); } } else { logger.error("Unable to determine content of time series {}", timeSeries); return Optional.empty(); } - } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileTimeSeries) { + } else if (timeSeries instanceof LoadProfileTimeSeries loadProfileTimeSeries) { return Optional.of( prefix .concat("lpts") diff --git a/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java index 26ff2aaa6..aa11f1ffd 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java @@ -5,13 +5,37 @@ */ package edu.ie3.datamodel.io.naming; -import edu.ie3.datamodel.models.input.UniqueInputEntity; +import edu.ie3.datamodel.models.Entity; +import edu.ie3.datamodel.models.Uniqueness; +import java.util.Objects; import java.util.UUID; /** Meta information, that describe a certain data source */ -public abstract class TimeSeriesMetaInformation extends UniqueInputEntity { +public abstract class TimeSeriesMetaInformation implements Entity, Uniqueness { + private final UUID uuid; protected TimeSeriesMetaInformation(UUID uuid) { - super(uuid); + this.uuid = uuid; + } + + public UUID getUuid() { + return uuid; + } + + @Override + public boolean equals(Object o) { + if (o == null || getClass() != o.getClass()) return false; + TimeSeriesMetaInformation that = (TimeSeriesMetaInformation) o; + return Objects.equals(uuid, that.uuid); + } + + @Override + public int hashCode() { + return Objects.hashCode(uuid); + } + + @Override + public String toString() { + return "TimeSeriesMetaInformation{" + "uuid=" + uuid + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java index 438f88fd7..e476a9ebd 100644 --- a/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java +++ b/src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java @@ -251,7 +251,7 @@ private , V extends Value, R extends Value> void pe TriFunction queryBuilder; String timeSeriesIdentifier; - if (timeSeries instanceof LoadProfileTimeSeries lpts) { + if (timeSeries instanceof LoadProfileTimeSeries lpts) { timeSeriesIdentifier = lpts.getLoadProfile().getKey(); queryBuilder = this::basicInsertQueryValuesLPTS; } else { diff --git a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java index fa49931ad..238300c70 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/LoadProfileSource.java @@ -60,7 +60,7 @@ protected Try, FactoryException> createEntries( return entryFactory.get(factoryData); } - public abstract LoadProfileTimeSeries getTimeSeries(); + public abstract LoadProfileTimeSeries getTimeSeries(); /** * Method to return all time keys after a given timestamp. diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java index 429580fac..c785599b6 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvLoadProfileSource.java @@ -31,7 +31,7 @@ */ public class CsvLoadProfileSource

> extends LoadProfileSource { - private final LoadProfileTimeSeries loadProfileTimeSeries; + private final LoadProfileTimeSeries loadProfileTimeSeries; private final CsvDataSource dataSource; private final Path filePath; @@ -62,7 +62,7 @@ public void validate() throws ValidationException { } @Override - public LoadProfileTimeSeries getTimeSeries() { + public LoadProfileTimeSeries getTimeSeries() { return loadProfileTimeSeries; } @@ -77,9 +77,8 @@ public Optional getValue(ZonedDateTime time) throws SourceException { } @Override - @SuppressWarnings("unchecked") public P getLoadProfile() { - return (P) getTimeSeries().getLoadProfile(); + return getTimeSeries().getLoadProfile(); } @Override @@ -106,7 +105,7 @@ public Optional> getLoadProfileEnergyScaling() { * @throws SourceException If the file cannot be read properly * @return an individual time series */ - protected LoadProfileTimeSeries buildLoadProfileTimeSeries( + protected LoadProfileTimeSeries buildLoadProfileTimeSeries( CsvLoadProfileMetaInformation metaInformation, Function, Try, FactoryException>> fieldToValueFunction) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java index 3b54684f8..81bf4745d 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSource.java @@ -101,7 +101,7 @@ public void validate() throws ValidationException { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- @Override - public LoadProfileTimeSeries getTimeSeries() { + public LoadProfileTimeSeries getTimeSeries() { Set> entries = getEntries(queryFull, ps -> {}); return entryFactory.build(metaInformation, entries); } @@ -117,7 +117,7 @@ public Optional getValue(ZonedDateTime time) throws SourceException { getEntries(queryTime, ps -> ps.setInt(1, TimeSeriesUtils.calculateQuarterHourOfDay(time))); if (entries.isEmpty()) return Optional.empty(); if (entries.size() > 1) log.warn("Retrieved more than one result value, using the first"); - return Optional.of(entries.stream().toList().get(0).getValue().getValue(time, loadProfile)); + return entries.stream().findFirst().map(entry -> entry.getValue().getValue(time, loadProfile)); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java b/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java index 3d57c1312..8a6fcb1c6 100644 --- a/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java +++ b/src/main/java/edu/ie3/datamodel/models/UniqueEntity.java @@ -10,7 +10,7 @@ import java.util.UUID; /** Supplies every subclass with a generated UUID, making it unique */ -public abstract class UniqueEntity implements Entity, Serializable { +public abstract class UniqueEntity implements Entity, Uniqueness, Serializable { /** Field name of {@link UniqueEntity} uuid */ public static final String UUID_FIELD_NAME = "uuid"; @@ -24,6 +24,7 @@ protected UniqueEntity(UUID uuid) { this.uuid = uuid == null ? UUID.randomUUID() : uuid; } + @Override public UUID getUuid() { return uuid; } diff --git a/src/main/java/edu/ie3/datamodel/models/Uniqueness.java b/src/main/java/edu/ie3/datamodel/models/Uniqueness.java new file mode 100644 index 000000000..8a448cf57 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/models/Uniqueness.java @@ -0,0 +1,13 @@ +/* + * © 2025. 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.UUID; + +public interface Uniqueness { + + UUID getUuid(); +} diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java index f9fa97891..96e24cd7f 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java @@ -5,7 +5,8 @@ */ package edu.ie3.datamodel.models.timeseries; -import edu.ie3.datamodel.models.UniqueEntity; +import edu.ie3.datamodel.models.Entity; +import edu.ie3.datamodel.models.Uniqueness; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.Value; import java.time.ZonedDateTime; @@ -19,18 +20,24 @@ * @param Type of the value, the time series will return */ public abstract class TimeSeries, V extends Value, R extends Value> - extends UniqueEntity { + implements Entity, Uniqueness { + private final UUID uuid; private final Set entries; protected TimeSeries(Set entries) { - this.entries = Collections.unmodifiableSet(entries); + this(UUID.randomUUID(), entries); } protected TimeSeries(UUID uuid, Set entries) { - super(uuid); + this.uuid = uuid; this.entries = Collections.unmodifiableSet(entries); } + @Override + public UUID getUuid() { + return uuid; + } + /** * Get the time based value for the queried time * @@ -125,6 +132,6 @@ public int hashCode() { @Override public String toString() { - return "TimeSeries{" + "uuid=" + getUuid() + ", #entries=" + entries.size() + '}'; + return "TimeSeries{" + "#entries=" + entries.size() + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java index 524697166..8601a5a8b 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/BdewLoadProfileTimeSeries.java @@ -9,7 +9,6 @@ import edu.ie3.datamodel.models.value.load.BdewLoadValues; import java.util.Objects; import java.util.Set; -import java.util.UUID; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -18,20 +17,15 @@ * Describes a bdew load profile time series with repetitive values that can be calculated from a * pattern. Each value of this timeseries is given in W. */ -public class BdewLoadProfileTimeSeries extends LoadProfileTimeSeries { +public class BdewLoadProfileTimeSeries + extends LoadProfileTimeSeries { public BdewLoadProfileTimeSeries( - UUID uuid, BdewStandardLoadProfile loadProfile, Set> values, ComparableQuantity maxPower, ComparableQuantity profileEnergyScaling) { - super(uuid, loadProfile, values, maxPower, profileEnergyScaling); - } - - @Override - public BdewStandardLoadProfile getLoadProfile() { - return (BdewStandardLoadProfile) super.getLoadProfile(); + super(loadProfile, values, maxPower, profileEnergyScaling); } @Override @@ -49,8 +43,6 @@ public int hashCode() { @Override public String toString() { return "BDEWLoadProfileTimeSeries{" - + "uuid=" - + getUuid() + "loadProfile=" + getLoadProfile() + ", valueMapping=" diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java index 7c896fcbe..b1075875a 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/LoadProfileTimeSeries.java @@ -19,9 +19,9 @@ /** * Describes a load profile time series with repetitive values that can be calculated from a pattern */ -public class LoadProfileTimeSeries +public class LoadProfileTimeSeries

> extends RepetitiveTimeSeries, V, PValue> { - private final LoadProfile loadProfile; + private final P loadProfile; private final Map valueMapping; /** @@ -34,12 +34,11 @@ public class LoadProfileTimeSeries private final ComparableQuantity profileEnergyScaling; public LoadProfileTimeSeries( - UUID uuid, - LoadProfile loadProfile, + P loadProfile, Set> entries, ComparableQuantity maxPower, ComparableQuantity profileEnergyScaling) { - super(uuid, entries); + super(entries); this.loadProfile = loadProfile; this.valueMapping = entries.stream() @@ -64,7 +63,7 @@ public Optional> loadProfileScaling() { } /** Returns the {@link LoadProfile}. */ - public LoadProfile getLoadProfile() { + public P getLoadProfile() { return loadProfile; } @@ -108,7 +107,7 @@ public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; if (!super.equals(o)) return false; - LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; + LoadProfileTimeSeries that = (LoadProfileTimeSeries) o; return loadProfile.equals(that.loadProfile) && valueMapping.equals(that.valueMapping); } @@ -120,8 +119,6 @@ public int hashCode() { @Override public String toString() { return "LoadProfileTimeSeries{" - + "uuid=" - + getUuid() + "loadProfile=" + getLoadProfile() + ", valueMapping=" diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java index de9142fd9..4e6da05b1 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RandomLoadProfileTimeSeries.java @@ -9,7 +9,6 @@ import edu.ie3.datamodel.models.profile.LoadProfile; import edu.ie3.datamodel.models.value.load.RandomLoadValues; import java.util.Set; -import java.util.UUID; import javax.measure.quantity.Energy; import javax.measure.quantity.Power; import tech.units.indriya.ComparableQuantity; @@ -18,20 +17,15 @@ * Describes a random load profile time series based on a {@link * GeneralizedExtremeValueDistribution}. Each value of this# timeseries is given in kW. */ -public class RandomLoadProfileTimeSeries extends LoadProfileTimeSeries { +public class RandomLoadProfileTimeSeries + extends LoadProfileTimeSeries { public RandomLoadProfileTimeSeries( - UUID uuid, - LoadProfile loadProfile, + LoadProfile.RandomLoadProfile loadProfile, Set> entries, ComparableQuantity maxPower, ComparableQuantity profileEnergyScaling) { - super(uuid, loadProfile, entries, maxPower, profileEnergyScaling); - } - - @Override - public LoadProfile.RandomLoadProfile getLoadProfile() { - return (LoadProfile.RandomLoadProfile) super.getLoadProfile(); + super(loadProfile, entries, maxPower, profileEnergyScaling); } @Override diff --git a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java index 9338688bb..160331c3d 100644 --- a/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java +++ b/src/main/java/edu/ie3/datamodel/models/timeseries/repetitive/RepetitiveTimeSeries.java @@ -16,8 +16,8 @@ public abstract class RepetitiveTimeSeries< E extends TimeSeriesEntry, V extends Value, R extends Value> extends TimeSeries { - protected RepetitiveTimeSeries(UUID uuid, Set entries) { - super(uuid, entries); + protected RepetitiveTimeSeries(Set entries) { + super(entries); } /** diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy index c29dcca76..1fad10d5f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlLoadProfileSourceIT.groovy @@ -77,7 +77,6 @@ class SqlLoadProfileSourceIT extends Specification implements TestContainerHelpe def timeSeries = loadSource.timeSeries then: - timeSeries.uuid == timeSeriesUuid timeSeries.entries.size() == 3 } diff --git a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy index f332d0669..eb25d08fa 100644 --- a/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy +++ b/src/test/groovy/edu/ie3/test/common/TimeSeriesTestData.groovy @@ -401,7 +401,6 @@ trait TimeSeriesTestData { ] as Set BdewLoadProfileTimeSeries loadProfileTimeSeries = new BdewLoadProfileTimeSeries( - UUID.fromString("b0ad5ba2-0d5e-4c9b-b818-4079cebf59cc"), BdewStandardLoadProfile.G2, [ new LoadProfileEntry<>(