From 5fed8538552373b6a3b9edf6bc447ca2499c83dd Mon Sep 17 00:00:00 2001 From: Sebastian Peter Date: Thu, 24 Feb 2022 17:15:21 +0100 Subject: [PATCH 01/10] Restructuring SQL sources and introducing TimeSeriesTypeSource --- .../io/connectors/CsvFileConnector.java | 21 +-- .../timeseries/TimeSeriesTypeFactory.java | 40 ++++++ .../io/naming/DatabaseNamingStrategy.java | 20 +++ .../io/source/TimeSeriesConstants.java | 26 ++++ .../io/source/TimeSeriesMappingSource.java | 14 +- .../datamodel/io/source/TimeSeriesSource.java | 11 +- .../io/source/TimeSeriesTypeSource.java | 61 ++++++++ .../csv/CsvTimeSeriesMappingSource.java | 12 +- .../source/csv/CsvTimeSeriesTypeSource.java | 25 ++++ .../io/source/sql/SqlDataSource.java | 20 +-- .../sql/SqlTimeSeriesMappingSource.java | 29 ++-- .../io/source/sql/SqlTimeSeriesSource.java | 135 ++++++++++++++++-- .../source/sql/SqlTimeSeriesTypeSource.java | 79 ++++++++++ ...qlIndividualTimeSeriesMetaInformation.java | 60 -------- .../io/connectors/SqlConnectorIT.groovy | 2 +- .../sql/SqlTimeSeriesMappingSourceIT.groovy | 53 +------ .../source/sql/SqlTimeSeriesSourceIT.groovy | 56 ++++---- .../sql/SqlTimeSeriesTypeSourceIT.groovy | 81 +++++++++++ .../source/sql/SqlWeatherSourceIconIT.groovy | 2 +- .../source/sql/SqlWeatherSourcePsdmIT.groovy | 2 +- .../source/sql/timeseries/time_series_c.sql | 19 +++ .../source/sql/timeseries/time_series_h.sql | 18 +++ .../sql/timeseries/time_series_mapping.sql | 7 +- .../source/sql/timeseries/time_series_p.sql | 20 +++ .../source/sql/timeseries/time_series_ph.sql | 19 +++ .../source/sql/timeseries/time_series_pq.sql | 19 +++ .../source/sql/timeseries/time_series_pqh.sql | 20 +++ 27 files changed, 644 insertions(+), 227 deletions(-) create mode 100644 src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesTypeFactory.java create mode 100644 src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/TimeSeriesConstants.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/TimeSeriesTypeSource.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesTypeSource.java create mode 100644 src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesTypeSource.java delete mode 100644 src/main/java/edu/ie3/datamodel/io/sql/SqlIndividualTimeSeriesMetaInformation.java create mode 100644 src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesTypeSourceIT.groovy create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_c.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_h.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_p.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_ph.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_pq.sql create mode 100644 src/test/resources/edu/ie3/datamodel/io/source/sql/timeseries/time_series_pqh.sql 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 0332fba36..9df2348b9 100644 --- a/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java +++ b/src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java @@ -221,30 +221,32 @@ 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 + * @deprecated since 3.0. Use {@link #getIndividualTimeSeriesMetaInformation()} instead */ @Deprecated(since = "3.0", forRemoval = true) public Optional getIndividualTimeSeriesMetaInformation(UUID timeSeriesUuid) { - return individualTimeSeriesMetaInformation(timeSeriesUuid) + if (Objects.isNull(individualTimeSeriesMetaInformation)) + individualTimeSeriesMetaInformation = buildIndividualTimeSeriesMetaInformation(); + + return Optional.ofNullable(individualTimeSeriesMetaInformation.get(timeSeriesUuid)) .map(edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation::new); } /** - * Get time series meta information for a given uuid. + * Get time series meta information * *

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 + * @return All time series meta information */ - public Optional individualTimeSeriesMetaInformation( - UUID timeSeriesUuid) { + public Map + getIndividualTimeSeriesMetaInformation() { if (Objects.isNull(individualTimeSeriesMetaInformation)) individualTimeSeriesMetaInformation = buildIndividualTimeSeriesMetaInformation(); - return Optional.ofNullable(individualTimeSeriesMetaInformation.get(timeSeriesUuid)); + return individualTimeSeriesMetaInformation; } /** @@ -485,9 +487,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/factory/timeseries/TimeSeriesTypeFactory.java b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesTypeFactory.java new file mode 100644 index 000000000..e42f6e557 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/factory/timeseries/TimeSeriesTypeFactory.java @@ -0,0 +1,40 @@ +/* + * © 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.factory.timeseries; + +import edu.ie3.datamodel.io.factory.EntityFactory; +import edu.ie3.datamodel.io.factory.SimpleEntityData; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.source.TimeSeriesTypeSource; +import java.util.Collections; +import java.util.List; +import java.util.Set; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class TimeSeriesTypeFactory + extends EntityFactory { + private static final String TIME_SERIES = "timeSeries"; + private static final String COLUMN_SCHEME = "columnScheme"; + + public TimeSeriesTypeFactory() { + super(TimeSeriesTypeSource.TypeEntry.class); + } + + @Override + protected List> getFields(SimpleEntityData data) { + return Collections.singletonList( + Stream.of(TIME_SERIES, COLUMN_SCHEME).collect(Collectors.toSet())); + } + + @Override + protected TimeSeriesTypeSource.TypeEntry buildModel(SimpleEntityData data) { + UUID timeSeries = data.getUUID(TIME_SERIES); + ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow(); + return new TimeSeriesTypeSource.TypeEntry(timeSeries, columnScheme); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java new file mode 100644 index 000000000..ba0cbbee1 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/naming/DatabaseNamingStrategy.java @@ -0,0 +1,20 @@ +/* + * © 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.naming; + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; + +/** A naming strategy for database entities */ +public class DatabaseNamingStrategy { + + public String getTimeSeriesPrefix() { + return "time_series_"; + } + + public String getTimeSeriesEntityName(ColumnScheme columnScheme) { + return getTimeSeriesPrefix() + columnScheme.getScheme(); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesConstants.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesConstants.java new file mode 100644 index 000000000..9a76f62ec --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesConstants.java @@ -0,0 +1,26 @@ +/* + * © 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.source; + +import static edu.ie3.datamodel.io.naming.timeseries.ColumnScheme.*; + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import java.util.EnumSet; + +public class TimeSeriesConstants { + private TimeSeriesConstants() { + // do not instantiate + } + + public static final EnumSet ACCEPTED_COLUMN_SCHEMES = + EnumSet.of( + ACTIVE_POWER, + APPARENT_POWER, + ENERGY_PRICE, + APPARENT_POWER_AND_HEAT_DEMAND, + ACTIVE_POWER_AND_HEAT_DEMAND, + HEAT_DEMAND); +} 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 d43149d88..66d718651 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,6 @@ */ package edu.ie3.datamodel.io.source; -import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; import edu.ie3.datamodel.models.input.InputEntity; import java.util.Map; import java.util.Objects; @@ -39,20 +38,12 @@ 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 + * @deprecated since 3.0. Use {@link TimeSeriesTypeSource#getTimeSeriesMetaInformation()} instead */ @Deprecated(since = "3.0", forRemoval = true) 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 { private final UUID participant; @@ -75,9 +66,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 b7aa4dba2..6a9d3581c 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java @@ -5,8 +5,6 @@ */ package edu.ie3.datamodel.io.source; -import static edu.ie3.datamodel.io.naming.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; @@ -48,14 +46,7 @@ static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme * @return whether the scheme is accepted or not */ static boolean isSchemeAccepted(ColumnScheme scheme) { - return EnumSet.of( - ACTIVE_POWER, - APPARENT_POWER, - ENERGY_PRICE, - APPARENT_POWER_AND_HEAT_DEMAND, - ACTIVE_POWER_AND_HEAT_DEMAND, - HEAT_DEMAND) - .contains(scheme); + return TimeSeriesConstants.ACCEPTED_COLUMN_SCHEMES.contains(scheme); } /** diff --git a/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesTypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesTypeSource.java new file mode 100644 index 000000000..6647cf1e9 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/TimeSeriesTypeSource.java @@ -0,0 +1,61 @@ +/* + * © 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.source; + +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.models.input.InputEntity; +import java.util.Map; +import java.util.Objects; +import java.util.UUID; + +public interface TimeSeriesTypeSource extends DataSource { + + /** + * Get a mapping from time series {@link UUID} to its meta information {@link + * IndividualTimeSeriesMetaInformation} + * + * @return That mapping + */ + Map getTimeSeriesMetaInformation(); + + /** Class to represent one entry within the participant to time series mapping */ + class TypeEntry extends InputEntity { + private final ColumnScheme columnScheme; + + public TypeEntry(UUID timeSeries, ColumnScheme columnScheme) { + super(timeSeries); + this.columnScheme = columnScheme; + } + + public UUID getTimeSeries() { + return getUuid(); + } + + public ColumnScheme getColumnScheme() { + return columnScheme; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + if (!super.equals(o)) return false; + TypeEntry typeEntry = (TypeEntry) o; + return columnScheme == typeEntry.columnScheme; + } + + @Override + public int hashCode() { + return Objects.hash(super.hashCode(), columnScheme); + } + + @Override + public String toString() { + return "TypeEntry{" + "uuid=" + getUuid() + ", columnScheme=" + columnScheme + '}'; + } + } +} 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 23549e831..7fb2e379b 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 @@ -8,7 +8,6 @@ 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,17 +42,14 @@ public Map getMapping() { return mapping; } - /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ + /** + * @deprecated since 3.0. Use {@link CsvTimeSeriesTypeSource#getTimeSeriesMetaInformation()} + * instead + */ @Override @Deprecated(since = "3.0", forRemoval = true) 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/CsvTimeSeriesTypeSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesTypeSource.java new file mode 100644 index 000000000..9a176afb7 --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesTypeSource.java @@ -0,0 +1,25 @@ +/* + * © 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.source.csv; + +import edu.ie3.datamodel.io.naming.FileNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation; +import edu.ie3.datamodel.io.source.TimeSeriesTypeSource; +import java.util.Map; +import java.util.UUID; + +public class CsvTimeSeriesTypeSource extends CsvDataSource implements TimeSeriesTypeSource { + + protected CsvTimeSeriesTypeSource( + String csvSep, String folderPath, FileNamingStrategy fileNamingStrategy) { + super(csvSep, folderPath, fileNamingStrategy); + } + + @Override + public Map getTimeSeriesMetaInformation() { + return connector.getIndividualTimeSeriesMetaInformation(); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java index c97e5aea0..08f8a959b 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlDataSource.java @@ -11,10 +11,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -76,26 +73,29 @@ protected String getDbColumnName(String factoryColumnName, String tableName) { } /** - * Determine the corresponding table name based on the provided table name pattern. + * Determine the corresponding table names based on the provided table name pattern. * * @param schemaPattern pattern of the schema to search in * @param tableNamePattern pattern of the table name - * @return a matching table name, if one is found + * @return matching table names */ - protected Optional getDbTableName(String schemaPattern, String tableNamePattern) { + protected List getDbTables(String schemaPattern, String tableNamePattern) { + LinkedList tableNames = new LinkedList<>(); + try { ResultSet rs = connector .getConnection() .getMetaData() .getTables(null, schemaPattern, tableNamePattern, null); - if (rs.next()) { - return Optional.of(rs.getString("TABLE_NAME")); + while (rs.next()) { + String tableName = rs.getString("TABLE_NAME"); + if (tableName != null) tableNames.add(tableName); } } catch (SQLException ex) { log.error("Cannot connect to database to retrieve tables meta information", ex); } - return Optional.empty(); + return tableNames; } /** 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 23c5681ef..03b517e37 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 @@ -9,15 +9,14 @@ 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 edu.ie3.datamodel.io.sql.SqlIndividualTimeSeriesMetaInformation; import java.util.Map; import java.util.Optional; import java.util.UUID; import java.util.stream.Collectors; -public class SqlTimeSeriesMappingSource extends SqlDataSource +public class SqlTimeSeriesMappingSource + extends SqlDataSource implements TimeSeriesMappingSource { private static final TimeSeriesMappingFactory mappingFactory = new TimeSeriesMappingFactory(); @@ -33,9 +32,7 @@ public SqlTimeSeriesMappingSource( this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy; final String tableName = - entityPersistenceNamingStrategy - .getEntityName(MappingEntry.class) - .orElseThrow(() -> new RuntimeException("")); + entityPersistenceNamingStrategy.getEntityName(MappingEntry.class).orElseThrow(); this.queryFull = createBaseQueryString(schemaName, tableName); this.schemaName = schemaName; @@ -47,27 +44,19 @@ public Map getMapping() { .collect(Collectors.toMap(MappingEntry::getParticipant, MappingEntry::getTimeSeries)); } - /** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */ + /** + * @deprecated since 3.0. Use {@link SqlTimeSeriesTypeSource#getTimeSeriesMetaInformation()} + * instead + */ @Override @Deprecated(since = "3.0", forRemoval = true) public Optional getTimeSeriesMetaInformation(UUID timeSeriesUuid) { - return getDbTableName(schemaName, "%" + timeSeriesUuid.toString()) + return getDbTables(schemaName, "%" + timeSeriesUuid.toString()).stream() + .findFirst() .map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation); } - @Override - public Optional timeSeriesMetaInformation( - UUID timeSeriesUuid) { - return getDbTableName(schemaName, "%" + timeSeriesUuid.toString()) - .map( - tableName -> { - IndividualTimeSeriesMetaInformation metaInformation = - entityPersistenceNamingStrategy.individualTimesSeriesMetaInformation(tableName); - return new SqlIndividualTimeSeriesMetaInformation(metaInformation, tableName); - }); - } - @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 e95263a7f..35abd7d97 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,10 @@ 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.DatabaseNamingStrategy; +import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme; +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; @@ -46,9 +48,9 @@ public class SqlTimeSeriesSource extends SqlDataSource getSource( @@ -73,15 +75,17 @@ public static SqlTimeSeriesSource getSource( * * @param connector the connector needed for database connection * @param schemaName the database schema to use + * @param namingStrategy the database entity naming strategy to use * @param metaInformation the time series meta information * @param timePattern the pattern of time values * @return a SqlTimeSeriesSource for given time series table * @throws SourceException if the column scheme is not supported */ - public static SqlTimeSeriesSource getSource( + public static SqlTimeSeriesSource createSource( SqlConnector connector, String schemaName, - SqlIndividualTimeSeriesMetaInformation metaInformation, + DatabaseNamingStrategy namingStrategy, + IndividualTimeSeriesMetaInformation metaInformation, String timePattern) throws SourceException { if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme())) @@ -91,14 +95,14 @@ public static SqlTimeSeriesSource getSource( Class valClass = metaInformation.getColumnScheme().getValueClass(); return create( - connector, - schemaName, - metaInformation.getTableName(), - metaInformation.getUuid(), - valClass, - timePattern); + connector, schemaName, namingStrategy, metaInformation.getUuid(), valClass, timePattern); } + /** + * @deprecated since 3.0. Use {@link #create(SqlConnector, String, DatabaseNamingStrategy, UUID, + * Class, String)} instead + */ + @Deprecated(since = "3.0", forRemoval = true) private static SqlTimeSeriesSource create( SqlConnector connector, String schemaName, @@ -112,6 +116,19 @@ private static SqlTimeSeriesSource create( connector, schemaName, tableName, timeSeriesUuid, valClass, valueFactory); } + private static SqlTimeSeriesSource create( + SqlConnector connector, + String schemaName, + DatabaseNamingStrategy namingStrategy, + UUID timeSeriesUuid, + Class valClass, + String timePattern) { + TimeBasedSimpleValueFactory valueFactory = + new TimeBasedSimpleValueFactory<>(valClass, timePattern); + return new SqlTimeSeriesSource<>( + connector, schemaName, namingStrategy, timeSeriesUuid, valClass, valueFactory); + } + /** * Initializes a new SqlTimeSeriesSource * @@ -121,7 +138,10 @@ private static SqlTimeSeriesSource create( * @param timeSeriesUuid the uuid of the time series * @param valueClass the class of returned time series values * @param factory a factory that parses the input data + * @deprecated since 3.0. Use {@link #SqlTimeSeriesSource(SqlConnector, + * String,DatabaseNamingStrategy, UUID, Class, TimeBasedSimpleValueFactory)} instead */ + @Deprecated(since = "3.0", forRemoval = true) public SqlTimeSeriesSource( SqlConnector connector, String schemaName, @@ -142,6 +162,37 @@ public SqlTimeSeriesSource( this.queryTime = createQueryStringForTime(schemaName, tableName, dbTimeColumnName); } + /** + * Initializes a new SqlTimeSeriesSource + * + * @param connector the connector needed for database connection + * @param schemaName the database schema to use + * @param namingStrategy the naming strategy for database entities + * @param timeSeriesUuid the uuid of the time series + * @param valueClass the class of returned time series values + * @param factory a factory that parses the input data + */ + public SqlTimeSeriesSource( + SqlConnector connector, + String schemaName, + DatabaseNamingStrategy namingStrategy, + UUID timeSeriesUuid, + Class valueClass, + TimeBasedSimpleValueFactory factory) { + super(connector); + this.timeSeriesUuid = timeSeriesUuid; + this.valueClass = valueClass; + this.valueFactory = factory; + final ColumnScheme columnScheme = ColumnScheme.parse(valueClass).orElseThrow(); + final String tableName = namingStrategy.getTimeSeriesEntityName(columnScheme); + + String dbTimeColumnName = getDbColumnName(factory.getTimeFieldString(), tableName); + + this.queryFull = createQueryFull(schemaName, tableName); + this.queryTimeInterval = createQueryForTimeInterval(schemaName, tableName, dbTimeColumnName); + this.queryTime = createQueryForTime(schemaName, tableName, dbTimeColumnName); + } + @Override public IndividualTimeSeries getTimeSeries() { List> timeBasedValues = executeQuery(queryFull, ps -> {}); @@ -178,11 +229,28 @@ public Optional getValue(ZonedDateTime time) { * @return Optional simple time based value */ protected Optional> createEntity(Map fieldToValues) { + fieldToValues.remove("timeSeries"); SimpleTimeBasedValueData factoryData = new SimpleTimeBasedValueData<>(fieldToValues, valueClass); return valueFactory.get(factoryData); } + /** + * Creates a base query to retrieve all entities for this time series:
+ * {@code WHERE time_series = $timeSeriesUuid AND