From f0ad664673542179f7ed5870e30ad4ee5d8d0c6e Mon Sep 17 00:00:00 2001 From: Stan Girard Date: Wed, 17 Apr 2024 16:16:13 +0200 Subject: [PATCH] feat(analytics): rely on sql rather that python loop for brains --- .../modules/analytics/repository/analytics.py | 43 +++++++++++-------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/backend/modules/analytics/repository/analytics.py b/backend/modules/analytics/repository/analytics.py index db029e076..eafd9e4e8 100644 --- a/backend/modules/analytics/repository/analytics.py +++ b/backend/modules/analytics/repository/analytics.py @@ -2,46 +2,55 @@ from collections import defaultdict from datetime import datetime, timedelta from typing import Optional from uuid import UUID + from models.settings import get_supabase_client from modules.analytics.entity.analytics import BrainsUsages, Range, Usage from modules.brain.service.brain_user_service import BrainUserService brain_user_service = BrainUserService() + class Analytics: def __init__(self): supabase_client = get_supabase_client() self.db = supabase_client - def get_brains_usages(self, user_id: UUID, graph_range: Range, brain_id: Optional[UUID] = None) -> BrainsUsages: + def get_brains_usages( + self, user_id: UUID, graph_range: Range, brain_id: Optional[UUID] = None + ) -> BrainsUsages: user_brains = brain_user_service.get_user_brains(user_id) if brain_id is not None: user_brains = [brain for brain in user_brains if brain.id == brain_id] - usage_per_day = defaultdict(int) + usage_per_day = defaultdict(int) - for brain in user_brains: - chat_history = ( - self.db.from_("chat_history") - .select("*") - .filter("brain_id", "eq", str(brain.id)) - .execute() - ).data + brain_ids = [brain.id for brain in user_brains] + chat_history = ( + self.db.from_("chat_history") + .select("*") + .in_("brain_id", brain_ids) + .execute() + ).data - for chat in chat_history: - message_time = datetime.strptime(chat['message_time'], "%Y-%m-%dT%H:%M:%S.%f") - usage_per_day[message_time.date()] += 1 + for chat in chat_history: + message_time = datetime.strptime( + chat["message_time"], "%Y-%m-%dT%H:%M:%S.%f" + ) + usage_per_day[message_time.date()] += 1 start_date = datetime.now().date() - timedelta(days=graph_range) all_dates = [start_date + timedelta(days=i) for i in range(graph_range)] - + for date in all_dates: - usage_per_day[date] += 0 + usage_per_day[date] += 0 usages = sorted( - [Usage(date=date, usage_count=count) for date, count in usage_per_day.items() if start_date <= date <= datetime.now().date()], - key=lambda usage: usage.date + [ + Usage(date=date, usage_count=count) + for date, count in usage_per_day.items() + if start_date <= date <= datetime.now().date() + ], + key=lambda usage: usage.date, ) return BrainsUsages(usages=usages) -