From 1d4d373508cfde970d12ce7c208e213441bb5052 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Thu, 11 Jan 2024 10:21:36 +0800 Subject: [PATCH] replace the slow postgres trigger function for updating label names --- ...8.do.create_label_names_update_trigger.sql | 30 +++++++++++++++++++ ...undo.create_label_names_update_trigger.sql | 30 +++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100755 packages/db/migrations/0158.do.create_label_names_update_trigger.sql create mode 100755 packages/db/migrations/0158.undo.create_label_names_update_trigger.sql diff --git a/packages/db/migrations/0158.do.create_label_names_update_trigger.sql b/packages/db/migrations/0158.do.create_label_names_update_trigger.sql new file mode 100755 index 000000000..a27b128b1 --- /dev/null +++ b/packages/db/migrations/0158.do.create_label_names_update_trigger.sql @@ -0,0 +1,30 @@ +-- Type: DO +-- Name: create_label_names_update_trigger +-- Description: Create label_names_update trigger in library_item table + +BEGIN; + +CREATE OR REPLACE FUNCTION update_label_names() +RETURNS TRIGGER AS $$ +BEGIN + UPDATE omnivore.library_item + SET label_names = array_replace(label_names, OLD.name, NEW.name) + WHERE user_id = OLD.user_id AND OLD.name = ANY(label_names); + + RETURN NEW; +END; +$$ LANGUAGE plpgsql; + +-- triggers when label name is updated +CREATE TRIGGER label_names_update +AFTER UPDATE ON omnivore.labels +FOR EACH ROW +WHEN (OLD.name <> NEW.name) +EXECUTE FUNCTION update_label_names(); + +-- remove old trigger which is too slow +DROP TRIGGER IF EXISTS entity_labels_update ON omnivore.labels; + +DROP FUNCTION IF EXISTS omnivore.update_entity_labels(); + +COMMIT; diff --git a/packages/db/migrations/0158.undo.create_label_names_update_trigger.sql b/packages/db/migrations/0158.undo.create_label_names_update_trigger.sql new file mode 100755 index 000000000..f0e7145a0 --- /dev/null +++ b/packages/db/migrations/0158.undo.create_label_names_update_trigger.sql @@ -0,0 +1,30 @@ +-- Type: UNDO +-- Name: create_label_names_update_trigger +-- Description: Create label_names_update trigger in library_item table + +BEGIN; + +CREATE OR REPLACE FUNCTION update_entity_labels() +RETURNS trigger AS $$ +BEGIN + -- update entity_labels table to trigger update on library_item table + UPDATE omnivore.entity_labels + SET label_id = NEW.id + WHERE label_id = OLD.id; + + return NEW; +END; +$$ LANGUAGE plpgsql; + +-- triggers when label name is updated +CREATE TRIGGER entity_labels_update +AFTER UPDATE ON omnivore.labels +FOR EACH ROW +WHEN (OLD.name <> NEW.name) +EXECUTE FUNCTION update_entity_labels(); + +DROP TRIGGER IF EXISTS label_names_update ON omnivore.labels; + +DROP FUNCTION IF EXISTS omnivore.update_label_names(); + +COMMIT;