mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
fix: various issues w/ over/under-selecting data
This commit is contained in:
parent
695c2bb09a
commit
caf9a2340e
4 changed files with 27 additions and 6 deletions
|
@ -692,7 +692,15 @@ defmodule Ash.Actions.Read do
|
||||||
else
|
else
|
||||||
query =
|
query =
|
||||||
initial_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.data_layer_query(only_validate_filter?: true)
|
||||||
|
|
||||||
ash_query =
|
ash_query =
|
||||||
|
|
|
@ -340,7 +340,7 @@ defmodule Ash.DataLayer do
|
||||||
end
|
end
|
||||||
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}
|
{:ok, data_layer_query()} | {:error, term}
|
||||||
def select(query, nil, _resource), do: {:ok, query}
|
def select(query, nil, _resource), do: {:ok, query}
|
||||||
|
|
||||||
|
|
|
@ -296,7 +296,9 @@ defmodule Ash.Query.Aggregate do
|
||||||
{:ok, %{}}
|
{:ok, %{}}
|
||||||
else
|
else
|
||||||
initial_query =
|
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 =
|
query =
|
||||||
case records do
|
case records do
|
||||||
|
|
|
@ -724,9 +724,19 @@ defmodule Ash.Query do
|
||||||
query = to_query(query)
|
query = to_query(query)
|
||||||
|
|
||||||
if opts[:replace?] do
|
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
|
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
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -1986,7 +1996,8 @@ defmodule Ash.Query do
|
||||||
resource,
|
resource,
|
||||||
query,
|
query,
|
||||||
Map.put(ash_query.context, :action, ash_query.action)
|
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
|
if opts[:no_modify?] || !ash_query.action || !ash_query.action.modify_query do
|
||||||
{:ok, query}
|
{:ok, query}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in a new issue