232 lines
5.2 KiB
Markdown
232 lines
5.2 KiB
Markdown
|
|
# ASL/TGK-EXEC-PLAN/1 -- Unified Execution Plan Semantics
|
||
|
|
|
||
|
|
Status: Draft
|
||
|
|
Owner: Architecture
|
||
|
|
Version: 0.1.0
|
||
|
|
SoT: No
|
||
|
|
Last Updated: 2025-01-17
|
||
|
|
Tags: [execution, query, tgk, determinism]
|
||
|
|
|
||
|
|
**Document ID:** `ASL/TGK-EXEC-PLAN/1`
|
||
|
|
**Layer:** L2 -- Execution plan semantics (no encoding)
|
||
|
|
|
||
|
|
**Depends on (normative):**
|
||
|
|
|
||
|
|
* `ASL/1-CORE-INDEX`
|
||
|
|
* `ASL/LOG/1`
|
||
|
|
* `ASL/INDEX-ACCEL/1`
|
||
|
|
* `TGK/1`
|
||
|
|
|
||
|
|
**Informative references:**
|
||
|
|
|
||
|
|
* `ASL/SYSTEM/1`
|
||
|
|
* `ENC-ASL-CORE-INDEX`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 0. Conventions
|
||
|
|
|
||
|
|
The key words **MUST**, **MUST NOT**, **REQUIRED**, **SHOULD**, and **MAY** are to be interpreted as in RFC 2119.
|
||
|
|
|
||
|
|
ASL/TGK-EXEC-PLAN/1 defines execution plan semantics for querying artifacts and TGK edges. It does not define encoding, transport, or runtime scheduling.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 1. Purpose
|
||
|
|
|
||
|
|
This document defines the operator model and determinism rules for executing queries over ASL artifacts and TGK edges using snapshot-bounded visibility.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2. Execution Plan Model (Normative)
|
||
|
|
|
||
|
|
An execution plan is a DAG of operators:
|
||
|
|
|
||
|
|
```
|
||
|
|
Plan = { nodes: [Op], edges: [(Op -> Op)] }
|
||
|
|
```
|
||
|
|
|
||
|
|
Each operator includes:
|
||
|
|
|
||
|
|
* `op_id`: unique identifier
|
||
|
|
* `op_type`: operator type
|
||
|
|
* `inputs`: upstream operator outputs
|
||
|
|
* `snapshot`: `(SnapshotID, LogPrefix)`
|
||
|
|
* `constraints`: canonical filters
|
||
|
|
* `projections`: output fields
|
||
|
|
* `traversal`: optional traversal parameters
|
||
|
|
* `aggregation`: optional aggregation parameters
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 2.1 Query Abstraction (Informative)
|
||
|
|
|
||
|
|
A query can be represented as:
|
||
|
|
|
||
|
|
```
|
||
|
|
Q = {
|
||
|
|
snapshot: S,
|
||
|
|
constraints: C,
|
||
|
|
projections: P,
|
||
|
|
traversal: optional,
|
||
|
|
aggregation: optional
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
Where:
|
||
|
|
|
||
|
|
* `constraints` describe canonical filters (artifact keys, type tags, edge types, roles, node IDs).
|
||
|
|
* `projections` select output fields.
|
||
|
|
* `traversal` declares TGK traversal depth and direction.
|
||
|
|
* `aggregation` defines deterministic reduction operations.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 3. Deterministic Ordering (Normative)
|
||
|
|
|
||
|
|
All operator outputs MUST be ordered by:
|
||
|
|
|
||
|
|
1. `logseq` ascending
|
||
|
|
2. canonical key ascending (tie-breaker)
|
||
|
|
|
||
|
|
Parallel execution MUST preserve this order.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 4. Visibility Rules (Normative)
|
||
|
|
|
||
|
|
Records are visible if and only if:
|
||
|
|
|
||
|
|
* `record.logseq <= snapshot.log_prefix`
|
||
|
|
* The record is not shadowed by a later tombstone
|
||
|
|
|
||
|
|
Unknown record types MUST be skipped without breaking determinism.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 5. Operator Types (Normative)
|
||
|
|
|
||
|
|
### 5.1 SegmentScan
|
||
|
|
|
||
|
|
* Inputs: sealed segments
|
||
|
|
* Outputs: raw record references
|
||
|
|
* Rules:
|
||
|
|
* Only segments with `segment.logseq_min <= snapshot.log_prefix` are scanned.
|
||
|
|
* Advisory filters MAY be applied but MUST NOT introduce false negatives.
|
||
|
|
* Shard routing MAY be applied prior to scan if deterministic.
|
||
|
|
|
||
|
|
### 5.2 IndexFilter
|
||
|
|
|
||
|
|
* Inputs: record stream
|
||
|
|
* Outputs: filtered record stream
|
||
|
|
* Rules:
|
||
|
|
* Applies canonical constraints (artifact key, type tag, TGK edge type, roles).
|
||
|
|
* Filters MUST be exact; advisory filters are not sufficient.
|
||
|
|
|
||
|
|
### 5.3 TombstoneShadow
|
||
|
|
|
||
|
|
* Inputs: record stream + tombstone stream
|
||
|
|
* Outputs: visible records only
|
||
|
|
* Rules:
|
||
|
|
* Later tombstones shadow earlier entries with the same canonical key.
|
||
|
|
|
||
|
|
### 5.4 Merge
|
||
|
|
|
||
|
|
* Inputs: multiple ordered streams
|
||
|
|
* Outputs: single ordered stream
|
||
|
|
* Rules:
|
||
|
|
* Order is `logseq` then canonical key.
|
||
|
|
* Merge MUST be deterministic regardless of shard order.
|
||
|
|
|
||
|
|
### 5.5 Projection
|
||
|
|
|
||
|
|
* Inputs: record stream
|
||
|
|
* Outputs: projected fields
|
||
|
|
* Rules:
|
||
|
|
* Projection MUST preserve input order.
|
||
|
|
|
||
|
|
### 5.6 TGKTraversal
|
||
|
|
|
||
|
|
* Inputs: seed node set
|
||
|
|
* Outputs: edge and/or node stream
|
||
|
|
* Rules:
|
||
|
|
* Expansion MUST respect snapshot bounds.
|
||
|
|
* Traversal depth MUST be explicit.
|
||
|
|
* Order MUST follow deterministic ordering rules.
|
||
|
|
|
||
|
|
### 5.7 Aggregation (Optional)
|
||
|
|
|
||
|
|
* Inputs: record stream
|
||
|
|
* Outputs: aggregate results
|
||
|
|
* Rules:
|
||
|
|
* Aggregation MUST be deterministic given identical inputs and snapshot.
|
||
|
|
|
||
|
|
### 5.8 LimitOffset (Optional)
|
||
|
|
|
||
|
|
* Inputs: ordered record stream
|
||
|
|
* Outputs: ordered slice
|
||
|
|
* Rules:
|
||
|
|
* Applies pagination or top-N selection.
|
||
|
|
* MUST preserve deterministic order from upstream operators.
|
||
|
|
|
||
|
|
### 5.9 ShardDispatch (Optional)
|
||
|
|
|
||
|
|
* Inputs: shard-local streams
|
||
|
|
* Outputs: ordered global stream
|
||
|
|
* Rules:
|
||
|
|
* Shard execution MAY be parallel.
|
||
|
|
* Merge MUST preserve deterministic ordering by `logseq` then canonical key.
|
||
|
|
|
||
|
|
### 5.10 SIMDFilter (Optional)
|
||
|
|
|
||
|
|
* Inputs: record stream
|
||
|
|
* Outputs: filtered record stream
|
||
|
|
* Rules:
|
||
|
|
* SIMD filters are advisory accelerators.
|
||
|
|
* Canonical checks MUST still be applied before output.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 6. Acceleration Constraints (Normative)
|
||
|
|
|
||
|
|
Acceleration mechanisms (filters, routing, SIMD) MUST be observationally invisible:
|
||
|
|
|
||
|
|
* False positives are permitted.
|
||
|
|
* False negatives are forbidden.
|
||
|
|
* Canonical checks MUST always be applied before returning results.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 7. Plan Serialization (Optional)
|
||
|
|
|
||
|
|
Execution plans MAY be serialized for reuse or deterministic replay.
|
||
|
|
|
||
|
|
```c
|
||
|
|
struct exec_plan {
|
||
|
|
uint32_t plan_version;
|
||
|
|
uint32_t operator_count;
|
||
|
|
struct operator_def operators[];
|
||
|
|
struct operator_edge edges[];
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
Serialization MUST preserve operator parameters, snapshot bounds, and DAG edges.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 8. GC Safety (Informative)
|
||
|
|
|
||
|
|
Records and edges MUST NOT be removed if they appear in a snapshot or are
|
||
|
|
reachable via traversal at that snapshot.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## 9. Non-Goals
|
||
|
|
|
||
|
|
ASL/TGK-EXEC-PLAN/1 does not define:
|
||
|
|
|
||
|
|
* Runtime scheduling or parallelization strategy
|
||
|
|
* Encoding of operator plans
|
||
|
|
* Query languages or APIs
|
||
|
|
* Operator cost models
|