import itertools from flask import request from api import api_errors, models from api.resources import AuthenticatedResource from tracker.utils import StopWatch from tracker.db import ROSession class ArtistsQuery(AuthenticatedResource): def post(self): try: data = request.json source = data['source'] ids = data['ids'] except Exception as e: raise api_errors.BadRequestError("Expect 'source' string and 'ids' list. {}".format(e)) assert isinstance(ids, list) and len(ids) > 0, "ids must be a list" valid_sources = ['sc', 'a', 'in', 'spy'] assert source in valid_sources, "source not known: {}".format(source) sw1 = StopWatch() ROSession.execute('select 1 from alembic_version').fetchall() sw1.print_lap("baseline") sw = StopWatch() arg_opts = ['include_alerts', 'include_media', 'include_stats', 'include_scouts'] if request.args.get('allCombinations'): for source in valid_sources: if source == 'a': ids = [r[0] for r in ROSession.execute('''select distinct arid from whitelisted_artists where is_live and random() > 0.3 limit 20''').fetchall()] else: ids = [r[0] for r in ROSession.execute('''select distinct identifier from whitelisted_artists join artist_associations using (arid) where is_live and source = :source and random() > 0.3 limit 20''', params=dict(source=source)).fetchall()] for values in itertools.product([True, False], repeat=4): kwargs = dict(zip(arg_opts, values), source=source) results = list(models.artists(ids=ids, **kwargs)) sw.print_lap(kwargs) else: kwargs = {kw: request.args.get(kw) for kw in arg_opts} results = list(models.artists(source=source, ids=ids, **kwargs)) sw.print_lap("artists") return { "baseline": sw1.laps, "time": sw.laps } def register_urls(api, root="/api/queries"): api.add_resource(ArtistsQuery, root + '/artists')