40 lines
1.5 KiB
Python
40 lines
1.5 KiB
Python
"""SQLAlchemy ORM models for ELO rating tables."""
|
|
|
|
from sqlalchemy import Column, DateTime, Float, Integer, String
|
|
from sqlalchemy.sql import func
|
|
|
|
from app.config import settings
|
|
from app.database import Base
|
|
|
|
|
|
class EloRating(Base):
|
|
"""Tracks the current ELO rating for each listing."""
|
|
|
|
__tablename__ = "ratings"
|
|
__table_args__ = {"schema": settings.ELO_SCHEMA}
|
|
|
|
global_id = Column(String, primary_key=True)
|
|
elo_rating = Column(Float, nullable=False, default=settings.DEFAULT_ELO)
|
|
comparison_count = Column(Integer, nullable=False, default=0)
|
|
wins = Column(Integer, nullable=False, default=0)
|
|
losses = Column(Integer, nullable=False, default=0)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|
|
updated_at = Column(DateTime(timezone=True), server_default=func.now(), onupdate=func.now())
|
|
|
|
|
|
class Comparison(Base):
|
|
"""Records each pairwise comparison with ELO snapshots."""
|
|
|
|
__tablename__ = "comparisons"
|
|
__table_args__ = {"schema": settings.ELO_SCHEMA}
|
|
|
|
id = Column(Integer, primary_key=True, autoincrement=True)
|
|
listing_a_id = Column(String, nullable=False)
|
|
listing_b_id = Column(String, nullable=False)
|
|
winner_id = Column(String, nullable=False)
|
|
elo_a_before = Column(Float, nullable=False)
|
|
elo_b_before = Column(Float, nullable=False)
|
|
elo_a_after = Column(Float, nullable=False)
|
|
elo_b_after = Column(Float, nullable=False)
|
|
created_at = Column(DateTime(timezone=True), server_default=func.now())
|