defmodule Ash.Resource.Transformers.CacheRelationships do @moduledoc """ Persists commonly used relationship information. """ use Spark.Dsl.Transformer alias Spark.Dsl.Transformer def after?(_), do: true def transform(dsl_state) do relationships = Ash.Resource.Info.relationships(dsl_state) relationships_by_name = relationships |> Enum.reduce(%{}, fn %{name: name} = attr, acc -> acc |> Map.put(name, attr) |> Map.put(to_string(name), attr) end) relationship_names = Enum.map(relationships, & &1.name) required_belongs_to_relationships = Enum.filter(relationships, &(&1.type == :belongs_to && !&1.allow_nil?)) {:ok, persist( dsl_state, %{ relationship_names: relationship_names, relationships_by_name: relationships_by_name, required_belongs_to_relationships: required_belongs_to_relationships } )} end defp persist(dsl, map) do Enum.reduce(map, dsl, fn {key, value}, dsl -> Transformer.persist(dsl, key, value) end) end end