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 if changeset.load in [nil, []] do
{:ok, result, instructions} {:ok, result, instructions}
else 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} ->
{:ok, result, instructions} {:ok, result, instructions}
@ -419,7 +424,12 @@ defmodule Ash.Actions.Helpers do
if changeset.load in [nil, []] do if changeset.load in [nil, []] do
{:ok, result} {:ok, result}
else 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} ->
{:ok, result} {:ok, result}

View file

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

View file

@ -114,6 +114,21 @@ defmodule Ash.Query do
import Inspect.Algebra import Inspect.Algebra
def inspect(query, opts) do 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 != [] sort? = query.sort != []
load? = query.load != [] load? = query.load != []
aggregates? = query.aggregates != %{} aggregates? = query.aggregates != %{}

View file

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