From afb49b8b2fbcd85ef55c5b4ae2b547ff433090b3 Mon Sep 17 00:00:00 2001 From: Mark Hahnenberg Date: Mon, 23 Jan 2017 17:57:18 -0800 Subject: [PATCH] Add option to silence query plan debug output for individual queries Summary: Sometimes you have to perform a query that needs to do a table scan. For those times you don't want to silence entire classes of queries (e.g. by table name), you can now silence individual queries. Test Plan: Run locally, verify that noisy stuff disappears from logs Reviewers: evan, juan Reviewed By: juan Differential Revision: https://phab.nylas.com/D3763 --- internal_packages/search-index/lib/search-indexer.es6 | 1 + src/flux/models/query.es6 | 6 ++++++ src/flux/stores/database-store.es6 | 8 +++++--- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/internal_packages/search-index/lib/search-indexer.es6 b/internal_packages/search-index/lib/search-indexer.es6 index bd3d70075..df53b53c6 100644 --- a/internal_packages/search-index/lib/search-indexer.es6 +++ b/internal_packages/search-index/lib/search-indexer.es6 @@ -29,6 +29,7 @@ export default class SearchIndexer { .order(modelClass.naturalSortOrder()) .offset(indexSize) .limit(1) + .silenceQueryPlanDebugOutput() // console.info('SearchIndexer: _getIndexCutoff query', query.sql()); const models = await query; return models[0]; diff --git a/src/flux/models/query.es6 b/src/flux/models/query.es6 index 5e3d6c590..22b4c47b4 100644 --- a/src/flux/models/query.es6 +++ b/src/flux/models/query.es6 @@ -56,6 +56,7 @@ export default class ModelQuery { this._returnIds = false; this._includeJoinedData = []; this._count = false; + this._logQueryPlanDebugOutput = true; } clone() { @@ -90,6 +91,11 @@ export default class ModelQuery { return this; } + silenceQueryPlanDebugOutput() { + this._logQueryPlanDebugOutput = false; + return this; + } + // Public: Add one or more where clauses to the query // // - `matchers` An {Array} of {Matcher} objects that add where clauses to the underlying query. diff --git a/src/flux/stores/database-store.es6 b/src/flux/stores/database-store.es6 index 16fe1a79e..33d20ad81 100644 --- a/src/flux/stores/database-store.es6 +++ b/src/flux/stores/database-store.es6 @@ -296,7 +296,7 @@ class DatabaseStore extends NylasStore { // // If a query is made before the database has been opened, the query will be // held in a queue and run / resolved when the database is ready. - _query(query, values = [], background = false) { + _query(query, values = [], background = false, logQueryPlanDebugOutput = true) { return new Promise((resolve, reject) => { if (!this._open) { this._waiting.push(() => this._query(query, values).then(resolve, reject)); @@ -320,7 +320,9 @@ class DatabaseStore extends NylasStore { const planString = `${plan.map(row => row.detail).join('\n')} for ${query}`; const quiet = ['ThreadCounts', 'ThreadSearch', 'ContactSearch', 'COVERING INDEX']; - if (planString.includes('SCAN') && !quiet.find(str => planString.includes(str))) { + if (planString.includes('SCAN') && + !quiet.find(str => planString.includes(str)) && + logQueryPlanDebugOutput) { console.log("Consider setting the .background() flag on this query to avoid blocking the event loop:") this._prettyConsoleLog(planString); } @@ -574,7 +576,7 @@ class DatabaseStore extends NylasStore { // - resolves with the result of the database query. // run(modelQuery, options = {format: true}) { - return this._query(modelQuery.sql(), [], modelQuery._background).then((result) => { + return this._query(modelQuery.sql(), [], modelQuery._background, modelQuery._logQueryPlanDebugOutput).then((result) => { let transformed = modelQuery.inflateResult(result); if (options.format !== false) { transformed = modelQuery.formatResult(transformed)