mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
fix: pass empty select statement when loading on changesets
fix: fixes for loading through attributes
This commit is contained in:
parent
f5238674a4
commit
0d32560651
4 changed files with 39 additions and 15 deletions
|
@ -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}
|
||||
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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 != %{}
|
||||
|
|
|
@ -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} ->
|
||||
|
|
Loading…
Reference in a new issue