from sqlalchemy import Boolean, Column, Date, ForeignKey, Integer, Text, text from sqlalchemy.dialects import postgresql from sqlalchemy.dialects.postgresql import ARRAY, TIMESTAMP from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.orm import declarative_base Base = declarative_base() class Dimension(Base): __abstract__ = True created_at = Column(TIMESTAMP(timezone=True), server_default=text("now()"), nullable=False) updated_at = Column(TIMESTAMP(timezone=True), nullable=True) class DimAlbum(Dimension): __tablename__ = "dim_album" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) album_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True, ) release_date_precision = Column(Text, nullable=True) album_name = Column(Text, nullable=False) popularity = Column(Integer, nullable=True) release_date = Column(Text, nullable=True) is_mastered_for_itunes = Column(Boolean, nullable=False, server_default=text("false")) is_complete = Column(Boolean, nullable=False, server_default=text("true")) track_count = Column(Integer, nullable=True) copyright = Column(Text, nullable=True) lbl = Column(Text, nullable=True) image_path = Column(Text, nullable=True) upc = Column(Text, nullable=True) is_stream_synced = Column(Boolean, nullable=False, server_default=text("false")) class DimAlbumArtist(Dimension): __tablename__ = "dim_album_artist" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) album_id = Column(Text, nullable=False, primary_key=True) artist_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True ) class DimTrackAlbum(Dimension): __tablename__ = "dim_track_album" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) track_id = Column(Text, nullable=False, primary_key=True) album_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True ) class DimArtist(Dimension): __tablename__ = "dim_artist" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) artist_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True, server_default=text("0"), ) artist_name = Column(Text, nullable=False) genres = Column(ARRAY(Text), nullable=True) image_path = Column(Text, nullable=True) artist_uri = Column(Text, nullable=False) is_blacklisted = Column(Boolean, nullable=False, server_default=text("false")) url = Column(Text, nullable=False) is_stream_synced = Column(Boolean, nullable=False, server_default=text("false")) class DimDsp(Dimension): __tablename__ = "dim_dsp" dsp_id = Column(Integer, primary_key=True) dsp_name = Column(Text, nullable=False) class DimMarket(Dimension): __tablename__ = "dim_market" market_id = Column(Integer, nullable=False, primary_key=True) market_code = Column(Text, nullable=False) market_name = Column(Text, nullable=False) market_full_name = Column(Text, nullable=True) territory_type_id = Column( Integer, ForeignKey("dim_territory_type.territory_type_id"), nullable=True ) parent_market_id = Column(Integer, ForeignKey("dim_market.market_id"), nullable=True) class DimPlaylist(Dimension): __tablename__ = "dim_playlist" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) playlist_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True, server_default=text("0"), ) uri = Column(Text, nullable=True) playlist_owner_username = Column(Text, nullable=True) type = Column(Text, nullable=True) is_public = Column(Boolean, nullable=False, server_default=text("false")) is_personalized = Column(Boolean, nullable=False, server_default=text("false")) collect_historical_data = Column(Boolean, nullable=False, server_default=text("false")) playlist_name = Column(Text, nullable=True) image_path = Column(Text, nullable=True) description = Column(Text, nullable=True) is_removed = Column(Boolean, server_default=text("false")) is_ignored = Column(Boolean, server_default=text("false")) followers = Column(Integer) dsp_last_update_datetime = Column(TIMESTAMP(timezone=True)) last_sync_datetime = Column(TIMESTAMP(timezone=True)) rank = Column(Integer) save_tracklist = Column(Boolean) save_tracklist_history = Column(Boolean) is_stream_synced = Column(Boolean, nullable=False, server_default=text("true")) class DimPlaylistMeta(Dimension): __tablename__ = "dim_playlist_meta" id = Column(Integer, nullable=False, primary_key=True) playlist_id = Column(Text, nullable=False) dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False) market_id = Column(Integer, ForeignKey("dim_market.market_id"), nullable=False) track_positions = Column(postgresql.JSONB, nullable=True) updated_at = NotImplemented class DimTrack(Dimension): __tablename__ = "dim_track" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) track_id = Column(Text, nullable=False, primary_key=True) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True, server_default=text("0"), ) track_name = Column(Text, nullable=False) track_duration = Column(Integer, nullable=False) isrc = Column(Text, nullable=True) release_date = Column(Date, nullable=True) audio_features = Column(ARRAY(Text), nullable=True) composer = Column(Text, nullable=True) upc = Column(Text, nullable=True) is_sony = Column(Boolean, nullable=False, server_default=text("false")) url = Column(Text, nullable=True) image_path = Column(Text, nullable=True) popularity = Column(Integer) is_stream_synced = Column(Boolean, nullable=False, server_default=text("false")) class DimTrackArtist(Base): __tablename__ = "dim_track_artist" dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False, primary_key=True) track_id = Column(Text, nullable=False, primary_key=True) artist_id = Column(Text, nullable=False) market_id = Column( Integer, ForeignKey("dim_market.market_id"), nullable=False, primary_key=True, server_default=text("0"), ) artist_number = Column(Integer, nullable=False, primary_key=True) created_at = Column(TIMESTAMP(timezone=True), server_default=text("now()"), nullable=False) updated_at = Column(TIMESTAMP(timezone=True), nullable=True) class Fact(Base): __abstract__ = True id = Column(Integer, nullable=False, primary_key=True) created_at = Column(TIMESTAMP(timezone=True), server_default=text("now()"), nullable=False) @hybrid_property def name(self) -> str: return getattr(self, "__tablename__", "") class FactArtistFollowers(Fact): __tablename__ = "fact_artist_followers" artist_id = Column(Text, nullable=False) followers = Column(Integer, nullable=False) class PlaylistOwnerCategory(Dimension): __tablename__ = "playlist_owner_category" id = Column(Integer, primary_key=True, autoincrement=False) name = Column(Text, nullable=False) class PlaylistOwner(Dimension): __tablename__ = "playlist_owner" username = Column(Text, primary_key=True) dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False) market_id = Column(Integer, ForeignKey("dim_market.market_id")) display_name = Column(Text, nullable=False) category_id = Column(Integer, ForeignKey("playlist_owner_category.id"), nullable=False) class FactPlaylistFollowers(Fact): __tablename__ = "fact_playlist_followers" playlist_id = Column(Text, ForeignKey("dim_playlist.playlist_id"), nullable=False) dsp_id = Column(Integer, ForeignKey("dim_dsp.dsp_id"), nullable=False) market_id = Column(Integer, ForeignKey("dim_market.market_id"), nullable=False) followers = Column(Integer(), nullable=False)