Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -76,8 +76,7 @@ public BdewLoadProfileTimeSeries build(
ComparableQuantity<Power> maxPower = calculateMaxPower(profile, entries);
ComparableQuantity<Energy> profileEnergyScaling = getLoadProfileEnergyScaling(profile);

return new BdewLoadProfileTimeSeries(
metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling);
return new BdewLoadProfileTimeSeries(profile, entries, maxPower, profileEnergyScaling);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,11 @@
* @param <P> type of load profile
* @param <V> type of load values
*/
public abstract class LoadProfileFactory<P extends LoadProfile, V extends LoadValues>
public abstract class LoadProfileFactory<P extends LoadProfile, V extends LoadValues<P>>
extends Factory<V, LoadProfileData<V>, LoadProfileEntry<V>> {
protected static final String QUARTER_HOUR = "quarterHour";

public LoadProfileFactory(Class<? extends V> valueClass) {

Check warning on line 31 in src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java

View check run for this annotation

SonarQubeGithubPRChecks / SonarQube Code Analysis

src/main/java/edu/ie3/datamodel/io/factory/timeseries/LoadProfileFactory.java#L31

Change the visibility of this constructor to "protected".
super(valueClass);
}

Expand All @@ -37,7 +37,7 @@
super(valueClass);
}

public abstract LoadProfileTimeSeries<V> build(
public abstract LoadProfileTimeSeries<P, V> build(
LoadProfileMetaInformation metaInformation, Set<LoadProfileEntry<V>> entries);

public abstract P parseProfile(String profile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,8 +79,7 @@ public RandomLoadProfileTimeSeries build(
ComparableQuantity<Power> maxPower = calculateMaxPower(profile, entries);
ComparableQuantity<Energy> profileEnergyScaling = getLoadProfileEnergyScaling(profile);

return new RandomLoadProfileTimeSeries(
metaInformation.getUuid(), profile, entries, maxPower, profileEnergyScaling);
return new RandomLoadProfileTimeSeries(profile, entries, maxPower, profileEnergyScaling);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ Optional<String> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,7 @@ public Optional<String> getTimeSeriesMappingEntityName() {
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
if (timeSeries instanceof IndividualTimeSeries) {
if (timeSeries instanceof IndividualTimeSeries<?> its) {
Optional<E> maybeFirstElement = timeSeries.getEntries().stream().findFirst();
if (maybeFirstElement.isPresent()) {
Class<? extends Value> valueClass = maybeFirstElement.get().getValue().getClass();
Expand All @@ -361,17 +361,17 @@ Optional<String> 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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 + '}';
}
}
2 changes: 1 addition & 1 deletion src/main/java/edu/ie3/datamodel/io/sink/SqlSink.java
Original file line number Diff line number Diff line change
Expand Up @@ -251,7 +251,7 @@ private <E extends TimeSeriesEntry<V>, V extends Value, R extends Value> void pe
TriFunction<String, String, String[], String> queryBuilder;
String timeSeriesIdentifier;

if (timeSeries instanceof LoadProfileTimeSeries<?> lpts) {
if (timeSeries instanceof LoadProfileTimeSeries<?, ?> lpts) {
timeSeriesIdentifier = lpts.getLoadProfile().getKey();
queryBuilder = this::basicInsertQueryValuesLPTS;
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ protected Try<LoadProfileEntry<V>, FactoryException> createEntries(
return entryFactory.get(factoryData);
}

public abstract LoadProfileTimeSeries<V> getTimeSeries();
public abstract LoadProfileTimeSeries<P, V> getTimeSeries();

/**
* Method to return all time keys after a given timestamp.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
*/
public class CsvLoadProfileSource<P extends LoadProfile, V extends LoadValues<P>>
extends LoadProfileSource<P, V> {
private final LoadProfileTimeSeries<V> loadProfileTimeSeries;
private final LoadProfileTimeSeries<P, V> loadProfileTimeSeries;
private final CsvDataSource dataSource;
private final Path filePath;

Expand Down Expand Up @@ -62,7 +62,7 @@ public void validate() throws ValidationException {
}

@Override
public LoadProfileTimeSeries<V> getTimeSeries() {
public LoadProfileTimeSeries<P, V> getTimeSeries() {
return loadProfileTimeSeries;
}

Expand All @@ -77,9 +77,8 @@ public Optional<PValue> getValue(ZonedDateTime time) throws SourceException {
}

@Override
@SuppressWarnings("unchecked")
public P getLoadProfile() {
return (P) getTimeSeries().getLoadProfile();
return getTimeSeries().getLoadProfile();
}

@Override
Expand All @@ -106,7 +105,7 @@ public Optional<ComparableQuantity<Energy>> getLoadProfileEnergyScaling() {
* @throws SourceException If the file cannot be read properly
* @return an individual time series
*/
protected LoadProfileTimeSeries<V> buildLoadProfileTimeSeries(
protected LoadProfileTimeSeries<P, V> buildLoadProfileTimeSeries(
CsvLoadProfileMetaInformation metaInformation,
Function<Map<String, String>, Try<LoadProfileEntry<V>, FactoryException>>
fieldToValueFunction)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void validate() throws ValidationException {
// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

@Override
public LoadProfileTimeSeries<V> getTimeSeries() {
public LoadProfileTimeSeries<P, V> getTimeSeries() {
Set<LoadProfileEntry<V>> entries = getEntries(queryFull, ps -> {});
return entryFactory.build(metaInformation, entries);
}
Expand All @@ -117,7 +117,7 @@ public Optional<PValue> 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
Expand Down
3 changes: 2 additions & 1 deletion src/main/java/edu/ie3/datamodel/models/UniqueEntity.java
Original file line number Diff line number Diff line change
Expand Up @@ -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";

Expand All @@ -24,6 +24,7 @@ protected UniqueEntity(UUID uuid) {
this.uuid = uuid == null ? UUID.randomUUID() : uuid;
}

@Override
public UUID getUuid() {
return uuid;
}
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/edu/ie3/datamodel/models/Uniqueness.java
Original file line number Diff line number Diff line change
@@ -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();
}
17 changes: 12 additions & 5 deletions src/main/java/edu/ie3/datamodel/models/timeseries/TimeSeries.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -19,18 +20,24 @@
* @param <R> Type of the value, the time series will return
*/
public abstract class TimeSeries<E extends TimeSeriesEntry<V>, V extends Value, R extends Value>
extends UniqueEntity {
implements Entity, Uniqueness {
private final UUID uuid;
private final Set<E> entries;

protected TimeSeries(Set<E> entries) {
this.entries = Collections.unmodifiableSet(entries);
this(UUID.randomUUID(), entries);
}

protected TimeSeries(UUID uuid, Set<E> 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
*
Expand Down Expand Up @@ -125,6 +132,6 @@ public int hashCode() {

@Override
public String toString() {
return "TimeSeries{" + "uuid=" + getUuid() + ", #entries=" + entries.size() + '}';
return "TimeSeries{" + "#entries=" + entries.size() + '}';
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<BdewLoadValues> {
public class BdewLoadProfileTimeSeries
extends LoadProfileTimeSeries<BdewStandardLoadProfile, BdewLoadValues> {

public BdewLoadProfileTimeSeries(
UUID uuid,
BdewStandardLoadProfile loadProfile,
Set<LoadProfileEntry<BdewLoadValues>> values,
ComparableQuantity<Power> maxPower,
ComparableQuantity<Energy> profileEnergyScaling) {
super(uuid, loadProfile, values, maxPower, profileEnergyScaling);
}

@Override
public BdewStandardLoadProfile getLoadProfile() {
return (BdewStandardLoadProfile) super.getLoadProfile();
super(loadProfile, values, maxPower, profileEnergyScaling);
}

@Override
Expand All @@ -49,8 +43,6 @@ public int hashCode() {
@Override
public String toString() {
return "BDEWLoadProfileTimeSeries{"
+ "uuid="
+ getUuid()
+ "loadProfile="
+ getLoadProfile()
+ ", valueMapping="
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@
/**
* Describes a load profile time series with repetitive values that can be calculated from a pattern
*/
public class LoadProfileTimeSeries<V extends LoadValues>
public class LoadProfileTimeSeries<P extends LoadProfile, V extends LoadValues<P>>
extends RepetitiveTimeSeries<LoadProfileEntry<V>, V, PValue> {
private final LoadProfile loadProfile;
private final P loadProfile;
private final Map<Integer, V> valueMapping;

/**
Expand All @@ -34,12 +34,11 @@ public class LoadProfileTimeSeries<V extends LoadValues>
private final ComparableQuantity<Energy> profileEnergyScaling;

public LoadProfileTimeSeries(
UUID uuid,
LoadProfile loadProfile,
P loadProfile,
Set<LoadProfileEntry<V>> entries,
ComparableQuantity<Power> maxPower,
ComparableQuantity<Energy> profileEnergyScaling) {
super(uuid, entries);
super(entries);
this.loadProfile = loadProfile;
this.valueMapping =
entries.stream()
Expand All @@ -64,7 +63,7 @@ public Optional<ComparableQuantity<Energy>> loadProfileScaling() {
}

/** Returns the {@link LoadProfile}. */
public LoadProfile getLoadProfile() {
public P getLoadProfile() {
return loadProfile;
}

Expand Down Expand Up @@ -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);
}

Expand All @@ -120,8 +119,6 @@ public int hashCode() {
@Override
public String toString() {
return "LoadProfileTimeSeries{"
+ "uuid="
+ getUuid()
+ "loadProfile="
+ getLoadProfile()
+ ", valueMapping="
Expand Down
Loading