diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bba767da..ed1b40f1d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +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) - Protected constructors for abstract classes 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..78a186bc9 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; @@ -246,7 +247,7 @@ public Optional getIndividualTimeSeriesMeta return new CsvIndividualTimeSeriesMetaInformation( metaInformation, filePathWithoutEnding); }) - .collect(Collectors.toMap(FileNameMetaInformation::getUuid, v -> v)); + .collect(Collectors.toMap(DataSourceMetaInformation::getUuid, v -> v)); } /** @@ -325,7 +326,7 @@ private Set getIndividualTimeSeriesFilePaths() { private Optional buildCsvTimeSeriesMetaInformation( String filePathString, ColumnScheme... columnSchemes) { try { - FileNameMetaInformation metaInformation = + DataSourceMetaInformation metaInformation = fileNamingStrategy.extractTimeSeriesMetaInformation(filePathString); if (!IndividualTimeSeriesMetaInformation.class.isAssignableFrom(metaInformation.getClass())) { log.error( @@ -456,9 +457,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/connectors/SqlConnector.java b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java index e664caaff..c30b6fccb 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/SqlConnector.java @@ -5,6 +5,8 @@ */ package edu.ie3.datamodel.io.connectors; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.util.StringUtils; import edu.ie3.util.TimeUtil; import java.sql.*; @@ -156,4 +158,54 @@ public Map extractFieldMap(ResultSet rs) { } return insensitiveFieldsToAttributes; } + + /** + * Enhancing the {@link IndividualTimeSeriesMetaInformation} with the name of the table containing + * the time series + */ + public static 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/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java similarity index 63% rename from src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java index f9ab35d46..b2c671d2b 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/FileNameMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/DataSourceMetaInformation.java @@ -3,16 +3,16 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.io.csv; +package edu.ie3.datamodel.io.naming; import java.util.Objects; import java.util.UUID; -/** Meta information, that can be derived from a certain file name */ -public abstract class FileNameMetaInformation { +/** Meta information, that describe a certain data source */ +public abstract class DataSourceMetaInformation { private final UUID uuid; - protected FileNameMetaInformation(UUID uuid) { + protected DataSourceMetaInformation(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 FileNameMetaInformation that)) return false; + if (!(o instanceof DataSourceMetaInformation that)) return false; return uuid.equals(that.uuid); } @@ -34,6 +34,6 @@ public int hashCode() { @Override public String toString() { - return "FileNameMetaInformation{" + "uuid=" + uuid + '}'; + 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..c558405f1 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 + ")"); @@ -125,17 +125,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 extractIndividualTimesSeriesMetaInformation( - 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 = @@ -189,7 +190,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..cf146c0c1 100644 --- a/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java @@ -6,7 +6,6 @@ package edu.ie3.datamodel.io.naming; import edu.ie3.datamodel.io.IoUtil; -import edu.ie3.datamodel.io.csv.FileNameMetaInformation; import edu.ie3.datamodel.models.UniqueEntity; import edu.ie3.datamodel.models.timeseries.TimeSeries; import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry; @@ -218,7 +217,7 @@ public Pattern getLoadProfileTimeSeriesPattern() { * @param path Path to the file * @return The meeting meta information */ - public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { + public DataSourceMetaInformation extractTimeSeriesMetaInformation(Path path) { /* Extract file name from possibly fully qualified path */ Path fileName = path.getFileName(); if (fileName == null) @@ -233,7 +232,7 @@ public FileNameMetaInformation extractTimeSeriesMetaInformation(Path path) { * @param fileName File name * @return The meeting meta information */ - public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName) { + public DataSourceMetaInformation extractTimeSeriesMetaInformation(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/csv/timeseries/ColumnScheme.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java similarity index 98% rename from src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java index b6adf25cc..c3f516699 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/ColumnScheme.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/ColumnScheme.java @@ -3,7 +3,7 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.io.csv.timeseries; +package edu.ie3.datamodel.io.naming.timeseries; import edu.ie3.datamodel.models.value.*; import edu.ie3.util.StringUtils; diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java similarity index 68% rename from src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java index 764811943..7cf9d0b4f 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/IndividualTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/IndividualTimeSeriesMetaInformation.java @@ -3,14 +3,14 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.io.csv.timeseries; +package edu.ie3.datamodel.io.naming.timeseries; -import edu.ie3.datamodel.io.csv.FileNameMetaInformation; +import edu.ie3.datamodel.io.naming.DataSourceMetaInformation; import java.util.Objects; import java.util.UUID; -/** Specific meta information, that can be derived from a individual time series file */ -public class IndividualTimeSeriesMetaInformation extends FileNameMetaInformation { +/** 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) { @@ -25,9 +25,8 @@ public ColumnScheme getColumnScheme() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof IndividualTimeSeriesMetaInformation)) return false; + if (!(o instanceof IndividualTimeSeriesMetaInformation that)) return false; if (!super.equals(o)) return false; - IndividualTimeSeriesMetaInformation that = (IndividualTimeSeriesMetaInformation) o; return columnScheme == that.columnScheme; } diff --git a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java similarity index 74% rename from src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java rename to src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java index 26cf4ce7e..358b85249 100644 --- a/src/main/java/edu/ie3/datamodel/io/csv/timeseries/LoadProfileTimeSeriesMetaInformation.java +++ b/src/main/java/edu/ie3/datamodel/io/naming/timeseries/LoadProfileTimeSeriesMetaInformation.java @@ -3,14 +3,14 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.io.csv.timeseries; +package edu.ie3.datamodel.io.naming.timeseries; -import edu.ie3.datamodel.io.csv.FileNameMetaInformation; +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 FileNameMetaInformation { +public class LoadProfileTimeSeriesMetaInformation extends DataSourceMetaInformation { private final String profile; public LoadProfileTimeSeriesMetaInformation(UUID uuid, String profile) { @@ -25,9 +25,8 @@ public String getProfile() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof LoadProfileTimeSeriesMetaInformation)) return false; + if (!(o instanceof LoadProfileTimeSeriesMetaInformation that)) return false; if (!super.equals(o)) return false; - LoadProfileTimeSeriesMetaInformation that = (LoadProfileTimeSeriesMetaInformation) o; return profile.equals(that.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..d82faded3 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; @@ -64,9 +64,8 @@ public UUID getTimeSeries() { @Override public boolean equals(Object o) { if (this == o) return true; - if (!(o instanceof MappingEntry)) return false; + if (!(o instanceof MappingEntry that)) return false; if (!super.equals(o)) return false; - MappingEntry that = (MappingEntry) o; return participant.equals(that.participant) && timeSeries.equals(that.timeSeries); } 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..c4f2a0e26 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; 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..e3b16108f 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; 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..2973dd1fd 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,11 @@ 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.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; 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..af509088f 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; @@ -22,6 +22,7 @@ public class SqlTimeSeriesMappingSource extends SqlDataSource new RuntimeException("")); this.queryFull = createBaseQueryString(schemaName, tableName); + + this.schemaName = schemaName; } @Override @@ -46,8 +49,15 @@ public Map getMapping() { @Override public Optional getTimeSeriesMetaInformation( UUID timeSeriesUuid) { - return getDbTableName(null, "%" + timeSeriesUuid.toString()) - .map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation); + return getDbTableName(schemaName, "%" + timeSeriesUuid.toString()) + .map( + tableName -> { + IndividualTimeSeriesMetaInformation metaInformation = + entityPersistenceNamingStrategy.extractIndividualTimesSeriesMetaInformation( + tableName); + return new SqlConnector.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 5386c4ab8..cdc56e132 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,7 +7,6 @@ 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.source.TimeSeriesSource; @@ -41,7 +40,6 @@ public class SqlTimeSeriesSource extends SqlDataSource extends SqlDataSource getSource( SqlConnector connector, String schemaName, - String tableName, - IndividualTimeSeriesMetaInformation metaInformation, + SqlConnector.SqlIndividualTimeSeriesMetaInformation metaInformation, String timePattern) throws SourceException { if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) @@ -61,7 +58,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/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy index 2907d62d2..092aca0c6 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/connectors/CsvFileConnectorTest.groovy @@ -9,7 +9,7 @@ import edu.ie3.datamodel.exceptions.ConnectorException 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.timeseries.ColumnScheme import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy import edu.ie3.datamodel.models.StandardUnits import edu.ie3.datamodel.models.input.NodeInput diff --git a/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlIndividualTimeSeriesMetaInformationTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlIndividualTimeSeriesMetaInformationTest.groovy new file mode 100644 index 000000000..92d50f8d4 --- /dev/null +++ b/src/test/groovy/edu/ie3/datamodel/io/connectors/SqlIndividualTimeSeriesMetaInformationTest.groovy @@ -0,0 +1,51 @@ +package edu.ie3.datamodel.io.connectors + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation +import spock.lang.Shared +import spock.lang.Specification + +class SqlIndividualTimeSeriesMetaInformationTest extends Specification { + + @Shared + private final UUID randomUUID = UUID.fromString("80d1bbec-79df-4ae2-b60a-34a2c3f77408") + + @Shared + private final ColumnScheme columnScheme = ColumnScheme.ACTIVE_POWER + + @Shared + private final String tableName = "its_p_80d1bbec-79df-4ae2-b60a-34a2c3f77408" + + def "SqlIndividualTimeSeriesMetaInformation is properly created with standard constructor"() { + when: + def sqlMetaInf = new SqlConnector.SqlIndividualTimeSeriesMetaInformation(randomUUID, columnScheme, tableName) + + then: + sqlMetaInf.uuid == randomUUID + sqlMetaInf.columnScheme == columnScheme + sqlMetaInf.tableName == tableName + } + + def "SqlIndividualTimeSeriesMetaInformation is properly created with secondary constructor"() { + given: + def metaInf = new IndividualTimeSeriesMetaInformation(randomUUID, columnScheme) + + when: + def sqlMetaInf = new SqlConnector.SqlIndividualTimeSeriesMetaInformation(metaInf, tableName) + + then: + sqlMetaInf.uuid == randomUUID + sqlMetaInf.columnScheme == columnScheme + sqlMetaInf.tableName == tableName + } + + def "SqlIndividualTimeSeriesMetaInformation returns a proper String representation"() { + when: + def sqlMetaInf = new SqlConnector.SqlIndividualTimeSeriesMetaInformation(randomUUID, columnScheme, tableName) + + then: + sqlMetaInf.toString() == + "SqlIndividualTimeSeriesMetaInformation{uuid=80d1bbec-79df-4ae2-b60a-34a2c3f77408, " + + "columnScheme=ACTIVE_POWER, tableName='its_p_80d1bbec-79df-4ae2-b60a-34a2c3f77408'}" + } +} 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..e8afdc1bc 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 diff --git a/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/naming/timeseries/ColumnSchemeTest.groovy similarity index 93% rename from src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy rename to src/test/groovy/edu/ie3/datamodel/io/naming/timeseries/ColumnSchemeTest.groovy index ba3f02452..9bd75ac2f 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/csv/timeseries/ColumnSchemeTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/naming/timeseries/ColumnSchemeTest.groovy @@ -3,9 +3,9 @@ * Institute of Energy Systems, Energy Efficiency and Energy Economics, * Research group Distribution grid planning and operation */ -package edu.ie3.datamodel.io.csv.timeseries +package edu.ie3.datamodel.io.naming.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/source/csv/CsvTimeSeriesMappingSourceIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSourceIT.groovy index 1034201c6..73b032de4 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 @@ -7,7 +7,7 @@ package edu.ie3.datamodel.io.source.csv 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 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..7501d9d25 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 @@ -11,7 +11,7 @@ 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.naming.timeseries.ColumnScheme import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue import edu.ie3.datamodel.models.value.* 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..b498b14bc 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,8 @@ 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 org.testcontainers.containers.Container import org.testcontainers.containers.PostgreSQLContainer import org.testcontainers.spock.Testcontainers @@ -25,6 +24,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 +56,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 +97,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 SqlConnector.SqlIndividualTimeSeriesMetaInformation( + timeSeriesUuidP, + ColumnScheme.ACTIVE_POWER, + "its_p_9185b8c1-86ba-4a16-8dea-5ac898e8caa5") when: - def actual = source.getTimeSeriesMetaInformation(timeSeriesUuid) + def actual = source.getTimeSeriesMetaInformation(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.getTimeSeriesMetaInformation(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 739d9eacd..93f251022 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 @@ -9,8 +9,7 @@ import static edu.ie3.test.common.TimeSeriesSourceTestData.* 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.io.naming.timeseries.ColumnScheme import edu.ie3.datamodel.models.value.* import edu.ie3.util.interval.ClosedInterval import org.testcontainers.containers.Container @@ -64,21 +63,22 @@ class SqlTimeSeriesSourceIT extends Specification { } connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password) - def metaInformation = new IndividualTimeSeriesMetaInformation( + def metaInformation = new SqlConnector.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 SqlConnector.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 +96,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 SqlConnector.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)