OXYGENHUB

Coverage / crates/spectra-core/src/projections.rs 100.0%

9 of 9 lines run, 2 of 4 functions · run #5 on main · run missed

1
//! Projections (spec §9.3): tables kept from the ledger in the same
2
//! transaction as each append, and rebuilt from it by `spectra admin
3
//! rebuild`. Every table here must be a function of the events alone; the
4
//! test harness and `spectra admin check` hold them to it.
5
6
use crate::event::Event;
7
use sqlx::SqliteConnection;
8
9
/// The projection tables, in the order they are cleared and compared.
10
pub const TABLES: &[&str] = &["event_counts", "identities", "agents"];
11
12
/// Apply one event to every projection.
1341741×
pub async fn apply(conn: &mut SqliteConnection, e: &Event) -> sqlx::Result<()> {
1441741×
    sqlx::query("INSERT INTO event_counts (kind, n) VALUES (?, 1) ON CONFLICT(kind) DO UPDATE SET n = n + 1")
1541741×
        .bind(&e.kind)
1641741×
        .execute(&mut *conn)
1741741×
        .await?;
1841741×
    crate::principals::project(conn, e).await?;
1941741×
    Ok(())
2041741×
}