"""Query classes for the /participant//summary endpoint.""" from marshmallow import fields, validate from analytics.connectors.snowflake import AbstractSnowflakeQuery from analytics.constants.ordering import ORDER_DIRECTIONS from analytics.queries.schema import QueryWithPermissionsSchema SUMMARY_GROUP_BY_COLUMNS = [ "global_participant_id", "country_code", "store_id", "product_id", "isrc", ] SUMMARY_ORDER_BY_FIELDS = [ "streams", "downloads", "skip_rate", "saves", ] class _SummaryBaseSchema(QueryWithPermissionsSchema): global_participant_id = fields.String(required=True) distributors = fields.List(fields.String, required=True) country_ids = fields.List(fields.String, load_default=[]) store_ids = fields.List(fields.Int, load_default=[]) start_date = fields.Date(allow_none=True, load_default=None) end_date = fields.Date(allow_none=True, load_default=None) order_by = fields.String( load_default="streams", validate=validate.OneOf(SUMMARY_ORDER_BY_FIELDS) ) order_dir = fields.String( load_default="DESC", validate=validate.OneOf(ORDER_DIRECTIONS) ) limit = fields.Integer(load_default=100) offset = fields.Integer(load_default=0) class ParticipantSummaryQuerySchema(_SummaryBaseSchema): group_by_column = fields.String( load_default="global_participant_id", validate=validate.OneOf(SUMMARY_GROUP_BY_COLUMNS), ) is_sound_recording = fields.Boolean(load_default=False) is_total = fields.Boolean(load_default=False) exclude_tiktok = fields.Boolean(load_default=False) class ParticipantSummaryDefaultQuerySchema(_SummaryBaseSchema): is_sound_recording = fields.Boolean(load_default=False) class ParticipantSummaryBySosQuerySchema(_SummaryBaseSchema): is_detailed = fields.Boolean(load_default=False) sos_columns = fields.List(fields.String, load_default=[]) class ParticipantSummary(AbstractSnowflakeQuery): query_schema = ParticipantSummaryQuerySchema filename = "participant/summary.sql" class ParticipantSummaryDefault(AbstractSnowflakeQuery): query_schema = ParticipantSummaryDefaultQuerySchema filename = "participant/summary_default.sql" class ParticipantSummaryBySos(AbstractSnowflakeQuery): query_schema = ParticipantSummaryBySosQuerySchema filename = "participant/summary_by_sos.sql"