mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
fix: various fast follows to api aggregate functions
This commit is contained in:
parent
8835924901
commit
4f4bd4a436
3 changed files with 54 additions and 14 deletions
|
@ -37,11 +37,13 @@ defmodule Ash.Actions.Aggregate do
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
resource = query.resource
|
||||||
|
|
||||||
case aggregate_auth_requests do
|
case aggregate_auth_requests do
|
||||||
[] ->
|
[] ->
|
||||||
case Ash.Query.data_layer_query(query) do
|
case Ash.Query.data_layer_query(query) do
|
||||||
{:ok, query} ->
|
{:ok, query} ->
|
||||||
Ash.DataLayer.run_aggregate_query(query, aggregates_in_query, query.resource)
|
Ash.DataLayer.run_aggregate_query(query, aggregates_in_query, resource)
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, error}
|
{:error, error}
|
||||||
|
@ -66,7 +68,7 @@ defmodule Ash.Actions.Aggregate do
|
||||||
Ash.DataLayer.run_aggregate_query(
|
Ash.DataLayer.run_aggregate_query(
|
||||||
query,
|
query,
|
||||||
aggregates_in_query,
|
aggregates_in_query,
|
||||||
query.resource
|
resource
|
||||||
)
|
)
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
|
|
|
@ -44,8 +44,8 @@ defmodule Ash.Api.Interface do
|
||||||
case Ash.Query.Aggregate.new(query.resource, :count, :count) do
|
case Ash.Query.Aggregate.new(query.resource, :count, :count) do
|
||||||
{:ok, aggregate} ->
|
{:ok, aggregate} ->
|
||||||
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
||||||
{:ok, value} ->
|
{:ok, %{count: count}} ->
|
||||||
value
|
count
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
raise Ash.Error.to_error_class(error)
|
raise Ash.Error.to_error_class(error)
|
||||||
|
@ -64,7 +64,13 @@ defmodule Ash.Api.Interface do
|
||||||
|
|
||||||
case Ash.Query.Aggregate.new(query.resource, :count, :count) do
|
case Ash.Query.Aggregate.new(query.resource, :count, :count) do
|
||||||
{:ok, aggregate} ->
|
{:ok, aggregate} ->
|
||||||
Api.aggregate(__MODULE__, query, aggregate, opts)
|
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
||||||
|
{:ok, %{count: count}} ->
|
||||||
|
{:ok, count}
|
||||||
|
|
||||||
|
{:error, error} ->
|
||||||
|
{:error, Ash.Error.to_error_class(error)}
|
||||||
|
end
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, Ash.Error.to_error_class(error)}
|
{:error, Ash.Error.to_error_class(error)}
|
||||||
|
@ -78,11 +84,20 @@ defmodule Ash.Api.Interface do
|
||||||
def unquote(kind)(query, field, opts \\ []) do
|
def unquote(kind)(query, field, opts \\ []) do
|
||||||
query = Ash.Query.to_query(query)
|
query = Ash.Query.to_query(query)
|
||||||
|
|
||||||
case Ash.Query.Aggregate.new(query.resource, :count, :count,
|
case Ash.Query.Aggregate.new(
|
||||||
field: Keyword.put(opts, :field, field)
|
query.resource,
|
||||||
|
unquote(kind),
|
||||||
|
unquote(kind),
|
||||||
|
Keyword.put(opts, :field, field)
|
||||||
) do
|
) do
|
||||||
{:ok, aggregate} ->
|
{:ok, aggregate} ->
|
||||||
Api.aggregate(__MODULE__, query, aggregate, opts)
|
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
||||||
|
{:ok, %{unquote(kind) => value}} ->
|
||||||
|
{:ok, value}
|
||||||
|
|
||||||
|
{:error, error} ->
|
||||||
|
{:error, Ash.Error.to_error_class(error)}
|
||||||
|
end
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, Ash.Error.to_error_class(error)}
|
{:error, Ash.Error.to_error_class(error)}
|
||||||
|
@ -96,13 +111,16 @@ defmodule Ash.Api.Interface do
|
||||||
def unquote(:"#{kind}!")(query, field, opts \\ []) do
|
def unquote(:"#{kind}!")(query, field, opts \\ []) do
|
||||||
query = Ash.Query.to_query(query)
|
query = Ash.Query.to_query(query)
|
||||||
|
|
||||||
case Ash.Query.Aggregate.new(query.resource, :count, :count,
|
case Ash.Query.Aggregate.new(
|
||||||
field: Keyword.put(opts, :field, field)
|
query.resource,
|
||||||
|
unquote(kind),
|
||||||
|
unquote(kind),
|
||||||
|
Keyword.put(opts, :field, field)
|
||||||
) do
|
) do
|
||||||
{:ok, aggregate} ->
|
{:ok, aggregate} ->
|
||||||
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
case Api.aggregate(__MODULE__, query, aggregate, opts) do
|
||||||
{:ok, result} ->
|
{:ok, %{unquote(kind) => value}} ->
|
||||||
result
|
value
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
raise Ash.Error.to_error_class(error)
|
raise Ash.Error.to_error_class(error)
|
||||||
|
|
|
@ -28,6 +28,16 @@ defmodule Ash.Query.Aggregate do
|
||||||
@doc false
|
@doc false
|
||||||
def kinds, do: @kinds
|
def kinds, do: @kinds
|
||||||
|
|
||||||
|
def new!(resource, name, kind, opts \\ []) do
|
||||||
|
case new(resource, name, kind, opts) do
|
||||||
|
{:ok, aggregate} ->
|
||||||
|
aggregate
|
||||||
|
|
||||||
|
{:error, error} ->
|
||||||
|
raise Ash.Error.to_error_class(error)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
@doc """
|
@doc """
|
||||||
Create a new aggregate, used with `Query.aggregate` or `Api.aggregate`
|
Create a new aggregate, used with `Query.aggregate` or `Api.aggregate`
|
||||||
|
|
||||||
|
@ -75,7 +85,16 @@ defmodule Ash.Query.Aggregate do
|
||||||
attribute_type =
|
attribute_type =
|
||||||
if field do
|
if field do
|
||||||
related = Ash.Resource.Info.related(resource, relationship)
|
related = Ash.Resource.Info.related(resource, relationship)
|
||||||
Ash.Resource.Info.field(related, field).type
|
|
||||||
|
case Ash.Resource.Info.field(related, field) do
|
||||||
|
%{type: type} ->
|
||||||
|
{:ok, type}
|
||||||
|
|
||||||
|
_ ->
|
||||||
|
{:error, "No such field for #{inspect(related)}: #{inspect(field)}"}
|
||||||
|
end
|
||||||
|
else
|
||||||
|
{:ok, nil}
|
||||||
end
|
end
|
||||||
|
|
||||||
default =
|
default =
|
||||||
|
@ -85,7 +104,8 @@ defmodule Ash.Query.Aggregate do
|
||||||
default
|
default
|
||||||
end
|
end
|
||||||
|
|
||||||
with :ok <- validate_path(resource, List.wrap(relationship)),
|
with {:ok, attribute_type} <- attribute_type,
|
||||||
|
:ok <- validate_path(resource, List.wrap(relationship)),
|
||||||
{:ok, type} <- get_type(kind, type, attribute_type),
|
{:ok, type} <- get_type(kind, type, attribute_type),
|
||||||
{:ok, query} <- validate_query(query) do
|
{:ok, query} <- validate_query(query) do
|
||||||
{:ok,
|
{:ok,
|
||||||
|
|
Loading…
Reference in a new issue