diff --git a/kernelboard/api/leaderboard.py b/kernelboard/api/leaderboard.py index e1ed9ba..f22acf2 100644 --- a/kernelboard/api/leaderboard.py +++ b/kernelboard/api/leaderboard.py @@ -170,6 +170,15 @@ def _get_query(): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id = %(leaderboard_id)s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -259,6 +268,15 @@ def get_custom_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -388,6 +406,15 @@ def get_user_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -482,6 +509,15 @@ def get_fastest_trend(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed = true AND NOT r.secret + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/api/leaderboard_summaries.py b/kernelboard/api/leaderboard_summaries.py index a220e5c..961c58d 100644 --- a/kernelboard/api/leaderboard_summaries.py +++ b/kernelboard/api/leaderboard_summaries.py @@ -370,6 +370,15 @@ def _get_query_for_ids(): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id IN %s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr @@ -474,6 +483,15 @@ def _get_query(): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/index.py b/kernelboard/index.py index c77f8fa..a45ee78 100644 --- a/kernelboard/index.py +++ b/kernelboard/index.py @@ -86,6 +86,15 @@ def index(): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/kernelboard/leaderboard.py b/kernelboard/leaderboard.py index 353a0b5..fdf5428 100644 --- a/kernelboard/leaderboard.py +++ b/kernelboard/leaderboard.py @@ -46,6 +46,15 @@ def leaderboard(leaderboard_id: int): AND r.score IS NOT NULL AND r.passed AND s.leaderboard_id = %(leaderboard_id)s + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/ranking_worker.py b/ranking_worker.py index e9bfb5c..d118f17 100644 --- a/ranking_worker.py +++ b/ranking_worker.py @@ -130,6 +130,15 @@ def ensure_snapshot_table(conn): WHERE NOT r.secret AND r.score IS NOT NULL AND r.passed + AND EXISTS ( + SELECT 1 + FROM leaderboard.runs sr + WHERE sr.submission_id = s.id + AND sr.secret + AND sr.runner = r.runner + AND sr.mode = 'leaderboard' + AND sr.passed + ) AND NOT EXISTS ( SELECT 1 FROM leaderboard.runs sr diff --git a/tests/api/test_leaderboard_api.py b/tests/api/test_leaderboard_api.py index a27e5a2..6c3d0cf 100644 --- a/tests/api/test_leaderboard_api.py +++ b/tests/api/test_leaderboard_api.py @@ -38,7 +38,8 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): (id, leaderboard_id, file_name, user_id, code_id, submission_time, done) VALUES (900001, 339, 'hidden_secret_fail.py', '123456789012345', 13, NOW(), TRUE), - (900002, 339, 'visible_public_pass.py', '234567890123456', 13, NOW(), TRUE) + (900002, 339, 'visible_public_pass.py', '234567890123456', 13, NOW(), TRUE), + (900003, 339, 'hidden_missing_secret.py', '345678901234567', 13, NOW(), TRUE) """ ) cur.execute( @@ -104,6 +105,36 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): '{}', '{}', '{}' + ), + ( + 900004, + 900002, + NOW(), + NOW(), + 'leaderboard', + TRUE, + 'H100', + -998, + TRUE, + '{}', + '{}', + '{}', + '{}' + ), + ( + 900005, + 900003, + NOW(), + NOW(), + 'leaderboard', + FALSE, + 'H100', + -997, + TRUE, + '{}', + '{}', + '{}', + '{}' ) """ ) @@ -117,4 +148,5 @@ def test_failed_secret_benchmark_hides_public_leaderboard_run(client, app): ranked_files = {row["file_name"] for row in h100_rankings} assert "hidden_secret_fail.py" not in ranked_files + assert "hidden_missing_secret.py" not in ranked_files assert "visible_public_pass.py" in ranked_files diff --git a/tests/data.sql b/tests/data.sql index 8808012..811fc10 100644 --- a/tests/data.sql +++ b/tests/data.sql @@ -80,7 +80,8 @@ CREATE TABLE leaderboard.leaderboard ( creator_id bigint DEFAULT '-1'::integer NOT NULL, forum_id bigint NOT NULL, secret_seed bigint DEFAULT floor((random() * ('2147483648'::bigint)::double precision)) NOT NULL, - description text NOT NULL + description text NOT NULL, + visibility text DEFAULT 'public'::text NOT NULL );