from __future__ import annotations import uuid from datetime import datetime from sqlalchemy import DateTime, ForeignKey, Integer, Text, func from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column, relationship from app.database.database import Base from pgvector.sqlalchemy import Vector class DocumentChunk(Base): """ A retrievable chunk of a specific document version. Chunks preserve lightweight provenance so retrieval results can be traced back to their original document location. """ __tablename__ = "document_chunks" id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4, ) document_version_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), ForeignKey( "document_versions.id", ondelete="CASCADE", ), nullable=False, index=True, ) chunk_index: Mapped[int] = mapped_column( Integer, nullable=False, ) text: Mapped[str] = mapped_column( Text, nullable=False, ) page_number: Mapped[int | None] = mapped_column( Integer, nullable=True, ) section: Mapped[str | None] = mapped_column( Text, nullable=True, ) embedding: Mapped[list[float] | None] = mapped_column( Vector(384), nullable=True, ) created_at: Mapped[datetime] = mapped_column( DateTime(timezone=True), server_default=func.now(), nullable=False, ) document_version: Mapped["DocumentVersion"] = relationship( back_populates="chunks", ) def __repr__(self) -> str: return ( f"" )