diff --git a/AUTHORS b/AUTHORS index 4c0b256d1..c358b1c4b 100644 --- a/AUTHORS +++ b/AUTHORS @@ -28,4 +28,5 @@ Main Contributers: - Johannes Bao - https://github.com/jo-bao - Julian Hohmann - https://github.com/julianhohmann - Simon Huette - https://github.com/SimonHuette - - Pierre Petersmeier - http://github.com/pierrepetersmeier + - Pierre Petersmeier - https://github.com/pierrepetersmeier + - Philipp Schmelter - https://github.com/PhilippSchmelter diff --git a/CHANGELOG.md b/CHANGELOG.md index e0653de1a..9ef08eff5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Enhance `TimeSeriesSource` with method to retrieve all time keys after a given key [#543](https://github.com/ie3-institute/PowerSystemDataModel/issues/543) - Enhance `WeatherSource` with method to retrieve all time keys after a given key [#572](https://github.com/ie3-institute/PowerSystemDataModel/issues/572) +- Added explicit handling for cases where no weather data is received from any source [#554](https://github.com/ie3-institute/PowerSystemDataModel/issues/554) - Adding timeseries for voltage values [#1128](https://github.com/ie3-institute/PowerSystemDataModel/issues/1128) - Added Staudt to list of reviewers [#1190](https://github.com/ie3-institute/PowerSystemDataModel/issues/1190) - Extend ValidationUtils for validating ThermalGrids [#1216](https://github.com/ie3-institute/PowerSystemDataModel/issues/1216) @@ -23,6 +24,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Validation for BDEW load profile values [#1243](https://github.com/ie3-institute/PowerSystemDataModel/issues/1243) - Added load profiles sources [#1106](https://github.com/ie3-institute/PowerSystemDataModel/issues/1106) + ### Fixed - Removing opened `SwitchInput` during connectivity check [#1221](https://github.com/ie3-institute/PowerSystemDataModel/issues/1221) - Fixed example in ReadTheDocs [#1244](https://github.com/ie3-institute/PowerSystemDataModel/issues/1244) diff --git a/src/main/java/edu/ie3/datamodel/exceptions/NoDataException.java b/src/main/java/edu/ie3/datamodel/exceptions/NoDataException.java new file mode 100644 index 000000000..dc52fcb6a --- /dev/null +++ b/src/main/java/edu/ie3/datamodel/exceptions/NoDataException.java @@ -0,0 +1,20 @@ +/* + * © 2024. TU Dortmund University, + * Institute of Energy Systems, Energy Efficiency and Energy Economics, + * Research group Distribution grid planning and operation +*/ +package edu.ie3.datamodel.exceptions; + +/** + * Exception that should be used whenever no data is received{@link + * edu.ie3.datamodel.io.source.DataSource} + * + * @version 0.1 + * @since 04.09.24 + */ +public class NoDataException extends Exception { + + public NoDataException(final String message) { + super(message); + } +} diff --git a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java index a7a056d85..75c662b10 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/WeatherSource.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.source; +import edu.ie3.datamodel.exceptions.NoDataException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueData; @@ -55,14 +56,14 @@ public void validate() throws ValidationException { // -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- public abstract Map> getWeather( - ClosedInterval timeInterval) throws SourceException; + ClosedInterval timeInterval) throws SourceException, NoDataException; public abstract Map> getWeather( ClosedInterval timeInterval, Collection coordinates) - throws SourceException; + throws SourceException, NoDataException; - public abstract Optional> getWeather( - ZonedDateTime date, Point coordinate) throws SourceException; + public abstract TimeBasedValue getWeather(ZonedDateTime date, Point coordinate) + throws SourceException, NoDataException; public abstract Map> getTimeKeysAfter(ZonedDateTime time) throws SourceException; diff --git a/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java index 8dc56cafe..146270573 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java @@ -10,6 +10,7 @@ import com.couchbase.client.java.json.JsonObject; import com.couchbase.client.java.kv.GetResult; import com.couchbase.client.java.query.QueryResult; +import edu.ie3.datamodel.exceptions.NoDataException; import edu.ie3.datamodel.io.connectors.CouchbaseConnector; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueData; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueFactory; @@ -104,7 +105,7 @@ public Optional> getSourceFields() { @Override public Map> getWeather( - ClosedInterval timeInterval) { + ClosedInterval timeInterval) throws NoDataException { logger.warn( "By not providing coordinates you are forcing couchbase to check all possible coordinates one by one." + " This is not very performant. Please consider providing specific coordinates instead."); @@ -113,7 +114,8 @@ public Map> getWeather( @Override public Map> getWeather( - ClosedInterval timeInterval, Collection coordinates) { + ClosedInterval timeInterval, Collection coordinates) + throws NoDataException { HashMap> coordinateToTimeSeries = new HashMap<>(); for (Point coordinate : coordinates) { Optional coordinateId = idCoordinateSource.getId(coordinate); @@ -137,32 +139,41 @@ public Map> getWeather( new IndividualTimeSeries<>(weatherInputs); coordinateToTimeSeries.put(coordinate, weatherTimeSeries); } - } else logger.warn("Unable to match coordinate {} to a coordinate ID", coordinate); + } else { + logger.error("Unable to match coordinate {} to a coordinate ID", coordinate); + throw new NoDataException("No data found"); + } } return coordinateToTimeSeries; } @Override - public Optional> getWeather(ZonedDateTime date, Point coordinate) { + public TimeBasedValue getWeather(ZonedDateTime date, Point coordinate) + throws NoDataException { Optional coordinateId = idCoordinateSource.getId(coordinate); if (coordinateId.isEmpty()) { - logger.warn("Unable to match coordinate {} to a coordinate ID", coordinate); - return Optional.empty(); + logger.error("Unable to match coordinate {} to a coordinate ID", coordinate); + throw new NoDataException("No coordinate ID found for the given point."); } try { CompletableFuture futureResult = connector.get(generateWeatherKey(date, coordinateId.get())); GetResult getResult = futureResult.join(); JsonObject jsonWeatherInput = getResult.contentAsObject(); - return toTimeBasedWeatherValue(jsonWeatherInput); + return toTimeBasedWeatherValue(jsonWeatherInput) + .orElseThrow( + () -> + new NoDataException( + "No valid weather data found for the given date and coordinate.")); } catch (DecodingFailureException ex) { logger.error("Decoding to TimeBasedWeatherValue failed!", ex); - return Optional.empty(); + throw new NoDataException("Failed to decode weather data."); } catch (DocumentNotFoundException ex) { - return Optional.empty(); + throw new NoDataException("Weather document not found."); } catch (CompletionException ex) { - if (ex.getCause() instanceof DocumentNotFoundException) return Optional.empty(); - else throw ex; + if (ex.getCause() instanceof DocumentNotFoundException) { + throw new NoDataException("Weather document not found in the completion stage."); + } else throw ex; } } diff --git a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java index ab565db80..a2e2fd312 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/csv/CsvWeatherSource.java @@ -8,6 +8,7 @@ import static edu.ie3.datamodel.utils.validation.UniquenessValidationUtils.checkWeatherUniqueness; import edu.ie3.datamodel.exceptions.DuplicateEntitiesException; +import edu.ie3.datamodel.exceptions.NoDataException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.exceptions.ValidationException; import edu.ie3.datamodel.io.connectors.CsvFileConnector; @@ -90,25 +91,48 @@ public Optional> getSourceFields() { @Override public Map> getWeather( - ClosedInterval timeInterval) { - return trimMapToInterval(coordinateToTimeSeries, timeInterval); + ClosedInterval timeInterval) throws NoDataException { + + Map> result = + trimMapToInterval(coordinateToTimeSeries, timeInterval); + + if (result == null || result.isEmpty()) { + throw new NoDataException("No weather data found."); + } + + return result; } @Override public Map> getWeather( - ClosedInterval timeInterval, Collection coordinates) { + ClosedInterval timeInterval, Collection coordinates) + throws NoDataException { Map> filteredMap = coordinateToTimeSeries.entrySet().stream() .filter(entry -> coordinates.contains(entry.getKey())) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - return trimMapToInterval(filteredMap, timeInterval); + + Map> result = + trimMapToInterval(filteredMap, timeInterval); + + if (result == null || result.isEmpty()) { + throw new NoDataException("No weather data found."); + } + return result; } @Override - public Optional> getWeather(ZonedDateTime date, Point coordinate) { + public TimeBasedValue getWeather(ZonedDateTime date, Point coordinate) + throws NoDataException { IndividualTimeSeries timeSeries = coordinateToTimeSeries.get(coordinate); - if (timeSeries == null) return Optional.empty(); - return timeSeries.getTimeBasedValue(date); + + if (timeSeries == null) { + throw new NoDataException("No weather data found for the given coordinate"); + } + + return timeSeries + .getTimeBasedValue(date) + .orElseThrow(() -> new NoDataException("No weather data found for the given coordinate")); } @Override diff --git a/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java index 2a23660f5..1e70013fc 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java @@ -5,6 +5,7 @@ */ package edu.ie3.datamodel.io.source.influxdb; +import edu.ie3.datamodel.exceptions.NoDataException; import edu.ie3.datamodel.io.connectors.InfluxDbConnector; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueData; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueFactory; @@ -67,6 +68,9 @@ public Map> getWeather( optTimeBasedValueStream(queryResult); Set> timeBasedValues = filterEmptyOptionals(optValues).collect(Collectors.toSet()); + if (timeBasedValues.isEmpty()) { + throw new NoDataException("No weather data found"); + } Map>> coordinateToValues = timeBasedValues.stream() .collect( @@ -76,6 +80,9 @@ public Map> getWeather( return coordinateToValues.entrySet().stream() .collect( Collectors.toMap(Map.Entry::getKey, e -> new IndividualTimeSeries<>(e.getValue()))); + } catch (NoDataException e) { + log.error("No data available for coordinate", e); + return Collections.emptyMap(); } } @@ -97,25 +104,43 @@ public Map> getWeather( optTimeBasedValueStream(queryResult); Set> timeBasedValues = filterEmptyOptionals(optValues).collect(Collectors.toSet()); + if (timeBasedValues.isEmpty()) { + throw new NoDataException("No weather data found"); + } IndividualTimeSeries timeSeries = new IndividualTimeSeries<>(timeBasedValues); coordinateToTimeSeries.put(entry.getKey(), timeSeries); } } + } catch (NoDataException e) { + return Collections.emptyMap(); } return coordinateToTimeSeries; } @Override - public Optional> getWeather(ZonedDateTime date, Point coordinate) { - Optional coordinateId = idCoordinateSource.getId(coordinate); - if (coordinateId.isEmpty()) { - return Optional.empty(); + public TimeBasedValue getWeather(ZonedDateTime date, Point coordinate) + throws NoDataException { + Optional coordinateId; + try { + coordinateId = idCoordinateSource.getId(coordinate); + if (coordinateId.isEmpty()) { + throw new NoDataException("No coordinate ID found for the given point."); + } + } catch (NoDataException e) { + log.error("No data available for coordinate {} and date {}", coordinate, date, e); + return null; } + try (InfluxDB session = connector.getSession()) { String query = createQueryStringForCoordinateAndTime(date, coordinateId.get()); QueryResult queryResult = session.query(new Query(query)); - return filterEmptyOptionals(optTimeBasedValueStream(queryResult)).findFirst(); + return filterEmptyOptionals(optTimeBasedValueStream(queryResult)) + .findFirst() + .orElseThrow( + () -> + new NoDataException( + "No weather data available for the given date and coordinate.")); } } @@ -167,9 +192,14 @@ public List getTimeKeysAfter(ZonedDateTime time, Point coordinate * @return weather data for the specified time and coordinate */ public IndividualTimeSeries getWeather( - ClosedInterval timeInterval, Point coordinate) { - Optional coordinateId = idCoordinateSource.getId(coordinate); - if (coordinateId.isEmpty()) { + ClosedInterval timeInterval, Point coordinate) throws NoDataException { + Optional coordinateId; + try { + coordinateId = idCoordinateSource.getId(coordinate); + if (coordinateId.isEmpty()) { + throw new NoDataException("No data for given coordinates"); + } + } catch (NoDataException e) { return new IndividualTimeSeries<>(UUID.randomUUID(), Collections.emptySet()); } try (InfluxDB session = connector.getSession()) { diff --git a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlWeatherSource.java b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlWeatherSource.java index 358169694..e62538a08 100644 --- a/src/main/java/edu/ie3/datamodel/io/source/sql/SqlWeatherSource.java +++ b/src/main/java/edu/ie3/datamodel/io/source/sql/SqlWeatherSource.java @@ -7,6 +7,7 @@ import static edu.ie3.datamodel.io.source.sql.SqlDataSource.createBaseQueryString; +import edu.ie3.datamodel.exceptions.NoDataException; import edu.ie3.datamodel.exceptions.SourceException; import edu.ie3.datamodel.io.connectors.SqlConnector; import edu.ie3.datamodel.io.factory.timeseries.TimeBasedWeatherValueFactory; @@ -92,7 +93,7 @@ public Optional> getSourceFields() { @Override public Map> getWeather( - ClosedInterval timeInterval) throws SourceException { + ClosedInterval timeInterval) throws NoDataException, SourceException { List> timeBasedValues = buildTimeBasedValues( weatherFactory, @@ -102,20 +103,28 @@ public Map> getWeather( ps.setTimestamp(1, Timestamp.from(timeInterval.getLower().toInstant())); ps.setTimestamp(2, Timestamp.from(timeInterval.getUpper().toInstant())); })); + if (timeBasedValues.isEmpty()) { + throw new NoDataException("No weather data found"); + } return mapWeatherValuesToPoints(timeBasedValues); } @Override public Map> getWeather( ClosedInterval timeInterval, Collection coordinates) - throws SourceException { - Set coordinateIds = - coordinates.stream() - .map(idCoordinateSource::getId) - .flatMap(Optional::stream) - .collect(Collectors.toSet()); - if (coordinateIds.isEmpty()) { - log.warn("Unable to match coordinates to coordinate ID"); + throws SourceException, NoDataException { + Set coordinateIds; + try { + coordinateIds = + coordinates.stream() + .map(idCoordinateSource::getId) + .flatMap(Optional::stream) + .collect(Collectors.toSet()); + if (coordinateIds.isEmpty()) { + log.warn("Unable to match coordinates to coordinate ID"); + throw new NoDataException("No coordinates found"); + } + } catch (NoDataException e) { return Collections.emptyMap(); } @@ -136,12 +145,18 @@ public Map> getWeather( } @Override - public Optional> getWeather(ZonedDateTime date, Point coordinate) - throws SourceException { - Optional coordinateId = idCoordinateSource.getId(coordinate); - if (coordinateId.isEmpty()) { - log.warn("Unable to match coordinate {} to a coordinate ID", coordinate); - return Optional.empty(); + public TimeBasedValue getWeather(ZonedDateTime date, Point coordinate) + throws SourceException, NoDataException { + Optional coordinateId; + try { + coordinateId = idCoordinateSource.getId(coordinate); + if (coordinateId.isEmpty()) { + log.warn("Unable to match coordinate {} to a coordinate ID", coordinate); + throw new NoDataException("No coordinate ID found for the given point."); + } + } catch (NoDataException e) { + log.error("No data available for coordinate {} and date {}", coordinate, date, e); + return null; } List> timeBasedValues = @@ -154,10 +169,10 @@ public Optional> getWeather(ZonedDateTime date, Poi ps.setTimestamp(2, Timestamp.from(date.toInstant())); })); - if (timeBasedValues.isEmpty()) return Optional.empty(); + if (timeBasedValues.isEmpty()) throw new NoDataException("No weather data found"); if (timeBasedValues.size() > 1) log.warn("Retrieved more than one result value, using the first"); - return Optional.of(timeBasedValues.get(0)); + return timeBasedValues.get(0); } @Override diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceCosmoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceCosmoIT.groovy index a032cb5bc..07ffa0f03 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceCosmoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceCosmoIT.groovy @@ -90,8 +90,8 @@ class CouchbaseWeatherSourceCosmoIT extends Specification implements TestContain def optTimeBasedValue = source.getWeather(CosmoWeatherTestData.TIME_15H, CosmoWeatherTestData.COORDINATE_193186) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "A CouchbaseWeatherSource can read multiple time series values for multiple coordinates"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceIconIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceIconIT.groovy index bf3f272f0..d83d37a2e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceIconIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceIconIT.groovy @@ -90,8 +90,8 @@ class CouchbaseWeatherSourceIconIT extends Specification implements TestContaine def optTimeBasedValue = source.getWeather(IconWeatherTestData.TIME_15H, IconWeatherTestData.COORDINATE_67775) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "A CouchbaseWeatherSource can read multiple time series values for multiple coordinates"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceCosmoTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceCosmoTest.groovy index cc5e709f2..07cf7461d 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceCosmoTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceCosmoTest.groovy @@ -49,8 +49,8 @@ class CsvWeatherSourceCosmoTest extends Specification implements CsvTestDataMeta def optTimeBasedValue = source.getWeather(CosmoWeatherTestData.TIME_15H, CosmoWeatherTestData.COORDINATE_193186) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "A CsvWeatherSource can read multiple time series values for multiple coordinates"() { @@ -80,7 +80,6 @@ class CsvWeatherSourceCosmoTest extends Specification implements CsvTestDataMeta equalsIgnoreUUID(coordinateToTimeSeries.get(CosmoWeatherTestData.COORDINATE_193187), timeSeries193187) } - def "A CsvWeatherSource can read all weather data in a given time interval"() { given: def timeInterval = new ClosedInterval(CosmoWeatherTestData.TIME_15H, CosmoWeatherTestData.TIME_17H) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceIconTest.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceIconTest.groovy index 7d90727b2..13bd8914b 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceIconTest.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceIconTest.groovy @@ -43,8 +43,8 @@ class CsvWeatherSourceIconTest extends Specification implements CsvTestDataMeta, def optTimeBasedValue = source.getWeather(IconWeatherTestData.TIME_15H, IconWeatherTestData.COORDINATE_67775) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "A CsvWeatherSource can read multiple time series values for multiple coordinates"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceCosmoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceCosmoIT.groovy index d2b212a2a..594bf1d6e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceCosmoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceCosmoIT.groovy @@ -65,8 +65,8 @@ class InfluxDbWeatherSourceCosmoIT extends Specification implements TestContaine def optTimeBasedValue = source.getWeather(CosmoWeatherTestData.TIME_15H, CosmoWeatherTestData.COORDINATE_193186) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "An InfluxDbWeatherSource can read multiple time series values for multiple coordinates"() { @@ -148,7 +148,7 @@ class InfluxDbWeatherSourceCosmoIT extends Specification implements TestContaine ]) then: - coordinateAtDate == Optional.empty() + assert coordinateAtDate == null equalsIgnoreUUID(coordinateInInterval, emptyTimeSeries) coordinatesToTimeSeries.keySet() == [validCoordinate].toSet() equalsIgnoreUUID(coordinatesToTimeSeries.get(validCoordinate), timeseries_193186) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceIconIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceIconIT.groovy index ce3a6dfcb..e4d62131e 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceIconIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceIconIT.groovy @@ -63,8 +63,8 @@ class InfluxDbWeatherSourceIconIT extends Specification implements WeatherSource def optTimeBasedValue = source.getWeather(IconWeatherTestData.TIME_15H , IconWeatherTestData.COORDINATE_67775) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue) } def "An InfluxDbWeatherSource can read multiple time series values for multiple coordinates"() { @@ -141,7 +141,7 @@ class InfluxDbWeatherSourceIconIT extends Specification implements WeatherSource ]) then: - coordinateAtDate == Optional.empty() + assert coordinateAtDate == null equalsIgnoreUUID(coordinateInInterval, emptyTimeSeries) coordinatesToTimeSeries.keySet() == [validCoordinate].toSet() equalsIgnoreUUID(coordinatesToTimeSeries.get(validCoordinate), timeseries67775) diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceCosmoIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceCosmoIT.groovy index 1a7e0a0d3..a903a2299 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceCosmoIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceCosmoIT.groovy @@ -56,8 +56,8 @@ class SqlWeatherSourceCosmoIT extends Specification implements TestContainerHelp def optTimeBasedValue = source.getWeather(CosmoWeatherTestData.TIME_15H, CosmoWeatherTestData.COORDINATE_193186) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue ) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue ) } def "A SqlWeatherSource returns nothing for an invalid coordinate"() { @@ -65,7 +65,7 @@ class SqlWeatherSourceCosmoIT extends Specification implements TestContainerHelp def optTimeBasedValue = source.getWeather(CosmoWeatherTestData.TIME_15H, GeoUtils.buildPoint(89d, 88d)) then: - optTimeBasedValue.empty + assert optTimeBasedValue == null } def "A SqlWeatherSource can read multiple time series values for multiple coordinates"() { @@ -107,7 +107,7 @@ class SqlWeatherSourceCosmoIT extends Specification implements TestContainerHelp Map> coordinateToTimeSeries = source.getWeather(timeInterval, coordinates) then: - coordinateToTimeSeries.keySet().empty + coordinateToTimeSeries == Collections.emptyMap() } def "A SqlWeatherSource can read all weather data in a given time interval"() { diff --git a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceIconIT.groovy b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceIconIT.groovy index 65cdb72d9..d8194d1cb 100644 --- a/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceIconIT.groovy +++ b/src/test/groovy/edu/ie3/datamodel/io/source/sql/SqlWeatherSourceIconIT.groovy @@ -54,8 +54,8 @@ class SqlWeatherSourceIconIT extends Specification implements TestContainerHelpe when: def optTimeBasedValue = source.getWeather(IconWeatherTestData.TIME_15H, IconWeatherTestData.COORDINATE_67775) then: - optTimeBasedValue.present - equalsIgnoreUUID(optTimeBasedValue.get(), expectedTimeBasedValue ) + optTimeBasedValue != null + equalsIgnoreUUID(optTimeBasedValue, expectedTimeBasedValue ) } def "A NativeSqlWeatherSource can read multiple timeseries values for multiple coordinates"() {