diff --git a/sql/upgrades/063.sql b/sql/upgrades/063.sql new file mode 100644 index 00000000..0f3af4fd --- /dev/null +++ b/sql/upgrades/063.sql @@ -0,0 +1,92 @@ +-- SWH DB schema upgrade +-- from_version: 62 +-- to_version: 63 +-- description: Fold the entity.lister column in entity.lister_metadata + +insert into dbversion(version, release, description) + values(63, now(), 'Work In Progress'); + +ALTER TABLE entity + DROP CONSTRAINT entity_lister_fkey; + +DROP TRIGGER update_entity ON entity_history; + +UPDATE entity_history + SET lister_metadata = lister_metadata || jsonb_build_object('lister', lister); + +UPDATE entity + SET lister_metadata = lister_metadata || jsonb_build_object('lister', lister); + +ALTER TABLE entity_history + DROP COLUMN lister; + +ALTER TABLE entity + DROP COLUMN lister; + +CREATE OR REPLACE FUNCTION swh_entity_from_tmp_entity_lister() RETURNS SETOF entity_id + LANGUAGE plpgsql + AS $$ +begin + return query + select t.id, e.* + from tmp_entity_lister t + left join entity e + on e.lister_metadata @> t.lister_metadata; + return; +end +$$; + +CREATE OR REPLACE FUNCTION swh_entity_history_add() RETURNS void + LANGUAGE plpgsql + AS $$ +begin + insert into entity_history ( + uuid, parent, name, type, description, homepage, active, generated, lister_metadata, doap, validity + ) select * from tmp_entity_history; + return; +end +$$; + +CREATE OR REPLACE FUNCTION swh_mktemp_entity_lister() RETURNS void + LANGUAGE sql + AS $$ + create temporary table tmp_entity_lister ( + id bigint, + lister_metadata jsonb + ) on commit drop; +$$; + +CREATE OR REPLACE FUNCTION swh_update_entity_from_entity_history() RETURNS trigger + LANGUAGE plpgsql + AS $$ +begin + insert into entity (uuid, parent, name, type, description, homepage, active, generated, + lister_metadata, doap, last_seen, last_id) + select uuid, parent, name, type, description, homepage, active, generated, + lister_metadata, doap, unnest(validity), id + from entity_history + where uuid = NEW.uuid + order by unnest(validity) desc limit 1 + on conflict (uuid) do update set + parent = EXCLUDED.parent, + name = EXCLUDED.name, + type = EXCLUDED.type, + description = EXCLUDED.description, + homepage = EXCLUDED.homepage, + active = EXCLUDED.active, + generated = EXCLUDED.generated, + lister_metadata = EXCLUDED.lister_metadata, + doap = EXCLUDED.doap, + last_seen = EXCLUDED.last_seen, + last_id = EXCLUDED.last_id; + + return null; +end +$$; + +CREATE INDEX ON entity USING gin (lister_metadata jsonb_path_ops); + +CREATE TRIGGER update_entity + AFTER INSERT OR UPDATE ON entity_history + FOR EACH ROW + EXECUTE PROCEDURE swh_update_entity_from_entity_history();