Mercurial > gemma
comparison schema/gemma.sql @ 4047:8c6bc85db711 historization_ng
WIP: Remove references to bottleneck validity in DB schema.
author | Sascha Wilde <wilde@intevation.de> |
---|---|
date | Wed, 24 Jul 2019 16:15:21 +0200 |
parents | 12e3933b2050 |
children | 0ba3fc89b499 |
comparison
equal
deleted
inserted
replaced
4045:12e3933b2050 | 4047:8c6bc85db711 |
---|---|
149 END IF; | 149 END IF; |
150 END; | 150 END; |
151 $$ | 151 $$ |
152 LANGUAGE plpgsql; | 152 LANGUAGE plpgsql; |
153 | 153 |
154 -- REMOVE ME: | 154 -- Trigger function to be used as a constraint trigger to enforce |
155 CREATE OR REPLACE FUNCTION move_bottleneck_referencing() RETURNS trigger AS | 155 -- existance of a referenced bottleneck with validity at a given time. |
156 -- The columns with the referenced bottleneck id and the timestamp are | |
157 -- given as arguments to the trigger function. | |
158 CREATE OR REPLACE FUNCTION check_valid_bottleneck_ts() RETURNS trigger AS | |
156 $$ | 159 $$ |
160 DECLARE | |
161 referenced_bottleneck_id text; | |
162 new_tstz timestamptz; | |
157 BEGIN | 163 BEGIN |
158 -- Avoid unnecessary execution ON UPDATE if validity did not change | 164 EXECUTE format('SELECT $1.%I', TG_ARGV[0]) |
159 IF OLD IS NULL OR NEW.validity <> OLD.validity THEN | 165 INTO referenced_bottleneck_id |
160 UPDATE waterway.sounding_results | 166 USING NEW; |
161 SET bottleneck_validity = NEW.validity | 167 EXECUTE format('SELECT $1.%I', TG_ARGV[1]) |
162 WHERE bottleneck_id = NEW.bottleneck_id | 168 INTO new_tstz |
163 AND CAST(date_info AS timestamptz) <@ NEW.validity; | 169 USING NEW; |
164 | 170 IF EXISTS ( SELECT * FROM waterway.bottlenecks |
165 -- Always associate fairway availability data to newest bottleneck | 171 WHERE bottleneck_id = referenced_bottleneck_id |
166 -- version to prevent problems in analysis over longer time periods | 172 AND validity @> new_tstz ) |
167 WITH | 173 THEN |
168 bn AS (SELECT id, validity FROM waterway.bottlenecks | 174 RETURN NEW; |
169 WHERE bottleneck_id = NEW.bottleneck_id), | 175 ELSE |
170 latest AS (SELECT id FROM bn | 176 RAISE EXCEPTION |
171 -- Candidates are past new validity or just inserted/updated | 177 'new row for relation "%" violates constraint trigger "%"', |
172 WHERE NOT validity &< NEW.validity OR id = NEW.id | 178 TG_TABLE_NAME, TG_NAME |
173 ORDER BY upper(validity) DESC FETCH FIRST ROW ONLY) | 179 USING |
174 UPDATE waterway.fairway_availability | 180 DETAIL = format('No matching bottleneck %s for %s found.', |
175 SET bottleneck_id = (SELECT id FROM latest) | 181 referenced_bottleneck_id, new_tstz), |
176 WHERE bottleneck_id IN(SELECT id FROM bn EXCEPT SELECT id FROM latest); | 182 ERRCODE = 23505, |
183 SCHEMA = TG_TABLE_SCHEMA, | |
184 TABLE = TG_TABLE_NAME, | |
185 COLUMN = TG_ARGV[0], | |
186 CONSTRAINT = TG_NAME; | |
177 END IF; | 187 END IF; |
178 RETURN NULL; -- ignored | |
179 END; | 188 END; |
180 $$ | 189 $$ |
181 LANGUAGE plpgsql; | 190 LANGUAGE plpgsql; |
182 | 191 |
183 -- Constraint trigger: sounding Results must intersect with the area | 192 -- Constraint trigger: sounding Results must intersect with the area |
184 -- of the bottleneck they belong to. | 193 -- of the bottleneck they belong to. The "xx" at the beginning of the |
194 -- name is to ensure, it is fired last after other triggers. | |
185 CREATE OR REPLACE FUNCTION check_sr_in_bn_area() RETURNS trigger | 195 CREATE OR REPLACE FUNCTION check_sr_in_bn_area() RETURNS trigger |
186 LANGUAGE plpgsql | 196 LANGUAGE plpgsql |
187 AS $$ | 197 AS $$ |
188 BEGIN | 198 BEGIN |
189 IF NOT st_intersects((SELECT area | 199 IF NOT st_intersects((SELECT area |
190 FROM waterway.bottlenecks | 200 FROM waterway.bottlenecks |
191 WHERE (bottleneck_id, validity) | 201 WHERE bottleneck_id = NEW.bottleneck_id |
192 =(NEW.bottleneck_id, NEW.bottleneck_validity)), | 202 AND validity @> NEW.date_info::timestamptz), |
193 NEW.area) | 203 NEW.area) |
194 THEN | 204 THEN |
195 RAISE EXCEPTION | 205 RAISE EXCEPTION |
196 'new row for relation "%" violates constraint trigger "%"', | 206 'new row for relation "%" violates constraint trigger "%"', |
197 TG_TABLE_NAME, TG_NAME | 207 TG_TABLE_NAME, TG_NAME |
666 staging_done boolean NOT NULL DEFAULT false | 676 staging_done boolean NOT NULL DEFAULT false |
667 ) | 677 ) |
668 CREATE CONSTRAINT TRIGGER waterway_bottlenecks_reference_gauge | 678 CREATE CONSTRAINT TRIGGER waterway_bottlenecks_reference_gauge |
669 AFTER INSERT OR UPDATE OF gauge_location ON bottlenecks | 679 AFTER INSERT OR UPDATE OF gauge_location ON bottlenecks |
670 FOR EACH ROW EXECUTE FUNCTION check_valid_gauge('gauge_location','validity') | 680 FOR EACH ROW EXECUTE FUNCTION check_valid_gauge('gauge_location','validity') |
671 -- Associate referencing objects to matching bottleneck version | |
672 CREATE TRIGGER move_referencing AFTER INSERT OR UPDATE OF validity | |
673 ON bottlenecks FOR EACH ROW | |
674 EXECUTE FUNCTION move_bottleneck_referencing() | |
675 | 681 |
676 CREATE TABLE bottlenecks_riverbed_materials ( | 682 CREATE TABLE bottlenecks_riverbed_materials ( |
677 bottleneck_id int NOT NULL REFERENCES bottlenecks(id) | 683 bottleneck_id int NOT NULL REFERENCES bottlenecks(id) |
678 ON DELETE CASCADE, | 684 ON DELETE CASCADE, |
679 riverbed varchar NOT NULL REFERENCES riverbed_materials, | 685 riverbed varchar NOT NULL REFERENCES riverbed_materials, |
682 ) | 688 ) |
683 | 689 |
684 CREATE TABLE sounding_results ( | 690 CREATE TABLE sounding_results ( |
685 id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, | 691 id int PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, |
686 bottleneck_id varchar NOT NULL, | 692 bottleneck_id varchar NOT NULL, |
687 bottleneck_validity tstzrange NOT NULL, | |
688 CONSTRAINT bottleneck_key | |
689 FOREIGN KEY (bottleneck_id, bottleneck_validity) | |
690 REFERENCES bottlenecks (bottleneck_id, validity) | |
691 ON UPDATE CASCADE, | |
692 date_info date NOT NULL, | 693 date_info date NOT NULL, |
693 CHECK (tstzrange(date_info::timestamptz, | |
694 date_info::timestamptz + '1 d'::interval) && bottleneck_validity), | |
695 UNIQUE (bottleneck_id, date_info), | 694 UNIQUE (bottleneck_id, date_info), |
696 area geography(POLYGON, 4326) NOT NULL | 695 area geography(POLYGON, 4326) NOT NULL |
697 CHECK(ST_IsValid(CAST(area AS geometry))), | 696 CHECK(ST_IsValid(CAST(area AS geometry))), |
698 surtyp varchar REFERENCES survey_types, | 697 surtyp varchar REFERENCES survey_types, |
699 coverage varchar REFERENCES coverage_types, | 698 coverage varchar REFERENCES coverage_types, |
700 depth_reference varchar NOT NULL, -- REFERENCES depth_references, | 699 depth_reference varchar NOT NULL, -- REFERENCES depth_references, |
701 octree_checksum varchar, | 700 octree_checksum varchar, |
702 octree_index bytea, | 701 octree_index bytea, |
703 staging_done boolean NOT NULL DEFAULT false | 702 staging_done boolean NOT NULL DEFAULT false |
704 ) | 703 ) |
705 CREATE CONSTRAINT TRIGGER sounding_results_in_bn_area | 704 CREATE CONSTRAINT TRIGGER a_sounding_results_reference_bottleneck |
706 AFTER INSERT OR UPDATE ON sounding_results | 705 AFTER INSERT OR UPDATE OF bottleneck_id ON waterway.sounding_results |
707 FOR EACH ROW EXECUTE FUNCTION check_sr_in_bn_area() | 706 FOR EACH ROW |
707 EXECUTE FUNCTION check_valid_bottleneck_ts('bottleneck_id','date_info'); | |
708 CREATE CONSTRAINT TRIGGER b_sounding_results_in_bn_area | |
709 AFTER INSERT OR UPDATE ON waterway.sounding_results | |
710 FOR EACH ROW EXECUTE FUNCTION check_sr_in_bn_area(); | |
708 | 711 |
709 CREATE TABLE sounding_results_contour_lines ( | 712 CREATE TABLE sounding_results_contour_lines ( |
710 sounding_result_id int NOT NULL REFERENCES sounding_results | 713 sounding_result_id int NOT NULL REFERENCES sounding_results |
711 ON DELETE CASCADE, | 714 ON DELETE CASCADE, |
712 height numeric NOT NULL, | 715 height numeric NOT NULL, |