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

1import logging 

2 

3from chalicelib.core import metadata 

4from chalicelib.utils import pg_client, helper 

5 

6logger = logging.getLogger(__name__) 

7 

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 """ 

28 

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 """ 

35 

36 

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) 

51 

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}