activitypub utils: optimize block and follow activity lookup
authorWilliam Pitcock <nenolod@dereferenced.org>
Fri, 25 May 2018 05:19:11 +0000 (05:19 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Fri, 25 May 2018 05:23:49 +0000 (05:23 +0000)
multi-field @> comparison is very expensive, so only use @> for the field where it matters
this makes the query take only a few usec to execute verses many msec on a busy instance

lib/pleroma/web/activity_pub/utils.ex

index 831e13b7edf0b50e9fae3ff3c0afbdaabefd3b78..cb2e1e07843bdaa1207cc4bdedddb13914aca726 100644 (file)
@@ -238,13 +238,18 @@ defmodule Pleroma.Web.ActivityPub.Utils do
     query =
       from(
         activity in Activity,
+        where:
+          fragment(
+            "? ->> 'type' = 'Follow'",
+            activity.data
+          ),
+        where: activity.actor == ^follower_id,
         where:
           fragment(
             "? @> ?",
             activity.data,
-            ^%{type: "Follow", object: followed_id}
+            ^%{object: followed_id}
           ),
-        where: activity.actor == ^follower_id,
         order_by: [desc: :id],
         limit: 1
       )
@@ -363,13 +368,18 @@ defmodule Pleroma.Web.ActivityPub.Utils do
     query =
       from(
         activity in Activity,
+        where:
+          fragment(
+            "? ->> 'type' = 'Block'",
+            activity.data
+          ),
+        where: activity.actor == ^blocker_id,
         where:
           fragment(
             "? @> ?",
             activity.data,
-            ^%{type: "Block", object: blocked_id}
+            ^%{object: blocked_id}
           ),
-        where: activity.actor == ^blocker_id,
         order_by: [desc: :id],
         limit: 1
       )