@@ -654,6 +654,35 @@ def get_leaderboard(self, leaderboard_name: str) -> "LeaderboardItem":
654654 else :
655655 raise LeaderboardDoesNotExist (leaderboard_name )
656656
657+ def get_leaderboard_by_id (self , leaderboard_id : int ) -> "LeaderboardItem" :
658+ self .cursor .execute (
659+ """
660+ SELECT id, name, deadline, task, creator_id, forum_id, secret_seed, description, visibility
661+ FROM leaderboard.leaderboard
662+ WHERE id = %s
663+ """ ,
664+ (leaderboard_id ,),
665+ )
666+
667+ res = self .cursor .fetchone ()
668+
669+ if res :
670+ task = LeaderboardTask .from_dict (res [3 ])
671+ return LeaderboardItem (
672+ id = res [0 ],
673+ name = res [1 ],
674+ deadline = res [2 ],
675+ task = task ,
676+ creator_id = res [4 ],
677+ forum_id = res [5 ],
678+ secret_seed = res [6 ],
679+ gpu_types = self .get_leaderboard_gpu_types (res [1 ]),
680+ description = res [7 ],
681+ visibility = res [8 ],
682+ )
683+ else :
684+ raise LeaderboardDoesNotExist (str (leaderboard_id ))
685+
657686 def check_leaderboard_access (self , leaderboard_name : str , user_id : str ) -> bool :
658687 """Returns True if leaderboard is public or user has claimed an invite covering this leaderboard."""
659688 self .cursor .execute (
@@ -865,6 +894,14 @@ def get_leaderboard_submissions(
865894 if user_id :
866895 # Query all if user_id (means called from show-personal)
867896 query = """
897+ WITH submission_counts AS (
898+ SELECT s.user_id, r.runner, COUNT(DISTINCT s.id) AS submission_count
899+ FROM leaderboard.submission s
900+ JOIN leaderboard.runs r ON r.submission_id = s.id
901+ JOIN leaderboard.leaderboard l ON s.leaderboard_id = l.id
902+ WHERE l.name = %s
903+ GROUP BY s.user_id, r.runner
904+ )
868905 SELECT
869906 s.file_name,
870907 s.id,
@@ -873,11 +910,13 @@ def get_leaderboard_submissions(
873910 r.score,
874911 r.runner,
875912 ui.user_name,
876- RANK() OVER (ORDER BY r.score ASC) as rank
913+ RANK() OVER (ORDER BY r.score ASC) as rank,
914+ COALESCE(sc.submission_count, 0) AS submission_count
877915 FROM leaderboard.runs r
878916 JOIN leaderboard.submission s ON r.submission_id = s.id
879917 JOIN leaderboard.leaderboard l ON s.leaderboard_id = l.id
880918 JOIN leaderboard.user_info ui ON s.user_id = ui.id
919+ LEFT JOIN submission_counts sc ON s.user_id = sc.user_id AND r.runner = sc.runner
881920 WHERE l.name = %s
882921 AND r.runner = %s
883922 AND NOT r.secret
@@ -895,11 +934,19 @@ def get_leaderboard_submissions(
895934 ORDER BY r.score ASC
896935 LIMIT %s OFFSET %s
897936 """
898- args = (leaderboard_name , gpu_name , user_id , limit , offset )
937+ args = (leaderboard_name , leaderboard_name , gpu_name , user_id , limit , offset )
899938 else :
900939 # Query best submission per user if no user_id (means called from show)
901940 query = """
902- WITH best_submissions AS (
941+ WITH submission_counts AS (
942+ SELECT s.user_id, r.runner, COUNT(DISTINCT s.id) AS submission_count
943+ FROM leaderboard.submission s
944+ JOIN leaderboard.runs r ON r.submission_id = s.id
945+ JOIN leaderboard.leaderboard l ON s.leaderboard_id = l.id
946+ WHERE l.name = %s
947+ GROUP BY s.user_id, r.runner
948+ ),
949+ best_submissions AS (
903950 SELECT DISTINCT ON (s.user_id)
904951 s.id as submission_id,
905952 s.file_name,
@@ -931,13 +978,15 @@ def get_leaderboard_submissions(
931978 bs.score,
932979 bs.runner,
933980 ui.user_name,
934- RANK() OVER (ORDER BY bs.score ASC) as rank
981+ RANK() OVER (ORDER BY bs.score ASC) as rank,
982+ COALESCE(sc.submission_count, 0) AS submission_count
935983 FROM best_submissions bs
936984 JOIN leaderboard.user_info ui ON bs.user_id = ui.id
985+ LEFT JOIN submission_counts sc ON bs.user_id = sc.user_id AND bs.runner = sc.runner
937986 ORDER BY bs.score ASC
938987 LIMIT %s OFFSET %s
939988 """
940- args = (leaderboard_name , gpu_name , limit , offset )
989+ args = (leaderboard_name , leaderboard_name , gpu_name , limit , offset )
941990
942991 self .cursor .execute (query , args )
943992
@@ -950,6 +999,7 @@ def get_leaderboard_submissions(
950999 submission_score = submission [4 ],
9511000 user_name = submission [6 ],
9521001 rank = submission [7 ],
1002+ submission_count = submission [8 ],
9531003 leaderboard_name = leaderboard_name ,
9541004 gpu_type = gpu_name ,
9551005 )
0 commit comments