Skip to content

Commit

Permalink
Fix empty response of TemporalAggregate and Cumulative (#18)
Browse files Browse the repository at this point in the history
  • Loading branch information
caspervdw authored and pyprogrammerblog committed Dec 6, 2019
1 parent 238764f commit ee6099c
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 7 deletions.
4 changes: 3 additions & 1 deletion CHANGES.rst
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ Changelog of dask-geomodeling
2.1.1 (unreleased)
------------------

- Nothing changed yet.
- Fix empty response of TemporalAggregate and Cumulative.

- Fix elementwise raster blocks in case of empty datasets.


2.1.0 (2019-11-15)
Expand Down
9 changes: 7 additions & 2 deletions dask_geomodeling/raster/elemwise.py
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,9 @@ def get_sources_and_requests(self, **request):
if start is not None and stop is not None:
# limit request to self.period so that resulting data is aligned
period = self.period
request["start"] = max(start, period[0])
request["stop"] = min(stop, period[1])
if period is not None:
request["start"] = max(start, period[0])
request["stop"] = min(stop, period[1])

process_kwargs = {"dtype": self.dtype.name, "fillvalue": self.fillvalue}
sources_and_requests = [(source, request) for source in self.args]
Expand Down Expand Up @@ -265,6 +266,10 @@ def math_process_func(process_kwargs, *args):
nodata_mask = _nodata_mask
else:
nodata_mask |= _nodata_mask
else:
raise TypeError(
"Cannot apply math function to value {}".format(data)
)

if dtype == np.dtype("bool"):
no_data_value = None
Expand Down
8 changes: 4 additions & 4 deletions dask_geomodeling/raster/temporal.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,7 +509,7 @@ def get_sources_and_requests(self, **request):

start, stop = self._snap_to_resampled_labels(start, stop)
if start is None:
return [({"mode": "empty"}, None)]
return [({"empty": True, "mode": mode}, None)]

# a time request does not involve a request to self.source
if mode == "time":
Expand Down Expand Up @@ -557,7 +557,7 @@ def get_sources_and_requests(self, **request):
def process(process_kwargs, time_data=None, data=None):
mode = process_kwargs["mode"]
# handle empty data
if mode == "empty":
if process_kwargs.get("empty"):
return None if mode == "vals" else {mode: []}
start = process_kwargs["start"]
stop = process_kwargs["stop"]
Expand Down Expand Up @@ -745,7 +745,7 @@ def get_sources_and_requests(self, **request):
time_data = self.source.get_data(mode="time", start=start, stop=stop)
if time_data is None or not time_data.get("time"):
# return early for an empty source
return [({"mode": "empty"}, None)]
return [({"empty": True, "mode": mode}, None)]

# get the periods from the first and last timestamp
start = time_data["time"][0]
Expand Down Expand Up @@ -783,7 +783,7 @@ def get_sources_and_requests(self, **request):
def process(process_kwargs, time_data=None, data=None):
mode = process_kwargs["mode"]
# handle empty data
if mode == "empty":
if process_kwargs.get("empty"):
return None if mode == "vals" else {mode: []}
if mode == "time":
return time_data
Expand Down
34 changes: 34 additions & 0 deletions dask_geomodeling/tests/test_raster.py
Original file line number Diff line number Diff line change
Expand Up @@ -1107,6 +1107,11 @@ def setUp(self):
"stop": Datetime(2020, 1, 1),
**self.request,
}
self.request_empty = {
"start": Datetime(1970, 1, 1),
"stop": Datetime(1971, 1, 1),
**self.request,
}

def test_period_day_agg(self):
self.assertEqual(
Expand Down Expand Up @@ -1376,6 +1381,20 @@ def test_int_result_dtype(self):
result = view.get_data(**self.request_all)
self.assertEqual(result["values"].dtype, np.int32)

def test_get_data_empty_vals(self):
view = self.klass(self.raster, "D")
assert view.get_data(**self.request_empty) is None

def test_get_data_empty_time(self):
view = self.klass(self.raster, "D")
self.request_empty["mode"] = "time"
assert view.get_data(**self.request_empty) == {"time": []}

def test_get_data_empty_meta(self):
view = self.klass(self.raster, "D")
self.request_empty["mode"] = "meta"
assert view.get_data(**self.request_empty) == {"meta": []}


class TestCumulative(unittest.TestCase):
klass = raster.Cumulative
Expand Down Expand Up @@ -1409,6 +1428,11 @@ def setUp(self):
"stop": Datetime(2020, 1, 1),
**self.request,
}
self.request_empty = {
"start": Datetime(1970, 1, 1),
"stop": Datetime(1971, 1, 1),
**self.request,
}

def test_get_data_meta(self):
view = self.klass(self.raster, frequency="W", statistic="sum")
Expand Down Expand Up @@ -1493,6 +1517,16 @@ def test_get_data_count(self):
result = view.get_data(**self.request_all)
assert_equal(result["values"], [[[1, 1, 0]], [[2, 2, 0]], [[3, 3, 0]]])

def test_get_data_empty_vals(self):
view = self.klass(self.raster, frequency="D", statistic="sum")
assert view.get_data(**self.request_empty) is None


def test_get_data_empty_meta(self):
view = self.klass(self.raster, frequency="D", statistic="sum")
self.request_empty["mode"] = "meta"
assert view.get_data(**self.request_empty) == {"meta": []}


class TestBase(unittest.TestCase):
def setUp(self):
Expand Down

0 comments on commit ee6099c

Please sign in to comment.