Skip to content

Commit a10a543

Browse files
Restructuring SQL sources and introducing TimeSeriesTypeSource (#546)
* Restructuring SQL sources and introducing TimeSeriesTypeSource * Fixing/creating missing tests, introducing TimeSeriesUtils.isSchemeAccepted * Fixing code smells * More fixing of code smells * Adapting changelog * Fixing codacy issues * Improving TypeEntry#equals * Improving test a tiny bit * Explicitly creating timeseries-id/time index * Addressing reviewer's comments Co-authored-by: t-ober <63147366+t-ober@users.noreply.github.com>
1 parent 1935566 commit a10a543

35 files changed

+708
-363
lines changed

CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88

99
### Added
1010
- SQL time series sources (`SqlTimeSeriesSource` and `SqlTimeSeriesMappingSource`) [#467](https://github.com/ie3-institute/PowerSystemDataModel/issues/467)
11+
- SQL time series have a different structure than CSV counterparts [#545](https://github.com/ie3-institute/PowerSystemDataModel/issues/545)
1112
- Graph with impedance weighted edges including facilities to create it [#440](https://github.com/ie3-institute/PowerSystemDataModel/issues/440)
12-
- Introducing `SqlIndividualTimeSeriesMetaInformation` which provides sql table names [#513](https://github.com/ie3-institute/PowerSystemDataModel/issues/513)
13+
- `TimeSeriesTypeSource` providing a source for the mapping of time series uuids to column schemes (previously provided by `TimeSeriesMappingSource`) [#515](https://github.com/ie3-institute/PowerSystemDataModel/issues/515)
1314

1415
### Fixed
1516
- Reduced code smells [#492](https://github.com/ie3-institute/PowerSystemDataModel/issues/492)

src/main/java/edu/ie3/datamodel/io/connectors/CsvFileConnector.java

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -221,30 +221,32 @@ public BufferedReader initReader(String filePath) throws FileNotFoundException {
221221
*
222222
* @param timeSeriesUuid The time series in question
223223
* @return An option on the queried information
224-
* @deprecated since 3.0. Use {@link #individualTimeSeriesMetaInformation(UUID)} instead
224+
* @deprecated since 3.0. Use {@link #getIndividualTimeSeriesMetaInformation()} instead
225225
*/
226226
@Deprecated(since = "3.0", forRemoval = true)
227227
public Optional<edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation>
228228
getIndividualTimeSeriesMetaInformation(UUID timeSeriesUuid) {
229-
return individualTimeSeriesMetaInformation(timeSeriesUuid)
229+
if (Objects.isNull(individualTimeSeriesMetaInformation))
230+
individualTimeSeriesMetaInformation = buildIndividualTimeSeriesMetaInformation();
231+
232+
return Optional.ofNullable(individualTimeSeriesMetaInformation.get(timeSeriesUuid))
230233
.map(edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation::new);
231234
}
232235

233236
/**
234-
* Get time series meta information for a given uuid.
237+
* Get time series meta information
235238
*
236239
* <p>This method lazily evaluates the mapping from <i>all</i> time series files to their meta
237240
* information.
238241
*
239-
* @param timeSeriesUuid The time series in question
240-
* @return An option on the queried information
242+
* @return All time series meta information
241243
*/
242-
public Optional<IndividualTimeSeriesMetaInformation> individualTimeSeriesMetaInformation(
243-
UUID timeSeriesUuid) {
244+
public Map<UUID, edu.ie3.datamodel.io.csv.CsvIndividualTimeSeriesMetaInformation>
245+
getIndividualTimeSeriesMetaInformation() {
244246
if (Objects.isNull(individualTimeSeriesMetaInformation))
245247
individualTimeSeriesMetaInformation = buildIndividualTimeSeriesMetaInformation();
246248

247-
return Optional.ofNullable(individualTimeSeriesMetaInformation.get(timeSeriesUuid));
249+
return individualTimeSeriesMetaInformation;
248250
}
249251

250252
/**
@@ -485,9 +487,8 @@ public String getFullFilePath() {
485487
@Override
486488
public boolean equals(Object o) {
487489
if (this == o) return true;
488-
if (!(o instanceof CsvIndividualTimeSeriesMetaInformation)) return false;
490+
if (!(o instanceof CsvIndividualTimeSeriesMetaInformation that)) return false;
489491
if (!super.equals(o)) return false;
490-
CsvIndividualTimeSeriesMetaInformation that = (CsvIndividualTimeSeriesMetaInformation) o;
491492
return fullFilePath.equals(that.fullFilePath);
492493
}
493494

src/main/java/edu/ie3/datamodel/io/csv/BufferedCsvWriter.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,8 +137,7 @@ public Writer append(char c) {
137137
@Override
138138
public boolean equals(Object o) {
139139
if (this == o) return true;
140-
if (!(o instanceof BufferedCsvWriter)) return false;
141-
BufferedCsvWriter that = (BufferedCsvWriter) o;
140+
if (!(o instanceof BufferedCsvWriter that)) return false;
142141
return Arrays.equals(headLineElements, that.headLineElements) && csvSep.equals(that.csvSep);
143142
}
144143

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* © 2021. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.datamodel.io.factory.timeseries;
7+
8+
import edu.ie3.datamodel.io.factory.EntityFactory;
9+
import edu.ie3.datamodel.io.factory.SimpleEntityData;
10+
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
11+
import edu.ie3.datamodel.io.source.TimeSeriesTypeSource;
12+
import java.util.Collections;
13+
import java.util.List;
14+
import java.util.Set;
15+
import java.util.UUID;
16+
import java.util.stream.Collectors;
17+
import java.util.stream.Stream;
18+
19+
/**
20+
* Factory that creates {@link TimeSeriesTypeSource.TypeEntry} entities from source field mappings
21+
*/
22+
public class TimeSeriesTypeFactory
23+
extends EntityFactory<TimeSeriesTypeSource.TypeEntry, SimpleEntityData> {
24+
private static final String TIME_SERIES = "timeSeries";
25+
private static final String COLUMN_SCHEME = "columnScheme";
26+
27+
public TimeSeriesTypeFactory() {
28+
super(TimeSeriesTypeSource.TypeEntry.class);
29+
}
30+
31+
@Override
32+
protected List<Set<String>> getFields(SimpleEntityData data) {
33+
return Collections.singletonList(
34+
Stream.of(TIME_SERIES, COLUMN_SCHEME).collect(Collectors.toSet()));
35+
}
36+
37+
@Override
38+
protected TimeSeriesTypeSource.TypeEntry buildModel(SimpleEntityData data) {
39+
UUID timeSeries = data.getUUID(TIME_SERIES);
40+
ColumnScheme columnScheme = ColumnScheme.parse(data.getField(COLUMN_SCHEME)).orElseThrow();
41+
return new TimeSeriesTypeSource.TypeEntry(timeSeries, columnScheme);
42+
}
43+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* © 2022. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.datamodel.io.naming;
7+
8+
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
9+
10+
/** A naming strategy for database entities */
11+
public class DatabaseNamingStrategy {
12+
13+
private static final String TIME_SERIES_PREFIX = "time_series_";
14+
15+
/**
16+
* Provides the String that all time series tables are prefixed with
17+
*
18+
* @return the time series prefix
19+
*/
20+
public String getTimeSeriesPrefix() {
21+
return TIME_SERIES_PREFIX;
22+
}
23+
24+
/**
25+
* Provides the name of a time series table given a column scheme
26+
*
27+
* @param columnScheme the column scheme of the source data
28+
* @return the table name
29+
*/
30+
public String getTimeSeriesEntityName(ColumnScheme columnScheme) {
31+
return TIME_SERIES_PREFIX + columnScheme.getScheme();
32+
}
33+
}

src/main/java/edu/ie3/datamodel/io/source/TimeSeriesMappingSource.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
*/
66
package edu.ie3.datamodel.io.source;
77

8-
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
98
import edu.ie3.datamodel.models.input.InputEntity;
109
import java.util.Map;
1110
import java.util.Objects;
@@ -39,20 +38,12 @@ default Optional<UUID> getTimeSeriesUuid(UUID modelIdentifier) {
3938
*
4039
* @param timeSeriesUuid Unique identifier of the time series in question
4140
* @return An Option onto the meta information
42-
* @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead
41+
* @deprecated since 3.0. Use {@link TimeSeriesTypeSource#getTimeSeriesMetaInformation()} instead
4342
*/
4443
@Deprecated(since = "3.0", forRemoval = true)
4544
Optional<edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation>
4645
getTimeSeriesMetaInformation(UUID timeSeriesUuid);
4746

48-
/**
49-
* Get an option on the given time series meta information
50-
*
51-
* @param timeSeriesUuid Unique identifier of the time series in question
52-
* @return An Option onto the meta information
53-
*/
54-
Optional<IndividualTimeSeriesMetaInformation> timeSeriesMetaInformation(UUID timeSeriesUuid);
55-
5647
/** Class to represent one entry within the participant to time series mapping */
5748
class MappingEntry extends InputEntity {
5849
private final UUID participant;
@@ -75,9 +66,8 @@ public UUID getTimeSeries() {
7566
@Override
7667
public boolean equals(Object o) {
7768
if (this == o) return true;
78-
if (!(o instanceof MappingEntry)) return false;
69+
if (!(o instanceof MappingEntry that)) return false;
7970
if (!super.equals(o)) return false;
80-
MappingEntry that = (MappingEntry) o;
8171
return participant.equals(that.participant) && timeSeries.equals(that.timeSeries);
8272
}
8373

src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,6 @@
55
*/
66
package edu.ie3.datamodel.io.source;
77

8-
import static edu.ie3.datamodel.io.naming.timeseries.ColumnScheme.*;
9-
10-
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
118
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
129
import edu.ie3.datamodel.models.value.Value;
1310
import edu.ie3.util.interval.ClosedInterval;
@@ -27,7 +24,8 @@ public interface TimeSeriesSource<V extends Value> extends DataSource {
2724
* @param scheme the column scheme to check
2825
* @return whether the scheme is accepted or not
2926
* @deprecated since 3.0. Use {@link
30-
* #isSchemeAccepted(edu.ie3.datamodel.io.naming.timeseries.ColumnScheme)} instead.
27+
* TimeSeriesUtils#isSchemeAccepted(edu.ie3.datamodel.io.naming.timeseries.ColumnScheme)}
28+
* instead.
3129
*/
3230
@Deprecated(since = "3.0", forRemoval = true)
3331
static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme scheme) {
@@ -41,23 +39,6 @@ static boolean isSchemeAccepted(edu.ie3.datamodel.io.csv.timeseries.ColumnScheme
4139
.contains(scheme);
4240
}
4341

44-
/**
45-
* Checks whether the given column scheme can be used with time series.
46-
*
47-
* @param scheme the column scheme to check
48-
* @return whether the scheme is accepted or not
49-
*/
50-
static boolean isSchemeAccepted(ColumnScheme scheme) {
51-
return EnumSet.of(
52-
ACTIVE_POWER,
53-
APPARENT_POWER,
54-
ENERGY_PRICE,
55-
APPARENT_POWER_AND_HEAT_DEMAND,
56-
ACTIVE_POWER_AND_HEAT_DEMAND,
57-
HEAT_DEMAND)
58-
.contains(scheme);
59-
}
60-
6142
/**
6243
* Obtain the full time series
6344
*
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* © 2022. TU Dortmund University,
3+
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
4+
* Research group Distribution grid planning and operation
5+
*/
6+
package edu.ie3.datamodel.io.source;
7+
8+
import edu.ie3.datamodel.io.naming.timeseries.ColumnScheme;
9+
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
10+
import edu.ie3.datamodel.models.input.InputEntity;
11+
import java.util.Map;
12+
import java.util.Objects;
13+
import java.util.UUID;
14+
15+
/** Source for all available time series with their {@link UUID} and {@link ColumnScheme} */
16+
public interface TimeSeriesTypeSource extends DataSource {
17+
18+
/**
19+
* Get a mapping from time series {@link UUID} to its meta information {@link
20+
* IndividualTimeSeriesMetaInformation}
21+
*
22+
* @return that mapping
23+
*/
24+
Map<UUID, ? extends IndividualTimeSeriesMetaInformation> getTimeSeriesMetaInformation();
25+
26+
/** Class to represent one entry within the participant to time series mapping */
27+
class TypeEntry extends InputEntity {
28+
private final ColumnScheme columnScheme;
29+
30+
public TypeEntry(UUID timeSeries, ColumnScheme columnScheme) {
31+
super(timeSeries);
32+
this.columnScheme = columnScheme;
33+
}
34+
35+
public UUID getTimeSeries() {
36+
return getUuid();
37+
}
38+
39+
public ColumnScheme getColumnScheme() {
40+
return columnScheme;
41+
}
42+
43+
@Override
44+
public boolean equals(Object o) {
45+
if (this == o) return true;
46+
if (!(o instanceof TypeEntry that)) return false;
47+
if (!super.equals(o)) return false;
48+
return columnScheme == that.columnScheme;
49+
}
50+
51+
@Override
52+
public int hashCode() {
53+
return Objects.hash(super.hashCode(), columnScheme);
54+
}
55+
56+
@Override
57+
public String toString() {
58+
return "TypeEntry{" + "uuid=" + getUuid() + ", columnScheme=" + columnScheme + '}';
59+
}
60+
}
61+
}

src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesMappingSource.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
import edu.ie3.datamodel.io.factory.SimpleEntityData;
99
import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory;
1010
import edu.ie3.datamodel.io.naming.FileNamingStrategy;
11-
import edu.ie3.datamodel.io.naming.timeseries.IndividualTimeSeriesMetaInformation;
1211
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
1312
import java.util.Map;
1413
import java.util.Optional;
@@ -43,17 +42,14 @@ public Map<UUID, UUID> getMapping() {
4342
return mapping;
4443
}
4544

46-
/** @deprecated since 3.0. Use {@link #timeSeriesMetaInformation(java.util.UUID)} instead */
45+
/**
46+
* @deprecated since 3.0. Use {@link CsvTimeSeriesTypeSource#getTimeSeriesMetaInformation()}
47+
* instead
48+
*/
4749
@Override
4850
@Deprecated(since = "3.0", forRemoval = true)
4951
public Optional<edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation>
5052
getTimeSeriesMetaInformation(UUID timeSeriesUuid) {
5153
return connector.getIndividualTimeSeriesMetaInformation(timeSeriesUuid);
5254
}
53-
54-
@Override
55-
public Optional<IndividualTimeSeriesMetaInformation> timeSeriesMetaInformation(
56-
UUID timeSeriesUuid) {
57-
return connector.individualTimeSeriesMetaInformation(timeSeriesUuid);
58-
}
5955
}

src/main/java/edu/ie3/datamodel/io/source/csv/CsvTimeSeriesSource.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
1414
import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue;
1515
import edu.ie3.datamodel.models.value.*;
16-
import edu.ie3.datamodel.utils.TimeSeriesUtil;
16+
import edu.ie3.datamodel.utils.TimeSeriesUtils;
1717
import edu.ie3.util.interval.ClosedInterval;
1818
import java.io.BufferedReader;
1919
import java.io.FileNotFoundException;
@@ -94,7 +94,7 @@ public static CsvTimeSeriesSource<? extends Value> getSource(
9494
FileNamingStrategy fileNamingStrategy,
9595
CsvIndividualTimeSeriesMetaInformation metaInformation)
9696
throws SourceException {
97-
if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme()))
97+
if (!TimeSeriesUtils.isSchemeAccepted(metaInformation.getColumnScheme()))
9898
throw new SourceException(
9999
"Unsupported column scheme '" + metaInformation.getColumnScheme() + "'.");
100100

@@ -164,7 +164,7 @@ public IndividualTimeSeries<V> getTimeSeries() {
164164

165165
@Override
166166
public IndividualTimeSeries<V> getTimeSeries(ClosedInterval<ZonedDateTime> timeInterval) {
167-
return TimeSeriesUtil.trimTimeSeriesToInterval(timeSeries, timeInterval);
167+
return TimeSeriesUtils.trimTimeSeriesToInterval(timeSeries, timeInterval);
168168
}
169169

170170
@Override

0 commit comments

Comments
 (0)