ActivityPub Utils: Greatly speed up the follow / block activity fetching.
authorlain <lain@soykaf.club>
Tue, 2 Apr 2019 14:04:18 +0000 (16:04 +0200)
committerlain <lain@soykaf.club>
Tue, 2 Apr 2019 14:08:55 +0000 (16:08 +0200)
lib/pleroma/web/activity_pub/utils.ex
test/web/activity_pub/activity_pub_test.exs
test/web/activity_pub/utils_test.exs

index 2e9ffe41c40f5b2fa33049d94f7544cd450af5a0..a4b1518de7563d56863fcfb9a89824d19c3052eb 100644 (file)
@@ -404,13 +404,15 @@ defmodule Pleroma.Web.ActivityPub.Utils do
             activity.data
           ),
         where: activity.actor == ^follower_id,
             activity.data
           ),
         where: activity.actor == ^follower_id,
+        # this is to use the index
         where:
           fragment(
         where:
           fragment(
-            "? @> ?",
+            "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
+            activity.data,
             activity.data,
             activity.data,
-            ^%{object: followed_id}
+            ^followed_id
           ),
           ),
-        order_by: [desc: :id],
+        order_by: [fragment("? desc nulls last", activity.id)],
         limit: 1
       )
 
         limit: 1
       )
 
@@ -567,13 +569,15 @@ defmodule Pleroma.Web.ActivityPub.Utils do
             activity.data
           ),
         where: activity.actor == ^blocker_id,
             activity.data
           ),
         where: activity.actor == ^blocker_id,
+        # this is to use the index
         where:
           fragment(
         where:
           fragment(
-            "? @> ?",
+            "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
+            activity.data,
             activity.data,
             activity.data,
-            ^%{object: blocked_id}
+            ^blocked_id
           ),
           ),
-        order_by: [desc: :id],
+        order_by: [fragment("? desc nulls last", activity.id)],
         limit: 1
       )
 
         limit: 1
       )
 
index ac5fbe0a91b88dfac0c8335f507365415efa2611..5ff157e937c87544801c76f8a77b2cb6dc3ae508 100644 (file)
@@ -635,16 +635,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
     end
   end
 
     end
   end
 
-  describe "fetch the latest Follow" do
-    test "fetches the latest Follow activity" do
-      %Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity)
-      follower = Repo.get_by(User, ap_id: activity.data["actor"])
-      followed = Repo.get_by(User, ap_id: activity.data["object"])
-
-      assert activity == Utils.fetch_latest_follow(follower, followed)
-    end
-  end
-
   describe "fetching an object" do
     test "it fetches an object" do
       {:ok, object} =
   describe "fetching an object" do
     test "it fetches an object" do
       {:ok, object} =
index 2bd3ddf932c632ab017128e81a69ff8bd31643e4..6b9961d82d4a130ca39bd80cfd60c8d2f47aa2d5 100644 (file)
@@ -1,10 +1,34 @@
 defmodule Pleroma.Web.ActivityPub.UtilsTest do
   use Pleroma.DataCase
 defmodule Pleroma.Web.ActivityPub.UtilsTest do
   use Pleroma.DataCase
+  alias Pleroma.Activity
+  alias Pleroma.Repo
+  alias Pleroma.User
+  alias Pleroma.Web.ActivityPub.ActivityPub
   alias Pleroma.Web.ActivityPub.Utils
   alias Pleroma.Web.CommonAPI
 
   import Pleroma.Factory
 
   alias Pleroma.Web.ActivityPub.Utils
   alias Pleroma.Web.CommonAPI
 
   import Pleroma.Factory
 
+  describe "fetch the latest Follow" do
+    test "fetches the latest Follow activity" do
+      %Activity{data: %{"type" => "Follow"}} = activity = insert(:follow_activity)
+      follower = Repo.get_by(User, ap_id: activity.data["actor"])
+      followed = Repo.get_by(User, ap_id: activity.data["object"])
+
+      assert activity == Utils.fetch_latest_follow(follower, followed)
+    end
+  end
+
+  describe "fetch the latest Block" do
+    test "fetches the latest Block activity" do
+      blocker = insert(:user)
+      blocked = insert(:user)
+      {:ok, activity} = ActivityPub.block(blocker, blocked)
+
+      assert activity == Utils.fetch_latest_block(blocker, blocked)
+    end
+  end
+
   describe "determine_explicit_mentions()" do
     test "works with an object that has mentions" do
       object = %{
   describe "determine_explicit_mentions()" do
     test "works with an object that has mentions" do
       object = %{