Skip to main content

kaizen/store/sqlite/
session_window.rs

1use super::*;
2
3impl Store {
4    /// Sessions with at least one event timestamp falling in `[start_ms, end_ms]` (same rules as retro window).
5    pub fn sessions_active_in_window(
6        &self,
7        workspace: &str,
8        start_ms: u64,
9        end_ms: u64,
10    ) -> Result<HashSet<String>> {
11        let mut stmt = self.conn.prepare(
12            "SELECT DISTINCT s.id
13             FROM sessions s
14             WHERE s.workspace = ?1
15               AND EXISTS (
16                 SELECT 1 FROM events e
17                 WHERE e.session_id = s.id
18                   AND (
19                     (e.ts_ms >= ?2 AND e.ts_ms <= ?3)
20                     OR (e.ts_ms < ?4 AND s.started_at_ms >= ?2 AND s.started_at_ms <= ?3)
21                   )
22               )",
23        )?;
24        let out: HashSet<String> = stmt
25            .query_map(
26                params![
27                    workspace,
28                    start_ms as i64,
29                    end_ms as i64,
30                    SYNTHETIC_TS_CEILING_MS,
31                ],
32                |r| r.get(0),
33            )?
34            .filter_map(|r| r.ok())
35            .collect();
36        Ok(out)
37    }
38}