OXYGENHUB

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

11 of 11 lines run, 2 of 4 functions · run #6 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", "projects", "project_relations", "presence", "sessions"];
11
12
/// Apply one event to every projection.
1341790×
pub async fn apply(conn: &mut SqliteConnection, e: &Event) -> sqlx::Result<()> {
1441790×
    sqlx::query("INSERT INTO event_counts (kind, n) VALUES (?, 1) ON CONFLICT(kind) DO UPDATE SET n = n + 1")
1541790×
        .bind(&e.kind)
1641790×
        .execute(&mut *conn)
1741790×
        .await?;
1841790×
    crate::principals::project(conn, e).await?;
1941790×
    crate::projects::project(conn, e).await?;
2041790×
    crate::presence::project(conn, e).await?;
2141790×
    Ok(())
2241790×
}