Skip to content

Commit 9c74fac

Browse files
committed
feat: change views to materialized views for depth and TDS data in pygeoapi
1 parent ffd30e4 commit 9c74fac

1 file changed

Lines changed: 18 additions & 13 deletions

File tree

alembic/versions/d5e6f7a8b9c0_create_pygeoapi_supporting_views.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
Create Date: 2026-02-25 12:00:00.000000
66
"""
77

8+
import re
89
from typing import Sequence, Union
910

1011
from alembic import op
1112
from sqlalchemy import inspect, text
12-
import re
1313

1414
# revision identifiers, used by Alembic.
1515
revision: str = "d5e6f7a8b9c0"
@@ -92,7 +92,7 @@ def _create_thing_view(view_id: str, thing_type: str) -> str:
9292

9393
def _create_latest_depth_view() -> str:
9494
return """
95-
CREATE VIEW ogc_latest_depth_to_water_wells AS
95+
CREATE MATERIALIZED VIEW ogc_latest_depth_to_water_wells AS
9696
WITH latest_location AS (
9797
SELECT DISTINCT ON (lta.thing_id)
9898
lta.thing_id,
@@ -145,7 +145,7 @@ def _create_latest_depth_view() -> str:
145145

146146
def _create_latest_depth_fallback_view() -> str:
147147
return """
148-
CREATE VIEW ogc_latest_depth_to_water_wells AS
148+
CREATE MATERIALIZED VIEW ogc_latest_depth_to_water_wells AS
149149
SELECT
150150
t.id AS id,
151151
t.name,
@@ -165,7 +165,7 @@ def _create_latest_depth_fallback_view() -> str:
165165

166166
def _create_avg_tds_view() -> str:
167167
return """
168-
CREATE VIEW ogc_avg_tds_wells AS
168+
CREATE MATERIALIZED VIEW ogc_avg_tds_wells AS
169169
WITH latest_location AS (
170170
SELECT DISTINCT ON (lta.thing_id)
171171
lta.thing_id,
@@ -216,7 +216,7 @@ def _create_avg_tds_view() -> str:
216216

217217
def _create_avg_tds_fallback_view() -> str:
218218
return """
219-
CREATE VIEW ogc_avg_tds_wells AS
219+
CREATE MATERIALIZED VIEW ogc_avg_tds_wells AS
220220
SELECT
221221
t.id AS id,
222222
t.name,
@@ -233,6 +233,11 @@ def _create_avg_tds_fallback_view() -> str:
233233
"""
234234

235235

236+
def _drop_view_or_materialized_view(view_name: str) -> None:
237+
op.execute(text(f"DROP VIEW IF EXISTS {view_name}"))
238+
op.execute(text(f"DROP MATERIALIZED VIEW IF EXISTS {view_name}"))
239+
240+
236241
def upgrade() -> None:
237242
bind = op.get_bind()
238243
inspector = inspect(bind)
@@ -252,48 +257,48 @@ def upgrade() -> None:
252257
op.execute(text(f"DROP VIEW IF EXISTS ogc_{safe_view_id}"))
253258
op.execute(text(_create_thing_view(view_id, thing_type)))
254259

255-
op.execute(text("DROP VIEW IF EXISTS ogc_latest_depth_to_water_wells"))
260+
_drop_view_or_materialized_view("ogc_latest_depth_to_water_wells")
256261
required_depth = {"observation", "sample", "field_activity", "field_event"}
257262
if required_depth.issubset(existing_tables):
258263
op.execute(text(_create_latest_depth_view()))
259264
op.execute(
260265
text(
261-
"COMMENT ON VIEW ogc_latest_depth_to_water_wells IS "
266+
"COMMENT ON MATERIALIZED VIEW ogc_latest_depth_to_water_wells IS "
262267
"'Latest depth-to-water per well view for pygeoapi.'"
263268
)
264269
)
265270
else:
266271
op.execute(text(_create_latest_depth_fallback_view()))
267272
op.execute(
268273
text(
269-
"COMMENT ON VIEW ogc_latest_depth_to_water_wells IS "
274+
"COMMENT ON MATERIALIZED VIEW ogc_latest_depth_to_water_wells IS "
270275
"'STUB VIEW: required source tables (observation/sample/field_activity/field_event) were missing at migration time; this view intentionally returns zero rows.'"
271276
)
272277
)
273278

274-
op.execute(text("DROP VIEW IF EXISTS ogc_avg_tds_wells"))
279+
_drop_view_or_materialized_view("ogc_avg_tds_wells")
275280
required_tds = {"NMA_MajorChemistry", "NMA_Chemistry_SampleInfo"}
276281
if required_tds.issubset(existing_tables):
277282
op.execute(text(_create_avg_tds_view()))
278283
op.execute(
279284
text(
280-
"COMMENT ON VIEW ogc_avg_tds_wells IS "
285+
"COMMENT ON MATERIALIZED VIEW ogc_avg_tds_wells IS "
281286
"'Average TDS per well from major chemistry results for pygeoapi.'"
282287
)
283288
)
284289
else:
285290
op.execute(text(_create_avg_tds_fallback_view()))
286291
op.execute(
287292
text(
288-
"COMMENT ON VIEW ogc_avg_tds_wells IS "
293+
"COMMENT ON MATERIALIZED VIEW ogc_avg_tds_wells IS "
289294
"'STUB VIEW: required source tables (NMA_MajorChemistry/NMA_Chemistry_SampleInfo) were missing at migration time; this view intentionally returns zero rows.'"
290295
)
291296
)
292297

293298

294299
def downgrade() -> None:
295-
op.execute(text("DROP VIEW IF EXISTS ogc_avg_tds_wells"))
296-
op.execute(text("DROP VIEW IF EXISTS ogc_latest_depth_to_water_wells"))
300+
_drop_view_or_materialized_view("ogc_avg_tds_wells")
301+
_drop_view_or_materialized_view("ogc_latest_depth_to_water_wells")
297302
for view_id, _ in THING_COLLECTIONS:
298303
safe_view_id = _safe_view_id(view_id)
299304
op.execute(text(f"DROP VIEW IF EXISTS ogc_{safe_view_id}"))

0 commit comments

Comments
 (0)