Introspection for the arcade do … end DSL section.
Summary
Functions
Whether field is a STORED ArcadeDB property — a declared attribute NOT in skip. It is the
only kind of field a n.<field> Cypher reference (sort or a value-reading aggregate) can name.
False for a calculation/aggregate NAME (not a declared attribute at all) and for a
declared-but-skipped attribute (never persisted as a property). Drives the fail-closed guards
on the record-read sort path (sort/3), the aggregate :first sort path, and the aggregate
value-reading field: a non-stored field fails LOUD value-free rather than emitting n.<field>
against a non-existent property, which ArcadeDB treats as null (a silently arbitrary sort /
a silent default aggregate value).
Whether field may be translated into a Cypher VALUE expression — a stored property
(stored_field?/2) that is not sensitive (app-side-encrypted binary; a plaintext op over
ciphertext is meaningless). The classification predicate for Cypher value-translation.
Query.Expression's Ref guard uses it; Filter.filterable_field?/2 is unified onto it in the
filter-wiring task, eliminating the S6 divergence class
(project_filter_guard_presence_predicate_coverage). Presence (is_nil) uses stored_field?/2
alone — a sensitive field IS presence-checkable (the documented oracle, D9).
Functions
@spec attribute_map(Ash.Resource.t()) :: %{required(atom()) => String.t()}
@spec attribute_types(Ash.Resource.t()) :: %{ required(atom()) => {Ash.Type.t(), keyword()} }
@spec client(Ash.Resource.t()) :: module() | nil
@spec database(Ash.Resource.t()) :: String.t() | nil
@spec edges(Ash.Resource.t()) :: [AshArcadic.Edge.t()]
@spec label(Ash.Resource.t()) :: atom() | String.t()
@spec sensitive(Ash.Resource.t()) :: [atom()]
@spec skip(Ash.Resource.t()) :: [atom()]
@spec sparse_vector_index(Ash.Resource.t(), atom()) :: AshArcadic.SparseVectorIndex.t() | nil
@spec sparse_vector_indexes(Ash.Resource.t()) :: [AshArcadic.SparseVectorIndex.t()]
@spec stored_field?(Ash.Resource.t(), atom()) :: boolean()
Whether field is a STORED ArcadeDB property — a declared attribute NOT in skip. It is the
only kind of field a n.<field> Cypher reference (sort or a value-reading aggregate) can name.
False for a calculation/aggregate NAME (not a declared attribute at all) and for a
declared-but-skipped attribute (never persisted as a property). Drives the fail-closed guards
on the record-read sort path (sort/3), the aggregate :first sort path, and the aggregate
value-reading field: a non-stored field fails LOUD value-free rather than emitting n.<field>
against a non-existent property, which ArcadeDB treats as null (a silently arbitrary sort /
a silent default aggregate value).
@spec tenant_database(Ash.Resource.t()) :: {module(), atom(), list()} | nil
@spec value_translatable_field?(Ash.Resource.t(), atom()) :: boolean()
Whether field may be translated into a Cypher VALUE expression — a stored property
(stored_field?/2) that is not sensitive (app-side-encrypted binary; a plaintext op over
ciphertext is meaningless). The classification predicate for Cypher value-translation.
Query.Expression's Ref guard uses it; Filter.filterable_field?/2 is unified onto it in the
filter-wiring task, eliminating the S6 divergence class
(project_filter_guard_presence_predicate_coverage). Presence (is_nil) uses stored_field?/2
alone — a sensitive field IS presence-checkable (the documented oracle, D9).
@spec vector_index(Ash.Resource.t(), atom()) :: AshArcadic.VectorIndex.t() | nil
@spec vector_indexes(Ash.Resource.t()) :: [AshArcadic.VectorIndex.t()]