Merge Carl's changes from sqlcoder to GuiGraph to mine from earlier
This commit is contained in:
commit
077cb70c79
|
@ -616,6 +616,34 @@ class FpdbSQLQueries:
|
||||||
WHERE Players.name = %s AND HandsPlayers.handId = %s
|
WHERE Players.name = %s AND HandsPlayers.handId = %s
|
||||||
AND Players.siteId = %s AND (tourneysPlayersId IS NULL)"""
|
AND Players.siteId = %s AND (tourneysPlayersId IS NULL)"""
|
||||||
|
|
||||||
|
if(self.dbname == 'MySQL InnoDB') or (self.dbname == 'PostgreSQL'):
|
||||||
|
self.query['getRingProfitAllHandsPlayerIdSite'] = """
|
||||||
|
SELECT hp.handId, hp.winnings, SUM(ha.amount) costs, hp.winnings - SUM(ha.amount) profit
|
||||||
|
FROM HandsPlayers hp
|
||||||
|
INNER JOIN Players pl ON hp.playerId = pl.id
|
||||||
|
INNER JOIN Hands h ON h.id = hp.handId
|
||||||
|
INNER JOIN HandsActions ha ON ha.handPlayerId = hp.id
|
||||||
|
WHERE pl.name = %s
|
||||||
|
AND pl.siteId = %s
|
||||||
|
AND hp.tourneysPlayersId IS NULL
|
||||||
|
GROUP BY hp.handId, hp.winnings, h.handStart
|
||||||
|
ORDER BY h.handStart"""
|
||||||
|
elif(self.dbname == 'SQLite'):
|
||||||
|
#Probably doesn't work.
|
||||||
|
self.query['getRingProfitAllHandsPlayerIdSite'] = """
|
||||||
|
SELECT hp.handId, hp.winnings, SUM(ha.amount) costs, hp.winnings - SUM(ha.amount) profit
|
||||||
|
FROM HandsPlayers hp
|
||||||
|
INNER JOIN Players pl ON hp.playerId = pl.id
|
||||||
|
INNER JOIN Hands h ON h.id = hp.handId
|
||||||
|
INNER JOIN HandsActions ha ON ha.handPlayerId = hp.id
|
||||||
|
WHERE pl.name = %s
|
||||||
|
AND pl.siteId = %s
|
||||||
|
AND hp.tourneysPlayersId IS NULL
|
||||||
|
GROUP BY hp.handId, hp.winnings, h.handStart
|
||||||
|
ORDER BY h.handStart"""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__== "__main__":
|
if __name__== "__main__":
|
||||||
from optparse import OptionParser
|
from optparse import OptionParser
|
||||||
|
|
|
@ -28,6 +28,7 @@ class GuiBulkImport (threading.Thread):
|
||||||
"""imports a directory, non-recursive. todo: move this to fpdb_import so CLI can use it"""
|
"""imports a directory, non-recursive. todo: move this to fpdb_import so CLI can use it"""
|
||||||
self.path=self.inputFile
|
self.path=self.inputFile
|
||||||
self.importer.addImportDirectory(self.path)
|
self.importer.addImportDirectory(self.path)
|
||||||
|
self.importer.setCallHud(False)
|
||||||
self.importer.runImport()
|
self.importer.runImport()
|
||||||
print "GuiBulkImport.import_dir done"
|
print "GuiBulkImport.import_dir done"
|
||||||
|
|
||||||
|
@ -64,6 +65,7 @@ class GuiBulkImport (threading.Thread):
|
||||||
self.import_dir()
|
self.import_dir()
|
||||||
else:
|
else:
|
||||||
self.importer.addImportFile(self.inputFile)
|
self.importer.addImportFile(self.inputFile)
|
||||||
|
self.importer.setCallHud(False)
|
||||||
self.importer.runImport()
|
self.importer.runImport()
|
||||||
self.importer.clearFileList()
|
self.importer.clearFileList()
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,7 @@ import pygtk
|
||||||
pygtk.require('2.0')
|
pygtk.require('2.0')
|
||||||
import gtk
|
import gtk
|
||||||
import os
|
import os
|
||||||
|
from time import time
|
||||||
#import pokereval
|
#import pokereval
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -67,7 +68,9 @@ class GuiGraphViewer (threading.Thread):
|
||||||
self.ax = self.fig.add_subplot(111)
|
self.ax = self.fig.add_subplot(111)
|
||||||
|
|
||||||
#Get graph data from DB
|
#Get graph data from DB
|
||||||
|
starttime = time()
|
||||||
line = self.getRingProfitGraph(name, site)
|
line = self.getRingProfitGraph(name, site)
|
||||||
|
print "Graph generated in: %s" %(time() - starttime)
|
||||||
|
|
||||||
self.ax.set_title("Profit graph for ring games")
|
self.ax.set_title("Profit graph for ring games")
|
||||||
|
|
||||||
|
@ -92,23 +95,27 @@ class GuiGraphViewer (threading.Thread):
|
||||||
#end of def showClicked
|
#end of def showClicked
|
||||||
|
|
||||||
def getRingProfitGraph(self, name, site):
|
def getRingProfitGraph(self, name, site):
|
||||||
self.cursor.execute(self.sql.query['getRingWinningsAllGamesPlayerIdSite'], (name, site))
|
#self.cursor.execute(self.sql.query['getRingWinningsAllGamesPlayerIdSite'], (name, site))
|
||||||
winnings = self.db.cursor.fetchall()
|
self.cursor.execute(self.sql.query['getRingProfitAllHandsPlayerIdSite'], (name, site))
|
||||||
|
# returns (HandId,Winnings,Costs,Profit)
|
||||||
|
winnings = self.db.cursor.fetchall()
|
||||||
|
|
||||||
profit=range(len(winnings))
|
profit=range(len(winnings))
|
||||||
for i in profit:
|
for i in profit:
|
||||||
self.cursor.execute(self.sql.query['getRingProfitFromHandId'], (name, winnings[i][0], site))
|
self.cursor.execute(self.sql.query['getRingProfitFromHandId'], (name, winnings[i][0], site))
|
||||||
spent = self.db.cursor.fetchone()
|
spent = self.db.cursor.fetchone()
|
||||||
if not spent[0] == None:
|
if not spent[0] == None:
|
||||||
profit[i]=(i, winnings[i][1]-spent[0])
|
profit[i]=(i, winnings[i][1]-spent[0])
|
||||||
else:
|
else:
|
||||||
profit[i] = (i, 0)
|
profit[i] = (i, 0)
|
||||||
# todo: this probably adds in flat spots on your graph for hands you were not involved in (ie, observing, sitting out, etc)
|
# todo: this probably adds in flat spots on your graph for hands you were not involved in (ie, observing, sitting out, etc)
|
||||||
# and has that counted in your hand totals. Someone needs to figure out the SQL for totally removing any hand you're not in from the equation entirely
|
# and has that counted in your hand totals. Someone needs to figure out the SQL for totally removing any hand you're not in from the equation entirely
|
||||||
|
|
||||||
|
|
||||||
y=map(lambda x:float(x[1]), profit)
|
# y=map(lambda x:float(x[1]), profit)
|
||||||
line = cumsum(y)
|
y=map(lambda x:float(x[3]), winnings)
|
||||||
return line/100
|
line = cumsum(y)
|
||||||
|
return line/100
|
||||||
#end of def getRingProfitGraph
|
#end of def getRingProfitGraph
|
||||||
|
|
||||||
def __init__(self, db, settings, querylist, config, debug=True):
|
def __init__(self, db, settings, querylist, config, debug=True):
|
||||||
|
|
|
@ -24,8 +24,11 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import Configuration
|
||||||
import fpdb_db
|
import fpdb_db
|
||||||
import fpdb_import
|
import fpdb_import
|
||||||
|
import fpdb_simple
|
||||||
import FpdbSQLQueries
|
import FpdbSQLQueries
|
||||||
|
|
||||||
import unittest
|
import unittest
|
||||||
|
@ -34,6 +37,7 @@ class TestSequenceFunctions(unittest.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Configure MySQL settings/database and establish connection"""
|
"""Configure MySQL settings/database and establish connection"""
|
||||||
|
self.c = Configuration.Config()
|
||||||
self.mysql_settings={ 'db-host':"localhost",
|
self.mysql_settings={ 'db-host':"localhost",
|
||||||
'db-backend':2,
|
'db-backend':2,
|
||||||
'db-databaseName':"fpdbtest",
|
'db-databaseName':"fpdbtest",
|
||||||
|
@ -44,7 +48,7 @@ class TestSequenceFunctions(unittest.TestCase):
|
||||||
self.mysql_settings['db-databaseName'], self.mysql_settings['db-user'],
|
self.mysql_settings['db-databaseName'], self.mysql_settings['db-user'],
|
||||||
self.mysql_settings['db-password'])
|
self.mysql_settings['db-password'])
|
||||||
self.mysqldict = FpdbSQLQueries.FpdbSQLQueries('MySQL InnoDB')
|
self.mysqldict = FpdbSQLQueries.FpdbSQLQueries('MySQL InnoDB')
|
||||||
self.mysqlimporter = fpdb_import.Importer(self, self.mysql_settings)
|
self.mysqlimporter = fpdb_import.Importer(self, self.mysql_settings, self.c)
|
||||||
|
|
||||||
# """Configure Postgres settings/database and establish connection"""
|
# """Configure Postgres settings/database and establish connection"""
|
||||||
# self.pg_settings={ 'db-host':"localhost", 'db-backend':3, 'db-databaseName':"fpdbtest", 'db-user':"fpdb", 'db-password':"fpdb"}
|
# self.pg_settings={ 'db-host':"localhost", 'db-backend':3, 'db-databaseName':"fpdbtest", 'db-user':"fpdb", 'db-password':"fpdb"}
|
||||||
|
@ -69,6 +73,21 @@ class TestSequenceFunctions(unittest.TestCase):
|
||||||
self.result = self.mysql_db.cursor.execute("SHOW TABLES")
|
self.result = self.mysql_db.cursor.execute("SHOW TABLES")
|
||||||
self.failUnless(self.result==13, "Number of tables in database incorrect. Expected 13 got " + str(self.result))
|
self.failUnless(self.result==13, "Number of tables in database incorrect. Expected 13 got " + str(self.result))
|
||||||
|
|
||||||
|
def testPokerStarsHHDate(self):
|
||||||
|
latest = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/11/12 10:00:48 CET [2008/11/12 4:00:48 ET]"
|
||||||
|
previous = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/08/17 - 01:14:43 (ET)"
|
||||||
|
older1 = "PokerStars Game #21969660557: Hold'em No Limit ($0.50/$1.00) - 2008/09/07 06:23:14 ET"
|
||||||
|
|
||||||
|
result = fpdb_simple.parseHandStartTime(older1, "ps")
|
||||||
|
self.failUnless(result==datetime.datetime(2008,9,7,11,23,14),
|
||||||
|
"Date incorrect, expected: 2008-09-07 11:23:14 got: " + str(result))
|
||||||
|
result = fpdb_simple.parseHandStartTime(latest, "ps")
|
||||||
|
self.failUnless(result==datetime.datetime(2008,11,12,15,00,48),
|
||||||
|
"Date incorrect, expected: 2008-11-12 15:00:48 got: " + str(result))
|
||||||
|
result = fpdb_simple.parseHandStartTime(previous, "ps")
|
||||||
|
self.failUnless(result==datetime.datetime(2008,8,17,6,14,43),
|
||||||
|
"Date incorrect, expected: 2008-08-17 01:14:43 got: " + str(result))
|
||||||
|
|
||||||
def testImportHandHistoryFiles(self):
|
def testImportHandHistoryFiles(self):
|
||||||
"""Test import of single HH file"""
|
"""Test import of single HH file"""
|
||||||
self.mysqlimporter.addImportFile("regression-test-files/hand-histories/ps-lhe-ring-3hands.txt")
|
self.mysqlimporter.addImportFile("regression-test-files/hand-histories/ps-lhe-ring-3hands.txt")
|
||||||
|
|
|
@ -831,14 +831,16 @@ def parseHandStartTime(topline, site):
|
||||||
tmp=topline[pos1:pos2]
|
tmp=topline[pos1:pos2]
|
||||||
isUTC=True
|
isUTC=True
|
||||||
else:
|
else:
|
||||||
tmp=topline[-30:]
|
tmp=topline
|
||||||
#print "parsehandStartTime, tmp:", tmp
|
# print "parsehandStartTime, tmp:", tmp
|
||||||
pos = tmp.find("-")+2
|
pos = tmp.find("-")+2
|
||||||
tmp = tmp[pos:]
|
tmp = tmp[pos:]
|
||||||
#Need to match either
|
#Need to match either
|
||||||
# 2008/09/07 06:23:14 ET or
|
# 2008/09/07 06:23:14 ET or
|
||||||
# 2008/08/17 - 01:14:43 (ET)
|
# 2008/08/17 - 01:14:43 (ET) or
|
||||||
m = re.match('(?P<YEAR>[0-9]{4})\/(?P<MON>[0-9]{2})\/(?P<DAY>[0-9]{2})[\- ]+(?P<HR>[0-9]{2}):(?P<MIN>[0-9]{2}):(?P<SEC>[0-9]{2})',tmp)
|
# 2008/11/12 9:33:31 CET [2008/11/12 3:33:31 ET]
|
||||||
|
rexx = '(?P<YEAR>[0-9]{4})\/(?P<MON>[0-9]{2})\/(?P<DAY>[0-9]{2})[\- ]+(?P<HR>[0-9]+):(?P<MIN>[0-9]+):(?P<SEC>[0-9]+)'
|
||||||
|
m = re.search(rexx,tmp)
|
||||||
#print "year:", int(m.group('YEAR')), "month", int(m.group('MON')), "day", int(m.group('DAY')), "hour", int(m.group('HR')), "minute", int(m.group('MIN')), "second", int(m.group('SEC'))
|
#print "year:", int(m.group('YEAR')), "month", int(m.group('MON')), "day", int(m.group('DAY')), "hour", int(m.group('HR')), "minute", int(m.group('MIN')), "second", int(m.group('SEC'))
|
||||||
result = datetime.datetime(int(m.group('YEAR')), int(m.group('MON')), int(m.group('DAY')), int(m.group('HR')), int(m.group('MIN')), int(m.group('SEC')))
|
result = datetime.datetime(int(m.group('YEAR')), int(m.group('MON')), int(m.group('DAY')), int(m.group('HR')), int(m.group('MIN')), int(m.group('SEC')))
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue
Block a user