diff --git a/integrations/server/test_covidcast.py b/integrations/server/test_covidcast.py index 3de69f02c..bcca3b199 100644 --- a/integrations/server/test_covidcast.py +++ b/integrations/server/test_covidcast.py @@ -73,6 +73,18 @@ def _insert_placeholder_set_four(self): for i in [4, 5, 6] ] self._insert_rows(rows) + return rows + + def _insert_placeholder_set_five(self): + rows = [ + self._make_placeholder_row(time_value=2000_01_01, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i)[0] + for i in [1, 2, 3] + ] + [ + # different time_values, same issues + self._make_placeholder_row(time_value=2000_01_01+i-3, value=i*1., stderr=i*10., sample_size=i*100., issue=2000_01_03+i-3)[0] + for i in [4, 5, 6] + ] + self._insert_rows(rows) return rows def test_round_trip(self): @@ -237,6 +249,46 @@ def test_location_wildcard(self): 'message': 'success', }) + def test_time_values_wildcard(self): + """Select all time_values with a wildcard query.""" + + # insert placeholder data + rows = self._insert_placeholder_set_three() + expected_time_values = [ + self.expected_from_row(r) for r in rows[:3] + ] + + # make the request + response, _ = self.request_based_on_row(rows[0], time_values="*") + + self.maxDiff = None + # assert that the right data came back + self.assertEqual(response, { + 'result': 1, + 'epidata': expected_time_values, + 'message': 'success', + }) + + def test_issues_wildcard(self): + """Select all issues with a wildcard query.""" + + # insert placeholder data + rows = self._insert_placeholder_set_five() + expected_issues = [ + self.expected_from_row(r) for r in rows[:3] + ] + + # make the request + response, _ = self.request_based_on_row(rows[0], issues="*") + + self.maxDiff = None + # assert that the right data came back + self.assertEqual(response, { + 'result': 1, + 'epidata': expected_issues, + 'message': 'success', + }) + def test_signal_wildcard(self): """Select all signals with a wildcard query.""" diff --git a/src/server/_params.py b/src/server/_params.py index dd053121b..a7d36353c 100644 --- a/src/server/_params.py +++ b/src/server/_params.py @@ -381,7 +381,10 @@ def _parse_range(part: str): def parse_date(s: str) -> int: # parses a given string in format YYYYMMDD or YYYY-MM-DD to a number in the form YYYYMMDD try: - return int(s.replace("-", "")) + if s == "*": + return s + else: + return int(s.replace("-", "")) except ValueError: raise ValidationFailedException(f"not a valid date: {s}") @@ -477,6 +480,8 @@ def parse_time_set() -> TimeSet: # old version require_all("time_type", "time_values") time_values = extract_dates("time_values") + if time_values == ["*"]: + return TimeSet(time_type, True) return TimeSet(time_type, time_values) if ":" not in request.values.get("time", ""): diff --git a/src/server/_query.py b/src/server/_query.py index c62649d02..3c23f94ad 100644 --- a/src/server/_query.py +++ b/src/server/_query.py @@ -474,8 +474,11 @@ def apply_lag_filter(self, history_table: str, lag: Optional[int]) -> "QueryBuil def apply_issues_filter(self, history_table: str, issues: Optional[TimeValues]) -> "QueryBuilder": if issues: - self.retable(history_table) - self.where_integers("issue", issues) + if issues == ["*"]: + self.retable(history_table) + else: + self.retable(history_table) + self.where_integers("issue", issues) return self def apply_as_of_filter(self, history_table: str, as_of: Optional[int]) -> "QueryBuilder":