fix: pass empty select statement when loading on changesets

fix: fixes for loading through attributes
This commit is contained in:
Zach Daniel 2023-06-09 10:17:48 -04:00
parent f5238674a4
commit 0d32560651
4 changed files with 39 additions and 15 deletions

View file

@ -405,7 +405,12 @@ defmodule Ash.Actions.Helpers do
if changeset.load in [nil, []] do
{:ok, result, instructions}
else
case api.load(result, changeset.load, opts) do
query =
changeset.resource
|> Ash.Query.select([])
|> Ash.Query.load(changeset.load)
case api.load(result, query, opts) do
{:ok, result} ->
{:ok, result, instructions}
@ -419,7 +424,12 @@ defmodule Ash.Actions.Helpers do
if changeset.load in [nil, []] do
{:ok, result}
else
case api.load(result, changeset.load, opts) do
query =
changeset.resource
|> Ash.Query.select([])
|> Ash.Query.load(changeset.load)
case api.load(result, query, opts) do
{:ok, result} ->
{:ok, result}

View file

@ -402,13 +402,6 @@ defmodule Ash.Actions.Read do
else
data
|> Load.attach_loads(get_in(context, path ++ [:fetch, :load]) || %{})
|> load_through_attributes(
query,
api,
context[:actor],
context[:tracer],
context[:authorize?]
)
|> add_aggregate_values(
fetched_data[:aggregates],
query.resource,
@ -430,6 +423,13 @@ defmodule Ash.Actions.Read do
context[:tracer],
request_opts
)
|> load_through_attributes(
query,
api,
context[:actor],
context[:tracer],
context[:authorize?]
)
|> case do
{:ok, values} ->
values
@ -460,7 +460,9 @@ defmodule Ash.Actions.Read do
[fetch, process]
end
defp load_through_attributes(results, query, api, actor, tracer, authorize?) do
defp load_through_attributes({:requests, error}, _, _, _, _, _), do: {:requests, error}
defp load_through_attributes({:ok, results}, query, api, actor, tracer, authorize?) do
Enum.reduce_while(query.load_through, {:ok, results}, fn
{:calculation, load_through}, {:ok, results} ->
Enum.reduce_while(load_through, {:ok, results}, fn {name, load_statement},
@ -2938,12 +2940,8 @@ defmodule Ash.Actions.Read do
end
end
defp add_aggregate_values({:error, error}, _, _, _, _) do
{:error, error}
end
defp add_aggregate_values(
{:ok, results},
results,
aggregates,
resource,
aggregate_values,

View file

@ -114,6 +114,21 @@ defmodule Ash.Query do
import Inspect.Algebra
def inspect(query, opts) do
load_through_attributes = Map.to_list(query.load_through[:attributes] || %{})
query = %{
query
| load: Keyword.merge(query.load || [], load_through_attributes),
calculations:
Map.new(query.calculations, fn {name, calc} ->
if load_through = query.load_through[:calculations][name] do
{name, {calc, load_through}}
else
{name, calc}
end
end)
}
sort? = query.sort != []
load? = query.load != []
aggregates? = query.aggregates != %{}

View file

@ -837,6 +837,7 @@ defmodule Ash.Type do
def splicing_nil_values(values, callback) when is_list(values) do
values
|> Stream.flat_map(&List.wrap/1)
|> Stream.with_index()
|> Enum.reduce({[], []}, fn
{nil, index}, {acc, nil_indices} ->