defmodule Ash.Query.Exists do @moduledoc """ Determines if a given related entity exists. """ defstruct [:path, :expr, at_path: []] def new(path, expr, at_path \\ []) def new([], expr, _) do raise "Cannot construct an exists query with an empty path, at #{inspect(%__MODULE__{path: [], expr: expr})}" end def new(path, %__MODULE__{at_path: [], expr: inner_expr, path: inner_path}, at_path) do %__MODULE__{at_path: at_path, expr: inner_expr, path: path ++ inner_path} end def new(path, expr, at_path) do %__MODULE__{path: path, expr: expr, at_path: at_path} end defimpl Inspect do import Inspect.Algebra def inspect(%{path: path, expr: expr, at_path: at_path}, opts) do if at_path && at_path != [] do concat([ Enum.join(at_path, "."), ".", "exists(", Enum.join(path, "."), ", ", to_doc(expr, opts), ")" ]) else concat(["exists(", Enum.join(path, "."), ", ", to_doc(expr, opts), ")"]) end end end end