2022-09-14 08:27:39 +12:00
|
|
|
defmodule AshPostgres.Test.Post.CommentsContainingTitle do
|
|
|
|
@moduledoc false
|
|
|
|
|
|
|
|
use Ash.Resource.ManualRelationship
|
|
|
|
use AshPostgres.ManualRelationship
|
|
|
|
require Ash.Query
|
|
|
|
require Ecto.Query
|
|
|
|
|
|
|
|
def load(posts, _opts, %{query: query, actor: actor, authorize?: authorize?}) do
|
|
|
|
post_ids = Enum.map(posts, & &1.id)
|
|
|
|
|
|
|
|
{:ok,
|
|
|
|
query
|
|
|
|
|> Ash.Query.filter(post_id in ^post_ids)
|
|
|
|
|> Ash.Query.filter(contains(title, post.title))
|
2024-03-28 09:52:28 +13:00
|
|
|
|> Ash.read!(actor: actor, authorize?: authorize?)
|
2022-09-14 08:27:39 +12:00
|
|
|
|> Enum.group_by(& &1.post_id)}
|
|
|
|
end
|
|
|
|
|
|
|
|
def ash_postgres_join(query, _opts, current_binding, as_binding, :inner, destination_query) do
|
|
|
|
{:ok,
|
|
|
|
Ecto.Query.from(_ in query,
|
|
|
|
join: dest in ^destination_query,
|
|
|
|
as: ^as_binding,
|
|
|
|
on: dest.post_id == as(^current_binding).id,
|
|
|
|
on: fragment("strpos(?, ?) > 0", dest.title, as(^current_binding).title)
|
|
|
|
)}
|
|
|
|
end
|
|
|
|
|
|
|
|
def ash_postgres_join(query, _opts, current_binding, as_binding, :left, destination_query) do
|
|
|
|
{:ok,
|
|
|
|
Ecto.Query.from(_ in query,
|
|
|
|
left_join: dest in ^destination_query,
|
|
|
|
as: ^as_binding,
|
|
|
|
on: dest.post_id == as(^current_binding).id,
|
|
|
|
on: fragment("strpos(?, ?) > 0", dest.title, as(^current_binding).title)
|
|
|
|
)}
|
|
|
|
end
|
|
|
|
|
|
|
|
def ash_postgres_subquery(_opts, current_binding, as_binding, destination_query) do
|
|
|
|
{:ok,
|
|
|
|
Ecto.Query.from(_ in destination_query,
|
|
|
|
where: parent_as(^current_binding).id == as(^as_binding).post_id,
|
|
|
|
where:
|
|
|
|
fragment("strpos(?, ?) > 0", as(^as_binding).title, parent_as(^current_binding).title)
|
|
|
|
)}
|
|
|
|
end
|
|
|
|
end
|