Skip to content

Commit 57b5234

Browse files
committed
simplify parsing filter
1 parent f75e1f5 commit 57b5234

File tree

1 file changed

+32
-67
lines changed

1 file changed

+32
-67
lines changed

UI/web-app/src/components/HRQuerySource/HRQuerySource.base.tsx

Lines changed: 32 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -85,22 +85,12 @@ export const HRQuerySourceBase: React.FunctionComponent<HRQuerySourceProps> = (p
8585
} else {
8686
let items: IFilterPart[] = children.map((child, index) => {
8787
const parts = child.filter.split(' ');
88-
let value = '';
89-
let andOr = '';
90-
for (let i = 2; i < parts.length; i++) {
91-
const part = parts[i].toLowerCase();
92-
if (part === 'and' || part === 'or') {
93-
andOr = parts[i];
94-
value = parts.slice(2, i).join(' ');
95-
break;
96-
}
97-
}
98-
if (andOr === '') { value = parts.slice(2).join(' '); }
88+
var result = findValueAndOr(parts);
9989
const filterPart: IFilterPart = {
10090
attribute: parts[0],
10191
equalityOperator: parts[1],
102-
value: value,
103-
andOr: andOr
92+
value: result.value,
93+
andOr: result.andOr
10494
};
10595
return filterPart;
10696
});
@@ -152,6 +142,22 @@ export const HRQuerySourceBase: React.FunctionComponent<HRQuerySourceProps> = (p
152142
}
153143
}, [children]);
154144

145+
function findValueAndOr(words: string[]): { andOr: string, value: string } {
146+
let value = '';
147+
let andOr = '';
148+
let startIndex = 2;
149+
for (let i = startIndex; i < words.length; i++) {
150+
const part = words[i].toLowerCase();
151+
if (part === 'and' || part === 'or') {
152+
andOr = words[i];
153+
value = words.slice(startIndex, i).join(' ');
154+
break;
155+
}
156+
}
157+
if (andOr === '') { value = words.slice(startIndex).join(' '); }
158+
return { andOr, value };
159+
}
160+
155161
function setItemsBasedOnGroups(groups: Group[]) {
156162
let items: IFilterPart[] = [];
157163
groups.forEach(group => {
@@ -400,24 +406,14 @@ const checkType = (value: string, type: string | undefined): string => {
400406
let segments = props.source.filter?.split(regex);
401407
let result = true;
402408
if (segments) {
403-
for (let i = 0; i < segments.length; i++) {
404-
const parts = segments[i].trim().split(' ');
405-
let value = '';
406-
let andOr = '';
407-
for (let i = 2; i < parts.length; i++) {
408-
const part = parts[i].toLowerCase();
409-
if (part === 'and' || part === 'or') {
410-
andOr = parts[i];
411-
value = parts.slice(2, i).join(' ');
412-
break;
413-
}
414-
}
415-
if (andOr === '') { value = parts.slice(2).join(' '); }
416-
if (parts[0] === "" || parts[1] === "" || value === "" || andOr === "") {
417-
result = false;
418-
break;
419-
}
409+
for (let i = 0; i < segments.length; i++) {
410+
const parts = segments[i].trim().split(' ');
411+
var res = findValueAndOr(parts);
412+
if (parts[0] === "" || parts[1] === "" || res.value === "" || res.andOr === "") {
413+
result = false;
414+
break;
420415
}
416+
}
421417
}
422418
if (result || children.length === 0) {
423419
setChildren(prevChildren => [...prevChildren, { filter: ''}]);
@@ -847,20 +843,10 @@ const checkType = (value: string, type: string | undefined): string => {
847843
words = segments[index].trim().split(' ');
848844
}
849845
if (words.length > 0) {
850-
let value = '';
851-
let andOr = '';
852-
for (let i = 2; i < words.length; i++) {
853-
const part = words[i].toLowerCase();
854-
if (part === 'and' || part === 'or') {
855-
andOr = words[i];
856-
value = words.slice(2, i).join(' ');
857-
break;
858-
}
859-
}
860-
if (andOr === '') { value = words.slice(2).join(' '); }
846+
var result = findValueAndOr(words);
861847
words.splice(2);
862848
words.splice(2, 0, selectedValueAfterConversion || selectedValue);
863-
if (andOr !== '') { words.push(andOr + ' '); }
849+
if (result.andOr !== '') { words.push(result.andOr + ' '); }
864850
}
865851
segments[index] = words.join(' ');
866852
const updatedFilter = segments.join('');
@@ -927,20 +913,10 @@ const checkType = (value: string, type: string | undefined): string => {
927913
words = segments[index].trim().split(' ');
928914
}
929915
if (words.length > 0) {
930-
let value = '';
931-
let andOr = '';
932-
for (let i = 2; i < words.length; i++) {
933-
const part = words[i].toLowerCase();
934-
if (part === 'and' || part === 'or') {
935-
andOr = words[i];
936-
value = words.slice(2, i).join(' ');
937-
break;
938-
}
939-
}
940-
if (andOr === '') { value = words.slice(2).join(' '); }
916+
var result = findValueAndOr(words);
941917
words.splice(2);
942918
words.splice(2, 0, selectedValueAfterConversion || selectedValue);
943-
if (andOr !== '') { words.push(andOr + ' '); }
919+
if (result.andOr !== '') { words.push(result.andOr + ' '); }
944920
}
945921
segments[index] = words.join(' ');
946922
const updatedFilter = segments.join('');
@@ -997,19 +973,8 @@ const checkType = (value: string, type: string | undefined): string => {
997973
words.pop();
998974
}
999975
if (words.length > 0) {
1000-
let value = '';
1001-
let andOr = '';
1002-
let startIndex = 2;
1003-
for (let i = startIndex; i < words.length; i++) {
1004-
const part = words[i].toLowerCase();
1005-
if (part === 'and' || part === 'or') {
1006-
andOr = words[i];
1007-
value = words.slice(startIndex, i).join(' ');
1008-
break;
1009-
}
1010-
}
1011-
if (andOr === '') { value = words.slice(startIndex).join(' '); }
1012-
const indexAfterValue = startIndex + value.split(' ').length;
976+
var result = findValueAndOr(words);
977+
const indexAfterValue = 2 + result.value.split(' ').length;
1013978
words.splice(indexAfterValue);
1014979
words.splice(indexAfterValue, 0, item.text);
1015980
}

0 commit comments

Comments
 (0)