From 0d3256065114e79ab12065db8669c058a08538dd Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Fri, 9 Jun 2023 10:17:48 -0400 Subject: [PATCH] fix: pass empty select statement when loading on changesets fix: fixes for loading through attributes --- lib/ash/actions/helpers.ex | 14 ++++++++++++-- lib/ash/actions/read.ex | 24 +++++++++++------------- lib/ash/query/query.ex | 15 +++++++++++++++ lib/ash/type/type.ex | 1 + 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/lib/ash/actions/helpers.ex b/lib/ash/actions/helpers.ex index 186a401d..8a48f046 100644 --- a/lib/ash/actions/helpers.ex +++ b/lib/ash/actions/helpers.ex @@ -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} diff --git a/lib/ash/actions/read.ex b/lib/ash/actions/read.ex index 000e87e0..bd52d967 100644 --- a/lib/ash/actions/read.ex +++ b/lib/ash/actions/read.ex @@ -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, diff --git a/lib/ash/query/query.ex b/lib/ash/query/query.ex index 239099d6..b519664e 100644 --- a/lib/ash/query/query.ex +++ b/lib/ash/query/query.ex @@ -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 != %{} diff --git a/lib/ash/type/type.ex b/lib/ash/type/type.ex index 777862cf..497aba4c 100644 --- a/lib/ash/type/type.ex +++ b/lib/ash/type/type.ex @@ -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} ->