Coverage for chalicelib/core/sessions/sessions_search_pg.py: 0%
22 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:56 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 12:56 +0000
1import logging
3from chalicelib.core import metadata
4from chalicelib.utils import pg_client, helper
6logger = logging.getLogger(__name__)
8SESSION_PROJECTION_BASE_COLS = """s.project_id,
9s.session_id::text AS session_id,
10s.user_uuid,
11s.user_id,
12s.user_os,
13s.user_browser,
14s.user_device,
15s.user_device_type,
16s.user_country,
17s.user_city,
18s.user_state,
19s.start_ts,
20s.duration,
21s.events_count,
22s.pages_count,
23s.errors_count,
24s.user_anonymous_id,
25s.platform,
26s.timezone,
27to_jsonb(s.issue_types) AS issue_types """
29SESSION_PROJECTION_COLS = SESSION_PROJECTION_BASE_COLS + """,
30favorite_sessions.session_id NOTNULL AS favorite,
31COALESCE((SELECT TRUE
32 FROM public.user_viewed_sessions AS fs
33 WHERE s.session_id = fs.session_id
34 AND fs.user_id = %(userId)s LIMIT 1), FALSE) AS viewed """
37def search_sessions_by_ids(project_id: int, session_ids: list, sort_by: str = 'session_id',
38 ascending: bool = False) -> dict:
39 if session_ids is None or len(session_ids) == 0:
40 return {"total": 0, "sessions": [], "_src": 1}
41 with pg_client.PostgresClient() as cur:
42 meta_keys = metadata.get(project_id=project_id)
43 params = {"project_id": project_id, "session_ids": tuple(session_ids)}
44 order_direction = 'ASC' if ascending else 'DESC'
45 main_query = cur.mogrify(f"""SELECT {SESSION_PROJECTION_BASE_COLS}
46 {"," if len(meta_keys) > 0 else ""}{",".join([f'metadata_{m["index"]}' for m in meta_keys])}
47 FROM public.sessions AS s
48 WHERE project_id=%(project_id)s
49 AND session_id IN %(session_ids)s
50 ORDER BY {sort_by} {order_direction};""", params)
52 cur.execute(main_query)
53 rows = cur.fetchall()
54 if len(meta_keys) > 0:
55 for s in rows:
56 s["metadata"] = {}
57 for m in meta_keys:
58 s["metadata"][m["key"]] = s.pop(f'metadata_{m["index"]}')
59 return {"total": len(rows), "sessions": helper.list_to_camel_case(rows), "_src": 1}