@@ -713,15 +713,33 @@ def get_leaderboard_submissions(
713713
714714 return result
715715
716- def generate_stats (self , last_day : bool ):
716+ def generate_stats (self , last_day : bool , leaderboard_name : Optional [ str ] = None ):
717717 try :
718- return self ._generate_stats (last_day )
718+ return self ._generate_stats (last_day , leaderboard_name )
719719 except Exception as e :
720720 logger .exception ("error generating stats" , exc_info = e )
721721 raise
722722
723- def _generate_runner_stats (self , last_day : bool = False ):
724- select_expr = "WHERE NOW() - s.submission_time <= interval '24 hours'" if last_day else ""
723+ @staticmethod
724+ def _stats_filter (last_day : bool , leaderboard_name : Optional [str ], submission_alias : str = "s" ):
725+ joins = ""
726+ conditions = []
727+ params = []
728+
729+ if leaderboard_name :
730+ joins = f"JOIN leaderboard.leaderboard lb ON { submission_alias } .leaderboard_id = lb.id"
731+ conditions .append ("lb.name = %s" )
732+ params .append (leaderboard_name )
733+
734+ if last_day :
735+ conditions .append (f"NOW() - { submission_alias } .submission_time <= interval '24 hours'" )
736+
737+ where_clause = f"WHERE { ' AND ' .join (conditions )} " if conditions else ""
738+ return joins , where_clause , params
739+
740+ def _generate_runner_stats (self , last_day : bool = False , leaderboard_name : Optional [str ] = None ):
741+ joins , where_clause , params = self ._stats_filter (last_day , leaderboard_name )
742+
725743 # per-runner stats
726744 self .cursor .execute (
727745 f"""
@@ -735,9 +753,11 @@ def _generate_runner_stats(self, last_day: bool = False):
735753 AVG(runs.start_time - s.submission_time),
736754 SUM(runs.end_time - runs.start_time)
737755 FROM leaderboard.runs JOIN leaderboard.submission s ON submission_id = s.id
738- { select_expr }
756+ { joins }
757+ { where_clause }
739758 GROUP BY runner;
740- """
759+ """ ,
760+ params ,
741761 )
742762
743763 result = {}
@@ -752,18 +772,21 @@ def _generate_runner_stats(self, last_day: bool = False):
752772
753773 return result
754774
755- def _generate_submission_stats (self , last_day : bool = False ):
756- select_expr = "WHERE NOW() - submission_time <= interval '24 hours'" if last_day else ""
775+ def _generate_submission_stats (self , last_day : bool = False , leaderboard_name : Optional [str ] = None ):
776+ joins , where_clause , params = self ._stats_filter (last_day , leaderboard_name )
777+
757778 self .cursor .execute (
758779 f"""
759780 SELECT
760781 COUNT(*),
761- COUNT(*) FILTER (WHERE NOT done),
762- COUNT(DISTINCT user_id)
763- FROM leaderboard.submission
764- { select_expr }
782+ COUNT(*) FILTER (WHERE NOT s.done),
783+ COUNT(DISTINCT s.user_id)
784+ FROM leaderboard.submission s
785+ { joins }
786+ { where_clause }
765787 ;
766- """
788+ """ ,
789+ params ,
767790 )
768791 num_sub , num_sub_wait , num_users = self .cursor .fetchone ()
769792 return {
@@ -772,30 +795,44 @@ def _generate_submission_stats(self, last_day: bool = False):
772795 "num_users" : num_users ,
773796 }
774797
775- def _generate_stats (self , last_day : bool = False ):
776- result = self ._generate_submission_stats (last_day )
777- result .update (self ._generate_runner_stats (last_day ))
798+ def _generate_stats (self , last_day : bool = False , leaderboard_name : Optional [ str ] = None ):
799+ result = self ._generate_submission_stats (last_day , leaderboard_name )
800+ result .update (self ._generate_runner_stats (last_day , leaderboard_name ))
778801
779802 # code-level stats
780803 if not last_day :
781- self .cursor .execute (
782- """
783- SELECT COUNT(*) FROM leaderboard.code_files;
784- """
785- )
804+ if leaderboard_name :
805+ self .cursor .execute (
806+ """
807+ SELECT COUNT(DISTINCT s.code_id)
808+ FROM leaderboard.submission s
809+ JOIN leaderboard.leaderboard lb ON s.leaderboard_id = lb.id
810+ WHERE lb.name = %s;
811+ """ ,
812+ (leaderboard_name ,),
813+ )
814+ else :
815+ self .cursor .execute (
816+ """
817+ SELECT COUNT(*) FROM leaderboard.code_files;
818+ """
819+ )
786820 result ["num_unique_codes" ] = self .cursor .fetchone ()[0 ]
787821
788822 else :
789823 # calculate heavy hitters
824+ joins , where_clause , params = self ._stats_filter (last_day , leaderboard_name )
825+
790826 self .cursor .execute (
791- """
827+ f """
792828 WITH run_durations AS (
793829 SELECT
794830 s.user_id AS user_id,
795831 r.end_time - r.start_time AS duration
796832 FROM leaderboard.runs r
797833 JOIN leaderboard.submission s ON r.submission_id = s.id
798- WHERE NOW() - s.submission_time <= interval '24 hours'
834+ { joins }
835+ { where_clause }
799836 )
800837 SELECT
801838 user_id,
@@ -804,7 +841,8 @@ def _generate_stats(self, last_day: bool = False):
804841 GROUP BY user_id
805842 ORDER BY total DESC
806843 LIMIT 10;
807- """
844+ """ ,
845+ params ,
808846 )
809847
810848 for row in self .cursor .fetchall ():
0 commit comments