From ad3f72a10b89e77286cdbac84a35cde8b8003955 Mon Sep 17 00:00:00 2001 From: Taha Yassine Kraiem Date: Thu, 24 Apr 2025 11:26:18 +0100 Subject: [PATCH] refactor(chalice): removed favorite attribute from sessions search response as it is not used by UI refactor(chalice): use json.loads instead of ast.literal_eval for faster metadata parsing --- .../core/sessions/sessions_search_ch.py | 19 ++++++++++++------- api/schemas/schemas.py | 1 - 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/api/chalicelib/core/sessions/sessions_search_ch.py b/api/chalicelib/core/sessions/sessions_search_ch.py index 24d03f62c..1dce26548 100644 --- a/api/chalicelib/core/sessions/sessions_search_ch.py +++ b/api/chalicelib/core/sessions/sessions_search_ch.py @@ -1,10 +1,10 @@ -import ast +import json import logging import schemas from chalicelib.core import metadata, projects -from . import sessions_favorite, sessions_search_legacy, sessions_ch as sessions, sessions_legacy_mobil from chalicelib.utils import pg_client, helper, ch_client, exp_ch_helper +from . import sessions_favorite, sessions_search_legacy, sessions_ch as sessions, sessions_legacy_mobil logger = logging.getLogger(__name__) @@ -56,6 +56,8 @@ SESSION_PROJECTION_COLS_CH_MAP = """\ 'viewed', toString(viewed_sessions.session_id > 0) """ +def __parse_metadata(metadata_map): + return json.loads(metadata_map.replace("'", '"').replace("NULL", 'null')) # This function executes the query and return result def search_sessions(data: schemas.SessionsSearchPayloadSchema, project: schemas.ProjectContext, @@ -123,7 +125,8 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project: schemas. meta_keys = metadata.get(project_id=project.project_id) meta_map = ",map(%s) AS 'metadata'" \ - % ','.join([f"'{m['key']}',coalesce(metadata_{m['index']},'None')" for m in meta_keys]) + % ','.join( + [f"'{m['key']}',coalesce(metadata_{m['index']},CAST(NULL AS Nullable(String)))" for m in meta_keys]) main_query = cur.mogrify(f"""SELECT COUNT(*) AS count, COALESCE(JSONB_AGG(users_sessions) FILTER (WHERE rn>%(sessions_limit_s)s AND rn<=%(sessions_limit_e)s), '[]'::JSONB) AS sessions @@ -158,7 +161,8 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project: schemas. meta_keys = metadata.get(project_id=project.project_id) meta_map = ",'metadata',toString(map(%s))" \ - % ','.join([f"'{m['key']}',coalesce(metadata_{m['index']},'None')" for m in meta_keys]) + % ','.join( + [f"'{m['key']}',coalesce(metadata_{m['index']},CAST(NULL AS Nullable(String)))" for m in meta_keys]) main_query = cur.format(query=f"""SELECT any(total) AS count, groupArray(%(sessions_limit)s)(details) AS sessions FROM (SELECT total, details @@ -200,11 +204,12 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project: schemas. for i, s in enumerate(sessions_list): sessions_list[i] = {**s.pop("last_session")[0], **s} sessions_list[i].pop("rn") - sessions_list[i]["metadata"] = ast.literal_eval(sessions_list[i]["metadata"]) + sessions_list[i]["metadata"] = __parse_metadata(sessions_list[i]["metadata"]) else: + import json for i in range(len(sessions_list)): - sessions_list[i]["metadata"] = ast.literal_eval(sessions_list[i]["metadata"]) - sessions_list[i] = schemas.SessionModel.parse_obj(helper.dict_to_camel_case(sessions_list[i])) + sessions_list[i]["metadata"] = __parse_metadata(sessions_list[i]["metadata"]) + sessions_list[i] = schemas.SessionModel.model_validate(helper.dict_to_camel_case(sessions_list[i])) return { 'total': total, diff --git a/api/schemas/schemas.py b/api/schemas/schemas.py index 83ef0032e..6936c4463 100644 --- a/api/schemas/schemas.py +++ b/api/schemas/schemas.py @@ -1588,7 +1588,6 @@ class SessionModel(BaseModel): duration: int errorsCount: int eventsCount: int - favorite: bool = Field(default=False) issueScore: int issueTypes: List[IssueType] = Field(default=[]) metadata: dict = Field(default={})