From 210fb1d9fdcefb81cdbbc0f9383437e5b3b39944 Mon Sep 17 00:00:00 2001 From: Johannes Hiry Date: Wed, 2 Feb 2022 17:18:01 +0100 Subject: [PATCH 1/7] proper refactoring for #513 w/o breaking external interfaces (no tests yet!) --- .../io/connectors/CsvFileConnector.java | 53 ++++++++++----- ...svIndividualTimeSeriesMetaInformation.java | 58 +++++++++++++++++ .../io/csv/FileNameMetaInformation.java | 7 +- .../io/csv/timeseries/ColumnScheme.java | 3 + .../IndividualTimeSeriesMetaInformation.java | 22 ++++++- .../LoadProfileTimeSeriesMetaInformation.java | 14 +++- .../io/naming/DataSourceMetaInformation.java | 39 +++++++++++ .../EntityPersistenceNamingStrategy.java | 65 ++++++++++++++++--- .../io/naming/FileNamingStrategy.java | 46 +++++++++++-- .../io/naming/timeseries/ColumnScheme.java | 62 ++++++++++++++++++ .../IndividualTimeSeriesMetaInformation.java | 47 ++++++++++++++ .../LoadProfileTimeSeriesMetaInformation.java | 49 ++++++++++++++ .../io/source/csv/CsvWeatherSource.java | 14 ++-- 13 files changed, 437 insertions(+), 42 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java create mode 100644 src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java create mode 100644 src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java create mode 100644 src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java create mode 100644 src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 7dfe48f07..cafef1832 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -8,9 +8,10 @@ import edu.ie3.datamodel.exceptions.ConnectorException; import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.csv.*; -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -41,7 +42,8 @@ public class CsvFileConnector implements DataConnector { new HashMap<>(); private final Map timeSeriesWriters = new HashMap<>(); // ATTENTION: Do not finalize. It's meant for lazy evaluation. - private Map individualTimeSeriesMetaInformation; + private Map + individualTimeSeriesMetaInformation; private final FileNamingStrategy fileNamingStrategy; private final String baseDirectoryName; @@ -219,8 +221,17 @@ public BufferedReader initReader(String filePath) throws FileNotFoundException { * * @param timeSeriesUuid The time series in question * @return An option on the queried information + * @deprecated since 3.0. Use {@link #individualTimeSeriesMetaInformation(UUID)} instead */ - public Optional getIndividualTimeSeriesMetaInformation( + @Deprecated + public Optional + getIndividualTimeSeriesMetaInformation(UUID timeSeriesUuid) { + return individualTimeSeriesMetaInformation(timeSeriesUuid) + .map(edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation::new); + } + + // todo javadoc + public Optional individualTimeSeriesMetaInformation( UUID timeSeriesUuid) { if (Objects.isNull(individualTimeSeriesMetaInformation)) individualTimeSeriesMetaInformation = buildIndividualTimeSeriesMetaInformation(); @@ -233,7 +244,7 @@ public Optional getIndividualTimeSeriesMeta * * @return Mapping from time series uuid to it's meta information. */ - private Map + private Map buildIndividualTimeSeriesMetaInformation() { return getIndividualTimeSeriesFilePaths().parallelStream() .map( @@ -242,11 +253,11 @@ public Optional getIndividualTimeSeriesMeta String filePathWithoutEnding = removeFileEnding(filePath); IndividualTimeSeriesMetaInformation metaInformation = (IndividualTimeSeriesMetaInformation) - fileNamingStrategy.extractTimeSeriesMetaInformation(filePathWithoutEnding); - return new CsvIndividualTimeSeriesMetaInformation( + fileNamingStrategy.timeSeriesMetaInformation(filePathWithoutEnding); + return new edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation( metaInformation, filePathWithoutEnding); }) - .collect(Collectors.toMap(FileNameMetaInformation::getUuid, v -> v)); + .collect(Collectors.toMap(DataSourceMetaInformation::getUuid, v -> v)); } /** @@ -257,7 +268,7 @@ public Optional getIndividualTimeSeriesMeta * possible readers will be initialized. * @return A mapping from column scheme to the individual time series meta information */ - public Map> + public Map> getCsvIndividualTimeSeriesMetaInformation(ColumnScheme... columnSchemes) { return getIndividualTimeSeriesFilePaths().parallelStream() .map( @@ -269,7 +280,8 @@ public Optional getIndividualTimeSeriesMeta .map(Optional::get) .collect( Collectors.groupingBy( - CsvIndividualTimeSeriesMetaInformation::getColumnScheme, Collectors.toSet())); + edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation::getColumnScheme, + Collectors.toSet())); } /** @@ -322,11 +334,11 @@ private Set getIndividualTimeSeriesFilePaths() { * allowed. * @return An {@link Optional} to {@link IndividualTimeSeriesMetaInformation} */ - private Optional buildCsvTimeSeriesMetaInformation( - String filePathString, ColumnScheme... columnSchemes) { + private Optional + buildCsvTimeSeriesMetaInformation(String filePathString, ColumnScheme... columnSchemes) { try { - FileNameMetaInformation metaInformation = - fileNamingStrategy.extractTimeSeriesMetaInformation(filePathString); + DataSourceMetaInformation metaInformation = + fileNamingStrategy.timeSeriesMetaInformation(filePathString); if (!IndividualTimeSeriesMetaInformation.class.isAssignableFrom(metaInformation.getClass())) { log.error( "The time series file '{}' does not represent an individual time series.", @@ -350,7 +362,7 @@ private Optional buildCsvTimeSeriesMetaI return Optional.empty(); } return Optional.of( - new CsvIndividualTimeSeriesMetaInformation( + new edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation( individualMetaInformation.getUuid(), individualMetaInformation.getColumnScheme(), filePathString)); @@ -434,18 +446,23 @@ public void shutdown() { } /** Enhancing the {@link IndividualTimeSeriesMetaInformation} with the full path to csv file */ + // todo JH javadocs + @Deprecated public static class CsvIndividualTimeSeriesMetaInformation - extends IndividualTimeSeriesMetaInformation { + extends edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation { private final String fullFilePath; public CsvIndividualTimeSeriesMetaInformation( - UUID uuid, ColumnScheme columnScheme, String fullFilePath) { + UUID uuid, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme columnScheme, + String fullFilePath) { super(uuid, columnScheme); this.fullFilePath = fullFilePath; } public CsvIndividualTimeSeriesMetaInformation( - IndividualTimeSeriesMetaInformation metaInformation, String fullFilePath) { + edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation metaInformation, + String fullFilePath) { this(metaInformation.getUuid(), metaInformation.getColumnScheme(), fullFilePath); } diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java new file mode 100644 index 000000000..17d8bce0c --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java @@ -0,0 +1,58 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.csv; + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import java.util.Objects; +import java.util.UUID; + +/** Enhancing the {@link IndividualTimeSeriesMetaInformation} with the full path to csv file */ +public class CsvIndividualTimeSeriesMetaInformation extends IndividualTimeSeriesMetaInformation { + private final String fullFilePath; + + public CsvIndividualTimeSeriesMetaInformation( + UUID uuid, ColumnScheme columnScheme, String fullFilePath) { + super(uuid, columnScheme); + this.fullFilePath = fullFilePath; + } + + public CsvIndividualTimeSeriesMetaInformation( + IndividualTimeSeriesMetaInformation metaInformation, String fullFilePath) { + this(metaInformation.getUuid(), metaInformation.getColumnScheme(), fullFilePath); + } + + public String getFullFilePath() { + return fullFilePath; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof CsvIndividualTimeSeriesMetaInformation)) return false; + if (!super.equals(o)) return false; + CsvIndividualTimeSeriesMetaInformation that = (CsvIndividualTimeSeriesMetaInformation) o; + return fullFilePath.equals(that.fullFilePath); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), fullFilePath); + } + + @Override + public String toString() { + return "CsvIndividualTimeSeriesMetaInformation{" + + "uuid=" + + getUuid() + + ", columnScheme=" + + getColumnScheme() + + ", fullFilePath='" + + fullFilePath + + '\'' + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java index f9ab35d46..368f50c30 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java @@ -8,7 +8,12 @@ import java.util.Objects; import java.util.UUID; -/** Meta information, that can be derived from a certain file name */ +/** + * Meta information, that can be derived from a certain file name + * + * @deprecated since 3.0. Use {@link edu.ie3.datamodel.io.naming.DataSourceMetaInformation} instead + */ +@Deprecated public abstract class FileNameMetaInformation { private final UUID uuid; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java index b6adf25cc..f335f9539 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java @@ -12,6 +12,8 @@ import java.util.Optional; /** Yet supported column schemes in individual time series */ +// todo JH javadoc +@Deprecated public enum ColumnScheme { ENERGY_PRICE("c", EnergyPriceValue.class), ACTIVE_POWER("p", PValue.class), @@ -24,6 +26,7 @@ public enum ColumnScheme { private final String scheme; private final Class valueClass; + @Deprecated ColumnScheme(String scheme, Class valueClass) { this.scheme = scheme; this.valueClass = valueClass; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java index 764811943..c29fbc6e8 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java @@ -9,7 +9,13 @@ import java.util.Objects; import java.util.UUID; -/** Specific meta information, that can be derived from a individual time series file */ +/** + * Specific meta information, that can be derived from a individual time series file + * + * @deprecated since 3.0. Use {@link + * edu.ie3.datamodel.io.naming.IndividualTimeSeriesMetaInformation} instead + */ +@Deprecated public class IndividualTimeSeriesMetaInformation extends FileNameMetaInformation { private final ColumnScheme columnScheme; @@ -18,6 +24,20 @@ public IndividualTimeSeriesMetaInformation(UUID uuid, ColumnScheme columnScheme) this.columnScheme = columnScheme; } + public IndividualTimeSeriesMetaInformation( + edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation + newMetaInformation) { + super(newMetaInformation.getUuid()); + this.columnScheme = + ColumnScheme.parse(newMetaInformation.getColumnScheme().toString()) + .orElseThrow( + () -> + new RuntimeException( + "Cannot convert new column scheme " + + newMetaInformation.getColumnScheme().getScheme() + + " to deprecated column scheme!")); + } + public ColumnScheme getColumnScheme() { return columnScheme; } diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java index 26cf4ce7e..8befb7bd3 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -9,7 +9,13 @@ import java.util.Objects; import java.util.UUID; -/** Specific meta information, that can be derived from a load profile time series file */ +/** + * Specific meta information, that can be derived from a load profile time series file + * + * @deprecated since 3.0. Use {@link + * edu.ie3.datamodel.io.naming.LoadProfileTimeSeriesMetaInformation} instead + */ +@Deprecated public class LoadProfileTimeSeriesMetaInformation extends FileNameMetaInformation { private final String profile; @@ -18,6 +24,12 @@ public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { this.profile = profile; } + public LoadProfileTimeSeriesMetaInformation( + edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation metaInformation) { + super(metaInformation.getUuid()); + this.profile = metaInformation.getProfile(); + } + public String getProfile() { return profile; } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java new file mode 100644 index 000000000..b2c671d2b --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java @@ -0,0 +1,39 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.naming; + +import java.util.Objects; +import java.util.UUID; + +/** Meta information, that describe a certain data source */ +public abstract class DataSourceMetaInformation { + private final UUID uuid; + + protected DataSourceMetaInformation(UUID uuid) { + this.uuid = uuid; + } + + public UUID getUuid() { + return uuid; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof DataSourceMetaInformation that)) return false; + return uuid.equals(that.uuid); + } + + @Override + public int hashCode() { + return Objects.hash(uuid); + } + + @Override + public String toString() { + return "DataSourceMetaInformation{" + "uuid=" + uuid + '}'; + } +} 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 6946c5849..6efb47e6b 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.naming; -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; -import edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation; +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.source.TimeSeriesMappingSource; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.input.*; @@ -42,9 +42,9 @@ public class EntityPersistenceNamingStrategy { private static final String UUID_STRING = "[a-zA-Z0-9]{8}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{4}-[a-zA-Z0-9]{12}"; /** - * Regex to match the naming convention of a file for an individual time series. The column scheme - * is accessible via the named capturing group "columnScheme". The time series' UUID is accessible - * by the named capturing group "uuid" + * Regex to match the naming convention of a source for an individual time series. The column + * scheme is accessible via the named capturing group "columnScheme". The time series' UUID is + * accessible by the named capturing group "uuid" */ private static final Pattern INDIVIDUAL_TIME_SERIES_PATTERN = Pattern.compile("its_(?[a-zA-Z]{1,11})_(?" + UUID_STRING + ")"); @@ -124,13 +124,41 @@ public Pattern getIndividualTimeSeriesPattern() { return individualTimeSeriesPattern; } + /** + * Extracts meta information from a valid source name for an individual time series + * + * @param sourceName Name of the source to extract information from, e.g. file name or SQL table + * name + * @return Meta information form individual time series source name + * @deprecated since 3.0. Use {@link #getIndividualTimesSeriesMetaInformation(String)} instead + */ + @Deprecated + public edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation + extractIndividualTimesSeriesMetaInformation(String sourceName) { + Matcher matcher = getIndividualTimeSeriesPattern().matcher(sourceName); + if (!matcher.matches()) + throw new IllegalArgumentException( + "Cannot extract meta information on individual time series from '" + sourceName + "'."); + + String columnSchemeKey = matcher.group("columnScheme"); + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme columnScheme = + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.parse(columnSchemeKey) + .orElseThrow( + () -> + new IllegalArgumentException( + "Cannot parse '" + columnSchemeKey + "' to valid column scheme.")); + + return new edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation( + UUID.fromString(matcher.group("uuid")), columnScheme); + } + /** * Extracts meta information from a valid file name for an individual time series * * @param fileName File name to extract information from * @return Meta information form individual time series file name */ - public IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation( + public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformation( String fileName) { Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) @@ -154,8 +182,27 @@ public IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInfor * * @param fileName File name to extract information from * @return Meta information form load profile time series file name + * @deprecated since 3.0. Use {@link #getLoadProfileTimesSeriesMetaInformation(String)} instead */ - public LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation( + @Deprecated + public edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation + extractLoadProfileTimesSeriesMetaInformation(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 edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation( + UUID.fromString(matcher.group("uuid")), matcher.group("profile")); + } + + /** + * Extracts meta information from a valid file name for a load profile time series + * + * @param fileName File name to extract information from + * @return Meta information form load profile time series file name + */ + public LoadProfileTimeSeriesMetaInformation getLoadProfileTimesSeriesMetaInformation( String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) @@ -189,7 +236,7 @@ private static String prepareSuffix(String suffix) { /** * Returns the name of the entity, that should be used for persistence. * - * @param cls Targeted class of the given file + * @param cls Targeted class of the given entity * @return The name of the entity */ public Optional getEntityName(Class cls) { diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index f7d1b1861..986b3feb8 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -7,6 +7,8 @@ import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.csv.FileNameMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -216,8 +218,9 @@ public Pattern getLoadProfileTimeSeriesPattern() { * Extracts meta information from a file name, of a time series. * * @param path Path to the file - * @return The meeting meta information + * @return The meeting meta information // todo deprecated notice */ + @Deprecated public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { /* Extract file name from possibly fully qualified path */ Path fileName = path.getFileName(); @@ -226,22 +229,55 @@ public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { return extractTimeSeriesMetaInformation(fileName.toString()); } + /** + * Extracts meta information from a file name, of a time series. + * + * @param path Path to the file + * @return The meeting meta information + */ + public DataSourceMetaInformation timeSeriesMetaInformation(Path path) { + /* Extract file name from possibly fully qualified path */ + Path fileName = path.getFileName(); + if (fileName == null) + throw new IllegalArgumentException("Unable to extract file name from path '" + path + "'."); + return timeSeriesMetaInformation(fileName.toString()); + } + /** * Extracts meta information from a file name, of a time series. Here, a file name without * leading path has to be provided * * @param fileName File name - * @return The meeting meta information + * @return The meeting meta information // todo deprecated notice */ + @Deprecated public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName) { + + DataSourceMetaInformation meta = timeSeriesMetaInformation(fileName); + if (meta instanceof IndividualTimeSeriesMetaInformation ind) { + return new edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation(ind); + } else if (meta instanceof LoadProfileTimeSeriesMetaInformation load) { + return new edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation(load); + } else + throw new IllegalArgumentException( + "Unknown format of '" + fileName + "'. Cannot extract meta information."); + } + + /** + * Extracts meta information from a file name, of a time series. Here, a file name without + * leading path has to be provided + * + * @param fileName File name + * @return The meeting meta information + */ + public DataSourceMetaInformation timeSeriesMetaInformation(String fileName) { /* Remove the file ending (ending limited to 255 chars, which is the max file name allowed in NTFS and ext4) */ String withoutEnding = fileName.replaceAll("(?:\\.[^\\\\/\\s]{1,255}){1,2}$", ""); if (getIndividualTimeSeriesPattern().matcher(withoutEnding).matches()) - return entityPersistenceNamingStrategy.extractIndividualTimesSeriesMetaInformation( - withoutEnding); + return entityPersistenceNamingStrategy.getIndividualTimesSeriesMetaInformation(withoutEnding); else if (getLoadProfileTimeSeriesPattern().matcher(withoutEnding).matches()) - return entityPersistenceNamingStrategy.extractLoadProfileTimesSeriesMetaInformation( + return entityPersistenceNamingStrategy.getLoadProfileTimesSeriesMetaInformation( withoutEnding); else throw new IllegalArgumentException( diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java new file mode 100644 index 000000000..c3f516699 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java @@ -0,0 +1,62 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.naming.timeseries; + +import edu.ie3.datamodel.models.value.*; +import edu.ie3.util.StringUtils; +import java.util.Arrays; +import java.util.Objects; +import java.util.Optional; + +/** Yet supported column schemes in individual time series */ +public enum ColumnScheme { + ENERGY_PRICE("c", EnergyPriceValue.class), + ACTIVE_POWER("p", PValue.class), + APPARENT_POWER("pq", SValue.class), + HEAT_DEMAND("h", HeatDemandValue.class), + ACTIVE_POWER_AND_HEAT_DEMAND("ph", HeatAndPValue.class), + APPARENT_POWER_AND_HEAT_DEMAND("pqh", HeatAndSValue.class), + WEATHER("weather", WeatherValue.class); + + private final String scheme; + private final Class valueClass; + + ColumnScheme(String scheme, Class valueClass) { + this.scheme = scheme; + this.valueClass = valueClass; + } + + public String getScheme() { + return scheme; + } + + public Class getValueClass() { + return valueClass; + } + + public static Optional parse(String key) { + String cleanString = StringUtils.cleanString(key).toLowerCase(); + return Arrays.stream(ColumnScheme.values()) + .filter(entry -> Objects.equals(entry.scheme, cleanString)) + .findFirst(); + } + + public static Optional parse(Class valueClass) { + /* IMPORTANT NOTE: Make sure to start with child classes and then use parent classes to allow for most precise + * parsing (child class instances are also assignable to parent classes) */ + + if (EnergyPriceValue.class.isAssignableFrom(valueClass)) return Optional.of(ENERGY_PRICE); + if (HeatAndSValue.class.isAssignableFrom(valueClass)) + return Optional.of(APPARENT_POWER_AND_HEAT_DEMAND); + if (SValue.class.isAssignableFrom(valueClass)) return Optional.of(APPARENT_POWER); + if (HeatAndPValue.class.isAssignableFrom(valueClass)) + return Optional.of(ACTIVE_POWER_AND_HEAT_DEMAND); + if (PValue.class.isAssignableFrom(valueClass)) return Optional.of(ACTIVE_POWER); + if (HeatDemandValue.class.isAssignableFrom(valueClass)) return Optional.of(HEAT_DEMAND); + if (WeatherValue.class.isAssignableFrom(valueClass)) return Optional.of(WEATHER); + return Optional.empty(); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java new file mode 100644 index 000000000..7cf9d0b4f --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java @@ -0,0 +1,47 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.naming.timeseries; + +import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; +import java.util.Objects; +import java.util.UUID; + +/** Specific meta information, that can be derived from an individual time series file */ +public class IndividualTimeSeriesMetaInformation extends DataSourceMetaInformation { + private final ColumnScheme columnScheme; + + public IndividualTimeSeriesMetaInformation(UUID uuid, ColumnScheme columnScheme) { + super(uuid); + this.columnScheme = columnScheme; + } + + public ColumnScheme getColumnScheme() { + return columnScheme; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof IndividualTimeSeriesMetaInformation that)) return false; + if (!super.equals(o)) return false; + return columnScheme == that.columnScheme; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), columnScheme); + } + + @Override + public String toString() { + return "IndividualTimeSeriesMetaInformation{" + + "uuid=" + + getUuid() + + ", columnScheme=" + + columnScheme + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java new file mode 100644 index 000000000..358b85249 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -0,0 +1,49 @@ +/* + * © 2021. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.naming.timeseries; + +import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; +import java.util.Objects; +import java.util.UUID; + +/** Specific meta information, that can be derived from a load profile time series file */ +public class LoadProfileTimeSeriesMetaInformation extends DataSourceMetaInformation { + private final String profile; + + public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { + super(uuid); + this.profile = profile; + } + + public String getProfile() { + return profile; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false; + if (!super.equals(o)) return false; + return profile.equals(that.profile); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), profile); + } + + @Override + public String toString() { + return "LoadProfileTimeSeriesMetaInformation{" + + "uuid='" + + getUuid() + + '\'' + + ", profile='" + + profile + + '\'' + + '}'; + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java index 6a3e2bdda..fe69b2d26 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java @@ -6,11 +6,12 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.io.connectors.CsvFileConnector; -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.IdCoordinateFactory; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueData; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueFactory; import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.io.source.IdCoordinateSource; import edu.ie3.datamodel.io.source.WeatherSource; import edu.ie3.datamodel.models.UniqueEntity; @@ -94,12 +95,11 @@ public CsvWeatherSource( */ private Map> getWeatherTimeSeries() { /* Get only weather time series meta information */ - Map> - colTypeToMetaData = - connector.getCsvIndividualTimeSeriesMetaInformation(ColumnScheme.WEATHER); + Map> colTypeToMetaData = + connector.getCsvIndividualTimeSeriesMetaInformation(ColumnScheme.WEATHER); /* Reading in weather time series */ - Set weatherCsvMetaInformation = + Set weatherCsvMetaInformation = colTypeToMetaData.get(ColumnScheme.WEATHER); return readWeatherTimeSeries(weatherCsvMetaInformation, connector); @@ -154,13 +154,13 @@ private Map> trimMapToInterval( * @return time series mapped to the represented coordinate */ private Map> readWeatherTimeSeries( - Set weatherMetaInformation, + Set weatherMetaInformation, CsvFileConnector connector) { final Map> weatherTimeSeries = new HashMap<>(); Function, Optional>> fieldToValueFunction = this::buildWeatherValue; /* Reading in weather time series */ - for (CsvFileConnector.CsvIndividualTimeSeriesMetaInformation data : weatherMetaInformation) { + for (CsvIndividualTimeSeriesMetaInformation data : weatherMetaInformation) { // we need a reader for each file try (BufferedReader reader = connector.initReader(data.getFullFilePath())) { filterEmptyOptionals( From 7141e8d21fc2cfc76bf5ef3560fa8c0ca04b0bf2 Mon Sep 17 00:00:00 2001 From: Sebastian Peter <14994800+sebastian-peter@users.noreply.github.com> Date: Wed, 2 Feb 2022 23:42:25 +0100 Subject: [PATCH 2/7] More deprecations, adapting tests, adding to changelog --- CHANGELOG.md | 7 +++ .../io/connectors/CsvFileConnector.java | 24 ++++++--- ...svIndividualTimeSeriesMetaInformation.java | 3 +- .../io/csv/FileNameMetaInformation.java | 3 +- .../io/csv/timeseries/ColumnScheme.java | 7 ++- .../IndividualTimeSeriesMetaInformation.java | 2 +- .../LoadProfileTimeSeriesMetaInformation.java | 2 +- .../io/naming/FileNamingStrategy.java | 16 +++--- ...on.java => TimeSeriesMetaInformation.java} | 8 +-- .../io/naming/timeseries/ColumnScheme.java | 2 +- .../IndividualTimeSeriesMetaInformation.java | 4 +- .../LoadProfileTimeSeriesMetaInformation.java | 4 +- .../io/source/TimeSeriesMappingSource.java | 15 +++++- .../datamodel/io/source/TimeSeriesSource.java | 23 +++++++- .../csv/CsvTimeSeriesMappingSource.java | 14 +++-- .../io/source/csv/CsvTimeSeriesSource.java | 54 +++++++++++++++++-- .../sql/SqlTimeSeriesMappingSource.java | 15 ++++-- .../io/source/sql/SqlTimeSeriesSource.java | 32 ++++++++++- .../io/connectors/CsvFileConnectorTest.groovy | 23 ++++---- .../io/csv/timeseries/ColumnSchemeTest.groovy | 2 +- ...EntityPersistenceNamingStrategyTest.groovy | 4 +- .../io/naming/FileNamingStrategyTest.groovy | 18 +++---- .../csv/CsvTimeSeriesMappingSourceIT.groovy | 10 ++-- .../source/csv/CsvTimeSeriesSourceTest.groovy | 8 +-- .../sql/SqlTimeSeriesMappingSourceIT.groovy | 8 +-- .../source/sql/SqlTimeSeriesSourceIT.groovy | 4 +- 26 files changed, 231 insertions(+), 81 deletions(-) rename src/main/java/edu/ie3/datamodel/io/naming/{DataSourceMetaInformation.java => TimeSeriesMetaInformation.java} (74%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bba767da..cb6435fd1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - BREAKING: Transformer's no load susceptance needs to be zero or negative to pass model validation [#378](https://github.com/ie3-institute/PowerSystemDataModel/issues/378) - All input data sets for version < 3.0.0 need to be altered! +- Deprecating: + - `edu.ie3.datamodel.io.csv.timeseries.ColumnScheme` + - `edu.ie3.datamodel.io.csv.FileNameMetaInformation` + - `edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation` + - `edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation` + - `edu.ie3.datamodel.io.connectors.CsvFileConnector.CsvIndividualTimeSeriesMetaInformation` + - and related methods ## [2.1.0] - 2022-01-05 diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index cafef1832..9d4c3808b 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -8,8 +8,8 @@ import edu.ie3.datamodel.exceptions.ConnectorException; import edu.ie3.datamodel.io.IoUtil; import edu.ie3.datamodel.io.csv.*; -import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; import edu.ie3.datamodel.io.naming.FileNamingStrategy; +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.models.UniqueEntity; @@ -230,7 +230,15 @@ public BufferedReader initReader(String filePath) throws FileNotFoundException { .map(edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation::new); } - // todo javadoc + /** + * Get time series meta information for a given uuid. + * + *

This method lazily evaluates the mapping from all time series files to their meta + * information. + * + * @param timeSeriesUuid The time series in question + * @return An option on the queried information + */ public Optional individualTimeSeriesMetaInformation( UUID timeSeriesUuid) { if (Objects.isNull(individualTimeSeriesMetaInformation)) @@ -257,7 +265,7 @@ public Optional individualTimeSeriesMetaInf return new edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation( metaInformation, filePathWithoutEnding); }) - .collect(Collectors.toMap(DataSourceMetaInformation::getUuid, v -> v)); + .collect(Collectors.toMap(TimeSeriesMetaInformation::getUuid, v -> v)); } /** @@ -337,7 +345,7 @@ private Set getIndividualTimeSeriesFilePaths() { private Optional buildCsvTimeSeriesMetaInformation(String filePathString, ColumnScheme... columnSchemes) { try { - DataSourceMetaInformation metaInformation = + TimeSeriesMetaInformation metaInformation = fileNamingStrategy.timeSeriesMetaInformation(filePathString); if (!IndividualTimeSeriesMetaInformation.class.isAssignableFrom(metaInformation.getClass())) { log.error( @@ -445,8 +453,12 @@ public void shutdown() { }); } - /** Enhancing the {@link IndividualTimeSeriesMetaInformation} with the full path to csv file */ - // todo JH javadocs + /** + * Enhancing the {@link IndividualTimeSeriesMetaInformation} with the full path to csv file + * + * @deprecated since 3.0. Use {@link + * edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation} instead + */ @Deprecated public static class CsvIndividualTimeSeriesMetaInformation extends edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation { diff --git a/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java index 17d8bce0c..078071503 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/CsvIndividualTimeSeriesMetaInformation.java @@ -32,9 +32,8 @@ public String getFullFilePath() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof CsvIndividualTimeSeriesMetaInformation)) return false; + if (!(o instanceof CsvIndividualTimeSeriesMetaInformation that)) return false; if (!super.equals(o)) return false; - CsvIndividualTimeSeriesMetaInformation that = (CsvIndividualTimeSeriesMetaInformation) o; return fullFilePath.equals(that.fullFilePath); } diff --git a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java index 368f50c30..64a908857 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java @@ -5,13 +5,14 @@ */ package edu.ie3.datamodel.io.csv; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import java.util.Objects; import java.util.UUID; /** * Meta information, that can be derived from a certain file name * - * @deprecated since 3.0. Use {@link edu.ie3.datamodel.io.naming.DataSourceMetaInformation} instead + * @deprecated since 3.0. Use {@link TimeSeriesMetaInformation} instead */ @Deprecated public abstract class FileNameMetaInformation { diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java index f335f9539..d55f82528 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java @@ -11,8 +11,11 @@ import java.util.Objects; import java.util.Optional; -/** Yet supported column schemes in individual time series */ -// todo JH javadoc +/** + * Yet supported column schemes in individual time series + * + * @deprecated since 3.0. Use {@link edu.ie3.datamodel.io.naming.timeseries.ColumnScheme} instead + */ @Deprecated public enum ColumnScheme { ENERGY_PRICE("c", EnergyPriceValue.class), diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java index c29fbc6e8..ccb88a206 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java @@ -13,7 +13,7 @@ * Specific meta information, that can be derived from a individual time series file * * @deprecated since 3.0. Use {@link - * edu.ie3.datamodel.io.naming.IndividualTimeSeriesMetaInformation} instead + * edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation} instead */ @Deprecated public class IndividualTimeSeriesMetaInformation extends FileNameMetaInformation { diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java index 8befb7bd3..2af5e0381 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -13,7 +13,7 @@ * Specific meta information, that can be derived from a load profile time series file * * @deprecated since 3.0. Use {@link - * edu.ie3.datamodel.io.naming.LoadProfileTimeSeriesMetaInformation} instead + * edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation} instead */ @Deprecated public class LoadProfileTimeSeriesMetaInformation extends FileNameMetaInformation { diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 986b3feb8..5c42500c8 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -122,7 +122,7 @@ private Optional getFilePath(String fileName, String subDirectories) { */ public Optional getDirectoryPath(Class cls) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(cls); - if (!maybeDirectoryName.isPresent()) { + if (maybeDirectoryName.isEmpty()) { logger.debug("Cannot determine directory name for class '{}'.", cls); return Optional.empty(); } else { @@ -149,7 +149,7 @@ public Optional getDirectoryPath(Class cls) { public , E extends TimeSeriesEntry, V extends Value> Optional getDirectoryPath(T timeSeries) { Optional maybeDirectoryName = fileHierarchy.getSubDirectory(timeSeries.getClass()); - if (!maybeDirectoryName.isPresent()) { + if (maybeDirectoryName.isEmpty()) { logger.debug("Cannot determine directory name for time series '{}'.", timeSeries); return Optional.empty(); } else { @@ -218,7 +218,8 @@ public Pattern getLoadProfileTimeSeriesPattern() { * Extracts meta information from a file name, of a time series. * * @param path Path to the file - * @return The meeting meta information // todo deprecated notice + * @return The meeting meta information + * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(Path)} instead. */ @Deprecated public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { @@ -235,7 +236,7 @@ public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { * @param path Path to the file * @return The meeting meta information */ - public DataSourceMetaInformation timeSeriesMetaInformation(Path path) { + public TimeSeriesMetaInformation timeSeriesMetaInformation(Path path) { /* Extract file name from possibly fully qualified path */ Path fileName = path.getFileName(); if (fileName == null) @@ -248,12 +249,13 @@ public DataSourceMetaInformation timeSeriesMetaInformation(Path path) { * leading path has to be provided * * @param fileName File name - * @return The meeting meta information // todo deprecated notice + * @return The meeting meta information + * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(String)} instead. */ @Deprecated public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName) { - DataSourceMetaInformation meta = timeSeriesMetaInformation(fileName); + TimeSeriesMetaInformation meta = timeSeriesMetaInformation(fileName); if (meta instanceof IndividualTimeSeriesMetaInformation ind) { return new edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation(ind); } else if (meta instanceof LoadProfileTimeSeriesMetaInformation load) { @@ -270,7 +272,7 @@ public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName) * @param fileName File name * @return The meeting meta information */ - public DataSourceMetaInformation timeSeriesMetaInformation(String fileName) { + public TimeSeriesMetaInformation timeSeriesMetaInformation(String fileName) { /* Remove the file ending (ending limited to 255 chars, which is the max file name allowed in NTFS and ext4) */ String withoutEnding = fileName.replaceAll("(?:\\.[^\\\\/\\s]{1,255}){1,2}$", ""); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java similarity index 74% rename from src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java index b2c671d2b..8af6a38f1 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/TimeSeriesMetaInformation.java @@ -9,10 +9,10 @@ import java.util.UUID; /** Meta information, that describe a certain data source */ -public abstract class DataSourceMetaInformation { +public abstract class TimeSeriesMetaInformation { private final UUID uuid; - protected DataSourceMetaInformation(UUID uuid) { + protected TimeSeriesMetaInformation(UUID uuid) { this.uuid = uuid; } @@ -23,7 +23,7 @@ public UUID getUuid() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof DataSourceMetaInformation that)) return false; + if (!(o instanceof TimeSeriesMetaInformation that)) return false; return uuid.equals(that.uuid); } @@ -34,6 +34,6 @@ public int hashCode() { @Override public String toString() { - return "DataSourceMetaInformation{" + "uuid=" + uuid + '}'; + return "TimeSeriesMetaInformation{" + "uuid=" + uuid + '}'; } } diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java index c3f516699..44359e34b 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java @@ -11,7 +11,7 @@ import java.util.Objects; import java.util.Optional; -/** Yet supported column schemes in individual time series */ +/** Supported column schemes in individual time series */ public enum ColumnScheme { ENERGY_PRICE("c", EnergyPriceValue.class), ACTIVE_POWER("p", PValue.class), diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java index 7cf9d0b4f..dfd42685b 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java @@ -5,12 +5,12 @@ */ package edu.ie3.datamodel.io.naming.timeseries; -import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import java.util.Objects; import java.util.UUID; /** Specific meta information, that can be derived from an individual time series file */ -public class IndividualTimeSeriesMetaInformation extends DataSourceMetaInformation { +public class IndividualTimeSeriesMetaInformation extends TimeSeriesMetaInformation { private final ColumnScheme columnScheme; public IndividualTimeSeriesMetaInformation(UUID uuid, ColumnScheme columnScheme) { diff --git a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java index 358b85249..d1e319668 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -5,12 +5,12 @@ */ package edu.ie3.datamodel.io.naming.timeseries; -import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; +import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import java.util.Objects; import java.util.UUID; /** Specific meta information, that can be derived from a load profile time series file */ -public class LoadProfileTimeSeriesMetaInformation extends DataSourceMetaInformation { +public class LoadProfileTimeSeriesMetaInformation extends TimeSeriesMetaInformation { private final String profile; public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java index b85e31994..2ed0b32f5 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.models.input.InputEntity; import java.util.Map; import java.util.Objects; @@ -39,8 +39,19 @@ default Optional getTimeSeriesUuid(UUID modelIdentifier) { * * @param timeSeriesUuid Unique identifier of the time series in question * @return An Option onto the meta information + * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ - Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); + @Deprecated + Optional + getTimeSeriesMetaInformation(UUID timeSeriesUuid); + + /** + * Get an option on the given time series meta information + * + * @param timeSeriesUuid Unique identifier of the time series in question + * @return An Option onto the meta information + */ + Optional timeSeriesMetaInformation(UUID timeSeriesUuid); /** Class to represent one entry within the participant to time series mapping */ class MappingEntry extends InputEntity { diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java index f82eb4ac9..5c3f65f9e 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.*; +import static edu.ie3.datamodel.io.naming.timeseries.ColumnScheme.*; -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.value.Value; import edu.ie3.util.interval.ClosedInterval; @@ -21,6 +21,25 @@ */ public interface TimeSeriesSource extends DataSource { + /** + * Checks whether the given column scheme can be used with time series. + * + * @param scheme the column scheme to check + * @return whether the scheme is accepted or not + * @deprecated since 3.0 + */ + @Deprecated + static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme scheme) { + return EnumSet.of( + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.ACTIVE_POWER, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.APPARENT_POWER, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.ENERGY_PRICE, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.ACTIVE_POWER_AND_HEAT_DEMAND, + edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.HEAT_DEMAND) + .contains(scheme); + } + /** * Checks whether the given column scheme can be used with time series. * diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java index 2e05a4e52..8b35e5607 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java @@ -5,10 +5,10 @@ */ package edu.ie3.datamodel.io.source.csv; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory; import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import java.util.Map; import java.util.Optional; @@ -43,9 +43,17 @@ public Map getMapping() { return mapping; } + /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ @Override - public Optional getTimeSeriesMetaInformation( - UUID timeSeriesUuid) { + @Deprecated + public Optional + getTimeSeriesMetaInformation(UUID timeSeriesUuid) { return connector.getIndividualTimeSeriesMetaInformation(timeSeriesUuid); } + + @Override + public Optional timeSeriesMetaInformation( + UUID timeSeriesUuid) { + return connector.individualTimeSeriesMetaInformation(timeSeriesUuid); + } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 241a9d165..0057c8b2a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -6,7 +6,7 @@ package edu.ie3.datamodel.io.source.csv; import edu.ie3.datamodel.exceptions.SourceException; -import edu.ie3.datamodel.io.connectors.CsvFileConnector; +import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.*; import edu.ie3.datamodel.io.naming.FileNamingStrategy; import edu.ie3.datamodel.io.source.TimeSeriesSource; @@ -37,12 +37,15 @@ public class CsvTimeSeriesSource extends CsvDataSource * @param metaInformation The given meta information * @throws SourceException If the given meta information are not supported * @return The source + * @deprecated since 3.0 */ + @Deprecated public static CsvTimeSeriesSource getSource( String csvSep, String folderPath, FileNamingStrategy fileNamingStrategy, - CsvFileConnector.CsvIndividualTimeSeriesMetaInformation metaInformation) + edu.ie3.datamodel.io.connectors.CsvFileConnector.CsvIndividualTimeSeriesMetaInformation + metaInformation) throws SourceException { if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) throw new SourceException( @@ -53,11 +56,56 @@ public static CsvTimeSeriesSource getSource( return create(csvSep, folderPath, fileNamingStrategy, metaInformation, valClass); } + /** @deprecated since 3.0 */ + @Deprecated private static CsvTimeSeriesSource create( String csvSep, String folderPath, FileNamingStrategy fileNamingStrategy, - CsvFileConnector.CsvIndividualTimeSeriesMetaInformation metaInformation, + edu.ie3.datamodel.io.connectors.CsvFileConnector.CsvIndividualTimeSeriesMetaInformation + metaInformation, + Class valClass) { + TimeBasedSimpleValueFactory valueFactory = new TimeBasedSimpleValueFactory<>(valClass); + return new CsvTimeSeriesSource<>( + csvSep, + folderPath, + fileNamingStrategy, + metaInformation.getUuid(), + metaInformation.getFullFilePath(), + valClass, + valueFactory); + } + + /** + * Factory method to build a source from given meta information + * + * @param csvSep the separator string for csv columns + * @param folderPath path to the folder holding the time series files + * @param fileNamingStrategy strategy for the file naming of time series files / data sinks + * @param metaInformation The given meta information + * @throws SourceException If the given meta information are not supported + * @return The source + */ + public static CsvTimeSeriesSource getSource( + String csvSep, + String folderPath, + FileNamingStrategy fileNamingStrategy, + CsvIndividualTimeSeriesMetaInformation metaInformation) + throws SourceException { + if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) + throw new SourceException( + "Unsupported column scheme '" + metaInformation.getColumnScheme() + "'."); + + Class valClass = metaInformation.getColumnScheme().getValueClass(); + + return create(csvSep, folderPath, fileNamingStrategy, metaInformation, valClass); + } + + private static CsvTimeSeriesSource create( + String csvSep, + String folderPath, + FileNamingStrategy fileNamingStrategy, + CsvIndividualTimeSeriesMetaInformation metaInformation, Class valClass) { TimeBasedSimpleValueFactory valueFactory = new TimeBasedSimpleValueFactory<>(valClass); return new CsvTimeSeriesSource<>( diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java index 8123a1a60..6ac6748fa 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java @@ -6,10 +6,10 @@ package edu.ie3.datamodel.io.source.sql; import edu.ie3.datamodel.io.connectors.SqlConnector; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.factory.SimpleEntityData; import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory; import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; import java.util.Map; import java.util.Optional; @@ -43,13 +43,22 @@ public Map getMapping() { .collect(Collectors.toMap(MappingEntry::getParticipant, MappingEntry::getTimeSeries)); } + /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ @Override - public Optional getTimeSeriesMetaInformation( - UUID timeSeriesUuid) { + @Deprecated + public Optional + getTimeSeriesMetaInformation(UUID timeSeriesUuid) { return getDbTableName(null, "%" + timeSeriesUuid.toString()) .map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation); } + @Override + public Optional timeSeriesMetaInformation( + UUID timeSeriesUuid) { + return getDbTableName(null, "%" + timeSeriesUuid.toString()) + .map(entityPersistenceNamingStrategy::getIndividualTimesSeriesMetaInformation); + } + @Override protected Optional createEntity(Map fieldToValues) { SimpleEntityData entityData = new SimpleEntityData(fieldToValues, MappingEntry.class); diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index 5386c4ab8..f80444cbf 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -7,9 +7,9 @@ import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.connectors.SqlConnector; -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.factory.timeseries.SimpleTimeBasedValueData; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesSource; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; @@ -36,6 +36,36 @@ public class SqlTimeSeriesSource extends SqlDataSource getSource( + SqlConnector connector, + String schemaName, + String tableName, + edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation metaInformation, + String timePattern) + throws SourceException { + if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) + throw new SourceException( + "Unsupported column scheme '" + metaInformation.getColumnScheme() + "'."); + + Class valClass = metaInformation.getColumnScheme().getValueClass(); + + return create( + connector, schemaName, tableName, metaInformation.getUuid(), valClass, timePattern); + } + /** * Factory method to build a source from given meta information * diff --git a/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy index 2907d62d2..e8acdc1c0 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy @@ -6,11 +6,12 @@ package edu.ie3.datamodel.io.connectors import edu.ie3.datamodel.exceptions.ConnectorException +import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy import edu.ie3.datamodel.io.csv.CsvFileDefinition import edu.ie3.datamodel.io.naming.DefaultDirectoryHierarchy -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.NodeInput import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries @@ -80,12 +81,12 @@ class CsvFileConnectorTest extends Specification { def "The csv file connector is able to build correct uuid to meta information mapping"() { given: def expected = [ - (UUID.fromString("53990eea-1b5d-47e8-9134-6d8de36604bf")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("53990eea-1b5d-47e8-9134-6d8de36604bf"), ColumnScheme.APPARENT_POWER, "its_pq_53990eea-1b5d-47e8-9134-6d8de36604bf"), - (UUID.fromString("fcf0b851-a836-4bde-8090-f44c382ed226")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("fcf0b851-a836-4bde-8090-f44c382ed226"), ColumnScheme.ACTIVE_POWER, "its_p_fcf0b851-a836-4bde-8090-f44c382ed226"), - (UUID.fromString("5022a70e-a58f-4bac-b8ec-1c62376c216b")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("5022a70e-a58f-4bac-b8ec-1c62376c216b"), ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND, "its_pqh_5022a70e-a58f-4bac-b8ec-1c62376c216b"), - (UUID.fromString("b88dee50-5484-4136-901d-050d8c1c97d1")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("b88dee50-5484-4136-901d-050d8c1c97d1"), ColumnScheme.ENERGY_PRICE, "its_c_b88dee50-5484-4136-901d-050d8c1c97d1"), - (UUID.fromString("c7b0d9d6-5044-4f51-80b4-f221d8b1f14b")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("c7b0d9d6-5044-4f51-80b4-f221d8b1f14b"), ColumnScheme.ENERGY_PRICE, "its_c_c7b0d9d6-5044-4f51-80b4-f221d8b1f14b"), - (UUID.fromString("085d98ee-09a2-4de4-b119-83949690d7b6")): new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("085d98ee-09a2-4de4-b119-83949690d7b6"), ColumnScheme.WEATHER, "its_weather_085d98ee-09a2-4de4-b119-83949690d7b6") + (UUID.fromString("53990eea-1b5d-47e8-9134-6d8de36604bf")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("53990eea-1b5d-47e8-9134-6d8de36604bf"), ColumnScheme.APPARENT_POWER, "its_pq_53990eea-1b5d-47e8-9134-6d8de36604bf"), + (UUID.fromString("fcf0b851-a836-4bde-8090-f44c382ed226")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("fcf0b851-a836-4bde-8090-f44c382ed226"), ColumnScheme.ACTIVE_POWER, "its_p_fcf0b851-a836-4bde-8090-f44c382ed226"), + (UUID.fromString("5022a70e-a58f-4bac-b8ec-1c62376c216b")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("5022a70e-a58f-4bac-b8ec-1c62376c216b"), ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND, "its_pqh_5022a70e-a58f-4bac-b8ec-1c62376c216b"), + (UUID.fromString("b88dee50-5484-4136-901d-050d8c1c97d1")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("b88dee50-5484-4136-901d-050d8c1c97d1"), ColumnScheme.ENERGY_PRICE, "its_c_b88dee50-5484-4136-901d-050d8c1c97d1"), + (UUID.fromString("c7b0d9d6-5044-4f51-80b4-f221d8b1f14b")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("c7b0d9d6-5044-4f51-80b4-f221d8b1f14b"), ColumnScheme.ENERGY_PRICE, "its_c_c7b0d9d6-5044-4f51-80b4-f221d8b1f14b"), + (UUID.fromString("085d98ee-09a2-4de4-b119-83949690d7b6")): new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("085d98ee-09a2-4de4-b119-83949690d7b6"), ColumnScheme.WEATHER, "its_weather_085d98ee-09a2-4de4-b119-83949690d7b6") ] when: @@ -97,7 +98,7 @@ class CsvFileConnectorTest extends Specification { def "The csv file connector returns empty optional, if there is no meta information for queried time series"() { when: - def actual = cfc.getIndividualTimeSeriesMetaInformation(UUID.fromString("2602e863-3eb6-480e-b752-a3e653af74ec")) + def actual = cfc.individualTimeSeriesMetaInformation(UUID.fromString("2602e863-3eb6-480e-b752-a3e653af74ec")) then: !actual.present @@ -106,10 +107,10 @@ class CsvFileConnectorTest extends Specification { def "The csv file connector returns correct individual time series meta information"() { given: def timeSeriesUuid = UUID.fromString("b88dee50-5484-4136-901d-050d8c1c97d1") - def expected = Optional.of(new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(timeSeriesUuid, ColumnScheme.ENERGY_PRICE, "its_c_b88dee50-5484-4136-901d-050d8c1c97d1")) + def expected = Optional.of(new CsvIndividualTimeSeriesMetaInformation(timeSeriesUuid, ColumnScheme.ENERGY_PRICE, "its_c_b88dee50-5484-4136-901d-050d8c1c97d1")) when: - def actual = cfc.getIndividualTimeSeriesMetaInformation(timeSeriesUuid) + def actual = cfc.individualTimeSeriesMetaInformation(timeSeriesUuid) then: actual == expected @@ -129,7 +130,7 @@ class CsvFileConnectorTest extends Specification { def "The csv file connector is able to build correct meta information from valid input"() { given: def pathString = "its_pq_53990eea-1b5d-47e8-9134-6d8de36604bf" - def expected = new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation( + def expected = new CsvIndividualTimeSeriesMetaInformation( UUID.fromString("53990eea-1b5d-47e8-9134-6d8de36604bf"), ColumnScheme.APPARENT_POWER, "" diff --git a/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy index ba3f02452..e0c2d4dd3 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy @@ -5,7 +5,7 @@ */ package edu.ie3.datamodel.io.csv.timeseries -import static edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.* +import static edu.ie3.datamodel.io.naming.timeseries.ColumnScheme.* import edu.ie3.datamodel.models.value.EnergyPriceValue import edu.ie3.datamodel.models.value.HeatAndPValue diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 988bd1597..4778bfc19 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -124,7 +124,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def fileName = "foo" when: - fns.extractIndividualTimesSeriesMetaInformation(fileName) + fns.getIndividualTimesSeriesMetaInformation(fileName) then: def ex = thrown(IllegalArgumentException) @@ -137,7 +137,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def fileName = "foo" when: - fns.extractLoadProfileTimesSeriesMetaInformation(fileName) + fns.getIndividualTimesSeriesMetaInformation(fileName) then: def ex = thrown(IllegalArgumentException) diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy index 6385e4945..b9f83e7d6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.naming -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation -import edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation +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.source.TimeSeriesMappingSource import edu.ie3.datamodel.models.BdewLoadProfile import edu.ie3.datamodel.models.UniqueEntity @@ -820,7 +820,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get("/bla/foo") when: - fns.extractTimeSeriesMetaInformation(path) + fns.timeSeriesMetaInformation(path) then: def ex = thrown(IllegalArgumentException) @@ -833,7 +833,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get(pathString) when: - def metaInformation = fns.extractTimeSeriesMetaInformation(path) + def metaInformation = fns.timeSeriesMetaInformation(path) then: IndividualTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) @@ -859,7 +859,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get(pathString) when: - def metaInformation = fns.extractTimeSeriesMetaInformation(path) + def metaInformation = fns.timeSeriesMetaInformation(path) then: IndividualTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) @@ -885,7 +885,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get("/bla/foo/its_whoops_4881fda2-bcee-4f4f-a5bb-6a09bf785276.csv") when: - fns.extractTimeSeriesMetaInformation(path) + fns.timeSeriesMetaInformation(path) then: def ex = thrown(IllegalArgumentException) @@ -898,7 +898,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get("/bla/foo/lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304.csv") when: - def metaInformation = fns.extractTimeSeriesMetaInformation(path) + def metaInformation = fns.timeSeriesMetaInformation(path) then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) @@ -914,7 +914,7 @@ class FileNamingStrategyTest extends Specification { def path = Paths.get("/bla/foo/prefix_lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304_suffix.csv") when: - def metaInformation = fns.extractTimeSeriesMetaInformation(path) + def metaInformation = fns.timeSeriesMetaInformation(path) then: LoadProfileTimeSeriesMetaInformation.isAssignableFrom(metaInformation.getClass()) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy index 1034201c6..d8f0ce0b7 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy @@ -5,9 +5,9 @@ */ package edu.ie3.datamodel.io.source.csv +import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy -import edu.ie3.datamodel.io.connectors.CsvFileConnector -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.source.TimeSeriesMappingSource import spock.lang.Shared import spock.lang.Specification @@ -68,7 +68,7 @@ class CsvTimeSeriesMappingSourceIT extends Specification implements CsvTestDataM def timeSeriesUuid = UUID.fromString("f5eb3be5-98db-40de-85b0-243507636cd5") when: - def actual = source.getTimeSeriesMetaInformation(timeSeriesUuid) + def actual = source.timeSeriesMetaInformation(timeSeriesUuid) then: !actual.present @@ -77,13 +77,13 @@ class CsvTimeSeriesMappingSourceIT extends Specification implements CsvTestDataM def "A csv time series mapping source returns correct meta information for an existing time series"() { given: def timeSeriesUuid = UUID.fromString("3fbfaa97-cff4-46d4-95ba-a95665e87c26") - def expected = new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation( + def expected = new CsvIndividualTimeSeriesMetaInformation( timeSeriesUuid, ColumnScheme.APPARENT_POWER, "its_pq_3fbfaa97-cff4-46d4-95ba-a95665e87c26") when: - def actual = source.getTimeSeriesMetaInformation(timeSeriesUuid) + def actual = source.timeSeriesMetaInformation(timeSeriesUuid) then: actual.present diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy index 3106a2184..b04858992 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSourceTest.groovy @@ -5,13 +5,13 @@ */ package edu.ie3.datamodel.io.source.csv +import edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.naming.FileNamingStrategy +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme import static edu.ie3.datamodel.models.StandardUnits.ENERGY_PRICE import edu.ie3.datamodel.exceptions.SourceException -import edu.ie3.datamodel.io.connectors.CsvFileConnector -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.* @@ -50,7 +50,7 @@ class CsvTimeSeriesSourceTest extends Specification implements CsvTestDataMeta { def "The factory method in csv time series source refuses to build time series with unsupported column type"() { given: - def metaInformation = new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(UUID.fromString("8bc9120d-fb9b-4484-b4e3-0cdadf0feea9"), ColumnScheme.WEATHER, "its_weather_8bc9120d-fb9b-4484-b4e3-0cdadf0feea9") + def metaInformation = new CsvIndividualTimeSeriesMetaInformation(UUID.fromString("8bc9120d-fb9b-4484-b4e3-0cdadf0feea9"), ColumnScheme.WEATHER, "its_weather_8bc9120d-fb9b-4484-b4e3-0cdadf0feea9") when: CsvTimeSeriesSource.getSource(";", timeSeriesFolderPath, fileNamingStrategy, metaInformation) @@ -62,7 +62,7 @@ class CsvTimeSeriesSourceTest extends Specification implements CsvTestDataMeta { def "The factory method in csv time series source builds a time series source for all supported column types"() { given: - def metaInformation = new CsvFileConnector.CsvIndividualTimeSeriesMetaInformation(uuid, columnScheme, path) + def metaInformation = new CsvIndividualTimeSeriesMetaInformation(uuid, columnScheme, path) when: def actual = CsvTimeSeriesSource.getSource(";", timeSeriesFolderPath, fileNamingStrategy, metaInformation) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy index d754b00a7..90380ea66 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy @@ -6,9 +6,9 @@ package edu.ie3.datamodel.io.source.sql import edu.ie3.datamodel.io.connectors.SqlConnector -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation import org.testcontainers.containers.Container import org.testcontainers.containers.PostgreSQLContainer import org.testcontainers.spock.Testcontainers @@ -84,7 +84,7 @@ class SqlTimeSeriesMappingSourceIT extends Specification { def timeSeriesUuid = UUID.fromString("f5eb3be5-98db-40de-85b0-243507636cd5") when: - def actual = source.getTimeSeriesMetaInformation(timeSeriesUuid) + def actual = source.timeSeriesMetaInformation(timeSeriesUuid) then: !actual.present @@ -98,7 +98,7 @@ class SqlTimeSeriesMappingSourceIT extends Specification { ColumnScheme.ACTIVE_POWER) when: - def actual = source.getTimeSeriesMetaInformation(timeSeriesUuid) + def actual = source.timeSeriesMetaInformation(timeSeriesUuid) then: actual.present diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy index 739d9eacd..36eedbb4c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy @@ -7,10 +7,10 @@ package edu.ie3.datamodel.io.source.sql import static edu.ie3.test.common.TimeSeriesSourceTestData.* +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.connectors.SqlConnector -import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme -import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.models.value.* import edu.ie3.util.interval.ClosedInterval import org.testcontainers.containers.Container From 92fe81ef13238e6994bdd7b7d0050b9e90934ec0 Mon Sep 17 00:00:00 2001 From: Sebastian Peter <14994800+sebastian-peter@users.noreply.github.com> Date: Wed, 2 Feb 2022 23:55:09 +0100 Subject: [PATCH 3/7] Fixing test --- .../io/naming/EntityPersistenceNamingStrategyTest.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 4778bfc19..7a2561e25 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -137,7 +137,7 @@ class EntityPersistenceNamingStrategyTest extends Specification { def fileName = "foo" when: - fns.getIndividualTimesSeriesMetaInformation(fileName) + fns.getLoadProfileTimesSeriesMetaInformation(fileName) then: def ex = thrown(IllegalArgumentException) From 5320ac7c0c1846bc92c6ec98c65a4e62d9a324a1 Mon Sep 17 00:00:00 2001 From: Sebastian Peter <14994800+sebastian-peter@users.noreply.github.com> Date: Thu, 3 Feb 2022 00:19:25 +0100 Subject: [PATCH 4/7] Specified arguments of deprecation tags --- .../edu/ie3/datamodel/io/connectors/CsvFileConnector.java | 4 ++-- .../edu/ie3/datamodel/io/csv/FileNameMetaInformation.java | 2 +- .../edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java | 2 +- .../csv/timeseries/IndividualTimeSeriesMetaInformation.java | 2 +- .../csv/timeseries/LoadProfileTimeSeriesMetaInformation.java | 2 +- .../datamodel/io/naming/EntityPersistenceNamingStrategy.java | 4 ++-- .../java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java | 4 ++-- .../edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java | 2 +- .../java/edu/ie3/datamodel/io/source/TimeSeriesSource.java | 2 +- .../datamodel/io/source/csv/CsvTimeSeriesMappingSource.java | 2 +- .../edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java | 4 ++-- .../datamodel/io/source/sql/SqlTimeSeriesMappingSource.java | 2 +- .../edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java | 2 +- 13 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java index 9d4c3808b..0332fba36 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -223,7 +223,7 @@ public BufferedReader initReader(String filePath) throws FileNotFoundException { * @return An option on the queried information * @deprecated since 3.0. Use {@link #individualTimeSeriesMetaInformation(UUID)} instead */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public Optional getIndividualTimeSeriesMetaInformation(UUID timeSeriesUuid) { return individualTimeSeriesMetaInformation(timeSeriesUuid) @@ -459,7 +459,7 @@ public void shutdown() { * @deprecated since 3.0. Use {@link * edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation} instead */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public static class CsvIndividualTimeSeriesMetaInformation extends edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation { private final String fullFilePath; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java index 64a908857..3c90665f9 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java @@ -14,7 +14,7 @@ * * @deprecated since 3.0. Use {@link TimeSeriesMetaInformation} instead */ -@Deprecated +@Deprecated(since = "3.0", forRemoval = true) public abstract class FileNameMetaInformation { private final UUID uuid; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java index d55f82528..caf683d31 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java @@ -16,7 +16,7 @@ * * @deprecated since 3.0. Use {@link edu.ie3.datamodel.io.naming.timeseries.ColumnScheme} instead */ -@Deprecated +@Deprecated(since = "3.0", forRemoval = true) public enum ColumnScheme { ENERGY_PRICE("c", EnergyPriceValue.class), ACTIVE_POWER("p", PValue.class), diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java index ccb88a206..cfa357af9 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java @@ -15,7 +15,7 @@ * @deprecated since 3.0. Use {@link * edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation} instead */ -@Deprecated +@Deprecated(since = "3.0", forRemoval = true) public class IndividualTimeSeriesMetaInformation extends FileNameMetaInformation { private final ColumnScheme columnScheme; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java index 2af5e0381..e4e29616d 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -15,7 +15,7 @@ * @deprecated since 3.0. Use {@link * edu.ie3.datamodel.io.naming.timeseries.LoadProfileTimeSeriesMetaInformation} instead */ -@Deprecated +@Deprecated(since = "3.0", forRemoval = true) public class LoadProfileTimeSeriesMetaInformation extends FileNameMetaInformation { private final String profile; 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 6efb47e6b..515e9625f 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -132,7 +132,7 @@ public Pattern getIndividualTimeSeriesPattern() { * @return Meta information form individual time series source name * @deprecated since 3.0. Use {@link #getIndividualTimesSeriesMetaInformation(String)} instead */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation(String sourceName) { Matcher matcher = getIndividualTimeSeriesPattern().matcher(sourceName); @@ -184,7 +184,7 @@ public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformati * @return Meta information form load profile time series file name * @deprecated since 3.0. Use {@link #getLoadProfileTimesSeriesMetaInformation(String)} instead */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation(String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index 5c42500c8..d7f5d3227 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -221,7 +221,7 @@ public Pattern getLoadProfileTimeSeriesPattern() { * @return The meeting meta information * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(Path)} instead. */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { /* Extract file name from possibly fully qualified path */ Path fileName = path.getFileName(); @@ -252,7 +252,7 @@ public TimeSeriesMetaInformation timeSeriesMetaInformation(Path path) { * @return The meeting meta information * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(String)} instead. */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName) { TimeSeriesMetaInformation meta = timeSeriesMetaInformation(fileName); diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java index 2ed0b32f5..d43149d88 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java @@ -41,7 +41,7 @@ default Optional getTimeSeriesUuid(UUID modelIdentifier) { * @return An Option onto the meta information * @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid); diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java index 5c3f65f9e..b2d5a8f6a 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -28,7 +28,7 @@ public interface TimeSeriesSource extends DataSource { * @return whether the scheme is accepted or not * @deprecated since 3.0 */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme scheme) { return EnumSet.of( edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.ACTIVE_POWER, diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java index 8b35e5607..23549e831 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java @@ -45,7 +45,7 @@ public Map getMapping() { /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ @Override - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid) { return connector.getIndividualTimeSeriesMetaInformation(timeSeriesUuid); diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 0057c8b2a..91df6c0e9 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -39,7 +39,7 @@ public class CsvTimeSeriesSource extends CsvDataSource * @return The source * @deprecated since 3.0 */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public static CsvTimeSeriesSource getSource( String csvSep, String folderPath, @@ -57,7 +57,7 @@ public static CsvTimeSeriesSource getSource( } /** @deprecated since 3.0 */ - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) private static CsvTimeSeriesSource create( String csvSep, String folderPath, diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java index 6ac6748fa..616877e20 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java @@ -45,7 +45,7 @@ public Map getMapping() { /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ @Override - @Deprecated + @Deprecated(since = "3.0", forRemoval = true) public Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid) { return getDbTableName(null, "%" + timeSeriesUuid.toString()) diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index f80444cbf..cdcd70890 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -48,7 +48,7 @@ public class SqlTimeSeriesSource extends SqlDataSource getSource( SqlConnector connector, String schemaName, From 01c9c55e2ae657921bed8faba043b612d4bd6b3f Mon Sep 17 00:00:00 2001 From: Sebastian Peter <14994800+sebastian-peter@users.noreply.github.com> Date: Thu, 3 Feb 2022 01:06:49 +0100 Subject: [PATCH 5/7] Small improvement --- .../java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java index 3c90665f9..f60770230 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java @@ -5,14 +5,13 @@ */ package edu.ie3.datamodel.io.csv; -import edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation; import java.util.Objects; import java.util.UUID; /** * Meta information, that can be derived from a certain file name * - * @deprecated since 3.0. Use {@link TimeSeriesMetaInformation} instead + * @deprecated since 3.0. Use {@link edu.ie3.datamodel.io.naming.TimeSeriesMetaInformation} instead */ @Deprecated(since = "3.0", forRemoval = true) public abstract class FileNameMetaInformation { From 61d1da25cb0893335c0a87ee0ea3f2c99b509884 Mon Sep 17 00:00:00 2001 From: Sebastian Peter <14994800+sebastian-peter@users.noreply.github.com> Date: Thu, 3 Feb 2022 01:09:10 +0100 Subject: [PATCH 6/7] SqlIndividualTimeSeriesMetaInformation --- CHANGELOG.md | 3 +- .../EntityPersistenceNamingStrategy.java | 13 ++-- .../sql/SqlTimeSeriesMappingSource.java | 14 ++++- .../io/source/sql/SqlTimeSeriesSource.java | 13 ++-- ...qlIndividualTimeSeriesMetaInformation.java | 60 +++++++++++++++++++ .../sql/SqlTimeSeriesMappingSourceIT.groovy | 31 +++++++--- .../source/sql/SqlTimeSeriesSourceIT.groovy | 22 +++---- 7 files changed, 125 insertions(+), 31 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/sql/SqlIndividualTimeSeriesMetaInformation.java diff --git a/CHANGELOG.md b/CHANGELOG.md index cb6435fd1..e209002bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - SQL time series sources (`SqlTimeSeriesSource` and `SqlTimeSeriesMappingSource`) [#467](https://github.com/ie3-institute/PowerSystemDataModel/issues/467) - Graph with impedance weighted edges including facilities to create it [#440](https://github.com/ie3-institute/PowerSystemDataModel/issues/440) +- Introducing `SqlIndividualTimeSeriesMetaInformation` which provides sql table names [#513](https://github.com/ie3-institute/PowerSystemDataModel/issues/513) ### Fixed - Reduced code smells [#492](https://github.com/ie3-institute/PowerSystemDataModel/issues/492) @@ -26,7 +27,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - BREAKING: Transformer's no load susceptance needs to be zero or negative to pass model validation [#378](https://github.com/ie3-institute/PowerSystemDataModel/issues/378) - All input data sets for version < 3.0.0 need to be altered! -- Deprecating: +- Deprecating (as part of [#513](https://github.com/ie3-institute/PowerSystemDataModel/issues/513)): - `edu.ie3.datamodel.io.csv.timeseries.ColumnScheme` - `edu.ie3.datamodel.io.csv.FileNameMetaInformation` - `edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation` 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 515e9625f..1edf2a1d1 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -153,17 +153,18 @@ public Pattern getIndividualTimeSeriesPattern() { } /** - * Extracts meta information from a valid file name for an individual time series + * Extracts meta information from a valid source name for an individual time series * - * @param fileName File name to extract information from - * @return Meta information form individual time series file name + * @param sourceName Name of the source to extract information from, e.g. file name or SQL table + * name + * @return Meta information form individual time series source name */ public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformation( - String fileName) { - Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName); + String sourceName) { + Matcher matcher = getIndividualTimeSeriesPattern().matcher(sourceName); if (!matcher.matches()) throw new IllegalArgumentException( - "Cannot extract meta information on individual time series from '" + fileName + "'."); + "Cannot extract meta information on individual time series from '" + sourceName + "'."); String columnSchemeKey = matcher.group("columnScheme"); ColumnScheme columnScheme = diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java index 616877e20..fa42a3745 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java @@ -11,6 +11,7 @@ import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy; import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesMappingSource; +import edu.ie3.datamodel.io.sql.SqlIndividualTimeSeriesMetaInformation; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -22,6 +23,7 @@ public class SqlTimeSeriesMappingSource extends SqlDataSource new RuntimeException("")); this.queryFull = createBaseQueryString(schemaName, tableName); + + this.schemaName = schemaName; } @Override @@ -55,8 +59,14 @@ public Map getMapping() { @Override public Optional timeSeriesMetaInformation( UUID timeSeriesUuid) { - return getDbTableName(null, "%" + timeSeriesUuid.toString()) - .map(entityPersistenceNamingStrategy::getIndividualTimesSeriesMetaInformation); + return getDbTableName(schemaName, "%" + timeSeriesUuid.toString()) + .map( + tableName -> { + IndividualTimeSeriesMetaInformation metaInformation = + entityPersistenceNamingStrategy.getIndividualTimesSeriesMetaInformation( + tableName); + return new SqlIndividualTimeSeriesMetaInformation(metaInformation, tableName); + }); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index cdcd70890..7d372f655 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -9,8 +9,8 @@ import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.factory.timeseries.SimpleTimeBasedValueData; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory; -import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.io.source.TimeSeriesSource; +import edu.ie3.datamodel.io.sql.SqlIndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries; import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue; import edu.ie3.datamodel.models.value.Value; @@ -71,7 +71,6 @@ public static SqlTimeSeriesSource getSource( * * @param connector the connector needed for database connection * @param schemaName the database schema to use - * @param tableName the database table to use * @param metaInformation the time series meta information * @param timePattern the pattern of time values * @return a SqlTimeSeriesSource for given time series table @@ -80,8 +79,7 @@ public static SqlTimeSeriesSource getSource( public static SqlTimeSeriesSource getSource( SqlConnector connector, String schemaName, - String tableName, - IndividualTimeSeriesMetaInformation metaInformation, + SqlIndividualTimeSeriesMetaInformation metaInformation, String timePattern) throws SourceException { if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) @@ -91,7 +89,12 @@ public static SqlTimeSeriesSource getSource( Class valClass = metaInformation.getColumnScheme().getValueClass(); return create( - connector, schemaName, tableName, metaInformation.getUuid(), valClass, timePattern); + connector, + schemaName, + metaInformation.getTableName(), + metaInformation.getUuid(), + valClass, + timePattern); } private static SqlTimeSeriesSource create( diff --git a/src/main/java/edu/ie3/datamodel/io/sql/SqlIndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/sql/SqlIndividualTimeSeriesMetaInformation.java new file mode 100644 index 000000000..db05cf3ad --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/sql/SqlIndividualTimeSeriesMetaInformation.java @@ -0,0 +1,60 @@ +/* + * © 2022. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.io.sql; + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import java.util.Objects; +import java.util.UUID; + +/** + * Enhancing the {@link IndividualTimeSeriesMetaInformation} with the name of the table containing + * the time series + */ +public class SqlIndividualTimeSeriesMetaInformation extends IndividualTimeSeriesMetaInformation { + private final String tableName; + + public SqlIndividualTimeSeriesMetaInformation( + UUID uuid, ColumnScheme columnScheme, String tableName) { + super(uuid, columnScheme); + this.tableName = tableName; + } + + public SqlIndividualTimeSeriesMetaInformation( + IndividualTimeSeriesMetaInformation metaInformation, String fullFilePath) { + this(metaInformation.getUuid(), metaInformation.getColumnScheme(), fullFilePath); + } + + public String getTableName() { + return tableName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof SqlIndividualTimeSeriesMetaInformation that)) return false; + if (!super.equals(o)) return false; + return tableName.equals(that.tableName); + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), tableName); + } + + @Override + public String toString() { + return "SqlIndividualTimeSeriesMetaInformation{" + + "uuid=" + + getUuid() + + ", columnScheme=" + + getColumnScheme() + + ", tableName='" + + tableName + + '\'' + + '}'; + } +} diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy index 90380ea66..0aa87d322 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy @@ -8,7 +8,7 @@ package edu.ie3.datamodel.io.source.sql import edu.ie3.datamodel.io.connectors.SqlConnector import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme -import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation +import edu.ie3.datamodel.io.sql.SqlIndividualTimeSeriesMetaInformation import org.testcontainers.containers.Container import org.testcontainers.containers.PostgreSQLContainer import org.testcontainers.spock.Testcontainers @@ -25,6 +25,12 @@ class SqlTimeSeriesMappingSourceIT extends Specification { @Shared PostgreSQLContainer postgreSQLContainer = new PostgreSQLContainer("postgres:11.14") + @Shared + UUID timeSeriesUuidP = UUID.fromString("9185b8c1-86ba-4a16-8dea-5ac898e8caa5") + + @Shared + SqlConnector connector + @Shared SqlTimeSeriesMappingSource source @@ -51,7 +57,7 @@ class SqlTimeSeriesMappingSourceIT extends Specification { assert res.stderr.empty } - def connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) + connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) source = new SqlTimeSeriesMappingSource(connector, "public", new EntityPersistenceNamingStrategy()) } @@ -92,16 +98,27 @@ class SqlTimeSeriesMappingSourceIT extends Specification { def "A sql time series mapping source returns correct meta information for an existing time series"() { given: - def timeSeriesUuid = UUID.fromString("9185b8c1-86ba-4a16-8dea-5ac898e8caa5") - def expected = new IndividualTimeSeriesMetaInformation( - timeSeriesUuid, - ColumnScheme.ACTIVE_POWER) + def expected = new SqlIndividualTimeSeriesMetaInformation( + timeSeriesUuidP, + ColumnScheme.ACTIVE_POWER, + "its_p_9185b8c1-86ba-4a16-8dea-5ac898e8caa5") when: - def actual = source.timeSeriesMetaInformation(timeSeriesUuid) + def actual = source.timeSeriesMetaInformation(timeSeriesUuidP) then: actual.present actual.get() == expected } + + def "A sql time series mapping source does not return meta information for time series that exists within a different scheme"() { + given: + def sourceOther = new SqlTimeSeriesMappingSource(connector, "notExisting", new EntityPersistenceNamingStrategy()) + + when: + def actual = sourceOther.timeSeriesMetaInformation(timeSeriesUuidP) + + then: + !actual.present + } } diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy index 36eedbb4c..76c47f20c 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSourceIT.groovy @@ -7,10 +7,10 @@ package edu.ie3.datamodel.io.source.sql import static edu.ie3.test.common.TimeSeriesSourceTestData.* -import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme -import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation import edu.ie3.datamodel.exceptions.SourceException import edu.ie3.datamodel.io.connectors.SqlConnector +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.sql.SqlIndividualTimeSeriesMetaInformation import edu.ie3.datamodel.models.value.* import edu.ie3.util.interval.ClosedInterval import org.testcontainers.containers.Container @@ -64,21 +64,22 @@ class SqlTimeSeriesSourceIT extends Specification { } connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) - def metaInformation = new IndividualTimeSeriesMetaInformation( + def metaInformation = new SqlIndividualTimeSeriesMetaInformation( timeSeriesUuid, - ColumnScheme.ACTIVE_POWER + ColumnScheme.ACTIVE_POWER, + pTableName ) - pSource = SqlTimeSeriesSource.getSource(connector, schemaName, pTableName, metaInformation, "yyyy-MM-dd HH:mm:ss") + pSource = SqlTimeSeriesSource.getSource(connector, schemaName, metaInformation, "yyyy-MM-dd HH:mm:ss") } def "The factory method in SqlTimeSeriesSource builds a time series source for all supported column types"() { given: - def metaInformation = new IndividualTimeSeriesMetaInformation(uuid, columnScheme) + def metaInformation = new SqlIndividualTimeSeriesMetaInformation(uuid, columnScheme, tableName) def timePattern = "yyyy-MM-dd HH:mm:ss" when: - def actual = SqlTimeSeriesSource.getSource(connector, schemaName, tableName, metaInformation, timePattern) + def actual = SqlTimeSeriesSource.getSource(connector, schemaName, metaInformation, timePattern) then: actual.timeSeries.entries.size() == amountOfEntries @@ -96,14 +97,15 @@ class SqlTimeSeriesSourceIT extends Specification { def "The factory method in SqlTimeSeriesSource refuses to build time series with unsupported column type"() { given: - def metaInformation = new IndividualTimeSeriesMetaInformation( + def metaInformation = new SqlIndividualTimeSeriesMetaInformation( UUID.fromString("8bc9120d-fb9b-4484-b4e3-0cdadf0feea9"), - ColumnScheme.WEATHER + ColumnScheme.WEATHER, + "weather" ) def timePattern = "yyyy-MM-dd HH:mm:ss" when: - SqlTimeSeriesSource.getSource(connector, schemaName, "weather", metaInformation, timePattern) + SqlTimeSeriesSource.getSource(connector, schemaName, metaInformation, timePattern) then: def e = thrown(SourceException) From cf8843a26963be2dea1e1919b827ae4fc63c79d0 Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Tue, 8 Feb 2022 12:56:39 +0100 Subject: [PATCH 7/7] Addressing reviewers comments, providing richer deprecation messages --- .../naming/EntityPersistenceNamingStrategy.java | 8 ++++---- .../datamodel/io/naming/FileNamingStrategy.java | 5 ++--- .../datamodel/io/source/TimeSeriesSource.java | 3 ++- .../io/source/csv/CsvTimeSeriesSource.java | 4 +++- .../source/sql/SqlTimeSeriesMappingSource.java | 5 ++--- .../io/source/sql/SqlTimeSeriesSource.java | 4 +++- .../EntityPersistenceNamingStrategyTest.groovy | 16 ++++++++-------- 7 files changed, 24 insertions(+), 21 deletions(-) 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 1edf2a1d1..8feea487f 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java @@ -130,7 +130,7 @@ public Pattern getIndividualTimeSeriesPattern() { * @param sourceName Name of the source to extract information from, e.g. file name or SQL table * name * @return Meta information form individual time series source name - * @deprecated since 3.0. Use {@link #getIndividualTimesSeriesMetaInformation(String)} instead + * @deprecated since 3.0. Use {@link #individualTimesSeriesMetaInformation(String)} instead */ @Deprecated(since = "3.0", forRemoval = true) public edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation @@ -159,7 +159,7 @@ public Pattern getIndividualTimeSeriesPattern() { * name * @return Meta information form individual time series source name */ - public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformation( + public IndividualTimeSeriesMetaInformation individualTimesSeriesMetaInformation( String sourceName) { Matcher matcher = getIndividualTimeSeriesPattern().matcher(sourceName); if (!matcher.matches()) @@ -183,7 +183,7 @@ public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformati * * @param fileName File name to extract information from * @return Meta information form load profile time series file name - * @deprecated since 3.0. Use {@link #getLoadProfileTimesSeriesMetaInformation(String)} instead + * @deprecated since 3.0. Use {@link #loadProfileTimesSeriesMetaInformation(String)} instead */ @Deprecated(since = "3.0", forRemoval = true) public edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation @@ -203,7 +203,7 @@ public IndividualTimeSeriesMetaInformation getIndividualTimesSeriesMetaInformati * @param fileName File name to extract information from * @return Meta information form load profile time series file name */ - public LoadProfileTimeSeriesMetaInformation getLoadProfileTimesSeriesMetaInformation( + public LoadProfileTimeSeriesMetaInformation loadProfileTimesSeriesMetaInformation( String fileName) { Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName); if (!matcher.matches()) diff --git a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java index d7f5d3227..593cf0238 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -277,10 +277,9 @@ public TimeSeriesMetaInformation timeSeriesMetaInformation(String fileName) { String withoutEnding = fileName.replaceAll("(?:\\.[^\\\\/\\s]{1,255}){1,2}$", ""); if (getIndividualTimeSeriesPattern().matcher(withoutEnding).matches()) - return entityPersistenceNamingStrategy.getIndividualTimesSeriesMetaInformation(withoutEnding); + return entityPersistenceNamingStrategy.individualTimesSeriesMetaInformation(withoutEnding); else if (getLoadProfileTimeSeriesPattern().matcher(withoutEnding).matches()) - return entityPersistenceNamingStrategy.getLoadProfileTimesSeriesMetaInformation( - withoutEnding); + return entityPersistenceNamingStrategy.loadProfileTimesSeriesMetaInformation(withoutEnding); else throw new IllegalArgumentException( "Unknown format of '" + fileName + "'. Cannot extract meta information."); diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java index b2d5a8f6a..b7aa4dba2 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -26,7 +26,8 @@ public interface TimeSeriesSource extends DataSource { * * @param scheme the column scheme to check * @return whether the scheme is accepted or not - * @deprecated since 3.0 + * @deprecated since 3.0. Use {@link + * #isSchemeAccepted(edu.ie3.datamodel.io.naming.timeseries.ColumnScheme)} instead. */ @Deprecated(since = "3.0", forRemoval = true) static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme scheme) { diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java index 91df6c0e9..8026684b8 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java @@ -37,7 +37,9 @@ public class CsvTimeSeriesSource extends CsvDataSource * @param metaInformation The given meta information * @throws SourceException If the given meta information are not supported * @return The source - * @deprecated since 3.0 + * @deprecated since 3.0. Use {@link CsvTimeSeriesSource#getSource(java.lang.String, + * java.lang.String, edu.ie3.datamodel.io.naming.FileNamingStrategy, + * edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation)} instead. */ @Deprecated(since = "3.0", forRemoval = true) public static CsvTimeSeriesSource getSource( diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java index fa42a3745..23c5681ef 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java @@ -52,7 +52,7 @@ public Map getMapping() { @Deprecated(since = "3.0", forRemoval = true) public Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid) { - return getDbTableName(null, "%" + timeSeriesUuid.toString()) + return getDbTableName(schemaName, "%" + timeSeriesUuid.toString()) .map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation); } @@ -63,8 +63,7 @@ public Optional timeSeriesMetaInformation( .map( tableName -> { IndividualTimeSeriesMetaInformation metaInformation = - entityPersistenceNamingStrategy.getIndividualTimesSeriesMetaInformation( - tableName); + entityPersistenceNamingStrategy.individualTimesSeriesMetaInformation(tableName); return new SqlIndividualTimeSeriesMetaInformation(metaInformation, tableName); }); } diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java index 7d372f655..e95263a7f 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java @@ -46,7 +46,9 @@ public class SqlTimeSeriesSource extends SqlDataSource getSource( diff --git a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy index 7a2561e25..fd76cb02d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy @@ -82,11 +82,11 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "The pattern for an individual time series file name actually matches a valid file name and extracts the correct groups"() { given: - def fns = new EntityPersistenceNamingStrategy() + def ens = new EntityPersistenceNamingStrategy() def validFileName = "its_c_4881fda2-bcee-4f4f-a5bb-6a09bf785276" when: - def matcher = fns.individualTimeSeriesPattern.matcher(validFileName) + def matcher = ens.individualTimeSeriesPattern.matcher(validFileName) then: "the pattern matches" matcher.matches() @@ -101,11 +101,11 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "The pattern for a repetitive load profile time series file name actually matches a valid file name and extracts the correct groups"() { given: - def fns = new EntityPersistenceNamingStrategy() + def ens = new EntityPersistenceNamingStrategy() def validFileName = "lpts_g3_bee0a8b6-4788-4f18-bf72-be52035f7304" when: - def matcher = fns.loadProfileTimeSeriesPattern.matcher(validFileName) + def matcher = ens.loadProfileTimeSeriesPattern.matcher(validFileName) then: "the pattern matches" matcher.matches() @@ -120,11 +120,11 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() { given: - def fns = new EntityPersistenceNamingStrategy() + def ens = new EntityPersistenceNamingStrategy() def fileName = "foo" when: - fns.getIndividualTimesSeriesMetaInformation(fileName) + ens.individualTimesSeriesMetaInformation(fileName) then: def ex = thrown(IllegalArgumentException) @@ -133,11 +133,11 @@ class EntityPersistenceNamingStrategyTest extends Specification { def "Trying to extract load profile time series meta information throws an Exception, if it is provided a malformed string"() { given: - def fns = new EntityPersistenceNamingStrategy() + def ens = new EntityPersistenceNamingStrategy() def fileName = "foo" when: - fns.getLoadProfileTimesSeriesMetaInformation(fileName) + ens.loadProfileTimesSeriesMetaInformation(fileName) then: def ex = thrown(IllegalArgumentException)