diff --git a/sql/upgrades/100.sql b/sql/upgrades/100.sql new file mode 100644 index 000000000..7fd6f88e4 --- /dev/null +++ b/sql/upgrades/100.sql @@ -0,0 +1,58 @@ +-- SWH DB schema upgrade +-- from_version: 99 +-- to_version: 100 +-- description: update swh_visit_find_by_date and swh_occurrence_get_by to return sensible results + +insert into dbversion(version, release, description) + values(100, now(), 'Work In Progress'); + +CREATE OR REPLACE FUNCTION swh_occurrence_get_by(origin_id bigint, branch_name bytea = NULL::bytea, "date" timestamp with time zone = NULL::timestamp with time zone) RETURNS SETOF occurrence_history + LANGUAGE plpgsql + AS $$ +declare + filters text[] := array[] :: text[]; -- AND-clauses used to filter content + visit_id bigint; + q text; +begin + if origin_id is null then + raise exception 'Needs an origin_id to get an occurrence.'; + end if; + filters := filters || format('origin = %L', origin_id); + if branch_name is not null then + filters := filters || format('branch = %L', branch_name); + end if; + if date is not null then + select visit from swh_visit_find_by_date(origin_id, date) into visit_id; + else + select visit from origin_visit where origin = origin_id order by origin_visit.date desc limit 1 into visit_id; + end if; + if visit_id is null then + return; + end if; + filters := filters || format('%L = any(visits)', visit_id); + + q = format('select * from occurrence_history where %s', + array_to_string(filters, ' and ')); + return query execute q; +end +$$; + +CREATE OR REPLACE FUNCTION swh_visit_find_by_date(origin bigint, visit_date timestamp with time zone = now()) RETURNS origin_visit + LANGUAGE sql STABLE + AS $$ + with closest_two_visits as (( + select ov, (date - visit_date) as interval + from origin_visit ov + where ov.origin = origin + and ov.date >= visit_date + order by ov.date asc + limit 1 + ) union ( + select ov, (visit_date - date) as interval + from origin_visit ov + where ov.origin = origin + and ov.date < visit_date + order by ov.date desc + limit 1 + )) select (ov).* from closest_two_visits order by interval limit 1 +$$;