Skip to content

Commit 10e88c1

Browse files
author
Agnieszka Figiel
committed
applied a more structured approach to taxon concepts triggers
1 parent d77b412 commit 10e88c1

3 files changed

Lines changed: 70 additions & 25 deletions

File tree

db/plpgsql/012_rebuild_mviews.sql

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,27 @@
1+
DROP FUNCTION IF EXISTS taxon_concepts_refresh_row(id INTEGER);
2+
CREATE OR REPLACE FUNCTION taxon_concepts_refresh_row(row_id INTEGER) RETURNS VOID
3+
SECURITY DEFINER
4+
LANGUAGE 'plpgsql' AS $$
5+
BEGIN
6+
DELETE
7+
FROM taxon_concepts_mview tc
8+
WHERE tc.id = row_id;
19

10+
INSERT INTO taxon_concepts_mview
11+
SELECT *, FALSE, NULL
12+
FROM taxon_concepts_view tc
13+
WHERE tc.id = row_id;
14+
END
15+
$$;
16+
17+
DROP FUNCTION IF EXISTS taxon_concepts_invalidate_row(id INTEGER);
18+
CREATE OR REPLACE FUNCTION taxon_concepts_invalidate_row(row_id INTEGER) RETURNS VOID
19+
SECURITY DEFINER
20+
LANGUAGE 'plpgsql' AS $$
21+
BEGIN
22+
UPDATE taxon_concepts_mview tc
23+
SET dirty = TRUE
24+
WHERE tc.id = row_id;
25+
RETURN;
26+
END
27+
$$;
Lines changed: 44 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,53 @@
1-
CREATE OR REPLACE FUNCTION trg_taxonomic_positions() RETURNS trigger AS $trg_taxonomic_positions$
2-
BEGIN
3-
IF TG_OP = 'INSERT' AND NEW.parent_id IS NOT NULL THEN
1+
CREATE OR REPLACE FUNCTION trg_taxon_concepts_u() RETURNS TRIGGER
2+
SECURITY DEFINER LANGUAGE 'plpgsql' AS $$
3+
BEGIN
4+
IF OLD.taxonomic_position <> NEW.taxonomic_position OR OLD.parent_id <> NEW.parent_id THEN
5+
IF NEW.parent_id IS NOT NULL THEN
46
PERFORM rebuild_taxonomic_positions_from_root(NEW.parent_id);
57
ELSE
68
PERFORM rebuild_taxonomic_positions_from_root(NEW.id);
79
END IF;
8-
RETURN NEW;
9-
END;
10-
$trg_taxonomic_positions$ LANGUAGE plpgsql;
10+
END IF;
11+
IF OLD.taxon_name_id <> NEW.taxon_name_id OR OLD.rank_id <> NEW.rank_id THEN
12+
PERFORM taxon_concepts_refresh_row(NEW.id);
13+
END IF;
14+
RETURN NULL;
15+
END
16+
$$;
1117

12-
DROP TRIGGER IF EXISTS trg_taxonomic_positions ON taxon_concepts;
18+
CREATE OR REPLACE FUNCTION trg_taxon_concepts_d() RETURNS TRIGGER
19+
SECURITY DEFINER LANGUAGE 'plpgsql' AS $$
20+
BEGIN
21+
PERFORM taxon_concepts_refresh_row(OLD.id);
22+
RETURN NULL;
23+
END
24+
$$;
1325

14-
CREATE TRIGGER trg_taxonomic_positions
15-
AFTER INSERT OR UPDATE OF taxonomic_position
16-
ON taxon_concepts
17-
FOR EACH ROW
18-
WHEN (pg_trigger_depth() = 0)
19-
EXECUTE PROCEDURE trg_taxonomic_positions();
26+
CREATE OR REPLACE FUNCTION trg_taxon_concepts_i() RETURNS TRIGGER
27+
SECURITY DEFINER LANGUAGE 'plpgsql' AS $$
28+
BEGIN
29+
IF NEW.parent_id IS NOT NULL THEN
30+
PERFORM rebuild_taxonomic_positions_from_root(NEW.parent_id);
31+
ELSE
32+
PERFORM rebuild_taxonomic_positions_from_root(NEW.id);
33+
END IF;
34+
PERFORM rebuild_names_and_ranks_for_node(NEW.id);
35+
PERFORM taxon_concepts_refresh_row(NEW.id);
36+
RETURN NULL;
37+
END
38+
$$;
2039

21-
CREATE OR REPLACE FUNCTION trg_names_and_ranks() RETURNS trigger AS $trg_names_and_ranks$
22-
BEGIN
23-
PERFORM rebuild_names_and_ranks_for_node(NEW.id);
24-
RETURN NEW;
25-
END;
26-
$trg_names_and_ranks$ LANGUAGE plpgsql;
40+
DROP TRIGGER IF EXISTS trg_taxon_concepts_u ON taxon_concepts;
41+
CREATE TRIGGER trg_taxon_concepts_u AFTER UPDATE ON taxon_concepts
42+
FOR EACH ROW EXECUTE PROCEDURE trg_taxon_concepts_u();
43+
DROP TRIGGER IF EXISTS trg_taxon_concepts_d ON taxon_concepts;
44+
CREATE TRIGGER trg_taxon_concepts_d AFTER DELETE ON taxon_concepts
45+
FOR EACH ROW EXECUTE PROCEDURE trg_taxon_concepts_d();
46+
DROP TRIGGER IF EXISTS trg_taxon_concepts_i ON taxon_concepts;
47+
CREATE TRIGGER trg_taxon_concepts_i AFTER INSERT ON taxon_concepts
48+
FOR EACH ROW EXECUTE PROCEDURE trg_taxon_concepts_i();
2749

50+
DROP TRIGGER IF EXISTS trg_taxonomic_positions ON taxon_concepts;
51+
DROP FUNCTION IF EXISTS trg_taxonomic_positions();
2852
DROP TRIGGER IF EXISTS trg_names_and_ranks ON taxon_concepts;
29-
30-
CREATE TRIGGER trg_names_and_ranks
31-
AFTER INSERT OR UPDATE OF taxon_name_id, rank_id
32-
ON taxon_concepts
33-
FOR EACH ROW
34-
EXECUTE PROCEDURE trg_names_and_ranks();
53+
DROP FUNCTION IF EXISTS trg_names_and_ranks();

doc/sapi_triggers.doc

37 KB
Binary file not shown.

0 commit comments

Comments
 (0)