From f48bc5c3e1507c485d0515a4800e2123f848705f Mon Sep 17 00:00:00 2001 From: lain Date: Wed, 21 Feb 2018 22:20:29 +0100 Subject: [PATCH] Make User.following a postgres array. --- lib/pleroma/user.ex | 5 ++--- ...221210540_make_following_postgres_array.exs | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 3 deletions(-) create mode 100644 priv/repo/migrations/20180221210540_make_following_postgres_array.exs diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index bc7f2601f..a902c57e3 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -249,10 +249,9 @@ def get_or_fetch_by_nickname(nickname) do end end - # TODO: these queries could be more efficient if the type in postgresql wasn't map, but array. def get_followers(%User{id: id, follower_address: follower_address}) do q = from u in User, - where: fragment("? @> ?", u.following, ^follower_address ), + where: ^follower_address in u.following, where: u.id != ^id {:ok, Repo.all(q)} @@ -291,7 +290,7 @@ def update_note_count(%User{} = user) do def update_follower_count(%User{} = user) do follower_count_query = from u in User, - where: fragment("? @> ?", u.following, ^user.follower_address), + where: ^user.follower_address in u.following, where: u.id != ^user.id, select: count(u.id) diff --git a/priv/repo/migrations/20180221210540_make_following_postgres_array.exs b/priv/repo/migrations/20180221210540_make_following_postgres_array.exs new file mode 100644 index 000000000..98ca7d9d7 --- /dev/null +++ b/priv/repo/migrations/20180221210540_make_following_postgres_array.exs @@ -0,0 +1,18 @@ +defmodule Pleroma.Repo.Migrations.MakeFollowingPostgresArray do + use Ecto.Migration + + def change do + alter table(:users) do + add :following_temp, {:array, :string} + end + + execute """ + update users set following_temp = array(select jsonb_array_elements_text(following)); + """ + + alter table(:users) do + remove :following + end + rename table(:users), :following_temp, to: :following + end +end