add class deaths

This commit is contained in:
Robin Appelman 2020-07-07 14:14:46 +02:00
commit 3f67947052
2 changed files with 49 additions and 13 deletions

View file

@ -174,6 +174,15 @@ BEGIN
END; $$ END; $$
LANGUAGE PLPGSQL IMMUTABLE; LANGUAGE PLPGSQL IMMUTABLE;
CREATE FUNCTION get_length(log_id INTEGER) RETURNS INTEGER AS $$
DECLARE
result INTEGER;
BEGIN
SELECT length into result FROM logs WHERE id = log_id;
RETURN result;
END; $$
LANGUAGE PLPGSQL IMMUTABLE;
CREATE TABLE players ( CREATE TABLE players (
id BIGSERIAL PRIMARY KEY, id BIGSERIAL PRIMARY KEY,
log_id INTEGER NOT NULL REFERENCES logs(id), log_id INTEGER NOT NULL REFERENCES logs(id),
@ -207,10 +216,20 @@ CREATE TABLE players (
medic_kills INTEGER NOT NULL, medic_kills INTEGER NOT NULL,
sniper_kills INTEGER NOT NULL, sniper_kills INTEGER NOT NULL,
spy_kills INTEGER NOT NULL, spy_kills INTEGER NOT NULL,
scout_deaths INTEGER NOT NULL,
soldier_deaths INTEGER NOT NULL,
pyro_deaths INTEGER NOT NULL,
demoman_deaths INTEGER NOT NULL,
heavy_deaths INTEGER NOT NULL,
engineer_deaths INTEGER NOT NULL,
medic_deaths INTEGER NOT NULL,
sniper_deaths INTEGER NOT NULL,
spy_deaths INTEGER NOT NULL,
is_winner BOOL GENERATED ALWAYS AS (team_is_winner(log_id, team)) STORED, is_winner BOOL GENERATED ALWAYS AS (team_is_winner(log_id, team)) STORED,
game_mode game_mode GENERATED ALWAYS AS (get_game_mode(log_id)) STORED, game_mode game_mode GENERATED ALWAYS AS (get_game_mode(log_id)) STORED,
clean_map TEXT GENERATED ALWAYS AS (get_clean_map(log_id)) STORED, clean_map TEXT GENERATED ALWAYS AS (get_clean_map(log_id)) STORED,
date TIMESTAMP WITHOUT TIME ZONE GENERATED ALWAYS AS (get_date(log_id)) STORED date TIMESTAMP WITHOUT TIME ZONE GENERATED ALWAYS AS (get_date(log_id)) STORED,
length INTEGER GENERATED ALWAYS AS (get_length(log_id)) STORED
); );
CREATE INDEX players_log_id_idx CREATE INDEX players_log_id_idx
@ -245,7 +264,7 @@ CREATE TABLE class_stats (
kills INTEGER NOT NULL, kills INTEGER NOT NULL,
deaths INTEGER NOT NULL, deaths INTEGER NOT NULL,
assists INTEGER NOT NULL, assists INTEGER NOT NULL,
dmg INTEGER NOT NULL, dmg INTEGER NOT NULL
); );
CREATE INDEX class_stats_player_id_idx CREATE INDEX class_stats_player_id_idx
@ -272,21 +291,27 @@ CREATE UNIQUE INDEX player_weapon_stats_class_stat_id_weapon_idx
CREATE MATERIALIZED VIEW player_stats AS CREATE MATERIALIZED VIEW player_stats AS
SELECT SELECT
game_mode, clean_map, extract(year from date) as year, type as class, game_mode, clean_map, extract(year from date)::INT as year,
extract(month from date)::INT as month,
class_stats.type as class,
sum(class_stats.dmg) as damage, sum(class_stats.dmg) as damage,
sum(class_stats.kills) as kills, sum(class_stats.kills) as kills,
sum(class_stats.deaths) as deaths, sum(class_stats.deaths) as deaths,
sum(class_stats.assists) as assists,
sum(class_stats.time) as time, sum(class_stats.time) as time,
sum(players.heals_received * (length / time)) as heals_received,
sum(players.damage_taken * (length / time)) as damage_taken,
count(*) as count, count(*) as count,
sum(is_winner::INTEGER) as wins, sum(is_winner::INTEGER) as wins,
steam_id steam_id
FROM players FROM players
INNER JOIN class_stats ON players.id = class_stats.player_id INNER JOIN class_stats ON players.id = class_stats.player_id
WHERE time < 3600 AND class_stats.kills < 100 AND game_mode != 'other' WHERE time < 3600 AND time > 0 AND class_stats.kills < 100 AND game_mode != 'other'
AND class_stats.type != 'unknown' AND class_stats.kills < 100 AND class_stats.type != 'unknown' AND class_stats.kills < 100
AND class_stats.deaths < 100 AND class_stats.dmg < 50000 AND class_stats.deaths < 100 AND class_stats.dmg < 50000
AND clean_map != '' AND clean_map != '' AND damage_taken < 100000 AND heals_received < 100000
GROUP BY game_mode, clean_map, extract(year from date), type, steam_id; GROUP BY game_mode, clean_map, extract(year from date)::INT, extract(month from date)::INT,
class_stats.type, steam_id;
CREATE INDEX player_stats_steam_id_idx CREATE INDEX player_stats_steam_id_idx
ON player_stats USING BTREE (steam_id); ON player_stats USING BTREE (steam_id);
@ -297,17 +322,16 @@ CREATE INDEX player_stats_game_mode_idx
CREATE INDEX player_stats_class_idx CREATE INDEX player_stats_class_idx
ON player_stats USING BTREE (class); ON player_stats USING BTREE (class);
CREATE INDEX player_stats_year_idx CREATE INDEX player_stats_date_idx
ON player_stats USING BTREE (year); ON player_stats USING BTREE (year, month);
CREATE UNIQUE INDEX player_stats_unique_idx CREATE UNIQUE INDEX player_stats_unique_idx
ON player_stats USING BTREE (game_mode, clean_map, year, steam_id, class); ON player_stats USING BTREE (game_mode, clean_map, year, month, steam_id, class);
CREATE MATERIALIZED VIEW player_names AS CREATE MATERIALIZED VIEW player_names AS
SELECT SELECT
steam_id, name, sum(length) as TIME, count(*) AS count steam_id, name, sum(length) as TIME, count(*) AS count
FROM players FROM players
INNER JOIN logs on players.log_id = logs.id
GROUP BY steam_id, name; GROUP BY steam_id, name;
CREATE INDEX player_names_steam_id_idx CREATE INDEX player_names_steam_id_idx

View file

@ -154,6 +154,7 @@ pub async fn store_log(pool: &PgPool, id: i32, log: &NormalizedLog) -> Result<()
for (steam_id, player) in &log.players { for (steam_id, player) in &log.players {
if let Some(team) = player.team { if let Some(team) = player.team {
let kills = log.class_kills.get(steam_id).cloned().unwrap_or_default(); let kills = log.class_kills.get(steam_id).cloned().unwrap_or_default();
let deaths = log.class_deaths.get(steam_id).cloned().unwrap_or_default();
let player_id: i64 = sqlx::query!( let player_id: i64 = sqlx::query!(
"INSERT INTO players (\ "INSERT INTO players (\
log_id, steam_id, name, team, kills, deaths, assists,\ log_id, steam_id, name, team, kills, deaths, assists,\
@ -162,13 +163,15 @@ pub async fn store_log(pool: &PgPool, id: i32, log: &NormalizedLog) -> Result<()
drops, medkits, medkits_hp, backstabs, headshots,\ drops, medkits, medkits_hp, backstabs, headshots,\
heal, heals_received,\ heal, heals_received,\
scout_kills, soldier_kills, pyro_kills, demoman_kills,\ scout_kills, soldier_kills, pyro_kills, demoman_kills,\
heavy_kills, engineer_kills, medic_kills, sniper_kills, spy_kills heavy_kills, engineer_kills, medic_kills, sniper_kills, spy_kills,
scout_deaths, soldier_deaths, pyro_deaths, demoman_deaths,\
heavy_deaths, engineer_deaths, medic_deaths, sniper_deaths, spy_deaths
)\ )\
VALUES(\ VALUES(\
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10,\ $1, $2, $3, $4, $5, $6, $7, $8, $9, $10,\
$11, $12, $13, $14, $15, $16, $17, $18, $19, $20,\ $11, $12, $13, $14, $15, $16, $17, $18, $19, $20,\
$21, $22, $23, $24, $25, $26, $27, $28, $29, $30,\ $21, $22, $23, $24, $25, $26, $27, $28, $29, $30,\
$31\ $31, $32, $33, $34, $35, $36, $37, $38, $39, $40\
)\ )\
RETURNING id", RETURNING id",
id as i32, id as i32,
@ -217,7 +220,16 @@ pub async fn store_log(pool: &PgPool, id: i32, log: &NormalizedLog) -> Result<()
kills.engineer as i32, kills.engineer as i32,
kills.medic as i32, kills.medic as i32,
kills.sniper as i32, kills.sniper as i32,
kills.spy as i32 kills.spy as i32,
deaths.scout as i32,
deaths.soldier as i32,
deaths.pyro as i32,
deaths.demoman as i32,
deaths.heavyweapons as i32,
deaths.engineer as i32,
deaths.medic as i32,
deaths.sniper as i32,
deaths.spy as i32,
) )
.fetch_one(&mut tx) .fetch_one(&mut tx)
.await? .await?