Merge branch 'fix-slow-relationships' into 'develop'

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

See merge request pleroma/pleroma!1011
This commit is contained in:
Haelwenn 2019-04-02 18:43:48 +00:00
commit 0cb94cfa94
3 changed files with 34 additions and 16 deletions

View file

@ -423,13 +423,15 @@ defmodule Pleroma.Web.ActivityPub.Utils 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
) )
@ -586,13 +588,15 @@ defmodule Pleroma.Web.ActivityPub.Utils 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 @@ 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 = User.get_by_ap_id(activity.data["actor"])
followed = User.get_by_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 = %{