mirror of
https://github.com/ash-project/ash_postgres.git
synced 2024-09-20 05:23:18 +12:00
fix: handle more subquery filter cases for aggregates
This commit is contained in:
parent
f6d029d85b
commit
b6b2dd1dc6
2 changed files with 35 additions and 20 deletions
|
@ -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))
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
Loading…
Reference in a new issue