Skip to content
This repository was archived by the owner on May 17, 2021. It is now read-only.

Commit b46dbd6

Browse files
authored
COMPASS-4296 Do not let map filter override other filters (#157)
1 parent faefe4f commit b46dbd6

File tree

3 files changed

+78
-4
lines changed

3 files changed

+78
-4
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
"compile": "cross-env NODE_ENV=production webpack --config ./config/webpack.prod.config.js --progress",
2626
"start": "webpack-dev-server --config ./config/webpack.dev.config.js",
2727
"start:watch": "npm run clean && webpack --config ./config/webpack.watch.config.js",
28-
"test": "cross-env NODE_ENV=test mocha-webpack \"./src/**/*.spec.js\"",
29-
"test:watch": "cross-env NODE_ENV=test mocha-webpack \"./src/**/*.spec.js\" --watch",
28+
"test": "cross-env NODE_ENV=test mocha-webpack \"./src/**/*.spec.js\" \"./test/**/*.js\"",
29+
"test:watch": "cross-env NODE_ENV=test mocha-webpack \"./src/**/*.spec.js\" \"./test/**/*.js\" --watch",
3030
"test:karma": "xvfb-maybe cross-env NODE_ENV=test karma start",
3131
"cover": "nyc npm run test",
3232
"ci": "npm run cover && npm run test:karma && npm run compile && npm run check",

src/stores/query-bar-store.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,25 @@ const configureStore = (options = {}) => {
286286
this.setQuery(query, true);
287287
},
288288

289+
/**
290+
* Like `setQuery()`, but merge an existing query into the current one
291+
* instead of overwriting it.
292+
*
293+
* @param {Object} query a query object with some or all query properties set.
294+
* @param {Boolean} autoPopulated - flag to indicate whether the query was auto-populated or not.
295+
*/
296+
mergeQuery(query, autoPopulated) {
297+
const cloned = this._cloneQuery();
298+
for (const key of Object.keys(query)) {
299+
if (typeof query[key] === 'object' && query[key] !== null) {
300+
cloned[key] = { ...cloned[key], ...query[key] };
301+
} else {
302+
cloned[key] = query[key];
303+
}
304+
}
305+
this.setQuery(cloned, autoPopulated);
306+
},
307+
289308
/**
290309
* set many/all properties of a query at once. The values are converted to
291310
* strings, and xxxString is set. The values are validated, and xxxValid is
@@ -713,8 +732,8 @@ const configureStore = (options = {}) => {
713732
localAppRegistry.on('subtab-changed', () => {
714733
options.actions.refreshEditor();
715734
});
716-
localAppRegistry.on('compass:schema:geo-query', (query) => {
717-
store.setQuery({ filter: query }, true);
735+
localAppRegistry.on('compass:schema:geo-query', (filter) => {
736+
store.mergeQuery({ filter }, true);
718737
});
719738
localAppRegistry.on('compass:query-history:run-query', (query) => {
720739
store.setQuery(query, true);

test/renderer/query-bar-store.spec.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,61 @@ describe('QueryBarStore [Store]', function() {
179179
});
180180
});
181181

182+
describe('mergeQuery', function() {
183+
afterEach(function() {
184+
unsubscribe();
185+
});
186+
187+
describe('when setting two query properties separately', function() {
188+
it('composes them when it is an object`', function(done) {
189+
let calls = 0;
190+
unsubscribe = store.listen(state => {
191+
switch (++calls) {
192+
case 1:
193+
expect(state.filter).to.be.deep.equal({ foo: 1 });
194+
break;
195+
case 2:
196+
expect(state.filter).to.be.deep.equal({ foo: 1, bar: 1 });
197+
done();
198+
break;
199+
default:
200+
throw new Error('unreachable');
201+
}
202+
});
203+
204+
store.mergeQuery({ filter: { foo: 1 } });
205+
store.mergeQuery({ filter: { bar: 1 } });
206+
});
207+
208+
it('overrides them when it is a primtive`', function(done) {
209+
let calls = 0;
210+
unsubscribe = store.listen(state => {
211+
switch (++calls) {
212+
case 1:
213+
expect(state.filter).to.be.deep.equal({ foo: 1 });
214+
expect(state.maxTimeMS).to.not.equal(20);
215+
break;
216+
case 2:
217+
expect(state.filter).to.be.deep.equal({ foo: 1, bar: 1 });
218+
expect(state.maxTimeMS).to.equal(20);
219+
break;
220+
case 3:
221+
expect(state.filter).to.be.deep.equal({ foo: 1, bar: 4 });
222+
expect(state.maxTimeMS).to.equal(40);
223+
done();
224+
break;
225+
default:
226+
throw new Error('unreachable');
227+
}
228+
});
229+
230+
store.mergeQuery({ filter: { foo: 1 } });
231+
store.mergeQuery({ filter: { bar: 1 }, maxTimeMS: 20 });
232+
store.mergeQuery({ filter: { bar: 4 }, maxTimeMS: 40 });
233+
});
234+
});
235+
});
236+
182237
describe('setQuery', function() {
183238
afterEach(function() {
184239
unsubscribe();

0 commit comments

Comments
 (0)