database.py 1,91 ko
Newer Older
Hamadou Ba's avatar
Hamadou Ba a validé
"""
SQLAlchemy database models for simulation persistence.
"""
from sqlalchemy import Column, String, Integer, Float, Boolean, DateTime
from sqlalchemy.dialects.postgresql import JSONB
from sqlalchemy.types import JSON
from datetime import datetime
from ..database.connection import Base
import os

# Utiliser JSONB pour PostgreSQL, JSON pour SQLite
JsonType = JSONB if "postgresql" in os.getenv("DATABASE_URL", "") else JSON


class SimulationRun(Base):
    """Table pour stocker les résultats de simulation."""
    __tablename__ = "simulation_runs"

    id = Column(String, primary_key=True)  # UUID session_id
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)

    # Configuration
    config = Column(JsonType, nullable=False)

    # Métriques principales (dénormalisées pour performance)
    total_requests_arrived = Column(Integer, nullable=False, index=True)
    total_requests_completed = Column(Integer, nullable=False)
    average_system_time = Column(Float, nullable=False)
    average_customers_in_system = Column(Float, nullable=False)
    is_stable = Column(Boolean, nullable=False, index=True)

    # Résultats complets (JSON)
    coordinator_stats = Column(JsonType, nullable=False)
    server_stats = Column(JsonType, nullable=False)
    time_series = Column(JsonType)
    processing_time_histogram = Column(JsonType)

    status = Column(String, nullable=False, default="completed", index=True)


class SavedConfiguration(Base):
    """Table pour stocker les configurations sauvegardées."""
    __tablename__ = "saved_configurations"

    id = Column(String, primary_key=True)  # UUID
    name = Column(String, nullable=False)
    description = Column(String)
    config = Column(JsonType, nullable=False)
    created_at = Column(DateTime, default=datetime.utcnow, nullable=False, index=True)
    updated_at = Column(DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False)