mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
fix: require calculations specified on resource load
This commit is contained in:
parent
c963b349fd
commit
5e270288e6
3 changed files with 22 additions and 14 deletions
|
@ -1116,9 +1116,18 @@ defmodule Ash.Actions.Read do
|
|||
) do
|
||||
all_calcs = Enum.map(all_calcs, & &1.name)
|
||||
|
||||
resource_load =
|
||||
if resource_calculation = Ash.Resource.Info.calculation(resource, calculation.name) do
|
||||
List.wrap(resource_calculation.load)
|
||||
else
|
||||
[]
|
||||
end
|
||||
|
||||
dependencies =
|
||||
query
|
||||
|> calculation.module.load(calculation.opts, calculation.context)
|
||||
|> List.wrap()
|
||||
|> Enum.concat(resource_load)
|
||||
|> Ash.Actions.Helpers.validate_calculation_load!(calculation.module)
|
||||
|> Enum.map(fn
|
||||
{key, _} ->
|
||||
|
|
|
@ -181,7 +181,7 @@ defmodule Ash.Filter do
|
|||
statement,
|
||||
aggregates \\ %{},
|
||||
calculations \\ %{},
|
||||
context \\ %{}
|
||||
_context \\ %{}
|
||||
) do
|
||||
context = %{
|
||||
resource: resource,
|
||||
|
@ -189,8 +189,7 @@ defmodule Ash.Filter do
|
|||
aggregates: aggregates,
|
||||
calculations: calculations,
|
||||
public?: true,
|
||||
data_layer: Ash.DataLayer.data_layer(resource),
|
||||
query_context: context
|
||||
data_layer: Ash.DataLayer.data_layer(resource)
|
||||
}
|
||||
|
||||
with {:ok, expression} <- parse_expression(statement, context),
|
||||
|
@ -263,15 +262,14 @@ defmodule Ash.Filter do
|
|||
{:ok, nil}
|
||||
end
|
||||
|
||||
def parse(resource, statement, aggregates, calculations, context) do
|
||||
def parse(resource, statement, aggregates, calculations, _context) do
|
||||
context = %{
|
||||
resource: resource,
|
||||
relationship_path: [],
|
||||
aggregates: aggregates,
|
||||
calculations: calculations,
|
||||
public?: false,
|
||||
data_layer: Ash.DataLayer.data_layer(resource),
|
||||
query_context: context
|
||||
data_layer: Ash.DataLayer.data_layer(resource)
|
||||
}
|
||||
|
||||
with {:ok, expression} <- parse_expression(statement, context),
|
||||
|
@ -1772,7 +1770,6 @@ defmodule Ash.Filter do
|
|||
resource: related,
|
||||
aggregates: context.aggregates,
|
||||
calculations: context.calculations,
|
||||
query_context: context.query_context,
|
||||
public?: context.public?
|
||||
}
|
||||
|
||||
|
@ -1863,10 +1860,6 @@ defmodule Ash.Filter do
|
|||
context
|
||||
|> Map.update!(:relationship_path, fn path -> path ++ [rel.name] end)
|
||||
|> Map.put(:resource, rel.destination)
|
||||
|> Map.update!(
|
||||
:query_context,
|
||||
&Ash.Helpers.deep_merge_maps(&1 || %{}, rel.context || %{})
|
||||
)
|
||||
|
||||
if is_list(nested_statement) || is_map(nested_statement) do
|
||||
case parse_expression(nested_statement, context) do
|
||||
|
@ -1978,7 +1971,7 @@ defmodule Ash.Filter do
|
|||
module,
|
||||
opts,
|
||||
resource_calculation.type,
|
||||
Map.put(args, :context, context.query_context),
|
||||
args,
|
||||
resource_calculation.filterable?,
|
||||
resource_calculation.load
|
||||
) do
|
||||
|
@ -2149,7 +2142,7 @@ defmodule Ash.Filter do
|
|||
module,
|
||||
opts,
|
||||
resource_calculation.type,
|
||||
Map.put(args, :context, Map.get(context, :query_context, %{})),
|
||||
args,
|
||||
resource_calculation.filterable?,
|
||||
resource_calculation.load
|
||||
) do
|
||||
|
@ -2253,7 +2246,7 @@ defmodule Ash.Filter do
|
|||
module,
|
||||
opts,
|
||||
resource_calculation.type,
|
||||
Map.put(args, :context, context.query_context),
|
||||
args,
|
||||
resource_calculation.filterable?,
|
||||
resource_calculation.load
|
||||
) do
|
||||
|
|
|
@ -94,6 +94,8 @@ defmodule Ash.Test.CalculationTest do
|
|||
:string,
|
||||
{ConcatWithLoad, keys: [:full_name, :full_name]}
|
||||
|
||||
calculate :slug, :string, expr(full_name <> "123"), load: [:full_name]
|
||||
|
||||
calculate :expr_full_name, :string, expr(first_name <> " " <> last_name) do
|
||||
allow_async? true
|
||||
end
|
||||
|
@ -179,6 +181,10 @@ defmodule Ash.Test.CalculationTest do
|
|||
assert full_names == ["brian cranston", "zach daniel"]
|
||||
end
|
||||
|
||||
test "loads dependencies", %{user1: user} do
|
||||
assert %{slug: "zach daniel123"} = Api.load!(user, [:slug])
|
||||
end
|
||||
|
||||
test "it loads anything specified by the load callback" do
|
||||
full_names =
|
||||
User
|
||||
|
|
Loading…
Reference in a new issue