"""document_lineage 테이블 ORM — 문서 파생 관계 이력 (migration 217). G2 pre-segmentation 이 relation_type='segmented_from'(번들 → 자식) 으로 사용 (migration 363). 이력 테이블 FK = ON DELETE RESTRICT (부모 hard delete 차단, soft delete 만 허용). """ from datetime import datetime from sqlalchemy import BigInteger, ForeignKey, Text, func from sqlalchemy.dialects.postgresql import JSONB from sqlalchemy.orm import Mapped, mapped_column from sqlalchemy.types import TIMESTAMP from core.database import Base class DocumentLineage(Base): __tablename__ = "document_lineage" id: Mapped[int] = mapped_column(BigInteger, primary_key=True) source_document_id: Mapped[int] = mapped_column( BigInteger, ForeignKey("documents.id", ondelete="RESTRICT"), nullable=False ) derived_document_id: Mapped[int] = mapped_column( BigInteger, ForeignKey("documents.id", ondelete="RESTRICT"), nullable=False ) relation_type: Mapped[str] = mapped_column(Text, nullable=False) # 'metadata' 는 SQLAlchemy 예약속성 → Python 속성명은 meta, DB 컬럼명은 metadata. meta: Mapped[dict] = mapped_column( "metadata", JSONB, nullable=False, default=dict, server_default="{}" ) created_at: Mapped[datetime] = mapped_column(TIMESTAMP(timezone=True), server_default=func.now())