pub struct ModelAdapter<A: AstAdapter> { /* private fields */ }Expand description
A base arbor enriched with a model’s derived structure.
Implementations§
Source§impl<A: AstAdapter> ModelAdapter<A>
impl<A: AstAdapter> ModelAdapter<A>
Trait Implementations§
Source§impl<A: AstAdapter> AstAdapter for ModelAdapter<A>
impl<A: AstAdapter> AstAdapter for ModelAdapter<A>
Source§fn aliased_metadata(&self, node: NodeId) -> &'static [&'static str]
fn aliased_metadata(&self, node: NodeId) -> &'static [&'static str]
Model nodes add their own annotations (n-rows); base nodes
keep the mounted adapter’s, aliases included.
Source§fn provenance(&self, node: NodeId) -> Provenance
fn provenance(&self, node: NodeId) -> Provenance
Data provenance. An aliased node is its base node under a
role, so it answers that node’s provenance. An elevated node
is a new value the model made: it answers a derivation source
only (model:/container), never the components of any row it
was computed from — the same no-leak discipline property
applies to elevated values.
Source§fn answers_to(&self, node: NodeId, name: &str) -> bool
fn answers_to(&self, node: NodeId, name: &str) -> bool
A written name reaches a node under its canonical name or
any alias the model declares for names.
Source§fn has_trait(&self, node: NodeId, name: &str) -> bool
fn has_trait(&self, node: NodeId, name: &str) -> bool
A written trait reaches a node under a canonical trait or any
alias <...> the model declares.
Source§fn document_by_ref(&self, id: &str) -> Option<NodeId>
fn document_by_ref(&self, id: &str) -> Option<NodeId>
The document the base holds under a URL — base ids pass straight through this layer.
Source§fn reverse_resolve(
&self,
node: NodeId,
property: Option<&str>,
hint: Option<&str>,
) -> Option<Vec<NodeId>>
fn reverse_resolve( &self, node: NodeId, property: Option<&str>, hint: Option<&str>, ) -> Option<Vec<NodeId>>
The base’s reverse index answers only when the model adds no reference fabric of its own; otherwise the walk sees both.
Source§fn descendants_named(
&self,
node: NodeId,
name: &str,
) -> Option<Vec<(NodeId, usize)>>
fn descendants_named( &self, node: NodeId, name: &str, ) -> Option<Vec<(NodeId, usize)>>
The base’s name index answers below any base node but the root (the model’s containers hang there) and only when no name alias could widen the match.
Source§fn children(&self, node: NodeId) -> Vec<NodeId>
fn children(&self, node: NodeId) -> Vec<NodeId>
node, in document order. Read moreSource§fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId>
fn children_named(&self, node: NodeId, name: &str) -> Vec<NodeId>
node whose edge name is exactly name —
the engine’s fast path for name-matcher child hops. The
default filters children; an adapter
whose containers cannot be enumerated (permission-scoped or
unbounded remote trees) overrides this with a direct,
name-addressed lookup. Must be observationally identical to
the default wherever enumeration works. The adapter owns the
name test: it may deliberately alias — resolve a name to a
node whose edge name differs (git revision syntax landing on
a hash-named commit) — and the engine will not re-filter.
Container-scoped resolution like that stays child-axis only;
per-node spelling aliases belong in
answers_to, which this default
consults.Source§fn name(&self, node: NodeId) -> Option<String>
fn name(&self, node: NodeId) -> Option<String>
node — the label of its incoming tree edge. Read moreSource§fn traits(&self, node: NodeId) -> Vec<String>
fn traits(&self, node: NodeId) -> Vec<String>
node — its adapter-defined classifications,
used by <trait> navigation filters (e.g. a filesystem
adapter’s <dir>, <code>, <image>).Source§fn property(&self, node: NodeId, name: &str) -> Option<Value>
fn property(&self, node: NodeId, name: &str) -> Option<Value>
node — ::prop. None if absent.Source§fn default_value(&self, node: NodeId) -> Option<Value>
fn default_value(&self, node: NodeId) -> Option<Value>
node — bare ::, adapter-specific
(a filesystem adapter returns file content).Source§fn metadata(&self, node: NodeId, key: &str) -> Option<Value>
fn metadata(&self, node: NodeId, key: &str) -> Option<Value>
::::key (a filesystem adapter’s
size, modified, permissions, …). None if absent.Source§fn provenance_list(&self, node: NodeId) -> ProvenanceList
fn provenance_list(&self, node: NodeId) -> ProvenanceList
node as a list — every source the
substrate records for the datum, and how many it elides.
The default is the singular answer as a one-entry list; an
adapter whose substrate records several (kaiv’s ?a;b;+N)
overrides it, and a wrapper layers each entry.Source§fn resolve(
&self,
node: NodeId,
property: &str,
hint: Option<&str>,
) -> Option<NodeId>
fn resolve( &self, node: NodeId, property: &str, hint: Option<&str>, ) -> Option<NodeId>
::property-->hint maps node’s
property (a value that references another node) to its target,
with an optional adapter-specific hint (a relation type such as
an html rel, or a target container such as a table). A JSON
adapter resolves a $ref JSON Pointer; None if unresolvable.Source§fn external_ref(
&self,
node: NodeId,
property: &str,
hint: Option<&str>,
) -> Option<String>
fn external_ref( &self, node: NodeId, property: &str, hint: Option<&str>, ) -> Option<String>
node’s property holds, if any: an
adapter-defined identifier of a document outside this
arbor — for html, the anchor’s absolute URL, a relative
href joined against the document’s own URL. A #fragment
part is the crossref within the target document and rides
along (URI semantics). Consulted by ::property--> when
in-document resolution misses: a mounted document with that
identifier answers (the fragment’s element, else its root),
an unmounted one lands among the run’s unresolved external
references for the host’s acquisition loop. The engine
itself never fetches.Source§fn resolve_fragment(&self, node: NodeId, fragment: &str) -> Option<NodeId>
fn resolve_fragment(&self, node: NodeId, fragment: &str) -> Option<NodeId>
fragment names inside the document node
belongs to — html’s id lookup. The landing rung of a
fragment-carrying external reference, once its document is
mounted.Source§fn ref_property(&self, node: NodeId) -> Option<String>
fn ref_property(&self, node: NodeId) -> Option<String>
node’s own reference, for the bare
arrow (//a-->): an html anchor’s href, an iframe’s
src. None for a node that references nothing.Source§fn ref_label(&self, node: NodeId, property: &str) -> Option<String>
fn ref_label(&self, node: NodeId, property: &str) -> Option<String>
node via
property carries — html’s rel attribute. None falls
back to the property name as the edge label.Source§fn links(&self, node: NodeId) -> Vec<(String, NodeId)>
fn links(&self, node: NodeId) -> Vec<(String, NodeId)>
node, as (label, target) pairs,
for -> navigation (a filesystem adapter’s symlinks).Source§fn backlinks(&self, node: NodeId) -> Vec<(String, NodeId)>
fn backlinks(&self, node: NodeId) -> Vec<(String, NodeId)>
node, as (label, source) pairs, for
<- navigation. May be expensive (an adapter that does not
precompute edges must search for referrers).Source§fn prefetch_links(&self, nodes: &[NodeId], dir: LinkDir)
fn prefetch_links(&self, nodes: &[NodeId], dir: LinkDir)
dir
crosslinks from every node in nodes. An adapter backed by
a store may fetch them in one statement; semantics are
unchanged either way.Source§fn quantifier_bound(&self) -> usize
fn quantifier_bound(&self) -> usize
+, *, {m,}) expand, and the ceiling of any
explicit {m,n} (the effective upper bound is min(n, N_max)).
An adapter whose natural structures run deep may raise it; the
CLI overrides it per run (qua --quantifier-bound).Source§fn allow_shell(&self) -> bool
fn allow_shell(&self) -> bool
sh(...) pipeline stage may run external
commands. False by default — query text stays inert data —
and enabled per run by the CLI (qua --allow-shell) through
the AllowShell wrapper.Source§fn invocation_instant(&self) -> Option<(i64, u32)>
fn invocation_instant(&self) -> Option<(i64, u32)>
now() denotes (spec: The Temporal
Fragment, Determinism): one UTC timeline point bound by the
runner BEFORE evaluation begins — evaluation itself never
reads a clock. None by default (a library run is fully
deterministic; now() reads as null); the CLI binds it at
startup — pinnable with qua --now — through the
WithNow wrapper.Source§fn unit_scale(&self, expr: &str) -> Option<(f64, String)>
fn unit_scale(&self, expr: &str) -> Option<(f64, String)>
[::range < '50kellicam'] resolves through the
document’s .!units imports.Source§fn link_property(
&self,
_source: NodeId,
_label: &str,
_target: NodeId,
_name: &str,
) -> Option<Value>
fn link_property( &self, _source: NodeId, _label: &str, _target: NodeId, _name: &str, ) -> Option<Value>
source --label--> target — the
$-::prop read. Adapters whose edges carry data (a property
graph’s relationship properties) override this; None if the
edge is bare or unknown. Where parallel edges share source,
label, and target, the adapter answers for one of them,
consistently.Source§fn descendants_where(
&self,
_node: NodeId,
_name: &str,
_property: &str,
_value: &Value,
) -> Option<Vec<(NodeId, usize)>>
fn descendants_where( &self, _node: NodeId, _name: &str, _property: &str, _value: &Value, ) -> Option<Vec<(NodeId, usize)>>
node named name whose property
property equals value, each with its depth, in document
order — the fast path behind //name[::property = "value"]
for an adapter that indexes a property (the corpus reading’s
positional index answers //token[::lower = "tom"] from it).
None keeps the engine’s walk and its comparison; Some
must be exactly what the walk would find under the standard
equality, so an adapter answers only the values it can
compare as the engine does (text against text).Source§fn has_node(&self, node: NodeId) -> bool
fn has_node(&self, node: NodeId) -> bool
node is an id this adapter minted — the guard
behind the node-id anchor ((!N)), which may name an id
from an earlier run (ids are minted deterministically: the
same source, the same ids). The default probes the id
through parent and name and treats a panic as absence,
so an adapter that indexes by id needs no override; one that
can answer cheaply should.