Skip to content

Commit 346b340

Browse files
Copilotivanvpetrov
andcommitted
feat(toolbar): Export extractUniqueFieldNamesFromFilterTree as public static method on ExpressionsTreeUtil
Co-authored-by: ivanvpetrov <110455887+ivanvpetrov@users.noreply.github.com> Agent-Logs-Url: https://github.com/IgniteUI/igniteui-angular/sessions/cde76442-6a72-430d-91f9-44544e3364f2
1 parent 41fffc7 commit 346b340

3 files changed

Lines changed: 84 additions & 17 deletions

File tree

projects/igniteui-angular/core/src/data-operations/expressions-tree-util.spec.ts

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { FilteringLogic, IFilteringExpression } from './filtering-expression.interface';
22
import { FilteringExpressionsTree, IFilteringExpressionsTree } from './filtering-expressions-tree';
3-
import { recreateExpression, recreateTree, recreateTreeFromFields } from './expressions-tree-util';
3+
import { ExpressionsTreeUtil, recreateExpression, recreateTree, recreateTreeFromFields } from './expressions-tree-util';
44
import { IgxBooleanFilteringOperand, IgxDateFilteringOperand, IgxDateTimeFilteringOperand, IgxNumberFilteringOperand, IgxStringFilteringOperand, IgxTimeFilteringOperand } from './filtering-condition';
55
import type { EntityType, FieldType } from './grid-types';
66

@@ -479,3 +479,61 @@ describe('Unit testing FilteringUtil', () => {
479479
});
480480

481481
});
482+
483+
describe('ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree', () => {
484+
it('Should return an empty array for undefined input', () => {
485+
const result = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(undefined);
486+
expect(result).toEqual([]);
487+
});
488+
489+
it('Should return an empty array for a tree with no operands', () => {
490+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
491+
const result = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(tree);
492+
expect(result).toEqual([]);
493+
});
494+
495+
it('Should return unique field names from a flat filtering tree', () => {
496+
const tree = new FilteringExpressionsTree(FilteringLogic.And);
497+
tree.filteringOperands.push({ fieldName: 'ProductName', conditionName: 'contains', searchVal: 'A' } as IFilteringExpression);
498+
tree.filteringOperands.push({ fieldName: 'Downloads', conditionName: 'greaterThan', searchVal: 100 } as IFilteringExpression);
499+
tree.filteringOperands.push({ fieldName: 'ProductName', conditionName: 'startsWith', searchVal: 'B' } as IFilteringExpression);
500+
501+
const result = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(tree);
502+
expect(result.length).toBe(2);
503+
expect(result).toContain('ProductName');
504+
expect(result).toContain('Downloads');
505+
});
506+
507+
it('Should return unique field names from a nested filtering tree', () => {
508+
const outerTree = new FilteringExpressionsTree(FilteringLogic.Or);
509+
const innerTree = new FilteringExpressionsTree(FilteringLogic.And);
510+
511+
outerTree.filteringOperands.push({ fieldName: 'ID', conditionName: 'equals', searchVal: 1 } as IFilteringExpression);
512+
innerTree.filteringOperands.push({ fieldName: 'ProductName', conditionName: 'contains', searchVal: 'test' } as IFilteringExpression);
513+
innerTree.filteringOperands.push({ fieldName: 'ID', conditionName: 'lessThan', searchVal: 50 } as IFilteringExpression);
514+
outerTree.filteringOperands.push(innerTree);
515+
516+
const result = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(outerTree);
517+
expect(result.length).toBe(2);
518+
expect(result).toContain('ID');
519+
expect(result).toContain('ProductName');
520+
});
521+
522+
it('Should return unique field names from a deeply nested filtering tree', () => {
523+
const root = new FilteringExpressionsTree(FilteringLogic.And);
524+
const level1 = new FilteringExpressionsTree(FilteringLogic.Or);
525+
const level2 = new FilteringExpressionsTree(FilteringLogic.And);
526+
527+
level2.filteringOperands.push({ fieldName: 'Downloads', conditionName: 'greaterThan', searchVal: 10 } as IFilteringExpression);
528+
level1.filteringOperands.push({ fieldName: 'ProductName', conditionName: 'contains', searchVal: 'x' } as IFilteringExpression);
529+
level1.filteringOperands.push(level2);
530+
root.filteringOperands.push({ fieldName: 'ID', conditionName: 'equals', searchVal: 5 } as IFilteringExpression);
531+
root.filteringOperands.push(level1);
532+
533+
const result = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(root);
534+
expect(result.length).toBe(3);
535+
expect(result).toContain('ID');
536+
expect(result).toContain('ProductName');
537+
expect(result).toContain('Downloads');
538+
});
539+
});

projects/igniteui-angular/core/src/data-operations/expressions-tree-util.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,28 @@ import { IExpressionTree, IFilteringExpressionsTree } from './filtering-expressi
66
import { DateTimeUtil } from '../date-common/public_api';
77

88
export class ExpressionsTreeUtil {
9+
/**
10+
* Returns the unique field names from the provided filtering expressions tree.
11+
* Useful for calculating the number of columns that have advanced filters applied.
12+
* ```typescript
13+
* let fieldNames = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(gridExpressionTree);
14+
* ```
15+
* @param filteringTree The filtering expressions tree to extract field names from.
16+
* @returns An array of unique field names referenced in the filtering tree.
17+
*/
18+
public static extractUniqueFieldNamesFromFilterTree(filteringTree?: IFilteringExpressionsTree): string[] {
19+
const columnNames: string[] = [];
20+
if (!filteringTree) return columnNames;
21+
filteringTree.filteringOperands.forEach((expr) => {
22+
if (isTree(expr)) {
23+
columnNames.push(...this.extractUniqueFieldNamesFromFilterTree(expr as IFilteringExpressionsTree));
24+
} else {
25+
columnNames.push((expr as IFilteringExpression).fieldName);
26+
}
27+
});
28+
return [...new Set(columnNames)];
29+
}
30+
931
/**
1032
* Returns the filtering expression for a column with the provided tree and fieldName.
1133
* ```typescript

projects/igniteui-angular/grids/core/src/toolbar/grid-toolbar-advanced-filtering.component.ts

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Component, Input, OnInit, inject } from '@angular/core';
22
import { IgxToolbarToken } from './token';
33
import { IgxButtonDirective, IgxRippleDirective } from 'igniteui-angular/directives';
44
import { IgxIconComponent } from 'igniteui-angular/icon';
5-
import { IFilteringExpressionsTree, isTree, OverlaySettings } from 'igniteui-angular/core';
5+
import { ExpressionsTreeUtil, IFilteringExpressionsTree, OverlaySettings } from 'igniteui-angular/core';
66

77
/* blazorElement */
88
/* wcElementTag: igc-grid-toolbar-advanced-filtering */
@@ -48,24 +48,11 @@ export class IgxGridToolbarAdvancedFilteringComponent implements OnInit {
4848
*/
4949
public ngOnInit(): void {
5050
// Initial value
51-
this.numberOfColumns = this.grid?.advancedFilteringExpressionsTree ? this.extractUniqueFieldNamesFromFilterTree(this.grid?.advancedFilteringExpressionsTree).length : 0;
51+
this.numberOfColumns = this.grid?.advancedFilteringExpressionsTree ? ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(this.grid?.advancedFilteringExpressionsTree).length : 0;
5252

5353
// Subscribing for future updates
5454
this.grid?.advancedFilteringExpressionsTreeChange.subscribe(filteringTree => {
55-
this.numberOfColumns = this.extractUniqueFieldNamesFromFilterTree(filteringTree).length;
55+
this.numberOfColumns = ExpressionsTreeUtil.extractUniqueFieldNamesFromFilterTree(filteringTree).length;
5656
});
5757
}
58-
59-
protected extractUniqueFieldNamesFromFilterTree(filteringTree?: IFilteringExpressionsTree) : string[] {
60-
const columnNames = [];
61-
if (!filteringTree) return columnNames;
62-
filteringTree.filteringOperands.forEach((expr) => {
63-
if (isTree(expr)) {
64-
columnNames.push(...this.extractUniqueFieldNamesFromFilterTree(expr));
65-
} else {
66-
columnNames.push(expr.fieldName);
67-
}
68-
});
69-
return [...new Set(columnNames)];
70-
}
7158
}

0 commit comments

Comments
 (0)