@idealic/poker-engine
Version:
Professional poker game engine and hand evaluator with built-in iterator utilities
278 lines (267 loc) • 13.9 kB
Markdown
This is definition of all the stats and metrics recorded by Poker Engine system.
```SQL
-- Create a view that defines the base metrics template
CREATE OR REPLACE VIEW player_metrics_definition AS
SELECT
-- This view provides the base aggregations only, no derived metrics
-- Basic metrics
-- Total number of aggressive actions (bets or raises)
SUM(aggressions) as aggressions,
-- Total number of passive actions (calls or checks)
SUM(passivities) as passivities,
-- Total number of decisions made (fold, call, check, bet, raise)
SUM(decisions) as decisions,
-- Total number of bets made
SUM(bets) as bets,
-- Total number of raises made
SUM(raises) as raises,
-- Total number of calls made
SUM(calls) as calls,
-- Total number of checks made
SUM(checks) as checks,
-- Total number of folds made
SUM(folds) as folds,
-- Total number of times player went all-in
SUM(all_ins) as all_ins,
-- Times player voluntarily put money in pot (VPIP)
SUM(voluntary_put_money_in_pot_times) as voluntary_put_money_in_pot_times,
-- Times player made the first aggressive action on a street
SUM(first_aggressions) as first_aggressions,
-- Times player made the last aggressive action on a street
SUM(last_aggressions) as last_aggressions,
-- Opportunities and outcomes
-- Times player called with no prior raises pre-flop
SUM(limps) as limps,
-- Opportunities to limp pre-flop
SUM(limp_opportunities) as limp_opportunities,
-- Times a limp resulted in winning the hand
SUM(success * limps) as limp_successes,
-- Times player made a 3-bet (a re-raise)
SUM(three_bets) as three_bets,
-- Opportunities to make a 3-bet
SUM(three_bet_opportunities) as three_bet_opportunities,
-- Times a 3-bet resulted in winning the hand
SUM(success * three_bets) as three_bet_successes,
-- Times player folded to a 3-bet
SUM(three_bet_folds) as three_bet_folds,
-- Times player faced a 3-bet
SUM(three_bet_challenges) as three_bet_challenges,
-- Times player won the hand after facing a 3-bet
SUM(success * three_bet_challenges) as three_bet_defenses,
-- Times player made a 4-bet (a re-re-raise)
SUM(four_bets) as four_bets,
-- Opportunities to make a 4-bet
SUM(four_bet_opportunities) as four_bet_opportunities,
-- Times a 4-bet resulted in winning the hand
SUM(success * four_bets) as four_bet_successes,
-- Times player folded to a 4-bet
SUM(four_bet_folds) as four_bet_folds,
-- Times player faced a 4-bet
SUM(four_bet_challenges) as four_bet_challenges,
-- Times player won the hand after facing a 4-bet
SUM(success * four_bet_challenges) as four_bet_defenses,
-- Times player made a continuation bet
SUM(cbet) as cbet,
-- Opportunities to make a continuation bet
SUM(cbet_opportunities) as cbet_opportunities,
-- Times a continuation bet resulted in winning the hand
SUM(success * cbet) as cbet_successes,
-- Times player folded to a continuation bet
SUM(cbet_folds) as cbet_folds,
-- Times player faced a continuation bet
SUM(cbet_challenges) as cbet_challenges,
-- Times player won the hand after facing a continuation bet
SUM(success * cbet_challenges) as cbet_defenses,
-- Times player attempted to steal the blinds from a late position
SUM(steals) as steals,
-- Opportunities to steal the blinds
SUM(steal_opportunities) as steal_opportunities,
-- Times a steal attempt resulted in winning the hand
SUM(success * steals) as steal_successes,
-- Times player folded to a steal attempt
SUM(steal_folds) as steal_folds,
-- Times player faced a steal attempt
SUM(steal_challenges) as steal_challenges,
-- Times player won the hand after facing a steal attempt
SUM(success * steal_challenges) as steal_defenses,
-- Times player made a donk bet (betting out of position into the previous street's aggressor)
SUM(donk_bets) as donk_bets,
-- Opportunities to make a donk bet
SUM(donk_bet_opportunities) as donk_bet_opportunities,
-- Times a donk bet resulted in winning the hand
SUM(success * donk_bets) as donk_bet_successes,
-- Times player folded to a donk bet
SUM(donk_bet_folds) as donk_bet_folds,
-- Times player faced a donk bet
SUM(donk_bet_challenges) as donk_bet_challenges,
-- Times player won the hand after facing a donk bet
SUM(success * donk_bet_challenges) as donk_bet_defenses,
-- Times player made a check-raise
SUM(check_raises) as check_raises,
-- Opportunities to make a check-raise
SUM(check_raise_opportunities) as check_raise_opportunities,
-- Times a check-raise resulted in winning the hand
SUM(success * check_raises) as check_raise_successes,
-- Times player folded to a check-raise
SUM(check_raise_folds) as check_raise_folds,
-- Times player faced a check-raise
SUM(check_raise_challenges) as check_raise_challenges,
-- Times player won the hand after facing a check-raise
SUM(success * check_raise_challenges) as check_raise_defenses,
-- Times player folded to an all-in bet
SUM(shove_folds) as shove_folds,
-- Times player faced an all-in bet
SUM(shove_challenges) as shove_challenges,
-- Times player won the hand after facing an all-in bet
SUM(success * shove_challenges) as shove_defenses,
-- Times player open-shoved (went all-in as the first to bet)
SUM(open_shoves) as open_shoves,
-- Opportunities to open-shove
SUM(open_shove_opportunities) as open_shove_opportunities,
-- Times an open-shove resulted in winning the hand
SUM(success * open_shoves) as open_shove_successes,
-- Times player folded to an open-shove
SUM(open_shove_folds) as open_shove_folds,
-- Times player faced an open-shove
SUM(open_shove_challenges) as open_shove_challenges,
-- Times player won the hand after facing an open-shove
SUM(success * open_shove_challenges) as open_shove_defenses,
-- Success metrics
-- Total number of hands won
SUM(success) as success,
-- Times hand went to showdown
SUM(went_to_showdown) as went_to_showdown,
-- Times player won the hand at showdown
SUM(won_at_showdown) as won_at_showdown,
-- Times player won the hand before showdown
SUM(won_without_showdown) as won_without_showdown,
-- Financial metrics
-- Average big blind size for the session
AVG(big_blind)::decimal as big_blind,
-- Total number of hands won
SUM(won) as won,
-- Total number of hands lost
SUM(lost) as lost,
-- Currency conversion rate
AVG(currency_rate)::decimal as currency_rate,
-- Total amount invested in pots, in big blinds
SUM(investments)::decimal as investments,
-- Net profit (winnings - investments)
SUM(profits)::decimal as profits,
-- Overall financial balance change (winnings - losses)
SUM(balance)::decimal as balance,
-- Total amount won from pots, in big blinds
SUM(winnings)::decimal as winnings,
-- Total amount lost in pots, in big blinds
SUM(losses)::decimal as losses,
-- Total rake paid, in big blinds
SUM(rake)::decimal as rake,
-- Total time spent on decisions, in milliseconds
SUM(decision_duration) as decision_duration,
-- Distinct count with placeholder
-- Total number of unique hands played
COUNT(DISTINCT game_id) as distinct_game_count
FROM player_street_stats;
-- Create a view that defines the derived metrics based on the base metrics
-- These metics are NOT stored in database, and instead produced on demand
-- They however can be used in ranked metrics.
CREATE OR REPLACE VIEW player_derived_metrics_definition AS
SELECT
-- Frequency of limping when given the chance
(limps / COALESCE(NULLIF(limp_opportunities, 0), 1)::decimal) as limp_frequency,
-- Success rate of limps
(limp_successes / COALESCE(NULLIF(limps, 0), 1)::decimal) as limp_success_frequency,
-- Ratio of aggressive actions to passive calls
((bets + raises) / COALESCE(NULLIF(calls, 0), 1)::decimal) as aggression_factor,
-- Frequency of taking an aggressive action
((bets + raises) / COALESCE(NULLIF(bets + raises + calls + folds, 0), 1)::decimal) as aggression_frequency,
-- Frequency of making a continuation bet
(cbet / COALESCE(NULLIF(cbet_opportunities, 0), 1)::decimal) as cbet_frequency,
-- Success rate of continuation bets
(cbet_successes / COALESCE(NULLIF(cbet, 0), 1)::decimal) as cbet_success_frequency,
-- Frequency of folding to a continuation bet
(cbet_folds / COALESCE(NULLIF(cbet_challenges, 0), 1)::decimal) as cbet_fold_frequency,
-- Frequency of winning against a continuation bet
(cbet_defenses / COALESCE(NULLIF(cbet_challenges, 0), 1)::decimal) as cbet_defense_frequency,
-- Frequency of making a 3-bet
(three_bets / COALESCE(NULLIF(three_bet_opportunities, 0), 1)::decimal) as three_bet_frequency,
-- Success rate of 3-bets
(three_bet_successes / COALESCE(NULLIF(three_bets, 0), 1)::decimal) as three_bet_success_frequency,
-- Frequency of folding to a 3-bet
(three_bet_folds / COALESCE(NULLIF(three_bet_challenges, 0), 1)::decimal) as three_bet_fold_frequency,
-- Frequency of winning against a 3-bet
(three_bet_defenses / COALESCE(NULLIF(three_bet_challenges, 0), 1)::decimal) as three_bet_defense_frequency,
-- Frequency of making a 4-bet
(four_bets / COALESCE(NULLIF(four_bet_opportunities, 0), 1)::decimal) as four_bet_frequency,
-- Success rate of 4-bets
(four_bet_successes / COALESCE(NULLIF(four_bets, 0), 1)::decimal) as four_bet_success_frequency,
-- Frequency of folding to a 4-bet
(four_bet_folds / COALESCE(NULLIF(four_bet_challenges, 0), 1)::decimal) as four_bet_fold_frequency,
-- Frequency of winning against a 4-bet
(four_bet_defenses / COALESCE(NULLIF(four_bet_challenges, 0), 1)::decimal) as four_bet_defense_frequency,
-- Frequency of attempting to steal blinds
(steals / COALESCE(NULLIF(steal_opportunities, 0), 1)::decimal) as steal_frequency,
-- Success rate of steal attempts
(steal_successes / COALESCE(NULLIF(steals, 0), 1)::decimal) as steal_success_frequency,
-- Frequency of folding to a steal attempt
(steal_folds / COALESCE(NULLIF(steal_challenges, 0), 1)::decimal) as steal_fold_frequency,
-- Frequency of winning against a steal attempt
(steal_defenses / COALESCE(NULLIF(steal_challenges, 0), 1)::decimal) as steal_defense_frequency,
-- Frequency of making a donk bet
(donk_bets / COALESCE(NULLIF(donk_bet_opportunities, 0), 1)::decimal) as donk_bet_frequency,
-- Success rate of donk bets
(donk_bet_successes / COALESCE(NULLIF(donk_bets, 0), 1)::decimal) as donk_bet_success_frequency,
-- Frequency of folding to a donk bet
(donk_bet_folds / COALESCE(NULLIF(donk_bet_challenges, 0), 1)::decimal) as donk_bet_fold_frequency,
-- Frequency of winning against a donk bet
(donk_bet_defenses / COALESCE(NULLIF(donk_bet_challenges, 0), 1)::decimal) as donk_bet_defense_frequency,
-- Frequency of making a check-raise
(check_raises / COALESCE(NULLIF(check_raise_opportunities, 0), 1)::decimal) as check_raise_frequency,
-- Success rate of check-raises
(check_raise_successes / COALESCE(NULLIF(check_raises, 0), 1)::decimal) as check_raise_success_frequency,
-- Frequency of folding to a check-raise
(check_raise_folds / COALESCE(NULLIF(check_raise_challenges, 0), 1)::decimal) as check_raise_fold_frequency,
-- Frequency of winning against a check-raise
(check_raise_defenses / COALESCE(NULLIF(check_raise_challenges, 0), 1)::decimal) as check_raise_defense_frequency,
-- Frequency of making an open-shove
(open_shoves / COALESCE(NULLIF(open_shove_opportunities, 0), 1)::decimal) as open_shove_frequency,
-- Success rate of open-shoves
(open_shove_successes / COALESCE(NULLIF(open_shoves, 0), 1)::decimal) as open_shove_success_frequency,
-- Frequency of folding to an open-shove
(open_shove_folds / COALESCE(NULLIF(open_shove_challenges, 0), 1)::decimal) as open_shove_fold_frequency,
-- Frequency of winning against an open-shove
(open_shove_defenses / COALESCE(NULLIF(open_shove_challenges, 0), 1)::decimal) as open_shove_defense_frequency,
-- Frequency of hands going to showdown
(went_to_showdown / COALESCE(NULLIF(decisions, 0), 1)::decimal) as went_to_showdown_frequency,
-- Win rate at showdown
(won_at_showdown / COALESCE(NULLIF(went_to_showdown, 0), 1)::decimal) as won_at_showdown_frequency,
-- Frequency of winning without showdown
(won_without_showdown / COALESCE(NULLIF(decisions, 0), 1)::decimal) as won_without_showdown_frequency,
-- Average time per decision
(decision_duration / COALESCE(NULLIF(decisions, 0), 1)::decimal) as decision_duration_average,
-- Ratio of profit to investment
(profits / COALESCE(NULLIF(investments, 0), 1)::decimal) as profit_factor,
-- Big blinds won per 100 hands
((profits / big_blind) / COALESCE(NULLIF(distinct_game_count / 100.0, 0), 1)::decimal) as bb100,
-- Return on investment percentage
((profits \* 100) / COALESCE(NULLIF(investments, 0), 1)::decimal) as return_on_investment_factor,
-- Average winnings per hand
(winnings / COALESCE(NULLIF(distinct_game_count, 0), 1)::decimal) as winnings_average,
-- Average investment per hand
(investments / COALESCE(NULLIF(distinct_game_count, 0), 1)::decimal) as investments_average,
-- Average profit per hand
(profits / COALESCE(NULLIF(distinct_game_count, 0), 1)::decimal) as profit_average,
-- Average losses per hand
(losses / COALESCE(NULLIF(distinct_game_count, 0), 1)::decimal) as losses_average
FROM player_metrics_definition;
DROP VIEW IF EXISTS player_ranked_mexrics_definition;
CREATE OR REPLACE VIEW player_ranked_metrics_definition AS
SELECT
-- Sketch for aggression factor distribution
uddsketch(50, 0.01, aggression_factor) AS aggression_factor_digest,
-- Placeholder for a new metric distribution
uddsketch(50, 0.01, 123) AS abcdefg,
-- Sketch for bb/100 distribution
uddsketch(50, 0.01, bb100) AS bb100_digest
FROM player_derived_metrics_definition;
```