Skip to content

Commit

Permalink
Revert "feat: lowercase operators support in the where clause is upda…
Browse files Browse the repository at this point in the history
…ted (#3657)" (#3697)

This reverts commit 0e04b77.
  • Loading branch information
nityanandagohain authored Oct 11, 2023
1 parent 0d3cbb1 commit f3c00e1
Show file tree
Hide file tree
Showing 7 changed files with 99 additions and 81 deletions.
12 changes: 0 additions & 12 deletions frontend/src/constants/queryBuilder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -278,35 +278,23 @@ export const QUERY_BUILDER_SEARCH_VALUES = {

export const OPERATORS = {
IN: 'IN',
in: 'in',
NIN: 'NOT_IN',
not_in: 'not_in',
LIKE: 'LIKE',
like: 'like',
NLIKE: 'NOT_LIKE',
not_like: 'not_like',
REGEX: 'REGEX',
regex: 'regex',
NREGEX: 'NOT_REGEX',
nregex: 'not_regex',
'=': '=',
'!=': '!=',
EXISTS: 'EXISTS',
exists: 'exists',
NOT_EXISTS: 'NOT_EXISTS',
not_exists: 'not_exists',
CONTAINS: 'CONTAINS',
contains: 'contains',
NOT_CONTAINS: 'NOT_CONTAINS',
not_contains: 'not_contains',
'>=': '>=',
'>': '>',
'<=': '<=',
'<': '<',
HAS: 'HAS',
has: 'has',
NHAS: 'NHAS',
nhas: 'nhas',
};

export const QUERY_BUILDER_OPERATORS_BY_TYPES = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,42 +3,25 @@ import { parse } from 'papaparse';

import { orderByValueDelimiter } from '../OrderByFilter/utils';

const operators = /=|!=|>=|>|<=|<$/;

// eslint-disable-next-line no-useless-escape
export const tagRegexpV1 = /^\s*(.*?)\s*(IN|in|NOT_IN|nin|LIKE|like|NOT_LIKE|nlike|REGEX|regex|NOT_REGEX|nregex|=|!=|EXISTS|exists|NOT_EXISTS|nexists|CONTAINS|contains|NOT_CONTAINS|ncontains|>=|>|<=|<|HAS|has|NHAS|nhas)\s*(.*)$/g;

export const tagRegexpV2 = /^\s*(.+?)\s+(IN|in|NOT_IN|nin|LIKE|like|NOT_LIKE|nlike|REGEX|regex|NOT_REGEX|nregex|EXISTS|exists|NOT_EXISTS|nexists|CONTAINS|contains|NOT_CONTAINS|ncontains|HAS|has|NHAS|nhas|=|!=|>=|>|<=|<)\s*(.*)$/g;
export const tagRegexp = /^\s*(.*?)\s*(IN|NOT_IN|LIKE|NOT_LIKE|REGEX|NOT_REGEX|=|!=|EXISTS|NOT_EXISTS|CONTAINS|NOT_CONTAINS|>=|>|<=|<|HAS|NHAS)\s*(.*)$/g;

export function isInNInOperator(value: string): boolean {
return value === OPERATORS.IN || value === OPERATORS.NIN;
}

function endsWithOperator(inputString: string): boolean {
return operators.test(inputString);
}

interface ITagToken {
tagKey: string;
tagOperator: string;
tagValue: string[];
}

export function getMatchRegex(str: string): RegExp {
if (endsWithOperator(str)) {
return tagRegexpV1;
}

return tagRegexpV2;
}

export function getTagToken(tag: string): ITagToken {
const matches = tag?.matchAll(getMatchRegex(tag));
const matches = tag?.matchAll(tagRegexp);
const [match] = matches ? Array.from(matches) : [];

if (match) {
const [, matchTagKey, matchTagOperator, matchTagValue] = match;

return {
tagKey: matchTagKey,
tagOperator: matchTagOperator,
Expand Down Expand Up @@ -68,11 +51,65 @@ export function getRemovePrefixFromKey(tag: string): string {
}

export function getOperatorValue(op: string): string {
return op.toLocaleLowerCase();
switch (op) {
case 'IN':
return 'in';
case 'NOT_IN':
return 'nin';
case OPERATORS.REGEX:
return 'regex';
case OPERATORS.HAS:
return 'has';
case OPERATORS.NHAS:
return 'nhas';
case OPERATORS.NREGEX:
return 'nregex';
case 'LIKE':
return 'like';
case 'NOT_LIKE':
return 'nlike';
case 'EXISTS':
return 'exists';
case 'NOT_EXISTS':
return 'nexists';
case 'CONTAINS':
return 'contains';
case 'NOT_CONTAINS':
return 'ncontains';
default:
return op;
}
}

export function getOperatorFromValue(op: string): string {
return op.toLocaleLowerCase();
switch (op) {
case 'in':
return 'IN';
case 'nin':
return 'NOT_IN';
case 'like':
return 'LIKE';
case 'regex':
return OPERATORS.REGEX;
case 'nregex':
return OPERATORS.NREGEX;
case 'nlike':
return 'NOT_LIKE';
case 'exists':
return 'EXISTS';
case 'nexists':
return 'NOT_EXISTS';
case 'contains':
return 'CONTAINS';
case 'ncontains':
return 'NOT_CONTAINS';
case 'has':
return OPERATORS.HAS;
case 'nhas':
return OPERATORS.NHAS;
default:
return op;
}
}

export function replaceStringWithMaxLength(
Expand Down
6 changes: 3 additions & 3 deletions frontend/src/hooks/queryBuilder/useAutoComplete.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import {
getMatchRegex,
getRemovePrefixFromKey,
getTagToken,
replaceStringWithMaxLength,
tagRegexp,
} from 'container/QueryBuilder/filters/QueryBuilderSearch/utils';
import { Option } from 'container/QueryBuilder/type';
import { parse } from 'papaparse';
Expand Down Expand Up @@ -33,7 +33,7 @@ export const useAutoComplete = (
searchKey,
);

const [key, operator, result] = useSetCurrentKeyAndOperator(searchValue);
const [key, operator, result] = useSetCurrentKeyAndOperator(searchValue, keys);

const handleSearch = (value: string): void => {
const prefixFreeValue = getRemovePrefixFromKey(getTagToken(value).tagKey);
Expand All @@ -58,7 +58,7 @@ export const useAutoComplete = (
(value: string): void => {
if (isMulti) {
setSearchValue((prev: string) => {
const matches = prev?.matchAll(getMatchRegex(prev));
const matches = prev?.matchAll(tagRegexp);
const [match] = matches ? Array.from(matches) : [];
const [, , , matchTagValue] = match;
const data = parse(matchTagValue).data.flat();
Expand Down
12 changes: 0 additions & 12 deletions frontend/src/hooks/queryBuilder/useOperatorType.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,35 +8,23 @@ export type OperatorType =

const operatorTypeMapper: Record<string, OperatorType> = {
[OPERATORS.IN]: 'MULTIPLY_VALUE',
[OPERATORS.in]: 'MULTIPLY_VALUE',
[OPERATORS.NIN]: 'MULTIPLY_VALUE',
[OPERATORS.not_in]: 'MULTIPLY_VALUE',
[OPERATORS.EXISTS]: 'NON_VALUE',
[OPERATORS.exists]: 'NON_VALUE',
[OPERATORS.NOT_EXISTS]: 'NON_VALUE',
[OPERATORS.not_exists]: 'NON_VALUE',
[OPERATORS['<=']]: 'SINGLE_VALUE',
[OPERATORS['<']]: 'SINGLE_VALUE',
[OPERATORS['>=']]: 'SINGLE_VALUE',
[OPERATORS['>']]: 'SINGLE_VALUE',
[OPERATORS.LIKE]: 'SINGLE_VALUE',
[OPERATORS.like]: 'SINGLE_VALUE',
[OPERATORS.NLIKE]: 'SINGLE_VALUE',
[OPERATORS.not_like]: 'SINGLE_VALUE',
[OPERATORS.REGEX]: 'SINGLE_VALUE',
[OPERATORS.regex]: 'SINGLE_VALUE',
[OPERATORS.NREGEX]: 'SINGLE_VALUE',
[OPERATORS.nregex]: 'SINGLE_VALUE',
[OPERATORS.CONTAINS]: 'SINGLE_VALUE',
[OPERATORS.contains]: 'SINGLE_VALUE',
[OPERATORS.NOT_CONTAINS]: 'SINGLE_VALUE',
[OPERATORS.not_contains]: 'SINGLE_VALUE',
[OPERATORS['=']]: 'SINGLE_VALUE',
[OPERATORS['!=']]: 'SINGLE_VALUE',
[OPERATORS.HAS]: 'SINGLE_VALUE',
[OPERATORS.has]: 'SINGLE_VALUE',
[OPERATORS.NHAS]: 'SINGLE_VALUE',
[OPERATORS.nhas]: 'SINGLE_VALUE',
};

export const useOperatorType = (operator: string): OperatorType =>
Expand Down
36 changes: 17 additions & 19 deletions frontend/src/hooks/queryBuilder/useOptions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ export const useOptions = (
const getKeyOperatorOptions = useCallback(
(key: string) => {
const operatorsOptions = operators?.map((operator) => ({
value: `${key} ${operator.toLowerCase()} `,
label: `${key} ${operator.toLowerCase()} `,
value: `${key} ${operator} `,
label: `${key} ${operator} `,
}));
if (whereClauseConfig) {
return [
Expand Down Expand Up @@ -148,28 +148,26 @@ export const useOptions = (

return useMemo(
() =>
options
.filter(
(
options.filter(
(option, index, self) =>
index ===
self.findIndex(
(o) => o.label === option.label && o.value === option.value, // to remove duplicate & empty options from list
) && option.value !== '',
)
.map((option) => {
const { tagValue } = getTagToken(searchValue);
if (isMulti) {
return {
...option,
selected: Array.isArray(tagValue)
? tagValue
?.filter((i) => i.trim().replace(/^\s+/, '') === option.value)
?.includes(option.value)
: String(tagValue).includes(option.value),
};
}
return option;
}),
) || []
).map((option) => {
const { tagValue } = getTagToken(searchValue);
if (isMulti) {
return {
...option,
selected: tagValue
.filter((i) => i.trim().replace(/^\s+/, '') === option.value)
.includes(option.value),
};
}
return option;
}),
[isMulti, options, searchValue],
);
};
34 changes: 21 additions & 13 deletions frontend/src/hooks/queryBuilder/useSetCurrentKeyAndOperator.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,32 @@
import { getTagToken } from 'container/QueryBuilder/filters/QueryBuilderSearch/utils';
import { useMemo, useRef } from 'react';
import {
getRemovePrefixFromKey,
getTagToken,
} from 'container/QueryBuilder/filters/QueryBuilderSearch/utils';
import { useMemo } from 'react';
import { BaseAutocompleteData } from 'types/api/queryBuilder/queryAutocompleteResponse';

type ICurrentKeyAndOperator = [string, string, string[]];

export const useSetCurrentKeyAndOperator = (
value: string,
keys: BaseAutocompleteData[],
): ICurrentKeyAndOperator => {
const keyRef = useRef<string>('');
const operatorRef = useRef<string>('');

const result = useMemo(() => {
const [key, operator, result] = useMemo(() => {
let key = '';
let operator = '';
let result: string[] = [];
const { tagKey, tagOperator, tagValue } = getTagToken(value);
const isSuggestKey = keys?.some(
(el) => el?.key === getRemovePrefixFromKey(tagKey),
);
if (isSuggestKey || keys.length === 0) {
key = tagKey || '';
operator = tagOperator || '';
result = tagValue || [];
}

keyRef.current = tagKey || '';
operatorRef.current = tagOperator || '';
result = tagValue || [];

return result;
}, [value]);
return [key, operator, result];
}, [value, keys]);

return [keyRef.current, operatorRef.current, result];
return [key, operator, result];
};
1 change: 0 additions & 1 deletion frontend/src/hooks/queryBuilder/useTag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,6 @@ export const useTag = (
const handleAddTag = useCallback(
(value: string): void => {
const { tagKey } = getTagToken(value);

const [key, id] = tagKey.split('-');

if (id === 'custom') {
Expand Down

0 comments on commit f3c00e1

Please sign in to comment.