Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

198 changes: 198 additions & 0 deletions migrations/20250722002114_unrated_levels.down.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
DROP VIEW score_giving;

CREATE VIEW score_giving AS
SELECT records.progress, demons.position, demons.requirement, records.player
FROM records
INNER JOIN demons
ON demons.id = records.demon
WHERE records.status_ = 'APPROVED' AND (demons.position <= 75 OR records.progress = 100)

UNION

SELECT 100, demons.position, demons.requirement, demons.verifier
FROM demons;

DROP FUNCTION score_of_player(BOOLEAN, INTEGER);
CREATE OR REPLACE FUNCTION score_of_player(player_id INTEGER) RETURNS DOUBLE PRECISION AS $$
SELECT SUM(record_score(progress, position, 150, requirement))
FROM score_giving
WHERE player = player_id
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION recompute_player_scores() RETURNS void AS $$
UPDATE players
SET score = coalesce(q.score, 0)
FROM players p
LEFT OUTER JOIN (
SELECT player, SUM(record_score(progress, position, 150, requirement)) as score
FROM score_giving
GROUP BY player
) q
ON q.player = p.id
WHERE players.id = p.id;
$$ LANGUAGE SQL;

DROP FUNCTION score_of_nation(BOOLEAN, VARCHAR(2));
CREATE OR REPLACE FUNCTION score_of_nation(iso_country_code VARCHAR(2)) RETURNS DOUBLE PRECISION AS $$
SELECT SUM(record_score(q.progress, q.position, 150, q.requirement))
FROM (
SELECT DISTINCT ON (position) * from score_giving
INNER JOIN players
ON players.id=player
WHERE players.nationality = iso_country_code
ORDER BY position, progress DESC
) q
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION recompute_nation_scores() RETURNS void AS $$
UPDATE nationalities
SET score = COALESCE(p.sum, 0)
FROM nationalities n
LEFT OUTER JOIN (
SELECT nationality, SUM(record_score(q.progress, q.position, 150, q.requirement))
FROM (
SELECT DISTINCT ON (position, nationality) * from score_giving
INNER JOIN players
ON players.id=player
WHERE players.nationality IS NOT NULL
ORDER BY players.nationality, position, progress DESC
) q
GROUP BY nationality
) p
ON p.nationality = n.iso_country_code
WHERE n.iso_country_code = nationalities.iso_country_code
$$ LANGUAGE SQL;

DROP FUNCTION score_of_subdivision(BOOLEAN, VARCHAR(2), VARCHAR(3));
CREATE OR REPLACE FUNCTION score_of_subdivision(iso_country_code VARCHAR(2), iso_code VARCHAR(3)) RETURNS DOUBLE PRECISION AS $$
SELECT SUM(record_score(q.progress, q.position, 150, q.requirement))
FROM (
SELECT DISTINCT ON (position) * from score_giving
INNER JOIN players
ON players.id=player
WHERE players.nationality = iso_country_code
AND players.subdivision = iso_code
ORDER BY position, progress DESC
) q
$$ LANGUAGE SQL;

CREATE OR REPLACE FUNCTION recompute_subdivision_scores() RETURNS void AS $$
UPDATE subdivisions
SET score = COALESCE(p.sum, 0)
FROM subdivisions s
LEFT OUTER JOIN (
SELECT nationality, subdivision, SUM(record_score(q.progress, q.position, 150, q.requirement))
FROM (
SELECT DISTINCT ON (position, nationality, subdivision) * from score_giving
INNER JOIN players
ON players.id=player
WHERE players.nationality IS NOT NULL
AND players.subdivision IS NOT NULL
ORDER BY players.nationality, players.subdivision, position, progress DESC
) q
GROUP BY nationality, subdivision
) p
ON s.nation = p.nationality AND s.iso_code = p.subdivision
WHERE s.nation = subdivisions.nation
AND s.iso_code = subdivisions.iso_code
$$ LANGUAGE SQL;

DROP VIEW ranked_players;
DROP MATERIALIZED VIEW player_ranks;

CREATE MATERIALIZED VIEW player_ranks AS
SELECT
RANK() OVER (ORDER BY score DESC) as rank,
id
FROM players
WHERE
score != 0 AND NOT banned;

CREATE UNIQUE INDEX player_ranks_id_idx ON player_ranks(id);

CREATE VIEW ranked_players AS
SELECT
ROW_NUMBER() OVER(ORDER BY rank, id) AS index,
rank,
id, name, players.score, subdivision,
nationalities.iso_country_code,
nationalities.nation,
nationalities.continent
FROM players
LEFT OUTER JOIN nationalities
ON players.nationality = nationalities.iso_country_code
NATURAL JOIN player_ranks;

DROP VIEW ranked_nations;

CREATE VIEW ranked_nations AS
SELECT
ROW_NUMBER() OVER(ORDER BY score DESC, iso_country_code) AS index,
RANK() OVER(ORDER BY score DESC) AS rank,
score,
iso_country_code,
nation,
continent
FROM nationalities
WHERE score > 0.0;

CREATE OR REPLACE FUNCTION audit_demon_modification() RETURNS trigger AS $demon_modification_trigger$
DECLARE
name_change CITEXT;
position_change SMALLINT;
requirement_change SMALLINT;
video_change VARCHAR(200);
thumbnail_change TEXT;
verifier_change INT;
publisher_change INT;
BEGIN
IF (OLD.name <> NEW.name) THEN
name_change = OLD.name;
END IF;

IF (OLD.position <> NEW.position) THEN
position_change = OLD.position;
END IF;

IF (OLD.requirement <> NEW.requirement) THEN
requirement_change = OLD.requirement;
END IF;

IF (OLD.video <> NEW.video) THEN
video_change = OLD.video;
END IF;

IF (OLD.thumbnail <> NEW.thumbnail) THEN
thumbnail_change = OLD.thumbnail;
END IF;

IF (OLD.verifier <> NEW.verifier) THEN
verifier_change = OLD.verifier;
END IF;

IF (OLD.publisher <> NEW.publisher) THEN
publisher_change = OLD.publisher;
END IF;

INSERT INTO demon_modifications (userid, name, position, requirement, video, verifier, publisher, thumbnail, id)
(SELECT id, name_change, position_change, requirement_change, video_change, verifier_change, publisher_change, thumbnail_change, NEW.id
FROM active_user LIMIT 1);

RETURN NEW;
END;
$demon_modification_trigger$ LANGUAGE plpgsql;

SELECT recompute_player_scores();
SELECT recompute_nation_scores();
SELECT recompute_subdivision_scores();

ALTER TABLE demons DROP COLUMN rated_position;
DROP FUNCTION recompute_rated_positions();

ALTER TABLE demons DROP COLUMN rated;
ALTER TABLE players DROP COLUMN ratedplus_score;
ALTER TABLE nationalities DROP COLUMN ratedplus_score;
ALTER TABLE subdivisions DROP COLUMN ratedplus_score;

ALTER TABLE demon_modifications DROP COLUMN rated;
ALTER TABLE demon_modifications DROP COLUMN rated_position;
Loading
Loading