diff --git a/api/chalicelib/core/custom_metrics.py b/api/chalicelib/core/custom_metrics.py index 5f5f6c27e..dc405b090 100644 --- a/api/chalicelib/core/custom_metrics.py +++ b/api/chalicelib/core/custom_metrics.py @@ -11,7 +11,17 @@ def try_live(project_id, data: schemas.TryCustomMetricsSchema): for s in data.series: s.filter.startDate = data.startDate s.filter.endDate = data.endDate - results.append(sessions.search2_series(data=s.filter, project_id=project_id, density=data.density)) + results.append(sessions.search2_series(data=s.filter, project_id=project_id, density=data.density, + view_type=data.view_type)) + if data.view_type == schemas.MetricViewType.progress: + r = {"count": results[-1]} + diff = s.filter.endDate - s.filter.startDate + s.filter.startDate = data.endDate + s.filter.endDate = data.endDate - diff + r["previousCount"] = sessions.search2_series(data=s.filter, project_id=project_id, density=data.density, + view_type=data.view_type) + r["countProgress"] = helper.__progress(old_val=r["previousCount"], new_val=r["count"]) + results[-1] = r return results diff --git a/api/chalicelib/core/sessions.py b/api/chalicelib/core/sessions.py index 8ec2e2afc..8eb58a29d 100644 --- a/api/chalicelib/core/sessions.py +++ b/api/chalicelib/core/sessions.py @@ -231,7 +231,8 @@ def search2_pg(data: schemas.SessionsSearchPayloadSchema, project_id, user_id, f @dev.timed -def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, density: int): +def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, density: int, + view_type: schemas.MetricViewType): step_size = metrics_helper.__get_step_size(endTimestamp=data.endDate, startTimestamp=data.startDate, density=density, factor=1) full_args, query_part, sort = search_query_parts(data=data, error_status=None, errors_only=False, @@ -239,23 +240,30 @@ def search2_series(data: schemas.SessionsSearchPayloadSchema, project_id: int, d user_id=None) full_args["step_size"] = step_size with pg_client.PostgresClient() as cur: - main_query = cur.mogrify(f"""WITH full_sessions AS (SELECT DISTINCT ON(s.session_id) s.session_id, s.start_ts - {query_part}) - SELECT generated_timestamp AS timestamp, - COUNT(s) AS count - FROM generate_series(%(startDate)s, %(endDate)s, %(step_size)s) AS generated_timestamp - LEFT JOIN LATERAL ( SELECT 1 AS s - FROM full_sessions - WHERE start_ts >= generated_timestamp - AND start_ts < generated_timestamp + %(step_size)s) AS sessions ON (TRUE) - GROUP BY generated_timestamp - ORDER BY generated_timestamp;""", full_args) + if view_type == schemas.MetricViewType.line_chart: + main_query = cur.mogrify(f"""WITH full_sessions AS (SELECT DISTINCT ON(s.session_id) s.session_id, s.start_ts + {query_part}) + SELECT generated_timestamp AS timestamp, + COUNT(s) AS count + FROM generate_series(%(startDate)s, %(endDate)s, %(step_size)s) AS generated_timestamp + LEFT JOIN LATERAL ( SELECT 1 AS s + FROM full_sessions + WHERE start_ts >= generated_timestamp + AND start_ts < generated_timestamp + %(step_size)s) AS sessions ON (TRUE) + GROUP BY generated_timestamp + ORDER BY generated_timestamp;""", full_args) + else: + main_query = cur.mogrify(f"""SELECT count(DISTINCT s.session_id) AS count + {query_part};""", full_args) # print("--------------------") # print(main_query) cur.execute(main_query) # print("--------------------") - sessions = cur.fetchall() + if view_type == schemas.MetricViewType.line_chart: + sessions = cur.fetchall() + else: + sessions = cur.fetchone()["count"] return sessions diff --git a/api/schemas.py b/api/schemas.py index 864b27425..351d826da 100644 --- a/api/schemas.py +++ b/api/schemas.py @@ -600,10 +600,16 @@ class CreateCustomMetricsSchema(BaseModel): alias_generator = attribute_to_camel_case +class MetricViewType(str, Enum): + line_chart = "lineChart" + progress = "progress" + + class TryCustomMetricsSchema(CreateCustomMetricsSchema): startDate: int = Field(TimeUTC.now(-7)) endDate: int = Field(TimeUTC.now()) density: int = Field(7) + view_type: MetricViewType = Field(MetricViewType.line_chart) class CustomMetricUpdateSeriesSchema(CustomMetricCreateSeriesSchema):