""" Overlay Registry models - lookup tables for entity resolution """ from sqlalchemy import Column, String, Float, Boolean, Index, UniqueConstraint, JSON from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP from datetime import datetime, timezone import uuid from app.core.database import Base class CompanyAlias(Base): __tablename__ = "company_aliases" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) symbol = Column(String(10), nullable=False, index=True) alias_type = Column(String(20), nullable=False) # canonical/short/alias/wiki alias_value = Column(String(255), nullable=False) confidence = Column(Float, default=1.0) active = Column(Boolean, default=True) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( Index("idx_company_aliases_symbol", "symbol"), Index("idx_company_aliases_value", "alias_value"), ) class YouTubeChannelRegistry(Base): __tablename__ = "youtube_channel_registry" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) channel_id = Column(String(100), unique=True, nullable=False) channel_title = Column(String(255), nullable=False) category = Column(String(50), nullable=True) channel_weight = Column(Float, default=0.5) # 0~1 active = Column(Boolean, default=True) watch_mode = Column(String(20), default="recent") # recent / all symbol_focus_tags = Column(JSON, default=list) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) class WikiPageMap(Base): __tablename__ = "wiki_page_map" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) symbol = Column(String(10), nullable=False) wiki_page_title = Column(String(500), nullable=False) confidence = Column(Float, default=1.0) active = Column(Boolean, default=True) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( UniqueConstraint("symbol", "wiki_page_title", name="uq_wiki_page_map"), Index("idx_wiki_page_map_symbol", "symbol"), ) class ThemeTopicMap(Base): __tablename__ = "theme_topic_map" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) topic_id = Column(String(100), nullable=False, unique=True) topic_label = Column(String(255), nullable=False) mapped_symbols = Column(JSON, default=list) # list of ticker strings active = Column(Boolean, default=True) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) )