improvement: support new from_many? option

improvement: subquery after distinct to handle distinct
This commit is contained in:
Zach Daniel 2023-08-04 18:53:09 -04:00
parent 3d9a0cfb4f
commit d568ac18a8
2 changed files with 11 additions and 2 deletions

View file

@ -1856,7 +1856,15 @@ defmodule AshPostgres.DataLayer do
@impl true
def lock(query, :for_update, _) do
{:ok, Ecto.Query.lock(query, [{^0, a}], fragment("FOR UPDATE OF ?", a))}
if query.distinct do
new_query =
Ecto.Query.lock(%{query | distinct: nil}, [{^0, a}], fragment("FOR UPDATE OF ?", a))
q = from(row in subquery(new_query), [])
{:ok, %{q | distinct: query.distinct}}
else
{:ok, Ecto.Query.lock(query, [{^0, a}], fragment("FOR UPDATE OF ?", a))}
end
end
@locks [

View file

@ -430,7 +430,8 @@ defmodule AshPostgres.Join do
def get_binding(_, _, _, _), do: nil
defp add_distinct(relationship, _join_type, joined_query) do
if !joined_query.__ash_bindings__.in_group? && relationship.cardinality == :many &&
if !joined_query.__ash_bindings__.in_group? &&
(relationship.cardinality == :many || Map.get(relationship, :from_many?)) &&
!joined_query.distinct do
from(row in joined_query,
distinct: ^Ash.Resource.Info.primary_key(joined_query.__ash_bindings__.resource)