Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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 @@ -28,6 +28,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Removed attribute `dsm` from `LoadInput` [#1195](https://github.com/ie3-institute/PowerSystemDataModel/issues/1195)
- Fix spotless deprecations [#1123](https://github.com/ie3-institute/PowerSystemDataModel/issues/1223)
- Refactored `CongestionResult`, removed `ModelResultEntity` [#1234](https://github.com/ie3-institute/PowerSystemDataModel/issues/1234)
- Replaced `LoadProfileInput` with `LoadProfileTimeSeries` [#1228](https://github.com/ie3-institute/PowerSystemDataModel/issues/1228)

## [5.1.0] - 2024-06-24

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,11 @@ public synchronized BufferedCsvWriter getOrInitWriter(
}
}

public synchronized <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public synchronized <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
BufferedCsvWriter getOrInitWriter(T timeSeries, CsvFileDefinition fileDefinition)
throws ConnectorException {
/* Try to the right writer */
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,11 @@ public CsvFileDefinition(
* @param fileNamingStrategy that should be used
* @throws FileException If the definition cannot be determined
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
CsvFileDefinition(
T timeSeries,
String[] headLineElements,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,10 @@

import edu.ie3.datamodel.io.factory.EntityData;
import edu.ie3.datamodel.io.factory.EntityFactory;
import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import java.util.Collections;
import java.util.List;
import java.util.Set;
Expand All @@ -21,12 +23,13 @@
* mappings
*/
public class TimeSeriesMetaInformationFactory
extends EntityFactory<IndividualTimeSeriesMetaInformation, EntityData> {
extends EntityFactory<TimeSeriesMetaInformation, EntityData> {
private static final String TIME_SERIES = "timeSeries";
private static final String COLUMN_SCHEME = "columnScheme";
private static final String LOAD_PROFILE = "loadProfile";

public TimeSeriesMetaInformationFactory() {
super(IndividualTimeSeriesMetaInformation.class);
super(IndividualTimeSeriesMetaInformation.class, LoadProfileMetaInformation.class);
}

@Override
Expand All @@ -36,9 +39,15 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
}

@Override
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);
protected TimeSeriesMetaInformation buildModel(EntityData data) {
if (LoadProfileMetaInformation.class.isAssignableFrom(data.getTargetClass())) {
String profile = data.getField(LOAD_PROFILE);
return new LoadProfileMetaInformation(profile);
} else {
UUID timeSeries = data.getUUID(TIME_SERIES);

ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow();
return new IndividualTimeSeriesMetaInformation(timeSeries, columnScheme);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.Value;
import java.util.Optional;

Expand All @@ -21,7 +21,7 @@ public class DatabaseNamingStrategy {

private static final String TIME_SERIES_PREFIX = "time_series_";

private static final String LOAD_PROFILE_PREFIX = "load_profile_";
private static final String LOAD_PROFILE = "load_profiles";

private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy;

Expand All @@ -42,6 +42,11 @@ public String getTimeSeriesPrefix() {
return TIME_SERIES_PREFIX;
}

/** Returns the String of the load profile table */
public String getLoadProfileTableName() {
return LOAD_PROFILE;
}

/**
* Provides the name of a time series table given a column scheme
*
Expand All @@ -53,13 +58,12 @@ public String getTimeSeriesEntityName(ColumnScheme columnScheme) {
}

/**
* Provides the name of a load profile given by the load profile key
* Provides the name of the load profile table.
*
* @param lpKey Load profile key
* @return the table name
*/
private String getLoadProfileEntityName(String lpKey) {
return LOAD_PROFILE_PREFIX + lpKey;
public String getLoadProfileEntityName() {
return getLoadProfileTableName();
}

/**
Expand All @@ -78,7 +82,11 @@ public Optional<String> getEntityName(Class<? extends Entity> cls) {
* @param timeSeries to be named TimeSeries
* @return the table name
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
if (timeSeries instanceof IndividualTimeSeries individualTimeSeries) {
Optional<E> maybeFirstElement = individualTimeSeries.getEntries().stream().findFirst();
Expand All @@ -89,8 +97,8 @@ Optional<String> getEntityName(T timeSeries) {
logger.error("Unable to determine content of time series {}", timeSeries);
return Optional.empty();
}
} else if (timeSeries instanceof LoadProfileInput loadProfileInput) {
return Optional.of(getLoadProfileEntityName(loadProfileInput.getType().getKey()));
} else if (timeSeries instanceof LoadProfileTimeSeries<?>) {
return Optional.of(getLoadProfileEntityName());
} else {
logger.error("There is no naming strategy defined for {}", timeSeries);
return Optional.empty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@
import edu.ie3.datamodel.models.result.system.*;
import edu.ie3.datamodel.models.result.thermal.ThermalUnitResult;
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
Expand Down Expand Up @@ -250,9 +249,7 @@ private enum SubDirectories {
StorageTypeInput.class,
WecTypeInput.class,
OperatorInput.class,
WecCharacteristicInput.class,
RandomLoadParameters.class,
LoadProfileInput.class)
WecCharacteristicInput.class)
.collect(Collectors.toSet())),
PARTICIPANTS_INPUT(
Constants.INPUT_SUB_TREE.resolve("participants"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
import edu.ie3.datamodel.models.Entity;
import edu.ie3.datamodel.models.input.*;
Expand All @@ -17,7 +17,7 @@
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.*;
import edu.ie3.util.StringUtils;
import java.util.Optional;
Expand Down Expand Up @@ -60,7 +60,7 @@ public class EntityPersistenceNamingStrategy {
* profile is accessible via the named capturing group "profile", the uuid by the group "uuid"
*/
private static final String LOAD_PROFILE_TIME_SERIES =
"lpts_(?<profile>[a-zA-Z][0-9])_(?<uuid>" + UUID_STRING + ")";
"lpts_(?<profile>[a-zA-Z]{1,11}[0-9]{0,3})";

/**
* Pattern to identify load profile time series in this instance of the naming strategy (takes
Expand Down Expand Up @@ -156,15 +156,13 @@ public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation(
* @param fileName File name to extract information from
* @return Meta information form load profile time series file name
*/
public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation(
String fileName) {
public LoadProfileMetaInformation loadProfileTimesSeriesMetaInformation(String fileName) {
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on load profile time series from '" + fileName + "'.");

return new LoadProfileTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
return new LoadProfileMetaInformation(matcher.group("profile"));
}

/**
Expand Down Expand Up @@ -215,8 +213,6 @@ public Optional<String> getInputEntityName(Class<? extends InputEntity> cls) {
return getTypeEntityName(cls.asSubclass(AssetTypeInput.class));
if (AssetInput.class.isAssignableFrom(cls))
return getAssetInputEntityName(cls.asSubclass(AssetInput.class));
if (RandomLoadParameters.class.isAssignableFrom(cls))
return getRandomLoadParametersEntityName(cls.asSubclass(RandomLoadParameters.class));
if (GraphicInput.class.isAssignableFrom(cls))
return getGraphicsInputEntityName(cls.asSubclass(GraphicInput.class));
if (OperatorInput.class.isAssignableFrom(cls))
Expand Down Expand Up @@ -274,19 +270,6 @@ public Optional<String> getAssetCharacteristicsEntityName(
return Optional.of(addPrefixAndSuffix(assetCharString));
}

/**
* Get the entity name for all {@link RandomLoadParameters}
*
* @param randomLoadParamClass the random load parameters class an entity name string should be
* generated from
* @return the entity name string
*/
public Optional<String> getRandomLoadParametersEntityName(
Class<? extends RandomLoadParameters> randomLoadParamClass) {
String loadParamString = camelCaseToSnakeCase(randomLoadParamClass.getSimpleName());
return Optional.of(addPrefixAndSuffix(loadParamString.concat("_input")));
}

/**
* Converts a given camel case string to its snake case representation
*
Expand Down Expand Up @@ -359,7 +342,11 @@ public Optional<String> getTimeSeriesMappingEntityName() {
* @param timeSeries Time series to derive naming information from
* @return A file name for this particular time series
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
if (timeSeries instanceof IndividualTimeSeries) {
Optional<E> maybeFirstElement = timeSeries.getEntries().stream().findFirst();
Expand All @@ -383,14 +370,12 @@ Optional<String> getEntityName(T timeSeries) {
logger.error("Unable to determine content of time series {}", timeSeries);
return Optional.empty();
}
} else if (timeSeries instanceof LoadProfileInput loadProfileInput) {
} else if (timeSeries instanceof LoadProfileTimeSeries<?> loadProfileTimeSeries) {
return Optional.of(
prefix
.concat("lpts")
.concat("_")
.concat(loadProfileInput.getType().getKey())
.concat("_")
.concat(loadProfileInput.getUuid().toString())
.concat(loadProfileTimeSeries.getLoadProfile().getKey())
.concat(suffix));
} else {
logger.error("There is no naming strategy defined for {}", timeSeries);
Expand Down
28 changes: 23 additions & 5 deletions src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,12 @@

import edu.ie3.datamodel.io.IoUtil;
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
import edu.ie3.datamodel.io.naming.timeseries.LoadProfileMetaInformation;
import edu.ie3.datamodel.models.Entity;
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileInput;
import edu.ie3.datamodel.models.timeseries.repetitive.LoadProfileTimeSeries;
import edu.ie3.datamodel.models.value.Value;
import edu.ie3.datamodel.utils.FileUtils;
import java.nio.file.Path;
Expand Down Expand Up @@ -85,7 +86,11 @@ public Optional<Path> getFilePath(Class<? extends Entity> cls) {
* @param timeSeries Time series to derive naming information from
* @return An optional sub path to the actual file
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<Path> getFilePath(T timeSeries) {
return FileUtils.of(
entityPersistenceNamingStrategy.getEntityName(timeSeries), getDirectoryPath(timeSeries));
Expand Down Expand Up @@ -136,7 +141,11 @@ public Optional<Path> getDirectoryPath(Class<? extends Entity> cls) {
* @param timeSeries Time series to derive naming information from
* @return An optional sub directory path
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<Path> getDirectoryPath(T timeSeries) {
Optional<Path> maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass());
if (maybeDirectoryName.isEmpty()) {
Expand Down Expand Up @@ -180,7 +189,7 @@ public Pattern getIndividualTimeSeriesPattern() {
* @return A load profile time series pattern
*/
public Pattern getLoadProfileTimeSeriesPattern() {
Optional<Path> subDirectory = fileHierarchy.getSubDirectory(LoadProfileInput.class);
Optional<Path> subDirectory = fileHierarchy.getSubDirectory(LoadProfileTimeSeries.class);

if (subDirectory.isEmpty()) {
return entityPersistenceNamingStrategy.getLoadProfileTimeSeriesPattern();
Expand Down Expand Up @@ -237,6 +246,11 @@ public IndividualTimeSeriesMetaInformation individualTimeSeriesMetaInformation(S
removeFileNameEnding(fileName));
}

public LoadProfileMetaInformation loadProfileTimeSeriesMetaInformation(String fileName) {
return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation(
removeFileNameEnding(fileName));
}

public static String removeFileNameEnding(String fileName) {
return fileName.replaceAll("(?:\\.[^.\\\\/\\s]{1,255}){1,2}$", "");
}
Expand Down Expand Up @@ -274,7 +288,11 @@ public Optional<String> getEntityName(Class<? extends Entity> cls) {
* @param timeSeries Time series to derive naming information from
* @return A file name for this particular time series
*/
public <T extends TimeSeries<E, V>, E extends TimeSeriesEntry<V>, V extends Value>
public <
T extends TimeSeries<E, V, R>,
E extends TimeSeriesEntry<V>,
V extends Value,
R extends Value>
Optional<String> getEntityName(T timeSeries) {
return entityPersistenceNamingStrategy.getEntityName(timeSeries);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,15 @@
import java.util.UUID;

/** Specific meta information, that can be derived from a load profile time series file */
public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation {
public class LoadProfileMetaInformation extends TimeSeriesMetaInformation {
private final String profile;

public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) {
public LoadProfileMetaInformation(String profile) {
super(UUID.randomUUID());
this.profile = profile;
}

public LoadProfileMetaInformation(UUID uuid, String profile) {
super(uuid);
this.profile = profile;
}
Expand All @@ -25,7 +30,7 @@ public String getProfile() {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false;
if (!(o instanceof LoadProfileMetaInformation that)) return false;
if (!super.equals(o)) return false;
return profile.equals(that.profile);
}
Expand Down
Loading