Skip to content

Commit d8e937d

Browse files
authored
Fix BWC for custom & simple filters (opensearch-project#68)
Signed-off-by: Tyler Ohlsen <ohltyler@amazon.com>
1 parent 446ae6b commit d8e937d

File tree

9 files changed

+180
-315
lines changed

9 files changed

+180
-315
lines changed

public/pages/DefineDetector/components/DataFilterList/DataFilterList.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,16 @@ import { FieldArray, FieldArrayRenderProps, FormikProps } from 'formik';
3636
import React, { useState, Fragment } from 'react';
3737
import { get } from 'lodash';
3838
import { DetectorDefinitionFormikValues } from '../../models/interfaces';
39-
import { UIFilter } from '../../../../models/interfaces';
39+
import { UIFilter, FILTER_TYPES } from '../../../../models/interfaces';
4040
import { DataFilter } from './components/DataFilter';
4141

4242
import { FormattedFormRow } from '../../../../components/FormattedFormRow/FormattedFormRow';
4343
import { EMPTY_UI_FILTER } from '../../utils/constants';
4444

4545
interface DataFilterListProps {
4646
formikProps: FormikProps<DetectorDefinitionFormikValues>;
47+
oldFilterType: FILTER_TYPES;
48+
oldFilterQuery: any;
4749
}
4850

4951
export const DataFilterList = (props: DataFilterListProps) => {
@@ -138,6 +140,8 @@ export const DataFilterList = (props: DataFilterListProps) => {
138140
? true
139141
: false
140142
}
143+
oldFilterType={props.oldFilterType}
144+
oldFilterQuery={props.oldFilterQuery}
141145
/>
142146
);
143147
})}

public/pages/DefineDetector/components/DataFilterList/components/DataFilter.tsx

+24-4
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ interface DataFilterProps {
6161
openPopoverIndex: number;
6262
setOpenPopoverIndex(index: number): void;
6363
isNewFilter: boolean;
64+
oldFilterType: FILTER_TYPES;
65+
oldFilterQuery: any;
6466
}
6567

6668
export const DataFilter = (props: DataFilterProps) => {
@@ -70,7 +72,9 @@ export const DataFilter = (props: DataFilterProps) => {
7072
const [isClosing, setIsClosing] = useState<boolean>(false);
7173
const [origFilter, setOrigFilter] = useState<UIFilter | undefined>(undefined);
7274
const [filterType, setFilterType] = useState<FILTER_TYPES>(
73-
get(props, 'filter.filterType', FILTER_TYPES.SIMPLE)
75+
props.oldFilterType !== undefined
76+
? props.oldFilterType
77+
: get(props, 'filter.filterType', FILTER_TYPES.SIMPLE)
7478
);
7579
const [isCustomLabel, setIsCustomLabel] = useState<boolean>(false);
7680
const [customLabel, setCustomLabel] = useState<string>(
@@ -87,7 +91,11 @@ export const DataFilter = (props: DataFilterProps) => {
8791
setIsSaving(false);
8892
setIsClosing(false);
8993
setOrigFilter(props.filter);
90-
setFilterType(get(props, 'filter.filterType', FILTER_TYPES.SIMPLE));
94+
setFilterType(
95+
props.oldFilterType !== undefined
96+
? props.oldFilterType
97+
: get(props, 'filter.filterType', FILTER_TYPES.SIMPLE)
98+
);
9199
setIsCustomLabel(get(props, 'filter.label', '').length > 0);
92100
setCustomLabel(get(props, 'filter.label', ''));
93101
};
@@ -140,7 +148,13 @@ export const DataFilter = (props: DataFilterProps) => {
140148
if (isCustomLabel && customLabel.length > 0) {
141149
setLabelToDisplay(customLabel);
142150
} else {
143-
setLabelToDisplay(getFilterLabel(props.filter));
151+
setLabelToDisplay(
152+
getFilterLabel(
153+
props.filter,
154+
props.oldFilterType,
155+
props.oldFilterQuery
156+
)
157+
);
144158
}
145159
}
146160
}, [isClosing]);
@@ -153,7 +167,13 @@ export const DataFilter = (props: DataFilterProps) => {
153167
//@ts-ignore
154168
setLabelToDisplay(props.filter.label);
155169
} else {
156-
setLabelToDisplay(getFilterLabel(props.filter));
170+
setLabelToDisplay(
171+
getFilterLabel(
172+
props.filter,
173+
props.oldFilterType,
174+
props.oldFilterQuery
175+
)
176+
);
157177
}
158178
}
159179
}, [props.filter]);

public/pages/DefineDetector/components/DataFilterList/utils/helpers.ts

+9-2
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,17 @@ export const validateFilterQuery = (value: string) => {
123123
}
124124
};
125125

126-
export const getFilterLabel = (filter: UIFilter) => {
127-
return filter.filterType === FILTER_TYPES.SIMPLE
126+
export const getFilterLabel = (
127+
filter: UIFilter,
128+
oldFilterType: FILTER_TYPES,
129+
oldFilterQuery: any
130+
) => {
131+
return filter.filterType === FILTER_TYPES.SIMPLE ||
132+
oldFilterType === FILTER_TYPES.SIMPLE
128133
? displayText(filter)
129134
: !isEmpty(filter.query)
130135
? filter.query
136+
: !isEmpty(oldFilterQuery)
137+
? oldFilterQuery
131138
: 'Custom query';
132139
};

public/pages/DefineDetector/components/Datasource/DataSource.tsx

+8-1
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,16 @@ import { FormattedFormRow } from '../../../../components/FormattedFormRow/Format
4646
import { DetectorDefinitionFormikValues } from '../../models/interfaces';
4747
import { ModelConfigurationFormikValues } from '../../../ConfigureModel/models/interfaces';
4848
import { INITIAL_MODEL_CONFIGURATION_VALUES } from '../../../ConfigureModel/utils/constants';
49+
import { FILTER_TYPES } from '../../../../models/interfaces';
4950

5051
interface DataSourceProps {
5152
formikProps: FormikProps<DetectorDefinitionFormikValues>;
5253
origIndex: string;
5354
isEdit: boolean;
5455
setModelConfigValues?(initialValues: ModelConfigurationFormikValues): void;
5556
setNewIndexSelected?(isNew: boolean): void;
57+
oldFilterType: FILTER_TYPES;
58+
oldFilterQuery: any;
5659
}
5760

5861
export function DataSource(props: DataSourceProps) {
@@ -171,7 +174,11 @@ export function DataSource(props: DataSourceProps) {
171174
);
172175
}}
173176
</Field>
174-
<DataFilterList formikProps={props.formikProps} />
177+
<DataFilterList
178+
formikProps={props.formikProps}
179+
oldFilterType={props.oldFilterType}
180+
oldFilterQuery={props.oldFilterQuery}
181+
/>
175182
</ContentPanel>
176183
);
177184
}

public/pages/DefineDetector/containers/DefineDetector.tsx

+21-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ import {
6060
clearModelConfiguration,
6161
} from '../utils/helpers';
6262
import { DetectorDefinitionFormikValues } from '../models/interfaces';
63-
import { Detector } from '../../../models/interfaces';
63+
import { Detector, FILTER_TYPES } from '../../../models/interfaces';
6464
import { prettifyErrorMessage } from '../../../../server/utils/helpers';
6565
import { DETECTOR_STATE } from '../../../../server/utils/constants';
6666
import { ModelConfigurationFormikValues } from 'public/pages/ConfigureModel/models/interfaces';
@@ -86,6 +86,24 @@ export const DefineDetector = (props: DefineDetectorProps) => {
8686
const { detector, hasError } = useFetchDetectorInfo(detectorId);
8787
const [newIndexSelected, setNewIndexSelected] = useState<boolean>(false);
8888

89+
// To handle backward compatibility, we need to pass some fields via
90+
// props to the subcomponents so they can render correctly
91+
//
92+
// oldFilterType: there used to only be one filter type per detector.
93+
// Now, the filter type is on a per-filter granularity, and each type
94+
// is stored within each filter in the filters array.
95+
//
96+
// oldFilterQuery: the custom filter query used to be stored here.
97+
// Now, the same field is repurposed in the new changes, but has a different meaning,
98+
// since it is a dynamically built query based on each individually-created filter.
99+
// See formikToFilterQuery() in public/pages/ReviewAndCreate/utils/helpers.ts for details.
100+
const oldFilterType = get(
101+
detector,
102+
'uiMetadata.filterType',
103+
undefined
104+
) as FILTER_TYPES;
105+
const oldFilterQuery = get(detector, 'filterQuery', undefined);
106+
89107
// Jump to top of page on first load
90108
useEffect(() => {
91109
scroll(0, 0);
@@ -256,6 +274,8 @@ export const DefineDetector = (props: DefineDetectorProps) => {
256274
isEdit={props.isEdit}
257275
setModelConfigValues={props.setModelConfigValues}
258276
setNewIndexSelected={setNewIndexSelected}
277+
oldFilterType={oldFilterType}
278+
oldFilterQuery={oldFilterQuery}
259279
/>
260280
<EuiSpacer />
261281
<Timestamp formikProps={formikProps} />

public/pages/DefineDetector/utils/helpers.ts

+28-17
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,8 @@ export function filtersToFormik(detector: Detector): UIFilter[] {
6767
const noMetadata =
6868
get(detector, 'uiMetadata.filterType') === undefined &&
6969
get(detector, 'uiMetadata.filters') === undefined;
70+
const isOldDetector = get(detector, 'uiMetadata.filterType') !== undefined;
71+
7072
if (noMetadata) {
7173
return [
7274
{
@@ -82,23 +84,32 @@ export function filtersToFormik(detector: Detector): UIFilter[] {
8284

8385
const curFilterType = get(detector, 'uiMetadata.filterType');
8486
const curFilters = get(detector, 'uiMetadata.filters', []);
85-
const curFilterQuery = JSON.stringify(
86-
get(detector, 'filterQuery', { match_all: {} }),
87-
null,
88-
4
89-
);
9087

91-
// If this is an old detector (has a base filter type): modify it by injecting that
92-
// filter type into each existing filter
93-
if (curFilterType !== undefined) {
94-
curFilters.forEach((filter: UIFilter) => {
95-
return {
96-
...filter,
97-
filterType: curFilterType,
98-
query:
99-
curFilterType === FILTER_TYPES.CUSTOM ? curFilterQuery : undefined,
100-
};
101-
});
88+
// If this is an old detector:
89+
// If filters is empty: it means it was a custom filter. Convert to a single filter array with a
90+
// query value equal to the existing filterQuery
91+
// If a set of simple filters: modify them by injecting the filter type
92+
// into each existing filter
93+
if (isOldDetector) {
94+
if (isEmpty(curFilters)) {
95+
return [
96+
{
97+
filterType: FILTER_TYPES.CUSTOM,
98+
query: JSON.stringify(
99+
get(detector, 'filterQuery', { match_all: {} }),
100+
null,
101+
4
102+
),
103+
},
104+
];
105+
} else {
106+
curFilters.forEach((filter: UIFilter) => {
107+
return {
108+
...filter,
109+
filterType: curFilterType,
110+
};
111+
});
112+
}
102113
}
103114
return curFilters;
104115
}
@@ -114,7 +125,7 @@ export function formikToDetectorDefinition(
114125
indices: formikToIndices(values.index),
115126
filterQuery: formikToFilterQuery(values),
116127
uiMetadata: {
117-
...detector.uiMetadata,
128+
features: get(detector, 'uiMetadata.features', {}),
118129
filters: get(values, 'filters', []),
119130
},
120131
timeField: values.timeField,

0 commit comments

Comments
 (0)