@@ -293,6 +293,58 @@ def get_leaderboard_milestones(self, leaderboard_id: int) -> "list[MilestoneItem
293293 for row in self .cursor .fetchall ()
294294 ]
295295
296+ def delete_milestone_runs (self , leaderboard_name : str ):
297+ self .cursor .execute (
298+ """
299+ DELETE FROM leaderboard.runs
300+ WHERE milestone_id IN (
301+ SELECT leaderboard.milestones.id
302+ FROM leaderboard.milestones
303+ WHERE leaderboard_id = %s
304+ );
305+ """ ,
306+ (leaderboard_name ,),
307+ )
308+ self .connection .commit ()
309+
310+ def get_runs_generic (
311+ self , * , milestone_id : Optional [int ] = None , submission_id : Optional [int ] = None
312+ ) -> List ["RunItem" ]:
313+ if milestone_id is not None :
314+ key = "milestone_id"
315+ value = milestone_id
316+ if submission_id is not None :
317+ logger .error ("milestone_id and submission_id specified simultaneously" )
318+ raise KernelBotError ("`milestone_id` and `submission_id` specified simultaneously" )
319+ else :
320+ key = "submission_id"
321+ value = submission_id
322+ query = f"""
323+ SELECT start_time, end_time, mode, secret, runner, score,
324+ passed, compilation, meta, result, system_info
325+ FROM leaderboard.runs
326+ WHERE { key } = %s
327+ """
328+ self .cursor .execute (query , (value ,))
329+ runs = self .cursor .fetchall ()
330+
331+ return [
332+ RunItem (
333+ start_time = r [0 ],
334+ end_time = r [1 ],
335+ mode = r [2 ],
336+ secret = r [3 ],
337+ runner = r [4 ],
338+ score = r [5 ],
339+ passed = r [6 ],
340+ compilation = r [7 ],
341+ meta = r [8 ],
342+ result = r [9 ],
343+ system = r [10 ],
344+ )
345+ for r in runs
346+ ]
347+
296348 def create_submission (
297349 self ,
298350 leaderboard : str ,
@@ -397,7 +449,9 @@ def mark_submission_done(
397449
398450 def create_submission_run (
399451 self ,
400- submission : int ,
452+ * ,
453+ submission : Optional [int ] = None ,
454+ milestone : Optional [int ] = None ,
401455 start : datetime .datetime ,
402456 end : datetime .datetime ,
403457 mode : str ,
@@ -418,13 +472,14 @@ def create_submission_run(
418472 }
419473 self .cursor .execute (
420474 """
421- INSERT INTO leaderboard.runs (submission_id, start_time, end_time, mode,
475+ INSERT INTO leaderboard.runs (submission_id, milestone_id, start_time, end_time, mode,
422476 secret, runner, score, passed, compilation, meta, result, system_info
423477 )
424- VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
478+ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s )
425479 """ ,
426480 (
427481 submission ,
482+ milestone ,
428483 start ,
429484 end ,
430485 mode ,
@@ -804,33 +859,6 @@ def get_submission_by_id(self, submission_id: int) -> Optional["SubmissionItem"]
804859 if submission is None :
805860 return None
806861
807- # OK, now get the runs
808- query = """
809- SELECT start_time, end_time, mode, secret, runner, score,
810- passed, compilation, meta, result, system_info
811- FROM leaderboard.runs
812- WHERE submission_id = %s
813- """
814- self .cursor .execute (query , (submission_id ,))
815- runs = self .cursor .fetchall ()
816-
817- runs = [
818- RunItem (
819- start_time = r [0 ],
820- end_time = r [1 ],
821- mode = r [2 ],
822- secret = r [3 ],
823- runner = r [4 ],
824- score = r [5 ],
825- passed = r [6 ],
826- compilation = r [7 ],
827- meta = r [8 ],
828- result = r [9 ],
829- system = r [10 ],
830- )
831- for r in runs
832- ]
833-
834862 return SubmissionItem (
835863 submission_id = submission_id ,
836864 leaderboard_id = submission [0 ],
@@ -840,7 +868,7 @@ def get_submission_by_id(self, submission_id: int) -> Optional["SubmissionItem"]
840868 submission_time = submission [4 ],
841869 done = submission [5 ],
842870 code = submission [6 ],
843- runs = runs ,
871+ runs = self . get_runs_generic ( submission_id = submission_id ) ,
844872 )
845873
846874 def get_leaderboard_submission_count (
0 commit comments