From 5def84282d867bfbcc2c3e9afaaf7dbe28573aa1 Mon Sep 17 00:00:00 2001 From: Fabrice Lecomte Date: Fri, 4 Sep 2020 15:22:15 +0200 Subject: [PATCH] Improve vote count with cache --- .../sql/functions/article/find_articles.sql | 9 +++++---- src/main/resources/sql/functions/vote/vote.sql | 13 +++++++++++++ .../sql/migrations/0000-init_schema.up.sql | 14 ++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) 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 (