From e1e20b875748f677312d8c5ed3daf87113143b63 Mon Sep 17 00:00:00 2001 From: vera-liu Date: Wed, 14 Dec 2016 10:14:54 -0800 Subject: [PATCH] Sort searched queries by recency (#1735) * Sort searched queries by recency * Fixed sqllab tests * Add one more tr to QueryTable spec for pagination * Change desc to asc as we reverse queries in component --- .../javascripts/SqlLab/components/App.jsx | 2 +- .../SqlLab/components/QuerySearch.jsx | 9 +++------ .../SqlLab/components/QueryTable.jsx | 11 +++++++++-- .../javascripts/sqllab/QueryTable_spec.jsx | 2 +- superset/views.py | 11 ++++++++--- tests/sqllab_tests.py | 18 +++++++++--------- 6 files changed, 31 insertions(+), 22 deletions(-) diff --git a/superset/assets/javascripts/SqlLab/components/App.jsx b/superset/assets/javascripts/SqlLab/components/App.jsx index 32bc709bbfb31..7c97f004832e0 100644 --- a/superset/assets/javascripts/SqlLab/components/App.jsx +++ b/superset/assets/javascripts/SqlLab/components/App.jsx @@ -49,7 +49,7 @@ class App extends React.PureComponent {
- +
diff --git a/superset/assets/javascripts/SqlLab/components/QuerySearch.jsx b/superset/assets/javascripts/SqlLab/components/QuerySearch.jsx index 2ed9253a8179e..de33febf8d832 100644 --- a/superset/assets/javascripts/SqlLab/components/QuerySearch.jsx +++ b/superset/assets/javascripts/SqlLab/components/QuerySearch.jsx @@ -116,11 +116,7 @@ class QuerySearch extends React.PureComponent { const url = this.insertParams('/superset/search_queries', params); $.getJSON(url, (data, status) => { if (status === 'success') { - const newQueriesArray = []; - for (const id in data) { - newQueriesArray.push(data[id]); - } - this.setState({ queriesArray: newQueriesArray, queriesLoading: false }); + this.setState({ queriesArray: data, queriesLoading: false }); } }); } @@ -143,6 +139,7 @@ class QuerySearch extends React.PureComponent {
@@ -200,7 +197,7 @@ class QuerySearch extends React.PureComponent {
{ const q = Object.assign({}, query); if (q.endDttm) { q.duration = fDuration(q.startDttm, q.endDttm); } - q.date = moment(q.startDttm).format('MMM Do YYYY'); + const time = moment(q.startDttm).format().split('T'); + q.time = ( +
+ + {time[0]}
{time[1]} +
+
+ ); q.user = (
); diff --git a/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx b/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx index 47ae07753c9ab..f732e4b1bc813 100644 --- a/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx +++ b/superset/assets/spec/javascripts/sqllab/QueryTable_spec.jsx @@ -21,6 +21,6 @@ describe('QueryTable', () => { it('renders a proper table', () => { const wrapper = mount(); expect(wrapper.find('table')).to.have.length(1); - expect(wrapper.find('tr')).to.have.length(3); + expect(wrapper.find('tr')).to.have.length(4); }); }); diff --git a/superset/views.py b/superset/views.py index 13e3246b5f2a9..0f2b936019c3f 100755 --- a/superset/views.py +++ b/superset/views.py @@ -2593,9 +2593,14 @@ def search_queries(self): if to_time: query = query.filter(models.Query.start_time < int(to_time)) - query_limit = config.get('QUERY_SEARCH_LIMIT', 5000) - sql_queries = query.limit(query_limit).all() - dict_queries = {q.client_id: q.to_dict() for q in sql_queries} + query_limit = config.get('QUERY_SEARCH_LIMIT', 1000) + sql_queries = ( + query.order_by(models.Query.start_time.asc()) + .limit(query_limit) + .all() + ) + + dict_queries = [q.to_dict() for q in sql_queries] return Response( json.dumps(dict_queries, default=utils.json_int_dttm_ser), diff --git a/tests/sqllab_tests.py b/tests/sqllab_tests.py index b81e9ac3e8a96..d88233471b66f 100644 --- a/tests/sqllab_tests.py +++ b/tests/sqllab_tests.py @@ -122,7 +122,7 @@ def test_search_query_on_db_id(self): # Test search queries on database Id data = self.get_json_resp('/superset/search_queries?database_id=1') self.assertEquals(3, len(data)) - db_ids = [data[k]['dbId'] for k in data] + db_ids = [k['dbId'] for k in data] self.assertEquals([1, 1, 1], db_ids) resp = self.get_resp('/superset/search_queries?database_id=-1') @@ -138,7 +138,7 @@ def test_search_query_on_user(self): data = self.get_json_resp( '/superset/search_queries?user_id={}'.format(user.id)) self.assertEquals(2, len(data)) - user_ids = {data[k]['userId'] for k in data} + user_ids = {k['userId'] for k in data} self.assertEquals(set([user.id]), user_ids) user = appbuilder.sm.find_user('gamma_sqllab') @@ -146,7 +146,7 @@ def test_search_query_on_user(self): '/superset/search_queries?user_id={}'.format(user.id)) data = json.loads(resp) self.assertEquals(1, len(data)) - self.assertEquals(list(data.values())[0]['userId'] , user.id) + self.assertEquals(data[0]['userId'] , user.id) def test_search_query_on_status(self): self.run_some_queries() @@ -155,13 +155,13 @@ def test_search_query_on_status(self): resp = self.get_resp('/superset/search_queries?status=success') data = json.loads(resp) self.assertEquals(2, len(data)) - states = [data[k]['state'] for k in data] + states = [k['state'] for k in data] self.assertEquals(['success', 'success'], states) resp = self.get_resp('/superset/search_queries?status=failed') data = json.loads(resp) self.assertEquals(1, len(data)) - self.assertEquals(list(data.values())[0]['state'], 'failed') + self.assertEquals(data[0]['state'], 'failed') def test_search_query_on_text(self): self.run_some_queries() @@ -169,7 +169,7 @@ def test_search_query_on_text(self): url = '/superset/search_queries?search_text=permission' data = self.get_json_resp(url) self.assertEquals(1, len(data)) - self.assertIn('permission', list(data.values())[0]['sql']) + self.assertIn('permission', data[0]['sql']) def test_search_query_on_time(self): self.run_some_queries() @@ -189,9 +189,9 @@ def test_search_query_on_time(self): resp = self.get_resp('/superset/search_queries?'+'&'.join(params)) data = json.loads(resp) self.assertEquals(2, len(data)) - for _, v in data.items(): - self.assertLess(int(first_query_time), v['startDttm']) - self.assertLess(v['startDttm'], int(second_query_time)) + for k in data: + self.assertLess(int(first_query_time), k['startDttm']) + self.assertLess(k['startDttm'], int(second_query_time)) def test_alias_duplicate(self): self.run_sql(