Update database schemea: add stats

This commit is contained in:
Maximilian Keßler 2023-11-23 18:31:59 +01:00
parent 4e0b624c3f
commit 9a8318bc6d
Signed by: max
GPG key ID: BCC5A619923C0BA5
2 changed files with 44 additions and 8 deletions

View file

@ -272,7 +272,7 @@ CREATE TABLE variant_ratings (
DROP TABLE IF EXISTS user_base_ratings CASCADE; DROP TABLE IF EXISTS user_base_ratings CASCADE;
CREATE TABLE user_base_ratings ( CREATE TABLE user_base_ratings (
user_id SMALLINT, user_id INTEGER,
/** /**
* Since a user has different ratings now, this should represent which of the ratings we mean. * Since a user has different ratings now, this should represent which of the ratings we mean.
* For now, I suggest 0 = NoVar, 1 = ClueStarved. * For now, I suggest 0 = NoVar, 1 = ClueStarved.
@ -295,7 +295,7 @@ CREATE TABLE user_ratings (
*/ */
league_id INTEGER REFERENCES games (league_id), league_id INTEGER REFERENCES games (league_id),
user_id SMALLINT NOT NULL, user_id INTEGER NOT NULL,
type SMALLINT NOT NULL, type SMALLINT NOT NULL,
/** /**
@ -316,13 +316,38 @@ CREATE TABLE user_ratings (
/* TABLES RELATED TO STATISTICS */ /* TABLES RELATED TO STATISTICS */
/** This is a rough outline, not really happy with it right now. */ /** This is a rough outline, not really happy with it right now. */
DROP TABLE IF EXISTS statistics CASCADE; DROP TABLE IF EXISTS game_statistics CASCADE;
CREATE TABLE statistics ( CREATE TABLE game_statistics (
game_id INTEGER PRIMARY KEY, game_id INTEGER PRIMARY KEY REFERENCES games (id),
/** I'd say all of the following can just be null in case we have not evaluated them yet. */ /** I'd say all of the following can just be null in case we have not evaluated them yet. */
bdr SMALLINT, bottom_deck_risk SMALLINT,
moves SMALLINT, num_crits_lost SMALLINT
strikeout BOOLEAN );
/**
* Need a new table here, since a single game might have several outcomes:
* Think of losing a crit and striking out, for example
*/
DROP TABLE IF EXISTS game_outcomes CASCADE;
CREATE TABLE game_outcomes (
game_id INTEGER REFERENCES games (id),
/** This stores the game outcome, corresponding to the values of the statistics.GameOutcome enum */
outcome SMALLINT
);
DROP TABLE IF EXISTS user_statistics;
CREATE TABLE user_statistics (
user_id INTEGER NOT NULL REFERENCES users (id),
/** We track stats separately for each variant type */
variant_type SMALLINT NOT NULL,
current_streak INTEGER NOT NULL,
games_played INTEGER NOT NULL,
games_won INTEGER NOT NULL,
total_bdr INTEGER NOT NULL,
/** Number of critical cards that were either discarded or misplayed */
total_crits_lots INTEGER NOT NULL,
total_game_moves INTEGER NOT NULL,
PRIMARY KEY (user_id, variant_type)
); );
/** /**

View file

@ -3,6 +3,8 @@ from typing import List, Tuple
from hanabi import hanab_game from hanabi import hanab_game
from database import conn_manager
class GameOutcome(enum.Enum): class GameOutcome(enum.Enum):
win = 0 win = 0
@ -59,3 +61,12 @@ def analyze_game(instance: hanab_game.HanabiInstance, actions: List[hanab_game.A
outcomes.append(GameOutcome.win) outcomes.append(GameOutcome.win)
return GameAnalysisResult(outcomes, bdrs) return GameAnalysisResult(outcomes, bdrs)
def update_user_statistics(user_ids: List[int]):
"""
Update the cumulative user statistics for this user, assuming that the corresponding game statistics have
been computed already.
@param user_ids:
@return:
"""