""" 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)