defmodule Ash.Query.Ref do @moduledoc "Represents a relation/attribute reference" defstruct [:attribute, :relationship_path, :resource, :simple_equality?, :bare?, :input?] @doc "Returns the referenced field" def name(%__MODULE__{attribute: %{name: name}}), do: name def name(%__MODULE__{attribute: name}), do: name defimpl Inspect do def inspect(ref, _opts) do case ref.attribute do %Ash.Query.Calculation{} -> case Map.drop(ref.attribute.context || %{}, [:context, :ash]) do empty when empty == %{} -> inspect_ref(ref) args -> inspect(%Ash.Query.Call{ name: ref.attribute.name, relationship_path: ref.relationship_path, args: [args] }) end %Ash.Query.Aggregate{} -> inspect_ref(ref) _ -> inspect_ref(ref) end end defp inspect_ref(ref) do name = case ref.attribute do %{name: name} -> name name -> name end name = if is_binary(name) or is_atom(name) do to_string(name) else inspect(name) end case ref.relationship_path do [] -> name path -> Enum.map_join(path, ".", fn item -> case item do %struct{} when struct in [Ash.Query.Aggregate, Ash.Query.Calculation] -> inspect(item) %{name: name} -> name name -> name end end) <> "." <> "#{name}" end end end end