Use named binding to conditionally join object
authorAaron Tinio <aptinio@gmail.com>
Wed, 15 May 2019 22:25:14 +0000 (06:25 +0800)
committerAaron Tinio <aptinio@gmail.com>
Wed, 15 May 2019 22:25:14 +0000 (06:25 +0800)
lib/pleroma/activity.ex
lib/pleroma/web/activity_pub/activity_pub.ex

index 4a09194786f3f58ca4c998fd67d99cb0a8dc4f40..3fd4003f88f4774a6870ce237bd319d190adb4de 100644 (file)
@@ -60,21 +60,24 @@ defmodule Pleroma.Activity do
     timestamps()
   end
 
-  def with_preloaded_object(query) do
-    query
-    |> join(
-      :inner,
-      [activity],
-      o in Object,
+  def with_joined_object(query) do
+    join(query, :inner, [activity], o in Object,
       on:
         fragment(
           "(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')",
           o.data,
           activity.data,
           activity.data
-        )
+        ),
+      as: :object
     )
-    |> preload([activity, object], object: object)
+  end
+
+  def with_preloaded_object(query) do
+    query
+    |> has_named_binding?(:object)
+    |> if(do: query, else: with_joined_object(query))
+    |> preload([activity, object: object], object: object)
   end
 
   def with_preloaded_bookmark(query, %User{} = user) do
index 6087a1cdc9e5c2e52c6ae93f1553f31963d594e3..2fd073d3adfb2c775980ad6ff094d3e93d2c90d3 100644 (file)
@@ -750,16 +750,11 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     blocks = info.blocks || []
     domain_blocks = info.domain_blocks || []
 
+    query =
+      if has_named_binding?(query, :object), do: query, else: Activity.with_joined_object(query)
+
     from(
-      activity in query,
-      inner_join: o in Object,
-      on:
-        fragment(
-          "(?->>'id') = COALESCE(?->'object'->>'id', ?->>'object')",
-          o.data,
-          activity.data,
-          activity.data
-        ),
+      [activity, object: o] in query,
       where: fragment("not (? = ANY(?))", activity.actor, ^blocks),
       where: fragment("not (? && ?)", activity.recipients, ^blocks),
       where: