]> git.xonotic.org Git - xonotic/xonstatdb.git/blob - functions/merge_players.sql
Add team_game_stats to the mix.
[xonotic/xonstatdb.git] / functions / merge_players.sql
1 create or replace function merge_players(p_winner_player_id players.player_id%TYPE, p_loser_player_id players.player_id%TYPE) RETURNS void as
2 $$
3 declare
4    rowcount integer;
5    r record;
6 begin
7    raise notice 'Merging % and %', p_winner_player_id, p_loser_player_id;
8
9    -- start with weapon stats
10    update player_weapon_stats
11    set player_id = p_winner_player_id
12    where player_id = p_loser_player_id;
13
14    get diagnostics rowcount = ROW_COUNT;
15    raise notice '% weapon stat rows updated.', rowcount;
16
17    -- then game stats
18    update player_game_stats
19    set player_id = p_winner_player_id
20    where player_id = p_loser_player_id;
21
22    get diagnostics rowcount = ROW_COUNT;
23    raise notice '% game stat rows updated.', rowcount;
24
25    -- copy player_elos entries that don't currently exist for the winner
26    insert into xonstat.player_elos
27    select p_winner_player_id, game_type_cd, games, elo from xonstat.player_elos pe
28    where player_id = p_loser_player_id
29    and not exists (select 1 from xonstat.player_elos where player_id = p_winner_player_id and game_type_cd = pe.game_type_cd);
30
31    -- Take the aggregate # of games and the *greatest* Elo 
32    -- value and use that going forward
33    FOR r in (
34      select game_type_cd, sum(games) sum_games, 
35      max(elo) max_elo, max(update_dt) max_update_dt
36      from player_elos
37      where player_id in (p_winner_player_id, p_loser_player_id) 
38      group by game_type_cd
39    )
40    LOOP
41       update xonstat.player_elos
42       set elo = r.max_elo, games = r.sum_games, update_dt = r.max_update_dt
43       where player_id = p_winner_player_id
44       and game_type_cd = r.game_type_cd
45       and games != r.sum_games;
46
47       raise notice 'New % Elo is %.', r.game_type_cd, r.max_elo;
48    END LOOP;
49
50    -- then hashkeys (winner takes the loser's hashkey)
51    update hashkeys
52    set player_id = p_winner_player_id
53    where player_id = p_loser_player_id;
54
55    get diagnostics rowcount = ROW_COUNT;
56    raise notice '% hashkeys copied.', rowcount;
57
58    -- and finally deactivate the old player record
59    update players set active_ind = false where player_id = p_loser_player_id;
60 end;
61 $$
62 language plpgsql;