ActivityPub Utils: Greatly speed up the follow / block activity fetching.

This commit is contained in:
lain 2019-04-02 16:04:18 +02:00
parent 749d53e2b2
commit fd07745d1b
3 changed files with 34 additions and 16 deletions

View file

@ -404,13 +404,15 @@ def fetch_latest_follow(%User{ap_id: follower_id}, %User{ap_id: followed_id}) do
activity.data activity.data
), ),
where: activity.actor == ^follower_id, where: activity.actor == ^follower_id,
# this is to use the index
where: where:
fragment( fragment(
"? @> ?", "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
activity.data, activity.data,
^%{object: followed_id} activity.data,
^followed_id
), ),
order_by: [desc: :id], order_by: [fragment("? desc nulls last", activity.id)],
limit: 1 limit: 1
) )
@ -567,13 +569,15 @@ def fetch_latest_block(%User{ap_id: blocker_id}, %User{ap_id: blocked_id}) do
activity.data activity.data
), ),
where: activity.actor == ^blocker_id, where: activity.actor == ^blocker_id,
# this is to use the index
where: where:
fragment( fragment(
"? @> ?", "coalesce((?)->'object'->>'id', (?)->>'object') = ?",
activity.data, activity.data,
^%{object: blocked_id} activity.data,
^blocked_id
), ),
order_by: [desc: :id], order_by: [fragment("? desc nulls last", activity.id)],
limit: 1 limit: 1
) )

View file

@ -635,16 +635,6 @@ test "works with base64 encoded images" 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 describe "fetching an object" do
test "it fetches an object" do test "it fetches an object" do
{:ok, object} = {:ok, object} =

View file

@ -1,10 +1,34 @@
defmodule Pleroma.Web.ActivityPub.UtilsTest do defmodule Pleroma.Web.ActivityPub.UtilsTest do
use Pleroma.DataCase 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.ActivityPub.Utils
alias Pleroma.Web.CommonAPI alias Pleroma.Web.CommonAPI
import Pleroma.Factory 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 describe "determine_explicit_mentions()" do
test "works with an object that has mentions" do test "works with an object that has mentions" do
object = %{ object = %{