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
This commit is contained in:
vera-liu
2016-12-14 10:14:54 -08:00
committed by GitHub
parent 2fb94a89e2
commit e1e20b8757
6 changed files with 31 additions and 22 deletions

View File

@@ -49,7 +49,7 @@ class App extends React.PureComponent {
<div className="container-fluid">
<div className="row">
<div className="col-md-12">
<QuerySearch height={this.state.contentHeight} />
<QuerySearch height={this.state.contentHeight} actions={this.props.actions} />
</div>
</div>
</div>

View File

@@ -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 {
<DatabaseSelect
onChange={this.onChange.bind(this)}
databaseId={this.state.databaseId}
actions={this.props.actions}
/>
</div>
<div className="col-sm-4">
@@ -200,7 +197,7 @@ class QuerySearch extends React.PureComponent {
<div className="scrollbar-content">
<QueryTable
columns={[
'state', 'db', 'user', 'date',
'state', 'db', 'user', 'time',
'progress', 'rows', 'sql', 'querylink',
]}
onUserClicked={this.onUserClicked.bind(this)}

View File

@@ -65,14 +65,20 @@ class QueryTable extends React.PureComponent {
removeQuery(query) {
this.props.actions.removeQuery(query);
}
render() {
const data = this.props.queries.map((query) => {
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 = (
<div>
<span>
{time[0]} <br /> {time[1]}
</span>
</div>
);
q.user = (
<button
className="btn btn-link btn-xs"
@@ -188,6 +194,7 @@ class QueryTable extends React.PureComponent {
columns={this.props.columns}
className="table table-condensed"
data={data}
itemsPerPage={50}
/>
</div>
);

View File

@@ -21,6 +21,6 @@ describe('QueryTable', () => {
it('renders a proper table', () => {
const wrapper = mount(<QueryTable {...mockedProps} />);
expect(wrapper.find('table')).to.have.length(1);
expect(wrapper.find('tr')).to.have.length(3);
expect(wrapper.find('tr')).to.have.length(4);
});
});

View File

@@ -2593,9 +2593,14 @@ class Superset(BaseSupersetView):
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),

View File

@@ -122,7 +122,7 @@ class SqlLabTests(SupersetTestCase):
# 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 @@ class SqlLabTests(SupersetTestCase):
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 @@ class SqlLabTests(SupersetTestCase):
'/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 @@ class SqlLabTests(SupersetTestCase):
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 @@ class SqlLabTests(SupersetTestCase):
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 @@ class SqlLabTests(SupersetTestCase):
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(