Skip to content

Commit 07b8b2a

Browse files
Merge branch 'main' into improv/O2B-1534/Migrate-Log-Overview-to-use-FilteringModel-pattern
2 parents caf9812 + 70597fe commit 07b8b2a

9 files changed

Lines changed: 373 additions & 43 deletions

File tree

lib/domain/dtos/filters/LhcFillsFilterDto.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const Joi = require('joi');
1414
const { validateRange, RANGE_INVALID } = require('../../../utilities/rangeUtils');
1515
const { validateBeamTypes, BEAM_TYPE_INVALID } = require('../../../utilities/beamTypeUtils');
1616
const { validateTimeDuration } = require('../../../utilities/validateTime');
17+
const { FromToFilterDto } = require('./FromToFilterDto.js');
1718

1819
exports.LhcFillsFilterDto = Joi.object({
1920
hasStableBeams: Joi.boolean(),
@@ -23,6 +24,8 @@ exports.LhcFillsFilterDto = Joi.object({
2324
}),
2425
runDuration: validateTimeDuration,
2526
beamDuration: validateTimeDuration,
27+
stableBeamsStart: FromToFilterDto,
28+
stableBeamsEnd: FromToFilterDto,
2629
schemeName: Joi.string().trim().max(64),
2730
beamTypes: Joi.string()
2831
.trim()

lib/public/views/LhcFills/ActiveColumns/lhcFillsActiveColumns.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import { fillNumberFilter } from '../../../components/Filters/LhcFillsFilter/fil
2828
import { durationFilter } from '../../../components/Filters/LhcFillsFilter/durationFilter.js';
2929
import { beamTypeFilter } from '../../../components/Filters/LhcFillsFilter/beamTypeFilter.js';
3030
import { schemeNameFilter } from '../../../components/Filters/LhcFillsFilter/schemeNameFilter.js';
31+
import { timeRangeFilter } from '../../../components/Filters/common/filters/timeRangeFilter.js';
3132

3233
/**
3334
* List of active columns for a lhc fills table
@@ -65,6 +66,14 @@ export const lhcFillsActiveColumns = {
6566
visible: true,
6667
size: 'w-8',
6768
format: (timestamp) => formatTimestamp(timestamp, false),
69+
70+
/**
71+
* Stable Beam start filter component
72+
*
73+
* @param {RunsOverviewModel} lhcFillsOverviewModel the lhcFills overview model
74+
* @return {Component} the filter component
75+
*/
76+
filter: (lhcFillsOverviewModel) => timeRangeFilter(lhcFillsOverviewModel.filteringModel.get('stableBeamsStart').timeRangeInputModel),
6877
profiles: {
6978
lhcFill: true,
7079
environment: true,
@@ -80,6 +89,14 @@ export const lhcFillsActiveColumns = {
8089
visible: true,
8190
size: 'w-8',
8291
format: (timestamp) => formatTimestamp(timestamp, false),
92+
93+
/**
94+
* Stable Beam end filter component
95+
*
96+
* @param {LhcFillsOverviewModel} lhcFillsOverviewModel the lhcFills overview model
97+
* @return {Component} the filter component
98+
*/
99+
filter: (lhcFillsOverviewModel) => timeRangeFilter(lhcFillsOverviewModel.filteringModel.get('stableBeamsEnd').timeRangeInputModel),
83100
profiles: {
84101
lhcFill: true,
85102
environment: true,

lib/public/views/LhcFills/Overview/LhcFillsOverviewModel.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import { OverviewPageModel } from '../../../models/OverviewModel.js';
1919
import { addStatisticsToLhcFill } from '../../../services/lhcFill/addStatisticsToLhcFill.js';
2020
import { BeamTypeFilterModel } from '../../../components/Filters/LhcFillsFilter/BeamTypeFilterModel.js';
2121
import { TextComparisonFilterModel } from '../../../components/Filters/common/filters/TextComparisonFilterModel.js';
22+
import { TimeRangeFilterModel } from '../../../components/Filters/RunsFilter/TimeRangeFilter.js';
2223

2324
/**
2425
* Model for the LHC fills overview page
@@ -39,6 +40,8 @@ export class LhcFillsOverviewModel extends OverviewPageModel {
3940
beamDuration: new TextComparisonFilterModel(),
4041
runDuration: new TextComparisonFilterModel(),
4142
hasStableBeams: new StableBeamFilterModel(),
43+
stableBeamsStart: new TimeRangeFilterModel(),
44+
stableBeamsEnd: new TimeRangeFilterModel(),
4245
beamTypes: new BeamTypeFilterModel(),
4346
schemeName: new RawTextFilterModel(),
4447
});

lib/usecases/environment/GetAllEnvironmentsUseCase.js

Lines changed: 14 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,18 +69,11 @@ class GetAllEnvironmentsUseCase {
6969
const { filter, page = {} } = query;
7070
const { limit = ApiConfig.pagination.limit, offset = 0 } = page;
7171

72-
/**
73-
* Prepare a query builder with ordering, limit and offset
74-
*
75-
* @return {QueryBuilder} the created query builder
76-
*/
77-
const prepareQueryBuilder = () => dataSource.createQueryBuilder()
72+
const queryBuilder = dataSource.createQueryBuilder()
7873
.orderBy('updatedAt', 'desc')
7974
.limit(limit)
8075
.offset(offset);
8176

82-
const fetchQueryBuilder = prepareQueryBuilder();
83-
8477
if (filter) {
8578
const {
8679
ids: idsExpression,
@@ -90,38 +83,36 @@ class GetAllEnvironmentsUseCase {
9083
created,
9184
} = filter;
9285

93-
const filterQueryBuilder = prepareQueryBuilder();
94-
9586
if (created) {
9687
const from = created.from !== undefined ? created.from : 0;
9788
const to = created.to !== undefined ? created.to : Date.now();
98-
filterQueryBuilder.where('createdAt').between(from, to);
89+
queryBuilder.where('createdAt').between(from, to);
9990
}
10091

10192
if (idsExpression) {
10293
const filters = idsExpression.split(',').map((id) => id.trim());
10394

10495
// Filter should be like with only one filter
10596
if (filters.length === 1) {
106-
filterQueryBuilder.where('id').substring(filters[0]);
97+
queryBuilder.where('id').substring(filters[0]);
10798
}
10899

109100
// Filters should be exact with more than one filter
110101
if (filters.length > 1) {
111-
filterQueryBuilder.andWhere({ id: { [Op.in]: filters } });
102+
queryBuilder.andWhere({ id: { [Op.in]: filters } });
112103
}
113104
}
114105

115106
if (currentStatusExpression) {
116107
const filters = currentStatusExpression.split(',').map((status) => status.trim());
117108

118109
// Filter the environments by current status using the subquery
119-
filterQueryBuilder.literalWhere(
110+
queryBuilder.literalWhere(
120111
`${ENVIRONMENT_LATEST_HISTORY_ITEM_SUBQUERY} IN (:filters)`,
121112
{ filters },
122113
);
123114

124-
filterQueryBuilder.includeAttribute({
115+
queryBuilder.includeAttribute({
125116
query: ENVIRONMENT_LATEST_HISTORY_ITEM_SUBQUERY,
126117
alias: 'currentStatus',
127118
});
@@ -157,7 +148,7 @@ class GetAllEnvironmentsUseCase {
157148
* Use OR condition to match subsequences ending with either DESTROYED or DONE
158149
* Filter the environments by using LIKE for subsequence matching
159150
*/
160-
filterQueryBuilder.literalWhere(
151+
queryBuilder.literalWhere(
161152
`(${ENVIRONMENT_STATUS_HISTORY_SUBQUERY} LIKE :statusFiltersWithDestroyed OR ` +
162153
`${ENVIRONMENT_STATUS_HISTORY_SUBQUERY} LIKE :statusFiltersWithDone)`,
163154
{
@@ -166,17 +157,17 @@ class GetAllEnvironmentsUseCase {
166157
},
167158
);
168159

169-
filterQueryBuilder.includeAttribute({
160+
queryBuilder.includeAttribute({
170161
query: ENVIRONMENT_STATUS_HISTORY_SUBQUERY,
171162
alias: 'statusHistory',
172163
});
173164
} else {
174-
filterQueryBuilder.literalWhere(
165+
queryBuilder.literalWhere(
175166
`${ENVIRONMENT_STATUS_HISTORY_SUBQUERY} LIKE :statusFilters`,
176167
{ statusFilters: `%${statusFilters.join(',')}%` },
177168
);
178169

179-
filterQueryBuilder.includeAttribute({
170+
queryBuilder.includeAttribute({
180171
query: ENVIRONMENT_STATUS_HISTORY_SUBQUERY,
181172
alias: 'statusHistory',
182173
});
@@ -190,30 +181,20 @@ class GetAllEnvironmentsUseCase {
190181

191182
// Check that the final run numbers list contains at least one valid run number
192183
if (finalRunNumberList.length > 0) {
193-
filterQueryBuilder.include({
184+
queryBuilder.include({
194185
association: 'runs',
195186
where: {
196187
// Filter should be like with only one filter and exact with more than one filter
197188
runNumber: { [finalRunNumberList.length === 1 ? Op.substring : Op.in]: finalRunNumberList },
198189
},
199190
});
200191
}
201-
};
202-
203-
const filteredEnvironmentsIds = (await EnvironmentRepository.findAll(filterQueryBuilder)).map(({ id }) => id);
204-
// If no environments match the filter, return an empty result
205-
if (filteredEnvironmentsIds.length === 0) {
206-
return {
207-
count: 0,
208-
environments: [],
209-
};
210192
}
211-
fetchQueryBuilder.where('id').oneOf(filteredEnvironmentsIds);
212193
}
213194

214-
fetchQueryBuilder.include({ association: 'runs' });
215-
fetchQueryBuilder.include({ association: 'historyItems' });
216-
const { count, rows } = await EnvironmentRepository.findAndCountAll(fetchQueryBuilder);
195+
queryBuilder.include({ association: 'runs' });
196+
queryBuilder.include({ association: 'historyItems' });
197+
const { count, rows } = await EnvironmentRepository.findAndCountAll(queryBuilder);
217198
return {
218199
count,
219200
environments: rows.map((environment) => environmentAdapter.toEntity(environment)),

lib/usecases/lhcFill/GetAllLhcFillsUseCase.js

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,24 @@ class GetAllLhcFillsUseCase {
4747
let associatedStatisticsRequired = false;
4848

4949
if (filter) {
50-
const { hasStableBeams, fillNumbers, schemeName, beamDuration, runDuration, beamTypes } = filter;
50+
const { hasStableBeams, fillNumbers, schemeName, beamDuration, stableBeamsStart, stableBeamsEnd, runDuration, beamTypes } = filter;
5151
if (hasStableBeams) {
5252
// For now, if a stableBeamsStart is present, then a beam is stable
5353
queryBuilder.where('stableBeamsStart').not().is(null);
5454
}
5555

56+
if (stableBeamsStart) {
57+
const from = stableBeamsStart.from !== undefined ? stableBeamsStart.from : 0;
58+
const to = stableBeamsStart.to !== undefined ? stableBeamsStart.to : new Date().getTime();
59+
queryBuilder.where('stableBeamsStart').between(from, to);
60+
}
61+
62+
if (stableBeamsEnd) {
63+
const from = stableBeamsEnd.from !== undefined ? stableBeamsEnd.from : 0;
64+
const to = stableBeamsEnd.to !== undefined ? stableBeamsEnd.to : new Date().getTime();
65+
queryBuilder.where('stableBeamsEnd').between(from, to);
66+
}
67+
5668
if (fillNumbers) {
5769
const fillNumberCriteria = splitStringToStringsTrimmed(fillNumbers, SEARCH_ITEMS_SEPARATOR);
5870

0 commit comments

Comments
 (0)