from __future__ import annotations from datetime import datetime, timezone from sqlalchemy import ( Boolean, DateTime, Enum as SAEnum, Float, ForeignKey, Integer, String, func, ) from sqlalchemy.orm import Mapped, mapped_column from .base import Base, MatchStatus, SubjectType class Match(Base): """A persisted candidate match for human review (spec ยง7.7).""" __tablename__ = "matches" id: Mapped[int] = mapped_column(primary_key=True) case_id: Mapped[int] = mapped_column(ForeignKey("cases.id"), index=True) candidate_type: Mapped[SubjectType] = mapped_column( SAEnum(SubjectType, native_enum=False) ) candidate_id: Mapped[int] = mapped_column(Integer) # the matched dog candidate_case_id: Mapped[int | None] = mapped_column( ForeignKey("cases.id"), nullable=True ) similarity_score: Mapped[float] = mapped_column(Float) # dog-level aggregate rank: Mapped[int] = mapped_column(Integer) # 1 = best model_name: Mapped[str] = mapped_column(String(80)) model_version: Mapped[str] = mapped_column(String(40)) status: Mapped[MatchStatus] = mapped_column( SAEnum(MatchStatus, native_enum=False), default=MatchStatus.pending ) reviewed: Mapped[bool] = mapped_column(Boolean, default=False) reviewed_by: Mapped[int | None] = mapped_column( ForeignKey("users.id"), nullable=True ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), default=lambda: datetime.now(timezone.utc), server_default=func.now(), )