from typing import Any, Mapping from marshmallow import Schema, fields, validate from playlist.connectors.snowflake import SnowflakeQuery from playlist.queries.constants import ( ALLOWED_ORDER_BY_KEYS, DEFAULT_DISTRIBUTORS, get_placement_table_dynamic, get_playlist_streams_table_name, ) from playlist.queries.schema import ISRC class SoundRecordingTopPlacementsQuerySchema(Schema): isrc = ISRC() limit = fields.Integer(required=True) offset = fields.Integer(required=True) sort_key = fields.Str(validate=validate.OneOf(ALLOWED_ORDER_BY_KEYS)) sort_direction = fields.Str(validate=validate.OneOf(["ASC", "DESC"])) stream_countries = fields.List(fields.Str) curator_countries = fields.List(fields.Str) permission_label_ids = fields.List(fields.Str) permission_subaccount_ids = fields.List(fields.Str) permission_label_participant_ids = fields.List(fields.Int) playlist_types = fields.List(fields.Str) store_ids = fields.List(fields.Str) playlist_appearances = fields.Str() distributors = fields.List(fields.Str) use_primary_playlist_type = fields.Boolean() transfer_product_ownership_enabled = fields.Boolean(load_default=False) class SoundRecordingTopPlacementsQuery(SnowflakeQuery): query_schema = SoundRecordingTopPlacementsQuerySchema filename = "sound_recording_top_placements.sql" default_params = { "offset": 0, "limit": 12, "distributors": DEFAULT_DISTRIBUTORS, "playlist_appearances": "current", "playlist_types": ["CURATED"], "sort_key": "streams_last_28_days", "sort_direction": "DESC", } @property def table_params(self) -> Mapping[str, Any]: placement_table_params = get_placement_table_dynamic(self.user_params) playlist_streams_table_params = get_playlist_streams_table_name() return {**placement_table_params, **playlist_streams_table_params}