From a63781a5ea26ef3c25fbf80dfc72a4b04a2be492 Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Thu, 30 Jan 2025 11:14:25 +0100 Subject: [PATCH] [ES|QL] Apply the timerange to the fields fetch in the editor (#208490) ## Summary Provides the timerange in the fetch fields api. This: - fixes the bug where the fields are not suggested when there are system named params such as `_tstart` and `_tend` - makes it more performant as now it checks for fields in the selected timerange making it more performant (especially for data in the frozen tiers) image --- .../kbn-esql-editor/src/esql_editor.test.tsx | 2 ++ .../private/kbn-esql-editor/src/esql_editor.tsx | 14 +++++++++----- .../packages/private/kbn-esql-editor/src/types.ts | 2 ++ .../plugins/shared/esql/public/kibana_services.ts | 4 ++++ src/platform/plugins/shared/esql/public/plugin.ts | 1 + .../control_flyout/value_control_form.test.tsx | 1 + .../.storybook/mock_kibana_services.ts | 2 ++ 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.test.tsx b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.test.tsx index 8d1139f9758aa..20638f73d87fd 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.test.tsx +++ b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.test.tsx @@ -17,6 +17,7 @@ import { ESQLEditor } from './esql_editor'; import type { ESQLEditorProps } from './types'; import { ReactWrapper } from 'enzyme'; import { coreMock } from '@kbn/core/server/mocks'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; describe('ESQLEditor', () => { const uiConfig: Record = {}; @@ -30,6 +31,7 @@ describe('ESQLEditor', () => { client: uiSettings, }, core: coreMock.createStart(), + data: dataPluginMock.createStartContract(), }; function renderESQLEditorComponent(testProps: ESQLEditorProps) { diff --git a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx index 2b8daa75c5d42..8e8552c73aa21 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx +++ b/src/platform/packages/private/kbn-esql-editor/src/esql_editor.tsx @@ -23,7 +23,7 @@ import { isEqual } from 'lodash'; import { CodeEditor, CodeEditorProps } from '@kbn/code-editor'; import type { CoreStart } from '@kbn/core/public'; import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; -import type { AggregateQuery } from '@kbn/es-query'; +import type { AggregateQuery, TimeRange } from '@kbn/es-query'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { ESQLLang, ESQL_LANG_ID, monaco, type ESQLCallbacks } from '@kbn/monaco'; @@ -120,6 +120,7 @@ export const ESQLEditor = memo(function ESQLEditor({ fieldsMetadata, uiSettings, uiActions, + data, } = kibana.services; const variablesService = kibana.services?.esql?.variablesService; @@ -388,7 +389,7 @@ export const ESQLEditor = memo(function ESQLEditor({ const { cache: esqlFieldsCache, memoizedFieldsFromESQL } = useMemo(() => { // need to store the timing of the first request so we can atomically clear the cache per query const fn = memoize( - (...args: [{ esql: string }, ExpressionsStart, undefined, AbortController?]) => ({ + (...args: [{ esql: string }, ExpressionsStart, TimeRange, AbortController?]) => ({ timestamp: Date.now(), result: fetchFieldsFromESQL(...args), }), @@ -422,11 +423,12 @@ export const ESQLEditor = memo(function ESQLEditor({ }; // Check if there's a stale entry and clear it clearCacheWhenOld(esqlFieldsCache, esqlQuery.esql); + const timeRange = data.query.timefilter.timefilter.getTime(); try { const table = await memoizedFieldsFromESQL( esqlQuery, expressions, - undefined, + timeRange, abortController ).result; const columns: ESQLRealField[] = @@ -470,19 +472,21 @@ export const ESQLEditor = memo(function ESQLEditor({ return callbacks; }, [ fieldsMetadata, + kibana.services?.esql?.getJoinIndicesAutocomplete, dataSourcesCache, query.esql, memoizedSources, dataViews, core, esqlFieldsCache, + data.query.timefilter.timefilter, memoizedFieldsFromESQL, expressions, abortController, indexManagementApiService, histogramBarTarget, - variablesService, - kibana.services?.esql?.getJoinIndicesAutocomplete, + variablesService?.esqlVariables, + variablesService?.areSuggestionsEnabled, ]); const queryRunButtonProperties = useMemo(() => { diff --git a/src/platform/packages/private/kbn-esql-editor/src/types.ts b/src/platform/packages/private/kbn-esql-editor/src/types.ts index 9d1128fad4d10..41171606dd7dc 100644 --- a/src/platform/packages/private/kbn-esql-editor/src/types.ts +++ b/src/platform/packages/private/kbn-esql-editor/src/types.ts @@ -16,6 +16,7 @@ import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/publ import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { ESQLControlVariable } from '@kbn/esql-validation-autocomplete'; export interface ESQLEditorProps { @@ -112,6 +113,7 @@ export interface EsqlPluginStartBase { export interface ESQLEditorDeps { core: CoreStart; dataViews: DataViewsPublicPluginStart; + data: DataPublicPluginStart; expressions: ExpressionsStart; storage: Storage; uiActions: UiActionsStart; diff --git a/src/platform/plugins/shared/esql/public/kibana_services.ts b/src/platform/plugins/shared/esql/public/kibana_services.ts index c15ab734a6f47..90925fad54499 100644 --- a/src/platform/plugins/shared/esql/public/kibana_services.ts +++ b/src/platform/plugins/shared/esql/public/kibana_services.ts @@ -14,6 +14,7 @@ import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { IndexManagementPluginSetup } from '@kbn/index-management-shared-types'; import type { FieldsMetadataPublicStart } from '@kbn/fields-metadata-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { UsageCollectionStart } from '@kbn/usage-collection-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import type { EsqlPluginStart } from './plugin'; @@ -23,6 +24,7 @@ export let core: CoreStart; interface ServiceDeps { core: CoreStart; dataViews: DataViewsPublicPluginStart; + data: DataPublicPluginStart; expressions: ExpressionsStart; storage: Storage; uiActions: UiActionsStart; @@ -49,6 +51,7 @@ export const setKibanaServices = ( esql: EsqlPluginStart, kibanaCore: CoreStart, dataViews: DataViewsPublicPluginStart, + data: DataPublicPluginStart, expressions: ExpressionsStart, storage: Storage, uiActions: UiActionsStart, @@ -61,6 +64,7 @@ export const setKibanaServices = ( core, dataViews, expressions, + data, storage, uiActions, indexManagementApiService: indexManagement?.apiService, diff --git a/src/platform/plugins/shared/esql/public/plugin.ts b/src/platform/plugins/shared/esql/public/plugin.ts index 21786e041a8c6..1e16668d1aa37 100755 --- a/src/platform/plugins/shared/esql/public/plugin.ts +++ b/src/platform/plugins/shared/esql/public/plugin.ts @@ -103,6 +103,7 @@ export class EsqlPlugin implements Plugin<{}, EsqlPluginStart> { start, core, dataViews, + data, expressions, storage, uiActions, diff --git a/src/platform/plugins/shared/esql/public/triggers/esql_controls/control_flyout/value_control_form.test.tsx b/src/platform/plugins/shared/esql/public/triggers/esql_controls/control_flyout/value_control_form.test.tsx index fdf026d79cc9f..6a0c3e9e78609 100644 --- a/src/platform/plugins/shared/esql/public/triggers/esql_controls/control_flyout/value_control_form.test.tsx +++ b/src/platform/plugins/shared/esql/public/triggers/esql_controls/control_flyout/value_control_form.test.tsx @@ -56,6 +56,7 @@ describe('ValueControlForm', () => { client: uiSettings, }, core: coreMock.createStart(), + data: dataMock, }; describe('Interval type', () => { diff --git a/x-pack/solutions/observability/plugins/investigate_app/.storybook/mock_kibana_services.ts b/x-pack/solutions/observability/plugins/investigate_app/.storybook/mock_kibana_services.ts index 3cdf520ca648f..3008b131072f6 100644 --- a/x-pack/solutions/observability/plugins/investigate_app/.storybook/mock_kibana_services.ts +++ b/x-pack/solutions/observability/plugins/investigate_app/.storybook/mock_kibana_services.ts @@ -7,6 +7,7 @@ import { setKibanaServices } from '@kbn/esql/public/kibana_services'; import { coreMock } from '@kbn/core/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { expressionsPluginMock } from '@kbn/expressions-plugin/public/mocks'; import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; @@ -46,6 +47,7 @@ setKibanaServices( }, coreMock.createStart(), dataViewPluginMocks.createStartContract(), + dataPluginMock.createStartContract(), expressionsPluginMock.createStartContract(), storage, uiActionsPluginMock.createStartContract()