fix(chalice): include metadata in sessions exp search (#1291)

This commit is contained in:
Kraiem Taha Yassine 2023-05-30 15:33:54 +02:00 committed by GitHub
parent 447790adf9
commit 07dd9da820
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,3 +1,4 @@
import json
from typing import List, Union from typing import List, Union
import schemas import schemas
@ -156,6 +157,8 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project_id, user_
sort = 'start_ts' sort = 'start_ts'
meta_keys = metadata.get(project_id=project_id) meta_keys = metadata.get(project_id=project_id)
meta_map = ",map(%s) AS 'metadata'" \
% ','.join([f"'{m['key']}',metadata_{m['index']}" for m in meta_keys])
main_query = cur.mogrify(f"""SELECT COUNT(*) AS count, main_query = cur.mogrify(f"""SELECT COUNT(*) AS count,
COALESCE(JSONB_AGG(users_sessions) COALESCE(JSONB_AGG(users_sessions)
FILTER (WHERE rn>%(sessions_limit_s)s AND rn<=%(sessions_limit_e)s), '[]'::JSONB) AS sessions FILTER (WHERE rn>%(sessions_limit_s)s AND rn<=%(sessions_limit_e)s), '[]'::JSONB) AS sessions
@ -165,8 +168,7 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project_id, user_
MIN(full_sessions.start_ts) AS first_session_ts, MIN(full_sessions.start_ts) AS first_session_ts,
ROW_NUMBER() OVER (ORDER BY {g_sort} {data.order}) AS rn ROW_NUMBER() OVER (ORDER BY {g_sort} {data.order}) AS rn
FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY {sort} {data.order}) AS rn FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY {sort} {data.order}) AS rn
FROM (SELECT DISTINCT ON(s.session_id) {SESSION_PROJECTION_COLS} FROM (SELECT DISTINCT ON(s.session_id) {SESSION_PROJECTION_COLS} {meta_map}
{"," if len(meta_keys) > 0 else ""}{",".join([f'metadata_{m["index"]}' for m in meta_keys])}
{query_part} {query_part}
) AS filtred_sessions ) AS filtred_sessions
) AS full_sessions ) AS full_sessions
@ -190,11 +192,13 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project_id, user_
sort = helper.key_to_snake_case(data.sort) sort = helper.key_to_snake_case(data.sort)
meta_keys = metadata.get(project_id=project_id) meta_keys = metadata.get(project_id=project_id)
meta_map = ",'metadata',toString(map(%s))" \
% ','.join([f"'{m['key']}',metadata_{m['index']}" for m in meta_keys])
main_query = cur.format(f"""SELECT any(total) AS count, groupArray(%(sessions_limit)s)(details) AS sessions main_query = cur.format(f"""SELECT any(total) AS count, groupArray(%(sessions_limit)s)(details) AS sessions
FROM (SELECT total, details FROM (SELECT total, details
FROM (SELECT COUNT() OVER () AS total, FROM (SELECT COUNT() OVER () AS total,
s.{sort} AS sort_key, s.{sort} AS sort_key,
map({SESSION_PROJECTION_COLS_CH_MAP}) AS details map({SESSION_PROJECTION_COLS_CH_MAP}{meta_map}) AS details
{query_part} {query_part}
LEFT JOIN (SELECT session_id LEFT JOIN (SELECT session_id
FROM experimental.user_viewed_sessions FROM experimental.user_viewed_sessions
@ -234,12 +238,10 @@ def search_sessions(data: schemas.SessionsSearchPayloadSchema, project_id, user_
for i, s in enumerate(sessions): for i, s in enumerate(sessions):
sessions[i] = {**s.pop("last_session")[0], **s} sessions[i] = {**s.pop("last_session")[0], **s}
sessions[i].pop("rn") sessions[i].pop("rn")
sessions[i]["metadata"] = {k["key"]: sessions[i][f'metadata_{k["index"]}'] for k in meta_keys \ sessions[i]["metadata"] = json.loads(sessions[i]["metadata"].replace("'", '"'))
if sessions[i][f'metadata_{k["index"]}'] is not None}
else: else:
for i in range(len(sessions)): for i in range(len(sessions)):
sessions[i]["metadata"] = {k["key"]: sessions[i][f'metadata_{k["index"]}'] for k in meta_keys \ sessions[i]["metadata"] = json.loads(sessions[i]["metadata"].replace("'", '"'))
if sessions[i].get(f'metadata_{k["index"]}') is not None}
sessions[i] = schemas_ee.SessionModel.parse_obj(helper.dict_to_camel_case(sessions[i])) sessions[i] = schemas_ee.SessionModel.parse_obj(helper.dict_to_camel_case(sessions[i]))
# if not data.group_by_user and data.sort is not None and data.sort != "session_id": # if not data.group_by_user and data.sort is not None and data.sort != "session_id":