Skip to main content

kaizen/store/sqlite/
report_windows.rs

1use super::*;
2
3impl Store {
4    /// Per-session sum of `cost_usd_e6` for events in the window (missing costs treated as 0).
5    pub fn session_costs_usd_e6_in_window(
6        &self,
7        workspace: &str,
8        start_ms: u64,
9        end_ms: u64,
10    ) -> Result<HashMap<String, i64>> {
11        let mut stmt = self.conn.prepare(
12            "SELECT e.session_id, SUM(COALESCE(e.cost_usd_e6, 0))
13             FROM events e
14             JOIN sessions s ON s.id = e.session_id
15             WHERE s.workspace = ?1
16               AND (
17                 (e.ts_ms >= ?2 AND e.ts_ms <= ?3)
18                 OR (e.ts_ms < ?4 AND s.started_at_ms >= ?2 AND s.started_at_ms <= ?3)
19               )
20             GROUP BY e.session_id",
21        )?;
22        let rows: Vec<(String, i64)> = stmt
23            .query_map(
24                params![
25                    workspace,
26                    start_ms as i64,
27                    end_ms as i64,
28                    SYNTHETIC_TS_CEILING_MS,
29                ],
30                |r| Ok((r.get(0)?, r.get(1)?)),
31            )?
32            .filter_map(|r| r.ok())
33            .collect();
34        Ok(rows.into_iter().collect())
35    }
36}