From 5b7351efe0669bbc1b0b75fce3947f12d2a01308 Mon Sep 17 00:00:00 2001 From: dragonmuffin Date: Sun, 18 Aug 2024 22:48:54 +0500 Subject: [PATCH] feat: add automatic subtask and test result for solution --- internal/models/result.go | 14 +++++++------- migrations/20240727123308_initial.sql | 24 +++++++++++++++++++++++- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/internal/models/result.go b/internal/models/result.go index 59f6e50..f63073f 100644 --- a/internal/models/result.go +++ b/internal/models/result.go @@ -5,13 +5,13 @@ import "time" type Result int32 const ( - Testing Result = 0 - NotTested Result = 1 - SystemFailDuringTesting Result = 2 - TimeLimitExceeded Result = 3 - MemoryLimitExceeded Result = 4 - CompilationError Result = 5 - Accepted Result = 6 + NotTested Result = 0 // change only with schema change + Accepted Result = 1 + CompilationError Result = 2 + MemoryLimitExceeded Result = 3 + TimeLimitExceeded Result = 4 + SystemFailDuringTesting Result = 5 + Testing Result = 6 ) func (result Result) Valid() error { diff --git a/migrations/20240727123308_initial.sql b/migrations/20240727123308_initial.sql index bd75bba..388698d 100644 --- a/migrations/20240727123308_initial.sql +++ b/migrations/20240727123308_initial.sql @@ -156,7 +156,7 @@ CREATE INDEX ON tests USING BTREE (testgroup_id); CREATE TABLE IF NOT EXISTS subtaskruns ( id serial NOT NULL, - subtask_id INT REFERENCES subtasks ON DELETE CASCADE, + subtask_id INT REFERENCES subtasks ON DELETE CASCADE, solution_id INT REFERENCES solutions ON DELETE CASCADE, result INT NOT NULL, score INT NOT NULL, @@ -238,7 +238,26 @@ END; $$ LANGUAGE plpgsql; CREATE TRIGGER new_subtask_trg AFTER INSERT ON subtasks FOR EACH ROW EXECUTE FUNCTION on_new_subtask(); +CREATE FUNCTION on_new_solution() RETURNS TRIGGER +LANGUAGE plpgsql AS $$ +BEGIN + INSERT INTO subtaskruns (subtask_id,solution_id,result,score) (SELECT id,NEW.id,0,0 FROM subtasks WHERE task_id = NEW.task_id); + --INSERT INTO testruns (test_id,subtaskrun_id,result) (SELECT id,str.id,0 FROM tests WHERE testgroup_id IN (SELECT testgroup_id FROM subtasks WHERE id IN (SELECT subtask_id FROM subtaskruns AS str WHERE solution_id=NEW.id))); + RETURN NEW; +END; +$$; +CREATE TRIGGER on_new_solution_trg AFTER INSERT ON solutions FOR EACH ROW EXECUTE FUNCTION on_new_solution(); + +CREATE FUNCTION on_new_subtaskrun() RETURNS TRIGGER +LANGUAGE plpgsql AS $$ +BEGIN + INSERT INTO testruns (test_id,subtaskrun_id,result) (SELECT id,NEW.id,0 FROM tests WHERE testgroup_id IN (SELECT testgroup_id FROM subtasks WHERE id=NEW.subtask_id)); + RETURN NEW; +END; +$$; + +CREATE TRIGGER on_new_subtaskrun_trg AFTER INSERT ON subtaskruns FOR EACH ROW EXECUTE FUNCTION on_new_subtaskrun(); CREATE FUNCTION updated_at_update() RETURNS TRIGGER LANGUAGE plpgsql AS @@ -249,6 +268,7 @@ BEGIN END; $$; + CREATE TRIGGER languages_upd_trg BEFORE UPDATE ON languages FOR EACH ROW EXECUTE FUNCTION updated_at_update(); CREATE TRIGGER problems_upd_trg BEFORE UPDATE ON problems FOR EACH ROW EXECUTE FUNCTION updated_at_update(); CREATE TRIGGER contests_upd_trg BEFORE UPDATE ON contests FOR EACH ROW EXECUTE FUNCTION updated_at_update(); @@ -260,6 +280,8 @@ DROP FUNCTION IF EXISTS updated_at_update CASCADE; DROP FUNCTION IF EXISTS on_new_participant CASCADE; DROP FUNCTION IF EXISTS on_new_task CASCADE; DROP FUNCTION IF EXISTS on_new_subtask CASCADE; +DROP FUNCTION IF EXISTS on_new_solution CASCADE; +DROP FUNCTION IF EXISTS on_new_subtaskrun CASCADE; DROP TABLE IF EXISTS tests CASCADE; DROP TABLE IF EXISTS solutions CASCADE; DROP TABLE IF EXISTS languages CASCADE;