Skip to content

Commit bdd0ae8

Browse files
Strict fail-fast on partial results
1 parent 3ebda49 commit bdd0ae8

File tree

8 files changed

+111
-1
lines changed

8 files changed

+111
-1
lines changed

src/main/java/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,14 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
153153
}
154154
}
155155
}
156+
157+
if (coordinateToTimeSeries.size() < coordinates.size()) {
158+
Set<Point> missingCoordinates = new HashSet<>(coordinates);
159+
missingCoordinates.removeAll(coordinateToTimeSeries.keySet());
160+
throw new NoDataException(
161+
"No weather data for coordinates " + missingCoordinates + " in interval " + timeInterval);
162+
}
163+
156164
return coordinateToTimeSeries;
157165
}
158166

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,14 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
130130
throw new NoDataException(
131131
"No weather data found for the given time interval: " + timeInterval);
132132
}
133+
134+
if (result.size() < coordinates.size()) {
135+
Set<Point> missingCoordinates = new HashSet<>(coordinates);
136+
missingCoordinates.removeAll(result.keySet());
137+
throw new NoDataException(
138+
"No weather data for coordinates " + missingCoordinates + " in interval " + timeInterval);
139+
}
140+
133141
return result;
134142
}
135143

src/main/java/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSource.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,14 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
122122
}
123123
}
124124
}
125+
126+
if (coordinateToTimeSeries.size() < coordinates.size()) {
127+
Set<Point> missingCoordinates = new HashSet<>(coordinates);
128+
missingCoordinates.removeAll(coordinateToTimeSeries.keySet());
129+
throw new NoDataException(
130+
"No weather data for coordinates " + missingCoordinates + " in interval " + timeInterval);
131+
}
132+
125133
return coordinateToTimeSeries;
126134
}
127135

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,17 @@ public Map<Point, IndividualTimeSeries<WeatherValue>> getWeather(
144144
ps.setTimestamp(3, Timestamp.from(timeInterval.getUpper().toInstant()));
145145
}));
146146

147-
return mapWeatherValuesToPoints(timeBasedValues);
147+
Map<Point, IndividualTimeSeries<WeatherValue>> result =
148+
mapWeatherValuesToPoints(timeBasedValues);
149+
150+
if (result.size() < coordinates.size()) {
151+
Set<Point> missingCoordinates = new HashSet<>(coordinates);
152+
missingCoordinates.removeAll(result.keySet());
153+
throw new NoDataException(
154+
"No weather data for coordinates " + missingCoordinates + " in interval " + timeInterval);
155+
}
156+
157+
return result;
148158
}
149159

150160
@Override

src/test/groovy/edu/ie3/datamodel/io/source/couchbase/CouchbaseWeatherSourceIconIT.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,25 @@ class CouchbaseWeatherSourceIconIT extends Specification implements TestContaine
195195
ex.message.contains(invalidCoordinate.toString())
196196
}
197197

198+
def "A CouchbaseWeatherSource throws NoDataException when some valid coordinates have no data in time interval"() {
199+
given:
200+
def validCoordinateWithData = IconWeatherTestData.COORDINATE_67775
201+
def validCoordinateWithoutData = IconWeatherTestData.COORDINATE_67776
202+
def futureTimeInterval = new ClosedInterval(IconWeatherTestData.TIME_17H.plusHours(1), IconWeatherTestData.TIME_17H.plusHours(2))
203+
204+
when: "requesting weather for valid coordinates but in a future time interval where no data exists"
205+
source.getWeather(futureTimeInterval, [
206+
validCoordinateWithData,
207+
validCoordinateWithoutData
208+
])
209+
210+
then: "NoDataException is thrown for missing data in interval"
211+
def ex = thrown(NoDataException)
212+
ex.message.contains("No weather data for coordinates")
213+
ex.message.contains("in interval")
214+
ex.message.contains(futureTimeInterval.toString())
215+
}
216+
198217
def "A CouchbaseWeatherSource throws NoDataException for future date"() {
199218
given:
200219
def futureDate = IconWeatherTestData.TIME_17H.plusDays(30)

src/test/groovy/edu/ie3/datamodel/io/source/csv/CsvWeatherSourceIconTest.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -340,4 +340,23 @@ class CsvWeatherSourceIconTest extends Specification implements CsvTestDataMeta,
340340
ex.message.contains("No data for given coordinates")
341341
ex.message.contains(invalidCoordinate.toString())
342342
}
343+
344+
def "A CsvWeatherSource throws NoDataException when some valid coordinates have no data in time interval"() {
345+
given:
346+
def validCoordinateWithData = IconWeatherTestData.COORDINATE_67775
347+
def validCoordinateWithoutData = IconWeatherTestData.COORDINATE_67776
348+
def futureTimeInterval = new ClosedInterval(IconWeatherTestData.TIME_17H.plusHours(1), IconWeatherTestData.TIME_17H.plusHours(2))
349+
350+
when: "requesting weather for valid coordinates but in a future time interval where no data exists"
351+
source.getWeather(futureTimeInterval, [
352+
validCoordinateWithData,
353+
validCoordinateWithoutData
354+
])
355+
356+
then: "NoDataException is thrown for missing data in interval"
357+
def ex = thrown(NoDataException)
358+
ex.message.contains("No weather data for coordinates")
359+
ex.message.contains("in interval")
360+
ex.message.contains(futureTimeInterval.toString())
361+
}
343362
}

src/test/groovy/edu/ie3/datamodel/io/source/influxdb/InfluxDbWeatherSourceIconIT.groovy

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,25 @@ class InfluxDbWeatherSourceIconIT extends Specification implements WeatherSource
160160
ex3.message.contains(invalidCoordinate.toString())
161161
}
162162

163+
def "An InfluxDbWeatherSource throws NoDataException when some valid coordinates have no data in time interval"() {
164+
given:
165+
def validCoordinateWithData = IconWeatherTestData.COORDINATE_67775
166+
def validCoordinateWithoutData = IconWeatherTestData.COORDINATE_67776
167+
def futureTimeInterval = new ClosedInterval(IconWeatherTestData.TIME_17H.plusHours(1), IconWeatherTestData.TIME_17H.plusHours(2))
168+
169+
when: "requesting weather for valid coordinates but in a future time interval where no data exists"
170+
source.getWeather(futureTimeInterval, [
171+
validCoordinateWithData,
172+
validCoordinateWithoutData
173+
])
174+
175+
then: "NoDataException is thrown for missing data in interval"
176+
def ex = thrown(NoDataException)
177+
ex.message.contains("No weather data for coordinates")
178+
ex.message.contains("in interval")
179+
ex.message.contains(futureTimeInterval.toString())
180+
}
181+
163182
def "The InfluxDbWeatherSource returns all time keys after a given time key correctly"() {
164183
given:
165184
def time = IconWeatherTestData.TIME_15H

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,4 +181,23 @@ class SqlWeatherSourceCosmoIT extends Specification implements TestContainerHelp
181181
ex.message.contains("No data for given coordinates")
182182
ex.message.contains(invalidCoordinate.toString())
183183
}
184+
185+
def "A SqlWeatherSource throws NoDataException when some valid coordinates have no data in time interval"() {
186+
given:
187+
def validCoordinateWithData = CosmoWeatherTestData.COORDINATE_193186
188+
def validCoordinateWithoutData = CosmoWeatherTestData.COORDINATE_193187
189+
def futureTimeInterval = new ClosedInterval(CosmoWeatherTestData.TIME_17H.plusHours(1), CosmoWeatherTestData.TIME_17H.plusHours(2))
190+
191+
when: "requesting weather for valid coordinates but in a future time interval where no data exists"
192+
source.getWeather(futureTimeInterval, [
193+
validCoordinateWithData,
194+
validCoordinateWithoutData
195+
])
196+
197+
then: "NoDataException is thrown for missing data in interval"
198+
def ex = thrown(NoDataException)
199+
ex.message.contains("No weather data for coordinates")
200+
ex.message.contains("in interval")
201+
ex.message.contains(futureTimeInterval.toString())
202+
}
184203
}

0 commit comments

Comments
 (0)