kaizen/store/sqlite/
session_window.rs1use super::*;
2
3impl Store {
4 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}