137 lines
5.3 KiB
Plaintext
Raw Normal View History

2026-06-05 11:31:18 +02:00
digraph PlanRunnerWorkflow {
fontname = "Helvetica,Arial,sans-serif"
layout = dot
rankdir = LR
ranksep = 0.9;
nodesep = 0.7;
splines = true;
compound = true;
bgcolor = "white"
node [
fontname = "Helvetica,Arial,sans-serif",
shape = box,
style = "filled,rounded",
color = "#555555",
fillcolor = "white",
penwidth = 1.5
]
edge [
fontname = "Helvetica,Arial,sans-serif",
color = "#333333",
fontsize = 9,
fontcolor = "#555555",
labeldistance = 2.0,
penwidth = 1.2
]
subgraph cluster_input {
label = "Input"
style = "dashed"
color = "#888888"
fontcolor = "#555555"
margin = 18
json_plan [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>JSON Plan</b></td></tr>
<tr><td align="left" balign="left">• schema: name -&gt; arity</td></tr>
<tr><td align="left" balign="left">• facts: name -&gt; rows</td></tr>
<tr><td align="left" balign="left">• query: { root, nodes }</td></tr>
<tr><td align="left" balign="left">• expected_bindings (optional oracle)</td></tr>
</table>>, fillcolor = "#E8F4FD", color = "#2196F3"]
}
subgraph cluster_parse {
label = "Parse"
style = "dashed"
color = "#9C27B0"
fontcolor = "#7B1FA2"
margin = 14
parse_plan [label = "parse_plan(json)\n-&gt; Plan", fillcolor = "#F3E5F5", color = "#9C27B0"]
}
subgraph cluster_load {
label = "Load Tables (--backend selects the path)"
style = "dashed"
color = "#4CAF50"
fontcolor = "#388E3C"
margin = 14
build_pure [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>build_tables(plan)</b></td></tr>
<tr><td align="left" balign="left">--backend memory</td></tr>
<tr><td align="left" balign="left">direct from plan.facts</td></tr>
</table>>, fillcolor = "#E8F5E9", color = "#4CAF50"]
build_storage [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>build_tables_via_storage&lt;S: Storage&gt;</b></td></tr>
<tr><td align="left" balign="left">--backend memory-storage</td></tr>
<tr><td align="left" balign="left">--backend lmdb / redb / fjall</td></tr>
<tr><td align="left" balign="left">--backend sqlite / geomerge</td></tr>
<tr><td align="left" balign="left">create_relation → tx.insert → scan_as_table</td></tr>
</table>>, fillcolor = "#E8F5E9", color = "#4CAF50"]
tables_map [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>HashMap&lt;String, Table&gt;</b></td></tr>
<tr><td align="left" balign="left">positional rows per relation</td></tr>
</table>>, fillcolor = "#E8F4FD", color = "#2196F3"]
}
subgraph cluster_execute {
label = "Execute (walk node DAG in id order)"
style = "dashed"
color = "#FF9800"
fontcolor = "#F57C00"
margin = 14
execute_node [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>execute(tables, query)</b></td></tr>
<tr><td align="left" balign="left">Action::Scan → scan_atom</td></tr>
<tr><td align="left" balign="left">Action::Join Left → semijoin(l, r)</td></tr>
<tr><td align="left" balign="left">Action::Join Right → semijoin(r, l)</td></tr>
<tr><td align="left" balign="left">Action::Join Natural → natural_join(l, r)</td></tr>
<tr><td align="left" balign="left">cache per-node Relation; return root</td></tr>
</table>>, fillcolor = "#FFF3E0", color = "#FF9800"]
relation_out [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>Relation</b></td></tr>
<tr><td align="left" balign="left">columns: variables + wildcards</td></tr>
<tr><td align="left" balign="left">rows: bindings</td></tr>
</table>>, fillcolor = "#FFF3E0", color = "#FF9800"]
}
subgraph cluster_verify {
label = "Verify (when expected_bindings is present)"
style = "dashed"
color = "#9C27B0"
fontcolor = "#7B1FA2"
margin = 14
verify_node [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>verify(plan, relation)</b></td></tr>
<tr><td align="left" balign="left">project to expected.columns</td></tr>
<tr><td align="left" balign="left">multiset compare against expected.rows</td></tr>
</table>>, fillcolor = "#F3E5F5", color = "#9C27B0"]
}
subgraph cluster_output {
label = "Output"
style = "dashed"
color = "#888888"
fontcolor = "#555555"
margin = 18
stdout_json [label = <<table border="0" cellborder="0" cellspacing="0" cellpadding="4">
<tr><td align="center"><b>stdout JSON</b></td></tr>
<tr><td align="left" balign="left">{ columns, rows }</td></tr>
</table>>, fillcolor = "#ECEFF1", color = "#607D8B"]
oracle_pass [label = "Ok(true) / VerifyError\n(used by tests/examples.rs)", fillcolor = "#ECEFF1", color = "#607D8B"]
}
// Pipeline edges
json_plan -> parse_plan [color = "#2196F3"]
parse_plan -> build_pure [label = "Backend::Memory", color = "#9C27B0"]
parse_plan -> build_storage [label = "Backend::*Storage", color = "#9C27B0"]
build_pure -> tables_map [color = "#4CAF50"]
build_storage -> tables_map [color = "#4CAF50"]
tables_map -> execute_node [color = "#2196F3"]
parse_plan -> execute_node [style = "dashed", label = "plan.query", color = "#9C27B0"]
execute_node -> relation_out [color = "#FF9800"]
relation_out -> stdout_json [color = "#607D8B"]
relation_out -> verify_node [style = "dashed", color = "#FF9800"]
parse_plan -> verify_node [style = "dashed", label = "plan.expected_bindings", color = "#9C27B0"]
verify_node -> oracle_pass [color = "#9C27B0"]
}