peer-at-code-backend/src/dev/peerat/backend/repository/DatabaseQuery.java

181 lines
No EOL
4.6 KiB
Java

package dev.peerat.backend.repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public enum DatabaseQuery {
//TRIGGER
FIRST_TRY("CREATE OR REPLACE TRIGGER FirstTry\r\n"
+ "AFTER INSERT\r\n"
+ " ON completions FOR EACH ROW\r\n"
+ "BEGIN\r\n"
+ " DECLARE badge INT;\r\n"
+ " DECLARE contain INT;\r\n"
+ " \r\n"
+ " SELECT id_badge\r\n"
+ " INTO @badge\r\n"
+ " FROM badges\r\n"
+ " WHERE name = 'FirstTry';\r\n"
+ " \r\n"
+ " IF @badge is not null THEN\r\n"
+ " \r\n"
+ " SELECT count(*)\r\n"
+ " INTO @contain\r\n"
+ " FROM containsBadges\r\n"
+ " WHERE fk_badge = @badge AND fk_player = NEW.fk_player;\r\n"
+ " \r\n"
+ " IF (@contain = 0) THEN\r\n"
+ " INSERT INTO containsBadges(fk_player, fk_badge) VALUES (NEW.fk_player, @badge);\r\n"
+ " END IF;\r\n"
+ " END IF;\r\n"
+ "END;"),
EventParticipation("CREATE OR REPLACE TRIGGER EventParticipation\r\n"
+ "AFTER INSERT\r\n"
+ " ON completions FOR EACH ROW\r\n"
+ "BEGIN\r\n"
+ " DECLARE badge INT;\r\n"
+ " DECLARE endDate datetime;\r\n"
+ " DECLARE player INT;\r\n"
+ " DECLARE contain INT;\r\n"
+ "\r\n"
+ " SELECT id_badge\r\n"
+ " INTO badge\r\n"
+ " FROM badges\r\n"
+ " WHERE name = 'EventParticipation';\r\n"
+ "\r\n"
+ " IF @badge is not null THEN\r\n"
+ "\r\n"
+ " SELECT c.end_date, i.fk_player\r\n"
+ " INTO endDate, player\r\n"
+ " FROM inserted i\r\n"
+ " JOIN puzzles p ON i.fk_puzzle = p.id_puzzle\r\n"
+ " JOIN chapters c on p.fk_chapter = c.id_chapter;\r\n"
+ "\r\n"
+ " IF @endDate is not null THEN\r\n"
+ "\r\n"
+ " SELECT count(*)\r\n"
+ " INTO contain\r\n"
+ " FROM containsBadges\r\n"
+ " WHERE fk_badge = badge AND fk_player = player;\r\n"
+ "\r\n"
+ " IF (@contain = 0) THEN\r\n"
+ " INSERT INTO containsBadges(fk_player, fk_badge) VALUES (@player, @badge);\r\n"
+ " END IF;\r\n"
+ " END IF;\r\n"
+ " END IF;\r\n"
+ "END;");
private String request;
DatabaseQuery(DatabaseQuery parent, String request) {
this.request = parent.request + request;
}
DatabaseQuery(String request) {
this.request = request;
}
public PreparedStatement prepare(Connection con) throws SQLException {
return con.prepareStatement(this.request);
}
@Override
public String toString() {
return this.request;
}
}
/*
*
SELECT p.*, scores.score, scores.completions, scores.tries, scores.rank, g.*
FROM players p,
(SELECT fk_player, SUM(c.score) AS score,
COUNT(c.id_completion) AS completions,
SUM(c.tries) AS tries,
rank() over(ORDER BY score DESC) AS rank
FROM completions c GROUP BY c.fk_player)
AS scores
LEFT OUTER JOIN containsGroups cg ON scores.fk_player = cg.fk_player
LEFT OUTER JOIN groups g ON cg.fk_group = g.id_group
WHERE p.id_player = scores.fk_player AND "),
*
*/
/* TRIGGER PLACE
*
CREATE OR REPLACE TRIGGER FirstTry
AFTER INSERT
ON completions FOR EACH ROW
BEGIN
DECLARE badge INT;
DECLARE contain INT;
SELECT id_badge
INTO @badge
FROM badges
WHERE name = 'FirstTry';
IF @badge is not null THEN
SELECT count(*)
INTO @contain
FROM containsBadges
WHERE fk_badge = @badge AND fk_player = NEW.fk_player;
IF (@contain = 0) THEN
IF (NEW.score >= 0 AND NEW.tries < 2) THEN
INSERT INTO containsBadges(fk_player, fk_badge) VALUES (NEW.fk_player, @badge);
END IF;
END IF;
END IF;
END;
CREATE OR REPLACE TRIGGER EventParticipation
AFTER INSERT
ON completions FOR EACH ROW
BEGIN
DECLARE badge INT;
DECLARE endDate datetime;
DECLARE player INT;
DECLARE contain INT;
SELECT id_badge
INTO badge
FROM badges
WHERE name = 'EventParticipation';
IF @badge is not null THEN
SELECT c.end_date, i.fk_player
INTO endDate, player
FROM inserted i
JOIN puzzles p ON i.fk_puzzle = p.id_puzzle
JOIN chapters c on p.fk_chapter = c.id_chapter;
IF @endDate is not null THEN
SELECT count(*)
INTO contain
FROM containsBadges
WHERE fk_badge = badge AND fk_player = player;
IF (@contain = 0) THEN
INSERT INTO containsBadges(fk_player, fk_badge) VALUES (@player, @badge);
END IF;
END IF;
END IF;
END;
*
*/