""" Overlay raw event models - time-series raw data from each source """ from sqlalchemy import Column, String, Float, Integer, Index, UniqueConstraint, JSON, Text from sqlalchemy.dialects.postgresql import UUID, TIMESTAMP from datetime import datetime, timezone import uuid from app.core.database import Base class OverlayHeadlineEvent(Base): __tablename__ = "overlay_headline_events" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) article_guid = Column(String(500), unique=True, nullable=False) title = Column(Text, nullable=False) publisher = Column(String(255), nullable=True) published_at = Column(TIMESTAMP(timezone=True), nullable=False) matched_symbols = Column(JSON, default=list) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( Index("idx_headline_published_at", "published_at"), ) class OverlayVideoEvent(Base): __tablename__ = "overlay_video_events" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) video_id = Column(String(100), unique=True, nullable=False) channel_id = Column(String(100), nullable=False) title = Column(Text, nullable=False) view_count = Column(Integer, default=0) comment_count = Column(Integer, default=0) published_at = Column(TIMESTAMP(timezone=True), nullable=True) matched_symbols = Column(JSON, default=list) channel_weight = Column(Float, default=0.5) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( Index("idx_video_channel_id", "channel_id"), Index("idx_video_published_at", "published_at"), ) class OverlayWikiPageview(Base): __tablename__ = "overlay_wiki_pageviews" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) page_title = Column(String(500), nullable=False) date = Column(TIMESTAMP(timezone=True), nullable=False) project = Column(String(50), default="en.wikipedia") views = Column(Integer, nullable=False) mapped_symbol = Column(String(10), nullable=True, index=True) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( UniqueConstraint("page_title", "date", "project", name="uq_wiki_pageviews"), Index("idx_wiki_pageviews_symbol", "mapped_symbol"), Index("idx_wiki_pageviews_date", "date"), ) class OverlayTrendObservation(Base): __tablename__ = "overlay_trend_observations" id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4) topic_id = Column(String(100), nullable=False) observed_at = Column(TIMESTAMP(timezone=True), nullable=False) geography = Column(String(10), default="US") interest_value = Column(Integer, nullable=False) created_at = Column( TIMESTAMP(timezone=True), default=lambda: datetime.now(timezone.utc) ) __table_args__ = ( UniqueConstraint("topic_id", "observed_at", "geography", name="uq_trend_observations"), Index("idx_trend_topic_id", "topic_id"), Index("idx_trend_observed_at", "observed_at"), )