fix: handle more subquery filter cases for aggregates

This commit is contained in:
Zach Daniel 2024-02-24 20:20:52 -05:00
parent f6d029d85b
commit b6b2dd1dc6
2 changed files with 35 additions and 20 deletions

View file

@ -831,23 +831,6 @@ defmodule AshPostgres.DataLayer do
end end
defp add_single_aggs(result, resource, query, cant_group) do defp add_single_aggs(result, resource, query, cant_group) do
query =
if query.distinct || query.limit do
query =
query
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
from(row in subquery(query), as: ^0, select: %{})
else
query
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
|> Ecto.Query.select(%{})
end
Enum.reduce(cant_group, result, fn Enum.reduce(cant_group, result, fn
%{kind: :exists} = agg, result -> %{kind: :exists} = agg, result ->
{:ok, filtered} = {:ok, filtered} =
@ -859,7 +842,22 @@ defmodule AshPostgres.DataLayer do
{:ok, query} {:ok, query}
end end
filtered = Ecto.Query.exclude(filtered, :distinct) filtered =
if filtered.distinct || filtered.limit do
filtered =
filtered
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
from(row in subquery(filtered), as: ^0, select: %{})
else
filtered
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
|> Ecto.Query.select(%{})
end
Map.put( Map.put(
result || %{}, result || %{},
@ -904,6 +902,23 @@ defmodule AshPostgres.DataLayer do
filtered filtered
end end
filtered =
if filtered.limit do
filtered =
filtered
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
from(row in subquery(filtered), as: ^0, select: %{})
else
filtered
|> Ecto.Query.exclude(:select)
|> Ecto.Query.exclude(:order_by)
|> Map.put(:windows, [])
|> Ecto.Query.select(%{})
end
first_relationship = first_relationship =
Ash.Resource.Info.relationship(resource, agg.relationship_path |> Enum.at(0)) Ash.Resource.Info.relationship(resource, agg.relationship_path |> Enum.at(0))

View file

@ -1170,10 +1170,10 @@ defmodule AshPostgres.AggregateTest do
|> Api.create!() |> Api.create!()
Post Post
|> Ash.Changeset.new(%{title: "bar"}) |> Ash.Changeset.new(%{title: "foo"})
|> Api.create!() |> Api.create!()
assert 1 == assert 1 =
Post Post
|> Ash.Query.for_read(:title_is_foo) |> Ash.Query.for_read(:title_is_foo)
|> Ash.Query.limit(1) |> Ash.Query.limit(1)