migration optimization
[akkoma] / priv / repo / migrations / 20190414125034_migrate_old_bookmarks.exs
index 1930fc3cf30a3894ebc234093bc5b4a209311bf0..c30c302f7bb88665aa6f3804c5163671137b6925 100644 (file)
@@ -1,16 +1,26 @@
 defmodule Pleroma.Repo.Migrations.MigrateOldBookmarks do
   use Ecto.Migration
+  import Ecto.Query
   alias Pleroma.Activity
   alias Pleroma.Bookmark
   alias Pleroma.User
   alias Pleroma.Repo
 
   def up do
-    Repo.all(User)
-    |> Enum.each(fn user ->
-      Enum.each(user.old_bookmarks, fn id ->
-        activity = Activity.get_create_by_object_ap_id(id)
-        {:ok, _} = Bookmark.create(user.id, activity.id)
+    query =
+      from(u in User,
+        where: u.local == true,
+        where: fragment("array_length(?, 1)", u.old_bookmarks) > 0,
+        select: %{id: u.id, old_bookmarks: u.old_bookmarks}
+      )
+
+    Repo.transaction(fn ->
+      Repo.stream(query)
+      |> Enum.each(fn user ->
+        Enum.each(user.old_bookmarks, fn id ->
+          activity = Activity.get_create_by_object_ap_id(id)
+          {:ok, _} = Bookmark.create(user.id, activity.id)
+        end)
       end)
     end)
   end