[#3213] Removed PK from hashtags_objects table. Improved hashtags_transfer mix task...
authorIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 7 Jan 2021 09:20:29 +0000 (12:20 +0300)
committerIvan Tashkinov <ivantashkinov@gmail.com>
Thu, 7 Jan 2021 09:20:29 +0000 (12:20 +0300)
lib/mix/tasks/pleroma/database.ex
lib/pleroma/object.ex
priv/repo/migrations/20201221203824_create_hashtags_objects.exs

index f903cf75bdc18fac39119cd44a0761f9ed2a8f88..918752dc28c7c93d3ff8076118a62d1f98407422 100644 (file)
@@ -139,6 +139,7 @@ defmodule Mix.Tasks.Pleroma.Database do
 
     Logger.info("Starting transferring object embedded hashtags to `hashtags` table...")
 
+    # Note: most objects have Mention-type AS2 tags and no hashtags (but we can't filter them out)
     from(
       object in Object,
       left_join: hashtag in assoc(object, :hashtags),
@@ -153,13 +154,10 @@ defmodule Mix.Tasks.Pleroma.Database do
     |> Stream.each(fn objects ->
       Logger.info("Processing #{length(objects)} objects starting from id #{hd(objects).id}...")
 
-      Enum.map(
-        objects,
-        fn object ->
-          hashtags =
-            object.tag
-            |> Jason.decode!()
-            |> Enum.filter(&is_bitstring(&1))
+      failed_ids =
+        objects
+        |> Enum.map(fn object ->
+          hashtags = Object.object_data_hashtags(%{"tag" => Jason.decode!(object.tag)})
 
           Repo.transaction(fn ->
             with {:ok, hashtag_records} <- Hashtag.get_or_create_by_names(hashtags) do
@@ -169,7 +167,7 @@ defmodule Mix.Tasks.Pleroma.Database do
                          "insert into hashtags_objects(hashtag_id, object_id) values ($1, $2);",
                          [hashtag_record.id, object.id]
                        ) do
-                  :noop
+                  nil
                 else
                   {:error, e} ->
                     error =
@@ -177,18 +175,25 @@ defmodule Mix.Tasks.Pleroma.Database do
                         "#{hashtag_record.id}: #{inspect(e)}"
 
                     Logger.error(error)
-                    Repo.rollback(error)
+                    Repo.rollback(object.id)
                 end
               end
+
+              object.id
             else
               e ->
                 error = "ERROR: could not create hashtags for object #{object.id}: #{inspect(e)}"
                 Logger.error(error)
-                Repo.rollback(error)
+                Repo.rollback(object.id)
             end
           end)
-        end
-      )
+        end)
+        |> Enum.filter(&(elem(&1, 0) == :error))
+        |> Enum.map(&elem(&1, 1))
+
+      if Enum.any?(failed_ids) do
+        Logger.error("ERROR: transfer_hashtags iteration failed for ids: #{inspect(failed_ids)}")
+      end
     end)
     |> Stream.run()
 
index 7e79e15ee03338992037944b8664445bc4d37946..61f2ffa19d6df415e213b4d542ac3f1247a67ed3 100644 (file)
@@ -404,7 +404,7 @@ defmodule Pleroma.Object do
 
   defp embedded_hashtags(_), do: []
 
-  defp object_data_hashtags(%{"tag" => tags}) when is_list(tags) do
+  def object_data_hashtags(%{"tag" => tags}) when is_list(tags) do
     tags
     |> Enum.filter(fn
       %{"type" => "Hashtag"} = data -> Map.has_key?(data, "name")
@@ -419,5 +419,5 @@ defmodule Pleroma.Object do
     |> Enum.uniq()
   end
 
-  defp object_data_hashtags(_), do: []
+  def object_data_hashtags(_), do: []
 end
index b2649b4fbea7154a1fa052b3da3132a3e01c3470..214ea81c335dfb042726ed540bf24d4f08587058 100644 (file)
@@ -2,7 +2,7 @@ defmodule Pleroma.Repo.Migrations.CreateHashtagsObjects do
   use Ecto.Migration
 
   def change do
-    create_if_not_exists table(:hashtags_objects) do
+    create_if_not_exists table(:hashtags_objects, primary_key: false) do
       add(:hashtag_id, references(:hashtags), null: false)
       add(:object_id, references(:objects), null: false)
     end