Skip to content

Commit db90f37

Browse files
committed
allow passing data view to query bar
1 parent f3b4975 commit db90f37

3 files changed

Lines changed: 90 additions & 16 deletions

File tree

x-pack/solutions/security/plugins/security_solution/public/common/components/query_bar/index.test.tsx

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import { createStubDataView } from '@kbn/data-views-plugin/common/data_view.stub
2121
import { fields } from '@kbn/data-views-plugin/common/mocks';
2222
import { useKibana } from '../../lib/kibana';
2323

24-
const getMockIndexPattern = () => ({
24+
const getMockIndexPattern = (id: string = '1234') => ({
2525
...createStubDataView({
2626
spec: {
27-
id: '1234',
27+
id,
2828
title: 'logstash-*',
2929
fields: ((): DataViewFieldMap => {
3030
const fieldMap: DataViewFieldMap = Object.create(null);
@@ -37,6 +37,8 @@ const getMockIndexPattern = () => ({
3737
}),
3838
});
3939

40+
const mockDataView = getMockIndexPattern('data-view-id');
41+
4042
const mockUiSettingsForFilterManager = coreMock.createStart().uiSettings;
4143
jest.mock('../../lib/kibana');
4244

@@ -86,6 +88,7 @@ describe('QueryBar ', () => {
8688
mockOnChangeQuery.mockClear();
8789
mockOnSubmitQuery.mockClear();
8890
mockOnSavedQuery.mockClear();
91+
mockClearInstanceCache.mockClear();
8992
});
9093

9194
test('check if we format the appropriate props to QueryBar', async () => {
@@ -129,6 +132,69 @@ describe('QueryBar ', () => {
129132
});
130133
});
131134

135+
test('use data view directly if index pattern prop is a data view', async () => {
136+
await act(async () => {
137+
const wrapper = await getWrapper(
138+
<Proxy
139+
dateRangeFrom={DEFAULT_FROM}
140+
dateRangeTo={DEFAULT_TO}
141+
hideSavedQuery={false}
142+
indexPattern={mockDataView}
143+
isRefreshPaused={true}
144+
filterQuery={{ query: 'here: query', language: 'kuery' }}
145+
filterManager={new FilterManager(mockUiSettingsForFilterManager)}
146+
filters={[]}
147+
onChangedQuery={mockOnChangeQuery}
148+
onSubmitQuery={mockOnSubmitQuery}
149+
onSavedQuery={mockOnSavedQuery}
150+
/>
151+
);
152+
153+
await waitFor(() => {
154+
wrapper.update();
155+
const { ...searchBarProps } = wrapper.find(SearchBar).props();
156+
expect((searchBarProps?.indexPatterns ?? [{ id: 'unknown' }])[0].id).toEqual(
157+
mockDataView.id
158+
);
159+
});
160+
161+
wrapper.unmount();
162+
expect(mockClearInstanceCache).not.toHaveBeenCalled();
163+
});
164+
});
165+
166+
test('do not clear cache when preventCacheClearOnUnmount is true', async () => {
167+
await act(async () => {
168+
const wrapper = await getWrapper(
169+
<Proxy
170+
dateRangeFrom={DEFAULT_FROM}
171+
dateRangeTo={DEFAULT_TO}
172+
hideSavedQuery={false}
173+
indexPattern={mockIndexPattern}
174+
isRefreshPaused={true}
175+
filterQuery={{ query: 'here: query', language: 'kuery' }}
176+
filterManager={new FilterManager(mockUiSettingsForFilterManager)}
177+
filters={[]}
178+
onChangedQuery={mockOnChangeQuery}
179+
onSubmitQuery={mockOnSubmitQuery}
180+
onSavedQuery={mockOnSavedQuery}
181+
preventCacheClearOnUnmount={true}
182+
/>
183+
);
184+
185+
await waitFor(() => {
186+
wrapper.update();
187+
const { ...searchBarProps } = wrapper.find(SearchBar).props();
188+
expect((searchBarProps?.indexPatterns ?? [{ id: 'unknown' }])[0].id).toEqual(
189+
getMockIndexPattern().id
190+
);
191+
});
192+
193+
wrapper.unmount();
194+
expect(mockClearInstanceCache).not.toHaveBeenCalled();
195+
});
196+
});
197+
132198
// FLAKY: https://github.com/elastic/kibana/issues/132659
133199
describe.skip('#onQuerySubmit', () => {
134200
test(' is the only reference that changed when filterQuery props get updated', async () => {

x-pack/solutions/security/plugins/security_solution/public/common/components/query_bar/index.tsx

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,14 +20,13 @@ import { Storage } from '@kbn/kibana-utils-plugin/public';
2020
import { css, Global } from '@emotion/react';
2121
import { useKibana } from '../../lib/kibana';
2222
import { convertToQueryType } from './convert_to_query_type';
23-
import { useIsExperimentalFeatureEnabled } from '../../hooks/use_experimental_features';
2423

2524
export interface QueryBarComponentProps {
2625
dataTestSubj?: string;
2726
dateRangeFrom?: string;
2827
dateRangeTo?: string;
2928
hideSavedQuery?: boolean;
30-
indexPattern: DataViewBase;
29+
indexPattern: DataView | DataViewBase;
3130
isLoading?: boolean;
3231
isRefreshPaused?: boolean;
3332
filterQuery: Query;
@@ -41,6 +40,7 @@ export interface QueryBarComponentProps {
4140
displayStyle?: SearchBarProps['displayStyle'];
4241
isDisabled?: boolean;
4342
bubbleSubmitEvent?: boolean;
43+
preventCacheClearOnUnmount?: boolean;
4444
}
4545

4646
export const isDataView = (obj: unknown): obj is DataView =>
@@ -87,8 +87,8 @@ export const QueryBar = memo<QueryBarComponentProps>(
8787
displayStyle,
8888
isDisabled,
8989
bubbleSubmitEvent,
90+
preventCacheClearOnUnmount = false,
9091
}) => {
91-
const newDataViewPickerEnabled = useIsExperimentalFeatureEnabled('newDataViewPickerEnabled');
9292
const { data } = useKibana().services;
9393
const [dataView, setDataView] = useState<DataView>();
9494
const onQuerySubmit = useCallback(
@@ -160,11 +160,11 @@ export const QueryBar = memo<QueryBarComponentProps>(
160160
createDataView();
161161
}
162162
return () => {
163-
if (dv?.id && !newDataViewPickerEnabled) {
163+
if (dv?.id && !preventCacheClearOnUnmount) {
164164
data.dataViews.clearInstanceCache(dv?.id);
165165
}
166166
};
167-
}, [data.dataViews, indexPattern, isEsql, newDataViewPickerEnabled]);
167+
}, [data.dataViews, indexPattern, isEsql, preventCacheClearOnUnmount]);
168168

169169
const searchBarFilters = useMemo(() => {
170170
if (isDataView(indexPattern) || isEsql) {

x-pack/solutions/security/plugins/security_solution/public/timelines/components/timeline/query_bar/index.tsx

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type { FilterManager, SavedQuery, SavedQueryTimeFilter } from '@kbn/data-
1515
import styled from '@emotion/styled';
1616
import type { DataViewSpec } from '@kbn/data-views-plugin/common';
1717
import { useEnableExperimental } from '../../../../common/hooks/use_experimental_features';
18+
import { useDataView } from '../../../../data_view_manager/hooks/use_data_view';
1819
import { useDataViewSpec } from '../../../../data_view_manager/hooks/use_data_view_spec';
1920
import { InputsModelId } from '../../../../common/store/inputs/constants';
2021
import { SourcererScopeName } from '../../../../sourcerer/store/model';
@@ -119,13 +120,21 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
119120
useSourcererDataView(SourcererScopeName.timeline);
120121

121122
const { newDataViewPickerEnabled } = useEnableExperimental();
123+
const { dataView: experimentalDataView } = useDataView(SourcererScopeName.timeline);
122124
const { dataViewSpec: experimentalDataViewSpec } = useDataViewSpec(SourcererScopeName.timeline);
123125
const experimentalBrowserFields = useBrowserFields(SourcererScopeName.timeline);
124126

125127
const dataViewSpec: DataViewSpec = useMemo(
126128
() => (newDataViewPickerEnabled ? experimentalDataViewSpec : oldSourcererDataViewSpec),
127129
[experimentalDataViewSpec, newDataViewPickerEnabled, oldSourcererDataViewSpec]
128130
);
131+
const dataViewBase = useMemo(() => dataViewSpecToViewBase(dataViewSpec), [dataViewSpec]);
132+
const dataView = useMemo(
133+
() =>
134+
newDataViewPickerEnabled && experimentalDataView ? experimentalDataView : dataViewBase,
135+
[newDataViewPickerEnabled, experimentalDataView, dataViewBase]
136+
);
137+
129138
const browserFields = useMemo(
130139
() => (newDataViewPickerEnabled ? experimentalBrowserFields : oldBrowserFields),
131140
[experimentalBrowserFields, newDataViewPickerEnabled, oldBrowserFields]
@@ -138,10 +147,8 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
138147
});
139148
const queryBarFilters = useMemo(() => getNonDropAreaFilters(filters), [filters]);
140149

141-
const indexPattern = useMemo(() => dataViewSpecToViewBase(dataViewSpec), [dataViewSpec]);
142-
143150
const [dataProvidersDsl, setDataProvidersDsl] = useState<string>(
144-
convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), indexPattern)
151+
convertKueryToElasticSearchQuery(buildGlobalQuery(dataProviders, browserFields), dataViewBase)
145152
);
146153
const savedQueryServices = useSavedQueryServices();
147154

@@ -155,11 +162,11 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
155162
kind,
156163
expression,
157164
},
158-
serializedQuery: convertKueryToElasticSearchQuery(expression, indexPattern),
165+
serializedQuery: convertKueryToElasticSearchQuery(expression, dataViewBase),
159166
},
160167
})
161168
),
162-
[dispatch, indexPattern, timelineId]
169+
[dispatch, dataViewBase, timelineId]
163170
);
164171

165172
useEffect(() => {
@@ -173,10 +180,10 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
173180
setDataProvidersDsl(
174181
convertKueryToElasticSearchQuery(
175182
buildGlobalQuery(dataProviders, browserFields),
176-
indexPattern
183+
dataViewBase
177184
)
178185
);
179-
}, [dataProviders, browserFields, indexPattern]);
186+
}, [dataProviders, browserFields, dataViewBase]);
180187

181188
useEffect(() => {
182189
if (fromStr != null && toStr != null) {
@@ -286,7 +293,7 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
286293
[dataProvidersDsl, savedQueryId, savedQueryServices]
287294
);
288295

289-
if (!indexPattern) {
296+
if (!dataView) {
290297
return null;
291298
}
292299

@@ -296,7 +303,7 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
296303
dateRangeFrom={dateRangeFrom}
297304
dateRangeTo={dateRangeTo}
298305
hideSavedQuery={kqlMode === 'search'}
299-
indexPattern={indexPattern}
306+
indexPattern={dataView}
300307
isRefreshPaused={isRefreshPaused}
301308
filterQuery={filterQueryConverted}
302309
filterManager={filterManager}
@@ -307,6 +314,7 @@ export const QueryBarTimeline = memo<QueryBarTimelineComponentProps>(
307314
onSavedQuery={onSavedQuery}
308315
dataTestSubj={'timelineQueryInput'}
309316
displayStyle="inPage"
317+
preventCacheClearOnUnmount={newDataViewPickerEnabled}
310318
/>
311319
</SearchBarContainer>
312320
);

0 commit comments

Comments
 (0)