Compare commits

...

1 Commits

Author SHA1 Message Date
Yunus M
b232a14659 fix: implement tag filter mapping to canonical and deprecated operators 2026-04-28 14:01:50 +05:30
2 changed files with 131 additions and 5 deletions

View File

@@ -51,6 +51,8 @@ import {
getElementFromArray,
getRecordIndex,
getTableColumn,
mapTagFilterToCanonicalOperators,
mapTagFilterToDeprecatedOperators,
getUpdatedRow,
} from './utils';
@@ -104,10 +106,16 @@ function PipelineListsView({
const { notifications } = useNotifications();
const [pipelineSearchValue, setPipelineSearchValue] = useState<string>('');
const [prevPipelineData, setPrevPipelineData] = useState<Array<PipelineData>>(
cloneDeep(pipelineData?.pipelines || []),
cloneDeep(pipelineData?.pipelines || []).map((p) => ({
...p,
filter: mapTagFilterToCanonicalOperators(p.filter),
})),
);
const [currPipelineData, setCurrPipelineData] = useState<Array<PipelineData>>(
cloneDeep(pipelineData?.pipelines || []),
cloneDeep(pipelineData?.pipelines || []).map((p) => ({
...p,
filter: mapTagFilterToCanonicalOperators(p.filter),
})),
);
const [expandedPipelineId, setExpandedPipelineId] = useState<
@@ -179,7 +187,10 @@ function PipelineListsView({
(record: PipelineData) => (): void => {
setActionType(ActionType.EditPipeline);
setSelectedPipelineData(record);
pipelineForm.setFieldsValue(record);
pipelineForm.setFieldsValue({
...record,
filter: mapTagFilterToCanonicalOperators(record.filter),
});
},
[setActionType, pipelineForm],
);
@@ -438,6 +449,7 @@ function PipelineListsView({
const modifiedPipelineData = currPipelineData.map((item: PipelineData) => {
const pipelineData = { ...item };
delete pipelineData?.id;
pipelineData.filter = mapTagFilterToDeprecatedOperators(pipelineData.filter);
return pipelineData;
});
try {
@@ -449,8 +461,12 @@ function PipelineListsView({
setShowSaveButton(undefined);
const pipelinesInDB = response.data?.pipelines || [];
setCurrPipelineData(pipelinesInDB);
setPrevPipelineData(pipelinesInDB);
const canonicalPipelinesInDB = pipelinesInDB.map((p) => ({
...p,
filter: mapTagFilterToCanonicalOperators(p.filter),
}));
setCurrPipelineData(canonicalPipelinesInDB);
setPrevPipelineData(canonicalPipelinesInDB);
// Log modified JSON flattening configurations
const modifiedConfigs = getModifiedJsonFlatteningConfigs();

View File

@@ -1,12 +1,122 @@
import update from 'react-addons-update';
import { TableColumnType as ColumnType } from 'antd';
import { DEPRECATED_OPERATORS } from 'constants/antlrQueryConstants';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import dayjs from 'dayjs';
import { cloneDeep } from 'lodash-es';
import { TagFilter } from 'types/api/queryBuilder/queryBuilderData';
import { ProcessorData } from 'types/api/pipeline/def';
import TableComponents, { Record } from './TableComponents';
function toCanonicalFilterOperator(op: string): string {
const normalized = op.trim();
if (!normalized) {
return normalized;
}
const lower = normalized.toLowerCase();
// Deprecated → canonical (UI/operator-picker format)
switch (lower) {
case DEPRECATED_OPERATORS.NIN:
return 'not in';
case DEPRECATED_OPERATORS.NREGEX:
return 'not regex';
case DEPRECATED_OPERATORS.NLIKE:
return 'not like';
case DEPRECATED_OPERATORS.NILIKE:
return 'not ilike';
case DEPRECATED_OPERATORS.NEXTISTS:
return 'not exists';
case DEPRECATED_OPERATORS.NCONTAINS:
return 'not contains';
case DEPRECATED_OPERATORS.NHAS:
return 'not has';
case DEPRECATED_OPERATORS.NHASANY:
return 'not hasAny';
case DEPRECATED_OPERATORS.NHASALL:
return 'not hasAll';
case DEPRECATED_OPERATORS.REGEX:
return 'regex';
default:
return normalized;
}
}
export function mapTagFilterToCanonicalOperators(filter: TagFilter): TagFilter {
if (!filter?.items?.length) {
return filter;
}
let changed = false;
const items = filter.items.map((item) => {
const nextOp = toCanonicalFilterOperator(item.op || '');
if (nextOp !== item.op) {
changed = true;
return { ...item, op: nextOp };
}
return item;
});
return changed ? { ...filter, items } : filter;
}
function toDeprecatedFilterOperator(op: string): string {
const normalized = op.trim();
if (!normalized) {
return normalized;
}
const lower = normalized.toLowerCase();
// Canonical → deprecated (only where a deprecated token exists)
switch (lower) {
case 'not in':
return DEPRECATED_OPERATORS.NIN;
case 'not regex':
return DEPRECATED_OPERATORS.NREGEX;
case 'not like':
return DEPRECATED_OPERATORS.NLIKE;
case 'not ilike':
return DEPRECATED_OPERATORS.NILIKE;
case 'not exists':
return DEPRECATED_OPERATORS.NEXTISTS;
case 'not contains':
return DEPRECATED_OPERATORS.NCONTAINS;
case 'not has':
return DEPRECATED_OPERATORS.NHAS;
case 'not hasany':
return DEPRECATED_OPERATORS.NHASANY;
case 'not hasall':
return DEPRECATED_OPERATORS.NHASALL;
case 'regex':
return DEPRECATED_OPERATORS.REGEX;
default:
return normalized;
}
}
export function mapTagFilterToDeprecatedOperators(
filter: TagFilter,
): TagFilter {
if (!filter?.items?.length) {
return filter;
}
let changed = false;
const items = filter.items.map((item) => {
const nextOp = toDeprecatedFilterOperator(item.op || '');
if (nextOp !== item.op) {
changed = true;
return { ...item, op: nextOp };
}
return item;
});
return changed ? { ...filter, items } : filter;
}
export function getElementFromArray<T>(
arr: Array<T>,
target: T,