From e9e807012b5eb778c975b82feb36abebd07dc2ab Mon Sep 17 00:00:00 2001 From: Allen Short Date: Thu, 24 Jan 2019 17:32:09 -0600 Subject: [PATCH 1/3] Show number of queries ahead in queue when executing --- client/app/pages/queries/query.html | 2 +- redash/tasks/queries.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index e4eff25bd2..0bf33f39fd 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -213,7 +213,7 @@

- Query in queue… + Query in queue (waiting on {{queryResult.job.queueLength}} queryies)… diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index abc967959b..baebb9b025 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -181,12 +181,21 @@ def to_dict(self): else: query_result_id = None + queriesAhead = 0 + if task_status == 'PENDING': + waiting = QueryTaskTracker.all(QueryTaskTracker.WAITING_LIST) + # find our job's index, return number of queries after it + for i, t in enumerate(waiting): + if t.data['task_id' ]== self._async_result.id: + queriesAhead = len(waiting) - i - 1 + break return { 'id': self._async_result.id, 'updated_at': updated_at, 'status': status, 'error': error, 'query_result_id': query_result_id, + 'queueLength': queriesAhead, } @property From 08a10cdb2649f4d65910a1f0c9a7abb23d6b9af1 Mon Sep 17 00:00:00 2001 From: Allen Short Date: Wed, 30 Jan 2019 13:03:24 -0600 Subject: [PATCH 2/3] test --- client/app/pages/queries/query.html | 2 +- redash/tasks/queries.py | 2 +- tests/handlers/test_query_results.py | 45 ++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 5 deletions(-) diff --git a/client/app/pages/queries/query.html b/client/app/pages/queries/query.html index 0bf33f39fd..f0050d0619 100644 --- a/client/app/pages/queries/query.html +++ b/client/app/pages/queries/query.html @@ -213,7 +213,7 @@

- Query in queue (waiting on {{queryResult.job.queueLength}} queryies)… + Query in queue (waiting on {{queryResult.job.queue_length}} queryies)… diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index baebb9b025..bc3851c140 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -195,7 +195,7 @@ def to_dict(self): 'status': status, 'error': error, 'query_result_id': query_result_id, - 'queueLength': queriesAhead, + 'queue_length': queriesAhead, } @property diff --git a/tests/handlers/test_query_results.py b/tests/handlers/test_query_results.py index 1af3c1a3a5..0f69254715 100644 --- a/tests/handlers/test_query_results.py +++ b/tests/handlers/test_query_results.py @@ -1,8 +1,9 @@ +import mock from tests import BaseTestCase from redash.models import db -from redash.utils import json_dumps - +from redash.tasks.queries import QueryTaskTracker +from redash.utils import gen_query_hash, json_dumps class TestQueryResultsCacheHeaders(BaseTestCase): def test_uses_cache_headers_for_specific_result(self): @@ -38,7 +39,6 @@ def test_get_existing_result(self): self.assertEquals(query_result.id, rv.json['query_result']['id']) def test_execute_new_query(self): - query_result = self.factory.create_query_result() query = self.factory.create_query() rv = self.make_request('post', '/api/query_results', @@ -50,6 +50,45 @@ def test_execute_new_query(self): self.assertNotIn('query_result', rv.json) self.assertIn('job', rv.json) + def test_queue_length(self): + query = self.factory.create_query() + tasks = [] + def fake_all(*a, **kw): + return tasks + def enqueue_query(query, *a, **kw): + from redash.tasks.queries import enqueue_query + job = enqueue_query(query, *a, **kw) + tasks.append(QueryTaskTracker.create( + task_id=job.id, + state='waiting', + query_hash=gen_query_hash(query), + data_source_id=None, + scheduled=False, + metadata={})) + return job + patch_all = mock.patch('redash.tasks.queries.QueryTaskTracker.all', + classmethod(fake_all)) + patch_enqueue_query = mock.patch('redash.handlers.query_results.enqueue_query', + enqueue_query) + with patch_all, patch_enqueue_query: + rv0 = self.make_request('post', '/api/query_results', + data={'data_source_id': self.factory.data_source.id, + 'query': query.query_text, + 'max_age': 0}) + rv1 = self.make_request('post', '/api/query_results', + data={'data_source_id': self.factory.data_source.id, + 'query': query.query_text, + 'max_age': 0}) + rv2 = self.make_request('post', '/api/query_results', + data={'data_source_id': self.factory.data_source.id, + 'query': query.query_text, + 'max_age': 0}) + + self.assertEquals(rv0.json['job']['queue_length'], 0) + self.assertEquals(rv1.json['job']['queue_length'], 1) + self.assertEquals(rv2.json['job']['queue_length'], 2) + + def test_execute_query_without_access(self): group = self.factory.create_group() db.session.commit() From c951491ed1a097668c494339606434c5e6aee208 Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Mon, 25 Feb 2019 12:35:41 +0100 Subject: [PATCH 3/3] Minor stylistic fixes. --- redash/tasks/queries.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/redash/tasks/queries.py b/redash/tasks/queries.py index bc3851c140..8608c64101 100644 --- a/redash/tasks/queries.py +++ b/redash/tasks/queries.py @@ -181,13 +181,14 @@ def to_dict(self): else: query_result_id = None - queriesAhead = 0 + queries_ahead = 0 if task_status == 'PENDING': waiting = QueryTaskTracker.all(QueryTaskTracker.WAITING_LIST) + waiting_length = len(waiting) # find our job's index, return number of queries after it - for i, t in enumerate(waiting): - if t.data['task_id' ]== self._async_result.id: - queriesAhead = len(waiting) - i - 1 + for i, waiting_task in enumerate(waiting): + if waiting_task.data['task_id'] == self._async_result.id: + queries_ahead = waiting_length - i - 1 break return { 'id': self._async_result.id, @@ -195,7 +196,7 @@ def to_dict(self): 'status': status, 'error': error, 'query_result_id': query_result_id, - 'queue_length': queriesAhead, + 'queue_length': queries_ahead, } @property