Skip to content

Commit 6e60c78

Browse files
authored
[O2B-1443] Add filter on CTF, TF and Other File counts for runs-overview page (#1900)
* Add filtering on runs-overview for file counts (ctf, tf, other) * Add tests for new filter options on GetAllRunsUseCase
1 parent ebdbdc6 commit 6e60c78

File tree

5 files changed

+111
-12
lines changed

5 files changed

+111
-12
lines changed

lib/domain/dtos/filters/RunFilterDto.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ exports.RunFilterDto = Joi.object({
8181
nDetectors: IntegerComparisonDto,
8282
nEpns: IntegerComparisonDto,
8383
nFlps: IntegerComparisonDto,
84+
ctfFileCount: IntegerComparisonDto,
85+
tfFileCount: IntegerComparisonDto,
86+
otherFileCount: IntegerComparisonDto,
8487
ddflp: Joi.boolean(),
8588
dcs: Joi.boolean(),
8689
epn: Joi.boolean(),

lib/public/views/Runs/ActiveColumns/runsActiveColumns.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,11 @@ export const runsActiveColumns = {
604604
ctfFileCount: {
605605
name: 'CTF File Count',
606606
visible: false,
607+
classes: 'w-2 f6 w-wrapped',
608+
filter: (runsOverviewModel) => numericalComparisonFilter(
609+
runsOverviewModel.filteringModel.get('ctfFileCount'),
610+
{ selectorPrefix: 'ctfFileCount' },
611+
),
607612
},
608613
ctfFileSize: {
609614
name: 'CTF File Size',
@@ -612,6 +617,11 @@ export const runsActiveColumns = {
612617
tfFileCount: {
613618
name: 'TF File Count',
614619
visible: false,
620+
classes: 'w-2 f6 w-wrapped',
621+
filter: (runsOverviewModel) => numericalComparisonFilter(
622+
runsOverviewModel.filteringModel.get('tfFileCount'),
623+
{ selectorPrefix: 'tfFileCount' },
624+
),
615625
},
616626
tfFileSize: {
617627
name: 'TF File Size',
@@ -620,6 +630,11 @@ export const runsActiveColumns = {
620630
otherFileCount: {
621631
name: 'Other File Count',
622632
visible: false,
633+
classes: 'w-2 f6 w-wrapped',
634+
filter: (runsOverviewModel) => numericalComparisonFilter(
635+
runsOverviewModel.filteringModel.get('otherFileCount'),
636+
{ selectorPrefix: 'otherFileCount' },
637+
),
623638
},
624639
otherFileSize: {
625640
name: 'Other File Size',

lib/public/views/Runs/Overview/RunsOverviewModel.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,9 @@ export class RunsOverviewModel extends OverviewPageModel {
7878
nDetectors: new NumericalComparisonFilterModel({ integer: true }),
7979
nEpns: new NumericalComparisonFilterModel({ integer: true }),
8080
nFlps: new NumericalComparisonFilterModel({ integer: true }),
81+
ctfFileCount: new NumericalComparisonFilterModel({ integer: true }),
82+
tfFileCount: new NumericalComparisonFilterModel({ integer: true }),
83+
otherFileCount: new NumericalComparisonFilterModel({ integer: true }),
8184
odcTopologyFullName: new RawTextFilterModel(),
8285
eorReason: new EorReasonFilterModel(eorReasonTypeProvider.items$),
8386
magnets: new MagnetsFilteringModel(magnetsCurrentLevelsProvider.items$),

lib/usecases/run/GetAllRunsUseCase.js

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ class GetAllRunsUseCase {
5656
nDetectors,
5757
nEpns,
5858
nFlps,
59+
ctfFileCount,
60+
tfFileCount,
61+
otherFileCount,
5962
o2end,
6063
o2start,
6164
odcTopologyFullName,
@@ -263,18 +266,21 @@ class GetAllRunsUseCase {
263266
if (runQualities) {
264267
filteringQueryBuilder.where('runQuality').oneOf(...runQualities);
265268
}
266-
if (nDetectors) {
267-
const { operator, limit: nDetectorLimit } = nDetectors;
268-
filteringQueryBuilder.where('nDetectors').applyOperator(operator, nDetectorLimit);
269-
}
270-
if (nFlps) {
271-
const { operator, limit: nFlpsLimit } = nFlps;
272-
filteringQueryBuilder.where('nFlps').applyOperator(operator, nFlpsLimit);
273-
}
274-
if (nEpns) {
275-
const { operator, limit: nEpnsLimit } = nEpns;
276-
filteringQueryBuilder.where('nEpns').applyOperator(operator, nEpnsLimit);
277-
}
269+
const fileCountFilters = [
270+
{ field: 'nDetectors', value: nDetectors },
271+
{ field: 'nFlps', value: nFlps },
272+
{ field: 'nEpns', value: nEpns },
273+
{ field: 'ctfFileCount', value: ctfFileCount },
274+
{ field: 'tfFileCount', value: tfFileCount },
275+
{ field: 'otherFileCount', value: otherFileCount },
276+
];
277+
fileCountFilters.forEach(({ field, value }) => {
278+
if (value) {
279+
const { operator, limit } = value;
280+
filteringQueryBuilder.where(field).applyOperator(operator, limit);
281+
}
282+
});
283+
278284
if (ddflp === false) {
279285
filteringQueryBuilder.where('dd_flp').isOrNull(ddflp);
280286
} else if (ddflp === true) {

test/lib/usecases/run/GetAllRunsUseCase.test.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,78 @@ module.exports = () => {
575575
expect(runs).to.have.lengthOf(0);
576576
});
577577

578+
it('should successfully filter on ctf file count number', async () => {
579+
const ctfFileCount = {
580+
operator: '<',
581+
limit: 200,
582+
};
583+
getAllRunsDto.query = { filter: { ctfFileCount } };
584+
585+
let { runs } = await new GetAllRunsUseCase().execute(getAllRunsDto);
586+
expect(runs).to.be.an('array');
587+
expect(runs).to.have.lengthOf(1);
588+
589+
ctfFileCount.operator = '<=';
590+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
591+
expect(runs).to.be.an('array');
592+
expect(runs).to.have.lengthOf(2);
593+
expect(runs.every((run) => run.ctfFileCount <= 200)).to.be.true;
594+
595+
ctfFileCount.operator = '=';
596+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
597+
expect(runs).to.be.an('array');
598+
expect(runs).to.have.lengthOf(1);
599+
expect(runs.every((run) => run.ctfFileCount === 200)).to.be.true;
600+
601+
ctfFileCount.operator = '>=';
602+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
603+
expect(runs).to.be.an('array');
604+
expect(runs).to.have.lengthOf(7);
605+
expect(runs.every((run) => run.ctfFileCount >= 200)).to.be.true;
606+
607+
ctfFileCount.operator = '>';
608+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
609+
expect(runs).to.be.an('array');
610+
expect(runs).to.have.lengthOf(6);
611+
expect(runs.every((run) => run.ctfFileCount >= 500)).to.be.true;
612+
});
613+
614+
it('should successfully filter on tf file count number', async () => {
615+
const tfFileCount = {
616+
operator: '<',
617+
limit: 30,
618+
};
619+
getAllRunsDto.query = { filter: { tfFileCount } };
620+
621+
let { runs } = await new GetAllRunsUseCase().execute(getAllRunsDto);
622+
expect(runs).to.be.an('array');
623+
expect(runs).to.have.lengthOf(0);
624+
625+
tfFileCount.operator = '<=';
626+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
627+
expect(runs).to.be.an('array');
628+
expect(runs).to.have.lengthOf(7);
629+
expect(runs.every((run) => run.tfFileCount <= 30)).to.be.true;
630+
631+
tfFileCount.operator = '=';
632+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
633+
expect(runs).to.be.an('array');
634+
expect(runs).to.have.lengthOf(7);
635+
expect(runs.every((run) => run.tfFileCount === 30)).to.be.true;
636+
637+
tfFileCount.operator = '>=';
638+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
639+
expect(runs).to.be.an('array');
640+
expect(runs).to.have.lengthOf(8);
641+
expect(runs.every((run) => run.tfFileCount >= 30)).to.be.true;
642+
643+
tfFileCount.operator = '>';
644+
({ runs } = await new GetAllRunsUseCase().execute(getAllRunsDto));
645+
expect(runs).to.be.an('array');
646+
expect(runs).to.have.lengthOf(1);
647+
expect(runs.every((run) => run.tfFileCount > 30)).to.be.true;
648+
});
649+
578650
it('should successfully return an array, only containing runs found from passed list', async () => {
579651
getAllRunsDto.query = {
580652
filter: {

0 commit comments

Comments
 (0)