Skip to content

Commit 3f827b3

Browse files
committed
Merge branch '5.x' of github.com:Automattic/mongoose into 5.x
2 parents eeabe5f + 14464d1 commit 3f827b3

File tree

2 files changed

+48
-8
lines changed

2 files changed

+48
-8
lines changed

lib/helpers/update/removeUnusedArrayFilters.js

+29-8
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,33 @@
77
*/
88

99
module.exports = function removeUnusedArrayFilters(update, arrayFilters) {
10-
const updateKeys = Object.keys(update).map(key => Object.keys(update[key])).reduce((cur, arr) => cur.concat(arr), []);
11-
return arrayFilters.filter(obj => {
12-
const firstKey = Object.keys(obj)[0];
13-
const firstDot = firstKey.indexOf('.');
14-
const arrayFilterKey = firstDot === -1 ? firstKey : firstKey.slice(0, firstDot);
15-
16-
return updateKeys.find(key => key.includes('$[' + arrayFilterKey + ']')) != null;
10+
const updateKeys = Object.keys(update)
11+
.map((key) => Object.keys(update[key]))
12+
.reduce((cur, arr) => cur.concat(arr), []);
13+
return arrayFilters.filter((obj) => {
14+
return _checkSingleFilterKey(obj, updateKeys);
1715
});
18-
};
16+
};
17+
18+
function _checkSingleFilterKey(arrayFilter, updateKeys) {
19+
const firstKey = Object.keys(arrayFilter)[0];
20+
21+
if (firstKey === '$and' || firstKey === '$or') {
22+
if (!Array.isArray(arrayFilter[firstKey])) {
23+
return false;
24+
}
25+
return (
26+
arrayFilter[firstKey].find((filter) =>
27+
_checkSingleFilterKey(filter, updateKeys)
28+
) != null
29+
);
30+
}
31+
32+
const firstDot = firstKey.indexOf('.');
33+
const arrayFilterKey =
34+
firstDot === -1 ? firstKey : firstKey.slice(0, firstDot);
35+
36+
return (
37+
updateKeys.find((key) => key.includes('$[' + arrayFilterKey + ']')) != null
38+
);
39+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
'use strict';
2+
3+
const assert = require('assert');
4+
const removeUnusedArrayFilters = require('../../lib/helpers/update/removeUnusedArrayFilters');
5+
6+
describe('removeUnusedArrayFilters', function() {
7+
it('respects `$or` (gh-10696)', function() {
8+
const update = {
9+
$set: {
10+
'requests.$[i].status.aa': 'ON_GOING',
11+
'requests.$[i].status.bb': 'ON_GOING'
12+
}
13+
};
14+
const arrayFilters = [{ $or: [{ 'i.no': 1 }] }];
15+
16+
const ret = removeUnusedArrayFilters(update, arrayFilters);
17+
assert.deepEqual(ret, [{ $or: [{ 'i.no': 1 }] }]);
18+
});
19+
});

0 commit comments

Comments
 (0)