From a16fec4598eae5ca3253c924fa69cf1b50d29e8e Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 23 Nov 2020 17:27:20 +0300 Subject: [PATCH 01/17] [Vega] Filtering is not working Closes: #81738 --- ...public.indexpatternsservice.findbytitle.md | 13 ++++++++ ...lugins-data-public.indexpatternsservice.md | 1 + .../index_patterns/index_patterns.ts | 14 ++++++++ .../data/common/index_patterns/utils.ts | 33 ++++++++----------- src/plugins/data/public/public.api.md | 1 + .../public/metrics_type.ts | 12 +++---- src/plugins/vis_type_vega/public/plugin.ts | 2 -- src/plugins/vis_type_vega/public/services.ts | 11 +------ src/plugins/vis_type_vega/public/vega_type.ts | 24 ++++++++++++++ .../public/vega_visualization.test.js | 3 +- .../public/vega_visualization.ts | 6 ++-- 11 files changed, 76 insertions(+), 44 deletions(-) create mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md new file mode 100644 index 0000000000000..0ce7782d7b93d --- /dev/null +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md @@ -0,0 +1,13 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternsService](./kibana-plugin-plugins-data-public.indexpatternsservice.md) > [findByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md) + +## IndexPatternsService.findByTitle property + +Returns an object matching a given title + +Signature: + +```typescript +findByTitle: (title: string) => Promise; +``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md index 48019fe410b97..ce006a54767d3 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md @@ -23,6 +23,7 @@ export declare class IndexPatternsService | [clearCache](./kibana-plugin-plugins-data-public.indexpatternsservice.clearcache.md) | | (id?: string | undefined) => void | Clear index pattern list cache | | [ensureDefaultIndexPattern](./kibana-plugin-plugins-data-public.indexpatternsservice.ensuredefaultindexpattern.md) | | EnsureDefaultIndexPattern | | | [fieldArrayToMap](./kibana-plugin-plugins-data-public.indexpatternsservice.fieldarraytomap.md) | | (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record<string, FieldSpec> | Converts field array to map | +| [findByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md) | | (title: string) => Promise<IndexPattern | undefined> | Returns an object matching a given title | | [get](./kibana-plugin-plugins-data-public.indexpatternsservice.get.md) | | (id: string) => Promise<IndexPattern> | Get an index pattern by id. Cache optimized | | [getCache](./kibana-plugin-plugins-data-public.indexpatternsservice.getcache.md) | | () => Promise<SavedObject<IndexPatternSavedObjectAttrs>[] | null | undefined> | | | [getDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefault.md) | | () => Promise<IndexPattern | null> | Get default index pattern | diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 82c8cf4abc5ac..95dfe228e210b 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -154,6 +154,20 @@ export class IndexPatternsService { })); }; + /** + * Returns an object matching a given title + * + * @param title {string} + * @returns {Promise} + */ + findByTitle = async (title: string) => { + const savedObject = await findByTitle(this.savedObjectsClient, title); + + if (savedObject?.id) { + return this.get(savedObject?.id); + } + }; + /** * Clear index pattern list cache * @param id optionally clear a single id diff --git a/src/plugins/data/common/index_patterns/utils.ts b/src/plugins/data/common/index_patterns/utils.ts index d9e1cfa0d952a..11501f5a4bbf5 100644 --- a/src/plugins/data/common/index_patterns/utils.ts +++ b/src/plugins/data/common/index_patterns/utils.ts @@ -27,24 +27,19 @@ import { SavedObjectsClientCommon, SavedObject } from '..'; * @param title {string} * @returns {Promise} */ -export async function findByTitle( - client: SavedObjectsClientCommon, - title: string -): Promise | void> { - if (!title) { - return Promise.resolve(); - } - - const savedObjects = await client.find({ - type: 'index-pattern', - perPage: 10, - search: `"${title}"`, - searchFields: ['title'], - fields: ['title'], - }); +export async function findByTitle(client: SavedObjectsClientCommon, title: string) { + if (title) { + const savedObjects = await client.find({ + type: 'index-pattern', + perPage: 10, + search: `"${title}"`, + searchFields: ['title'], + fields: ['title'], + }); - return find( - savedObjects, - (obj: SavedObject) => obj.attributes.title.toLowerCase() === title.toLowerCase() - ); + return find( + savedObjects, + (obj: SavedObject) => obj.attributes.title.toLowerCase() === title.toLowerCase() + ); + } } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index fc9b8d4839ea3..a4e05906d0679 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1387,6 +1387,7 @@ export class IndexPatternsService { // (undocumented) ensureDefaultIndexPattern: EnsureDefaultIndexPattern; fieldArrayToMap: (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record; + findByTitle: (title: string) => Promise; get: (id: string) => Promise; // Warning: (ae-forgotten-export) The symbol "IndexPatternSavedObjectAttrs" needs to be exported by the entry point index.d.ts // diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 01b6ea0768338..d784a4316d920 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -91,13 +91,11 @@ export const metricsVisDefinition = { const indexes: string = params.index_pattern; if (indexes) { - const cachedIndexes = await indexPatterns.getIdsWithTitle(); - const ids = indexes - .split(INDEXES_SEPARATOR) - .map((title) => cachedIndexes.find((i) => i.title === title)?.id) - .filter((id) => id); - - return Promise.all(ids.map((id) => indexPatterns.get(id!))); + return ( + await Promise.all( + indexes.split(INDEXES_SEPARATOR).map((title) => indexPatterns.findByTitle(title)) + ) + ).filter((index) => Boolean(index)); } return []; diff --git a/src/plugins/vis_type_vega/public/plugin.ts b/src/plugins/vis_type_vega/public/plugin.ts index 04481685c841b..55a69ab11966c 100644 --- a/src/plugins/vis_type_vega/public/plugin.ts +++ b/src/plugins/vis_type_vega/public/plugin.ts @@ -25,7 +25,6 @@ import { Setup as InspectorSetup } from '../../inspector/public'; import { setNotifications, setData, - setSavedObjects, setInjectedVars, setUISettings, setMapsLegacyConfig, @@ -100,7 +99,6 @@ export class VegaPlugin implements Plugin, void> { public start(core: CoreStart, { data }: VegaPluginStartDependencies) { setNotifications(core.notifications); - setSavedObjects(core.savedObjects); setData(data); setInjectedMetadata(core.injectedMetadata); } diff --git a/src/plugins/vis_type_vega/public/services.ts b/src/plugins/vis_type_vega/public/services.ts index 455fe67dbc423..43856c8324847 100644 --- a/src/plugins/vis_type_vega/public/services.ts +++ b/src/plugins/vis_type_vega/public/services.ts @@ -17,12 +17,7 @@ * under the License. */ -import { - CoreStart, - SavedObjectsStart, - NotificationsStart, - IUiSettingsClient, -} from 'src/core/public'; +import { CoreStart, NotificationsStart, IUiSettingsClient } from 'src/core/public'; import { DataPublicPluginStart } from '../../data/public'; import { createGetterSetter } from '../../kibana_utils/public'; @@ -40,10 +35,6 @@ export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< CoreStart['injectedMetadata'] >('InjectedMetadata'); -export const [getSavedObjects, setSavedObjects] = createGetterSetter( - 'SavedObjects' -); - export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ enableExternalUrls: boolean; emsTileLayerId: unknown; diff --git a/src/plugins/vis_type_vega/public/vega_type.ts b/src/plugins/vis_type_vega/public/vega_type.ts index 2211abb54aa93..555aa11a765a4 100644 --- a/src/plugins/vis_type_vega/public/vega_type.ts +++ b/src/plugins/vis_type_vega/public/vega_type.ts @@ -19,6 +19,7 @@ import { i18n } from '@kbn/i18n'; import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; +import { parse } from 'hjson'; import { DefaultEditorSize } from '../../vis_default_editor/public'; import { VegaVisualizationDependencies } from './plugin'; @@ -30,6 +31,8 @@ import { toExpressionAst } from './to_ast'; import { VisParams } from './vega_fn'; import { getInfoMessage } from './components/experimental_map_vis_info'; import { VegaVisEditorComponent } from './components/vega_vis_editor_lazy'; +import { getData } from './services'; +import { IndexPattern } from '../../data/public'; export const createVegaTypeDefinition = ( dependencies: VegaVisualizationDependencies @@ -68,6 +71,27 @@ export const createVegaTypeDefinition = ( getSupportedTriggers: () => { return [VIS_EVENT_TO_TRIGGER.applyFilter]; }, + getUsedIndexPattern: async (visParams) => { + if (visParams.spec) { + try { + const spec = parse(visParams.spec, { legacyRoot: false, keepWsc: true }); + const { indexPatterns } = getData(); + + if (spec.data) { + return ( + await Promise.all( + (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: any) => + indexPatterns.findByTitle(d.url?.index) + ) + ) + ).filter((index) => Boolean(index)) as IndexPattern[]; + } + } catch (e) { + // spec is invalid + } + } + return []; + }, inspectorAdapters: createInspectorAdapters, }; }; diff --git a/src/plugins/vis_type_vega/public/vega_visualization.test.js b/src/plugins/vis_type_vega/public/vega_visualization.test.js index a2214e139a296..8a073ca32b94a 100644 --- a/src/plugins/vis_type_vega/public/vega_visualization.test.js +++ b/src/plugins/vis_type_vega/public/vega_visualization.test.js @@ -30,7 +30,7 @@ import vegaMapGraph from './test_utils/vega_map_test.json'; import { VegaParser } from './data_model/vega_parser'; import { SearchAPI } from './data_model/search_api'; -import { setInjectedVars, setData, setSavedObjects, setNotifications } from './services'; +import { setInjectedVars, setData, setNotifications } from './services'; import { coreMock } from '../../../core/public/mocks'; import { dataPluginMock } from '../../data/public/mocks'; @@ -76,7 +76,6 @@ describe('VegaVisualizations', () => { enableExternalUrls: true, }); setData(dataPluginStart); - setSavedObjects(coreStart.savedObjects); setNotifications(coreStart.notifications); vegaVisualizationDependencies = { diff --git a/src/plugins/vis_type_vega/public/vega_visualization.ts b/src/plugins/vis_type_vega/public/vega_visualization.ts index 58c436bcd4be4..e9fa2eb6c8bb3 100644 --- a/src/plugins/vis_type_vega/public/vega_visualization.ts +++ b/src/plugins/vis_type_vega/public/vega_visualization.ts @@ -20,13 +20,12 @@ import { i18n } from '@kbn/i18n'; import { IInterpreterRenderHandlers } from 'src/plugins/expressions'; import { VegaParser } from './data_model/vega_parser'; import { VegaVisualizationDependencies } from './plugin'; -import { getNotifications, getData, getSavedObjects } from './services'; +import { getNotifications, getData } from './services'; import type { VegaView } from './vega_view/vega_view'; export const createVegaVisualization = ({ getServiceSettings }: VegaVisualizationDependencies) => class VegaVisualization { private readonly dataPlugin = getData(); - private readonly savedObjectsClient = getSavedObjects(); private vegaView: InstanceType | null = null; constructor( @@ -44,8 +43,7 @@ export const createVegaVisualization = ({ getServiceSettings }: VegaVisualizatio let idxObj; if (index) { - // @ts-expect-error - idxObj = indexPatterns.findByTitle(this.savedObjectsClient, index); + idxObj = await indexPatterns.findByTitle(index); if (!idxObj) { throw new Error( i18n.translate('visTypeVega.visualization.indexNotFoundErrorMessage', { From 9cf57e7249581860230627b33a2bd1a6f7267d24 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 24 Nov 2020 13:03:49 +0300 Subject: [PATCH 02/17] fix CI --- .../public/metrics_type.ts | 3 +- .../public/vega_view/vega_base_view.js | 39 +++++++++++++++++-- .../public/vega_visualization.ts | 33 ---------------- 3 files changed, 37 insertions(+), 38 deletions(-) diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 8c7a4678e24c2..77712457e2331 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -25,6 +25,7 @@ import { toExpressionAst } from './to_ast'; import { VIS_EVENT_TO_TRIGGER, VisGroups, VisParams } from '../../visualizations/public'; import { getDataStart } from './services'; import { INDEXES_SEPARATOR } from '../common/constants'; +import { IndexPattern } from '../../data/public'; export const metricsVisDefinition = { name: 'metrics', @@ -91,7 +92,7 @@ export const metricsVisDefinition = { await Promise.all( indexes.split(INDEXES_SEPARATOR).map((title) => indexPatterns.findByTitle(title)) ) - ).filter((index) => Boolean(index)); + ).filter((index) => Boolean(index)) as IndexPattern[]; } return []; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 25ea77ddbccb4..ca226025f325a 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -27,7 +27,7 @@ import { i18n } from '@kbn/i18n'; import { TooltipHandler } from './vega_tooltip'; import { esFilters } from '../../../data/public'; -import { getEnableExternalUrls } from '../services'; +import { getEnableExternalUrls, getData } from '../services'; vega.scheme('elastic', euiPaletteColorBlind()); @@ -65,7 +65,6 @@ export class VegaBaseView { this._filterManager = opts.filterManager; this._fireEvent = opts.fireEvent; this._timefilter = opts.timefilter; - this._findIndex = opts.findIndex; this._view = null; this._vegaViewConfig = null; this._$messages = null; @@ -127,6 +126,38 @@ export class VegaBaseView { } } + /** + * Find index pattern by its title, of if not given, gets default + * @param {string} [index] + * @returns {Promise} index id + */ + async findIndex(index) { + const { indexPatterns } = getData(); + let idxObj; + + if (index) { + idxObj = await indexPatterns.findByTitle(index); + if (!idxObj) { + throw new Error( + i18n.translate('visTypeVega.visualization.indexNotFoundErrorMessage', { + defaultMessage: 'Index {index} not found', + values: { index: `"${index}"` }, + }) + ); + } + } else { + idxObj = await indexPatterns.getDefault(); + if (!idxObj) { + throw new Error( + i18n.translate('visTypeVega.visualization.unableToFindDefaultIndexErrorMessage', { + defaultMessage: 'Unable to find default index', + }) + ); + } + } + return idxObj.id; + } + createViewConfig() { const config = { // eslint-disable-next-line import/namespace @@ -261,7 +292,7 @@ export class VegaBaseView { * @param {string} [index] as defined in Kibana, or default if missing */ async addFilterHandler(query, index) { - const indexId = await this._findIndex(index); + const indexId = await this.findIndex(index); const filter = esFilters.buildQueryFilter(query, indexId); this._fireEvent({ name: 'applyFilter', data: { filters: [filter] } }); @@ -272,7 +303,7 @@ export class VegaBaseView { * @param {string} [index] as defined in Kibana, or default if missing */ async removeFilterHandler(query, index) { - const indexId = await this._findIndex(index); + const indexId = await this.findIndex(index); const filterToRemove = esFilters.buildQueryFilter(query, indexId); const currentFilters = this._filterManager.getFilters(); diff --git a/src/plugins/vis_type_vega/public/vega_visualization.ts b/src/plugins/vis_type_vega/public/vega_visualization.ts index e9fa2eb6c8bb3..554ac8962df46 100644 --- a/src/plugins/vis_type_vega/public/vega_visualization.ts +++ b/src/plugins/vis_type_vega/public/vega_visualization.ts @@ -33,38 +33,6 @@ export const createVegaVisualization = ({ getServiceSettings }: VegaVisualizatio private fireEvent: IInterpreterRenderHandlers['event'] ) {} - /** - * Find index pattern by its title, of if not given, gets default - * @param {string} [index] - * @returns {Promise} index id - */ - async findIndex(index: string) { - const { indexPatterns } = this.dataPlugin; - let idxObj; - - if (index) { - idxObj = await indexPatterns.findByTitle(index); - if (!idxObj) { - throw new Error( - i18n.translate('visTypeVega.visualization.indexNotFoundErrorMessage', { - defaultMessage: 'Index {index} not found', - values: { index: `"${index}"` }, - }) - ); - } - } else { - idxObj = await indexPatterns.getDefault(); - if (!idxObj) { - throw new Error( - i18n.translate('visTypeVega.visualization.unableToFindDefaultIndexErrorMessage', { - defaultMessage: 'Unable to find default index', - }) - ); - } - } - return idxObj.id; - } - async render(visData: VegaParser) { const { toasts } = getNotifications(); @@ -110,7 +78,6 @@ export const createVegaVisualization = ({ getServiceSettings }: VegaVisualizatio serviceSettings, filterManager, timefilter, - findIndex: this.findIndex.bind(this), }; if (vegaParser.useMap) { From 69529811d1906fec91b739675c5905f1969d84a3 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 24 Nov 2020 18:03:44 +0300 Subject: [PATCH 03/17] some work --- .../public/data_model/es_query_parser.ts | 1 + .../vis_type_vega/public/data_model/types.ts | 5 ++-- .../vis_type_vega/public/default_spec.ts | 19 +++++++++++++++ src/plugins/vis_type_vega/public/vega_type.ts | 24 +++++++------------ .../public/vega_view/vega_base_view.js | 11 ++++++++- 5 files changed, 41 insertions(+), 19 deletions(-) diff --git a/src/plugins/vis_type_vega/public/data_model/es_query_parser.ts b/src/plugins/vis_type_vega/public/data_model/es_query_parser.ts index 1aac8e25d5c73..79eb049fb6dcc 100644 --- a/src/plugins/vis_type_vega/public/data_model/es_query_parser.ts +++ b/src/plugins/vis_type_vega/public/data_model/es_query_parser.ts @@ -226,6 +226,7 @@ export class EsQueryParser { const requestObject = requests.find((item) => getRequestName(item, index) === data.name); if (requestObject) { + requestObject.dataObject.url = requestObject.url; requestObject.dataObject.values = data.rawResponse; } }); diff --git a/src/plugins/vis_type_vega/public/data_model/types.ts b/src/plugins/vis_type_vega/public/data_model/types.ts index acd35e1747624..3bfe218099577 100644 --- a/src/plugins/vis_type_vega/public/data_model/types.ts +++ b/src/plugins/vis_type_vega/public/data_model/types.ts @@ -82,8 +82,9 @@ interface Projection { name: string; } -interface RequestDataObject { +interface RequestDataObject { name?: string; + url?: TUrlData; values: SearchResponse; } @@ -186,7 +187,7 @@ export interface CacheBounds { max: number; } -interface Requests { +interface Requests> { url: TUrlData; name: string; dataObject: TRequestDataObject; diff --git a/src/plugins/vis_type_vega/public/default_spec.ts b/src/plugins/vis_type_vega/public/default_spec.ts index 71f44b694a10e..865aa613d77f2 100644 --- a/src/plugins/vis_type_vega/public/default_spec.ts +++ b/src/plugins/vis_type_vega/public/default_spec.ts @@ -17,7 +17,26 @@ * under the License. */ +import { getData } from './services'; +import { IndexPattern } from '../../data/public'; + +import { VegaSpec, Data } from './data_model/types'; + // @ts-ignore import defaultSpec from '!!raw-loader!./default.spec.hjson'; export const getDefaultSpec = () => defaultSpec; + +export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { + const { indexPatterns } = getData(); + + return ( + await Promise.all( + (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: Data) => { + if (d?.url?.index) { + return indexPatterns.findByTitle(d.url.index); + } + }) + ) + ).filter((index) => Boolean(index)) as IndexPattern[]; +}; diff --git a/src/plugins/vis_type_vega/public/vega_type.ts b/src/plugins/vis_type_vega/public/vega_type.ts index 555aa11a765a4..a780b7e86dff1 100644 --- a/src/plugins/vis_type_vega/public/vega_type.ts +++ b/src/plugins/vis_type_vega/public/vega_type.ts @@ -18,21 +18,22 @@ */ import { i18n } from '@kbn/i18n'; -import { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; import { parse } from 'hjson'; +import type { BaseVisTypeOptions } from 'src/plugins/visualizations/public'; + import { DefaultEditorSize } from '../../vis_default_editor/public'; -import { VegaVisualizationDependencies } from './plugin'; +import type { VegaVisualizationDependencies } from './plugin'; import { createVegaRequestHandler } from './vega_request_handler'; -import { getDefaultSpec } from './default_spec'; +import { getDefaultSpec, extractIndexPatternsFromSpec } from './default_spec'; import { createInspectorAdapters } from './vega_inspector'; import { VIS_EVENT_TO_TRIGGER, VisGroups } from '../../visualizations/public'; import { toExpressionAst } from './to_ast'; -import { VisParams } from './vega_fn'; import { getInfoMessage } from './components/experimental_map_vis_info'; import { VegaVisEditorComponent } from './components/vega_vis_editor_lazy'; -import { getData } from './services'; -import { IndexPattern } from '../../data/public'; + +import type { VegaSpec } from './data_model/types'; +import type { VisParams } from './vega_fn'; export const createVegaTypeDefinition = ( dependencies: VegaVisualizationDependencies @@ -75,17 +76,8 @@ export const createVegaTypeDefinition = ( if (visParams.spec) { try { const spec = parse(visParams.spec, { legacyRoot: false, keepWsc: true }); - const { indexPatterns } = getData(); - if (spec.data) { - return ( - await Promise.all( - (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: any) => - indexPatterns.findByTitle(d.url?.index) - ) - ) - ).filter((index) => Boolean(index)) as IndexPattern[]; - } + return extractIndexPatternsFromSpec(spec as VegaSpec); } catch (e) { // spec is invalid } diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index ca226025f325a..e81b69a81118b 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -28,6 +28,7 @@ import { TooltipHandler } from './vega_tooltip'; import { esFilters } from '../../../data/public'; import { getEnableExternalUrls, getData } from '../services'; +import { extractIndexPatternsFromSpec } from '../default_spec'; vega.scheme('elastic', euiPaletteColorBlind()); @@ -146,7 +147,14 @@ export class VegaBaseView { ); } } else { - idxObj = await indexPatterns.getDefault(); + [idxObj] = await extractIndexPatternsFromSpec( + this._parser.isVegaLite ? this._parser.vlspec : this._parser.spec + ); + + if (!idxObj) { + idxObj = await indexPatterns.getDefault(); + } + if (!idxObj) { throw new Error( i18n.translate('visTypeVega.visualization.unableToFindDefaultIndexErrorMessage', { @@ -155,6 +163,7 @@ export class VegaBaseView { ); } } + return idxObj.id; } From d0c3f5311b76df4470470d6e0ed1419554ef88fe Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 24 Nov 2020 18:53:50 +0300 Subject: [PATCH 04/17] some work --- .../public/data_model/vega_parser.test.js | 6 ++-- .../vis_type_vega/public/default_spec.ts | 19 ---------- .../public/lib/extract_index_pattern.ts | 36 +++++++++++++++++++ src/plugins/vis_type_vega/public/vega_type.ts | 3 +- .../public/vega_view/vega_base_view.js | 2 +- 5 files changed, 42 insertions(+), 24 deletions(-) create mode 100644 src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts diff --git a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js index 9fb80c6a1b19d..eb666d65b8670 100644 --- a/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js +++ b/src/plugins/vis_type_vega/public/data_model/vega_parser.test.js @@ -185,21 +185,21 @@ describe('VegaParser._resolveEsQueries', () => { 'es', check( { data: { name: 'requestId', url: { index: 'a' }, x: 1 } }, - { data: { name: 'requestId', values: [42], x: 1 } } + { data: { name: 'requestId', url: { index: 'a', body: {} }, values: [42], x: 1 } } ) ); test( 'es 2', check( { data: { name: 'requestId', url: { '%type%': 'elasticsearch', index: 'a' } } }, - { data: { name: 'requestId', values: [42] } } + { data: { name: 'requestId', url: { index: 'a', body: {} }, values: [42] } } ) ); test( 'es arr', check( { arr: [{ data: { name: 'requestId', url: { index: 'a' }, x: 1 } }] }, - { arr: [{ data: { name: 'requestId', values: [42], x: 1 } }] } + { arr: [{ data: { name: 'requestId', url: { index: 'a', body: {} }, values: [42], x: 1 } }] } ) ); test( diff --git a/src/plugins/vis_type_vega/public/default_spec.ts b/src/plugins/vis_type_vega/public/default_spec.ts index 865aa613d77f2..71f44b694a10e 100644 --- a/src/plugins/vis_type_vega/public/default_spec.ts +++ b/src/plugins/vis_type_vega/public/default_spec.ts @@ -17,26 +17,7 @@ * under the License. */ -import { getData } from './services'; -import { IndexPattern } from '../../data/public'; - -import { VegaSpec, Data } from './data_model/types'; - // @ts-ignore import defaultSpec from '!!raw-loader!./default.spec.hjson'; export const getDefaultSpec = () => defaultSpec; - -export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { - const { indexPatterns } = getData(); - - return ( - await Promise.all( - (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: Data) => { - if (d?.url?.index) { - return indexPatterns.findByTitle(d.url.index); - } - }) - ) - ).filter((index) => Boolean(index)) as IndexPattern[]; -}; diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts new file mode 100644 index 0000000000000..f8d5b352a3c8d --- /dev/null +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts @@ -0,0 +1,36 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { getData } from '../services'; +import type { Data, VegaSpec } from '../data_model/types'; +import type { IndexPattern } from '../../../data/public'; + +export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { + const { indexPatterns } = getData(); + + return ( + await Promise.all( + (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: Data) => { + if (d?.url?.index) { + return indexPatterns.findByTitle(d.url.index); + } + }) + ) + ).filter((index) => Boolean(index)) as IndexPattern[]; +}; diff --git a/src/plugins/vis_type_vega/public/vega_type.ts b/src/plugins/vis_type_vega/public/vega_type.ts index a780b7e86dff1..816fda65550de 100644 --- a/src/plugins/vis_type_vega/public/vega_type.ts +++ b/src/plugins/vis_type_vega/public/vega_type.ts @@ -25,7 +25,8 @@ import { DefaultEditorSize } from '../../vis_default_editor/public'; import type { VegaVisualizationDependencies } from './plugin'; import { createVegaRequestHandler } from './vega_request_handler'; -import { getDefaultSpec, extractIndexPatternsFromSpec } from './default_spec'; +import { getDefaultSpec } from './default_spec'; +import { extractIndexPatternsFromSpec } from './lib/extract_index_pattern'; import { createInspectorAdapters } from './vega_inspector'; import { VIS_EVENT_TO_TRIGGER, VisGroups } from '../../visualizations/public'; import { toExpressionAst } from './to_ast'; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index e81b69a81118b..4cd7890465fd4 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -28,7 +28,7 @@ import { TooltipHandler } from './vega_tooltip'; import { esFilters } from '../../../data/public'; import { getEnableExternalUrls, getData } from '../services'; -import { extractIndexPatternsFromSpec } from '../default_spec'; +import { extractIndexPatternsFromSpec } from '../lib/extract_index_pattern'; vega.scheme('elastic', euiPaletteColorBlind()); From ef4e702af439b85bc5aa3ec54b45d386e2293edc Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 24 Nov 2020 19:18:09 +0300 Subject: [PATCH 05/17] add tests for extract_index_pattern --- src/plugins/data/public/mocks.ts | 1 + .../public/lib/extract_index_pattern.test.ts | 125 ++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 1b83eb569b1a1..cab60fe4082ad 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -64,6 +64,7 @@ const createStartContract = (): Start => { SearchBar: jest.fn().mockReturnValue(null), }, indexPatterns: ({ + findByTitle: jest.fn((title) => ({ title, id: title })), createField: jest.fn(() => {}), createFieldList: jest.fn(() => []), ensureDefaultIndexPattern: jest.fn(), diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts new file mode 100644 index 0000000000000..9534c2adb5e5c --- /dev/null +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts @@ -0,0 +1,125 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { dataPluginMock } from '../../../data/public/mocks'; +import { extractIndexPatternsFromSpec } from './extract_index_pattern'; +import { setData } from '../services'; + +import type { VegaSpec } from '../data_model/types'; + +const getMockedSpec = (mockedObj: any) => (mockedObj as unknown) as VegaSpec; + +describe('extractIndexPatternsFromSpec', () => { + const dataStart = dataPluginMock.createStartContract(); + + beforeAll(() => { + setData(dataStart); + }); + + test('should not throw errors if no index is specified', async () => { + const spec = getMockedSpec({ + data: {}, + }); + + const indexes = await extractIndexPatternsFromSpec(spec); + + expect(indexes).toMatchInlineSnapshot(`Array []`); + }); + + test('should extract sing index pattern', async () => { + const spec = getMockedSpec({ + data: { + url: { + index: 'test', + }, + }, + }); + + const indexes = await extractIndexPatternsFromSpec(spec); + + expect(indexes).toMatchInlineSnapshot(` + Array [ + Object { + "id": "test", + "title": "test", + }, + ] + `); + }); + + test('should extract multiple index patterns', async () => { + const spec = getMockedSpec({ + data: [ + { + url: { + index: 'test1', + }, + }, + { + url: { + index: 'test2', + }, + }, + ], + }); + + const indexes = await extractIndexPatternsFromSpec(spec); + + expect(indexes).toMatchInlineSnapshot(` + Array [ + Object { + "id": "test1", + "title": "test1", + }, + Object { + "id": "test2", + "title": "test2", + }, + ] + `); + }); + + test('should filter empty values', async () => { + const spec = getMockedSpec({ + data: [ + { + url: { + wrong: 'wrong', + }, + }, + { + url: { + index: 'ok', + }, + }, + ], + }); + + const indexes = await extractIndexPatternsFromSpec(spec); + + expect(indexes).toMatchInlineSnapshot(` + Array [ + Object { + "id": "ok", + "title": "ok", + }, + ] + `); + }); +}); From e66c6107d954bf1a439fce091d78768c58b02149 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 24 Nov 2020 19:56:38 +0300 Subject: [PATCH 06/17] simplify extract_index_pattern --- .../public/lib/extract_index_pattern.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts index f8d5b352a3c8d..0b79bafdde1a6 100644 --- a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts @@ -18,19 +18,23 @@ */ import { getData } from '../services'; + import type { Data, VegaSpec } from '../data_model/types'; import type { IndexPattern } from '../../../data/public'; export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { const { indexPatterns } = getData(); + const data: Data[] = Array.isArray(spec.data) ? spec.data : [spec.data]; return ( await Promise.all( - (Array.isArray(spec.data) ? spec.data : [spec.data]).map((d: Data) => { - if (d?.url?.index) { - return indexPatterns.findByTitle(d.url.index); + data.reduce((accumulator, currentValue) => { + if (currentValue.url?.index) { + accumulator.push(indexPatterns.findByTitle(currentValue.url.index)); } - }) + + return accumulator; + }, []) ) ).filter((index) => Boolean(index)) as IndexPattern[]; }; From 0eb9680b636fc873ef63b67abba83ea5e2fb7a63 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 25 Nov 2020 13:05:47 +0300 Subject: [PATCH 07/17] fix type error --- .../vis_type_vega/public/lib/extract_index_pattern.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts index 0b79bafdde1a6..0cc965de32990 100644 --- a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts @@ -24,7 +24,13 @@ import type { IndexPattern } from '../../../data/public'; export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { const { indexPatterns } = getData(); - const data: Data[] = Array.isArray(spec.data) ? spec.data : [spec.data]; + let data: Data[] = []; + + if (Array.isArray(spec.data)) { + data = spec.data; + } else if (spec.data) { + data = [spec.data]; + } return ( await Promise.all( From e068c902458dfecd3d1d8aaf70f8f05cd840b2b1 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Wed, 25 Nov 2020 14:16:54 +0300 Subject: [PATCH 08/17] cleanup --- src/plugins/vis_type_vega/public/vega_type.ts | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/plugins/vis_type_vega/public/vega_type.ts b/src/plugins/vis_type_vega/public/vega_type.ts index 816fda65550de..d81bfe02389e2 100644 --- a/src/plugins/vis_type_vega/public/vega_type.ts +++ b/src/plugins/vis_type_vega/public/vega_type.ts @@ -74,14 +74,12 @@ export const createVegaTypeDefinition = ( return [VIS_EVENT_TO_TRIGGER.applyFilter]; }, getUsedIndexPattern: async (visParams) => { - if (visParams.spec) { - try { - const spec = parse(visParams.spec, { legacyRoot: false, keepWsc: true }); + try { + const spec = parse(visParams.spec, { legacyRoot: false, keepWsc: true }); - return extractIndexPatternsFromSpec(spec as VegaSpec); - } catch (e) { - // spec is invalid - } + return extractIndexPatternsFromSpec(spec as VegaSpec); + } catch (e) { + // spec is invalid } return []; }, From 001086839121c77b085c28395fe64638faa23751 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 26 Nov 2020 13:38:35 +0300 Subject: [PATCH 09/17] Update vega_base_view.js --- src/plugins/vis_type_vega/public/vega_view/vega_base_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 4cd7890465fd4..5cbf3f5bf8673 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -128,7 +128,7 @@ export class VegaBaseView { } /** - * Find index pattern by its title, of if not given, gets default + * Find index pattern by its title, if not given, gets it from spec or a defaults one * @param {string} [index] * @returns {Promise} index id */ From 629398da9f06e694dc6ac09d7ba8d48d0cf8b9ca Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 26 Nov 2020 13:40:21 +0300 Subject: [PATCH 10/17] Update extract_index_pattern.test.ts --- .../vis_type_vega/public/lib/extract_index_pattern.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts index 9534c2adb5e5c..a13428d539ad9 100644 --- a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.test.ts @@ -42,7 +42,7 @@ describe('extractIndexPatternsFromSpec', () => { expect(indexes).toMatchInlineSnapshot(`Array []`); }); - test('should extract sing index pattern', async () => { + test('should extract single index pattern', async () => { const spec = getMockedSpec({ data: { url: { From 606e67d407c0d652d7c8bc94b0e2383cdb002e54 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 26 Nov 2020 15:04:25 +0300 Subject: [PATCH 11/17] fix PR comments --- .../public/vega_view/vega_base_view.js | 22 ++++++++++--------- .../translations/translations/ja-JP.json | 4 ++-- .../translations/translations/zh-CN.json | 4 ++-- 3 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 5cbf3f5bf8673..de6d3333c9031 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -140,7 +140,7 @@ export class VegaBaseView { idxObj = await indexPatterns.findByTitle(index); if (!idxObj) { throw new Error( - i18n.translate('visTypeVega.visualization.indexNotFoundErrorMessage', { + i18n.translate('visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage', { defaultMessage: 'Index {index} not found', values: { index: `"${index}"` }, }) @@ -152,15 +152,17 @@ export class VegaBaseView { ); if (!idxObj) { - idxObj = await indexPatterns.getDefault(); - } - - if (!idxObj) { - throw new Error( - i18n.translate('visTypeVega.visualization.unableToFindDefaultIndexErrorMessage', { - defaultMessage: 'Unable to find default index', - }) - ); + const defaultIdx = await indexPatterns.getDefault(); + + if (defaultIdx) { + idxObj = defaultIdx; + } else { + throw new Error( + i18n.translate('visTypeVega.vegaParser.baseView.unableToFindDefaultIndexErrorMessage', { + defaultMessage: 'Unable to find default index', + }) + ); + } } } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ed514eda000aa..ca05ced3ed034 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4311,6 +4311,8 @@ "visTypeVega.vegaParser.baseView.externalUrlsAreNotEnabledErrorMessage": "外部 URL が無効です。{enableExternalUrls} を {kibanaConfigFileName} に追加します", "visTypeVega.vegaParser.baseView.functionIsNotDefinedForGraphErrorMessage": "このグラフには {funcName} が定義されていません", "visTypeVega.vegaParser.baseView.timeValuesTypeErrorMessage": "時間フィルターの設定エラー: 両方の時間の値は相対的または絶対的な日付である必要があります。 {start}、{end}", + "visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage": "インデックス {index} が見つかりません", + "visTypeVega.vegaParser.baseView.unableToFindDefaultIndexErrorMessage": "デフォルトのインデックスが見つかりません", "visTypeVega.vegaParser.centerOnMarkConfigValueTypeErrorMessage": "{configName} は {trueValue}、{falseValue}、または数字でなければなりません", "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "データには {urlParam}、{valuesParam}、 {sourceParam} の内複数を含めることができません", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} は廃止されました。代わりに {newConfigName} を使用してください。", @@ -4329,9 +4331,7 @@ "visTypeVega.vegaParser.unrecognizedControlsLocationValueErrorMessage": "認識されない {controlsLocationParam} 値[{locToDirMap}] のいずれかである必要があります", "visTypeVega.vegaParser.unrecognizedDirValueErrorMessage": "認識されない {dirParam} 値[{expectedValues}] のいずれかである必要があります", "visTypeVega.vegaParser.VLCompilerShouldHaveGeneratedSingleProtectionObjectErrorMessage": "内部エラー:Vega-Lite コンパイラーがシングルプロジェクションオブジェクトを生成したはずです", - "visTypeVega.visualization.indexNotFoundErrorMessage": "インデックス {index} が見つかりません", "visTypeVega.visualization.renderErrorTitle": "Vega エラー", - "visTypeVega.visualization.unableToFindDefaultIndexErrorMessage": "デフォルトのインデックスが見つかりません", "visTypeVega.visualization.unableToRenderWithoutDataWarningMessage": "データなしにはレンダリングできません", "visTypeVislib.advancedSettings.visualization.dimmingOpacityText": "チャートの別のエレメントが選択された時に暗くなるチャート項目の透明度です。この数字が小さければ小さいほど、ハイライトされたエレメントが目立ちます。0と1の間の数字で設定します。", "visTypeVislib.advancedSettings.visualization.dimmingOpacityTitle": "減光透明度", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index a500b63fbf863..76cad57b607ee 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4312,6 +4312,8 @@ "visTypeVega.vegaParser.baseView.externalUrlsAreNotEnabledErrorMessage": "未启用外部 URL。将 {enableExternalUrls} 添加到 {kibanaConfigFileName}", "visTypeVega.vegaParser.baseView.functionIsNotDefinedForGraphErrorMessage": "没有为此图表定义 {funcName}", "visTypeVega.vegaParser.baseView.timeValuesTypeErrorMessage": "设置时间筛选时出错:时间值必须为相对日期或绝对日期。{start}、{end}", + "visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage": "找不到索引 {index}", + "visTypeVega.vegaParser.baseView.unableToFindDefaultIndexErrorMessage": "找不到默认索引", "visTypeVega.vegaParser.centerOnMarkConfigValueTypeErrorMessage": "{configName} 应为 {trueValue}、{falseValue} 或数字", "visTypeVega.vegaParser.dataExceedsSomeParamsUseTimesLimitErrorMessage": "数据不得包含 {urlParam}、{valuesParam} 和 {sourceParam} 中的多个值", "visTypeVega.vegaParser.hostConfigIsDeprecatedWarningMessage": "{deprecatedConfigName} 已弃用。请改用 {newConfigName}。", @@ -4331,9 +4333,7 @@ "visTypeVega.vegaParser.unrecognizedDirValueErrorMessage": "{dirParam} 值无法识别。应为 [{expectedValues}] 之一", "visTypeVega.vegaParser.VLCompilerShouldHaveGeneratedSingleProtectionObjectErrorMessage": "内部错误:Vega-Lite 编译器应已生成单个投影对象", "visTypeVega.vegaParser.widthAndHeightParamsAreIgnored": "{widthParam} 和 {heightParam} 参数已忽略,因为 {autoSizeParam} 已启用。将 {autoSizeParam} 设置为 {noneParam} 可禁用", - "visTypeVega.visualization.indexNotFoundErrorMessage": "找不到索引 {index}", "visTypeVega.visualization.renderErrorTitle": "Vega 错误", - "visTypeVega.visualization.unableToFindDefaultIndexErrorMessage": "找不到默认索引", "visTypeVega.visualization.unableToRenderWithoutDataWarningMessage": "没有数据时无法渲染", "visTypeVislib.advancedSettings.visualization.dimmingOpacityText": "突出显示图表的其他元素时变暗图表项的透明度。此数字越低,突出显示的元素越突出。必须是介于 0 和 1 之间的数字。", "visTypeVislib.advancedSettings.visualization.dimmingOpacityTitle": "变暗透明度", From 37044aa788c68bd32bf938fe59dac189c4cf9acb Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Fri, 27 Nov 2020 12:05:40 +0300 Subject: [PATCH 12/17] fix some comments --- ...public.indexpatternsservice.findbytitle.md | 2 +- ...lugins-data-public.indexpatternsservice.md | 2 +- .../index_patterns/index_patterns.ts | 13 +++++++---- .../data/common/index_patterns/utils.ts | 11 ++++----- src/plugins/data/public/public.api.md | 2 +- .../components/visualize_top_nav.tsx | 23 +++++++++++++------ 6 files changed, 32 insertions(+), 21 deletions(-) diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md index 0ce7782d7b93d..26a1c655ae6ca 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md @@ -9,5 +9,5 @@ Returns an object matching a given title Signature: ```typescript -findByTitle: (title: string) => Promise; +findByTitle: (title: string, refresh?: boolean) => Promise; ``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md index ce006a54767d3..3d58569534590 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md @@ -23,7 +23,7 @@ export declare class IndexPatternsService | [clearCache](./kibana-plugin-plugins-data-public.indexpatternsservice.clearcache.md) | | (id?: string | undefined) => void | Clear index pattern list cache | | [ensureDefaultIndexPattern](./kibana-plugin-plugins-data-public.indexpatternsservice.ensuredefaultindexpattern.md) | | EnsureDefaultIndexPattern | | | [fieldArrayToMap](./kibana-plugin-plugins-data-public.indexpatternsservice.fieldarraytomap.md) | | (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record<string, FieldSpec> | Converts field array to map | -| [findByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md) | | (title: string) => Promise<IndexPattern | undefined> | Returns an object matching a given title | +| [findByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.findbytitle.md) | | (title: string, refresh?: boolean) => Promise<IndexPattern | undefined> | Returns an object matching a given title | | [get](./kibana-plugin-plugins-data-public.indexpatternsservice.get.md) | | (id: string) => Promise<IndexPattern> | Get an index pattern by id. Cache optimized | | [getCache](./kibana-plugin-plugins-data-public.indexpatternsservice.getcache.md) | | () => Promise<SavedObject<IndexPatternSavedObjectAttrs>[] | null | undefined> | | | [getDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefault.md) | | () => Promise<IndexPattern | null> | Get default index pattern | diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 1326ebdbf9d6f..9516cc483acd7 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -160,11 +160,16 @@ export class IndexPatternsService { * @param title {string} * @returns {Promise} */ - findByTitle = async (title: string) => { - const savedObject = await findByTitle(this.savedObjectsClient, title); + findByTitle = async (title: string, refresh: boolean = false) => { + if (!this.savedObjectsCache || refresh) { + await this.refreshSavedObjectsCache(); + } + if (this.savedObjectsCache) { + const so = this.savedObjectsCache.find((obj) => obj.attributes.title === title); - if (savedObject?.id) { - return this.get(savedObject?.id); + if (so?.id) { + return this.get(so.id); + } } }; diff --git a/src/plugins/data/common/index_patterns/utils.ts b/src/plugins/data/common/index_patterns/utils.ts index 11501f5a4bbf5..b7e1f28d5d60f 100644 --- a/src/plugins/data/common/index_patterns/utils.ts +++ b/src/plugins/data/common/index_patterns/utils.ts @@ -17,8 +17,8 @@ * under the License. */ -import { find } from 'lodash'; -import { SavedObjectsClientCommon, SavedObject } from '..'; +import type { IndexPatternSavedObjectAttrs } from './index_patterns'; +import type { SavedObjectsClientCommon } from '../types'; /** * Returns an object matching a given title @@ -29,7 +29,7 @@ import { SavedObjectsClientCommon, SavedObject } from '..'; */ export async function findByTitle(client: SavedObjectsClientCommon, title: string) { if (title) { - const savedObjects = await client.find({ + const savedObjects = await client.find({ type: 'index-pattern', perPage: 10, search: `"${title}"`, @@ -37,9 +37,6 @@ export async function findByTitle(client: SavedObjectsClientCommon, title: strin fields: ['title'], }); - return find( - savedObjects, - (obj: SavedObject) => obj.attributes.title.toLowerCase() === title.toLowerCase() - ); + return savedObjects.find((obj) => obj.attributes.title.toLowerCase() === title.toLowerCase()); } } diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 257b3aa6664ca..2082fc002af09 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1396,7 +1396,7 @@ export class IndexPatternsService { // (undocumented) ensureDefaultIndexPattern: EnsureDefaultIndexPattern; fieldArrayToMap: (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record; - findByTitle: (title: string) => Promise; + findByTitle: (title: string, refresh?: boolean) => Promise; get: (id: string) => Promise; // Warning: (ae-forgotten-export) The symbol "IndexPatternSavedObjectAttrs" needs to be exported by the entry point index.d.ts // diff --git a/src/plugins/visualize/public/application/components/visualize_top_nav.tsx b/src/plugins/visualize/public/application/components/visualize_top_nav.tsx index b207529c456a1..f413cc6f74aba 100644 --- a/src/plugins/visualize/public/application/components/visualize_top_nav.tsx +++ b/src/plugins/visualize/public/application/components/visualize_top_nav.tsx @@ -20,7 +20,6 @@ import React, { memo, useCallback, useMemo, useState, useEffect } from 'react'; import { AppMountParameters, OverlayRef } from 'kibana/public'; -import _ from 'lodash'; import { i18n } from '@kbn/i18n'; import { useKibana } from '../../../../kibana_react/public'; import { @@ -31,6 +30,7 @@ import { } from '../types'; import { APP_NAME } from '../visualize_constants'; import { getTopNavConfig } from '../utils'; +import type { IndexPattern } from '../../../../data/common/index_patterns'; interface VisualizeTopNavProps { currentAppState: VisualizeAppState; @@ -165,14 +165,23 @@ const TopNav = ({ ]); useEffect(() => { + const asyncSetIndexPattern = async () => { + let index: IndexPattern | null = null; + + if (vis.type.getUsedIndexPattern) { + [index] = await vis.type.getUsedIndexPattern(vis.params); + } + if (!index) { + index = await services.data.indexPatterns.getDefault(); + } + if (index) { + setIndexPattern(index); + } + }; if (!vis.data.indexPattern) { - services.data.indexPatterns.getDefault().then((index) => { - if (index) { - setIndexPattern(index); - } - }); + asyncSetIndexPattern(); } - }, [services.data.indexPatterns, vis.data.indexPattern]); + }, [vis.params, vis.type, services.data.indexPatterns, vis.data.indexPattern]); return isChromeVisible ? ( /** From 1548365a59e71bd4417be1d08cf57a5f57b1275f Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 30 Nov 2020 20:30:20 +0300 Subject: [PATCH 13/17] findByTitle -> getByTitle --- .../index_patterns/index_patterns.ts | 14 +++++--------- src/plugins/data/public/mocks.ts | 2 +- .../vis_type_timeseries/public/metrics_type.ts | 2 +- .../public/lib/extract_index_pattern.ts | 2 +- .../public/vega_view/vega_base_view.js | 2 +- 5 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 9516cc483acd7..0be568470cf3b 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -160,16 +160,12 @@ export class IndexPatternsService { * @param title {string} * @returns {Promise} */ - findByTitle = async (title: string, refresh: boolean = false) => { - if (!this.savedObjectsCache || refresh) { - await this.refreshSavedObjectsCache(); - } - if (this.savedObjectsCache) { - const so = this.savedObjectsCache.find((obj) => obj.attributes.title === title); + getByTitle = async (title: string, refresh: boolean = false) => { + const idsWithTitle = await this.getIdsWithTitle(refresh); + const item = idsWithTitle.find((i) => i.title === title); - if (so?.id) { - return this.get(so.id); - } + if (item?.id) { + return this.get(item.id); } }; diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index cab60fe4082ad..20eb756b1d093 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -64,7 +64,7 @@ const createStartContract = (): Start => { SearchBar: jest.fn().mockReturnValue(null), }, indexPatterns: ({ - findByTitle: jest.fn((title) => ({ title, id: title })), + getByTitle: jest.fn((title) => ({ title, id: title })), createField: jest.fn(() => {}), createFieldList: jest.fn(() => []), ensureDefaultIndexPattern: jest.fn(), diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 77712457e2331..0b69e54074e6d 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -90,7 +90,7 @@ export const metricsVisDefinition = { if (indexes) { return ( await Promise.all( - indexes.split(INDEXES_SEPARATOR).map((title) => indexPatterns.findByTitle(title)) + indexes.split(INDEXES_SEPARATOR).map((title) => indexPatterns.getByTitle(title)) ) ).filter((index) => Boolean(index)) as IndexPattern[]; } diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts index 0cc965de32990..16c857bd84f30 100644 --- a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts @@ -36,7 +36,7 @@ export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { await Promise.all( data.reduce((accumulator, currentValue) => { if (currentValue.url?.index) { - accumulator.push(indexPatterns.findByTitle(currentValue.url.index)); + accumulator.push(indexPatterns.getByTitle(currentValue.url.index)); } return accumulator; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index de6d3333c9031..2b5783051bf0b 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -137,7 +137,7 @@ export class VegaBaseView { let idxObj; if (index) { - idxObj = await indexPatterns.findByTitle(index); + idxObj = await indexPatterns.getByTitle(index); if (!idxObj) { throw new Error( i18n.translate('visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage', { From d8022eff88671664952b89b88fd9a32a62f4aaf7 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 30 Nov 2020 21:14:52 +0300 Subject: [PATCH 14/17] remove getByTitle --- ...data-public.indexpatternsservice.getbytitle.md | 13 ------------- ...in-plugins-data-public.indexpatternsservice.md | 1 - .../index_patterns/index_patterns.ts | 15 --------------- src/plugins/data/public/mocks.ts | 1 - src/plugins/data/public/public.api.md | 1 - .../vis_type_timeseries/public/metrics_type.ts | 13 +------------ .../public/lib/extract_index_pattern.ts | 9 +++++---- .../public/vega_view/vega_base_view.js | 2 +- 8 files changed, 7 insertions(+), 48 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md deleted file mode 100644 index 29377918f3956..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPatternsService](./kibana-plugin-plugins-data-public.indexpatternsservice.md) > [getByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md) - -## IndexPatternsService.getByTitle property - -Returns an object matching a given title - -Signature: - -```typescript -getByTitle: (title: string, refresh?: boolean) => Promise; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md index 03b42bc60077f..30ce1fa1de386 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatternsservice.md @@ -25,7 +25,6 @@ export declare class IndexPatternsService | [fieldArrayToMap](./kibana-plugin-plugins-data-public.indexpatternsservice.fieldarraytomap.md) | | (fields: FieldSpec[], fieldAttrs?: FieldAttrs | undefined) => Record<string, FieldSpec> | Converts field array to map | | [find](./kibana-plugin-plugins-data-public.indexpatternsservice.find.md) | | (search: string, size?: number) => Promise<IndexPattern[]> | | | [get](./kibana-plugin-plugins-data-public.indexpatternsservice.get.md) | | (id: string) => Promise<IndexPattern> | Get an index pattern by id. Cache optimized | -| [getByTitle](./kibana-plugin-plugins-data-public.indexpatternsservice.getbytitle.md) | | (title: string, refresh?: boolean) => Promise<IndexPattern | undefined> | Returns an object matching a given title | | [getCache](./kibana-plugin-plugins-data-public.indexpatternsservice.getcache.md) | | () => Promise<SavedObject<IndexPatternSavedObjectAttrs>[] | null | undefined> | | | [getDefault](./kibana-plugin-plugins-data-public.indexpatternsservice.getdefault.md) | | () => Promise<IndexPattern | null> | Get default index pattern | | [getFieldsForIndexPattern](./kibana-plugin-plugins-data-public.indexpatternsservice.getfieldsforindexpattern.md) | | (indexPattern: IndexPattern | IndexPatternSpec, options?: GetFieldsOptions | undefined) => Promise<any> | Get field list by providing an index patttern (or spec) | diff --git a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts index 08972c003e11d..4a266b3cad649 100644 --- a/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts +++ b/src/plugins/data/common/index_patterns/index_patterns/index_patterns.ts @@ -168,21 +168,6 @@ export class IndexPatternsService { })); }; - /** - * Returns an object matching a given title - * - * @param title {string} - * @returns {Promise} - */ - getByTitle = async (title: string, refresh: boolean = false) => { - const idsWithTitle = await this.getIdsWithTitle(refresh); - const item = idsWithTitle.find((i) => i.title === title); - - if (item?.id) { - return this.get(item.id); - } - }; - /** * Clear index pattern list cache * @param id optionally clear a single id diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 20eb756b1d093..1b83eb569b1a1 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -64,7 +64,6 @@ const createStartContract = (): Start => { SearchBar: jest.fn().mockReturnValue(null), }, indexPatterns: ({ - getByTitle: jest.fn((title) => ({ title, id: title })), createField: jest.fn(() => {}), createFieldList: jest.fn(() => []), ensureDefaultIndexPattern: jest.fn(), diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index 6fdf0d6cbc9c3..8ceb91269adbe 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -1399,7 +1399,6 @@ export class IndexPatternsService { // (undocumented) find: (search: string, size?: number) => Promise; get: (id: string) => Promise; - getByTitle: (title: string, refresh?: boolean) => Promise; // Warning: (ae-forgotten-export) The symbol "IndexPatternSavedObjectAttrs" needs to be exported by the entry point index.d.ts // // (undocumented) diff --git a/src/plugins/vis_type_timeseries/public/metrics_type.ts b/src/plugins/vis_type_timeseries/public/metrics_type.ts index 0b69e54074e6d..41dc26c8c130d 100644 --- a/src/plugins/vis_type_timeseries/public/metrics_type.ts +++ b/src/plugins/vis_type_timeseries/public/metrics_type.ts @@ -24,8 +24,6 @@ import { PANEL_TYPES } from '../common/panel_types'; import { toExpressionAst } from './to_ast'; import { VIS_EVENT_TO_TRIGGER, VisGroups, VisParams } from '../../visualizations/public'; import { getDataStart } from './services'; -import { INDEXES_SEPARATOR } from '../common/constants'; -import { IndexPattern } from '../../data/public'; export const metricsVisDefinition = { name: 'metrics', @@ -85,16 +83,7 @@ export const metricsVisDefinition = { inspectorAdapters: {}, getUsedIndexPattern: async (params: VisParams) => { const { indexPatterns } = getDataStart(); - const indexes: string = params.index_pattern; - if (indexes) { - return ( - await Promise.all( - indexes.split(INDEXES_SEPARATOR).map((title) => indexPatterns.getByTitle(title)) - ) - ).filter((index) => Boolean(index)) as IndexPattern[]; - } - - return []; + return params.index_pattern ? await indexPatterns.find(params.index_pattern) : []; }, }; diff --git a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts index 16c857bd84f30..12cbd6f7ebbfa 100644 --- a/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts +++ b/src/plugins/vis_type_vega/public/lib/extract_index_pattern.ts @@ -17,6 +17,7 @@ * under the License. */ +import { flatten } from 'lodash'; import { getData } from '../services'; import type { Data, VegaSpec } from '../data_model/types'; @@ -32,15 +33,15 @@ export const extractIndexPatternsFromSpec = async (spec: VegaSpec) => { data = [spec.data]; } - return ( + return flatten( await Promise.all( - data.reduce((accumulator, currentValue) => { + data.reduce>>((accumulator, currentValue) => { if (currentValue.url?.index) { - accumulator.push(indexPatterns.getByTitle(currentValue.url.index)); + accumulator.push(indexPatterns.find(currentValue.url.index)); } return accumulator; }, []) ) - ).filter((index) => Boolean(index)) as IndexPattern[]; + ); }; diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 2b5783051bf0b..9541a0cdb6a5f 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -137,7 +137,7 @@ export class VegaBaseView { let idxObj; if (index) { - idxObj = await indexPatterns.getByTitle(index); + idxObj = await indexPatterns.find(index); if (!idxObj) { throw new Error( i18n.translate('visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage', { From cea9694f134ba8671336477390e5fe5d2ac308a0 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 30 Nov 2020 21:33:01 +0300 Subject: [PATCH 15/17] fix vega_base_view --- src/plugins/vis_type_vega/public/vega_view/vega_base_view.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js index 9541a0cdb6a5f..10f08edef1aa6 100644 --- a/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js +++ b/src/plugins/vis_type_vega/public/vega_view/vega_base_view.js @@ -137,7 +137,7 @@ export class VegaBaseView { let idxObj; if (index) { - idxObj = await indexPatterns.find(index); + [idxObj] = await indexPatterns.find(index); if (!idxObj) { throw new Error( i18n.translate('visTypeVega.vegaParser.baseView.indexNotFoundErrorMessage', { From 7a0a9b7387ea7fc2dbc5dbb1f4642f6ff44173cb Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Mon, 30 Nov 2020 22:46:58 +0300 Subject: [PATCH 16/17] fix jest --- src/plugins/data/public/mocks.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 1b83eb569b1a1..67c1ff7e09dd7 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -64,6 +64,7 @@ const createStartContract = (): Start => { SearchBar: jest.fn().mockReturnValue(null), }, indexPatterns: ({ + find: jest.fn((search) => [{ id: search, title: search }]), createField: jest.fn(() => {}), createFieldList: jest.fn(() => []), ensureDefaultIndexPattern: jest.fn(), From b538cabb04f640d1b8cdea0a63b3be72f1a07853 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 1 Dec 2020 10:28:11 +0300 Subject: [PATCH 17/17] allow to set multiple indexes from top_nav --- .../components/visualize_top_nav.tsx | 26 ++++++++++++------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/src/plugins/visualize/public/application/components/visualize_top_nav.tsx b/src/plugins/visualize/public/application/components/visualize_top_nav.tsx index f413cc6f74aba..4b32880136146 100644 --- a/src/plugins/visualize/public/application/components/visualize_top_nav.tsx +++ b/src/plugins/visualize/public/application/components/visualize_top_nav.tsx @@ -30,7 +30,7 @@ import { } from '../types'; import { APP_NAME } from '../visualize_constants'; import { getTopNavConfig } from '../utils'; -import type { IndexPattern } from '../../../../data/common/index_patterns'; +import type { IndexPattern } from '../../../../data/public'; interface VisualizeTopNavProps { currentAppState: VisualizeAppState; @@ -118,7 +118,9 @@ const TopNav = ({ stateTransfer, onAppLeave, ]); - const [indexPattern, setIndexPattern] = useState(vis.data.indexPattern); + const [indexPatterns, setIndexPatterns] = useState( + vis.data.indexPattern ? [vis.data.indexPattern] : [] + ); const showDatePicker = () => { // tsvb loads without an indexPattern initially (TODO investigate). // hide timefilter only if timeFieldName is explicitly undefined. @@ -166,18 +168,22 @@ const TopNav = ({ useEffect(() => { const asyncSetIndexPattern = async () => { - let index: IndexPattern | null = null; + let indexes: IndexPattern[] | undefined; if (vis.type.getUsedIndexPattern) { - [index] = await vis.type.getUsedIndexPattern(vis.params); + indexes = await vis.type.getUsedIndexPattern(vis.params); } - if (!index) { - index = await services.data.indexPatterns.getDefault(); + if (!indexes || !indexes.length) { + const defaultIndex = await services.data.indexPatterns.getDefault(); + if (defaultIndex) { + indexes = [defaultIndex]; + } } - if (index) { - setIndexPattern(index); + if (indexes) { + setIndexPatterns(indexes); } }; + if (!vis.data.indexPattern) { asyncSetIndexPattern(); } @@ -198,7 +204,7 @@ const TopNav = ({ onQuerySubmit={handleRefresh} savedQueryId={currentAppState.savedQuery} onSavedQueryIdChange={stateContainer.transitions.updateSavedQuery} - indexPatterns={indexPattern ? [indexPattern] : undefined} + indexPatterns={indexPatterns} screenTitle={vis.title} showAutoRefreshOnly={!showDatePicker()} showDatePicker={showDatePicker()} @@ -216,7 +222,7 @@ const TopNav = ({