Skip to content

Commit 8fd0d55

Browse files
authored
Merge pull request #602 from cmu-delphi/covidhosp_asof_fix
Fix covid hosp as_of to only return latest issue
2 parents 763be77 + ecd21ce commit 8fd0d55

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

integrations/server/test_covid_hosp.py

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,24 +28,24 @@ def setUp(self):
2828
cur.execute('truncate table covid_hosp_state_timeseries')
2929
cur.execute('truncate table covid_hosp_meta')
3030

31+
32+
def insert_issue(self, cur, issue, value, record_type):
33+
so_many_nulls = ', '.join(['null'] * 57)
34+
cur.execute(f'''insert into covid_hosp_state_timeseries values (
35+
0, {issue}, 'PA', 20201118, {value}, {so_many_nulls}, '{record_type}'
36+
)''')
37+
3138
def test_query_by_issue(self):
3239
"""Query with and without specifying an issue."""
3340

34-
# insert dummy data
35-
def insert_issue(cur, issue, value, record_type):
36-
so_many_nulls = ', '.join(['null'] * 57)
37-
cur.execute(f'''insert into covid_hosp_state_timeseries values (
38-
0, {issue}, 'PA', 20201118, {value}, {so_many_nulls}, '{record_type}'
39-
)''')
40-
4141
with Database.connect() as db:
4242
with db.new_cursor() as cur:
4343
# inserting out of order to test server-side order by
4444
# also inserting two for 20201201 to test tiebreaker.
45-
insert_issue(cur, 20201201, 123, 'T')
46-
insert_issue(cur, 20201201, 321, 'D')
47-
insert_issue(cur, 20201203, 789, 'T')
48-
insert_issue(cur, 20201202, 456, 'T')
45+
self.insert_issue(cur, 20201201, 123, 'T')
46+
self.insert_issue(cur, 20201201, 321, 'D')
47+
self.insert_issue(cur, 20201203, 789, 'T')
48+
self.insert_issue(cur, 20201202, 456, 'T')
4949

5050
# request without issue (defaulting to latest issue)
5151
with self.subTest(name='no issue (latest)'):
@@ -81,3 +81,20 @@ def insert_issue(cur, issue, value, record_type):
8181
self.assertEqual(rows[1]['critical_staffing_shortage_today_yes'], 456)
8282
self.assertEqual(rows[2]['issue'], 20201203)
8383
self.assertEqual(rows[2]['critical_staffing_shortage_today_yes'], 789)
84+
85+
86+
def test_query_by_as_of(self):
87+
with Database.connect() as db:
88+
with db.new_cursor() as cur:
89+
self.insert_issue(cur, 20201101, 0, 'T')
90+
self.insert_issue(cur, 20201102, 1, 'D')
91+
self.insert_issue(cur, 20201103, 2, 'D')
92+
self.insert_issue(cur, 20201103, 3, 'T')
93+
self.insert_issue(cur, 20201104, 4, 'T')
94+
95+
with self.subTest(name='as_of with multiple issues'):
96+
response = Epidata.covid_hosp('PA', 20201118, as_of=20201103)
97+
self.assertEqual(response['result'], 1)
98+
self.assertEqual(len(response['epidata']), 1)
99+
self.assertEqual(response['epidata'][0]['issue'], 20201103)
100+
self.assertEqual(response['epidata'][0]['critical_staffing_shortage_today_yes'], 2)

src/server/endpoints/covid_hosp_state_timeseries.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def handle():
9999
elif as_of is not None:
100100
sub_condition_asof = "(issue <= :as_of)"
101101
q.params["as_of"] = as_of
102-
query = f"WITH c as (SELECT {q.fields_clause}, ROW_NUMBER() OVER (PARTITION BY date, state, issue ORDER BY record_type) row FROM {q.table} WHERE {q.conditions_clause} AND {sub_condition_asof}) SELECT {q.fields_clause} FROM {q.alias} WHERE row = 1 ORDER BY {q.order_clause}"
102+
query = f"WITH c as (SELECT {q.fields_clause}, ROW_NUMBER() OVER (PARTITION BY date, state ORDER BY issue DESC, record_type) row FROM {q.table} WHERE {q.conditions_clause} AND {sub_condition_asof}) SELECT {q.fields_clause} FROM {q.alias} WHERE row = 1 ORDER BY {q.order_clause}"
103103
else:
104104
# final query using most recent issues
105105
subquery = f"(SELECT max(`issue`) `max_issue`, `date`, `state` FROM {q.table} WHERE {q.conditions_clause} GROUP BY `date`, `state`) x"

0 commit comments

Comments
 (0)