stacker.news/prisma/migrations/20240415202735_index_item_o.../migration.sql

47 lines
2.2 KiB
PL/PgSQL

CREATE OR REPLACE FUNCTION index_bookmarked_item() RETURNS TRIGGER AS $$
BEGIN
-- if a bookmark was created or updated, `NEW` will be used
IF NEW IS NOT NULL THEN
INSERT INTO pgboss.job (name, data) VALUES ('indexItem', jsonb_build_object('id', NEW."itemId"));
RETURN NEW;
END IF;
-- if a bookmark was deleted, `OLD` will be used
IF OLD IS NOT NULL THEN
-- include `updatedAt` in the `indexItem` job as `now()` to indicate when the indexed item should think it was updated
-- this is to facilitate the fact that deleted bookmarks do not show up when re-indexing the item, and therefore
-- we don't have a reliable way to calculate a more recent index version, to displace the prior version
INSERT INTO pgboss.job (name, data) VALUES ('indexItem', jsonb_build_object('id', OLD."itemId", 'updatedAt', now()));
RETURN OLD;
END IF;
-- This should never be reached
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
-- Re-index the bookmarked item when a bookmark changes, so new bookmarks are searchable
DROP TRIGGER IF EXISTS index_bookmarked_item ON "Bookmark";
CREATE TRIGGER index_bookmarked_item
AFTER INSERT OR UPDATE OR DELETE ON "Bookmark"
FOR EACH ROW
EXECUTE PROCEDURE index_bookmarked_item();
-- hack ... prisma doesn't know about our other schemas (e.g. pgboss)
-- and this is only really a problem on their "shadow database"
-- so we catch the exception it throws and ignore it
CREATE OR REPLACE FUNCTION reindex_all_current_bookmarked_items() RETURNS void AS $$
BEGIN
-- Re-index all existing bookmarked items so these bookmarks are searchable
INSERT INTO pgboss.job (name, data, priority, startafter, expirein)
SELECT 'indexItem', jsonb_build_object('id', "itemId"), -100, now() + interval '10 minutes', interval '1 day'
FROM "Bookmark"
GROUP BY "itemId";
EXCEPTION WHEN OTHERS THEN
-- catch the exception for prisma dev execution, but do nothing with it
END;
$$ LANGUAGE plpgsql;
-- execute the function once
SELECT reindex_all_current_bookmarked_items();
-- then drop it since we don't need it anymore
DROP FUNCTION reindex_all_current_bookmarked_items();