diff options
author | kaniini <nenolod@gmail.com> | 2019-03-03 15:50:41 +0000 |
---|---|---|
committer | kaniini <nenolod@gmail.com> | 2019-03-03 15:50:41 +0000 |
commit | 413cf00cc3d245c61bedc0c57735e450794b1339 (patch) | |
tree | 502d29c04d17661cdf8b5613825915b8c0dff10d /lib | |
parent | c93479c6f5c2f112dc53d19681fb9cc6df31aff0 (diff) | |
parent | af0039a3a0b7f466120211f2c81361311ecbcf02 (diff) | |
download | pleroma-413cf00cc3d245c61bedc0c57735e450794b1339.tar.gz |
Merge branch 'atomic-note-count-updates' into 'develop'
Atomic update for note count and follower count
See merge request pleroma/pleroma!885
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/user.ex | 89 |
1 files changed, 57 insertions, 32 deletions
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 0d2b838db..82922d236 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -636,23 +636,43 @@ defmodule Pleroma.User do end def increase_note_count(%User{} = user) do - info_cng = User.Info.add_to_note_count(user.info, 1) - - cng = - change(user) - |> put_embed(:info, info_cng) - - update_and_set_cache(cng) + User + |> where(id: ^user.id) + |> update([u], + set: [ + info: + fragment( + "jsonb_set(?, '{note_count}', ((?->>'note_count')::int + 1)::varchar::jsonb, true)", + u.info, + u.info + ) + ] + ) + |> Repo.update_all([], returning: true) + |> case do + {1, [user]} -> set_cache(user) + _ -> {:error, user} + end end def decrease_note_count(%User{} = user) do - info_cng = User.Info.add_to_note_count(user.info, -1) - - cng = - change(user) - |> put_embed(:info, info_cng) - - update_and_set_cache(cng) + User + |> where(id: ^user.id) + |> update([u], + set: [ + info: + fragment( + "jsonb_set(?, '{note_count}', (greatest(0, (?->>'note_count')::int - 1))::varchar::jsonb, true)", + u.info, + u.info + ) + ] + ) + |> Repo.update_all([], returning: true) + |> case do + {1, [user]} -> set_cache(user) + _ -> {:error, user} + end end def update_note_count(%User{} = user) do @@ -676,24 +696,29 @@ defmodule Pleroma.User do def update_follower_count(%User{} = user) do follower_count_query = - from( - u in User, - where: ^user.follower_address in u.following, - where: u.id != ^user.id, - select: count(u.id) - ) - - follower_count = Repo.one(follower_count_query) - - info_cng = - user.info - |> User.Info.set_follower_count(follower_count) - - cng = - change(user) - |> put_embed(:info, info_cng) - - update_and_set_cache(cng) + User + |> where([u], ^user.follower_address in u.following) + |> where([u], u.id != ^user.id) + |> select([u], %{count: count(u.id)}) + + User + |> where(id: ^user.id) + |> join(:inner, [u], s in subquery(follower_count_query)) + |> update([u, s], + set: [ + info: + fragment( + "jsonb_set(?, '{follower_count}', ?::varchar::jsonb, true)", + u.info, + s.count + ) + ] + ) + |> Repo.update_all([], returning: true) + |> case do + {1, [user]} -> set_cache(user) + _ -> {:error, user} + end end def get_users_from_set_query(ap_ids, false) do |