fix: various issues w/ over/under-selecting data

This commit is contained in:
Zach Daniel 2022-08-24 14:46:21 -04:00
parent 695c2bb09a
commit caf9a2340e
4 changed files with 27 additions and 6 deletions

View file

@ -692,7 +692,15 @@ defmodule Ash.Actions.Read do
else
query =
initial_query
|> Ash.Query.unset([:filter, :aggregates, :sort, :limit, :offset, :distinct])
|> Ash.Query.unset([
:filter,
:aggregates,
:sort,
:limit,
:offset,
:distinct,
:select
])
|> Ash.Query.data_layer_query(only_validate_filter?: true)
ash_query =

View file

@ -340,7 +340,7 @@ defmodule Ash.DataLayer do
end
end
@spec select(data_layer_query(), offset :: list(atom), Ash.Resource.t()) ::
@spec select(data_layer_query(), select :: list(atom), Ash.Resource.t()) ::
{:ok, data_layer_query()} | {:error, term}
def select(query, nil, _resource), do: {:ok, query}

View file

@ -296,7 +296,9 @@ defmodule Ash.Query.Aggregate do
{:ok, %{}}
else
initial_query =
Ash.Query.unset(initial_query, [:filter, :sort, :aggregates, :limit, :offset])
initial_query
|> Ash.Query.unset([:filter, :sort, :aggregates, :limit, :offset, :select])
|> Ash.Query.select([])
query =
case records do

View file

@ -724,9 +724,19 @@ defmodule Ash.Query do
query = to_query(query)
if opts[:replace?] do
%{query | select: Enum.uniq(List.wrap(fields))}
%{
query
| select: Enum.uniq(List.wrap(fields) ++ Ash.Resource.Info.primary_key(query.resource))
}
else
%{query | select: Enum.uniq(List.wrap(fields) ++ (query.select || []))}
%{
query
| select:
Enum.uniq(
List.wrap(fields) ++
(query.select || []) ++ Ash.Resource.Info.primary_key(query.resource)
)
}
end
end
@ -1986,7 +1996,8 @@ defmodule Ash.Query do
resource,
query,
Map.put(ash_query.context, :action, ash_query.action)
) do
),
{:ok, query} <- Ash.DataLayer.select(query, ash_query.select, ash_query.resource) do
if opts[:no_modify?] || !ash_query.action || !ash_query.action.modify_query do
{:ok, query}
else