ash_postgres/test/support/relationships/comments_containing_title.ex
Zach Daniel 37cc01957d
improvement!: 3.0 (#227)
* WIP

* chore: fix mix.lock merge issues

* improvement: upgrade to 3.0

* chore: remove `repo.to_tenant`

* chore: continue removal of unnecessary helper

* chore: use `Ash.ToTenant`
2024-03-27 16:52:28 -04:00

48 lines
1.6 KiB
Elixir

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))
|> Ash.read!(actor: actor, authorize?: authorize?)
|> 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