The declared plan for extracting nodes and edges from a payload. Pointer-based
(RFC 6901) and deterministic, so no model call is needed. Recorded on a graph
projection for discovery and as the extraction contract. Graph data is written
via the graph upsert op. Applying this plan to a bound source is managed-side.
Global reusable projection definition. Names the extraction rules that turn
a payload into a queryable row. Not attached to a topic on its own:
bindings (ProjectionBinding) declare where projections may apply.
Declares where a Projection is allowed to materialize. Bindings, not
projections, tell the worker what to consume. A binding pairs a source
selector (stream and topic) with a set of allowed projection refs, an
optional default, and the materialization target (which DB table to
write rows into).
Opaque projection identifier. Stable string the producer stamps on the
wire via the agdx.ref header and the worker keys its catalog by.
Recommended shape: "<name>.v<version>", e.g. "order.v1". Distinct from
schema_id, which selects a codec’s writer schema rather than a
materialization rule.
A registered writer schema, keyed by the id a producer stamps on
agdx.sid. Avro and Protobuf schemas decode their schema-first bodies. A
JSON Schema validates the decoded payload of a self-describing codec
(JSON, MessagePack, CBOR, BSON), which otherwise needs no entry here. Ids
are permanent: registering an occupied id with a different definition is
rejected managed-side, and dropping tombstones the definition.
Selects a single source (stream, topic) for v1. Both are required, since
a topic only exists within a stream. Future versions can extend this to
prefix, glob, or multi-stream selectors. Today the model is
one-topic-per-binding to keep routing simple.
One materialization sink for a binding: a named backend and table, the role
it plays, and its delivery guarantee. backend is a logical id LaserData
Cloud resolves against its configured backend set (the embedded engine is
embedded).
One control command on the control topic. The customer SDK (or any tool
driving LaserData Cloud) publishes these to register projections,
bindings, and schemas.
Storage-type hint for an indexed field. A hint, not a constraint: the
projector stores whatever scalar the payload carries either way. Columnar
backends use the hint for real column DDL.
What a projection materializes: queryable rows, or a knowledge graph of
nodes and edges. Rides the wire as a u8 code (the growable-dictionary pattern)
so a future kind flows through an old reader as
Unrecognized rather than failing the listing.
How long a binding’s materialized rows live, decoupled from the source
topic’s Iggy message_expiry. Lets a projection outlive (or undershoot)
the log it was built from.
The schema payload for a schema-first codec. Internally tagged on kind
({"kind":"avro","schema":...}) so an older client tolerates a newer
server’s unknown source kind: an unrecognized kind decodes to
SchemaSource::Unknown instead of failing the whole reply.