from __future__ import annotations from sqlalchemy import Boolean, DateTime, ForeignKey, Integer, String, Text, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column, relationship from app.db.base import Base class DocumentAnalysisVersion(Base): __tablename__ = "document_analysis_versions" id: Mapped[int] = mapped_column(Integer, primary_key=True) document_id: Mapped[int] = mapped_column(ForeignKey("documents.id", ondelete="CASCADE"), index=True, nullable=False) version_number: Mapped[int] = mapped_column(Integer, nullable=False) analysis_type: Mapped[str] = mapped_column(String(50), nullable=False, default="canonical") is_current: Mapped[bool] = mapped_column(Boolean, nullable=False, default=True) created_by: Mapped[str | None] = mapped_column(String(100), nullable=True) engine_name: Mapped[str | None] = mapped_column(String(100), nullable=True) engine_version: Mapped[str | None] = mapped_column(String(100), nullable=True) model_name: Mapped[str | None] = mapped_column(String(200), nullable=True) prompt_version: Mapped[str | None] = mapped_column(String(100), nullable=True) quality_score: Mapped[float | None] = mapped_column(nullable=True) quality_note: Mapped[str | None] = mapped_column(Text, nullable=True) quality_flags: Mapped[dict | list | None] = mapped_column(JSONB, nullable=True) analysis_json: Mapped[dict | None] = mapped_column(JSONB, nullable=True) created_at: Mapped[DateTime] = mapped_column(DateTime(timezone=True), server_default=func.now(), nullable=False) document = relationship("Document", back_populates="analysis_versions")