From f9a769ebd36d4909fcc97deddf93d202283fc13c Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Mon, 4 May 2009 20:12:41 +0100 Subject: [PATCH 1/3] add summaries to position stats and allow choice of levels --- pyfpdb/Filters.py | 9 ++- pyfpdb/FpdbSQLQueries.py | 128 +++++++++++++++-------------------- pyfpdb/GuiPlayerStats.py | 1 + pyfpdb/GuiPositionalStats.py | 115 ++++++++++++++++++++++--------- 4 files changed, 146 insertions(+), 107 deletions(-) diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index df6262a3..e319c5fd 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -83,7 +83,7 @@ class Filters(threading.Thread): limitsFrame.show() vbox = gtk.VBox(False, 0) - self.fillLimitsFrame(vbox) + self.fillLimitsFrame(vbox, display) limitsFrame.add(vbox) dateFrame = gtk.Frame("Date:") @@ -197,6 +197,7 @@ class Filters(threading.Thread): cb = gtk.CheckButton(str(limit)) cb.connect('clicked', self.__set_limit_select, limit) hbox.pack_start(cb, False, False, 0) + cb.set_active(True) def __set_site_select(self, w, site): print w.get_active() @@ -245,7 +246,7 @@ class Filters(threading.Thread): else: print "INFO: No games returned from database" - def fillLimitsFrame(self, vbox): + def fillLimitsFrame(self, vbox, display): self.cursor.execute(self.sql.query['getLimits']) result = self.db.cursor.fetchall() if len(result) >= 1: @@ -253,6 +254,10 @@ class Filters(threading.Thread): hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, False, True, 0) self.createLimitLine(hbox, line[0]) + if "LimitSep" in display and display["LimitSep"] == True and len(result) >= 2: + hbox = gtk.HBox(False, 0) + vbox.pack_start(hbox, False, True, 0) + self.createLimitLine(hbox, "Separate levels") else: print "INFO: No games returned from database" diff --git a/pyfpdb/FpdbSQLQueries.py b/pyfpdb/FpdbSQLQueries.py index d5dc7412..1525b7e4 100644 --- a/pyfpdb/FpdbSQLQueries.py +++ b/pyfpdb/FpdbSQLQueries.py @@ -677,7 +677,6 @@ class FpdbSQLQueries: else format(100.0*sum(street0_3b4bdone)/sum(street0_3b4bchance),1) end AS pf3 ,case when sum(stealattemptchance) = 0 then '-' - else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) end AS steals ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f @@ -709,7 +708,7 @@ class FpdbSQLQueries: inner join Sites s on s.Id = gt.siteId inner join HudCache hc on hc.gameTypeId = gt.Id where hc.playerId in - # use here ? + and group by gt.base ,gt.category ,upper(gt.limitType) @@ -729,7 +728,6 @@ class FpdbSQLQueries: inner join Hands h ON h.id = hp.handId left join HandsActions ha ON ha.handPlayerId = hp.id where hp.playerId in - # use here ? and hp.tourneysPlayersId IS NULL group by hp.handId, h.gameTypeId, hp.position, hp.winnings ) hprof @@ -815,6 +813,7 @@ class FpdbSQLQueries: inner join Sites s on s.Id = gt.siteId inner join HudCache hc on hc.gameTypeId = gt.Id where hc.playerId in + and group by gt.base ,gt.category ,upper(gt.limitType) @@ -853,10 +852,7 @@ class FpdbSQLQueries: concat(upper(stats.limitType), ' ' ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' ,stats.name, ' $' - ,cast(trim(leading ' ' from - case when stats.bigBlind < 100 then format(stats.bigBlind/100.0,2) - else format(stats.bigBlind/100.0,0) - end ) as char) + ,cast(stats.bigBlindDesc as char) ) AS Game ,case when stats.PlPosition = -2 then 'BB' when stats.PlPosition = -1 then 'SB' @@ -879,25 +875,20 @@ class FpdbSQLQueries: ,stats.TuAFq ,stats.RvAFq ,stats.PoFAFq - /* if you have handsactions data the next 3 fields should give same answer as - following 3 commented out fields */ ,stats.Net ,stats.BBper100 ,stats.Profitperhand - /*,format(hprof2.sum_profit/100.0,2) AS Net - ,format((hprof2.sum_profit/(stats.bigBlind+0.0)) / (stats.n/100.0),2) - AS BBlPer100 - ,hprof2.profitperhand AS Profitperhand - */ - ,format(hprof2.variance,2) AS Variance + ,case when hprof2.variance = -999 then 'NA' + else format(hprof2.variance, 2) + end AS Variance FROM (select /* stats from hudcache */ gt.base ,gt.category - ,upper(gt.limitType) as limitType + ,upper(gt.limitType) AS limitType ,s.name - ,gt.bigBlind - ,hc.gametypeId + , AS bigBlindDesc + , AS gtId ,case when hc.position = 'B' then -2 when hc.position = 'S' then -1 when hc.position = 'D' then 0 @@ -944,18 +935,18 @@ class FpdbSQLQueries: inner join Sites s on s.Id = gt.siteId inner join HudCache hc on hc.gameTypeId = gt.Id where hc.playerId in - # use here ? + and group by gt.base ,gt.category ,upper(gt.limitType) ,s.name - ,gt.bigBlind - ,hc.gametypeId + + ,gtId ,PlPosition ) stats inner join ( select # profit from handsplayers/handsactions - hprof.gameTypeId, + hprof.gtId, case when hprof.position = 'B' then -2 when hprof.position = 'S' then -1 when hprof.position in ('3','4') then 2 @@ -964,23 +955,24 @@ class FpdbSQLQueries: end as PlPosition, sum(hprof.profit) as sum_profit, avg(hprof.profit/100.0) as profitperhand, - variance(hprof.profit/100.0) as variance + case when hprof.gtId = 1 then -999 + else variance(hprof.profit/100.0) + end as variance from - (select hp.handId, h.gameTypeId, hp.position, hp.winnings, SUM(ha.amount) as costs - , hp.winnings - SUM(ha.amount) as profit - from HandsPlayers hp - inner join Hands h ON h.id = hp.handId - left join HandsActions ha ON ha.handPlayerId = hp.id - where hp.playerId in - # use here ? - and hp.tourneysPlayersId IS NULL - group by hp.handId, h.gameTypeId, hp.position, hp.winnings - ) hprof - group by hprof.gameTypeId, PlPosition + (select hp.handId, as gtId, hp.position, hp.winnings + , SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit + from HandsPlayers hp + inner join Hands h ON h.id = hp.handId + left join HandsActions ha ON ha.handPlayerId = hp.id + where hp.playerId in + and hp.tourneysPlayersId IS NULL + group by hp.handId, gtId, hp.position, hp.winnings + ) hprof + group by hprof.gtId, PlPosition ) hprof2 - on ( hprof2.gameTypeId = stats.gameTypeId + on ( hprof2.gtId = stats.gtId and hprof2.PlPosition = stats.PlPosition) - order by stats.category, stats.limittype, stats.bigBlind, cast(stats.PlPosition as signed) + order by stats.category, stats.limitType, stats.bigBlindDesc, cast(stats.PlPosition as signed) """ elif(self.dbname == 'PostgreSQL'): self.query['playerStatsByPosition'] = """ @@ -988,11 +980,7 @@ class FpdbSQLQueries: upper(stats.limitType) || ' ' || upper(substr(stats.category,1,1)) || substr(stats.category,2) || ' ' || stats.name || ' $' - || trim(leading ' ' from - case when stats.bigBlind < 100 - then to_char(stats.bigBlind/100.0,'90D00') - else to_char(stats.bigBlind/100.0,'999990') - end ) AS Game + || stats.bigBlindDesc AS Game ,case when stats.PlPosition = -2 then 'BB' when stats.PlPosition = -1 then 'SB' when stats.PlPosition = 0 then 'Btn' @@ -1014,25 +1002,20 @@ class FpdbSQLQueries: ,stats.TuAFq ,stats.RvAFq ,stats.PoFAFq - /* if you have handsactions data the next 3 fields should give same answer as - following 3 commented out fields */ ,stats.Net ,stats.BBper100 ,stats.Profitperhand - /*,format(hprof2.sum_profit/100.0,2) AS Net - ,format((hprof2.sum_profit/(stats.bigBlind+0.0)) / (stats.n/100.0),2) - AS BBlPer100 - ,hprof2.profitperhand AS Profitperhand - */ - ,to_char(hprof2.variance, '0D00') AS Variance + ,case when hprof2.variance = -999 then 'NA' + else to_char(hprof2.variance, '0D00') + end AS Variance FROM (select /* stats from hudcache */ gt.base ,gt.category - ,upper(gt.limitType) as limitType + ,upper(gt.limitType) AS limitType ,s.name - ,gt.bigBlind - ,hc.gametypeId + , AS bigBlindDesc + , AS gtId ,case when hc.position = 'B' then -2 when hc.position = 'S' then -1 when hc.position = 'D' then 0 @@ -1040,9 +1023,8 @@ class FpdbSQLQueries: when hc.position = 'M' then 2 when hc.position = 'E' then 5 else 9 - end as PlPosition + end AS PlPosition ,sum(HDs) AS n - ,to_char(round(100.0*sum(street0VPI)/sum(HDs)),'90D0') AS vpip ,to_char(round(100.0*sum(street0Aggr)/sum(HDs)),'90D0') AS pfr ,case when sum(street0_3b4bchance) = 0 then '0' @@ -1074,23 +1056,22 @@ class FpdbSQLQueries: end AS PoFAFq ,to_char(sum(totalProfit)/100.0,'9G999G990D00') AS Net ,case when sum(HDs) = 0 then '0' - else to_char((sum(totalProfit)/(gt.bigBlind+0.0)) / (sum(HDs)/100.0), '990D00') + else to_char(sum(totalProfit/(gt.bigBlind+0.0)) / (sum(HDs)/100.0), '990D00') end AS BBper100 ,case when sum(HDs) = 0 then '0' else to_char( (sum(totalProfit)/100.0) / sum(HDs), '90D0000') end AS Profitperhand - from Gametypes gt inner join Sites s on (s.Id = gt.siteId) inner join HudCache hc on (hc.gameTypeId = gt.Id) where hc.playerId in - /* use here ? */ + and group by gt.base ,gt.category ,upper(gt.limitType) ,s.name - ,gt.bigBlind - ,hc.gametypeId + + ,gtId ,PlPosition ) stats inner join @@ -1104,23 +1085,24 @@ class FpdbSQLQueries: end as PlPosition, sum(hprof.profit) as sum_profit, avg(hprof.profit/100.0) as profitperhand, - variance(hprof.profit/100.0) as variance + case when hprof.gameTypeId = 1 then -999 + else variance(hprof.profit/100.0) + end as variance from - (select hp.handId, h.gameTypeId, hp.position, hp.winnings, SUM(ha.amount) as costs - , hp.winnings - SUM(ha.amount) as profit - from HandsPlayers hp - inner join Hands h ON h.id = hp.handId - left join HandsActions ha ON ha.handPlayerId = hp.id - where hp.playerId in - /* use here ? */ - and hp.tourneysPlayersId IS NULL - group by hp.handId, h.gameTypeId, hp.position, hp.winnings - ) hprof + (select hp.handId, as gameTypeId, hp.position, hp.winnings + , SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit + from HandsPlayers hp + inner join Hands h ON h.id = hp.handId + left join HandsActions ha ON ha.handPlayerId = hp.id + where hp.playerId in + and hp.tourneysPlayersId IS NULL + group by hp.handId, gameTypeId, hp.position, hp.winnings + ) hprof group by hprof.gameTypeId, PlPosition - ) hprof2 - on ( hprof2.gameTypeId = stats.gameTypeId + ) hprof2 + on ( hprof2.gameTypeId = stats.gtId and hprof2.PlPosition = stats.PlPosition) - order by stats.category, stats.limittype, stats.bigBlind, cast(stats.PlPosition as smallint) + order by stats.category, stats.limitType, stats.bigBlindDesc, cast(stats.PlPosition as smallint) """ elif(self.dbname == 'SQLite'): self.query['playerStatsByPosition'] = """ """ diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index e3ab446c..aef2ba38 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -115,6 +115,7 @@ class GuiPlayerStats (threading.Thread): nametest = nametest.replace(",)",")") tmp = tmp.replace("", nametest) + tmp = tmp.replace("", "1 = 1") self.cursor.execute(tmp) result = self.cursor.fetchall() diff --git a/pyfpdb/GuiPositionalStats.py b/pyfpdb/GuiPositionalStats.py index 70a877f0..9346bff2 100644 --- a/pyfpdb/GuiPositionalStats.py +++ b/pyfpdb/GuiPositionalStats.py @@ -36,6 +36,9 @@ class GuiPositionalStats (threading.Thread): self.db.do_connect(self.conf) self.cursor=self.db.cursor self.sql = querylist + self.MYSQL_INNODB = 2 + self.PGSQL = 3 + self.SQLITE = 4 settings = {} settings.update(config.get_db_parameters()) @@ -43,13 +46,14 @@ class GuiPositionalStats (threading.Thread): settings.update(config.get_import_parameters()) settings.update(config.get_default_paths()) - filters_display = { "Heroes" : True, - "Sites" : True, - "Games" : False, - "Limits" : False, - "Dates" : False, - "Button1" : True, - "Button2" : False + filters_display = { "Heroes" : True, + "Sites" : True, + "Games" : False, + "Limits" : True, + "LimitSep" : True, + "Dates" : False, + "Button1" : True, + "Button2" : False } self.filters = Filters.Filters(db, settings, config, querylist, display = filters_display) @@ -107,6 +111,7 @@ class GuiPositionalStats (threading.Thread): sites = self.filters.getSites() heroes = self.filters.getHeroes() siteids = self.filters.getSiteIds() + limits = self.filters.getLimits() sitenos = [] playerids = [] @@ -126,19 +131,15 @@ class GuiPositionalStats (threading.Thread): if not playerids: print "No player ids found" return + if not limits: + print "No limits found" + return - self.createStatsTable(vbox, playerids, sitenos) + self.createStatsTable(vbox, playerids, sitenos, limits) - def createStatsTable(self, vbox, playerids, sitenos): + def createStatsTable(self, vbox, playerids, sitenos, limits): tmp = self.sql.query['playerStatsByPosition'] - - nametest = str(tuple(playerids)) - nametest = nametest.replace("L", "") - nametest = nametest.replace(",)",")") - - tmp = tmp.replace("", nametest) - #tmp = tmp.replace("", "gt.id") - + tmp = self.refineQuery(tmp, playerids, sitenos, limits) self.cursor.execute(tmp) result = self.cursor.fetchall() self.stats_table = gtk.Table(1, 1, False) # gtk table expands as required @@ -195,13 +196,14 @@ class GuiPositionalStats (threading.Thread): # show totals at bottom tmp = self.sql.query['playerStats'] - tmp = tmp.replace("", nametest) + tmp = self.refineQuery(tmp, playerids, sitenos, limits) + self.cursor.execute(tmp) result = self.cursor.fetchall() rows = len(result) colnames = [desc[0].lower() for desc in self.cursor.description] - # blank row + # blank row between main stats and totals: col = 0 if(row%2 == 0): bgcolor = "white" @@ -249,18 +251,67 @@ class GuiPositionalStats (threading.Thread): self.db.db.rollback() #end def fillStatsFrame(self, vbox): + def refineQuery(self, query, playerids, sitenos, limits): + nametest = str(tuple(playerids)) + nametest = nametest.replace("L", "") + nametest = nametest.replace(",)",")") + query = query.replace("", nametest) + blindtest = str(tuple([x for x in limits if str(x).isdigit()])) + blindtest = blindtest.replace("L", "") + blindtest = blindtest.replace(",)",")") + query = query.replace("", "gt.bigBlind in " + blindtest) - - - - - - - - - - - - - + groupLevels = "Separate" not in str(limits) + if groupLevels: + if self.db.backend == self.MYSQL_INNODB: + bigblindselect = """concat(trim(leading ' ' from + case when min(gt.bigBlind) < 100 + then format(min(gt.bigBlind)/100.0, 2) + else format(min(gt.bigBlind)/100.0, 0) + end) + ,' - ' + trim(leading ' ' from + case when max(gt.bigBlind) < 100 + then format(max(gt.bigBlind)/100.0, 2) + else format(max(gt.bigBlind)/100.0, 0) + end) + ) """ + else: + bigblindselect = """trim(leading ' ' from + case when min(gt.bigBlind) < 100 + then to_char(min(gt.bigBlind)/100.0,'90D00') + else to_char(min(gt.bigBlind)/100.0,'999990') + end) + || ' - ' || + trim(leading ' ' from + case when max(gt.bigBlind) < 100 + then to_char(max(gt.bigBlind)/100.0,'90D00') + else to_char(max(gt.bigBlind)/100.0,'999990') + end) """ + query = query.replace("", bigblindselect) + query = query.replace("", "") + query = query.replace("", "-1") + query = query.replace("", "-1") + else: + if self.db.backend == self.MYSQL_INNODB: + bigblindselect = """trim(leading ' ' from + case when gt.bigBlind < 100 + then format(gt.bigBlind/100.0, 2) + else format(gt.bigBlind/100.0, 0) + end + ) """ + else: + bigblindselect = """trim(leading ' ' from + case when gt.bigBlind < 100 + then to_char(gt.bigBlind/100.0,'90D00') + else to_char(gt.bigBlind/100.0,'999990') + end + ) """ + query = query.replace("", bigblindselect) + query = query.replace("", ",gt.bigBlind") + query = query.replace("", "hc.gametypeId") + query = query.replace("", "h.gameTypeId") + #print "query =\n", query + return(query) + #end def refineQuery(self, query, playerids, sitenos, limits): From de98d5dd15496186329da08430bf4fbbbba04540 Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Mon, 4 May 2009 20:36:11 +0100 Subject: [PATCH 2/3] remove surplus db variable and debug mysql problem in previous commit --- pyfpdb/GuiPositionalStats.py | 28 +++++++++++++++++----------- pyfpdb/fpdb.py | 2 +- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/pyfpdb/GuiPositionalStats.py b/pyfpdb/GuiPositionalStats.py index 9346bff2..4ffffd6c 100644 --- a/pyfpdb/GuiPositionalStats.py +++ b/pyfpdb/GuiPositionalStats.py @@ -27,7 +27,7 @@ import Filters import FpdbSQLQueries class GuiPositionalStats (threading.Thread): - def __init__(self, db, config, querylist, debug=True): + def __init__(self, config, querylist, debug=True): self.debug=debug self.conf=config @@ -56,7 +56,7 @@ class GuiPositionalStats (threading.Thread): "Button2" : False } - self.filters = Filters.Filters(db, settings, config, querylist, display = filters_display) + self.filters = Filters.Filters(self.db, settings, config, querylist, display = filters_display) self.filters.registerButton1Name("Refresh") self.filters.registerButton1Callback(self.refreshStats) @@ -252,15 +252,21 @@ class GuiPositionalStats (threading.Thread): #end def fillStatsFrame(self, vbox): def refineQuery(self, query, playerids, sitenos, limits): - nametest = str(tuple(playerids)) - nametest = nametest.replace("L", "") - nametest = nametest.replace(",)",")") - query = query.replace("", nametest) + if playerids: + nametest = str(tuple(playerids)) + nametest = nametest.replace("L", "") + nametest = nametest.replace(",)",")") + query = query.replace("", nametest) + else: + query = query.replace("", "1 = 2") - blindtest = str(tuple([x for x in limits if str(x).isdigit()])) - blindtest = blindtest.replace("L", "") - blindtest = blindtest.replace(",)",")") - query = query.replace("", "gt.bigBlind in " + blindtest) + if [x for x in limits if str(x).isdigit()]: + blindtest = str(tuple([x for x in limits if str(x).isdigit()])) + blindtest = blindtest.replace("L", "") + blindtest = blindtest.replace(",)",")") + query = query.replace("", "gt.bigBlind in " + blindtest) + else: + query = query.replace("", "gt.bigBlind = -1 ") groupLevels = "Separate" not in str(limits) if groupLevels: @@ -271,7 +277,7 @@ class GuiPositionalStats (threading.Thread): else format(min(gt.bigBlind)/100.0, 0) end) ,' - ' - trim(leading ' ' from + ,trim(leading ' ' from case when max(gt.bigBlind) < 100 then format(max(gt.bigBlind)/100.0, 2) else format(max(gt.bigBlind)/100.0, 0) diff --git a/pyfpdb/fpdb.py b/pyfpdb/fpdb.py index 3ed004ef..7fcf75ee 100755 --- a/pyfpdb/fpdb.py +++ b/pyfpdb/fpdb.py @@ -337,7 +337,7 @@ class fpdb: self.add_and_display_tab(ps_tab, "Player Stats") def tab_positional_stats(self, widget, data): - new_ps_thread=GuiPositionalStats.GuiPositionalStats(self.db, self.config, self.querydict) + new_ps_thread=GuiPositionalStats.GuiPositionalStats(self.config, self.querydict) self.threads.append(new_ps_thread) ps_tab=new_ps_thread.get_vbox() self.add_and_display_tab(ps_tab, "Positional Stats") From 0ad2b06e97903e7c49da3398b6f063eacd6853d5 Mon Sep 17 00:00:00 2001 From: sqlcoder Date: Mon, 4 May 2009 23:14:33 +0100 Subject: [PATCH 3/3] Add all/none checkboxes for limits, tidy up stats tables some more --- pyfpdb/Filters.py | 51 ++++++-- pyfpdb/FpdbSQLQueries.py | 233 ++++++++++++++++------------------- pyfpdb/GuiPlayerStats.py | 108 +++++++++++++--- pyfpdb/GuiPositionalStats.py | 6 +- 4 files changed, 246 insertions(+), 152 deletions(-) diff --git a/pyfpdb/Filters.py b/pyfpdb/Filters.py index e319c5fd..ef7c8d29 100644 --- a/pyfpdb/Filters.py +++ b/pyfpdb/Filters.py @@ -82,6 +82,9 @@ class Filters(threading.Thread): limitsFrame.set_label_align(0.0, 0.0) limitsFrame.show() vbox = gtk.VBox(False, 0) + self.cbLimits = {} + self.cbNoLimits = None + self.cbAllLimits = None self.fillLimitsFrame(vbox, display) limitsFrame.add(vbox) @@ -197,22 +200,39 @@ class Filters(threading.Thread): cb = gtk.CheckButton(str(limit)) cb.connect('clicked', self.__set_limit_select, limit) hbox.pack_start(cb, False, False, 0) - cb.set_active(True) + if limit != "None": + cb.set_active(True) + return(cb) def __set_site_select(self, w, site): - print w.get_active() + #print w.get_active() self.sites[site] = w.get_active() print "self.sites[%s] set to %s" %(site, self.sites[site]) def __set_game_select(self, w, game): - print w.get_active() + #print w.get_active() self.games[game] = w.get_active() print "self.games[%s] set to %s" %(game, self.games[game]) def __set_limit_select(self, w, limit): - print w.get_active() + #print w.get_active() self.limits[limit] = w.get_active() print "self.limit[%s] set to %s" %(limit, self.limits[limit]) + if str(limit).isdigit(): + if self.limits[limit]: + if self.cbNoLimits != None: + self.cbNoLimits.set_active(False) + else: + if self.cbAllLimits != None: + self.cbAllLimits.set_active(False) + elif limit == "All": + if self.limits[limit]: + for cb in self.cbLimits.values(): + cb.set_active(True) + elif limit == "None": + if self.limits[limit]: + for cb in self.cbLimits.values(): + cb.set_active(False) def fillPlayerFrame(self, vbox): for site in self.conf.get_supported_sites(): @@ -250,14 +270,29 @@ class Filters(threading.Thread): self.cursor.execute(self.sql.query['getLimits']) result = self.db.cursor.fetchall() if len(result) >= 1: - for line in result: + hbox = gtk.HBox(True, 0) + vbox.pack_start(hbox, False, False, 0) + vbox1 = gtk.VBox(False, 0) + hbox.pack_start(vbox1, False, False, 0) + vbox2 = gtk.VBox(False, 0) + hbox.pack_start(vbox2, False, False, 0) + for i, line in enumerate(result): hbox = gtk.HBox(False, 0) - vbox.pack_start(hbox, False, True, 0) - self.createLimitLine(hbox, line[0]) + if i < len(result)/2: + vbox1.pack_start(hbox, False, False, 0) + else: + vbox2.pack_start(hbox, False, False, 0) + self.cbLimits[line[0]] = self.createLimitLine(hbox, line[0]) if "LimitSep" in display and display["LimitSep"] == True and len(result) >= 2: hbox = gtk.HBox(False, 0) vbox.pack_start(hbox, False, True, 0) - self.createLimitLine(hbox, "Separate levels") + self.cbAllLimits = self.createLimitLine(hbox, "All") + hbox = gtk.HBox(False, 0) + vbox.pack_start(hbox, False, True, 0) + self.cbNoLimits = self.createLimitLine(hbox, "None") + hbox = gtk.HBox(False, 0) + vbox.pack_start(hbox, False, True, 0) + cb = self.createLimitLine(hbox, "Separate levels") else: print "INFO: No games returned from database" diff --git a/pyfpdb/FpdbSQLQueries.py b/pyfpdb/FpdbSQLQueries.py index 1525b7e4..ba2d7230 100644 --- a/pyfpdb/FpdbSQLQueries.py +++ b/pyfpdb/FpdbSQLQueries.py @@ -633,10 +633,7 @@ class FpdbSQLQueries: concat(upper(stats.limitType), ' ' ,concat(upper(substring(stats.category,1,1)),substring(stats.category,2) ), ' ' ,stats.name, ' $' - ,cast(trim(leading ' ' from - case when stats.bigBlind < 100 then format(stats.bigBlind/100.0,2) - else format(stats.bigBlind/100.0,0) - end ) as char) + ,cast(stats.bigBlindDesc as char) ) AS Game ,stats.n ,stats.vpip @@ -651,25 +648,20 @@ class FpdbSQLQueries: ,stats.TuAFq ,stats.RvAFq ,stats.PoFAFq - /* if you have handsactions data the next 3 fields should give same answer as - following 3 commented out fields */ ,stats.Net ,stats.BBper100 ,stats.Profitperhand - /*,format(hprof2.sum_profit/100.0,2) AS Net - ,format((hprof2.sum_profit/(stats.bigBlind+0.0)) / (stats.n/100.0),2) - AS BBlPer100 - ,hprof2.profitperhand AS Profitperhand - */ - ,format(hprof2.variance,2) AS Variance + ,case when hprof2.variance = -999 then '-' + else format(hprof2.variance, 2) + end AS Variance FROM (select /* stats from hudcache */ gt.base ,gt.category ,upper(gt.limitType) as limitType ,s.name - ,gt.bigBlind - ,hc.gametypeId + , AS bigBlindDesc + , AS gtId ,sum(HDs) AS n ,format(100.0*sum(street0VPI)/sum(HDs),1) AS vpip ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr @@ -681,27 +673,27 @@ class FpdbSQLQueries: end AS steals ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(sawShowdown)/sum(street1Seen),1) end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'oo' + ,case when sum(sawShowdown) = 0 then '-' else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) end AS wmsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(street1Aggr)/sum(street1Seen),1) end AS FlAFq - ,case when sum(street2Seen) = 0 then 'oo' + ,case when sum(street2Seen) = 0 then '-' else format(100.0*sum(street2Aggr)/sum(street2Seen),1) end AS TuAFq - ,case when sum(street3Seen) = 0 then 'oo' + ,case when sum(street3Seen) = 0 then '-' else format(100.0*sum(street3Aggr)/sum(street3Seen),1) end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then 'oo' + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) end AS PoFAFq ,format(sum(totalProfit)/100.0,2) AS Net - ,format((sum(totalProfit)/(gt.bigBlind+0.0)) / (sum(HDs)/100.0),2) + ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) AS BBper100 ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand from Gametypes gt @@ -713,100 +705,94 @@ class FpdbSQLQueries: ,gt.category ,upper(gt.limitType) ,s.name - ,gt.bigBlind - ,hc.gametypeId + + ,gtId ) stats inner join ( select # profit from handsplayers/handsactions - hprof.gameTypeId, sum(hprof.profit) sum_profit, + hprof.gtId, sum(hprof.profit) sum_profit, avg(hprof.profit/100.0) profitperhand, - variance(hprof.profit/100.0) variance + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance from - (select hp.handId, h.gameTypeId, hp.winnings, SUM(ha.amount) as costs + (select hp.handId, as gtId, hp.winnings, SUM(ha.amount) as costs , hp.winnings - SUM(ha.amount) as profit - from HandsPlayers hp - inner join Hands h ON h.id = hp.handId - left join HandsActions ha ON ha.handPlayerId = hp.id - where hp.playerId in - and hp.tourneysPlayersId IS NULL - group by hp.handId, h.gameTypeId, hp.position, hp.winnings - ) hprof - group by hprof.gameTypeId + from HandsPlayers hp + inner join Hands h ON h.id = hp.handId + left join HandsActions ha ON ha.handPlayerId = hp.id + where hp.playerId in + and hp.tourneysPlayersId IS NULL + group by hp.handId, gtId, hp.position, hp.winnings + ) hprof + group by hprof.gtId ) hprof2 - on hprof2.gameTypeId = stats.gameTypeId - order by stats.category, stats.limittype, stats.bigBlind""" + on hprof2.gtId = stats.gtId + order by stats.category, stats.limittype, stats.bigBlindDesc""" elif(self.dbname == 'PostgreSQL'): self.query['playerStats'] = """ SELECT upper(stats.limitType) || ' ' || initcap(stats.category) || ' ' || stats.name || ' $' - || trim(leading ' ' from - case when stats.bigBlind < 100 then to_char(stats.bigBlind/100.0,'0D00') - else to_char(stats.bigBlind/100.0,'99990') - end ) AS Game - ,stats.n - ,stats.vpip - ,stats.pfr - ,stats.pf3 - ,stats.steals - ,stats.saw_f - ,stats.sawsd - ,stats.wtsdwsf - ,stats.wmsd - ,stats.FlAFq - ,stats.TuAFq - ,stats.RvAFq - ,stats.PoFAFq - /* if you have handsactions data the next 3 fields should give same answer as - following 3 commented out fields */ - ,stats.Net - ,stats.BBper100 - ,stats.Profitperhand - /*,to_char(hprof2.sum_profit/100.0,'9G999G990D00') AS Net - ,to_char((hprof2.sum_profit/(stats.bigBlind+0.0)) / (stats.n/100.0), '990D00') - AS BBper100 - ,hprof2.profitperhand AS Profitperhand - */ - ,round(hprof2.variance,2) AS Variance + || stats.bigBlindDesc AS Game + ,stats.n + ,stats.vpip + ,stats.pfr + ,stats.pf3 + ,stats.steals + ,stats.saw_f + ,stats.sawsd + ,stats.wtsdwsf + ,stats.wmsd + ,stats.FlAFq + ,stats.TuAFq + ,stats.RvAFq + ,stats.PoFAFq + ,stats.Net + ,stats.BBper100 + ,stats.Profitperhand + ,case when hprof2.variance = -999 then '-' + else to_char(hprof2.variance, '0D00') + end AS Variance FROM (select gt.base ,gt.category - ,upper(gt.limitType) as limitType + ,upper(gt.limitType) AS limitType ,s.name - ,gt.bigBlind - ,hc.gametypeId + , AS bigBlindDesc + , AS gtId ,sum(HDs) as n ,to_char(100.0*sum(street0VPI)/sum(HDs),'90D0') AS vpip ,to_char(100.0*sum(street0Aggr)/sum(HDs),'90D0') AS pfr ,case when sum(street0_3b4bchance) = 0 then '0' else to_char(100.0*sum(street0_3b4bdone)/sum(street0_3b4bchance),'90D0') end AS pf3 - ,case when sum(stealattemptchance) = 0 then '0' + ,case when sum(stealattemptchance) = 0 then '-' else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') end AS steals ,to_char(100.0*sum(street1Seen)/sum(HDs),'90D0') AS saw_f ,to_char(100.0*sum(sawShowdown)/sum(HDs),'90D0') AS sawsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else to_char(100.0*sum(sawShowdown)/sum(street1Seen),'90D0') end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'oo' + ,case when sum(sawShowdown) = 0 then '-' else to_char(100.0*sum(wonAtSD)/sum(sawShowdown),'90D0') end AS wmsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else to_char(100.0*sum(street1Aggr)/sum(street1Seen),'90D0') end AS FlAFq - ,case when sum(street2Seen) = 0 then 'oo' + ,case when sum(street2Seen) = 0 then '-' else to_char(100.0*sum(street2Aggr)/sum(street2Seen),'90D0') end AS TuAFq - ,case when sum(street3Seen) = 0 then 'oo' + ,case when sum(street3Seen) = 0 then '-' else to_char(100.0*sum(street3Aggr)/sum(street3Seen),'90D0') end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then 'oo' + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' else to_char(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),'90D0') end AS PoFAFq ,round(sum(totalProfit)/100.0,2) AS Net - ,to_char((sum(totalProfit)/(gt.bigBlind+0.0)) / (sum(HDs)/100.0), '990D00') + ,to_char((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0), '990D00') AS BBper100 ,to_char(sum(totalProfit/100.0) / (sum(HDs)+0.0), '990D0000') AS Profitperhand from Gametypes gt @@ -818,31 +804,30 @@ class FpdbSQLQueries: ,gt.category ,upper(gt.limitType) ,s.name - ,gt.bigBlind - ,hc.gametypeId + + ,gtId ) stats inner join ( select - hprof.gameTypeId, sum(hprof.profit) AS sum_profit, + hprof.gtId, sum(hprof.profit) AS sum_profit, avg(hprof.profit/100.0) AS profitperhand, - variance(hprof.profit/100.0) AS variance + case when hprof.gtId = -1 then -999 + else variance(hprof.profit/100.0) + end as variance from - (select hp.handId, - h.gameTypeId, - hp.winnings, - SUM(ha.amount) as costs, - hp.winnings - SUM(ha.amount) as profit - from HandsPlayers hp - inner join Hands h ON (h.id = hp.handId) - left join HandsActions ha ON (ha.handPlayerId = hp.id) - where hp.playerId in - and hp.tourneysPlayersId IS NULL - group by hp.handId, h.gameTypeId, hp.position, hp.winnings - ) hprof - group by hprof.gameTypeId + (select hp.handId, as gtId, hp.winnings, + SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit + from HandsPlayers hp + inner join Hands h ON (h.id = hp.handId) + left join HandsActions ha ON (ha.handPlayerId = hp.id) + where hp.playerId in + and hp.tourneysPlayersId IS NULL + group by hp.handId, gtId, hp.position, hp.winnings + ) hprof + group by hprof.gtId ) hprof2 - on hprof2.gameTypeId = stats.gameTypeId - order by stats.base, stats.limittype, stats.bigBlind""" + on hprof2.gtId = stats.gtId + order by stats.base, stats.limittype, stats.bigBlindDesc""" elif(self.dbname == 'SQLite'): self.query['playerStats'] = """ """ @@ -878,7 +863,7 @@ class FpdbSQLQueries: ,stats.Net ,stats.BBper100 ,stats.Profitperhand - ,case when hprof2.variance = -999 then 'NA' + ,case when hprof2.variance = -999 then '-' else format(hprof2.variance, 2) end AS Variance FROM @@ -903,32 +888,32 @@ class FpdbSQLQueries: ,case when sum(street0_3b4bchance) = 0 then '0' else format(100.0*sum(street0_3b4bdone)/sum(street0_3b4bchance),1) end AS pf3 - ,case when sum(stealattemptchance) = 0 then '0' + ,case when sum(stealattemptchance) = 0 then '-' else format(100.0*sum(stealattempted)/sum(stealattemptchance),1) end AS steals ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(sawShowdown)/sum(street1Seen),1) end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'oo' + ,case when sum(sawShowdown) = 0 then '-' else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) end AS wmsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(street1Aggr)/sum(street1Seen),1) end AS FlAFq - ,case when sum(street2Seen) = 0 then 'oo' + ,case when sum(street2Seen) = 0 then '-' else format(100.0*sum(street2Aggr)/sum(street2Seen),1) end AS TuAFq - ,case when sum(street3Seen) = 0 then 'oo' + ,case when sum(street3Seen) = 0 then '-' else format(100.0*sum(street3Aggr)/sum(street3Seen),1) end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then 'oo' + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) end AS PoFAFq ,format(sum(totalProfit)/100.0,2) AS Net - ,format((sum(totalProfit)/(gt.bigBlind+0.0)) / (sum(HDs)/100.0),2) + ,format((sum(totalProfit/(gt.bigBlind+0.0))) / (sum(HDs)/100.0),2) AS BBper100 ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand from Gametypes gt @@ -955,7 +940,7 @@ class FpdbSQLQueries: end as PlPosition, sum(hprof.profit) as sum_profit, avg(hprof.profit/100.0) as profitperhand, - case when hprof.gtId = 1 then -999 + case when hprof.gtId = -1 then -999 else variance(hprof.profit/100.0) end as variance from @@ -1005,7 +990,7 @@ class FpdbSQLQueries: ,stats.Net ,stats.BBper100 ,stats.Profitperhand - ,case when hprof2.variance = -999 then 'NA' + ,case when hprof2.variance = -999 then '-' else to_char(hprof2.variance, '0D00') end AS Variance FROM @@ -1030,27 +1015,27 @@ class FpdbSQLQueries: ,case when sum(street0_3b4bchance) = 0 then '0' else to_char(100.0*sum(street0_3b4bdone)/sum(street0_3b4bchance),'90D0') end AS pf3 - ,case when sum(stealattemptchance) = 0 then '0' + ,case when sum(stealattemptchance) = 0 then '-' else to_char(100.0*sum(stealattempted)/sum(stealattemptchance),'90D0') end AS steals ,to_char(round(100.0*sum(street1Seen)/sum(HDs)),'90D0') AS saw_f ,to_char(round(100.0*sum(sawShowdown)/sum(HDs)),'90D0') AS sawsd - ,case when sum(street1Seen) = 0 then 'NA' + ,case when sum(street1Seen) = 0 then '-' else to_char(round(100.0*sum(sawShowdown)/sum(street1Seen)),'90D0') end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'NA' + ,case when sum(sawShowdown) = 0 then '-' else to_char(round(100.0*sum(wonAtSD)/sum(sawShowdown)),'90D0') end AS wmsd - ,case when sum(street1Seen) = 0 then 'NA' + ,case when sum(street1Seen) = 0 then '-' else to_char(round(100.0*sum(street1Aggr)/sum(street1Seen)),'90D0') end AS FlAFq - ,case when sum(street2Seen) = 0 then 'NA' + ,case when sum(street2Seen) = 0 then '-' else to_char(round(100.0*sum(street2Aggr)/sum(street2Seen)),'90D0') end AS TuAFq - ,case when sum(street3Seen) = 0 then 'NA' + ,case when sum(street3Seen) = 0 then '-' else to_char(round(100.0*sum(street3Aggr)/sum(street3Seen)),'90D0') end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then 'NA' + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' else to_char(round(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen))),'90D0') end AS PoFAFq @@ -1076,7 +1061,7 @@ class FpdbSQLQueries: ) stats inner join ( select /* profit from handsplayers/handsactions */ - hprof.gameTypeId, + hprof.gtId, case when hprof.position = 'B' then -2 when hprof.position = 'S' then -1 when hprof.position in ('3','4') then 2 @@ -1085,11 +1070,11 @@ class FpdbSQLQueries: end as PlPosition, sum(hprof.profit) as sum_profit, avg(hprof.profit/100.0) as profitperhand, - case when hprof.gameTypeId = 1 then -999 + case when hprof.gtId = -1 then -999 else variance(hprof.profit/100.0) end as variance from - (select hp.handId, as gameTypeId, hp.position, hp.winnings + (select hp.handId, as gtId, hp.position, hp.winnings , SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit from HandsPlayers hp inner join Hands h ON h.id = hp.handId @@ -1098,9 +1083,9 @@ class FpdbSQLQueries: and hp.tourneysPlayersId IS NULL group by hp.handId, gameTypeId, hp.position, hp.winnings ) hprof - group by hprof.gameTypeId, PlPosition + group by hprof.gtId, PlPosition ) hprof2 - on ( hprof2.gameTypeId = stats.gtId + on ( hprof2.gtId = stats.gtId and hprof2.PlPosition = stats.PlPosition) order by stats.category, stats.limitType, stats.bigBlindDesc, cast(stats.PlPosition as smallint) """ @@ -1168,24 +1153,24 @@ class FpdbSQLQueries: ,format(100.0*sum(street0Aggr)/sum(HDs),1) AS pfr ,format(100.0*sum(street1Seen)/sum(HDs),1) AS saw_f ,format(100.0*sum(sawShowdown)/sum(HDs),1) AS sawsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(sawShowdown)/sum(street1Seen),1) end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'oo' + ,case when sum(sawShowdown) = 0 then '-' end AS wtsdwsf - ,case when sum(sawShowdown) = 0 then 'oo' + ,case when sum(sawShowdown) = 0 then '-' else format(100.0*sum(wonAtSD)/sum(sawShowdown),1) end AS wmsd - ,case when sum(street1Seen) = 0 then 'oo' + ,case when sum(street1Seen) = 0 then '-' else format(100.0*sum(street1Aggr)/sum(street1Seen),1) end AS FlAFq - ,case when sum(street2Seen) = 0 then 'oo' + ,case when sum(street2Seen) = 0 then '-' else format(100.0*sum(street2Aggr)/sum(street2Seen),1) end AS TuAFq - ,case when sum(street3Seen) = 0 then 'oo' + ,case when sum(street3Seen) = 0 then '-' else format(100.0*sum(street3Aggr)/sum(street3Seen),1) end AS RvAFq - ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then 'oo' + ,case when sum(street1Seen)+sum(street2Seen)+sum(street3Seen) = 0 then '-' else format(100.0*(sum(street1Aggr)+sum(street2Aggr)+sum(street3Aggr)) /(sum(street1Seen)+sum(street2Seen)+sum(street3Seen)),1) end AS PoFAFq diff --git a/pyfpdb/GuiPlayerStats.py b/pyfpdb/GuiPlayerStats.py index aef2ba38..dfc5d1c3 100644 --- a/pyfpdb/GuiPlayerStats.py +++ b/pyfpdb/GuiPlayerStats.py @@ -30,6 +30,9 @@ class GuiPlayerStats (threading.Thread): def __init__(self, config, querylist, debug=True): self.debug=debug self.conf=config + self.MYSQL_INNODB = 2 + self.PGSQL = 3 + self.SQLITE = 4 # create new db connection to avoid conflicts with other threads self.db = fpdb_db.fpdb_db() @@ -43,16 +46,19 @@ class GuiPlayerStats (threading.Thread): settings.update(config.get_import_parameters()) settings.update(config.get_default_paths()) - filters_display = { "Heroes" : True, - "Sites" : True, - "Games" : False, - "Limits" : False, - "Dates" : False, - "Button1" : False, - "Button2" : False + filters_display = { "Heroes" : True, + "Sites" : True, + "Games" : False, + "Limits" : True, + "LimitSep" : True, + "Dates" : False, + "Button1" : True, + "Button2" : False } self.filters = Filters.Filters(self.db, settings, config, querylist, display = filters_display) + self.filters.registerButton1Name("Refresh") + self.filters.registerButton1Callback(self.refreshStats) self.stat_table = None self.stats_frame = None @@ -85,6 +91,7 @@ class GuiPlayerStats (threading.Thread): sites = self.filters.getSites() heroes = self.filters.getHeroes() siteids = self.filters.getSiteIds() + limits = self.filters.getLimits() sitenos = [] playerids = [] @@ -104,19 +111,15 @@ class GuiPlayerStats (threading.Thread): if not playerids: print "No player ids found" return + if not limits: + print "No limits found" + return - self.createStatsTable(vbox, playerids, sitenos) + self.createStatsTable(vbox, playerids, sitenos, limits) - def createStatsTable(self, vbox, playerids, sitenos): + def createStatsTable(self, vbox, playerids, sitenos, limits): tmp = self.sql.query['playerStats'] - - nametest = str(tuple(playerids)) - nametest = nametest.replace("L", "") - nametest = nametest.replace(",)",")") - - tmp = tmp.replace("", nametest) - tmp = tmp.replace("", "1 = 1") - + tmp = self.refineQuery(tmp, playerids, sitenos, limits) self.cursor.execute(tmp) result = self.cursor.fetchall() cols = 18 @@ -159,3 +162,74 @@ class GuiPlayerStats (threading.Thread): eb.show() self.db.db.commit() #end def fillStatsFrame(self, vbox): + + def refineQuery(self, query, playerids, sitenos, limits): + if playerids: + nametest = str(tuple(playerids)) + nametest = nametest.replace("L", "") + nametest = nametest.replace(",)",")") + query = query.replace("", nametest) + else: + query = query.replace("", "1 = 2") + + if [x for x in limits if str(x).isdigit()]: + blindtest = str(tuple([x for x in limits if str(x).isdigit()])) + blindtest = blindtest.replace("L", "") + blindtest = blindtest.replace(",)",")") + query = query.replace("", "gt.bigBlind in " + blindtest) + else: + query = query.replace("", "gt.bigBlind = -1 ") + + groupLevels = "Separate" not in str(limits) + if groupLevels: + if self.db.backend == self.MYSQL_INNODB: + bigblindselect = """concat(trim(leading ' ' from + case when min(gt.bigBlind) < 100 + then format(min(gt.bigBlind)/100.0, 2) + else format(min(gt.bigBlind)/100.0, 0) + end) + ,' - ' + ,trim(leading ' ' from + case when max(gt.bigBlind) < 100 + then format(max(gt.bigBlind)/100.0, 2) + else format(max(gt.bigBlind)/100.0, 0) + end) + ) """ + else: + bigblindselect = """trim(leading ' ' from + case when min(gt.bigBlind) < 100 + then to_char(min(gt.bigBlind)/100.0,'90D00') + else to_char(min(gt.bigBlind)/100.0,'999990') + end) + || ' - ' || + trim(leading ' ' from + case when max(gt.bigBlind) < 100 + then to_char(max(gt.bigBlind)/100.0,'90D00') + else to_char(max(gt.bigBlind)/100.0,'999990') + end) """ + query = query.replace("", bigblindselect) + query = query.replace("", "") + query = query.replace("", "-1") + query = query.replace("", "-1") + else: + if self.db.backend == self.MYSQL_INNODB: + bigblindselect = """trim(leading ' ' from + case when gt.bigBlind < 100 + then format(gt.bigBlind/100.0, 2) + else format(gt.bigBlind/100.0, 0) + end + ) """ + else: + bigblindselect = """trim(leading ' ' from + case when gt.bigBlind < 100 + then to_char(gt.bigBlind/100.0,'90D00') + else to_char(gt.bigBlind/100.0,'999990') + end + ) """ + query = query.replace("", bigblindselect) + query = query.replace("", ",gt.bigBlind") + query = query.replace("", "hc.gametypeId") + query = query.replace("", "h.gameTypeId") + #print "query =\n", query + return(query) + #end def refineQuery(self, query, playerids, sitenos, limits): diff --git a/pyfpdb/GuiPositionalStats.py b/pyfpdb/GuiPositionalStats.py index 4ffffd6c..8ed12172 100644 --- a/pyfpdb/GuiPositionalStats.py +++ b/pyfpdb/GuiPositionalStats.py @@ -30,15 +30,15 @@ class GuiPositionalStats (threading.Thread): def __init__(self, config, querylist, debug=True): self.debug=debug self.conf=config + self.MYSQL_INNODB = 2 + self.PGSQL = 3 + self.SQLITE = 4 # create new db connection to avoid conflicts with other threads self.db = fpdb_db.fpdb_db() self.db.do_connect(self.conf) self.cursor=self.db.cursor self.sql = querylist - self.MYSQL_INNODB = 2 - self.PGSQL = 3 - self.SQLITE = 4 settings = {} settings.update(config.get_db_parameters())