AshArcadic.DataLayer.Info (AshArcadic v0.1.0)

Copy Markdown View Source

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

attribute_map(resource)

@spec attribute_map(Ash.Resource.t()) :: %{required(atom()) => String.t()}

attribute_types(resource)

@spec attribute_types(Ash.Resource.t()) :: %{
  required(atom()) => {Ash.Type.t(), keyword()}
}

client(resource)

@spec client(Ash.Resource.t()) :: module() | nil

database(resource)

@spec database(Ash.Resource.t()) :: String.t() | nil

edges(resource)

@spec edges(Ash.Resource.t()) :: [AshArcadic.Edge.t()]

label(resource)

@spec label(Ash.Resource.t()) :: atom() | String.t()

sensitive(resource)

@spec sensitive(Ash.Resource.t()) :: [atom()]

skip(resource)

@spec skip(Ash.Resource.t()) :: [atom()]

sparse_vector_index(resource, name)

@spec sparse_vector_index(Ash.Resource.t(), atom()) ::
  AshArcadic.SparseVectorIndex.t() | nil

sparse_vector_indexes(resource)

@spec sparse_vector_indexes(Ash.Resource.t()) :: [AshArcadic.SparseVectorIndex.t()]

stored_field?(resource, field)

@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).

tenant_database(resource)

@spec tenant_database(Ash.Resource.t()) :: {module(), atom(), list()} | nil

value_translatable_field?(resource, field)

@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).

vector_index(resource, name)

@spec vector_index(Ash.Resource.t(), atom()) :: AshArcadic.VectorIndex.t() | nil

vector_indexes(resource)

@spec vector_indexes(Ash.Resource.t()) :: [AshArcadic.VectorIndex.t()]