Skip to content

Commit d41a9bc

Browse files
committed
[O2B-1503] ranges accepted by fill numbers filter
1 parent 66e925a commit d41a9bc

2 files changed

Lines changed: 44 additions & 4 deletions

File tree

lib/usecases/lhcFill/GetAllLhcFillsUseCase.js

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ class GetAllLhcFillsUseCase {
3838
const { filter, page = {} } = query;
3939
const { limit = ApiConfig.pagination.limit, offset = 0 } = page;
4040

41+
const SEARCH_ITEMS_SEPARATOR = ',';
42+
4143
const queryBuilder = new QueryBuilder();
4244

4345
if (filter) {
@@ -48,11 +50,37 @@ class GetAllLhcFillsUseCase {
4850
}
4951

5052
if (fillNumbers) {
51-
const fillNumbersSplit = fillNumbers.split(',');
53+
/*
54+
* Split by SEARCH_ITEMS_SEPARATOR. Don't validate for only numbers
55+
* Boolean trick: https://michaeluloth.com/javascript-filter-boolean/
56+
*/
57+
const fillNumberCriteria = fillNumbers.split(SEARCH_ITEMS_SEPARATOR)
58+
.map((runNumbers) => runNumbers.trim())
59+
.filter(Boolean);
60+
61+
// Set to prevent duplicate values.
62+
const fillNumberSet = new Set();
63+
64+
fillNumberCriteria.forEach((fillNumber) => {
65+
if (fillNumber.includes('-')) {
66+
const [start, end] = fillNumber.split('-').map((n) => parseInt(n, 10));
67+
if (!Number.isNaN(start) && !Number.isNaN(end)) {
68+
for (let i = start; i <= end; i++) {
69+
fillNumberSet.add(i);
70+
}
71+
}
72+
} else {
73+
if (!Number.isNaN(fillNumber)) {
74+
fillNumberSet.add(Number(fillNumber));
75+
}
76+
}
77+
});
78+
79+
const finalFillnumberList = Array.from(fillNumberSet);
5280

53-
const fillNumbersValidated = fillNumbersSplit.filter((number) => !Number.isNaN(number));
54-
if (fillNumbersValidated.length > 0) {
55-
queryBuilder.where('fillNumber').oneOf(...fillNumbersValidated);
81+
// Check that the final fill numbers list contains at least one valid fill number
82+
if (finalFillnumberList.length > 0) {
83+
queryBuilder.where('fillNumber').oneOf(...finalFillnumberList);
5684
}
5785
}
5886
}

test/lib/usecases/lhcFill/GetAllLhcFillsUseCase.test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,18 @@ module.exports = () => {
6565
});
6666
})
6767

68+
it('should only contain specified fill numbers, range', async () => {
69+
getAllLhcFillsDto.query = { filter: { hasStableBeams: true, fillNumbers: '1-3,6' } };
70+
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto);
71+
72+
73+
expect(lhcFills).to.be.an('array').and.lengthOf(4)
74+
75+
lhcFills.forEach((lhcFill) => {
76+
expect(lhcFill.fillNumber).oneOf([1,2,3,6])
77+
});
78+
})
79+
6880
it('should only contain specified fill numbers, whitespace', async () => {
6981
getAllLhcFillsDto.query = { filter: { hasStableBeams: true, fillNumbers: ' 6 , 3 ' } };
7082
const { lhcFills } = await new GetAllLhcFillsUseCase().execute(getAllLhcFillsDto);

0 commit comments

Comments
 (0)