Mercurial > gemma
diff schema/gemma.sql @ 3665:29ef6d41e4af
Use database triggers to move referencing objects to new versions
Needs fewer database round-trips and is more convenient especially
if more than two levels in the object hierarchy have to be handled.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Sat, 15 Jun 2019 09:24:28 +0200 |
parents | 2a079d0a71c1 |
children | db87f34805fb |
line wrap: on
line diff
--- a/schema/gemma.sql Fri Jun 14 17:56:42 2019 +0200 +++ b/schema/gemma.sql Sat Jun 15 09:24:28 2019 +0200 @@ -72,6 +72,43 @@ $$ LANGUAGE plpgsql; +-- Trigger functions to be used as statement-level AFTER triggers, +-- associating time-based referencing objects to matching version +CREATE OR REPLACE FUNCTION move_gauge_referencing() RETURNS trigger AS +$$ +BEGIN + -- Avoid unnecessary execution ON UPDATE if validity did not change + IF OLD IS NULL OR NEW.validity <> OLD.validity THEN + UPDATE waterway.gauge_measurements + SET validity = NEW.validity + WHERE location = NEW.location + AND measure_date <@ NEW.validity; + + UPDATE waterway.bottlenecks + SET gauge_validity = NEW.validity + WHERE gauge_location = NEW.location + AND lower(validity) <@ NEW.validity; + END IF; + RETURN NULL; -- ignored +END; +$$ +LANGUAGE plpgsql; + +CREATE OR REPLACE FUNCTION move_bottleneck_referencing() RETURNS trigger AS +$$ +BEGIN + -- Avoid unnecessary execution ON UPDATE if validity did not change + IF OLD IS NULL OR NEW.validity <> OLD.validity THEN + UPDATE waterway.sounding_results + SET bottleneck_validity = NEW.validity + WHERE bottleneck_id = NEW.bottleneck_id + AND CAST(date_info AS timestamptz) <@ NEW.validity; + END IF; + RETURN NULL; -- ignored +END; +$$ +LANGUAGE plpgsql; + -- -- GEMMA data -- @@ -296,6 +333,9 @@ CREATE UNIQUE INDEX gauges_erased_unique_constraint ON gauges (location) WHERE NOT erased + -- Associate referencing objects to matching gauge version + CREATE TRIGGER move_referencing AFTER INSERT OR UPDATE OF validity + ON gauges FOR EACH ROW EXECUTE FUNCTION move_gauge_referencing() CREATE TABLE gauges_reference_water_levels ( location isrs NOT NULL, @@ -525,6 +565,10 @@ CREATE UNIQUE INDEX bottlenecks_erased_unique_constraint ON bottlenecks (bottleneck_id) WHERE NOT erased + -- Associate referencing objects to matching bottleneck version + CREATE TRIGGER move_referencing AFTER INSERT OR UPDATE OF validity + ON bottlenecks FOR EACH ROW + EXECUTE FUNCTION move_bottleneck_referencing() CREATE TABLE bottlenecks_riverbed_materials ( bottleneck_id int NOT NULL REFERENCES bottlenecks(id)