diff --git a/src/main/resources/sql/functions/article/find_articles.sql b/src/main/resources/sql/functions/article/find_articles.sql index eed518b..f9ad471 100644 --- a/src/main/resources/sql/functions/article/find_articles.sql +++ b/src/main/resources/sql/functions/article/find_articles.sql @@ -28,6 +28,7 @@ begin count_opinion(a.id) as opinions, zdb.score(a.ctid) _score from article as a + left join vote_cache ca using (id) where ( _search is null or _search = '' @@ -43,8 +44,8 @@ begin case sort when 'title' then a.title when 'created_at' then a.created_at::text - when 'vote' then count_vote(a.id)->>'score' - when 'popularity' then count_vote(a.id)->>'total' + when 'vote' then ca.score::text + when 'popularity' then ca.total::text else null end end, @@ -52,8 +53,8 @@ begin case sort when 'title' then a.title when 'created_at' then a.created_at::text - when 'vote' then count_vote(a.id)->>'score' - when 'popularity' then count_vote(a.id)->>'total' + when 'vote' then ca.score::text + when 'popularity' then ca.total::text end end desc, diff --git a/src/main/resources/sql/functions/vote/vote.sql b/src/main/resources/sql/functions/vote/vote.sql index e9ce156..7d7a928 100644 --- a/src/main/resources/sql/functions/vote/vote.sql +++ b/src/main/resources/sql/functions/vote/vote.sql @@ -35,6 +35,19 @@ begin end if; select count_vote(_target_id) into resource; + + insert into vote_cache (id, total, score, percent) values + ( + _target_id, + (resource->>'total')::int, + (resource->>'score')::int, + (resource->>'percent')::int + ) + on conflict (id) do update set + updated_at = now(), + total = excluded.total, + score = excluded.score, + percent = excluded.percent; end; $$; diff --git a/src/main/resources/sql/migrations/0000-init_schema.up.sql b/src/main/resources/sql/migrations/0000-init_schema.up.sql index d170490..5d09de6 100644 --- a/src/main/resources/sql/migrations/0000-init_schema.up.sql +++ b/src/main/resources/sql/migrations/0000-init_schema.up.sql @@ -495,6 +495,20 @@ create table vote_for_comment_on_constitution unique (created_by_id, target_id) ) inherits (vote); + +create table vote_cache +( + id uuid not null primary key, + updated_at timestamp not null default now(), + total int not null default 0, + score int not null default 0, + percent int not null default 0 +); + +create index on vote_cache (total); +create index on vote_cache (score); +create index on vote_cache (percent); + -- Stats create table resource_view (