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
|
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}
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 != %{}
|
||||||
|
|
|
@ -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} ->
|
||||||
|
|
Loading…
Reference in a new issue