forked from c0de/BaseballBot
Initial Code
This commit is contained in:
@@ -1,28 +1,28 @@
|
||||
from sqlalchemy import Column, String, Integer, ForeignKey, Date
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class Play(Base):
|
||||
__tablename__ = 'play'
|
||||
|
||||
play_id = Column(String, nullable=False, primary_key=True)
|
||||
pitch_value = Column(Integer, nullable=True)
|
||||
creation_date = Column(Date, nullable=False)
|
||||
server_id = Column(String, nullable=False)
|
||||
|
||||
guesses = relationship(lambda : Guess)
|
||||
|
||||
class Guess(Base):
|
||||
__FAKE_VALUE__ = -5000
|
||||
|
||||
__tablename__ = 'guess'
|
||||
member_id = Column(String, nullable=False, primary_key=True)
|
||||
play_id = Column(UUID, ForeignKey(Play.play_id), nullable=False, primary_key=True)
|
||||
guessed_number = Column(Integer, nullable=False)
|
||||
member_name = Column(String, nullable=False)
|
||||
difference = Column(Integer)
|
||||
|
||||
play = relationship("Play", back_populates="guesses")
|
||||
from sqlalchemy import Column, String, Integer, ForeignKey, Date
|
||||
from sqlalchemy.dialects.postgresql import UUID
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from sqlalchemy.orm import relationship
|
||||
|
||||
Base = declarative_base()
|
||||
|
||||
class Play(Base):
|
||||
__tablename__ = 'play'
|
||||
|
||||
play_id = Column(String, nullable=False, primary_key=True)
|
||||
pitch_value = Column(Integer, nullable=True)
|
||||
creation_date = Column(Date, nullable=False)
|
||||
server_id = Column(String, nullable=False)
|
||||
|
||||
guesses = relationship(lambda : Guess)
|
||||
|
||||
class Guess(Base):
|
||||
__FAKE_VALUE__ = -5000
|
||||
|
||||
__tablename__ = 'guess'
|
||||
member_id = Column(String, nullable=False, primary_key=True)
|
||||
play_id = Column(UUID, ForeignKey(Play.play_id), nullable=False, primary_key=True)
|
||||
guessed_number = Column(Integer, nullable=False)
|
||||
member_name = Column(String, nullable=False)
|
||||
difference = Column(Integer)
|
||||
|
||||
play = relationship("Play", back_populates="guesses")
|
||||
|
@@ -1,123 +1,123 @@
|
||||
from copy import deepcopy
|
||||
|
||||
from src.main.database_module.database_classes.db_classes import Guess
|
||||
from src.main.db_session import DatabaseSession
|
||||
|
||||
|
||||
MEMBER_ID = 'member_id'
|
||||
PLAY_ID = 'play_id'
|
||||
GUESSED_NUMBER = 'guessed_number'
|
||||
DIFFERENCE = 'difference'
|
||||
MEMBER_NAME = 'member_name'
|
||||
|
||||
class GuessDAO():
|
||||
db_string = None
|
||||
session = None
|
||||
Session = None
|
||||
engine = None
|
||||
|
||||
_database_session = None
|
||||
|
||||
def __init__(self):
|
||||
self._database_session = DatabaseSession()
|
||||
|
||||
def insert(self, guess_info, allow_update=False):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
guess = Guess(
|
||||
member_id=guess_info[MEMBER_ID],
|
||||
play_id = guess_info[PLAY_ID],
|
||||
guessed_number = guess_info[GUESSED_NUMBER],
|
||||
member_name = guess_info[MEMBER_NAME]
|
||||
)
|
||||
|
||||
existing_guess = self.__convert_all__(session\
|
||||
.query(Guess)\
|
||||
.filter(Guess.member_id == guess_info[MEMBER_ID], Guess.play_id == guess_info[PLAY_ID]))
|
||||
|
||||
if len(existing_guess) == 0:
|
||||
session.add(guess)
|
||||
session.commit()
|
||||
return True
|
||||
elif allow_update:
|
||||
session\
|
||||
.query(Guess)\
|
||||
.filter(Guess.member_id == guess_info[MEMBER_ID], Guess.play_id == guess_info[PLAY_ID], Guess.member_name == guess_info[MEMBER_NAME])\
|
||||
.update({Guess.guessed_number: guess_info[GUESSED_NUMBER]})
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
'''
|
||||
Converts the database object into a Dictionary, so that the database object is not passed out of the
|
||||
datastore layer.
|
||||
'''
|
||||
def __convert_all__(self, games):
|
||||
converted_games = []
|
||||
for game in games:
|
||||
game_dict = {}
|
||||
for column in game.__dict__:
|
||||
game_dict[column] = str(getattr(game, column))
|
||||
|
||||
converted_games.append(deepcopy(game_dict))
|
||||
|
||||
return converted_games
|
||||
|
||||
def set_differences(self, pitch_value, play_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
games_to_update = self.__convert_all__(session.query(Guess).filter(Guess.play_id == play_id))
|
||||
|
||||
for game in games_to_update:
|
||||
difference = self.calculate_difference(pitch_value, game[GUESSED_NUMBER])
|
||||
session.query(Guess).filter(Guess.member_id == game[MEMBER_ID], Guess.play_id == game[PLAY_ID]).update({Guess.difference: difference})
|
||||
|
||||
session.commit()
|
||||
|
||||
def calculate_difference(self, pitch_value, guess_value):
|
||||
pitched_number = int(pitch_value)
|
||||
possible_value = abs(int(guess_value) - pitched_number)
|
||||
|
||||
if possible_value > 500:
|
||||
return 1000 - possible_value
|
||||
else:
|
||||
return possible_value
|
||||
|
||||
def fetch_closest(self, num_to_fetch):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
return self.__convert_all__(
|
||||
session\
|
||||
.query(Guess)\
|
||||
.order_by(Guess.difference)\
|
||||
.limit(num_to_fetch)
|
||||
)
|
||||
|
||||
def refresh(self):
|
||||
self._database_session.__create_new_session__() # I know, I know. It's fine.
|
||||
|
||||
def get_all_guesses_for_plays(self, play_ids):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(
|
||||
session
|
||||
.query(Guess)
|
||||
.filter(Guess.play_id.in_(play_ids))
|
||||
)
|
||||
|
||||
def get_closest_on_play(self, play):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
# TODO: Make this a MAX query for ties
|
||||
converted_guesses = self.__convert_all__(
|
||||
session
|
||||
.query(Guess)
|
||||
.filter(Guess.play_id == play)
|
||||
.order_by(Guess.difference)
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
if len(converted_guesses) > 1:
|
||||
raise AssertionError("More than one best guess! Can't continue!")
|
||||
elif len(converted_guesses) == 0:
|
||||
return None
|
||||
else:
|
||||
from copy import deepcopy
|
||||
|
||||
from src.main.database_module.database_classes.db_classes import Guess
|
||||
from src.main.db_session import DatabaseSession
|
||||
|
||||
|
||||
MEMBER_ID = 'member_id'
|
||||
PLAY_ID = 'play_id'
|
||||
GUESSED_NUMBER = 'guessed_number'
|
||||
DIFFERENCE = 'difference'
|
||||
MEMBER_NAME = 'member_name'
|
||||
|
||||
class GuessDAO():
|
||||
db_string = None
|
||||
session = None
|
||||
Session = None
|
||||
engine = None
|
||||
|
||||
_database_session = None
|
||||
|
||||
def __init__(self):
|
||||
self._database_session = DatabaseSession()
|
||||
|
||||
def insert(self, guess_info, allow_update=False):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
guess = Guess(
|
||||
member_id=guess_info[MEMBER_ID],
|
||||
play_id = guess_info[PLAY_ID],
|
||||
guessed_number = guess_info[GUESSED_NUMBER],
|
||||
member_name = guess_info[MEMBER_NAME]
|
||||
)
|
||||
|
||||
existing_guess = self.__convert_all__(session\
|
||||
.query(Guess)\
|
||||
.filter(Guess.member_id == guess_info[MEMBER_ID], Guess.play_id == guess_info[PLAY_ID]))
|
||||
|
||||
if len(existing_guess) == 0:
|
||||
session.add(guess)
|
||||
session.commit()
|
||||
return True
|
||||
elif allow_update:
|
||||
session\
|
||||
.query(Guess)\
|
||||
.filter(Guess.member_id == guess_info[MEMBER_ID], Guess.play_id == guess_info[PLAY_ID], Guess.member_name == guess_info[MEMBER_NAME])\
|
||||
.update({Guess.guessed_number: guess_info[GUESSED_NUMBER]})
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
'''
|
||||
Converts the database object into a Dictionary, so that the database object is not passed out of the
|
||||
datastore layer.
|
||||
'''
|
||||
def __convert_all__(self, games):
|
||||
converted_games = []
|
||||
for game in games:
|
||||
game_dict = {}
|
||||
for column in game.__dict__:
|
||||
game_dict[column] = str(getattr(game, column))
|
||||
|
||||
converted_games.append(deepcopy(game_dict))
|
||||
|
||||
return converted_games
|
||||
|
||||
def set_differences(self, pitch_value, play_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
games_to_update = self.__convert_all__(session.query(Guess).filter(Guess.play_id == play_id))
|
||||
|
||||
for game in games_to_update:
|
||||
difference = self.calculate_difference(pitch_value, game[GUESSED_NUMBER])
|
||||
session.query(Guess).filter(Guess.member_id == game[MEMBER_ID], Guess.play_id == game[PLAY_ID]).update({Guess.difference: difference})
|
||||
|
||||
session.commit()
|
||||
|
||||
def calculate_difference(self, pitch_value, guess_value):
|
||||
pitched_number = int(pitch_value)
|
||||
possible_value = abs(int(guess_value) - pitched_number)
|
||||
|
||||
if possible_value > 500:
|
||||
return 1000 - possible_value
|
||||
else:
|
||||
return possible_value
|
||||
|
||||
def fetch_closest(self, num_to_fetch):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
return self.__convert_all__(
|
||||
session\
|
||||
.query(Guess)\
|
||||
.order_by(Guess.difference)\
|
||||
.limit(num_to_fetch)
|
||||
)
|
||||
|
||||
def refresh(self):
|
||||
self._database_session.__create_new_session__() # I know, I know. It's fine.
|
||||
|
||||
def get_all_guesses_for_plays(self, play_ids):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(
|
||||
session
|
||||
.query(Guess)
|
||||
.filter(Guess.play_id.in_(play_ids))
|
||||
)
|
||||
|
||||
def get_closest_on_play(self, play):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
# TODO: Make this a MAX query for ties
|
||||
converted_guesses = self.__convert_all__(
|
||||
session
|
||||
.query(Guess)
|
||||
.filter(Guess.play_id == play)
|
||||
.order_by(Guess.difference)
|
||||
.limit(1)
|
||||
)
|
||||
|
||||
if len(converted_guesses) > 1:
|
||||
raise AssertionError("More than one best guess! Can't continue!")
|
||||
elif len(converted_guesses) == 0:
|
||||
return None
|
||||
else:
|
||||
return converted_guesses[0]
|
@@ -1,96 +1,96 @@
|
||||
from copy import deepcopy
|
||||
from sqlalchemy.sql.expression import and_
|
||||
|
||||
from src.main.db_session import DatabaseSession
|
||||
from src.main.database_module.database_classes.db_classes import Play
|
||||
|
||||
import datetime
|
||||
|
||||
PLAY_ID = 'play_id'
|
||||
PITCH_VALUE = 'pitch_value'
|
||||
CREATION_DATE = 'creation_date'
|
||||
SERVER_ID = 'server_id'
|
||||
|
||||
class PlayDAO():
|
||||
db_string = None
|
||||
session = None
|
||||
Session = None
|
||||
engine = None
|
||||
_database_session = None
|
||||
|
||||
def __init__(self):
|
||||
self._database_session = DatabaseSession()
|
||||
|
||||
def insert(self, play_info):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
play = Play(
|
||||
play_id = play_info[PLAY_ID],
|
||||
pitch_value = play_info[PITCH_VALUE] if PITCH_VALUE in play_info else None,
|
||||
creation_date = play_info[CREATION_DATE],
|
||||
server_id = play_info[SERVER_ID]
|
||||
)
|
||||
|
||||
session.add(play)
|
||||
session.commit()
|
||||
|
||||
def get_play_by_id(self, input_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(session.query(Play).filter(Play.play_id == input_id))
|
||||
|
||||
def get_all_plays_after(self, timestamp, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(session.query(Play).filter(and_(Play.server_id == str(input_server_id), Play.creation_date > timestamp)))
|
||||
|
||||
def get_all_plays_on_server(self, input_server_id, earliest_timestamp):
|
||||
session = self._database_session.get_or_create_session()
|
||||
converted_datetime = datetime.datetime.fromtimestamp(earliest_timestamp / 1000.0)
|
||||
|
||||
return self.__convert_all__(session.query(Play).filter(and_(Play.server_id == str(input_server_id), Play.creation_date > converted_datetime)))
|
||||
|
||||
'''
|
||||
Checks to see if there is a play that is currently active or not
|
||||
'''
|
||||
def is_active_play(self, server_id):
|
||||
return self.get_active_play(server_id) != None
|
||||
|
||||
def get_active_play(self, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
plays = self.__convert_all__(session.query(Play).filter(and_(Play.pitch_value == None, Play.server_id == str(input_server_id))))
|
||||
|
||||
if len(plays) > 1:
|
||||
raise AssertionError("More than one active play! Can't continue!")
|
||||
elif len(plays) == 0:
|
||||
return None
|
||||
else:
|
||||
return plays[0]
|
||||
|
||||
def resolve_play(self, input_pitch, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
active_id = self.get_active_play(input_server_id)
|
||||
|
||||
session\
|
||||
.query(Play)\
|
||||
.filter(and_(Play.pitch_value == None, Play.server_id == str(input_server_id)))\
|
||||
.update({Play.pitch_value: input_pitch})
|
||||
session.commit()
|
||||
|
||||
return active_id
|
||||
|
||||
def refresh(self):
|
||||
self._database_session.__create_new_session__() # I know, I know. It's fine.
|
||||
|
||||
'''
|
||||
Converts the database object into a Dictionary, so that the database object is not passed out of the
|
||||
datastore layer.
|
||||
'''
|
||||
def __convert_all__(self, plays):
|
||||
converted_plays = []
|
||||
for play in plays:
|
||||
play_dict = {}
|
||||
for column in play.__dict__:
|
||||
play_dict[column] = str(getattr(play, column))
|
||||
|
||||
converted_plays.append(deepcopy(play_dict))
|
||||
|
||||
return converted_plays
|
||||
from copy import deepcopy
|
||||
from sqlalchemy.sql.expression import and_
|
||||
|
||||
from src.main.db_session import DatabaseSession
|
||||
from src.main.database_module.database_classes.db_classes import Play
|
||||
|
||||
import datetime
|
||||
|
||||
PLAY_ID = 'play_id'
|
||||
PITCH_VALUE = 'pitch_value'
|
||||
CREATION_DATE = 'creation_date'
|
||||
SERVER_ID = 'server_id'
|
||||
|
||||
class PlayDAO():
|
||||
db_string = None
|
||||
session = None
|
||||
Session = None
|
||||
engine = None
|
||||
_database_session = None
|
||||
|
||||
def __init__(self):
|
||||
self._database_session = DatabaseSession()
|
||||
|
||||
def insert(self, play_info):
|
||||
session = self._database_session.get_or_create_session()
|
||||
|
||||
play = Play(
|
||||
play_id = play_info[PLAY_ID],
|
||||
pitch_value = play_info[PITCH_VALUE] if PITCH_VALUE in play_info else None,
|
||||
creation_date = play_info[CREATION_DATE],
|
||||
server_id = play_info[SERVER_ID]
|
||||
)
|
||||
|
||||
session.add(play)
|
||||
session.commit()
|
||||
|
||||
def get_play_by_id(self, input_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(session.query(Play).filter(Play.play_id == input_id))
|
||||
|
||||
def get_all_plays_after(self, timestamp, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
return self.__convert_all__(session.query(Play).filter(and_(Play.server_id == str(input_server_id), Play.creation_date > timestamp)))
|
||||
|
||||
def get_all_plays_on_server(self, input_server_id, earliest_timestamp):
|
||||
session = self._database_session.get_or_create_session()
|
||||
converted_datetime = datetime.datetime.fromtimestamp(earliest_timestamp / 1000.0)
|
||||
|
||||
return self.__convert_all__(session.query(Play).filter(and_(Play.server_id == str(input_server_id), Play.creation_date > converted_datetime)))
|
||||
|
||||
'''
|
||||
Checks to see if there is a play that is currently active or not
|
||||
'''
|
||||
def is_active_play(self, server_id):
|
||||
return self.get_active_play(server_id) != None
|
||||
|
||||
def get_active_play(self, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
plays = self.__convert_all__(session.query(Play).filter(and_(Play.pitch_value == None, Play.server_id == str(input_server_id))))
|
||||
|
||||
if len(plays) > 1:
|
||||
raise AssertionError("More than one active play! Can't continue!")
|
||||
elif len(plays) == 0:
|
||||
return None
|
||||
else:
|
||||
return plays[0]
|
||||
|
||||
def resolve_play(self, input_pitch, input_server_id):
|
||||
session = self._database_session.get_or_create_session()
|
||||
active_id = self.get_active_play(input_server_id)
|
||||
|
||||
session\
|
||||
.query(Play)\
|
||||
.filter(and_(Play.pitch_value == None, Play.server_id == str(input_server_id)))\
|
||||
.update({Play.pitch_value: input_pitch})
|
||||
session.commit()
|
||||
|
||||
return active_id
|
||||
|
||||
def refresh(self):
|
||||
self._database_session.__create_new_session__() # I know, I know. It's fine.
|
||||
|
||||
'''
|
||||
Converts the database object into a Dictionary, so that the database object is not passed out of the
|
||||
datastore layer.
|
||||
'''
|
||||
def __convert_all__(self, plays):
|
||||
converted_plays = []
|
||||
for play in plays:
|
||||
play_dict = {}
|
||||
for column in play.__dict__:
|
||||
play_dict[column] = str(getattr(play, column))
|
||||
|
||||
converted_plays.append(deepcopy(play_dict))
|
||||
|
||||
return converted_plays
|
||||
|
Reference in New Issue
Block a user