use libsql::Builder;
use macrame::prelude::*;
const TS: &str = "2026-01-01T00:00:00.000000Z";
const VALID_AT: &str = "2026-06-01T00:00:00.000000Z";
const RECORDED_AT: &str = "2026-06-01T00:00:00.000000Z";
const HUB_EDGES: usize = 150;
const LEAF_EDGES: usize = 60;
const CONCEPTS: usize = 260;
#[tokio::main]
async fn main() {
let dir = tempfile::TempDir::new().unwrap();
let db = Database::open_with_cadence(&dir.path().join("p.db"), None)
.await
.unwrap();
let concepts: Vec<ConceptUpsert> = (0..CONCEPTS)
.map(|i| ConceptUpsert::new(format!("c{i:04}"), "N").valid_from(TS))
.collect();
db.write_concepts(concepts).await.unwrap();
let mut edges = Vec::new();
for i in 1..=HUB_EDGES {
edges.push(EdgeAssertion::new("c0000", format!("c{i:04}"), "LINKS").valid_from(TS));
}
for i in (HUB_EDGES + 1)..=(HUB_EDGES + LEAF_EDGES) {
edges.push(
EdgeAssertion::new(format!("c{i:04}"), format!("c{:04}", i + 1), "LINKS")
.valid_from(TS),
);
}
db.write_bulk_atomic(edges).await.unwrap();
db.analyze().await.unwrap();
let conn = db.read_conn();
let log_rows: i64 = {
let mut r = conn
.query("SELECT COUNT(*) FROM transaction_log", ())
.await
.unwrap();
r.next().await.unwrap().unwrap().get(0).unwrap()
};
println!("transaction_log rows: {log_rows}");
let arms: [(&str, TraversalBuilder); 3] = [
(
"valid time only",
TraversalBuilder::new("c0000")
.max_depth(2)
.as_of_valid(VALID_AT),
),
(
"transaction time only",
TraversalBuilder::new("c0000")
.max_depth(2)
.as_of_recorded(RECORDED_AT),
),
(
"both axes",
TraversalBuilder::new("c0000")
.max_depth(2)
.as_of_valid(VALID_AT)
.as_of_recorded(RECORDED_AT),
),
];
for (label, walk) in arms {
let sql = walk.build_sql();
println!("\n===== {label} =====");
let mut rows = conn
.query(&format!("EXPLAIN QUERY PLAN {sql}"), ())
.await
.unwrap();
while let Some(r) = rows.next().await.unwrap() {
println!(" {}", r.get::<String>(3).unwrap());
}
let mut r = conn.query(&format!("EXPLAIN {sql}"), ()).await.unwrap();
let (mut opens, mut seeks, mut rewinds, mut sorts) = (0usize, 0usize, 0usize, 0usize);
while let Some(row) = r.next().await.unwrap() {
let op: String = row.get(1).unwrap();
if op == "OpenRead" {
opens += 1;
} else if op.starts_with("Seek") || op == "NotExists" || op == "NotFound" {
seeks += 1;
} else if op == "Rewind" || op == "Last" {
rewinds += 1;
} else if op == "SorterOpen" || op == "SorterSort" {
sorts += 1;
}
}
println!(" opens={opens} seeks={seeks} rewinds={rewinds} sorter_ops={sorts}");
}
println!(
"
===== the fold's window, and where its ordering comes from ====="
);
for (label, from) in [
("planner's choice", "transaction_log"),
(
"forced onto the entity index",
"transaction_log INDEXED BY idx_txlog_entity",
),
] {
let sql = format!(
"SELECT payload, ROW_NUMBER() OVER (PARTITION BY entity_id ORDER BY seq_id DESC) AS rn FROM {from} WHERE table_name = 'links' AND recorded_at <= ?1"
);
let mut rows = conn
.query(&format!("EXPLAIN QUERY PLAN {sql}"), ())
.await
.unwrap();
let mut plan = Vec::new();
while let Some(r) = rows.next().await.unwrap() {
plan.push(r.get::<String>(3).unwrap());
}
println!(" {label:>28}: {}", plan.join(" | "));
}
let raw = Builder::new_local(dir.path().join("p.db"))
.build()
.await
.unwrap()
.connect()
.unwrap();
for ddl in [
"CREATE INDEX probe_txlog_valid_from ON transaction_log (json_extract(payload, '$.valid_from'))",
"CREATE INDEX probe_txlog_two_d ON transaction_log (recorded_at, json_extract(payload, '$.valid_from'))",
] {
raw.execute(ddl, ()).await.unwrap();
}
let _ = raw.query("ANALYZE", ()).await.unwrap();
let both = TraversalBuilder::new("c0000")
.max_depth(2)
.as_of_valid(VALID_AT)
.as_of_recorded(RECORDED_AT)
.build_sql();
println!("\n===== both axes, with the candidate indexes present =====");
let mut rows = raw
.query(&format!("EXPLAIN QUERY PLAN {both}"), ())
.await
.unwrap();
while let Some(r) = rows.next().await.unwrap() {
println!(" {}", r.get::<String>(3).unwrap());
}
drop(raw);
db.close().await.unwrap();
}