mirror of
https://codeberg.org/icewind/log-normalizer.git
synced 2026-06-03 13:54:11 +02:00
add class deaths
This commit is contained in:
parent
f7ad365b7c
commit
3f67947052
2 changed files with 49 additions and 13 deletions
44
schema.sql
44
schema.sql
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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?
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue