Make User.following a postgres array.
authorlain <lain@soykaf.club>
Wed, 21 Feb 2018 21:20:29 +0000 (22:20 +0100)
committerlain <lain@soykaf.club>
Wed, 21 Feb 2018 21:20:29 +0000 (22:20 +0100)
lib/pleroma/user.ex
priv/repo/migrations/20180221210540_make_following_postgres_array.exs [new file with mode: 0644]

index bc7f2601fb725b71e124b782caa46107a20ae20d..a902c57e39553091faf1f03084e769eb8ef17f1f 100644 (file)
@@ -249,10 +249,9 @@ defmodule Pleroma.User 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 @@ defmodule Pleroma.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 (file)
index 0000000..98ca7d9
--- /dev/null
@@ -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