|
|
@@ -10,6 +10,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
alias Pleroma.Conversation |
|
|
|
alias Pleroma.Conversation.Participation |
|
|
|
alias Pleroma.Filter |
|
|
|
alias Pleroma.Hashtag |
|
|
|
alias Pleroma.Maps |
|
|
|
alias Pleroma.Notification |
|
|
|
alias Pleroma.Object |
|
|
@@ -698,8 +699,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
end |
|
|
|
|
|
|
|
defp restrict_embedded_tag_all(query, %{tag_all: [_ | _] = tag_all}) do |
|
|
|
tag_all = Enum.map(tag_all, &String.downcase/1) |
|
|
|
|
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: fragment("(?)->'tag' \\?& (?)", object.data, ^tag_all) |
|
|
@@ -717,8 +716,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
end |
|
|
|
|
|
|
|
defp restrict_embedded_tag_any(query, %{tag: [_ | _] = tag_any}) do |
|
|
|
tag_any = Enum.map(tag_any, &String.downcase/1) |
|
|
|
|
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: fragment("(?)->'tag' \\?| (?)", object.data, ^tag_any) |
|
|
@@ -736,8 +733,6 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
end |
|
|
|
|
|
|
|
defp restrict_embedded_tag_reject_any(query, %{tag_reject: [_ | _] = tag_reject}) do |
|
|
|
tag_reject = Enum.map(tag_reject, &String.downcase/1) |
|
|
|
|
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: fragment("not (?)->'tag' \\?| (?)", object.data, ^tag_reject) |
|
|
@@ -766,7 +761,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
fragment( |
|
|
|
""" |
|
|
|
(SELECT array_agg(hashtags.name) FROM hashtags JOIN hashtags_objects |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?::citext[]) |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?) |
|
|
|
AND hashtags_objects.object_id = ?) @> ? |
|
|
|
""", |
|
|
|
^tags, |
|
|
@@ -787,42 +782,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
end |
|
|
|
|
|
|
|
defp restrict_hashtag_any(query, %{tag: [_ | _] = tags}) do |
|
|
|
# TODO: refactor: debug / experimental feature |
|
|
|
if Config.get([:database, :improved_hashtag_timeline]) == :preselect_hashtag_ids do |
|
|
|
hashtag_ids = |
|
|
|
from(ht in Pleroma.Hashtag, |
|
|
|
where: fragment("name = ANY(?::citext[])", ^tags), |
|
|
|
select: ht.id |
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: |
|
|
|
fragment( |
|
|
|
""" |
|
|
|
EXISTS (SELECT 1 FROM hashtags JOIN hashtags_objects |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?) |
|
|
|
AND hashtags_objects.object_id = ? LIMIT 1) |
|
|
|
""", |
|
|
|
^tags, |
|
|
|
object.id |
|
|
|
) |
|
|
|
|> Repo.all() |
|
|
|
|
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: |
|
|
|
fragment( |
|
|
|
""" |
|
|
|
EXISTS ( |
|
|
|
SELECT 1 FROM hashtags_objects WHERE hashtag_id = ANY(?) AND object_id = ? LIMIT 1) |
|
|
|
""", |
|
|
|
^hashtag_ids, |
|
|
|
object.id |
|
|
|
) |
|
|
|
) |
|
|
|
else |
|
|
|
from( |
|
|
|
[_activity, object] in query, |
|
|
|
where: |
|
|
|
fragment( |
|
|
|
""" |
|
|
|
EXISTS (SELECT 1 FROM hashtags JOIN hashtags_objects |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?::citext[]) |
|
|
|
AND hashtags_objects.object_id = ? LIMIT 1) |
|
|
|
""", |
|
|
|
^tags, |
|
|
|
object.id |
|
|
|
) |
|
|
|
) |
|
|
|
end |
|
|
|
) |
|
|
|
end |
|
|
|
|
|
|
|
defp restrict_hashtag_any(query, %{tag: tag}) when is_binary(tag) do |
|
|
@@ -842,7 +814,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
fragment( |
|
|
|
""" |
|
|
|
NOT EXISTS (SELECT 1 FROM hashtags JOIN hashtags_objects |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?::citext[]) |
|
|
|
ON hashtags_objects.hashtag_id = hashtags.id WHERE hashtags.name = ANY(?) |
|
|
|
AND hashtags_objects.object_id = ? LIMIT 1) |
|
|
|
""", |
|
|
|
^tags_reject, |
|
|
@@ -1220,6 +1192,21 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
|
|
|
|
defp maybe_order(query, _), do: query |
|
|
|
|
|
|
|
defp normalize_fetch_activities_query_opts(opts) do |
|
|
|
Enum.reduce([:tag, :tag_all, :tag_reject], opts, fn key, opts -> |
|
|
|
case opts[key] do |
|
|
|
value when is_bitstring(value) -> |
|
|
|
Map.put(opts, key, Hashtag.normalize_name(value)) |
|
|
|
|
|
|
|
value when is_list(value) -> |
|
|
|
Map.put(opts, key, Enum.map(value, &Hashtag.normalize_name/1)) |
|
|
|
|
|
|
|
_ -> |
|
|
|
opts |
|
|
|
end |
|
|
|
end) |
|
|
|
end |
|
|
|
|
|
|
|
defp fetch_activities_query_ap_ids_ops(opts) do |
|
|
|
source_user = opts[:muting_user] |
|
|
|
ap_id_relationships = if source_user, do: [:mute, :reblog_mute], else: [] |
|
|
@@ -1243,6 +1230,8 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do |
|
|
|
end |
|
|
|
|
|
|
|
def fetch_activities_query(recipients, opts \\ %{}) do |
|
|
|
opts = normalize_fetch_activities_query_opts(opts) |
|
|
|
|
|
|
|
{restrict_blocked_opts, restrict_muted_opts, restrict_muted_reblogs_opts} = |
|
|
|
fetch_activities_query_ap_ids_ops(opts) |
|
|
|
|
|
|
|