Skip to content

Commit

Permalink
Moving entity naming stuff to the right places
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastian-peter committed Jan 6, 2022
1 parent 66e60aa commit 2c0b041
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 107 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
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.source.TimeSeriesMappingSource;
import edu.ie3.datamodel.models.UniqueEntity;
import edu.ie3.datamodel.models.input.*;
Expand All @@ -19,6 +21,8 @@
import edu.ie3.datamodel.models.value.*;
import edu.ie3.util.StringUtils;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Expand Down Expand Up @@ -120,6 +124,48 @@ public Pattern getIndividualTimeSeriesPattern() {
return individualTimeSeriesPattern;
}

/**
* Extracts meta information from a valid file name for an individual time series
*
* @param fileName File name to extract information from
* @return Meta information form individual time series file name
*/
public IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation(
String fileName) {
Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on individual time series from '" + fileName + "'.");

String columnSchemeKey = matcher.group("columnScheme");
ColumnScheme columnScheme =
ColumnScheme.parse(columnSchemeKey)
.orElseThrow(
() ->
new IllegalArgumentException(
"Cannot parse '" + columnSchemeKey + "' to valid column scheme."));

return new IndividualTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), columnScheme);
}

/**
* Extracts meta information from a valid file name for a load profile time series
*
* @param fileName File name to extract information from
* @return Meta information form load profile time series file name
*/
public LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation(
String fileName) {
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on load profile time series from '" + fileName + "'.");

return new LoadProfileTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
}

/**
* Prepares the prefix by appending an underscore and bringing it to lower case
*
Expand Down
65 changes: 9 additions & 56 deletions src/main/java/edu/ie3/datamodel/io/naming/FileNamingStrategy.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,6 @@

import edu.ie3.datamodel.io.IoUtil;
import edu.ie3.datamodel.io.csv.FileNameMetaInformation;
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.models.UniqueEntity;
import edu.ie3.datamodel.models.timeseries.TimeSeries;
import edu.ie3.datamodel.models.timeseries.TimeSeriesEntry;
Expand All @@ -18,8 +15,6 @@
import edu.ie3.datamodel.models.value.Value;
import java.nio.file.Path;
import java.util.Optional;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.io.FilenameUtils;
import org.slf4j.Logger;
Expand Down Expand Up @@ -78,8 +73,7 @@ public FileNamingStrategy() {
public Optional<String> getFilePath(Class<? extends UniqueEntity> cls) {
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
// details
return getFilePath(
getEntityName(cls).orElseGet(() -> ""), getDirectoryPath(cls).orElseGet(() -> ""));
return getFilePath(getEntityName(cls).orElse(""), getDirectoryPath(cls).orElse(""));
}

/**
Expand All @@ -97,8 +91,8 @@ Optional<String> getFilePath(T timeSeries) {
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
// details
return getFilePath(
entityPersistenceNamingStrategy.getEntityName(timeSeries).orElseGet(() -> ""),
getDirectoryPath(timeSeries).orElseGet(() -> ""));
entityPersistenceNamingStrategy.getEntityName(timeSeries).orElse(""),
getDirectoryPath(timeSeries).orElse(""));
}

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

if (getIndividualTimeSeriesPattern().matcher(withoutEnding).matches())
return extractIndividualTimesSeriesMetaInformation(withoutEnding);
return entityPersistenceNamingStrategy.extractIndividualTimesSeriesMetaInformation(
withoutEnding);
else if (getLoadProfileTimeSeriesPattern().matcher(withoutEnding).matches())
return extractLoadProfileTimesSeriesMetaInformation(withoutEnding);
return entityPersistenceNamingStrategy.extractLoadProfileTimesSeriesMetaInformation(
withoutEnding);
else
throw new IllegalArgumentException(
"Unknown format of '" + fileName + "'. Cannot extract meta information.");
}

/**
* Extracts meta information from a valid file name for a individual time series
*
* @param fileName File name to extract information from
* @return Meta information form individual time series file name
*/
private IndividualTimeSeriesMetaInformation extractIndividualTimesSeriesMetaInformation(
String fileName) {
Matcher matcher = getIndividualTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on individual time series from '" + fileName + "'.");

String columnSchemeKey = matcher.group("columnScheme");
ColumnScheme columnScheme =
ColumnScheme.parse(columnSchemeKey)
.orElseThrow(
() ->
new IllegalArgumentException(
"Cannot parse '" + columnSchemeKey + "' to valid column scheme."));

return new IndividualTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), columnScheme);
}

/**
* Extracts meta information from a valid file name for a load profile time series
*
* @param fileName File name to extract information from
* @return Meta information form load profile time series file name
*/
private LoadProfileTimeSeriesMetaInformation extractLoadProfileTimesSeriesMetaInformation(
String fileName) {
Matcher matcher = getLoadProfileTimeSeriesPattern().matcher(fileName);
if (!matcher.matches())
throw new IllegalArgumentException(
"Cannot extract meta information on load profile time series from '" + fileName + "'.");

return new LoadProfileTimeSeriesMetaInformation(
UUID.fromString(matcher.group("uuid")), matcher.group("profile"));
}

/**
* Get the entity name for coordinates
*
Expand All @@ -311,8 +265,7 @@ public String getIdCoordinateEntityName() {
public Optional<String> getIdCoordinateFilePath() {
// do not adapt orElseGet, see https://www.baeldung.com/java-optional-or-else-vs-or-else-get for
// details
return getFilePath(
getIdCoordinateEntityName(), fileHierarchy.getBaseDirectory().orElseGet(() -> ""));
return getFilePath(getIdCoordinateEntityName(), fileHierarchy.getBaseDirectory().orElse(""));
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
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.EntityPersistenceNamingStrategy;
import edu.ie3.datamodel.io.source.TimeSeriesMappingSource;
import java.util.Map;
import java.util.Optional;
Expand All @@ -20,16 +20,18 @@ public class SqlTimeSeriesMappingSource extends SqlDataSource<TimeSeriesMappingS
implements TimeSeriesMappingSource {
private static final TimeSeriesMappingFactory mappingFactory = new TimeSeriesMappingFactory();

private final FileNamingStrategy fileNamingStrategy;
private final EntityPersistenceNamingStrategy entityPersistenceNamingStrategy;
private final String queryFull;

public SqlTimeSeriesMappingSource(
SqlConnector connector, String schemaName, FileNamingStrategy fileNamingStrategy) {
SqlConnector connector,
String schemaName,
EntityPersistenceNamingStrategy entityPersistenceNamingStrategy) {
super(connector);
this.fileNamingStrategy = fileNamingStrategy;
this.entityPersistenceNamingStrategy = entityPersistenceNamingStrategy;

final String tableName =
fileNamingStrategy
entityPersistenceNamingStrategy
.getEntityName(MappingEntry.class)
.orElseThrow(() -> new RuntimeException(""));
this.queryFull = createBaseQueryString(schemaName, tableName);
Expand All @@ -45,10 +47,7 @@ public Map<UUID, UUID> getMapping() {
public Optional<IndividualTimeSeriesMetaInformation> getTimeSeriesMetaInformation(
UUID timeSeriesUuid) {
return getDbTableName(null, "%" + timeSeriesUuid.toString())
.map(
tableName ->
(IndividualTimeSeriesMetaInformation)
fileNamingStrategy.extractTimeSeriesMetaInformation(tableName));
.map(entityPersistenceNamingStrategy::extractIndividualTimesSeriesMetaInformation);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

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.factory.timeseries.SimpleTimeBasedValueData;
import edu.ie3.datamodel.io.factory.timeseries.TimeBasedSimpleValueFactory;
import edu.ie3.datamodel.io.source.TimeSeriesSource;
Expand All @@ -29,8 +29,7 @@ public class SqlTimeSeriesSource<V extends Value> extends SqlDataSource<TimeBase
* @param connector the connector needed for database connection
* @param schemaName the database schema to use
* @param tableName the database table to use
* @param timeSeriesUuid the uuid of the time series
* @param columnScheme the column scheme of this time series
* @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
Expand All @@ -39,16 +38,17 @@ public static SqlTimeSeriesSource<? extends Value> getSource(
SqlConnector connector,
String schemaName,
String tableName,
UUID timeSeriesUuid,
ColumnScheme columnScheme,
IndividualTimeSeriesMetaInformation metaInformation,
String timePattern)
throws SourceException {
if (!TimeSeriesSource.isSchemeAccepted(columnScheme))
throw new SourceException("Unsupported column scheme '" + columnScheme + "'.");
if (!TimeSeriesSource.isSchemeAccepted(metaInformation.getColumnScheme()))
throw new SourceException(
"Unsupported column scheme '" + metaInformation.getColumnScheme() + "'.");

Class<? extends Value> valClass = columnScheme.getValueClass();
Class<? extends Value> valClass = metaInformation.getColumnScheme().getValueClass();

return create(connector, schemaName, tableName, timeSeriesUuid, valClass, timePattern);
return create(
connector, schemaName, tableName, metaInformation.getUuid(), valClass, timePattern);
}

private static <T extends Value> SqlTimeSeriesSource<T> create(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,32 @@ class EntityPersistenceNamingStrategyTest extends Specification {
matcher.group("uuid") == "bee0a8b6-4788-4f18-bf72-be52035f7304"
}

def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() {
given:
def fns = new EntityPersistenceNamingStrategy()
def fileName = "foo"

when:
fns.extractIndividualTimesSeriesMetaInformation(fileName)

then:
def ex = thrown(IllegalArgumentException)
ex.message == "Cannot extract meta information on individual time series from 'foo'."
}

def "Trying to extract load profile time series meta information throws an Exception, if it is provided a malformed string"() {
given:
def fns = new EntityPersistenceNamingStrategy()
def fileName = "foo"

when:
fns.extractLoadProfileTimesSeriesMetaInformation(fileName)

then:
def ex = thrown(IllegalArgumentException)
ex.message == "Cannot extract meta information on load profile time series from 'foo'."
}

def "The EntityPersistenceNamingStrategy is able to prepare the prefix properly"() {
when:
String actual = EntityPersistenceNamingStrategy.preparePrefix(prefix)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -827,32 +827,6 @@ class FileNamingStrategyTest extends Specification {
ex.message == "Unknown format of 'foo'. Cannot extract meta information."
}

def "Trying to extract individual time series meta information throws an Exception, if it is provided a malformed string"() {
given:
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)
def fileName = "foo"

when:
fns.extractIndividualTimesSeriesMetaInformation(fileName)

then:
def ex = thrown(IllegalArgumentException)
ex.message == "Cannot extract meta information on individual time series from 'foo'."
}

def "Trying to extract load profile time series meta information throws an Exception, if it is provided a malformed string"() {
given:
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)
def fileName = "foo"

when:
fns.extractLoadProfileTimesSeriesMetaInformation(fileName)

then:
def ex = thrown(IllegalArgumentException)
ex.message == "Cannot extract meta information on load profile time series from 'foo'."
}

def "The EntityPersistenceNamingStrategy extracts correct meta information from a valid individual time series file name"() {
given:
def fns = new FileNamingStrategy(simpleEntityNaming, flatHierarchy)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ 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.FileNamingStrategy
import edu.ie3.datamodel.io.naming.EntityPersistenceNamingStrategy
import org.testcontainers.containers.Container
import org.testcontainers.containers.PostgreSQLContainer
import org.testcontainers.spock.Testcontainers
Expand Down Expand Up @@ -52,7 +52,7 @@ class SqlTimeSeriesMappingSourceIT extends Specification {
}

def connector = new SqlConnector(postgreSQLContainer.jdbcUrl, postgreSQLContainer.username, postgreSQLContainer.password)
source = new SqlTimeSeriesMappingSource(connector, "public", new FileNamingStrategy())
source = new SqlTimeSeriesMappingSource(connector, "public", new EntityPersistenceNamingStrategy())
}

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

0 comments on commit 2c0b041

Please sign in to comment.