Skip to content

Commit 3263b17

Browse files
Moving entity naming stuff to the right places
1 parent 739576c commit 3263b17

File tree

8 files changed

+113
-107
lines changed

8 files changed

+113
-107
lines changed

src/main/java/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategy.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
package edu.ie3.datamodel.io.naming;
77

88
import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme;
9+
import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation;
10+
import edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation;
911
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
1012
import edu.ie3.datamodel.models.UniqueEntity;
1113
import edu.ie3.datamodel.models.input.*;
@@ -19,6 +21,8 @@
1921
import edu.ie3.datamodel.models.value.*;
2022
import edu.ie3.util.StringUtils;
2123
import java.util.Optional;
24+
import java.util.UUID;
25+
import java.util.regex.Matcher;
2226
import java.util.regex.Pattern;
2327
import org.slf4j.Logger;
2428
import org.slf4j.LoggerFactory;
@@ -120,6 +124,48 @@ public Pattern getIndividualTimeSeriesPattern() {
120124
return individualTimeSeriesPattern;
121125
}
122126

127+
/**
128+
* Extracts meta information from a valid file name for an individual time series
129+
*
130+
* @param fileName File name to extract information from
131+
* @return Meta information form individual time series file name
132+
*/
133+
public IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation(
134+
String fileName) {
135+
Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName);
136+
if (!matcher.matches())
137+
throw new IllegalArgumentException(
138+
"Cannot extract meta information on individual time series from '" + fileName + "'.");
139+
140+
String columnSchemeKey = matcher.group("columnScheme");
141+
ColumnScheme columnScheme =
142+
ColumnScheme.parse(columnSchemeKey)
143+
.orElseThrow(
144+
() ->
145+
new IllegalArgumentException(
146+
"Cannot parse '" + columnSchemeKey + "' to valid column scheme."));
147+
148+
return new IndividualTimeSeriesMetaInformation(
149+
UUID.fromString(matcher.group("uuid")), columnScheme);
150+
}
151+
152+
/**
153+
* Extracts meta information from a valid file name for a load profile time series
154+
*
155+
* @param fileName File name to extract information from
156+
* @return Meta information form load profile time series file name
157+
*/
158+
public LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation(
159+
String fileName) {
160+
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
161+
if (!matcher.matches())
162+
throw new IllegalArgumentException(
163+
"Cannot extract meta information on load profile time series from '" + fileName + "'.");
164+
165+
return new LoadProfileTimeSeriesMetaInformation(
166+
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
167+
}
168+
123169
/**
124170
* Prepares the prefix by appending an underscore and bringing it to lower case
125171
*

src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java

Lines changed: 9 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,6 @@
77

88
import edu.ie3.datamodel.io.IoUtil;
99
import edu.ie3.datamodel.io.csv.FileNameMetaInformation;
10-
import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme;
11-
import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation;
12-
import edu.ie3.datamodel.io.csv.timeseries.LoadProfileTimeSeriesMetaInformation;
1310
import edu.ie3.datamodel.models.UniqueEntity;
1411
import edu.ie3.datamodel.models.timeseries.TimeSeries;
1512
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
@@ -18,8 +15,6 @@
1815
import edu.ie3.datamodel.models.value.Value;
1916
import java.nio.file.Path;
2017
import java.util.Optional;
21-
import java.util.UUID;
22-
import java.util.regex.Matcher;
2318
import java.util.regex.Pattern;
2419
import org.apache.commons.io.FilenameUtils;
2520
import org.slf4j.Logger;
@@ -78,8 +73,7 @@ public FileNamingStrategy() {
7873
public Optional<String> getFilePath(Class<? extends UniqueEntity> cls) {
7974
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
8075
// details
81-
return getFilePath(
82-
getEntityName(cls).orElseGet(() -> ""), getDirectoryPath(cls).orElseGet(() -> ""));
76+
return getFilePath(getEntityName(cls).orElse(""), getDirectoryPath(cls).orElse(""));
8377
}
8478

8579
/**
@@ -97,8 +91,8 @@ Optional<String> getFilePath(T timeSeries) {
9791
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
9892
// details
9993
return getFilePath(
100-
entityPersistenceNamingStrategy.getEntityName(timeSeries).orElseGet(() -> ""),
101-
getDirectoryPath(timeSeries).orElseGet(() -> ""));
94+
entityPersistenceNamingStrategy.getEntityName(timeSeries).orElse(""),
95+
getDirectoryPath(timeSeries).orElse(""));
10296
}
10397

10498
/**
@@ -178,7 +172,7 @@ public Pattern getIndividualTimeSeriesPattern() {
178172
if (subDirectory.isEmpty()) {
179173
return entityPersistenceNamingStrategy.getIndividualTimeSeriesPattern();
180174
} else {
181-
/* Build the pattern by joining the sub directory with the file name pattern, harmonizing file separators and
175+
/* Build the pattern by joining the subdirectory with the file name pattern, harmonizing file separators and
182176
* finally escaping them */
183177
String joined =
184178
FilenameUtils.concat(
@@ -242,56 +236,16 @@ public FileNameMetaInformation extractTimeSeriesMetaInformation(String fileName)
242236
String withoutEnding = fileName.replaceAll("(?:\\.[^\\\\/\\s]{1,255}){1,2}$", "");
243237

244238
if (getIndividualTimeSeriesPattern().matcher(withoutEnding).matches())
245-
return extractIndividualTimesSeriesMetaInformation(withoutEnding);
239+
return entityPersistenceNamingStrategy.extractIndividualTimesSeriesMetaInformation(
240+
withoutEnding);
246241
else if (getLoadProfileTimeSeriesPattern().matcher(withoutEnding).matches())
247-
return extractLoadProfileTimesSeriesMetaInformation(withoutEnding);
242+
return entityPersistenceNamingStrategy.extractLoadProfileTimesSeriesMetaInformation(
243+
withoutEnding);
248244
else
249245
throw new IllegalArgumentException(
250246
"Unknown format of '" + fileName + "'. Cannot extract meta information.");
251247
}
252248

253-
/**
254-
* Extracts meta information from a valid file name for a individual time series
255-
*
256-
* @param fileName File name to extract information from
257-
* @return Meta information form individual time series file name
258-
*/
259-
private IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation(
260-
String fileName) {
261-
Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName);
262-
if (!matcher.matches())
263-
throw new IllegalArgumentException(
264-
"Cannot extract meta information on individual time series from '" + fileName + "'.");
265-
266-
String columnSchemeKey = matcher.group("columnScheme");
267-
ColumnScheme columnScheme =
268-
ColumnScheme.parse(columnSchemeKey)
269-
.orElseThrow(
270-
() ->
271-
new IllegalArgumentException(
272-
"Cannot parse '" + columnSchemeKey + "' to valid column scheme."));
273-
274-
return new IndividualTimeSeriesMetaInformation(
275-
UUID.fromString(matcher.group("uuid")), columnScheme);
276-
}
277-
278-
/**
279-
* Extracts meta information from a valid file name for a load profile time series
280-
*
281-
* @param fileName File name to extract information from
282-
* @return Meta information form load profile time series file name
283-
*/
284-
private LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation(
285-
String fileName) {
286-
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
287-
if (!matcher.matches())
288-
throw new IllegalArgumentException(
289-
"Cannot extract meta information on load profile time series from '" + fileName + "'.");
290-
291-
return new LoadProfileTimeSeriesMetaInformation(
292-
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
293-
}
294-
295249
/**
296250
* Get the entity name for coordinates
297251
*
@@ -311,8 +265,7 @@ public String getIdCoordinateEntityName() {
311265
public Optional<String> getIdCoordinateFilePath() {
312266
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
313267
// details
314-
return getFilePath(
315-
getIdCoordinateEntityName(), fileHierarchy.getBaseDirectory().orElseGet(() -> ""));
268+
return getFilePath(getIdCoordinateEntityName(), fileHierarchy.getBaseDirectory().orElse(""));
316269
}
317270

318271
/**

src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSource.java

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation;
1010
import edu.ie3.datamodel.io.factory.SimpleEntityData;
1111
import edu.ie3.datamodel.io.factory.timeseries.TimeSeriesMappingFactory;
12-
import edu.ie3.datamodel.io.naming.FileNamingStrategy;
12+
import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy;
1313
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
1414
import java.util.Map;
1515
import java.util.Optional;
@@ -20,16 +20,18 @@ public class SqlTimeSeriesMappingSource extends SqlDataSource<TimeSeriesMappingS
2020
implements TimeSeriesMappingSource {
2121
private static final TimeSeriesMappingFactory mappingFactory = new TimeSeriesMappingFactory();
2222

23-
private final FileNamingStrategy fileNamingStrategy;
23+
private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy;
2424
private final String queryFull;
2525

2626
public SqlTimeSeriesMappingSource(
27-
SqlConnector connector, String schemaName, FileNamingStrategy fileNamingStrategy) {
27+
SqlConnector connector,
28+
String schemaName,
29+
EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) {
2830
super(connector);
29-
this.fileNamingStrategy = fileNamingStrategy;
31+
this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy;
3032

3133
final String tableName =
32-
fileNamingStrategy
34+
entityPersistenceNamingStrategy
3335
.getEntityName(MappingEntry.class)
3436
.orElseThrow(() -> new RuntimeException(""));
3537
this.queryFull = createBaseQueryString(schemaName, tableName);
@@ -45,10 +47,7 @@ public Map<UUID, UUID> getMapping() {
4547
public Optional<IndividualTimeSeriesMetaInformation> getTimeSeriesMetaInformation(
4648
UUID timeSeriesUuid) {
4749
return getDbTableName(null, "%" + timeSeriesUuid.toString())
48-
.map(
49-
tableName ->
50-
(IndividualTimeSeriesMetaInformation)
51-
fileNamingStrategy.extractTimeSeriesMetaInformation(tableName));
50+
.map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation);
5251
}
5352

5453
@Override

src/main/java/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesSource.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import edu.ie3.datamodel.exceptions.SourceException;
99
import edu.ie3.datamodel.io.connectors.SqlConnector;
10-
import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme;
10+
import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation;
1111
import edu.ie3.datamodel.io.factory.timeseries.SimpleTimeBasedValueData;
1212
import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory;
1313
import edu.ie3.datamodel.io.source.TimeSeriesSource;
@@ -29,8 +29,7 @@ public class SqlTimeSeriesSource<V extends Value> extends SqlDataSource<TimeBase
2929
* @param connector the connector needed for database connection
3030
* @param schemaName the database schema to use
3131
* @param tableName the database table to use
32-
* @param timeSeriesUuid the uuid of the time series
33-
* @param columnScheme the column scheme of this time series
32+
* @param metaInformation the time series meta information
3433
* @param timePattern the pattern of time values
3534
* @return a SqlTimeSeriesSource for given time series table
3635
* @throws SourceException if the column scheme is not supported
@@ -39,16 +38,17 @@ public static SqlTimeSeriesSource<? extends Value> getSource(
3938
SqlConnector connector,
4039
String schemaName,
4140
String tableName,
42-
UUID timeSeriesUuid,
43-
ColumnScheme columnScheme,
41+
IndividualTimeSeriesMetaInformation metaInformation,
4442
String timePattern)
4543
throws SourceException {
46-
if (!TimeSeriesSource.isSchemeAccepted(columnScheme))
47-
throw new SourceException("Unsupported column scheme '" + columnScheme + "'.");
44+
if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme()))
45+
throw new SourceException(
46+
"Unsupported column scheme '" + metaInformation.getColumnScheme() + "'.");
4847

49-
Class<? extends Value> valClass = columnScheme.getValueClass();
48+
Class<? extends Value> valClass = metaInformation.getColumnScheme().getValueClass();
5049

51-
return create(connector, schemaName, tableName, timeSeriesUuid, valClass, timePattern);
50+
return create(
51+
connector, schemaName, tableName, metaInformation.getUuid(), valClass, timePattern);
5252
}
5353

5454
private static <T extends Value> SqlTimeSeriesSource<T> create(

src/test/groovy/edu/ie3/datamodel/io/naming/EntityPersistenceNamingStrategyTest.groovy

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,32 @@ class EntityPersistenceNamingStrategyTest extends Specification {
118118
matcher.group("uuid") == "bee0a8b6-4788-4f18-bf72-be52035f7304"
119119
}
120120

121+
def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() {
122+
given:
123+
def fns = new EntityPersistenceNamingStrategy()
124+
def fileName = "foo"
125+
126+
when:
127+
fns.extractIndividualTimesSeriesMetaInformation(fileName)
128+
129+
then:
130+
def ex = thrown(IllegalArgumentException)
131+
ex.message == "Cannot extract meta information on individual time series from 'foo'."
132+
}
133+
134+
def "Trying to extract load profile time series meta information throws an Exception, if it is provided a malformed string"() {
135+
given:
136+
def fns = new EntityPersistenceNamingStrategy()
137+
def fileName = "foo"
138+
139+
when:
140+
fns.extractLoadProfileTimesSeriesMetaInformation(fileName)
141+
142+
then:
143+
def ex = thrown(IllegalArgumentException)
144+
ex.message == "Cannot extract meta information on load profile time series from 'foo'."
145+
}
146+
121147
def "The EntityPersistenceNamingStrategy is able to prepare the prefix properly"() {
122148
when:
123149
String actual = EntityPersistenceNamingStrategy.preparePrefix(prefix)

src/test/groovy/edu/ie3/datamodel/io/naming/FileNamingStrategyTest.groovy

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -827,32 +827,6 @@ class FileNamingStrategyTest extends Specification {
827827
ex.message == "Unknown format of 'foo'. Cannot extract meta information."
828828
}
829829

830-
def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() {
831-
given:
832-
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)
833-
def fileName = "foo"
834-
835-
when:
836-
fns.extractIndividualTimesSeriesMetaInformation(fileName)
837-
838-
then:
839-
def ex = thrown(IllegalArgumentException)
840-
ex.message == "Cannot extract meta information on individual time series from 'foo'."
841-
}
842-
843-
def "Trying to extract load profile time series meta information throws an Exception, if it is provided a malformed string"() {
844-
given:
845-
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)
846-
def fileName = "foo"
847-
848-
when:
849-
fns.extractLoadProfileTimesSeriesMetaInformation(fileName)
850-
851-
then:
852-
def ex = thrown(IllegalArgumentException)
853-
ex.message == "Cannot extract meta information on load profile time series from 'foo'."
854-
}
855-
856830
def "The EntityPersistenceNamingStrategy extracts correct meta information from a valid individual time series file name"() {
857831
given:
858832
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)

src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlTimeSeriesMappingSourceIT.groovy

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ package edu.ie3.datamodel.io.source.sql
88
import edu.ie3.datamodel.io.connectors.SqlConnector
99
import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme
1010
import edu.ie3.datamodel.io.csv.timeseries.IndividualTimeSeriesMetaInformation
11-
import edu.ie3.datamodel.io.naming.FileNamingStrategy
11+
import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy
1212
import org.testcontainers.containers.Container
1313
import org.testcontainers.containers.PostgreSQLContainer
1414
import org.testcontainers.spock.Testcontainers
@@ -52,7 +52,7 @@ class SqlTimeSeriesMappingSourceIT extends Specification {
5252
}
5353

5454
def connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password)
55-
source = new SqlTimeSeriesMappingSource(connector, "public", new FileNamingStrategy())
55+
source = new SqlTimeSeriesMappingSource(connector, "public", new EntityPersistenceNamingStrategy())
5656
}
5757

5858
def "The sql time series mapping source returns empty optional on not covered model"() {

0 commit comments

Comments
 (0)