from marshmallow import fields, validate from analytics.connectors.snowflake import AbstractSnowflakeQuery from analytics.constants.ordering import ORDER_DIRECTIONS from analytics.queries.schema import QueryWithPermissionsSchema PRODUCT_METRICS_BY_TRACK_FIELDS = [ "track_id", "tuid", "streams_1_day", "growth_percentage_1_day", "streams_7_days", "growth_percentage_7_days", "streams_28_days", "growth_percentage_28_days", "streams_all_time", ] class ProductDetailQuerySchema(QueryWithPermissionsSchema): product_id = fields.Integer(required=True) store_ids = fields.List(fields.Int, required=True) distributors = fields.List(fields.String, required=True) days_back = fields.Integer(load_default=14) class ProductTracks(AbstractSnowflakeQuery): query_schema = ProductDetailQuerySchema filename = "product/tracks.sql" class ProductStreamsAllTime(AbstractSnowflakeQuery): query_schema = ProductDetailQuerySchema filename = "product/streams_all_time.sql" class ProductAggregateStreamsQuerySchema(QueryWithPermissionsSchema): product_id = fields.Integer(required=True) store_ids = fields.List(fields.Int, required=True) distributors = fields.List(fields.String, required=True) country_ids = fields.List(fields.String, load_default=[]) multi_product = fields.Boolean(load_default=False) class ProductAggregateStreams(AbstractSnowflakeQuery): query_schema = ProductAggregateStreamsQuerySchema filename = "product/aggregate_streams.sql" class ProductMetricsByTrackQuerySchema(QueryWithPermissionsSchema): product_id = fields.Integer(required=True) store_ids = fields.List(fields.Int, required=True) distributors = fields.List(fields.String, required=True) country_ids = fields.List(fields.String, load_default=[]) order_by = fields.String( load_default="streams_7_days", validate=validate.OneOf(PRODUCT_METRICS_BY_TRACK_FIELDS), ) order_dir = fields.String( load_default="DESC", validate=validate.OneOf(ORDER_DIRECTIONS), ) limit = fields.Integer(load_default=10) offset = fields.Integer(load_default=0) class ProductMetricsByTrack(AbstractSnowflakeQuery): query_schema = ProductMetricsByTrackQuerySchema filename = "product/metrics_by_track.sql" class ProductBulkGrowthPeriodsQuerySchema(QueryWithPermissionsSchema): product_ids = fields.List(fields.Int(), required=True) countries = fields.List(fields.String) distributors = fields.List(fields.String) store_ids = fields.List(fields.Int) is_feed_data_available = fields.Boolean(required=False, allow_none=True) class ProductTimeSeriesQuerySchema(QueryWithPermissionsSchema): product_id = fields.Int(required=True) start_date = fields.Date() end_date = fields.Date() countries = fields.List(fields.String) distributors = fields.List(fields.String) store_ids = fields.List(fields.Int) ids = fields.List(fields.String) product_table = fields.Str() type = fields.Str() aggregation_field = fields.Str() multi_product = fields.Boolean() get_all_time_for_multi_product = fields.Boolean() resolution = fields.Str() streams_sos_columns = fields.List(fields.String) class ProductSummaryQuerySchema(QueryWithPermissionsSchema): product_id = fields.Int(required=True) start_date = fields.Date() end_date = fields.Date() countries = fields.List(fields.String) distributors = fields.List(fields.String) store_ids = fields.List(fields.Int) ids = fields.List(fields.String) streams_table = fields.Str() downloads_table = fields.Str() # TODO remove product_downloads_table = fields.Str() product_track_downloads_table = fields.Str() multi_product = fields.Boolean() type = fields.Str() aggregation_field = fields.Str() resolution = fields.Str() streams_sos_columns = fields.List(fields.String) # pagination params limit = fields.Int() offset = fields.Int() order_by = fields.Str() order_dir = fields.Str() class ProductBulkGrowthPeriods(AbstractSnowflakeQuery): query_schema = ProductBulkGrowthPeriodsQuerySchema filename = "product/bulk_growth_periods.sql" class ProductStreamsTimeSeries(AbstractSnowflakeQuery): query_schema = ProductTimeSeriesQuerySchema filename = "product/streams_time_series.sql" class ProductDownloadsTimeSeries(AbstractSnowflakeQuery): query_schema = ProductTimeSeriesQuerySchema filename = "product/downloads_time_series.sql" class ProductSummary(AbstractSnowflakeQuery): query_schema = ProductSummaryQuerySchema filename = "product/summary.sql" default_params = { # "sort_key": "streams", # "sort_direction": "ASC", # TODO populate with 'metric' "order_by": "streams", "order_dir": "ASC", "limit": 50, "offset": 0, # "distributors": DEFAULT_DISTRIBUTORS, }