mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 05:23:03 +12:00
fix: optimizations around allocating strings
fix: optimizations around list operations for embedded resources
This commit is contained in:
parent
a719c791ba
commit
ae2b737e87
2 changed files with 21 additions and 8 deletions
|
@ -241,7 +241,9 @@ defmodule Ash.EmbeddableType do
|
||||||
Enum.empty?(Ash.Resource.Info.validations(__MODULE__, action.type)) &&
|
Enum.empty?(Ash.Resource.Info.validations(__MODULE__, action.type)) &&
|
||||||
Enum.empty?(Ash.Resource.Info.notifiers(__MODULE__)) &&
|
Enum.empty?(Ash.Resource.Info.notifiers(__MODULE__)) &&
|
||||||
Enum.empty?(Ash.Resource.Info.relationships(__MODULE__)) do
|
Enum.empty?(Ash.Resource.Info.relationships(__MODULE__)) do
|
||||||
Enum.reduce_while(values, {:ok, []}, fn {value, index}, {:ok, results} ->
|
has_structs? = Enum.empty?(structs)
|
||||||
|
|
||||||
|
Enum.reduce_while(values, {:ok, structs}, fn {value, index}, {:ok, results} ->
|
||||||
Enum.reduce_while(value, {:ok, index, %{__struct__: __MODULE__}}, fn {key, value},
|
Enum.reduce_while(value, {:ok, index, %{__struct__: __MODULE__}}, fn {key, value},
|
||||||
{:ok, index,
|
{:ok, index,
|
||||||
acc} ->
|
acc} ->
|
||||||
|
@ -304,7 +306,11 @@ defmodule Ash.EmbeddableType do
|
||||||
end)
|
end)
|
||||||
|> case do
|
|> case do
|
||||||
{:ok, result} ->
|
{:ok, result} ->
|
||||||
{:cont, {:ok, [result | results]}}
|
if has_structs? do
|
||||||
|
{:cont, {:ok, [{result, index} | results]}}
|
||||||
|
else
|
||||||
|
{:cont, {:ok, [result | results]}}
|
||||||
|
end
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:halt, {:error, index, error}}
|
{:halt, {:error, index, error}}
|
||||||
|
@ -316,7 +322,11 @@ defmodule Ash.EmbeddableType do
|
||||||
end)
|
end)
|
||||||
|> case do
|
|> case do
|
||||||
{:ok, values} ->
|
{:ok, values} ->
|
||||||
{:ok, Enum.reverse(values)}
|
if has_structs? do
|
||||||
|
{:ok, values |> Enum.sort_by(&elem(&1, 1)) |> Enum.map(&elem(&1, 0))}
|
||||||
|
else
|
||||||
|
{:ok, Enum.reverse(values)}
|
||||||
|
end
|
||||||
|
|
||||||
{:error, index, error} ->
|
{:error, index, error} ->
|
||||||
{:error, Ash.Error.set_path(Ash.Error.to_ash_error(error), index)}
|
{:error, Ash.Error.set_path(Ash.Error.to_ash_error(error), index)}
|
||||||
|
@ -348,6 +358,9 @@ defmodule Ash.EmbeddableType do
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|> case do
|
|> case do
|
||||||
|
%{status: :success, records: records} when structs == [] ->
|
||||||
|
{:ok, records}
|
||||||
|
|
||||||
%{status: :success, records: records} ->
|
%{status: :success, records: records} ->
|
||||||
Enum.reduce(structs, {:ok, records}, fn {struct, index}, {:ok, records} ->
|
Enum.reduce(structs, {:ok, records}, fn {struct, index}, {:ok, records} ->
|
||||||
{:ok, List.insert_at(records, index, struct)}
|
{:ok, List.insert_at(records, index, struct)}
|
||||||
|
|
|
@ -409,12 +409,12 @@ defmodule Ash.Helpers do
|
||||||
] do
|
] do
|
||||||
domain = Ash.Helpers.get_domain(subject, opts)
|
domain = Ash.Helpers.get_domain(subject, opts)
|
||||||
|
|
||||||
expanded =
|
|
||||||
if not is_nil(subject) do
|
|
||||||
"\n\n#{inspect(subject)}"
|
|
||||||
end
|
|
||||||
|
|
||||||
if !domain do
|
if !domain do
|
||||||
|
expanded =
|
||||||
|
if not is_nil(subject) do
|
||||||
|
"\n\n#{inspect(subject)}"
|
||||||
|
end
|
||||||
|
|
||||||
raise(
|
raise(
|
||||||
ArgumentError,
|
ArgumentError,
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in a new issue