Skip to content

Commit 47c2327

Browse files
authored
Merge pull request #40 from marmelab/refactor_filters
[RFR] Ensure filters are applied the same way for queries and metas
2 parents 955333e + 8eb34c5 commit 47c2327

File tree

3 files changed

+62
-93
lines changed

3 files changed

+62
-93
lines changed

src/resolver/Query/all.js

Lines changed: 3 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import applyFilters from './applyFilters';
2+
13
export default (entityData = []) => (
24
_,
35
{ sortField, sortOrder = 'asc', page, perPage = 25, filter = {} }
@@ -16,56 +18,8 @@ export default (entityData = []) => (
1618
return 0;
1719
});
1820
}
19-
if (filter.ids) {
20-
items = items.filter(d => filter.ids.includes(d.id.toString()));
21-
} else {
22-
Object.keys(filter).filter(key => key !== 'q').forEach(key => {
23-
if (key.indexOf('_lte') !== -1) {
24-
// less than or equal
25-
const realKey = key.replace(/(_lte)$/, '');
26-
items = items.filter(d => d[realKey] <= filter[key]);
27-
return;
28-
}
29-
if (key.indexOf('_gte') !== -1) {
30-
// less than or equal
31-
const realKey = key.replace(/(_gte)$/, '');
32-
items = items.filter(d => d[realKey] >= filter[key]);
33-
return;
34-
}
35-
if (key.indexOf('_lt') !== -1) {
36-
// less than or equal
37-
const realKey = key.replace(/(_lt)$/, '');
38-
items = items.filter(d => d[realKey] < filter[key]);
39-
return;
40-
}
41-
if (key.indexOf('_gt') !== -1) {
42-
// less than or equal
43-
const realKey = key.replace(/(_gt)$/, '');
44-
items = items.filter(d => d[realKey] > filter[key]);
45-
return;
46-
}
47-
48-
items = items.filter(
49-
d =>
50-
filter[key] instanceof Date
51-
? +d[key] == +filter[key]
52-
: d[key] == filter[key]
53-
);
54-
});
5521

56-
if (filter.q) {
57-
items = items.filter(d =>
58-
Object.keys(d).some(
59-
key =>
60-
d[key] &&
61-
d[key]
62-
.toString()
63-
.toLowerCase()
64-
.includes(filter.q.toLowerCase())
65-
)
66-
);
67-
}
68-
}
22+
items = applyFilters(items, filter);
6923

7024
if (page !== undefined && perPage) {
7125
items = items.slice(page * perPage, page * perPage + perPage);

src/resolver/Query/applyFilters.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
export default (entityData, filter = {}) => {
2+
let items = [...entityData];
3+
4+
if (filter.ids) {
5+
items = items.filter(d => filter.ids.includes(d.id.toString()));
6+
} else {
7+
Object.keys(filter).filter(key => key !== 'q').forEach(key => {
8+
if (key.indexOf('_lte') !== -1) {
9+
// less than or equal
10+
const realKey = key.replace(/(_lte)$/, '');
11+
items = items.filter(d => d[realKey] <= filter[key]);
12+
return;
13+
}
14+
if (key.indexOf('_gte') !== -1) {
15+
// less than or equal
16+
const realKey = key.replace(/(_gte)$/, '');
17+
items = items.filter(d => d[realKey] >= filter[key]);
18+
return;
19+
}
20+
if (key.indexOf('_lt') !== -1) {
21+
// less than or equal
22+
const realKey = key.replace(/(_lt)$/, '');
23+
items = items.filter(d => d[realKey] < filter[key]);
24+
return;
25+
}
26+
if (key.indexOf('_gt') !== -1) {
27+
// less than or equal
28+
const realKey = key.replace(/(_gt)$/, '');
29+
items = items.filter(d => d[realKey] > filter[key]);
30+
return;
31+
}
32+
33+
items = items.filter(
34+
d =>
35+
filter[key] instanceof Date
36+
? +d[key] == +filter[key]
37+
: d[key] == filter[key]
38+
);
39+
});
40+
41+
if (filter.q) {
42+
items = items.filter(d =>
43+
Object.keys(d).some(
44+
key =>
45+
d[key] &&
46+
d[key]
47+
.toString()
48+
.toLowerCase()
49+
.includes(filter.q.toLowerCase())
50+
)
51+
);
52+
}
53+
}
54+
55+
return items;
56+
};

src/resolver/Query/meta.js

Lines changed: 3 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,7 @@
1-
export default entityData => (_, { page, perPage = 25, filter = {} }) => {
2-
let items = [...entityData];
1+
import applyFilters from './applyFilters';
32

4-
if (filter.ids) {
5-
items = items.filter(d => filter.ids.includes(d.id.toString()));
6-
} else {
7-
Object.keys(filter).filter(key => key !== 'q').forEach(key => {
8-
if (key.indexOf('_lte') !== -1) {
9-
// less than or equal
10-
const realKey = key.replace(/(_lte)$/, '');
11-
items = items.filter(d => d[realKey] <= filter[key]);
12-
return;
13-
}
14-
if (key.indexOf('_gte') !== -1) {
15-
// less than or equal
16-
const realKey = key.replace(/(_gte)$/, '');
17-
items = items.filter(d => d[realKey] >= filter[key]);
18-
return;
19-
}
20-
if (key.indexOf('_lt') !== -1) {
21-
// less than or equal
22-
const realKey = key.replace(/(_lt)$/, '');
23-
items = items.filter(d => d[realKey] < filter[key]);
24-
return;
25-
}
26-
if (key.indexOf('_gt') !== -1) {
27-
// less than or equal
28-
const realKey = key.replace(/(_gt)$/, '');
29-
items = items.filter(d => d[realKey] > filter[key]);
30-
return;
31-
}
32-
33-
items = items.filter(d => d[key] == filter[key]);
34-
});
35-
36-
if (filter.q) {
37-
items = items.filter(d =>
38-
Object.keys(d).some(key => d[key].toString().includes(filter.q))
39-
);
40-
}
41-
}
42-
43-
if (page !== undefined && perPage) {
44-
items = items.slice(page * perPage, page * perPage + perPage);
45-
}
3+
export default entityData => (_, { filter = {} }) => {
4+
let items = applyFilters(entityData, filter);
465

476
return { count: items.length };
487
};

0 commit comments

Comments
 (0)