Skip to content

Commit

Permalink
Removing code smells and increasing test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
sebastian-peter committed Dec 20, 2021
1 parent 5ede27e commit 64ea5dd
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 22 deletions.
13 changes: 0 additions & 13 deletions src/main/java/edu/ie3/datamodel/io/source/TimeSeriesSource.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,10 @@
*/
package edu.ie3.datamodel.io.source;

import static edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.*;

import edu.ie3.datamodel.io.csv.timeseries.ColumnScheme;
import edu.ie3.datamodel.models.timeseries.individual.IndividualTimeSeries;
import edu.ie3.datamodel.models.value.Value;
import edu.ie3.util.interval.ClosedInterval;
import java.time.ZonedDateTime;
import java.util.EnumSet;
import java.util.Optional;

/**
Expand All @@ -21,15 +17,6 @@
*/
public interface TimeSeriesSource<V extends Value> extends DataSource {

EnumSet<ColumnScheme> acceptableSchemes =
EnumSet.of(
ACTIVE_POWER,
APPARENT_POWER,
ENERGY_PRICE,
APPARENT_POWER_AND_HEAT_DEMAND,
ACTIVE_POWER_AND_HEAT_DEMAND,
HEAT_DEMAND);

/**
* Obtain the full time series
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,12 @@
*/
package edu.ie3.datamodel.io.source.csv;

import static edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.*;
import static edu.ie3.datamodel.io.csv.timeseries.ColumnScheme.HEAT_DEMAND;

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.factory.timeseries.*;
import edu.ie3.datamodel.io.naming.FileNamingStrategy;
import edu.ie3.datamodel.io.source.TimeSeriesSource;
Expand All @@ -26,6 +30,15 @@
/** Source that is capable of providing information around time series from csv files. */
public class CsvTimeSeriesSource<V extends Value> extends CsvDataSource
implements TimeSeriesSource<V> {
private static final EnumSet<ColumnScheme> acceptableSchemes =
EnumSet.of(
ACTIVE_POWER,
APPARENT_POWER,
ENERGY_PRICE,
APPARENT_POWER_AND_HEAT_DEMAND,
ACTIVE_POWER_AND_HEAT_DEMAND,
HEAT_DEMAND);

private final IndividualTimeSeries<V> timeSeries;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import edu.ie3.datamodel.exceptions.InvalidColumnNameException;
import edu.ie3.datamodel.io.connectors.SqlConnector;
import edu.ie3.datamodel.io.source.csv.CsvDataSource;
import edu.ie3.util.StringUtils;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
Expand All @@ -23,7 +22,7 @@

public abstract class SqlDataSource<T> {

protected static final Logger log = LoggerFactory.getLogger(CsvDataSource.class);
protected static final Logger log = LoggerFactory.getLogger(SqlDataSource.class);

private final SqlConnector connector;

Expand Down Expand Up @@ -99,7 +98,7 @@ protected List<T> executeQuery(String query, AddParams addParams) {
.flatMap(o -> o.map(Stream::of).orElseGet(Stream::empty))
.collect(Collectors.toList());
} catch (SQLException e) {
log.error("Error during execution of query " + query, e);
log.error("Error during execution of query {}", query, e);
}

return Collections.emptyList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
List<TimeBasedValue<WeatherValue>> timeBasedValues =
executeQuery(
queryTimeInterval,
(ps) -> {
ps -> {
ps.setTimestamp(1, Timestamp.from(timeInterval.getLower().toInstant()));
ps.setTimestamp(2, Timestamp.from(timeInterval.getUpper().toInstant()));
});
Expand All @@ -104,7 +104,7 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
List<TimeBasedValue<WeatherValue>> timeBasedValues =
executeQuery(
queryTimeIntervalAndCoordinates,
(ps) -> {
ps -> {
Array coordinateIdArr =
ps.getConnection().createArrayOf("integer", coordinateIds.toArray());
ps.setArray(1, coordinateIdArr);
Expand All @@ -126,7 +126,7 @@ public Optional<TimeBasedValue<WeatherValue>> getWeather(ZonedDateTime date, Poi
List<TimeBasedValue<WeatherValue>> timeBasedValues =
executeQuery(
queryTimeAndCoordinate,
(ps) -> {
ps -> {
ps.setInt(1, coordinateId.get());
ps.setTimestamp(2, Timestamp.from(date.toInstant()));
});
Expand Down Expand Up @@ -221,6 +221,7 @@ private String createQueryStringForTimeIntervalAndCoordinates(
* @param fieldMap the field to value map for one TimeBasedValue
* @return an Optional of that TimeBasedValue
*/
@Override
protected Optional<TimeBasedValue<WeatherValue>> createEntity(Map<String, String> fieldMap) {
fieldMap.remove("tid");
Optional<TimeBasedWeatherValueData> data = toTimeBasedWeatherValueData(fieldMap);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@
*/
package edu.ie3.datamodel.io.csv.timeseries

import edu.ie3.datamodel.models.value.EnergyPriceValue
import edu.ie3.datamodel.models.value.HeatAndPValue
import edu.ie3.datamodel.models.value.HeatAndSValue
import edu.ie3.datamodel.models.value.HeatDemandValue
import edu.ie3.datamodel.models.value.PValue
import edu.ie3.datamodel.models.value.SValue
import edu.ie3.datamodel.models.value.WeatherValue
import spock.lang.Specification

class ColumnSchemeTest extends Specification {
Expand Down Expand Up @@ -37,4 +44,22 @@ class ColumnSchemeTest extends Specification {
"pqh" || ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND
"weather" || ColumnScheme.WEATHER
}

def "Correct value classes are returned for all column schemes"() {
when:
def actual = columnScheme.getValueClass()

then:
actual == expectedValueClass

where:
columnScheme || expectedValueClass
ColumnScheme.ENERGY_PRICE || EnergyPriceValue.class
ColumnScheme.ACTIVE_POWER || PValue.class
ColumnScheme.APPARENT_POWER || SValue.class
ColumnScheme.HEAT_DEMAND || HeatDemandValue.class
ColumnScheme.ACTIVE_POWER_AND_HEAT_DEMAND || HeatAndPValue.class
ColumnScheme.APPARENT_POWER_AND_HEAT_DEMAND || HeatAndSValue.class
ColumnScheme.WEATHER || WeatherValue.class
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import edu.ie3.datamodel.models.value.WeatherValue
import edu.ie3.test.common.PsdmWeatherTestData
import edu.ie3.test.helper.WeatherSourceTestHelper
import edu.ie3.util.TimeUtil
import edu.ie3.util.geo.GeoUtils
import edu.ie3.util.interval.ClosedInterval
import org.locationtech.jts.geom.Point
import org.testcontainers.containers.PostgreSQLContainer
Expand Down Expand Up @@ -45,17 +46,27 @@ class SqlWeatherSourcePsdmIT extends Specification implements WeatherSourceTestH
source = new SqlWeatherSource(connector, PsdmWeatherTestData.coordinateSource, schemaName, weatherTableName, weatherFactory)
}

def "A NativeSqlWeatherSource can read and correctly parse a single value for a specific date and coordinate"() {
def "A SqlWeatherSourcePsdm can read and correctly parse a single value for a specific date and coordinate"() {
given:
def expectedTimeBasedValue = new TimeBasedValue(PsdmWeatherTestData.TIME_15H, PsdmWeatherTestData.WEATHER_VALUE_193186_15H)

when:
def optTimeBasedValue = source.getWeather(PsdmWeatherTestData.TIME_15H, PsdmWeatherTestData.COORDINATE_193186)

then:
optTimeBasedValue.present
equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue )
}

def "A NativeSqlWeatherSource can read multiple timeseries values for multiple coordinates"() {
def "A SqlWeatherSourcePsdm returns nothing for an invalid coordinate"() {
when:
def optTimeBasedValue = source.getWeather(PsdmWeatherTestData.TIME_15H, GeoUtils.xyToPoint(88d, 89d))

then:
!optTimeBasedValue.present
}

def "A SqlWeatherSourcePsdm can read multiple timeseries values for multiple coordinates"() {
given:
def coordinates = [
PsdmWeatherTestData.COORDINATE_193186,
Expand All @@ -72,15 +83,32 @@ class SqlWeatherSourcePsdmIT extends Specification implements WeatherSourceTestH
[
new TimeBasedValue(PsdmWeatherTestData.TIME_16H, PsdmWeatherTestData.WEATHER_VALUE_193187_16H)
] as Set<TimeBasedValue>)

when:
Map<Point, IndividualTimeSeries<WeatherValue>> coordinateToTimeSeries = source.getWeather(timeInterval, coordinates)

then:
coordinateToTimeSeries.keySet().size() == 2
equalsIgnoreUUID(coordinateToTimeSeries.get(PsdmWeatherTestData.COORDINATE_193186), timeSeries193186)
equalsIgnoreUUID(coordinateToTimeSeries.get(PsdmWeatherTestData.COORDINATE_193187), timeSeries193187)
}

def "A NativeSqlWeatherSource can read all weather data in a given time interval"() {
def "A SqlWeatherSourcePsdm returns nothing for invalid coordinates"() {
given:
def coordinates = [
GeoUtils.xyToPoint(88d, 89d),
GeoUtils.xyToPoint(89d, 89d)
]
def timeInterval = new ClosedInterval(PsdmWeatherTestData.TIME_16H, PsdmWeatherTestData.TIME_17H)

when:
Map<Point, IndividualTimeSeries<WeatherValue>> coordinateToTimeSeries = source.getWeather(timeInterval, coordinates)

then:
coordinateToTimeSeries.keySet().empty
}

def "A SqlWeatherSourcePsdm can read all weather data in a given time interval"() {
given:
def timeInterval = new ClosedInterval(PsdmWeatherTestData.TIME_15H, PsdmWeatherTestData.TIME_17H)
def timeSeries193186 = new IndividualTimeSeries(null,
Expand All @@ -98,8 +126,10 @@ class SqlWeatherSourcePsdmIT extends Specification implements WeatherSourceTestH
[
new TimeBasedValue(PsdmWeatherTestData.TIME_15H, PsdmWeatherTestData.WEATHER_VALUE_193188_15H)
] as Set<TimeBasedValue>)

when:
Map<Point, IndividualTimeSeries<WeatherValue>> coordinateToTimeSeries = source.getWeather(timeInterval)

then:
coordinateToTimeSeries.keySet().size() == 3
equalsIgnoreUUID(coordinateToTimeSeries.get(PsdmWeatherTestData.COORDINATE_193186).entries, timeSeries193186.entries)
Expand Down

0 comments on commit 64ea5dd

Please sign in to comment.