Files
dc-project/src/main/resources/sql/functions/article/find_articles.sql

68 lines
2.3 KiB
PL/PgSQL

create or replace function find_articles(
_search text default null,
_filter json default '{}',
direction text default 'desc',
sort text default 'created_at',
"limit" int default 50,
"offset" int default 0,
out resource json,
out total int
) language plpgsql as
$$
begin
select json_agg(t), (
select count(id)
from article a
where (_search is null or _search = '' or a ==> dsl.multi_match('{title^3, content, description, tags}', _search))
and (_filter->>'created_by_id' is null or a.created_by_id = (_filter->>'created_by_id')::uuid)
and (_filter->>'workgroup_id' is null or a.workgroup_id = (_filter->>'workgroup_id')::uuid)
and a.last_version = true
)
into resource, total
from (
select
a.id,
a.title,
a.deleted_at,
a.draft,
find_citizen_by_id_with_user(a.created_by_id) as created_by,
find_workgroup_by_id(a.workgroup_id) as workgroup,
count_vote(a.id) as votes,
zdb.score(a.ctid) _score
from article as a
left join vote_cache ca using (id)
where (
_search is null
or _search = ''
or a ==> dsl.multi_match('{title^3, content, description, tags}', _search)
)
and (_filter->>'created_by_id' is null or a.created_by_id = (_filter->>'created_by_id')::uuid)
and (_filter->>'workgroup_id' is null or a.workgroup_id = (_filter->>'workgroup_id')::uuid)
and a.last_version = true
order by
_score desc,
case direction when 'asc' then
case sort
when 'title' then a.title
when 'createdAt' then a.created_at::text
when 'vote' then ca.score::text
when 'popularity' then ca.total::text
else null
end
end,
case direction when 'desc' then
case sort
when 'title' then a.title
when 'createdAt' then a.created_at::text
when 'vote' then ca.score::text
when 'popularity' then ca.total::text
end
end
desc,
a.created_at desc
limit "limit" offset "offset"
) as t;
end;
$$;