fix: add a case for calculations as tuples in expr filters

This commit is contained in:
Zach Daniel 2022-09-16 03:47:12 -04:00
parent cc5c1b69c0
commit 003ba3246b
2 changed files with 35 additions and 6 deletions

View file

@ -1925,11 +1925,40 @@ defmodule Ash.Filter do
when is_tuple(args) and is_atom(function) do when is_tuple(args) and is_atom(function) do
case get_function(function, context.resource, context.public?) do case get_function(function, context.resource, context.public?) do
nil -> nil ->
{:error, case calculation(context, function) do
NoSuchAttributeOrRelationship.exception( nil ->
attribute_or_relationship: function, {:error,
resource: context.resource NoSuchAttributeOrRelationship.exception(
)} attribute_or_relationship: function,
resource: context.resource
)}
resource_calculation ->
{module, opts} = module_and_opts(resource_calculation.calculation)
with {:ok, args} <-
Ash.Query.validate_calculation_arguments(resource_calculation, args),
{:ok, calculation} <-
Calculation.new(
resource_calculation.name,
module,
opts,
resource_calculation.type,
args,
resource_calculation.filterable?,
resource_calculation.load
) do
{:ok,
%Ash.Query.Ref{
attribute: calculation,
resource: context.resource,
relationship_path: context.relationship_path
}}
else
{:error, error} ->
{:error, error}
end
end
function_module -> function_module ->
nested_statement = Tuple.to_list(args) nested_statement = Tuple.to_list(args)

View file

@ -710,7 +710,7 @@ defmodule Ash.Test.Filter.FilterTest do
test "with bad input" do test "with bad input" do
User User
|> new() |> new(%{name: "fred"})
|> Api.create!() |> Api.create!()
assert_raise(Ash.Error.Unknown, fn -> assert_raise(Ash.Error.Unknown, fn ->