Skip to content

Commit 2540582

Browse files
durrankangas
authored andcommitted
INT-1835: Fix explain plan triggering on query change (#472)
(cherry picked from commit 60aa176)
1 parent e6eca04 commit 2540582

File tree

1 file changed

+53
-51
lines changed

1 file changed

+53
-51
lines changed

src/app/explain-plan/index.js

Lines changed: 53 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ var DocumentView = require('../documents/document-list-item');
88
var IndexDefinitionView = require('../indexes/index-definition');
99
var TreeView = require('./tree-view');
1010
var StageModel = require('./stage-model');
11+
var Action = require('hadron-action');
1112

1213
var electron = require('electron');
1314
var shell = electron.shell;
@@ -225,8 +226,8 @@ module.exports = View.extend({
225226
},
226227
initialize: function() {
227228
this.listenTo(this.model, 'sync', this.onModelSynced.bind(this));
228-
this.listenTo(this.parent, 'submit:query', this.onQueryChanged.bind(this));
229229
this.on('change:visible', this.onVisibleChanged.bind(this));
230+
Action.filterChanged.listen(this.fetchExplainPlan.bind(this));
230231
this.showExplainTree = app.isFeatureEnabled('showExplainPlanTab');
231232
},
232233
onModelSynced: function() {
@@ -247,63 +248,64 @@ module.exports = View.extend({
247248
treeButtonClicked: function() {
248249
this.activeDetailView = 'tree';
249250
},
250-
fetchExplainPlan: function() {
251-
var filter = app.queryOptions.query.serialize();
251+
fetchExplainPlan: function(query) {
252+
var filter = query || app.queryOptions.query.serialize();
252253
var options = {};
253254
var view = this;
255+
if (this.ns) {
256+
app.dataService.explain(this.ns, filter, options, function(err, explain) {
257+
if (err) {
258+
return debug('error', err);
259+
}
260+
view.explainPlan = new ExplainPlanModel(explain);
254261

255-
app.dataService.explain(this.ns, filter, options, function(err, explain) {
256-
if (err) {
257-
return debug('error', err);
258-
}
259-
view.explainPlan = new ExplainPlanModel(explain);
260-
261-
// remove old tree view
262-
if (view.treeSubview) {
263-
view.treeSubview.remove();
264-
}
265-
// render new tree view
266-
var stageModel = new StageModel(view.explainPlan.rawExplainObject.executionStats.executionStages, {
267-
parse: true
268-
});
269-
view.treeSubview = view.renderSubview(new TreeView({
270-
model: stageModel,
271-
parent: view
272-
}), '[data-hook=tree-subview]');
262+
// remove old tree view
263+
if (view.treeSubview) {
264+
view.treeSubview.remove();
265+
}
266+
// render new tree view
267+
var stageModel = new StageModel(view.explainPlan.rawExplainObject.executionStats.executionStages, {
268+
parse: true
269+
});
270+
view.treeSubview = view.renderSubview(new TreeView({
271+
model: stageModel,
272+
parent: view
273+
}), '[data-hook=tree-subview]');
273274

274-
// create new document model from raw explain output
275-
var rawDocModel = new DocumentModel(view.explainPlan.rawExplainObject);
276-
// remove old view if present
277-
if (view.rawSubview) {
278-
view.rawSubview.remove();
279-
}
280-
// render document model with a DocumentView
281-
view.rawSubview = view.renderSubview(new DocumentView({
282-
model: rawDocModel,
283-
parent: view
284-
}), '[data-hook=raw-subview]');
285-
// expand all top-level fields in the explain output
286-
var toplevel = 'li.document-list-item > ol > li.document-property.object,' +
287-
'li.document-list-item > ol > li.document-property.array';
288-
_.each(view.queryAll(toplevel), function(el) {
289-
el.classList.toggle('expanded');
290-
});
275+
// create new document model from raw explain output
276+
var rawDocModel = new DocumentModel(view.explainPlan.rawExplainObject);
277+
// remove old view if present
278+
if (view.rawSubview) {
279+
view.rawSubview.remove();
280+
}
281+
// render document model with a DocumentView
282+
view.rawSubview = view.renderSubview(new DocumentView({
283+
model: rawDocModel,
284+
parent: view
285+
}), '[data-hook=raw-subview]');
286+
// expand all top-level fields in the explain output
287+
var toplevel = 'li.document-list-item > ol > li.document-property.object,' +
288+
'li.document-list-item > ol > li.document-property.array';
289+
_.each(view.queryAll(toplevel), function(el) {
290+
el.classList.toggle('expanded');
291+
});
291292

292-
// remove old index definition view first
293-
if (view.indexDefinitionSubview) {
294-
view.indexDefinitionSubview.remove();
295-
}
293+
// remove old index definition view first
294+
if (view.indexDefinitionSubview) {
295+
view.indexDefinitionSubview.remove();
296+
}
296297

297-
// find index definition model and create view
298-
if (_.isString(view.explainPlan.usedIndex) && !this.usedMultipleIndexes) {
299-
var indexModel = view.model.indexes.get(view.explainPlan.usedIndex, 'name');
298+
// find index definition model and create view
299+
if (_.isString(view.explainPlan.usedIndex) && !this.usedMultipleIndexes) {
300+
var indexModel = view.model.indexes.get(view.explainPlan.usedIndex, 'name');
300301

301-
view.indexDefinitionSubview = view.renderSubview(new IndexDefinitionView({
302-
model: indexModel,
303-
parent: view
304-
}), '[data-hook=index-definition-subview]');
305-
}
306-
});
302+
view.indexDefinitionSubview = view.renderSubview(new IndexDefinitionView({
303+
model: indexModel,
304+
parent: view
305+
}), '[data-hook=index-definition-subview]');
306+
}
307+
});
308+
}
307309
},
308310
onVisibleChanged: function() {
309311
if (this.visible) {

0 commit comments

Comments
 (0)