parent
1ea919c954
commit
4019823dd7
@ -1 +1 @@
|
|||||||
export DATABASE_URL="postgresql://ibihf2:ibihf@localhost/ibihf"
|
export DATABASE_URL="postgresql://ibihf:ibihf@localhost/ibihf"
|
||||||
|
@ -0,0 +1,10 @@
|
|||||||
|
# IBIHF Statistics System
|
||||||
|
|
||||||
|
This is the official system of the International Blind Ice Hockey Federation,
|
||||||
|
and their stats website can be found live at [stats.ibihf.org](https://stats.ibihf.org/).
|
||||||
|
|
||||||
|
## Database Inforamtion
|
||||||
|
|
||||||
|
All migrations can be applied in order of the UNIX timestamp identifier before the name of the migrations.
|
||||||
|
These `*.sql` files are valid for the Postgres database.
|
||||||
|
|
@ -1 +1,2 @@
|
|||||||
DELETE FROM period_types;
|
DELETE FROM period_types
|
||||||
|
WHERE id BETWEEN 1 AND 13;
|
||||||
|
@ -1,2 +1,3 @@
|
|||||||
-- Add down migration script here
|
-- Add down migration script here
|
||||||
DELETE FROM game_players;
|
DELETE FROM game_players
|
||||||
|
WHERE id BETWEEN 1 AND 116;
|
||||||
|
@ -1 +1,2 @@
|
|||||||
DELETE FROM periods;
|
DELETE FROM periods
|
||||||
|
WHERE id BETWEEN 1 AND 12;
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
DROP FUNCTION periods(INTEGER);
|
@ -0,0 +1,6 @@
|
|||||||
|
CREATE FUNCTION periods(game_id INTEGER)
|
||||||
|
RETURNS INTEGER AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN (SELECT COUNT(id) FROM periods WHERE periods.game=game_id);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
@ -0,0 +1,2 @@
|
|||||||
|
-- Add down migration script here
|
||||||
|
--DROP FUNCTION game_results(INTEGER, INTEGER);
|
@ -0,0 +1,99 @@
|
|||||||
|
-- Add up migration script here
|
||||||
|
--CREATE FUNCTION periods(game_id INTEGER)
|
||||||
|
--RETURNS INTEGER AS $$
|
||||||
|
--BEGIN
|
||||||
|
-- RETURN (SELECT COUNT(id) FROM periods WHERE periods.game=game_id);
|
||||||
|
--END;
|
||||||
|
--$$ LANGUAGE plpgsql;
|
||||||
|
--
|
||||||
|
--CREATE FUNCTION goals(game_id INTEGER, team_id INTEGER)
|
||||||
|
--RETURNS INTEGER AS $$
|
||||||
|
--DECLARE
|
||||||
|
-- goals INTEGER;
|
||||||
|
--BEGIN
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM games WHERE games.id=game_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The game does not exist.';
|
||||||
|
-- END IF;
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM teams WHERE teams.id=team_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The team does not exist.';
|
||||||
|
-- END IF;
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM games JOIN teams ON teams.id=games.team_home OR teams.id=team_away WHERE games.id=game_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The team specified did not play this game.';
|
||||||
|
-- END IF;
|
||||||
|
--
|
||||||
|
-- SELECT
|
||||||
|
-- COUNT(shots.id)
|
||||||
|
-- INTO
|
||||||
|
-- goals
|
||||||
|
-- FROM shots
|
||||||
|
-- JOIN game_players
|
||||||
|
-- ON game_players.id=shots.shooter
|
||||||
|
-- JOIN periods
|
||||||
|
-- ON periods.id=shots.period
|
||||||
|
-- WHERE shots.goal=true
|
||||||
|
-- AND game_players.team=team_id
|
||||||
|
-- AND periods.game=game_id;
|
||||||
|
-- -- return 0 if not goals are found given the team and the game
|
||||||
|
-- RETURN COALESCE(goals, 0);
|
||||||
|
--END;
|
||||||
|
--$$ LANGUAGE plpgsql;
|
||||||
|
--
|
||||||
|
--CREATE OR REPLACE FUNCTION calculate_iihf_stats(game_id INT, team_id INT)
|
||||||
|
--RETURNS TABLE (
|
||||||
|
-- reg_win INT,
|
||||||
|
-- reg_loss INT,
|
||||||
|
-- ot_win INT,
|
||||||
|
-- ot_loss INT,
|
||||||
|
-- tie INT,
|
||||||
|
-- game INT,
|
||||||
|
-- team INT
|
||||||
|
--) AS $$
|
||||||
|
--DECLARE
|
||||||
|
-- opponent_team_id INTEGER;
|
||||||
|
--BEGIN
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM games WHERE games.id=game_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The game does not exist.';
|
||||||
|
-- END IF;
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM teams WHERE teams.id=team_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The team does not exist.';
|
||||||
|
-- END IF;
|
||||||
|
-- IF NOT EXISTS (SELECT * FROM games JOIN teams ON teams.id=games.team_home OR teams.id=team_away WHERE games.id=game_id) THEN
|
||||||
|
-- RAISE EXCEPTION 'The team specified did not play this game.';
|
||||||
|
-- END IF;
|
||||||
|
--
|
||||||
|
-- SELECT
|
||||||
|
-- teams.id
|
||||||
|
-- INTO
|
||||||
|
-- opponent_team_id
|
||||||
|
-- FROM games
|
||||||
|
-- JOIN teams
|
||||||
|
-- ON (teams.id=games.team_home
|
||||||
|
-- OR teams.id=games.team_away)
|
||||||
|
-- WHERE games.id=game_id
|
||||||
|
-- AND teams.id!=team_id;
|
||||||
|
--
|
||||||
|
-- RETURN QUERY
|
||||||
|
-- SELECT
|
||||||
|
-- (CASE WHEN goals(game_id, team_id) > goals(game_id, opponent_team_id) AND periods(game_id) <= 3 THEN 1 ELSE 0 END) AS reg_win,
|
||||||
|
-- (CASE WHEN goals(game_id, team_id) < goals(game_id, opponent_team_id) AND periods(game_id) <= 3 THEN 1 ELSE 0 END) AS reg_loss,
|
||||||
|
-- (CASE WHEN goals(game_id, team_id) > goals(game_id, opponent_team_id) AND periods(game_id) > 3 THEN 1 ELSE 0 END) AS ot_win,
|
||||||
|
-- (CASE WHEN goals(game_id, team_id) < goals(game_id, opponent_team_id) AND periods(game_id) > 3 THEN 1 ELSE 0 END) AS ot_loss,
|
||||||
|
-- (CASE WHEN goals(game_id, team_id) = goals(game_id, opponent_team_id) THEN 1 ELSE 0 END) AS tie,
|
||||||
|
-- game_id AS game,
|
||||||
|
-- team_id AS team;
|
||||||
|
--END;
|
||||||
|
--$$ LANGUAGE plpgsql;
|
||||||
|
--
|
||||||
|
--CREATE OR REPLACE FUNCTION calculate_iihf_points(game_id INT, team_id INT)
|
||||||
|
--RETURNS INTEGER AS $$
|
||||||
|
--BEGIN
|
||||||
|
-- RETURN (
|
||||||
|
-- SELECT
|
||||||
|
-- (iihs_stats.reg_win * 3) +
|
||||||
|
-- (iihs_stats.reg_loss * 0) +
|
||||||
|
-- (iihs_stats.ot_win * 2) +
|
||||||
|
-- (iihs_stats.ot_loss * 1) +
|
||||||
|
-- (iihs_stats.tie * 2) AS points
|
||||||
|
-- FROM calculate_iihs_stats_stats(game_id, team_id) iihs_stats);
|
||||||
|
--END;
|
||||||
|
--$$ LANGUAGE plpgsql;
|
@ -0,0 +1,2 @@
|
|||||||
|
-- Add down migration script here
|
||||||
|
DROP FUNCTION goals(INTEGER, INTEGER);
|
@ -0,0 +1,32 @@
|
|||||||
|
-- Add up migration script here
|
||||||
|
CREATE FUNCTION goals(game_id INTEGER, team_id INTEGER)
|
||||||
|
RETURNS INTEGER AS $$
|
||||||
|
DECLARE
|
||||||
|
goals INTEGER;
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT * FROM games WHERE games.id=game_id) THEN
|
||||||
|
RAISE EXCEPTION 'The game does not exist.';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT * FROM teams WHERE teams.id=team_id) THEN
|
||||||
|
RAISE EXCEPTION 'The team does not exist.';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT * FROM games JOIN teams ON teams.id=games.team_home OR teams.id=team_away WHERE games.id=game_id) THEN
|
||||||
|
RAISE EXCEPTION 'The team specified did not play this game.';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
COUNT(shots.id)
|
||||||
|
INTO
|
||||||
|
goals
|
||||||
|
FROM shots
|
||||||
|
JOIN game_players
|
||||||
|
ON game_players.id=shots.shooter
|
||||||
|
JOIN periods
|
||||||
|
ON periods.id=shots.period
|
||||||
|
WHERE shots.goal=true
|
||||||
|
AND game_players.team=team_id
|
||||||
|
AND periods.game=game_id;
|
||||||
|
-- return 0 if not goals are found given the team and the game
|
||||||
|
RETURN COALESCE(goals, 0);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
@ -0,0 +1,2 @@
|
|||||||
|
-- Add down migration script here
|
||||||
|
DROP FUNCTION iihf_stats(INTEGER, INTEGER);
|
@ -0,0 +1,46 @@
|
|||||||
|
-- Add up migration script here
|
||||||
|
CREATE OR REPLACE FUNCTION iihf_stats(game_id INT, team_id INT)
|
||||||
|
RETURNS TABLE (
|
||||||
|
reg_win INT,
|
||||||
|
reg_loss INT,
|
||||||
|
ot_win INT,
|
||||||
|
ot_loss INT,
|
||||||
|
tie INT,
|
||||||
|
game INT,
|
||||||
|
team INT
|
||||||
|
) AS $$
|
||||||
|
DECLARE
|
||||||
|
opponent_team_id INTEGER;
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (SELECT * FROM games WHERE games.id=game_id) THEN
|
||||||
|
RAISE EXCEPTION 'The game does not exist.';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT * FROM teams WHERE teams.id=team_id) THEN
|
||||||
|
RAISE EXCEPTION 'The team does not exist.';
|
||||||
|
END IF;
|
||||||
|
IF NOT EXISTS (SELECT * FROM games JOIN teams ON teams.id=games.team_home OR teams.id=team_away WHERE games.id=game_id) THEN
|
||||||
|
RAISE EXCEPTION 'The team specified did not play this game.';
|
||||||
|
END IF;
|
||||||
|
|
||||||
|
SELECT
|
||||||
|
teams.id
|
||||||
|
INTO
|
||||||
|
opponent_team_id
|
||||||
|
FROM games
|
||||||
|
JOIN teams
|
||||||
|
ON (teams.id=games.team_home
|
||||||
|
OR teams.id=games.team_away)
|
||||||
|
WHERE games.id=game_id
|
||||||
|
AND teams.id!=team_id;
|
||||||
|
|
||||||
|
RETURN QUERY
|
||||||
|
SELECT
|
||||||
|
(CASE WHEN goals(game_id, team_id) > goals(game_id, opponent_team_id) AND periods(game_id) <= 3 THEN 1 ELSE 0 END) AS reg_win,
|
||||||
|
(CASE WHEN goals(game_id, team_id) < goals(game_id, opponent_team_id) AND periods(game_id) <= 3 THEN 1 ELSE 0 END) AS reg_loss,
|
||||||
|
(CASE WHEN goals(game_id, team_id) > goals(game_id, opponent_team_id) AND periods(game_id) > 3 THEN 1 ELSE 0 END) AS ot_win,
|
||||||
|
(CASE WHEN goals(game_id, team_id) < goals(game_id, opponent_team_id) AND periods(game_id) > 3 THEN 1 ELSE 0 END) AS ot_loss,
|
||||||
|
(CASE WHEN goals(game_id, team_id) = goals(game_id, opponent_team_id) THEN 1 ELSE 0 END) AS tie,
|
||||||
|
game_id AS game,
|
||||||
|
team_id AS team;
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
@ -0,0 +1,2 @@
|
|||||||
|
-- Add down migration script here
|
||||||
|
DROP FUNCTION iihf_points(INTEGER, INTEGER);
|
@ -0,0 +1,14 @@
|
|||||||
|
-- Add up migration script here
|
||||||
|
CREATE OR REPLACE FUNCTION iihf_points(game_id INT, team_id INT)
|
||||||
|
RETURNS INTEGER AS $$
|
||||||
|
BEGIN
|
||||||
|
RETURN (
|
||||||
|
SELECT
|
||||||
|
(iihs_stats.reg_win * 3) +
|
||||||
|
(iihs_stats.reg_loss * 0) +
|
||||||
|
(iihs_stats.ot_win * 2) +
|
||||||
|
(iihs_stats.ot_loss * 1) +
|
||||||
|
(iihs_stats.tie * 2) AS points
|
||||||
|
FROM calculate_iihs_stats_stats(game_id, team_id) iihs_stats);
|
||||||
|
END;
|
||||||
|
$$ LANGUAGE plpgsql;
|
@ -1,6 +1,12 @@
|
|||||||
|
{% extends "master.html" %}
|
||||||
|
|
||||||
|
{% block title %}Divisions{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
<h1 id="first-heading">Divisions for the {{ league.name }}</h1>
|
<h1 id="first-heading">Divisions for the {{ league.name }}</h1>
|
||||||
<ul aria-labelledby="first-heading">
|
<ul aria-labelledby="first-heading">
|
||||||
{% for division in divisions %}
|
{% for division in divisions %}
|
||||||
<li><a href="/en/division/{{ division.id }}/">{{ division.name }}</a></li>
|
<li><a href="/en/division/{{ division.id }}/">{{ division.name }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
|
{% endblock %}
|
||||||
|
@ -1,10 +1,16 @@
|
|||||||
<h1 id="games">Games for {{ division.name }}</h1>
|
{% extends "master.html" %}
|
||||||
{% if games.len() > 0 %}
|
|
||||||
<ol aria-labelledby="games">
|
{% block title %}Games{% endblock %}
|
||||||
{% for game in games %}
|
|
||||||
<li><a href="/en/game/{{ game.id }}/">{{ game.name }}</a></li>
|
{% block content %}
|
||||||
{% endfor %}
|
<h1 id="games">Games for {{ division.name }}</h1>
|
||||||
</ol>
|
{% if games.len() > 0 %}
|
||||||
{% else %}
|
<ol aria-labelledby="games">
|
||||||
<p>No games have been recorded.</p>
|
{% for game in games %}
|
||||||
{% endif %}
|
<li><a href="/en/game/{{ game.id }}/">{{ game.name }}</a></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% else %}
|
||||||
|
<p>No games have been recorded.</p>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
@ -1,6 +1,12 @@
|
|||||||
|
{% extends "master.html" %}
|
||||||
|
|
||||||
|
{% block title %}Leagues{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
<h1 id="leagues">{{ heading }}</h1>
|
<h1 id="leagues">{{ heading }}</h1>
|
||||||
<ol aria-labelledby="leagues">
|
<ol aria-labelledby="leagues">
|
||||||
{% for league in leagues %}
|
{% for league in leagues %}
|
||||||
<li><a href="/{{ lang }}/league/{{ league.id }}/">{{ league.name }}</a></li>
|
<li><a href="/{{ lang }}/league/{{ league.id }}/">{{ league.name }}</a></li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ol>
|
</ol>
|
||||||
|
{% endblock %}
|
||||||
|
@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<!-- TODO: auto-generate page language. -->
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<!-- TODO: auto-generate IBIHF string to some other languages -->
|
||||||
|
<title>{% block title %}{% endblock %} | IBIHF Stats</title>
|
||||||
|
{% block head %}{% endblock %}
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header></header>
|
||||||
|
<main>
|
||||||
|
{% block content %}{% endblock %}
|
||||||
|
</main>
|
||||||
|
<footer></footer>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"phrases": {
|
||||||
|
"urlGame": "game",
|
||||||
|
"urlDivision": "division",
|
||||||
|
"urlLeague": "league",
|
||||||
|
"ibihfLeagues": "IBIHF Leagues",
|
||||||
|
"goals": "Goals",
|
||||||
|
"assists": "Assists",
|
||||||
|
"period": "Period"
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"phrases": {
|
||||||
|
"urlGame": "match",
|
||||||
|
"urlDivision": "division",
|
||||||
|
"urlLeague": "league",
|
||||||
|
"ibihfLeagues": "Leagues de FIDHS",
|
||||||
|
"goals": "But",
|
||||||
|
"assists": "Assisté",
|
||||||
|
"period": "Période"
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue