diff --git a/src/stats.py b/src/stats.py index f3d573d..5a0e3c1 100644 --- a/src/stats.py +++ b/src/stats.py @@ -80,33 +80,59 @@ def update_user_statistics(): # Update total number of moves for clue_starved in [True, False]: + rating_type = utils.get_rating_type(clue_starved) # We insert 0 here to ensure that we have an entry for each player # Note that this will immediately be changed by the next query in case it is nonzero, # so the zero value never shows up in the database if it was nonzero before. cur.execute( - "INSERT INTO user_statistics (user_id, variant_type, total_game_moves)" + "INSERT INTO user_statistics (user_id, variant_type, total_game_moves, games_played, games_won)" " (" - " SELECT id, %s, %s FROM users" + " SELECT id, %s, 0, 0, 0 FROM users" " )" "ON CONFLICT (user_id, variant_type) DO UPDATE " - "SET total_game_moves = EXCLUDED.total_game_moves", - (utils.get_rating_type(clue_starved), 0) + "SET" + " (total_game_moves, games_played, games_won)" + " =" + " (EXCLUDED.total_game_moves, EXCLUDED.games_played, EXCLUDED.games_won)", + (rating_type,) ) cur.execute( "INSERT INTO user_statistics (user_id, variant_type, total_game_moves)" " (" " SELECT users.id, %s, SUM(games.num_turns) FROM users " - " LEFT OUTER JOIN game_participants " + " INNER JOIN game_participants " " ON game_participants.user_id = users.id " - " LEFT OUTER JOIN games " + " INNER JOIN games " " ON game_participants.game_id = games.id " - " LEFT OUTER JOIN variants" + " INNER JOIN variants" " ON variants.id = games.variant_id " " WHERE variants.clue_starved = %s OR variants.clue_starved IS NULL" " GROUP BY users.id " " ) " "ON CONFLICT (user_id, variant_type) DO UPDATE " "SET total_game_moves = EXCLUDED.total_game_moves", - (utils.get_rating_type(clue_starved), clue_starved) + (rating_type, clue_starved) + ) + cur.execute( + "INSERT INTO user_statistics (user_id, variant_type, games_played, games_won)" + " (" + " SELECT" + " users.id," + " %s," + " COUNT(games.id)," + " COUNT(games.id) FILTER ( WHERE variants.num_suits * 5 = games.score )" + " FROM users " + " INNER JOIN game_participants " + " ON game_participants.user_id = users.id " + " INNER JOIN games " + " ON game_participants.game_id = games.id " + " INNER JOIN variants " + " ON variants.id = games.variant_id " + " WHERE variants.clue_starved = %s OR variants.clue_starved IS NULL " + " GROUP BY users.id" + " )" + "ON CONFLICT (user_id, variant_type) DO UPDATE " + "SET (games_played, games_won) = (EXCLUDED.games_played, EXCLUDED.games_won)", + (rating_type, clue_starved) ) conn_manager.get_connection().commit()