diff --git a/sql/upgrades/051.sql b/sql/upgrades/051.sql new file mode 100644 index 00000000..6bd326ed --- /dev/null +++ b/sql/upgrades/051.sql @@ -0,0 +1,134 @@ +-- SWH DB schema upgrade +-- from_version: 50 +-- to_version: 51 +-- description: Let the person identifier flow + +insert into dbversion(version, release, description) + values(51, now(), 'Work In Progres'); + +drop type revision_entry cascade; +create type revision_entry as +( + id sha1_git, + date timestamptz, + date_offset smallint, + committer_date timestamptz, + committer_date_offset smallint, + type revision_type, + directory sha1_git, + message bytea, + author_id bigint, + author_name bytea, + author_email bytea, + committer_id bigint, + committer_name bytea, + committer_email bytea, + metadata jsonb, + synthetic boolean, + parents bytea[] +); + +create or replace function swh_revision_log(root_revisions bytea[], num_revs bigint default NULL) + returns setof revision_entry + language sql + stable +as $$ + select t.id, r.date, r.date_offset, + r.committer_date, r.committer_date_offset, + r.type, r.directory, r.message, + a.id, a.name, a.email, c.id, c.name, c.email, r.metadata, r.synthetic, + t.parents + from swh_revision_list(root_revisions, num_revs) as t + left join revision r on t.id = r.id + left join person a on a.id = r.author + left join person c on c.id = r.committer; +$$; + +create or replace function swh_revision_get() + returns setof revision_entry + language plpgsql +as $$ +begin + return query + select t.id, r.date, r.date_offset, + r.committer_date, r.committer_date_offset, + r.type, r.directory, r.message, + a.id, a.name, a.email, c.id, c.name, c.email, r.metadata, r.synthetic, + array(select rh.parent_id::bytea from revision_history rh where rh.id = t.id order by rh.parent_rank) + as parents + from tmp_revision t + left join revision r on t.id = r.id + left join person a on a.id = r.author + left join person c on c.id = r.committer; + return; +end +$$; + +create or replace function swh_revision_get_by( + origin_id bigint, + branch_name bytea default NULL, + date timestamptz default NULL) + returns setof revision_entry + language sql + stable +as $$ + select r.id, r.date, r.date_offset, + r.committer_date, r.committer_date_offset, + r.type, r.directory, r.message, + a.id, a.name, a.email, c.id, c.name, c.email, r.metadata, r.synthetic, + array(select rh.parent_id::bytea + from revision_history rh + where rh.id = r.id + order by rh.parent_rank + ) as parents + from swh_occurrence_get_by(origin_id, branch_name, date) as occ + inner join revision r on occ.target = r.id + left join person a on a.id = r.author + left join person c on c.id = r.committer; +$$; + +drop type release_entry cascade; +create type release_entry as +( + id sha1_git, + target sha1_git, + target_type object_type, + date timestamptz, + date_offset smallint, + name bytea, + comment bytea, + synthetic boolean, + author_id bigint, + author_name bytea, + author_email bytea +); + +create or replace function swh_release_get() + returns setof release_entry + language plpgsql +as $$ +begin + return query + select r.id, r.target, r.target_type, r.date, r.date_offset, r.name, r.comment, + r.synthetic, p.id as author_id, p.name as author_name, p.email as author_email + from tmp_release_get t + inner join release r on t.id = r.id + inner join person p on p.id = r.author; + return; +end +$$; + +create or replace function swh_release_get_by( + origin_id bigint) + returns setof release_entry + language sql + stable +as $$ + select r.id, r.target, r.target_type, r.date, r.date_offset, + r.name, r.comment, r.synthetic, a.id as author_id, + a.name as author_name, a.email as author_email + from release r + inner join occurrence_history occ on occ.target = r.target + left join person a on a.id = r.author + where occ.origin = origin_id and occ.target_type = 'revision' and r.target_type = 'revision'; +$$;