Skip to content

Commit cbd7449

Browse files
committed
feat: update latest TDS materialized view to use observation datetime and add tests for timestamp accuracy
1 parent c21c254 commit cbd7449

2 files changed

Lines changed: 76 additions & 5 deletions

File tree

alembic/versions/i2b3c4d5e6f7_add_latest_tds_pygeoapi_materialized_view.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def _create_latest_tds_view() -> str:
3737
SELECT
3838
csi.thing_id,
3939
mc.id AS major_chemistry_id,
40-
COALESCE(mc."AnalysisDate", csi."CollectionDate")::date AS observation_date,
40+
COALESCE(mc."AnalysisDate", csi."CollectionDate") AS observation_datetime,
4141
mc."SampleValue" AS sample_value,
4242
mc."Units" AS units
4343
FROM "NMA_MajorChemistry" AS mc
@@ -59,12 +59,12 @@ def _create_latest_tds_view() -> str:
5959
SELECT
6060
to2.thing_id,
6161
to2.major_chemistry_id,
62-
to2.observation_date,
62+
to2.observation_datetime,
6363
to2.sample_value,
6464
to2.units,
6565
ROW_NUMBER() OVER (
6666
PARTITION BY to2.thing_id
67-
ORDER BY to2.observation_date DESC NULLS LAST, to2.major_chemistry_id DESC
67+
ORDER BY to2.observation_datetime DESC NULLS LAST, to2.major_chemistry_id DESC
6868
) AS rn
6969
FROM tds_obs AS to2
7070
)
@@ -73,7 +73,7 @@ def _create_latest_tds_view() -> str:
7373
t.name,
7474
t.thing_type,
7575
rt.major_chemistry_id,
76-
rt.observation_date AS latest_tds_observation_date,
76+
rt.observation_datetime::date AS latest_tds_observation_date,
7777
rt.sample_value AS latest_tds_value,
7878
rt.units AS latest_tds_units,
7979
l.point

tests/test_ogc.py

Lines changed: 72 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,12 +138,83 @@ def test_latest_tds_observation_date_falls_back_to_collection_date(water_well_th
138138
session.commit()
139139

140140

141+
def test_latest_tds_uses_latest_timestamp_within_same_day(water_well_thing):
142+
with session_ctx() as session:
143+
csi = NMA_Chemistry_SampleInfo(
144+
thing_id=water_well_thing.id,
145+
nma_sample_point_id="TDS-TIME",
146+
collection_date=datetime(2024, 2, 1, 9, 0, 0),
147+
)
148+
session.add(csi)
149+
session.flush()
150+
151+
mc_early = NMA_MajorChemistry(
152+
chemistry_sample_info_id=csi.id,
153+
analyte="Total Dissolved Solids",
154+
symbol="TDS",
155+
sample_value=300.0,
156+
units="mg/L",
157+
analysis_date=datetime(2024, 2, 1, 8, 0, 0),
158+
)
159+
mc_late = NMA_MajorChemistry(
160+
chemistry_sample_info_id=csi.id,
161+
analyte="Total Dissolved Solids",
162+
symbol="TDS",
163+
sample_value=700.0,
164+
units="mg/L",
165+
analysis_date=datetime(2024, 2, 1, 18, 0, 0),
166+
)
167+
session.add(mc_early)
168+
session.add(mc_late)
169+
session.commit()
170+
171+
session.execute(text("REFRESH MATERIALIZED VIEW ogc_avg_tds_wells"))
172+
session.commit()
173+
174+
row = session.execute(
175+
text(
176+
"SELECT latest_tds_observation_date, latest_tds_value "
177+
"FROM ogc_latest_tds_wells WHERE id = :thing_id"
178+
),
179+
{"thing_id": water_well_thing.id},
180+
).one()
181+
182+
assert row.latest_tds_observation_date.isoformat() == "2024-02-01"
183+
assert float(row.latest_tds_value) == 700.0
184+
185+
session.delete(mc_late)
186+
session.delete(mc_early)
187+
session.delete(csi)
188+
session.commit()
189+
session.execute(text("REFRESH MATERIALIZED VIEW ogc_avg_tds_wells"))
190+
session.commit()
191+
192+
141193
def test_ogc_collections():
142194
response = client.get("/ogcapi/collections")
143195
assert response.status_code == 200
144196
payload = response.json()
145197
ids = {collection["id"] for collection in payload["collections"]}
146-
assert {"locations", "water_wells", "springs"}.issubset(ids)
198+
assert {
199+
"locations",
200+
"water_wells",
201+
"springs",
202+
"latest_tds_wells",
203+
"depth_to_water_trend_wells",
204+
"water_well_summary",
205+
}.issubset(ids)
206+
207+
208+
def test_ogc_new_collection_items_endpoints():
209+
for collection_id in (
210+
"latest_tds_wells",
211+
"depth_to_water_trend_wells",
212+
"water_well_summary",
213+
):
214+
response = client.get(f"/ogcapi/collections/{collection_id}/items?limit=10")
215+
assert response.status_code == 200
216+
payload = response.json()
217+
assert payload["type"] == "FeatureCollection"
147218

148219

149220
@pytest.mark.skip("PostGIS spatial operators not available in CI - see issue #449")

0 commit comments

Comments
 (0)