migration optimization
authorAlex S <alex.strizhakov@gmail.com>
Mon, 15 Apr 2019 04:43:02 +0000 (11:43 +0700)
committerAlex S <alex.strizhakov@gmail.com>
Thu, 25 Apr 2019 06:40:12 +0000 (13:40 +0700)
changelog wording

CHANGELOG.md
priv/repo/migrations/20190414125034_migrate_old_bookmarks.exs

index c538dd9f0fcafa90fb16e39c473bbba3148b1877..24d6456b6f8659fefedbed12b838dc55315cc838 100644 (file)
@@ -54,7 +54,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - Deps: Updated Cowboy to 2.6
 - Deps: Updated Ecto to 3.0.7
 - Don't ship finmoji by default, they can be installed as an emoji pack
-- `User.bookmarks` in separate table, added support max_id & since_id for bookmark timeline endpoints.
+- Mastodon API: Added support max_id & since_id for bookmark timeline endpoints.
 
 ### Fixed
 - Followers counter not being updated when a follower is blocked
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