diff --git a/server/djrandom/frontend/views.py b/server/djrandom/frontend/views.py index 35846ab54915cbcc8a5bd32681c10a2432288997..24e6efd1f3b0d7a5d2b9524ec91e92dbfc73b4f8 100644 --- a/server/djrandom/frontend/views.py +++ b/server/djrandom/frontend/views.py @@ -8,7 +8,7 @@ from djrandom.model.mp3 import MP3, PlayLog from djrandom.model.playlist import Playlist from djrandom.model.user import User from djrandom.frontend import app, require_auth, svcs -from sqlalchemy import distinct, func +from sqlalchemy import func log = logging.getLogger(__name__) use_xsendfile = 1 @@ -18,18 +18,22 @@ use_xsendfile = 1 @require_auth def autocomplete_search(): results = [] - term = request.args.get('term') + term = request.args.get('q') if not term: abort(400) - if len(term) < 4: - cache_key = 'autocomplete|%s' % term + if len(term) > 1: + n_results = int(request.args.get('limit', 50)) + cache_key = 'autocomplete|%s|%d' % (term, n_results) results = svcs['cache'].get(cache_key) if not results: - possible_artists = Session.query(distinct( - MP3.artist)).filter(MP3.artist.like('%s%%' % term)) - results = [x[0] for x in possible_artists] + artists = Session.query( + MP3.artist, func.count('*').label('count')).filter( + MP3.artist.like('%s%%' % term)).group_by( + MP3.artist).order_by('count desc').limit(n_results) + + results = [x[0] for x in artists] svcs['cache'].set(cache_key, results, timeout=86400) - return jsonify(results=results) + return '\n'.join(results) @app.route('/fragment/songs', methods=['POST']) diff --git a/server/djrandom/test/test_frontend_views.py b/server/djrandom/test/test_frontend_views.py index 97ddf16310f3eeaa55160d373076e2158bdbd303..cd670794f7638069a2d709e36ef1253c3f9d49b7 100644 --- a/server/djrandom/test/test_frontend_views.py +++ b/server/djrandom/test/test_frontend_views.py @@ -39,15 +39,14 @@ class FrontendViewsTest(WsgiTestCase): views.use_xsendfile = 1 def test_autocomplete(self): - rv = self.app.get('/autocomplete?term=art') + rv = self.app.get('/autocomplete?q=art') self.assertEquals(200, rv.status_code) - rv = json.loads(rv.data) - self.assertTrue('results' in rv) - self.assertEquals([u'artist 1', u'artist 2'], rv['results']) + rv = rv.data.split('\n') + self.assertEquals([u'artist 1', u'artist 2'], rv) # test twice to hit the cache. - rv2 = self.app.get('/autocomplete?term=art') - rv2 = json.loads(rv2.data) + rv2 = self.app.get('/autocomplete?q=art') + rv2 = rv2.data.split('\n') self.assertEquals(rv, rv2) def test_homepage(self):