diff --git a/src/plugins/data/common/search/aggs/agg_type.ts b/src/plugins/data/common/search/aggs/agg_type.ts index 3ffac0c12eb2248..4f4a593764b1e8a 100644 --- a/src/plugins/data/common/search/aggs/agg_type.ts +++ b/src/plugins/data/common/search/aggs/agg_type.ts @@ -54,7 +54,7 @@ export interface AggTypeConfig< aggConfigs: IAggConfigs, aggConfig: TAggConfig, searchSource: ISearchSource, - inspectorRequestAdapter: RequestAdapter, + inspectorRequestAdapter?: RequestAdapter, abortSignal?: AbortSignal ) => Promise; getSerializedFormat?: (agg: TAggConfig) => SerializedFieldFormat; @@ -189,7 +189,7 @@ export class AggType< aggConfigs: IAggConfigs, aggConfig: TAggConfig, searchSource: ISearchSource, - inspectorRequestAdapter: RequestAdapter, + inspectorRequestAdapter?: RequestAdapter, abortSignal?: AbortSignal ) => Promise; /** diff --git a/src/plugins/data/common/search/aggs/buckets/terms.ts b/src/plugins/data/common/search/aggs/buckets/terms.ts index 3d543e6c5f57458..ac65e7fa813b3d4 100644 --- a/src/plugins/data/common/search/aggs/buckets/terms.ts +++ b/src/plugins/data/common/search/aggs/buckets/terms.ts @@ -19,6 +19,7 @@ import { noop } from 'lodash'; import { i18n } from '@kbn/i18n'; +import type { RequestAdapter } from 'src/plugins/inspector/common'; import { BucketAggType, IBucketAggConfig } from './bucket_agg_type'; import { BUCKET_TYPES } from './bucket_agg_types'; @@ -111,27 +112,32 @@ export const getTermsBucketAgg = () => nestedSearchSource.setField('aggs', filterAgg); - const request = inspectorRequestAdapter.start( - i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', { - defaultMessage: 'Other bucket', - }), - { - description: i18n.translate('data.search.aggs.buckets.terms.otherBucketDescription', { - defaultMessage: - 'This request counts the number of documents that fall ' + - 'outside the criterion of the data buckets.', + let request: ReturnType | undefined; + if (inspectorRequestAdapter) { + request = inspectorRequestAdapter.start( + i18n.translate('data.search.aggs.buckets.terms.otherBucketTitle', { + defaultMessage: 'Other bucket', }), - } - ); - nestedSearchSource.getSearchRequestBody().then((body) => { - request.json(body); - }); - request.stats(getRequestInspectorStats(nestedSearchSource)); + { + description: i18n.translate('data.search.aggs.buckets.terms.otherBucketDescription', { + defaultMessage: + 'This request counts the number of documents that fall ' + + 'outside the criterion of the data buckets.', + }), + } + ); + nestedSearchSource.getSearchRequestBody().then((body) => { + request!.json(body); + }); + request.stats(getRequestInspectorStats(nestedSearchSource)); + } const response = await nestedSearchSource.fetch({ abortSignal }); - request - .stats(getResponseInspectorStats(response, nestedSearchSource)) - .ok({ json: response }); + if (request) { + request + .stats(getResponseInspectorStats(response, nestedSearchSource)) + .ok({ json: response }); + } resp = mergeOtherBucketAggResponse(aggConfigs, resp, response, aggConfig, filterAgg()); } if (aggConfig.params.missingBucket) { diff --git a/src/plugins/data/public/search/expressions/esaggs/build_tabular_inspector_data.ts b/src/plugins/data/public/search/expressions/esaggs/build_tabular_inspector_data.ts index 2ffcaa6954c0748..e0203eaf4f8c2fc 100644 --- a/src/plugins/data/public/search/expressions/esaggs/build_tabular_inspector_data.ts +++ b/src/plugins/data/public/search/expressions/esaggs/build_tabular_inspector_data.ts @@ -37,11 +37,11 @@ import { createFilter } from '../create_filter'; export async function buildTabularInspectorData( table: TabbedTable, { + addFilters, deserializeFieldFormat, - queryFilter, }: { + addFilters?: FilterManager['addFilters']; deserializeFieldFormat: FormatFactory; - queryFilter?: Pick; } ): Promise { const aggConfigs = table.columns.map((column) => column.aggConfig); @@ -71,7 +71,7 @@ export async function buildTabularInspectorData( name: col.name, field: `col-${colIndex}-${col.aggConfig.id}`, filter: - queryFilter && + addFilters && isCellContentFilterable && ((value: TabularDataValue) => { const rowIndex = rows.findIndex( @@ -80,11 +80,11 @@ export async function buildTabularInspectorData( const filter = createFilter(aggConfigs, table, colIndex, rowIndex, value.raw); if (filter) { - queryFilter.addFilters(filter); + addFilters(filter); } }), filterOut: - queryFilter && + addFilters && isCellContentFilterable && ((value: TabularDataValue) => { const rowIndex = rows.findIndex( @@ -100,7 +100,7 @@ export async function buildTabularInspectorData( } else { set(filter, 'meta.negate', notOther && notMissing); } - queryFilter.addFilters(filter); + addFilters(filter); } }), }; diff --git a/src/plugins/data/public/search/expressions/esaggs/esaggs_fn.ts b/src/plugins/data/public/search/expressions/esaggs/esaggs_fn.ts index 35b3d9fbbd9fb98..80c718c401d2025 100644 --- a/src/plugins/data/public/search/expressions/esaggs/esaggs_fn.ts +++ b/src/plugins/data/public/search/expressions/esaggs/esaggs_fn.ts @@ -90,19 +90,20 @@ export const esaggs = (): EsaggsExpressionFunctionDefinition => ({ const resolvedTimeRange = input?.timeRange && calculateBounds(input.timeRange); const response = await handleRequest({ - searchSource, + abortSignal: (abortSignal as unknown) as AbortSignal, + addFilters: filterManager.addFilters, aggs, - indexPattern, - timeRange: get(input, 'timeRange', undefined), - query: get(input, 'query', undefined) as any, + deserializeFieldFormat: getFieldFormats().deserialize, filters: get(input, 'filters', undefined), - timeFields: args.timeFields, + indexPattern, + inspectorAdapters: inspectorAdapters as Adapters, metricsAtAllLevels: args.metricsAtAllLevels, partialRows: args.partialRows, - inspectorAdapters: inspectorAdapters as Adapters, - filterManager, - abortSignal: (abortSignal as unknown) as AbortSignal, + query: get(input, 'query', undefined) as any, searchSessionId: getSearchSessionId(), + searchSource, + timeFields: args.timeFields, + timeRange: get(input, 'timeRange', undefined), }); const table: Datatable = { diff --git a/src/plugins/data/public/search/expressions/esaggs/request_handler.ts b/src/plugins/data/public/search/expressions/esaggs/request_handler.ts index 1eba6134e47eaf6..25606798bdec805 100644 --- a/src/plugins/data/public/search/expressions/esaggs/request_handler.ts +++ b/src/plugins/data/public/search/expressions/esaggs/request_handler.ts @@ -43,6 +43,7 @@ import { buildTabularInspectorData } from './build_tabular_inspector_data'; interface RequestHandlerParams { abortSignal?: AbortSignal; + addFilters?: FilterManager['addFilters']; aggs: IAggConfigs; deserializeFieldFormat: FormatFactory; filters?: Filter[]; @@ -51,7 +52,6 @@ interface RequestHandlerParams { metricsAtAllLevels?: boolean; partialRows?: boolean; query?: Query; - queryFilter?: Pick; searchSessionId?: string; searchSource: ISearchSource; timeFields?: string[]; @@ -60,6 +60,7 @@ interface RequestHandlerParams { export const handleRequest = async ({ abortSignal, + addFilters, aggs, deserializeFieldFormat, filters, @@ -68,7 +69,6 @@ export const handleRequest = async ({ metricsAtAllLevels, partialRows, query, - queryFilter, searchSessionId, searchSource, timeFields, @@ -124,20 +124,23 @@ export const handleRequest = async ({ requestSearchSource.setField('filter', filters); requestSearchSource.setField('query', query); - inspectorAdapters.requests.reset(); - const request = inspectorAdapters.requests.start( - i18n.translate('data.functions.esaggs.inspector.dataRequest.title', { - defaultMessage: 'Data', - }), - { - description: i18n.translate('data.functions.esaggs.inspector.dataRequest.description', { - defaultMessage: - 'This request queries Elasticsearch to fetch the data for the visualization.', + let request; + if (inspectorAdapters.requests) { + inspectorAdapters.requests.reset(); + request = inspectorAdapters.requests.start( + i18n.translate('data.functions.esaggs.inspector.dataRequest.title', { + defaultMessage: 'Data', }), - searchSessionId, - } - ); - request.stats(getRequestInspectorStats(requestSearchSource)); + { + description: i18n.translate('data.functions.esaggs.inspector.dataRequest.description', { + defaultMessage: + 'This request queries Elasticsearch to fetch the data for the visualization.', + }), + searchSessionId, + } + ); + request.stats(getRequestInspectorStats(requestSearchSource)); + } try { const response = await requestSearchSource.fetch({ @@ -145,16 +148,22 @@ export const handleRequest = async ({ sessionId: searchSessionId, }); - request.stats(getResponseInspectorStats(response, searchSource)).ok({ json: response }); + if (request) { + request.stats(getResponseInspectorStats(response, searchSource)).ok({ json: response }); + } (searchSource as any).rawResponse = response; } catch (e) { // Log any error during request to the inspector - request.error({ json: e }); + if (request) { + request.error({ json: e }); + } throw e; } finally { // Add the request body no matter if things went fine or not - request.json(await requestSearchSource.getSearchRequestBody()); + if (request) { + request.json(await requestSearchSource.getSearchRequestBody()); + } } // Note that rawResponse is not deeply cloned here, so downstream applications using courier @@ -185,14 +194,16 @@ export const handleRequest = async ({ const tabifiedResponse = tabifyAggResponse(aggs, response, tabifyParams); - inspectorAdapters.data.setTabularLoader( - () => - buildTabularInspectorData(tabifiedResponse, { - queryFilter, - deserializeFieldFormat, - }), - { returnsFormattedValues: true } - ); + if (inspectorAdapters.data) { + inspectorAdapters.data.setTabularLoader( + () => + buildTabularInspectorData(tabifiedResponse, { + addFilters, + deserializeFieldFormat, + }), + { returnsFormattedValues: true } + ); + } return tabifiedResponse; }; diff --git a/src/plugins/discover/public/application/embeddable/search_embeddable.ts b/src/plugins/discover/public/application/embeddable/search_embeddable.ts index 170078076ec6f40..980e90d0acf200f 100644 --- a/src/plugins/discover/public/application/embeddable/search_embeddable.ts +++ b/src/plugins/discover/public/application/embeddable/search_embeddable.ts @@ -84,7 +84,7 @@ export class SearchEmbeddable private readonly savedSearch: SavedSearch; private $rootScope: ng.IRootScopeService; private $compile: ng.ICompileService; - private inspectorAdaptors: Adapters; + private inspectorAdapters: Adapters; private searchScope?: SearchScope; private panelTitle: string = ''; private filtersSearchSource?: ISearchSource; @@ -131,7 +131,7 @@ export class SearchEmbeddable this.savedSearch = savedSearch; this.$rootScope = $rootScope; this.$compile = $compile; - this.inspectorAdaptors = { + this.inspectorAdapters = { requests: new RequestAdapter(), }; this.initializeSearchScope(); @@ -150,7 +150,7 @@ export class SearchEmbeddable } public getInspectorAdapters() { - return this.inspectorAdaptors; + return this.inspectorAdapters; } public getSavedSearch() { @@ -195,7 +195,7 @@ export class SearchEmbeddable const searchScope: SearchScope = (this.searchScope = this.$rootScope.$new()); searchScope.description = this.savedSearch.description; - searchScope.inspectorAdapters = this.inspectorAdaptors; + searchScope.inspectorAdapters = this.inspectorAdapters; const { searchSource } = this.savedSearch; const indexPattern = (searchScope.indexPattern = searchSource.getField('index'))!; @@ -287,7 +287,7 @@ export class SearchEmbeddable ); // Log request to inspector - this.inspectorAdaptors.requests.reset(); + this.inspectorAdapters.requests!.reset(); const title = i18n.translate('discover.embeddable.inspectorRequestDataTitle', { defaultMessage: 'Data', }); @@ -295,7 +295,7 @@ export class SearchEmbeddable defaultMessage: 'This request queries Elasticsearch to fetch the data for the search.', }); - const inspectorRequest = this.inspectorAdaptors.requests.start(title, { + const inspectorRequest = this.inspectorAdapters.requests!.start(title, { description, searchSessionId, }); diff --git a/src/plugins/inspector/common/adapters/types.ts b/src/plugins/inspector/common/adapters/types.ts index 1726134f8e67cc2..b51c3e56c749f74 100644 --- a/src/plugins/inspector/common/adapters/types.ts +++ b/src/plugins/inspector/common/adapters/types.ts @@ -24,7 +24,7 @@ import type { RequestAdapter } from './request'; * The interface that the adapters used to open an inspector have to fullfill. */ export interface Adapters { - data: DataAdapter; - requests: RequestAdapter; + data?: DataAdapter; + requests?: RequestAdapter; [key: string]: any; } diff --git a/src/plugins/inspector/public/test/is_available.test.ts b/src/plugins/inspector/public/test/is_available.test.ts index 0604129a0734ace..c38d9d7a3f825f1 100644 --- a/src/plugins/inspector/public/test/is_available.test.ts +++ b/src/plugins/inspector/public/test/is_available.test.ts @@ -18,8 +18,7 @@ */ import { inspectorPluginMock } from '../mocks'; -import { DataAdapter } from '../../common/adapters/data/data_adapter'; -import { RequestAdapter } from '../../common/adapters/request/request_adapter'; +import { DataAdapter, RequestAdapter } from '../../common/adapters'; const adapter1 = new DataAdapter(); const adapter2 = new RequestAdapter(); diff --git a/src/plugins/inspector/public/views/data/components/data_view.tsx b/src/plugins/inspector/public/views/data/components/data_view.tsx index ea4b1a004977a0d..324094d8f93d05b 100644 --- a/src/plugins/inspector/public/views/data/components/data_view.tsx +++ b/src/plugins/inspector/public/views/data/components/data_view.tsx @@ -73,7 +73,7 @@ class DataViewComponent extends Component { - const requests = this.props.adapters.requests.getRequests(); + const requests = this.props.adapters.requests!.getRequests(); const newState = { requests } as RequestSelectorState; - if (!requests.includes(this.state.request)) { + if (!this.state.request || !requests.includes(this.state.request)) { newState.request = requests.length ? requests[0] : null; } this.setState(newState); @@ -69,7 +69,7 @@ export class RequestsViewComponent extends Component - - + {this.state.request && ( + <> + + + + )} {this.state.request && this.state.request.description && ( diff --git a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts index 68b6b131978ea55..6c02a63ad40ee9b 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.ts @@ -125,7 +125,7 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource destroy() { const inspectorAdapters = this.getInspectorAdapters(); - if (inspectorAdapters) { + if (inspectorAdapters?.requests) { inspectorAdapters.requests.resetRequest(this.getId()); } } @@ -155,7 +155,7 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource const inspectorAdapters = this.getInspectorAdapters(); let inspectorRequest: RequestResponder | undefined; - if (inspectorAdapters) { + if (inspectorAdapters?.requests) { inspectorRequest = inspectorAdapters.requests.start(requestName, { id: requestId, description: requestDescription,