[Text-based languages] Hides generated adhoc dataviews from the picker (#158898)

## Summary

Closes https://github.com/elastic/kibana/issues/158894

Now there is no connection between dataviews and text based mode. In the
background we still creating adhoc dataviews but this is because of our
architecture and not something we want to propagate to the users. For
this reason we hide these dataviews from the dataview picker for the
text based mode

<img width="859" alt="image"
src="0b4f1a69-3218-45bd-8001-1682ab0f7a20">
This commit is contained in:
Stratoula Kalafateli 2023-06-06 17:48:45 +03:00 committed by GitHub
parent 8277665dbc
commit 22b438b218
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 187 additions and 1 deletions

View file

@ -15,6 +15,8 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public';
import { dataPluginMock } from '@kbn/data-plugin/public/mocks';
import { indexPatternEditorPluginMock as dataViewEditorPluginMock } from '@kbn/data-view-editor-plugin/public/mocks';
import { ChangeDataView } from './change_dataview';
import { DataViewSelector } from './data_view_selector';
import { dataViewMock } from './mocks/dataview';
import { DataViewPickerPropsExtended, TextBasedLanguages } from './data_view_picker';
describe('DataView component', () => {
@ -162,4 +164,64 @@ describe('DataView component', () => {
component.find('[data-test-subj="dataview-create-new"]').first().simulate('click');
expect(props.onTextLangQuerySubmit).toHaveBeenCalled();
});
it('should not propagate the adHoc dataviews for text based mode', async () => {
const component = mount(
wrapDataViewComponentInContext(
{
...props,
onDataViewCreated: jest.fn(),
textBasedLanguages: [TextBasedLanguages.ESQL, TextBasedLanguages.SQL],
textBasedLanguage: TextBasedLanguages.ESQL,
savedDataViews: [
{
id: 'dataview-1',
title: 'dataview-1',
},
],
adHocDataViews: [dataViewMock],
},
false
)
);
findTestSubject(component, 'dataview-trigger').simulate('click');
expect(component.find(DataViewSelector).prop('dataViewsList')).toStrictEqual([
{
id: 'dataview-1',
title: 'dataview-1',
},
]);
});
it('should propagate the adHoc dataviews for dataview mode', async () => {
const component = mount(
wrapDataViewComponentInContext(
{
...props,
onDataViewCreated: jest.fn(),
savedDataViews: [
{
id: 'dataview-1',
title: 'dataview-1',
},
],
adHocDataViews: [dataViewMock],
},
false
)
);
findTestSubject(component, 'dataview-trigger').simulate('click');
expect(component.find(DataViewSelector).prop('dataViewsList')).toStrictEqual([
{
id: 'dataview-1',
title: 'dataview-1',
},
{
id: 'the-data-view-id',
title: 'the-data-view-title',
name: 'the-data-view',
isAdhoc: true,
},
]);
});
});

View file

@ -111,8 +111,9 @@ export function ChangeDataView({
const savedDataViewRefs: DataViewListItemEnhanced[] = savedDataViews
? savedDataViews
: await data.dataViews.getIdsWithTitle();
// not propagate the adHoc dataviews on the list for text based languages
const adHocDataViewRefs: DataViewListItemEnhanced[] =
adHocDataViews?.map(mapAdHocDataView) || [];
(!isTextBasedLangSelected && adHocDataViews?.map(mapAdHocDataView)) || [];
setDataViewsList(savedDataViewRefs.concat(adHocDataViewRefs));
};

View file

@ -0,0 +1,123 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { DataView } from '@kbn/data-views-plugin/public';
const fields = [
{
name: '_source',
type: '_source',
scripted: false,
filterable: false,
aggregatable: false,
},
{
name: '_index',
type: 'string',
scripted: false,
filterable: true,
aggregatable: false,
},
{
name: 'message',
type: 'string',
displayName: 'message',
scripted: false,
filterable: false,
aggregatable: false,
},
{
name: 'extension',
type: 'string',
displayName: 'extension',
scripted: false,
filterable: true,
aggregatable: true,
},
{
name: 'bytes',
type: 'number',
displayName: 'bytesDisplayName',
scripted: false,
filterable: true,
aggregatable: true,
sortable: true,
},
{
name: 'scripted',
type: 'number',
displayName: 'scripted',
scripted: true,
filterable: false,
},
{
name: 'object.value',
type: 'number',
displayName: 'object.value',
scripted: false,
filterable: true,
aggregatable: true,
},
{
name: '@timestamp',
type: 'date',
displayName: '@timestamp',
scripted: false,
filterable: true,
aggregatable: true,
},
] as DataView['fields'];
export const buildDataViewMock = ({
name,
fields: definedFields,
timeFieldName,
}: {
name: string;
fields: DataView['fields'];
timeFieldName?: string;
}): DataView => {
const dataViewFields = [...definedFields] as DataView['fields'];
dataViewFields.getByName = (fieldName: string) => {
return dataViewFields.find((field) => field.name === fieldName);
};
dataViewFields.getAll = () => {
return dataViewFields;
};
const dataView = {
id: `${name}-id`,
title: `${name}-title`,
name,
metaFields: ['_index', '_score'],
fields: dataViewFields,
type: 'default',
getName: () => name,
getComputedFields: () => ({ docvalueFields: [], scriptFields: {}, storedFields: ['*'] }),
getSourceFiltering: () => ({}),
getIndexPattern: () => `${name}-title`,
getFieldByName: jest.fn((fieldName: string) => dataViewFields.getByName(fieldName)),
timeFieldName: timeFieldName || '',
docvalueFields: [],
getFormatterForField: jest.fn(() => ({ convert: (value: unknown) => value })),
isTimeNanosBased: () => false,
isPersisted: () => false,
toSpec: () => ({}),
getTimeField: () => {
return dataViewFields.find((field) => field.name === timeFieldName);
},
} as unknown as DataView;
dataView.isTimeBased = () => !!timeFieldName;
return dataView;
};
export const dataViewMock = buildDataViewMock({ name: 'the-data-view', fields });