activitypub utils: optimize block and follow activity lookup

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
This commit is contained in:
William Pitcock 2018-05-25 05:19:11 +00:00
parent f3a71f2986
commit 47dc52a758
1 changed files with 16 additions and 6 deletions

View File

@ -240,11 +240,16 @@ def fetch_latest_follow(%User{ap_id: follower_id}, %User{ap_id: followed_id}) do
activity in Activity, activity in Activity,
where: where:
fragment( fragment(
"? @> ?", "? ->> 'type' = 'Follow'",
activity.data, activity.data
^%{type: "Follow", object: followed_id}
), ),
where: activity.actor == ^follower_id, where: activity.actor == ^follower_id,
where:
fragment(
"? @> ?",
activity.data,
^%{object: followed_id}
),
order_by: [desc: :id], order_by: [desc: :id],
limit: 1 limit: 1
) )
@ -365,11 +370,16 @@ def fetch_latest_block(%User{ap_id: blocker_id}, %User{ap_id: blocked_id}) do
activity in Activity, activity in Activity,
where: where:
fragment( fragment(
"? @> ?", "? ->> 'type' = 'Block'",
activity.data, activity.data
^%{type: "Block", object: blocked_id}
), ),
where: activity.actor == ^blocker_id, where: activity.actor == ^blocker_id,
where:
fragment(
"? @> ?",
activity.data,
^%{object: blocked_id}
),
order_by: [desc: :id], order_by: [desc: :id],
limit: 1 limit: 1
) )