improvement: add a return_query/2 callback for data layers

This commit is contained in:
Zach Daniel 2023-12-29 17:33:23 -05:00
parent dcc280cb2d
commit b600b23803
3 changed files with 20 additions and 1 deletions

View file

@ -1473,6 +1473,8 @@ defmodule Ash.Actions.Read do
{:ok, query} <- set_tenant(query, ash_query),
{:ok, query} <-
Ash.DataLayer.lock(query, ash_query.lock, ash_query.resource),
{:ok, query} <-
Ash.DataLayer.return_query(query, ash_query.resource),
{:ok, results} <-
run_query(
set_phase(ash_query, :executing),

View file

@ -163,6 +163,9 @@ defmodule Ash.DataLayer do
) ::
{:ok, list(Ash.Resource.record())} | {:error, term}
@callback return_query(data_layer_query(), Ash.Resource.t()) ::
{:ok, data_layer_query()} | {:error, term}
@type bulk_options :: %{
batch_size: pos_integer,
return_records?: boolean,
@ -238,6 +241,7 @@ defmodule Ash.DataLayer do
run_query: 2,
bulk_create: 3,
distinct: 3,
return_query: 2,
lock: 3,
run_query_with_lateral_join: 4,
create: 2,
@ -385,6 +389,18 @@ defmodule Ash.DataLayer do
Ash.DataLayer.data_layer(resource).create(resource, changeset)
end
@spec return_query(data_layer_query(), Ash.Resource.t()) ::
{:ok, data_layer_query()} | {:error, term}
def return_query(query, resource) do
data_layer = Ash.DataLayer.data_layer(resource)
if function_exported?(data_layer, :return_query, 2) do
data_layer.return_query(query, resource)
else
{:ok, query}
end
end
@spec bulk_create(
Ash.Resource.t(),
Enumerable.t(Ash.Changeset.t()),

View file

@ -2626,7 +2626,8 @@ defmodule Ash.Query do
Ash.DataLayer.limit(query, ash_query.limit, resource),
{:ok, query} <-
Ash.DataLayer.offset(query, ash_query.offset, resource),
{:ok, query} <- Ash.DataLayer.lock(query, ash_query.lock, resource) do
{:ok, query} <- Ash.DataLayer.lock(query, ash_query.lock, resource),
{:ok, query} <- Ash.DataLayer.return_query(query, resource) do
if opts[:no_modify?] || !ash_query.action || !ash_query.action.modify_query do
{:ok, query}
else