Skip to content

Commit cd8a196

Browse files
committed
ref(search): Extract shared termOperatorToInternal helper to eliminate duplicated operator mapping
The negated/internalOp mapping from TermOperator existed identically in both modifyFilterOperatorQuery and modifyFilterValue. Consolidate into a single helper.
1 parent e31bfc7 commit cd8a196

1 file changed

Lines changed: 30 additions & 34 deletions

File tree

static/app/components/searchQueryBuilder/hooks/useQueryBuilderState.tsx

Lines changed: 30 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,32 @@ function deleteQueryTokens(
281281
};
282282
}
283283

284+
function termOperatorToInternal(op: TermOperator): {
285+
internalOp: TermOperator;
286+
negated: boolean;
287+
} {
288+
const negated =
289+
op === TermOperator.NOT_EQUAL ||
290+
op === TermOperator.DOES_NOT_CONTAIN ||
291+
op === TermOperator.DOES_NOT_START_WITH ||
292+
op === TermOperator.DOES_NOT_END_WITH;
293+
294+
let internalOp: TermOperator;
295+
if (op === TermOperator.DOES_NOT_CONTAIN) {
296+
internalOp = TermOperator.CONTAINS;
297+
} else if (op === TermOperator.DOES_NOT_START_WITH) {
298+
internalOp = TermOperator.STARTS_WITH;
299+
} else if (op === TermOperator.DOES_NOT_END_WITH) {
300+
internalOp = TermOperator.ENDS_WITH;
301+
} else if (op === TermOperator.NOT_EQUAL) {
302+
internalOp = TermOperator.DEFAULT;
303+
} else {
304+
internalOp = op;
305+
}
306+
307+
return {negated, internalOp};
308+
}
309+
284310
export function modifyFilterOperatorQuery(
285311
query: string,
286312
token: TokenResult<Token.FILTER>,
@@ -290,23 +316,10 @@ export function modifyFilterOperatorQuery(
290316
return modifyFilterOperatorDate(query, token, newOperator);
291317
}
292318

319+
const {negated, internalOp} = termOperatorToInternal(newOperator);
293320
const newToken: TokenResult<Token.FILTER> = {...token};
294-
newToken.negated =
295-
newOperator === TermOperator.NOT_EQUAL ||
296-
newOperator === TermOperator.DOES_NOT_CONTAIN ||
297-
newOperator === TermOperator.DOES_NOT_START_WITH ||
298-
newOperator === TermOperator.DOES_NOT_END_WITH;
299-
300-
if (newOperator === TermOperator.DOES_NOT_CONTAIN) {
301-
newToken.operator = TermOperator.CONTAINS;
302-
} else if (newOperator === TermOperator.DOES_NOT_START_WITH) {
303-
newToken.operator = TermOperator.STARTS_WITH;
304-
} else if (newOperator === TermOperator.DOES_NOT_END_WITH) {
305-
newToken.operator = TermOperator.ENDS_WITH;
306-
} else {
307-
newToken.operator =
308-
newOperator === TermOperator.NOT_EQUAL ? TermOperator.DEFAULT : newOperator;
309-
}
321+
newToken.negated = negated;
322+
newToken.operator = internalOp;
310323

311324
return replaceQueryToken(query, token, stringifyToken(newToken));
312325
}
@@ -622,24 +635,7 @@ export function modifyFilterValue(
622635
}
623636

624637
// Operator change — replace the entire filter token atomically
625-
const negated =
626-
newOp === TermOperator.NOT_EQUAL ||
627-
newOp === TermOperator.DOES_NOT_CONTAIN ||
628-
newOp === TermOperator.DOES_NOT_START_WITH ||
629-
newOp === TermOperator.DOES_NOT_END_WITH;
630-
631-
let internalOp: TermOperator;
632-
if (newOp === TermOperator.DOES_NOT_CONTAIN) {
633-
internalOp = TermOperator.CONTAINS;
634-
} else if (newOp === TermOperator.DOES_NOT_START_WITH) {
635-
internalOp = TermOperator.STARTS_WITH;
636-
} else if (newOp === TermOperator.DOES_NOT_END_WITH) {
637-
internalOp = TermOperator.ENDS_WITH;
638-
} else if (newOp === TermOperator.NOT_EQUAL) {
639-
internalOp = TermOperator.DEFAULT;
640-
} else {
641-
internalOp = newOp;
642-
}
638+
const {negated, internalOp} = termOperatorToInternal(newOp);
643639

644640
const prefix = negated ? '!' : '';
645641
const keyStr = stringifyToken(token.key);

0 commit comments

Comments
 (0)