Merge branch 'master' of git://git.assembla.com/fpdb-sql

This commit is contained in:
Worros 2009-05-17 12:09:55 +08:00
commit 2c01a1f911
7 changed files with 595 additions and 98 deletions

View File

@ -48,7 +48,7 @@ class Filters(threading.Thread):
# text used on screen stored here so that it can be configured # text used on screen stored here so that it can be configured
self.filterText = {'limitsall':'All', 'limitsnone':'None', 'limitsshow':'Show Limits' self.filterText = {'limitsall':'All', 'limitsnone':'None', 'limitsshow':'Show Limits'
,'seatsbetween':'Between:', 'seatsand':'And:', 'seatsand':'Show Seats' ,'seatsbetween':'Between:', 'seatsand':'And:', 'seatsshow':'Show Seats'
} }
# For use in date ranges. # For use in date ranges.
@ -102,7 +102,7 @@ class Filters(threading.Thread):
vbox = gtk.VBox(False, 0) vbox = gtk.VBox(False, 0)
self.sbSeats = {} self.sbSeats = {}
self.fillSeatsFrame(vbox) self.fillSeatsFrame(vbox, display)
seatsFrame.add(vbox) seatsFrame.add(vbox)
dateFrame = gtk.Frame("Date:") dateFrame = gtk.Frame("Date:")
@ -170,8 +170,10 @@ class Filters(threading.Thread):
return ltuple return ltuple
def getSeats(self): def getSeats(self):
self.seats['from'] = self.sbSeats['from'].get_value_as_int() if 'from' in self.sbSeats:
self.seats['to'] = self.sbSeats['to'].get_value_as_int() self.seats['from'] = self.sbSeats['from'].get_value_as_int()
if 'to' in self.sbSeats:
self.seats['to'] = self.sbSeats['to'].get_value_as_int()
return self.seats return self.seats
def getDates(self): def getDates(self):
@ -307,7 +309,7 @@ class Filters(threading.Thread):
hbox.pack_start(vbox2, False, False, 0) hbox.pack_start(vbox2, False, False, 0)
for i, line in enumerate(result): for i, line in enumerate(result):
hbox = gtk.HBox(False, 0) hbox = gtk.HBox(False, 0)
if i < len(result)/2: if i <= len(result)/2:
vbox1.pack_start(hbox, False, False, 0) vbox1.pack_start(hbox, False, False, 0)
else: else:
vbox2.pack_start(hbox, False, False, 0) vbox2.pack_start(hbox, False, False, 0)
@ -325,7 +327,7 @@ class Filters(threading.Thread):
else: else:
print "INFO: No games returned from database" print "INFO: No games returned from database"
def fillSeatsFrame(self, vbox): def fillSeatsFrame(self, vbox, display):
hbox = gtk.HBox(False, 0) hbox = gtk.HBox(False, 0)
vbox.pack_start(hbox, False, True, 0) vbox.pack_start(hbox, False, True, 0)
@ -335,22 +337,28 @@ class Filters(threading.Thread):
sb1 = gtk.SpinButton(adjustment=adj1, climb_rate=0.0, digits=0) sb1 = gtk.SpinButton(adjustment=adj1, climb_rate=0.0, digits=0)
adj2 = gtk.Adjustment(value=10, lower=2, upper=10, step_incr=1, page_incr=1, page_size=0) adj2 = gtk.Adjustment(value=10, lower=2, upper=10, step_incr=1, page_incr=1, page_size=0)
sb2 = gtk.SpinButton(adjustment=adj2, climb_rate=0.0, digits=0) sb2 = gtk.SpinButton(adjustment=adj2, climb_rate=0.0, digits=0)
cb = gtk.CheckButton(self.filterText['seatsand'])
cb.connect('clicked', self.__set_seat_select, 'show')
hbox.pack_start(lbl_from, expand=False, padding=3) hbox.pack_start(lbl_from, expand=False, padding=3)
hbox.pack_start(sb1, False, False, 0) hbox.pack_start(sb1, False, False, 0)
hbox.pack_start(lbl_to, expand=False, padding=3) hbox.pack_start(lbl_to, expand=False, padding=3)
hbox.pack_start(sb2, False, False, 0) hbox.pack_start(sb2, False, False, 0)
hbox = gtk.HBox(False, 0) if "SeatSep" in display and display["SeatSep"] == True:
vbox.pack_start(hbox, False, True, 0) hbox = gtk.HBox(False, 0)
hbox.pack_start(cb, False, False, 0) vbox.pack_start(hbox, False, True, 0)
cb = gtk.CheckButton(self.filterText['seatsshow'])
cb.connect('clicked', self.__set_seat_select, 'show')
hbox.pack_start(cb, False, False, 0)
self.sbSeats['show'] = cb
self.seats['show'] = False
self.sbSeats['from'] = sb1 self.sbSeats['from'] = sb1
self.sbSeats['to'] = sb2 self.sbSeats['to'] = sb2
self.sbSeats['show'] = cb
self.seats['show'] = False
def fillCardsFrame(self, vbox): def fillCardsFrame(self, vbox):
hbox1 = gtk.HBox(True,0) hbox1 = gtk.HBox(True,0)

View File

@ -185,6 +185,13 @@ class FpdbSQLQueries:
importTime DATETIME NOT NULL, importTime DATETIME NOT NULL,
seats SMALLINT NOT NULL, seats SMALLINT NOT NULL,
maxSeats SMALLINT NOT NULL, maxSeats SMALLINT NOT NULL,
vpi SMALLINT NOT NULL,
street0Seen SMALLINT NOT NULL,
street1Seen SMALLINT NOT NULL,
street2Seen SMALLINT NOT NULL,
street3Seen SMALLINT NOT NULL,
street4Seen SMALLINT NOT NULL,
sdSeen SMALLINT NOT NULL,
comment TEXT, comment TEXT,
commentTs DATETIME) commentTs DATETIME)
ENGINE=INNODB""" ENGINE=INNODB"""
@ -198,6 +205,13 @@ class FpdbSQLQueries:
importTime timestamp without time zone, importTime timestamp without time zone,
seats SMALLINT, seats SMALLINT,
maxSeats SMALLINT, maxSeats SMALLINT,
vpi SMALLINT NOT NULL,
street0Seen SMALLINT NOT NULL,
street1Seen SMALLINT NOT NULL,
street2Seen SMALLINT NOT NULL,
street3Seen SMALLINT NOT NULL,
street4Seen SMALLINT NOT NULL,
sdSeen SMALLINT NOT NULL,
comment TEXT, comment TEXT,
commentTs timestamp without time zone)""" commentTs timestamp without time zone)"""
elif(self.dbname == 'SQLite'): elif(self.dbname == 'SQLite'):
@ -306,7 +320,7 @@ class FpdbSQLQueries:
startCash INT NOT NULL, startCash INT NOT NULL,
position CHAR(1), position CHAR(1),
seatNo SMALLINT NOT NULL, seatNo SMALLINT NOT NULL,
ante INT, activeSeats SMALLINT NOT NULL,
card1Value smallint NOT NULL, card1Value smallint NOT NULL,
card1Suit char(1) NOT NULL, card1Suit char(1) NOT NULL,
@ -322,28 +336,104 @@ class FpdbSQLQueries:
card6Suit char(1), card6Suit char(1),
card7Value smallint, card7Value smallint,
card7Suit char(1), card7Suit char(1),
startCards smallint,
ante INT,
winnings int NOT NULL, winnings int NOT NULL,
rake int NOT NULL, rake int NOT NULL,
totalProfit INT NOT NULL,
comment text, comment text,
commentTs DATETIME, commentTs DATETIME,
tourneysPlayersId BIGINT UNSIGNED,
tourneysPlayersId BIGINT UNSIGNED, FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id)) tourneyTypeId SMALLINT UNSIGNED NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id),
wonWhenSeenStreet1 FLOAT NOT NULL,
wonWhenSeenStreet2 FLOAT NOT NULL,
wonWhenSeenStreet3 FLOAT NOT NULL,
wonWhenSeenStreet4 FLOAT NOT NULL,
wonAtSD FLOAT NOT NULL,
street0VPI BOOLEAN NOT NULL,
street0Aggr BOOLEAN NOT NULL,
street0_3BChance BOOLEAN NOT NULL,
street0_3BDone BOOLEAN NOT NULL,
street0_4BChance BOOLEAN NOT NULL,
street0_4BDone BOOLEAN NOT NULL,
other3BStreet0 BOOLEAN NOT NULL,
other4BStreet0 BOOLEAN NOT NULL,
street1Seen BOOLEAN NOT NULL,
street2Seen BOOLEAN NOT NULL,
street3Seen BOOLEAN NOT NULL,
street4Seen BOOLEAN NOT NULL,
sawShowdown BOOLEAN NOT NULL,
street1Aggr BOOLEAN NOT NULL,
street2Aggr BOOLEAN NOT NULL,
street3Aggr BOOLEAN NOT NULL,
street4Aggr BOOLEAN NOT NULL,
otherRaisedStreet0 BOOLEAN NOT NULL,
otherRaisedStreet1 BOOLEAN NOT NULL,
otherRaisedStreet2 BOOLEAN NOT NULL,
otherRaisedStreet3 BOOLEAN NOT NULL,
otherRaisedStreet4 BOOLEAN NOT NULL,
foldToOtherRaisedStreet0 BOOLEAN NOT NULL,
foldToOtherRaisedStreet1 BOOLEAN NOT NULL,
foldToOtherRaisedStreet2 BOOLEAN NOT NULL,
foldToOtherRaisedStreet3 BOOLEAN NOT NULL,
foldToOtherRaisedStreet4 BOOLEAN NOT NULL,
stealAttemptChance BOOLEAN NOT NULL,
stealAttempted BOOLEAN NOT NULL,
foldBbToStealChance BOOLEAN NOT NULL,
foldedBbToSteal BOOLEAN NOT NULL,
foldSbToStealChance BOOLEAN NOT NULL,
foldedSbToSteal BOOLEAN NOT NULL,
street1CBChance BOOLEAN NOT NULL,
street1CBDone BOOLEAN NOT NULL,
street2CBChance BOOLEAN NOT NULL,
street2CBDone BOOLEAN NOT NULL,
street3CBChance BOOLEAN NOT NULL,
street3CBDone BOOLEAN NOT NULL,
street4CBChance BOOLEAN NOT NULL,
street4CBDone BOOLEAN NOT NULL,
foldToStreet1CBChance BOOLEAN NOT NULL,
foldToStreet1CBDone BOOLEAN NOT NULL,
foldToStreet2CBChance BOOLEAN NOT NULL,
foldToStreet2CBDone BOOLEAN NOT NULL,
foldToStreet3CBChance BOOLEAN NOT NULL,
foldToStreet3CBDone BOOLEAN NOT NULL,
foldToStreet4CBChance BOOLEAN NOT NULL,
foldToStreet4CBDone BOOLEAN NOT NULL,
street1CheckCallRaiseChance BOOLEAN NOT NULL,
street1CheckCallRaiseDone BOOLEAN NOT NULL,
street2CheckCallRaiseChance BOOLEAN NOT NULL,
street2CheckCallRaiseDone BOOLEAN NOT NULL,
street3CheckCallRaiseChance BOOLEAN NOT NULL,
street3CheckCallRaiseDone BOOLEAN NOT NULL,
street4CheckCallRaiseChance BOOLEAN NOT NULL,
street4CheckCallRaiseDone BOOLEAN NOT NULL,
FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))
ENGINE=INNODB""" ENGINE=INNODB"""
elif(self.dbname == 'PostgreSQL'): elif(self.dbname == 'PostgreSQL'):
self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers ( self.query['createHandsPlayersTable'] = """CREATE TABLE HandsPlayers (
id BIGSERIAL, PRIMARY KEY (id), id BIGSERIAL, PRIMARY KEY (id),
handId BIGINT, FOREIGN KEY (handId) REFERENCES Hands(id), handId BIGINT NOT NULL, FOREIGN KEY (handId) REFERENCES Hands(id),
playerId INT, FOREIGN KEY (playerId) REFERENCES Players(id), playerId INT NOT NULL, FOREIGN KEY (playerId) REFERENCES Players(id),
startCash INT, startCash INT NOT NULL,
position CHAR(1), position CHAR(1),
seatNo SMALLINT, seatNo SMALLINT NOT NULL,
ante INT, activeSeats SMALLINT NOT NULL,
card1Value smallint, card1Value smallint NOT NULL,
card1Suit char(1), card1Suit char(1) NOT NULL,
card2Value smallint, card2Value smallint NOT NULL,
card2Suit char(1), card2Suit char(1) NOT NULL,
card3Value smallint, card3Value smallint,
card3Suit char(1), card3Suit char(1),
card4Value smallint, card4Value smallint,
@ -354,12 +444,89 @@ class FpdbSQLQueries:
card6Suit char(1), card6Suit char(1),
card7Value smallint, card7Value smallint,
card7Suit char(1), card7Suit char(1),
startCards smallint,
winnings int, ante INT,
rake int, winnings int NOT NULL,
rake int NOT NULL,
totalProfit INT NOT NULL,
comment text, comment text,
commentTs timestamp without time zone, commentTs timestamp without time zone,
tourneysPlayersId BIGINT, FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))""" tourneysPlayersId BIGINT,
tourneyTypeId INT NOT NULL, FOREIGN KEY (tourneyTypeId) REFERENCES TourneyTypes(id),
wonWhenSeenStreet1 FLOAT NOT NULL,
wonWhenSeenStreet2 FLOAT NOT NULL,
wonWhenSeenStreet3 FLOAT NOT NULL,
wonWhenSeenStreet4 FLOAT NOT NULL,
wonAtSD FLOAT NOT NULL,
street0VPI BOOLEAN NOT NULL,
street0Aggr BOOLEAN NOT NULL,
street0_3BChance BOOLEAN NOT NULL,
street0_3BDone BOOLEAN NOT NULL,
street0_4BChance BOOLEAN NOT NULL,
street0_4BDone BOOLEAN NOT NULL,
other3BStreet0 BOOLEAN NOT NULL,
other4BStreet0 BOOLEAN NOT NULL,
street1Seen BOOLEAN NOT NULL,
street2Seen BOOLEAN NOT NULL,
street3Seen BOOLEAN NOT NULL,
street4Seen BOOLEAN NOT NULL,
sawShowdown BOOLEAN NOT NULL,
street1Aggr BOOLEAN NOT NULL,
street2Aggr BOOLEAN NOT NULL,
street3Aggr BOOLEAN NOT NULL,
street4Aggr BOOLEAN NOT NULL,
otherRaisedStreet0 BOOLEAN NOT NULL,
otherRaisedStreet1 BOOLEAN NOT NULL,
otherRaisedStreet2 BOOLEAN NOT NULL,
otherRaisedStreet3 BOOLEAN NOT NULL,
otherRaisedStreet4 BOOLEAN NOT NULL,
foldToOtherRaisedStreet0 BOOLEAN NOT NULL,
foldToOtherRaisedStreet1 BOOLEAN NOT NULL,
foldToOtherRaisedStreet2 BOOLEAN NOT NULL,
foldToOtherRaisedStreet3 BOOLEAN NOT NULL,
foldToOtherRaisedStreet4 BOOLEAN NOT NULL,
stealAttemptChance BOOLEAN NOT NULL,
stealAttempted BOOLEAN NOT NULL,
foldBbToStealChance BOOLEAN NOT NULL,
foldedBbToSteal BOOLEAN NOT NULL,
foldSbToStealChance BOOLEAN NOT NULL,
foldedSbToSteal BOOLEAN NOT NULL,
street1CBChance BOOLEAN NOT NULL,
street1CBDone BOOLEAN NOT NULL,
street2CBChance BOOLEAN NOT NULL,
street2CBDone BOOLEAN NOT NULL,
street3CBChance BOOLEAN NOT NULL,
street3CBDone BOOLEAN NOT NULL,
street4CBChance BOOLEAN NOT NULL,
street4CBDone BOOLEAN NOT NULL,
foldToStreet1CBChance BOOLEAN NOT NULL,
foldToStreet1CBDone BOOLEAN NOT NULL,
foldToStreet2CBChance BOOLEAN NOT NULL,
foldToStreet2CBDone BOOLEAN NOT NULL,
foldToStreet3CBChance BOOLEAN NOT NULL,
foldToStreet3CBDone BOOLEAN NOT NULL,
foldToStreet4CBChance BOOLEAN NOT NULL,
foldToStreet4CBDone BOOLEAN NOT NULL,
street1CheckCallRaiseChance BOOLEAN NOT NULL,
street1CheckCallRaiseDone BOOLEAN NOT NULL,
street2CheckCallRaiseChance BOOLEAN NOT NULL,
street2CheckCallRaiseDone BOOLEAN NOT NULL,
street3CheckCallRaiseChance BOOLEAN NOT NULL,
street3CheckCallRaiseDone BOOLEAN NOT NULL,
street4CheckCallRaiseChance BOOLEAN NOT NULL,
street4CheckCallRaiseDone BOOLEAN NOT NULL,
FOREIGN KEY (tourneysPlayersId) REFERENCES TourneysPlayers(id))"""
elif(self.dbname == 'SQLite'): elif(self.dbname == 'SQLite'):
self.query['createHandsPlayersTable'] = """ """ self.query['createHandsPlayersTable'] = """ """
@ -400,7 +567,7 @@ class FpdbSQLQueries:
if(self.dbname == 'MySQL InnoDB'): if(self.dbname == 'MySQL InnoDB'):
self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions (
id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id), id BIGINT UNSIGNED AUTO_INCREMENT NOT NULL, PRIMARY KEY (id),
handPlayerId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handPlayerId) REFERENCES HandsPlayers(id), handsPlayerId BIGINT UNSIGNED NOT NULL, FOREIGN KEY (handPlayerId) REFERENCES HandsPlayers(id),
street SMALLINT NOT NULL, street SMALLINT NOT NULL,
actionNo SMALLINT NOT NULL, actionNo SMALLINT NOT NULL,
action CHAR(5) NOT NULL, action CHAR(5) NOT NULL,
@ -412,7 +579,7 @@ class FpdbSQLQueries:
elif(self.dbname == 'PostgreSQL'): elif(self.dbname == 'PostgreSQL'):
self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions ( self.query['createHandsActionsTable'] = """CREATE TABLE HandsActions (
id BIGSERIAL, PRIMARY KEY (id), id BIGSERIAL, PRIMARY KEY (id),
handPlayerId BIGINT, FOREIGN KEY (handPlayerId) REFERENCES HandsPlayers(id), handsPlayerId BIGINT, FOREIGN KEY (handPlayerId) REFERENCES HandsPlayers(id),
street SMALLINT, street SMALLINT,
actionNo SMALLINT, actionNo SMALLINT,
action CHAR(5), action CHAR(5),
@ -611,12 +778,10 @@ class FpdbSQLQueries:
if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL') or (self.dbname == 'SQLite'): if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL') or (self.dbname == 'SQLite'):
self.query['getRingProfitAllHandsPlayerIdSite'] = """ self.query['getRingProfitAllHandsPlayerIdSite'] = """
SELECT hp.handId, hp.winnings, coalesce(hp.ante,0) + SUM(ha.amount) SELECT hp.handId, hp.totalProfit, hp.totalProfit, hp.totalProfit
, hp.winnings - (coalesce(hp.ante,0) + SUM(ha.amount))
FROM HandsPlayers hp FROM HandsPlayers hp
INNER JOIN Players pl ON hp.playerId = pl.id INNER JOIN Players pl ON hp.playerId = pl.id
INNER JOIN Hands h ON h.id = hp.handId INNER JOIN Hands h ON h.id = hp.handId
INNER JOIN HandsActions ha ON ha.handPlayerId = hp.id
INNER JOIN Gametypes g ON h.gametypeId = g.id INNER JOIN Gametypes g ON h.gametypeId = g.id
where pl.id in <player_test> where pl.id in <player_test>
AND pl.siteId in <site_test> AND pl.siteId in <site_test>
@ -624,9 +789,74 @@ class FpdbSQLQueries:
AND h.handStart < '<enddate_test>' AND h.handStart < '<enddate_test>'
AND g.bigBlind in <limit_test> AND g.bigBlind in <limit_test>
AND hp.tourneysPlayersId IS NULL AND hp.tourneysPlayersId IS NULL
GROUP BY hp.handId, hp.winnings, h.handStart, hp.ante GROUP BY h.handStart, hp.handId, hp.totalProfit
ORDER BY h.handStart""" ORDER BY h.handStart"""
if self.dbname in ['MySQL InnoDB', 'PostgreSQL']:
self.query['playerDetailedStats'] = """
select
h.gametypeId
,sum(hp.totalProfit) AS sum_profit
,avg(hp.totalProfit/100.0) AS profitperhand
/*,case when h.gametypeId = -1 then -999
else variance(hp.totalProfit/100.0)
end AS variance*/
,gt.base
,gt.category
,upper(gt.limitType) AS limitType
,s.name
/*,<selectgt.bigBlind> AS bigBlindDesc
,<hcgametypeId> AS gtId*/
,count(1) AS n
,100.0*sum(cast(street0VPI as integer))/count(1) AS vpip
,100.0*sum(cast(street0Aggr as integer))/count(1) AS pfr
,case when sum(cast(street0_3b4bchance as integer)) = 0 then '0'
else 100.0*sum(cast(street0_3b4bdone as integer))/sum(cast(street0_3b4bchance as integer))
end AS pf3
,case when sum(cast(stealattemptchance as integer)) = 0 then -999
else 100.0*sum(cast(stealattempted as integer))/sum(cast(stealattemptchance as integer))
end AS steals
,100.0*sum(cast(street1Seen as integer))/count(1) AS saw_f
,100.0*sum(cast(sawShowdown as integer))/count(1) AS sawsd
,case when sum(cast(street1Seen as integer)) = 0 then -999
else 100.0*sum(cast(sawShowdown as integer))/sum(cast(street1Seen as integer))
end AS wtsdwsf
,case when sum(cast(sawShowdown as integer)) = 0 then -999
else 100.0*sum(cast(wonAtSD as integer))/sum(cast(sawShowdown as integer))
end AS wmsd
,case when sum(cast(street1Seen as integer)) = 0 then -999
else 100.0*sum(cast(street1Aggr as integer))/sum(cast(street1Seen as integer))
end AS FlAFq
,case when sum(cast(street2Seen as integer)) = 0 then -999
else 100.0*sum(cast(street2Aggr as integer))/sum(cast(street2Seen as integer))
end AS TuAFq
,case when sum(cast(street3Seen as integer)) = 0 then -999
else 100.0*sum(cast(street3Aggr as integer))/sum(cast(street3Seen as integer))
end AS RvAFq
,case when sum(cast(street1Seen as integer))+sum(cast(street2Seen as integer))+sum(cast(street3Seen as integer)) = 0 then -999
else 100.0*(sum(cast(street1Aggr as integer))+sum(cast(street2Aggr as integer))+sum(cast(street3Aggr as integer)))
/(sum(cast(street1Seen as integer))+sum(cast(street2Seen as integer))+sum(cast(street3Seen as integer)))
end AS PoFAFq
,sum(totalProfit)/100.0 AS Net
,(sum(totalProfit/(gt.bigBlind+0.0))) / (count(1)/100.0)
AS BBper100
,(sum(totalProfit)/100.0) / count(1) AS Profitperhand
,sum(activeSeats)/(count(1)+0.0) AS AvgSeats
from HandsPlayers hp
inner join Hands h on (h.id = hp.handId)
inner join Gametypes gt on (gt.Id = h.gameTypeId)
inner join Sites s on (s.Id = gt.siteId)
where hp.playerId in (1) /* <player_test> */
and hp.tourneysPlayersId IS NULL
group by h.gametypeId
,hp.playerId
,gt.base
,gt.category
,upper(gt.limitType)
,s.name"""
elif(self.dbname == 'SQLite'):
self.query['playerDetailedStats'] = """ """
if(self.dbname == 'MySQL InnoDB'): if(self.dbname == 'MySQL InnoDB'):
self.query['playerStats'] = """ self.query['playerStats'] = """
SELECT SELECT
@ -697,7 +927,7 @@ class FpdbSQLQueries:
,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 AS BBper100
,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand
,format( avg(activeSeats), 1) AS AvgSeats ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats
from Gametypes gt from Gametypes gt
inner join Sites s on s.Id = gt.siteId inner join Sites s on s.Id = gt.siteId
inner join HudCache hc on hc.gameTypeId = gt.Id inner join HudCache hc on hc.gameTypeId = gt.Id
@ -719,19 +949,17 @@ class FpdbSQLQueries:
else variance(hprof.profit/100.0) else variance(hprof.profit/100.0)
end as variance end as variance
from from
(select hp.handId, <hgameTypeId> as gtId, hp.winnings, SUM(ha.amount) as costs (select hp.handId, <hgameTypeId> as gtId, hp.totalProfit as profit
, hp.winnings - SUM(ha.amount) as profit
from HandsPlayers hp from HandsPlayers hp
inner join Hands h ON h.id = hp.handId inner join Hands h ON h.id = hp.handId
left join HandsActions ha ON ha.handPlayerId = hp.id
where hp.playerId in <player_test> where hp.playerId in <player_test>
and hp.tourneysPlayersId IS NULL and hp.tourneysPlayersId IS NULL
group by hp.handId, gtId, hp.position, hp.winnings group by hp.handId, gtId, hp.totalProfit
) hprof ) hprof
group by hprof.gtId group by hprof.gtId
) hprof2 ) hprof2
on hprof2.gtId = stats.gtId on hprof2.gtId = stats.gtId
order by stats.category, stats.limittype, stats.bigBlindDesc <orderbyseats>""" order by stats.category, stats.limittype, stats.bigBlindDesc desc <orderbyseats>"""
elif(self.dbname == 'PostgreSQL'): elif(self.dbname == 'PostgreSQL'):
self.query['playerStats'] = """ self.query['playerStats'] = """
SELECT upper(stats.limitType) || ' ' SELECT upper(stats.limitType) || ' '
@ -799,7 +1027,7 @@ class FpdbSQLQueries:
,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 AS BBper100
,to_char(sum(totalProfit/100.0) / (sum(HDs)+0.0), '990D0000') AS Profitperhand ,to_char(sum(totalProfit/100.0) / (sum(HDs)+0.0), '990D0000') AS Profitperhand
,to_char(avg(activeSeats),'90D0') AS AvgSeats ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats
from Gametypes gt from Gametypes gt
inner join Sites s on s.Id = gt.siteId inner join Sites s on s.Id = gt.siteId
inner join HudCache hc on hc.gameTypeId = gt.Id inner join HudCache hc on hc.gameTypeId = gt.Id
@ -821,19 +1049,17 @@ class FpdbSQLQueries:
else variance(hprof.profit/100.0) else variance(hprof.profit/100.0)
end as variance end as variance
from from
(select hp.handId, <hgameTypeId> as gtId, hp.winnings, (select hp.handId, <hgameTypeId> as gtId, hp.totalProfit as profit
SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit
from HandsPlayers hp from HandsPlayers hp
inner join Hands h ON (h.id = hp.handId) inner join Hands h ON (h.id = hp.handId)
left join HandsActions ha ON (ha.handPlayerId = hp.id)
where hp.playerId in <player_test> where hp.playerId in <player_test>
and hp.tourneysPlayersId IS NULL and hp.tourneysPlayersId IS NULL
group by hp.handId, gtId, hp.position, hp.winnings group by hp.handId, gtId, hp.totalProfit
) hprof ) hprof
group by hprof.gtId group by hprof.gtId
) hprof2 ) hprof2
on hprof2.gtId = stats.gtId on hprof2.gtId = stats.gtId
order by stats.base, stats.limittype, stats.bigBlindDesc <orderbyseats>""" order by stats.base, stats.limittype, stats.bigBlindDesc desc <orderbyseats>"""
elif(self.dbname == 'SQLite'): elif(self.dbname == 'SQLite'):
self.query['playerStats'] = """ """ self.query['playerStats'] = """ """
@ -923,7 +1149,7 @@ class FpdbSQLQueries:
,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 AS BBper100
,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand ,format( (sum(totalProfit)/100.0) / sum(HDs), 4) AS Profitperhand
,format( avg(activeSeats), 1) AS AvgSeats ,format( sum(activeSeats*HDs)/(sum(HDs)+0.0), 2) AS AvgSeats
from Gametypes gt from Gametypes gt
inner join Sites s on s.Id = gt.siteId inner join Sites s on s.Id = gt.siteId
inner join HudCache hc on hc.gameTypeId = gt.Id inner join HudCache hc on hc.gameTypeId = gt.Id
@ -954,20 +1180,19 @@ class FpdbSQLQueries:
else variance(hprof.profit/100.0) else variance(hprof.profit/100.0)
end as variance end as variance
from from
(select hp.handId, <hgameTypeId> as gtId, hp.position, hp.winnings (select hp.handId, <hgameTypeId> as gtId, hp.position
, SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit , hp.totalProfit as profit
from HandsPlayers hp from HandsPlayers hp
inner join Hands h ON h.id = hp.handId inner join Hands h ON (h.id = hp.handId)
left join HandsActions ha ON ha.handPlayerId = hp.id
where hp.playerId in <player_test> where hp.playerId in <player_test>
and hp.tourneysPlayersId IS NULL and hp.tourneysPlayersId IS NULL
group by hp.handId, gtId, hp.position, hp.winnings group by hp.handId, gtId, hp.position, hp.totalProfit
) hprof ) hprof
group by hprof.gtId, PlPosition group by hprof.gtId, PlPosition
) hprof2 ) hprof2
on ( hprof2.gtId = stats.gtId on ( hprof2.gtId = stats.gtId
and hprof2.PlPosition = stats.PlPosition) and hprof2.PlPosition = stats.PlPosition)
order by stats.category, stats.limitType, stats.bigBlindDesc order by stats.category, stats.limitType, stats.bigBlindDesc desc
<orderbyseats>, cast(stats.PlPosition as signed) <orderbyseats>, cast(stats.PlPosition as signed)
""" """
elif(self.dbname == 'PostgreSQL'): elif(self.dbname == 'PostgreSQL'):
@ -1058,7 +1283,7 @@ class FpdbSQLQueries:
,case when sum(HDs) = 0 then '0' ,case when sum(HDs) = 0 then '0'
else to_char( (sum(totalProfit)/100.0) / sum(HDs), '90D0000') else to_char( (sum(totalProfit)/100.0) / sum(HDs), '90D0000')
end AS Profitperhand end AS Profitperhand
,to_char(avg(activeSeats),'90D0') AS AvgSeats ,to_char(sum(activeSeats*HDs)/(sum(HDs)+0.0),'90D00') AS AvgSeats
from Gametypes gt from Gametypes gt
inner join Sites s on (s.Id = gt.siteId) inner join Sites s on (s.Id = gt.siteId)
inner join HudCache hc on (hc.gameTypeId = gt.Id) inner join HudCache hc on (hc.gameTypeId = gt.Id)
@ -1089,20 +1314,19 @@ class FpdbSQLQueries:
else variance(hprof.profit/100.0) else variance(hprof.profit/100.0)
end as variance end as variance
from from
(select hp.handId, <hgameTypeId> as gtId, hp.position, hp.winnings (select hp.handId, <hgameTypeId> as gtId, hp.position
, SUM(ha.amount) as costs, hp.winnings - SUM(ha.amount) as profit , hp.totalProfit as profit
from HandsPlayers hp from HandsPlayers hp
inner join Hands h ON h.id = hp.handId inner join Hands h ON (h.id = hp.handId)
left join HandsActions ha ON ha.handPlayerId = hp.id
where hp.playerId in <player_test> where hp.playerId in <player_test>
and hp.tourneysPlayersId IS NULL and hp.tourneysPlayersId IS NULL
group by hp.handId, gameTypeId, hp.position, hp.winnings group by hp.handId, gameTypeId, hp.position, hp.totalProfit
) hprof ) hprof
group by hprof.gtId, PlPosition group by hprof.gtId, PlPosition
) hprof2 ) hprof2
on ( hprof2.gtId = stats.gtId on ( hprof2.gtId = stats.gtId
and hprof2.PlPosition = stats.PlPosition) and hprof2.PlPosition = stats.PlPosition)
order by stats.category, stats.limitType, stats.bigBlindDesc order by stats.category, stats.limitType, stats.bigBlindDesc desc
<orderbyseats>, cast(stats.PlPosition as smallint) <orderbyseats>, cast(stats.PlPosition as smallint)
""" """
elif(self.dbname == 'SQLite'): elif(self.dbname == 'SQLite'):
@ -1245,6 +1469,160 @@ class FpdbSQLQueries:
self.query['getLimits'] = """SELECT DISTINCT bigBlind from Gametypes ORDER by bigBlind DESC""" self.query['getLimits'] = """SELECT DISTINCT bigBlind from Gametypes ORDER by bigBlind DESC"""
####################################
# Queries to rebuild/modify hudcache
####################################
if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL') or (self.dbname == 'SQLite'):
self.query['clearHudCache'] = """DELETE FROM HudCache"""
if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL') or (self.dbname == 'SQLite'):
self.query['rebuildHudCache'] = """
INSERT INTO HudCache
(gametypeId
,playerId
,activeSeats
,position
,tourneyTypeId
,HDs
,wonWhenSeenStreet1
,wonAtSD
,street0VPI
,street0Aggr
,street0_3B4BChance
,street0_3B4BDone
,street1Seen
,street2Seen
,street3Seen
,street4Seen
,sawShowdown
,street1Aggr
,street2Aggr
,street3Aggr
,street4Aggr
,otherRaisedStreet1
,otherRaisedStreet2
,otherRaisedStreet3
,otherRaisedStreet4
,foldToOtherRaisedStreet1
,foldToOtherRaisedStreet2
,foldToOtherRaisedStreet3
,foldToOtherRaisedStreet4
,stealAttemptChance
,stealAttempted
,foldBbToStealChance
,foldedBbToSteal
,foldSbToStealChance
,foldedSbToSteal
,street1CBChance
,street1CBDone
,street2CBChance
,street2CBDone
,street3CBChance
,street3CBDone
,street4CBChance
,street4CBDone
,foldToStreet1CBChance
,foldToStreet1CBDone
,foldToStreet2CBChance
,foldToStreet2CBDone
,foldToStreet3CBChance
,foldToStreet3CBDone
,foldToStreet4CBChance
,foldToStreet4CBDone
,totalProfit
,street1CheckCallRaiseChance
,street1CheckCallRaiseDone
,street2CheckCallRaiseChance
,street2CheckCallRaiseDone
,street3CheckCallRaiseChance
,street3CheckCallRaiseDone
,street4CheckCallRaiseChance
,street4CheckCallRaiseDone
)
SELECT h.gametypeId
,hp.playerId
,hp.activeSeats
,case when hp.position = 'B' then 'B'
when hp.position = 'S' then 'S'
when hp.position = '0' then 'D'
when hp.position = '1' then 'C'
when hp.position = '2' then 'M'
when hp.position = '3' then 'M'
when hp.position = '4' then 'M'
when hp.position = '5' then 'E'
when hp.position = '6' then 'E'
when hp.position = '7' then 'E'
when hp.position = '8' then 'E'
when hp.position = '9' then 'E'
else 'E'
end AS hc_position
,hp.tourneyTypeId
,count(1)
,sum(wonWhenSeenStreet1)
,sum(wonAtSD)
,sum(CAST(street0VPI as integer))
,sum(CAST(street0Aggr as integer))
,sum(CAST(street0_3B4BChance as integer))
,sum(CAST(street0_3B4BDone as integer))
,sum(CAST(street1Seen as integer))
,sum(CAST(street2Seen as integer))
,sum(CAST(street3Seen as integer))
,sum(CAST(street4Seen as integer))
,sum(CAST(sawShowdown as integer))
,sum(CAST(street1Aggr as integer))
,sum(CAST(street2Aggr as integer))
,sum(CAST(street3Aggr as integer))
,sum(CAST(street4Aggr as integer))
,sum(CAST(otherRaisedStreet1 as integer))
,sum(CAST(otherRaisedStreet2 as integer))
,sum(CAST(otherRaisedStreet3 as integer))
,sum(CAST(otherRaisedStreet4 as integer))
,sum(CAST(foldToOtherRaisedStreet1 as integer))
,sum(CAST(foldToOtherRaisedStreet2 as integer))
,sum(CAST(foldToOtherRaisedStreet3 as integer))
,sum(CAST(foldToOtherRaisedStreet4 as integer))
,sum(CAST(stealAttemptChance as integer))
,sum(CAST(stealAttempted as integer))
,sum(CAST(foldBbToStealChance as integer))
,sum(CAST(foldedBbToSteal as integer))
,sum(CAST(foldSbToStealChance as integer))
,sum(CAST(foldedSbToSteal as integer))
,sum(CAST(street1CBChance as integer))
,sum(CAST(street1CBDone as integer))
,sum(CAST(street2CBChance as integer))
,sum(CAST(street2CBDone as integer))
,sum(CAST(street3CBChance as integer))
,sum(CAST(street3CBDone as integer))
,sum(CAST(street4CBChance as integer))
,sum(CAST(street4CBDone as integer))
,sum(CAST(foldToStreet1CBChance as integer))
,sum(CAST(foldToStreet1CBDone as integer))
,sum(CAST(foldToStreet2CBChance as integer))
,sum(CAST(foldToStreet2CBDone as integer))
,sum(CAST(foldToStreet3CBChance as integer))
,sum(CAST(foldToStreet3CBDone as integer))
,sum(CAST(foldToStreet4CBChance as integer))
,sum(CAST(foldToStreet4CBDone as integer))
,sum(CAST(totalProfit as integer))
,sum(CAST(street1CheckCallRaiseChance as integer))
,sum(CAST(street1CheckCallRaiseDone as integer))
,sum(CAST(street2CheckCallRaiseChance as integer))
,sum(CAST(street2CheckCallRaiseDone as integer))
,sum(CAST(street3CheckCallRaiseChance as integer))
,sum(CAST(street3CheckCallRaiseDone as integer))
,sum(CAST(street4CheckCallRaiseChance as integer))
,sum(CAST(street4CheckCallRaiseDone as integer))
FROM HandsPlayers hp
INNER JOIN Hands h ON (h.id = hp.handId)
GROUP BY h.gametypeId
,hp.playerId
,hp.activeSeats
,hc_position
,hp.tourneyTypeId
"""
if __name__== "__main__": if __name__== "__main__":
from optparse import OptionParser from optparse import OptionParser

View File

@ -57,6 +57,7 @@ class GuiGraphViewer (threading.Thread):
"Sites" : True, "Sites" : True,
"Games" : True, "Games" : True,
"Limits" : True, "Limits" : True,
"Seats" : False,
"Dates" : True, "Dates" : True,
"Button1" : True, "Button1" : True,
"Button2" : True "Button2" : True
@ -73,10 +74,12 @@ class GuiGraphViewer (threading.Thread):
self.leftPanelBox = self.filters.get_vbox() self.leftPanelBox = self.filters.get_vbox()
self.graphBox = gtk.VBox(False, 0) self.graphBox = gtk.VBox(False, 0)
self.graphBox.show()
self.hpane = gtk.HPaned() self.hpane = gtk.HPaned()
self.hpane.pack1(self.leftPanelBox) self.hpane.pack1(self.leftPanelBox)
self.hpane.pack2(self.graphBox) self.hpane.pack2(self.graphBox)
self.hpane.show()
self.mainHBox.add(self.hpane) self.mainHBox.add(self.hpane)
@ -86,7 +89,7 @@ class GuiGraphViewer (threading.Thread):
self.fig = Figure(figsize=(5,4), dpi=100) self.fig = Figure(figsize=(5,4), dpi=100)
self.canvas = None self.canvas = None
self.mainHBox.show_all()
self.db.db.rollback() self.db.db.rollback()
################################# #################################
@ -175,7 +178,8 @@ class GuiGraphViewer (threading.Thread):
self.ax.set_xlabel("Hands", fontsize = 12) self.ax.set_xlabel("Hands", fontsize = 12)
self.ax.set_ylabel("$", fontsize = 12) self.ax.set_ylabel("$", fontsize = 12)
self.ax.grid(color='g', linestyle=':', linewidth=0.2) self.ax.grid(color='g', linestyle=':', linewidth=0.2)
if(line == None): if line == None or line == []:
#TODO: Do something useful like alert user #TODO: Do something useful like alert user
print "No hands returned by graph query" print "No hands returned by graph query"
else: else:
@ -193,7 +197,7 @@ class GuiGraphViewer (threading.Thread):
self.graphBox.add(self.canvas) self.graphBox.add(self.canvas)
self.canvas.show() self.canvas.show()
self.exportButton.set_sensitive(True) #self.exportButton.set_sensitive(True)
#end of def showClicked #end of def showClicked
def getRingProfitGraph(self, names, sites, limits): def getRingProfitGraph(self, names, sites, limits):

View File

@ -51,6 +51,7 @@ class GuiPlayerStats (threading.Thread):
"Games" : False, "Games" : False,
"Limits" : True, "Limits" : True,
"LimitSep" : True, "LimitSep" : True,
"Seats" : True,
"Dates" : False, "Dates" : False,
"Button1" : True, "Button1" : True,
"Button2" : False "Button2" : False
@ -123,7 +124,8 @@ class GuiPlayerStats (threading.Thread):
tmp = self.refineQuery(tmp, playerids, sitenos, limits, seats) tmp = self.refineQuery(tmp, playerids, sitenos, limits, seats)
self.cursor.execute(tmp) self.cursor.execute(tmp)
result = self.cursor.fetchall() result = self.cursor.fetchall()
cols = 18 cols = 19
rows = len(result)+1 # +1 for title row rows = len(result)+1 # +1 for title row
self.stats_table = gtk.Table(rows, cols, False) self.stats_table = gtk.Table(rows, cols, False)
self.stats_table.set_col_spacings(4) self.stats_table.set_col_spacings(4)
@ -131,7 +133,7 @@ class GuiPlayerStats (threading.Thread):
vbox.add(self.stats_table) vbox.add(self.stats_table)
# Create header row # Create header row
titles = ("Game", "Hands", "VPIP", "PFR", "PF3", "Steals", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance") titles = ("Game", "Hands", "VPIP", "PFR", "PF3", "Steals", "Saw_F", "SawSD", "WtSDwsF", "W$SD", "FlAFq", "TuAFq", "RvAFq", "PoFAFq", "Net($)", "BB/100", "$/hand", "Variance", "AvgSeats")
col = 0 col = 0
row = 0 row = 0

View File

@ -52,6 +52,7 @@ class GuiPositionalStats (threading.Thread):
"Limits" : True, "Limits" : True,
"LimitSep" : True, "LimitSep" : True,
"Seats" : True, "Seats" : True,
"SeatSep" : True,
"Dates" : False, "Dates" : False,
"Button1" : True, "Button1" : True,
"Button2" : False "Button2" : False
@ -142,26 +143,35 @@ class GuiPositionalStats (threading.Thread):
self.createStatsTable(vbox, playerids, sitenos, limits, seats) self.createStatsTable(vbox, playerids, sitenos, limits, seats)
def createStatsTable(self, vbox, playerids, sitenos, limits, seats): def createStatsTable(self, vbox, playerids, sitenos, limits, seats):
tmp = self.sql.query['playerStatsByPosition']
tmp = self.refineQuery(tmp, playerids, sitenos, limits, seats)
self.cursor.execute(tmp)
result = self.cursor.fetchall()
self.stats_table = gtk.Table(1, 1, False) # gtk table expands as required self.stats_table = gtk.Table(1, 1, False) # gtk table expands as required
self.stats_table.set_col_spacings(4) self.stats_table.set_col_spacings(4)
self.stats_table.show() self.stats_table.show()
vbox.add(self.stats_table) vbox.add(self.stats_table)
colnames = [desc[0].lower() for desc in self.cursor.description] row = 0
rows = len(result)
col = 0 col = 0
row = 0
for t in self.posnheads: for t in self.posnheads:
l = gtk.Label(self.posnheads[col]) l = gtk.Label(self.posnheads[col])
l.show() l.show()
self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK) self.stats_table.attach(l, col, col+1, row, row+1, yoptions=gtk.SHRINK)
col +=1 col +=1
tmp = self.sql.query['playerStatsByPosition']
tmp = self.refineQuery(tmp, playerids, sitenos, limits, seats)
self.cursor.execute(tmp)
result = self.cursor.fetchall()
rows = len(result)
colnames = [desc[0].lower() for desc in self.cursor.description]
last_game,last_seats,sqlrow = "","",0 last_game,last_seats,sqlrow = "","",0
while sqlrow < rows: while sqlrow < rows:
if(row%2 == 0): if(row%2 == 0):

View File

@ -195,6 +195,7 @@ class HUD_main(object):
sys.stderr.write("table name "+table_name+" not found, skipping.\n") sys.stderr.write("table name "+table_name+" not found, skipping.\n")
else: else:
self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, stat_dict, cards) self.create_HUD(new_hand_id, tablewindow, temp_key, max, poker_game, stat_dict, cards)
self.db_connection.connection.rollback()
if __name__== "__main__": if __name__== "__main__":
sys.stderr.write("HUD_main starting\n") sys.stderr.write("HUD_main starting\n")

View File

@ -187,10 +187,10 @@ def prepareBulkImport(fdb):
# mod to use tab_col for index name? # mod to use tab_col for index name?
try: try:
fdb.cursor.execute( "drop index %s_%s_idx" % (idx['tab'],idx['col']) ) fdb.cursor.execute( "drop index %s_%s_idx" % (idx['tab'],idx['col']) )
print "drop index %s_%s_idx" % (idx['tab'],idx['col']) print "drop index %s_%s_idx" % (idx['tab'],idx['col'])
#print "dropped pg index ", idx['tab'], idx['col'] #print "dropped pg index ", idx['tab'], idx['col']
except: except:
print "! failed drop index %s_%s_idx" % (idx['tab'],idx['col']) print "! failed drop index %s_%s_idx" % (idx['tab'],idx['col'])
else: else:
print "Only MySQL and Postgres supported so far" print "Only MySQL and Postgres supported so far"
return -1 return -1
@ -1065,7 +1065,7 @@ def parsePositions(hand, names):
if bb != -1: if bb != -1:
bb = recognisePlayerNo(bb, names, "bet") bb = recognisePlayerNo(bb, names, "bet")
# print "sb = ", sb, "bb = ", bb # print "sb = ", sb, "bb = ", bb
if bb == sb: # if big and small are same, then don't duplicate the small if bb == sb: # if big and small are same, then don't duplicate the small
sbExists = False sbExists = False
sb = -1 sb = -1
@ -1094,7 +1094,7 @@ def parsePositions(hand, names):
while positions[i] < 0 and i != sb: while positions[i] < 0 and i != sb:
positions[i] = 9 positions[i] = 9
i -= 1 i -= 1
### RHH - Changed to set the null seats before BB to "9" ### RHH - Changed to set the null seats before BB to "9"
if sbExists: if sbExists:
i = sb-1 i = sb-1
else: else:
@ -1114,7 +1114,7 @@ def parsePositions(hand, names):
print "parsePositions names:",names print "parsePositions names:",names
print "result:",positions print "result:",positions
raise FpdbError ("failed to read positions") raise FpdbError ("failed to read positions")
# print str(positions), "\n" # print str(positions), "\n"
return positions return positions
#end def parsePositions #end def parsePositions
@ -1438,6 +1438,7 @@ def storeActions(cursor, handsPlayersIds, actionTypes, allIns, actionAmounts, ac
def store_board_cards(cursor, hands_id, board_values, board_suits): def store_board_cards(cursor, hands_id, board_values, board_suits):
#stores into table board_cards #stores into table board_cards
return
cursor.execute ("""INSERT INTO BoardCards (handId, card1Value, card1Suit, cursor.execute ("""INSERT INTO BoardCards (handId, card1Value, card1Suit,
card2Value, card2Suit, card3Value, card3Suit, card4Value, card4Suit, card2Value, card2Suit, card3Value, card3Suit, card4Value, card4Suit,
card5Value, card5Suit) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", card5Value, card5Suit) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
@ -1458,35 +1459,128 @@ def storeHands(backend, conn, cursor, site_hand_no, gametype_id
#end def storeHands #end def storeHands
def store_hands_players_holdem_omaha(backend, conn, cursor, category, hands_id, player_ids, start_cashes def store_hands_players_holdem_omaha(backend, conn, cursor, category, hands_id, player_ids, start_cashes
,positions, card_values, card_suits, winnings, rakes, seatNos): ,positions, card_values, card_suits, winnings, rakes, seatNos, hudCache):
result=[] result=[]
# postgres (and others?) needs the booleans converted to ints before saving:
# (or we could just save them as boolean ... but then we can't sum them so easily in sql ???)
# NO - storing booleans for now so don't need this
#hudCacheInt = {}
#for k,v in hudCache.iteritems():
# if k in ('wonWhenSeenStreet1', 'wonAtSD', 'totalProfit'):
# hudCacheInt[k] = v
# else:
# hudCacheInt[k] = map(lambda x: 1 if x else 0, v)
if (category=="holdem"): if (category=="holdem"):
for i in xrange(len(player_ids)): for i in xrange(len(player_ids)):
x,y = card_values[i][0],card_values[i][1]
if (card_suits[i][0] == card_suits[i][1] and x < y) or (card_suits[i][0] != card_suits[i][1] and x > y):
x,y = y,x
startCards = 13 * (x-2) + (y-2)
cursor.execute (""" cursor.execute ("""
INSERT INTO HandsPlayers INSERT INTO HandsPlayers
(handId, playerId, startCash, position, (handId, playerId, startCash, position, activeSeats, tourneyTypeId,
card1Value, card1Suit, card2Value, card2Suit, winnings, rake, seatNo) card1Value, card1Suit, card2Value, card2Suit, winnings, rake, seatNo, totalProfit,
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", street0VPI, street0Aggr, street0_3B4BChance, street0_3B4BDone,
(hands_id, player_ids[i], start_cashes[i], positions[i], street1Seen, street2Seen, street3Seen, street4Seen, sawShowdown,
card_values[i][0], card_suits[i][0], card_values[i][1], card_suits[i][1], street1Aggr, street2Aggr, street3Aggr, street4Aggr,
winnings[i], rakes[i], seatNos[i])) otherRaisedStreet1, otherRaisedStreet2, otherRaisedStreet3, otherRaisedStreet4,
foldToOtherRaisedStreet1, foldToOtherRaisedStreet2, foldToOtherRaisedStreet3, foldToOtherRaisedStreet4,
wonWhenSeenStreet1, wonAtSD,
stealAttemptChance, stealAttempted, foldBbToStealChance, foldedBbToSteal, foldSbToStealChance, foldedSbToSteal,
street1CBChance, street1CBDone, street2CBChance, street2CBDone,
street3CBChance, street3CBDone, street4CBChance, street4CBDone,
foldToStreet1CBChance, foldToStreet1CBDone, foldToStreet2CBChance, foldToStreet2CBDone,
foldToStreet3CBChance, foldToStreet3CBDone, foldToStreet4CBChance, foldToStreet4CBDone,
street1CheckCallRaiseChance, street1CheckCallRaiseDone, street2CheckCallRaiseChance, street2CheckCallRaiseDone,
street3CheckCallRaiseChance, street3CheckCallRaiseDone, street4CheckCallRaiseChance, street4CheckCallRaiseDone
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
(hands_id, player_ids[i], start_cashes[i], positions[i], len(player_ids), 1, # tourneytypeid
card_values[i][0], card_suits[i][0], card_values[i][1], card_suits[i][1],
winnings[i], rakes[i], seatNos[i], hudCache['totalProfit'][i],
hudCache['street0VPI'][i], hudCache['street0Aggr'][i],
hudCache['street0_3B4BChance'][i], hudCache['street0_3B4BDone'][i],
hudCache['street1Seen'][i], hudCache['street2Seen'][i], hudCache['street3Seen'][i],
hudCache['street4Seen'][i], hudCache['sawShowdown'][i],
hudCache['street1Aggr'][i], hudCache['street2Aggr'][i], hudCache['street3Aggr'][i], hudCache['street4Aggr'][i],
hudCache['otherRaisedStreet1'][i], hudCache['otherRaisedStreet2'][i],
hudCache['otherRaisedStreet3'][i], hudCache['otherRaisedStreet4'][i],
hudCache['foldToOtherRaisedStreet1'][i], hudCache['foldToOtherRaisedStreet2'][i],
hudCache['foldToOtherRaisedStreet3'][i], hudCache['foldToOtherRaisedStreet4'][i],
hudCache['wonWhenSeenStreet1'][i], hudCache['wonAtSD'][i],
hudCache['stealAttemptChance'][i], hudCache['stealAttempted'][i], hudCache['foldBbToStealChance'][i],
hudCache['foldedBbToSteal'][i], hudCache['foldSbToStealChance'][i], hudCache['foldedSbToSteal'][i],
hudCache['street1CBChance'][i], hudCache['street1CBDone'][i], hudCache['street2CBChance'][i], hudCache['street2CBDone'][i],
hudCache['street3CBChance'][i], hudCache['street3CBDone'][i], hudCache['street4CBChance'][i], hudCache['street4CBDone'][i],
hudCache['foldToStreet1CBChance'][i], hudCache['foldToStreet1CBDone'][i],
hudCache['foldToStreet2CBChance'][i], hudCache['foldToStreet2CBDone'][i],
hudCache['foldToStreet3CBChance'][i], hudCache['foldToStreet3CBDone'][i],
hudCache['foldToStreet4CBChance'][i], hudCache['foldToStreet4CBDone'][i],
hudCache['street1CheckCallRaiseChance'][i], hudCache['street1CheckCallRaiseDone'][i],
hudCache['street2CheckCallRaiseChance'][i], hudCache['street2CheckCallRaiseDone'][i],
hudCache['street3CheckCallRaiseChance'][i], hudCache['street3CheckCallRaiseDone'][i],
hudCache['street4CheckCallRaiseChance'][i], hudCache['street4CheckCallRaiseDone'][i]
) )
#cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId=%s", (hands_id, player_ids[i])) #cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId=%s", (hands_id, player_ids[i]))
#result.append(cursor.fetchall()[0][0]) #result.append(cursor.fetchall()[0][0])
result.append( getLastInsertId(backend, conn, cursor) ) # mysql only result.append( getLastInsertId(backend, conn, cursor) )
elif (category=="omahahi" or category=="omahahilo"): elif (category=="omahahi" or category=="omahahilo"):
for i in xrange(len(player_ids)): for i in xrange(len(player_ids)):
cursor.execute ("""INSERT INTO HandsPlayers cursor.execute ("""INSERT INTO HandsPlayers
(handId, playerId, startCash, position, (handId, playerId, startCash, position, activeSeats, tourneyTypeId,
card1Value, card1Suit, card2Value, card2Suit, card1Value, card1Suit, card2Value, card2Suit,
card3Value, card3Suit, card4Value, card4Suit, winnings, rake, seatNo) card3Value, card3Suit, card4Value, card4Suit, winnings, rake, seatNo, totalProfit,
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", street0VPI, street0Aggr, street0_3B4BChance, street0_3B4BDone,
(hands_id, player_ids[i], start_cashes[i], positions[i], street1Seen, street2Seen, street3Seen, street4Seen, sawShowdown,
card_values[i][0], card_suits[i][0], card_values[i][1], card_suits[i][1], street1Aggr, street2Aggr, street3Aggr, street4Aggr,
card_values[i][2], card_suits[i][2], card_values[i][3], card_suits[i][3], otherRaisedStreet1, otherRaisedStreet2, otherRaisedStreet3, otherRaisedStreet4,
winnings[i], rakes[i], seatNos[i])) foldToOtherRaisedStreet1, foldToOtherRaisedStreet2, foldToOtherRaisedStreet3, foldToOtherRaisedStreet4,
wonWhenSeenStreet1, wonAtSD,
stealAttemptChance, stealAttempted, foldBbToStealChance, foldedBbToSteal, foldSbToStealChance, foldedSbToSteal,
street1CBChance, street1CBDone, street2CBChance, street2CBDone,
street3CBChance, street3CBDone, street4CBChance, street4CBDone,
foldToStreet1CBChance, foldToStreet1CBDone, foldToStreet2CBChance, foldToStreet2CBDone,
foldToStreet3CBChance, foldToStreet3CBDone, foldToStreet4CBChance, foldToStreet4CBDone,
street1CheckCallRaiseChance, street1CheckCallRaiseDone, street2CheckCallRaiseChance, street2CheckCallRaiseDone,
street3CheckCallRaiseChance, street3CheckCallRaiseDone, street4CheckCallRaiseChance, street4CheckCallRaiseDone
)
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
(hands_id, player_ids[i], start_cashes[i], positions[i], len(player_ids), 1, # tourneytypeid
card_values[i][0], card_suits[i][0], card_values[i][1], card_suits[i][1],
card_values[i][2], card_suits[i][2], card_values[i][3], card_suits[i][3],
winnings[i], rakes[i], seatNos[i], hudCache['totalProfit'][i],
hudCache['street0VPI'][i], hudCache['street0Aggr'][i],
hudCache['street0_3B4BChance'][i], hudCache['street0_3B4BDone'][i],
hudCache['street1Seen'][i], hudCache['street2Seen'][i], hudCache['street3Seen'][i],
hudCache['street4Seen'][i], hudCache['sawShowdown'][i],
hudCache['street1Aggr'][i], hudCache['street2Aggr'][i], hudCache['street3Aggr'][i], hudCache['street4Aggr'][i],
hudCache['otherRaisedStreet1'][i], hudCache['otherRaisedStreet2'][i],
hudCache['otherRaisedStreet3'][i], hudCache['otherRaisedStreet4'][i],
hudCache['foldToOtherRaisedStreet1'][i], hudCache['foldToOtherRaisedStreet2'][i],
hudCache['foldToOtherRaisedStreet3'][i], hudCache['foldToOtherRaisedStreet4'][i],
hudCache['wonWhenSeenStreet1'][i], hudCache['wonAtSD'][i],
hudCache['stealAttemptChance'][i], hudCache['stealAttempted'][i], hudCache['foldBbToStealChance'][i],
hudCache['foldedBbToSteal'][i], hudCache['foldSbToStealChance'][i], hudCache['foldedSbToSteal'][i],
hudCache['street1CBChance'][i], hudCache['street1CBDone'][i], hudCache['street2CBChance'][i], hudCache['street2CBDone'][i],
hudCache['street3CBChance'][i], hudCache['street3CBDone'][i], hudCache['street4CBChance'][i], hudCache['street4CBDone'][i],
hudCache['foldToStreet1CBChance'][i], hudCache['foldToStreet1CBDone'][i],
hudCache['foldToStreet2CBChance'][i], hudCache['foldToStreet2CBDone'][i],
hudCache['foldToStreet3CBChance'][i], hudCache['foldToStreet3CBDone'][i],
hudCache['foldToStreet4CBChance'][i], hudCache['foldToStreet4CBDone'][i],
hudCache['street1CheckCallRaiseChance'][i], hudCache['street1CheckCallRaiseDone'][i],
hudCache['street2CheckCallRaiseChance'][i], hudCache['street2CheckCallRaiseDone'][i],
hudCache['street3CheckCallRaiseChance'][i], hudCache['street3CheckCallRaiseDone'][i],
hudCache['street4CheckCallRaiseChance'][i], hudCache['street4CheckCallRaiseDone'][i]
) )
#cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i])) #cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i]))
#result.append(cursor.fetchall()[0][0]) #result.append(cursor.fetchall()[0][0])
result.append( getLastInsertId(backend, conn, cursor) ) # mysql only result.append( getLastInsertId(backend, conn, cursor) )
else: else:
raise FpdbError("invalid category") raise FpdbError("invalid category")
return result return result
@ -1513,7 +1607,7 @@ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
card_values[i][6], card_suits[i][6], winnings[i], rakes[i], seatNos[i])) card_values[i][6], card_suits[i][6], winnings[i], rakes[i], seatNos[i]))
#cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i])) #cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i]))
#result.append(cursor.fetchall()[0][0]) #result.append(cursor.fetchall()[0][0])
result.append( getLastInsertId(backend, conn, cursor) ) # mysql only result.append( getLastInsertId(backend, conn, cursor) )
return result return result
#end def store_hands_players_stud #end def store_hands_players_stud
@ -1547,7 +1641,7 @@ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""",
raise FpdbError ("invalid card_values length:"+str(len(card_values[0]))) raise FpdbError ("invalid card_values length:"+str(len(card_values[0])))
#cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i])) #cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i]))
#result.append(cursor.fetchall()[0][0]) #result.append(cursor.fetchall()[0][0])
result.append( getLastInsertId(backend, conn, cursor) ) # mysql only result.append( getLastInsertId(backend, conn, cursor) )
return result return result
#end def store_hands_players_holdem_omaha_tourney #end def store_hands_players_holdem_omaha_tourney
@ -1572,7 +1666,7 @@ VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,
card_values[i][6], card_suits[i][6], winnings[i], rakes[i], tourneys_players_ids[i], seatNos[i])) card_values[i][6], card_suits[i][6], winnings[i], rakes[i], tourneys_players_ids[i], seatNos[i]))
#cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i])) #cursor.execute("SELECT id FROM HandsPlayers WHERE handId=%s AND playerId+0=%s", (hands_id, player_ids[i]))
#result.append(cursor.fetchall()[0][0]) #result.append(cursor.fetchall()[0][0])
result.append( getLastInsertId(backend, conn, cursor) ) # mysql only result.append( getLastInsertId(backend, conn, cursor) )
return result return result
#end def store_hands_players_stud_tourney #end def store_hands_players_stud_tourney