From 68785f32f75f88fbdeb25ea6d2ccc7625e8f470e Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 1 Feb 2024 07:03:45 -0700 Subject: [PATCH] [maps] replace isESSource class method with type guard (#175850) PR replaces `ISource.isESSource` method with type guards for IESSource interface. This provides stronger type guards and paves the way for addition ES|QL map layer work (ES|QL layers providing geoFieldNames and data views). --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../public/classes/custom_raster_source.tsx | 4 - .../maps/public/actions/layer_actions.ts | 3 +- .../maps/public/classes/layers/layer.tsx | 11 +-- .../layers/layer_group/layer_group.tsx | 6 -- .../classes/layers/tile_errors_list.tsx | 4 +- .../mvt_vector_layer/mvt_source_data.test.ts | 11 +-- .../mvt_vector_layer/mvt_source_data.ts | 3 +- .../mvt_vector_layer/mvt_vector_layer.tsx | 11 +-- .../layers/vector_layer/vector_layer.tsx | 11 +-- .../classes/sources/es_source/es_source.ts | 41 +--------- .../public/classes/sources/es_source/index.ts | 4 +- .../public/classes/sources/es_source/types.ts | 75 +++++++++++++++++++ .../maps/public/classes/sources/source.ts | 8 -- .../classes/util/mb_filter_expressions.ts | 8 +- .../edit_layer_panel.test.tsx.snap | 2 - .../edit_layer_panel.test.tsx | 3 - .../edit_layer_panel/edit_layer_panel.tsx | 3 +- .../join_editor/join_editor.tsx | 3 +- .../tile_status_tracker.test.tsx | 16 +++- .../tile_status_tracker.tsx | 17 +---- .../plugins/ml/public/maps/anomaly_source.tsx | 5 -- 21 files changed, 130 insertions(+), 119 deletions(-) create mode 100644 x-pack/plugins/maps/public/classes/sources/es_source/types.ts diff --git a/x-pack/examples/third_party_maps_source_example/public/classes/custom_raster_source.tsx b/x-pack/examples/third_party_maps_source_example/public/classes/custom_raster_source.tsx index a33b72652a26e7..881b721e03a3c2 100644 --- a/x-pack/examples/third_party_maps_source_example/public/classes/custom_raster_source.tsx +++ b/x-pack/examples/third_party_maps_source_example/public/classes/custom_raster_source.tsx @@ -130,10 +130,6 @@ export class CustomRasterSource implements IRasterSource { return []; } - isESSource(): boolean { - return false; - } - // Returns function used to format value async createFieldFormatter(field: IField): Promise { return null; diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index adcd1242adce02..9141a37f3eee8e 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -63,6 +63,7 @@ import { import { ILayer } from '../classes/layers/layer'; import { hasVectorLayerMethod } from '../classes/layers/vector_layer'; import { OnSourceChangeArgs } from '../classes/sources/source'; +import { isESVectorTileSource } from '../classes/sources/es_source'; import { DRAW_MODE, LAYER_STYLE_TYPE, @@ -827,7 +828,7 @@ export function setTileState( newValue: tileErrors, }); - if (!isLayerGroup(layer) && layer.getSource().isESSource()) { + if (!isLayerGroup(layer) && isESVectorTileSource(layer.getSource())) { getInspectorAdapters(getState()).vectorTiles.setTileResults( layerId, tileMetaFeatures, diff --git a/x-pack/plugins/maps/public/classes/layers/layer.tsx b/x-pack/plugins/maps/public/classes/layers/layer.tsx index 1031faaf069632..66fee3e3455be1 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer.tsx @@ -45,7 +45,7 @@ import { ISource, SourceEditorArgs } from '../sources/source'; import { DataRequestContext } from '../../actions'; import { IStyle } from '../styles/style'; import { LICENSED_FEATURES } from '../../licensed_features'; -import { IESSource } from '../sources/es_source'; +import { hasESSourceMethod, isESVectorTileSource } from '../sources/es_source'; import { TileErrorsList } from './tile_errors_list'; import { isLayerGroup } from './layer_group'; @@ -72,7 +72,6 @@ export interface ILayer { getSource(): ISource; getSourceForEditing(): ISource; syncData(syncContext: DataRequestContext): void; - supportsElasticsearchFilters(): boolean; supportsFitToBounds(): Promise; getAttributions(): Promise; getLabel(): string; @@ -215,10 +214,6 @@ export class AbstractLayer implements ILayer { return !!this._descriptor.__isPreviewLayer; } - supportsElasticsearchFilters(): boolean { - return this.getSource().isESSource(); - } - async supportsFitToBounds(): Promise { return await this.getSource().supportsFitToBounds(); } @@ -442,7 +437,7 @@ export class AbstractLayer implements ILayer { body: ( @@ -575,7 +570,7 @@ export class AbstractLayer implements ILayer { getGeoFieldNames(): string[] { const source = this.getSource(); - return source.isESSource() ? [(source as IESSource).getGeoFieldName()] : []; + return hasESSourceMethod(source, 'getGeoFieldName') ? [source.getGeoFieldName()] : []; } async getStyleMetaDescriptorFromLocalFeatures(): Promise { diff --git a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx index 1d8d61f4147849..f3bc500a6d7d64 100644 --- a/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer_group/layer_group.tsx @@ -112,12 +112,6 @@ export class LayerGroup implements ILayer { return !!this._descriptor.__isPreviewLayer; } - supportsElasticsearchFilters(): boolean { - return this.getChildren().some((child) => { - return child.supportsElasticsearchFilters(); - }); - } - async supportsFitToBounds(): Promise { return this._asyncSomeChildren('supportsFitToBounds'); } diff --git a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx index 9520184d48753c..2eb37042148c4a 100644 --- a/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx +++ b/x-pack/plugins/maps/public/classes/layers/tile_errors_list.tsx @@ -16,7 +16,7 @@ import { RESPONSE_VIEW_ID } from '../../inspector/vector_tile_adapter/components interface Props { inspectorAdapters: Adapters; - isESSource: boolean; + isESVectorTileSource: boolean; layerId: string; tileErrors: TileError[]; } @@ -59,7 +59,7 @@ export function TileErrorsList(props: Props) { ]; function renderError(tileError: TileError) { - if (!props.isESSource || !tileError.error) { + if (!props.isESVectorTileSource || !tileError.error) { return tileError.message; } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts index d67d9ade546254..b59b6bd8b2717d 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.test.ts @@ -12,6 +12,7 @@ jest.mock('uuid', () => ({ import sinon from 'sinon'; import { MockSyncContext } from '../../__fixtures__/mock_sync_context'; import { IMvtVectorSource } from '../../../sources/vector_source'; +import { IESSource } from '../../../sources/es_source'; import { DataRequest } from '../../../util/data_request'; import { syncMvtSourceData } from './mvt_source_data'; @@ -40,8 +41,8 @@ const mockSource = { isGeoGridPrecisionAware: () => { return false; }, - isESSource: () => { - return false; + isMvt: () => { + return true; }, } as unknown as IMvtVectorSource; @@ -471,10 +472,10 @@ describe('syncMvtSourceData', () => { }, source: { ...mockSource, - isESSource: () => { - return true; + getIndexPatternId: () => { + return '1234'; }, - }, + } as unknown as IMvtVectorSource & IESSource, syncContext, }); sinon.assert.calledOnce(syncContext.inspectorAdapters.vectorTiles.addLayer); diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts index 7b3f800fabc3f9..88ebfc615881b6 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_source_data.ts @@ -12,6 +12,7 @@ import { DataRequest } from '../../../util/data_request'; import { DataRequestContext } from '../../../../actions'; import { canSkipSourceUpdate } from '../../../util/can_skip_fetch'; import { IMvtVectorSource } from '../../../sources/vector_source'; +import { isESVectorTileSource } from '../../../sources/es_source'; // shape of sourceDataRequest.getData() export interface MvtSourceData { @@ -83,7 +84,7 @@ export async function syncMvtSourceData({ : prevData.refreshToken; const tileUrl = await source.getTileUrl(requestMeta, refreshToken, hasLabels, buffer); - if (source.isESSource()) { + if (isESVectorTileSource(source)) { syncContext.inspectorAdapters.vectorTiles.addLayer(layerId, layerName, tileUrl); } const sourceData = { diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx index 6b597dae016516..29b0f908028333 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/mvt_vector_layer/mvt_vector_layer.tsx @@ -34,7 +34,7 @@ import { VectorLayerDescriptor, } from '../../../../../common/descriptor_types'; import { ESSearchSource } from '../../../sources/es_search_source'; -import { IESSource } from '../../../sources/es_source'; +import { hasESSourceMethod, isESVectorTileSource } from '../../../sources/es_source'; import { InnerJoin } from '../../../joins/inner_join'; import { LayerIcon } from '../../layer'; import { MvtSourceData, syncMvtSourceData } from './mvt_source_data'; @@ -91,10 +91,11 @@ export class MvtVectorLayer extends AbstractVectorLayer { async getBounds(getDataRequestContext: (layerId: string) => DataRequestContext) { // Add filter to narrow bounds to features with matching join keys let joinKeyFilter; - if (this.getSource().isESSource()) { + const source = this.getSource(); + if (hasESSourceMethod(source, 'getIndexPattern')) { const { join, joinPropertiesMap } = this._getJoinResults(); if (join && joinPropertiesMap) { - const indexPattern = await (this.getSource() as IESSource).getIndexPattern(); + const indexPattern = await source.getIndexPattern(); const joinField = getField(indexPattern, join.getLeftField().getName()); joinKeyFilter = buildPhrasesFilter( joinField, @@ -120,7 +121,7 @@ export class MvtVectorLayer extends AbstractVectorLayer { } getFeatureId(feature: Feature): string | number | undefined { - if (!this.getSource().isESSource()) { + if (!isESVectorTileSource(this.getSource())) { return feature.id; } @@ -130,7 +131,7 @@ export class MvtVectorLayer extends AbstractVectorLayer { } getLayerIcon(isTocIcon: boolean): LayerIcon { - if (!this.getSource().isESSource()) { + if (!isESVectorTileSource(this.getSource())) { // Only ES-sources can have a special meta-tile, not 3rd party vector tile sources return { icon: this.getCurrentStyle().getIcon(false), diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx index 4cd0eb7398989a..15a18bb9a0bca7 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx @@ -51,6 +51,7 @@ import { VectorStyleRequestMeta, } from '../../../../common/descriptor_types'; import { IVectorSource } from '../../sources/vector_source'; +import { isESVectorTileSource } from '../../sources/es_source'; import { LayerIcon, ILayer, LayerMessage } from '../layer'; import { InnerJoin } from '../../joins/inner_join'; import { isSpatialJoin } from '../../joins/is_spatial_join'; @@ -58,7 +59,7 @@ import { IField } from '../../fields/field'; import { DataRequestContext } from '../../../actions'; import { ITooltipProperty } from '../../tooltips/tooltip_property'; import { IDynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property'; -import { IESSource } from '../../sources/es_source'; +import { hasESSourceMethod } from '../../sources/es_source'; import type { IJoinSource, ITermJoinSource } from '../../sources/join_sources'; import { isTermJoinSource } from '../../sources/join_sources'; import type { IESAggSource } from '../../sources/es_agg_source'; @@ -462,7 +463,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { sourceQuery?: Query; style: IVectorStyle; } & DataRequestContext) { - if (!source.isESSource() || dynamicStyleProps.length === 0) { + if (!hasESSourceMethod(source, 'loadStylePropsMeta') || dynamicStyleProps.length === 0) { return; } @@ -488,7 +489,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { startLoading(dataRequestId, requestToken, nextMeta); const layerName = await this.getDisplayName(source); - const { styleMeta, warnings } = await (source as IESSource).loadStylePropsMeta({ + const { styleMeta, warnings } = await source.loadStylePropsMeta({ layerName, style, dynamicStyleProps, @@ -873,7 +874,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const isSourceGeoJson = !this.getSource().isMvt(); const filterExpr = getPointFilterExpression( isSourceGeoJson, - this.getSource().isESSource(), + isESVectorTileSource(this.getSource()), this._getJoinFilterExpression(), timesliceMaskConfig ); @@ -980,7 +981,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const isSourceGeoJson = !this.getSource().isMvt(); const filterExpr = getLabelFilterExpression( isSourceGeoJson, - this.getSource().isESSource(), + isESVectorTileSource(this.getSource()), this._getJoinFilterExpression(), timesliceMaskConfig ); 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 aa41f33efa00b6..4dfdbe92a194ae 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 @@ -30,13 +30,11 @@ import { createExtentFilter } from '../../../../common/elasticsearch_util'; import { copyPersistentState } from '../../../reducers/copy_persistent_state'; import { DataRequestAbortError } from '../../util/data_request'; import { expandToTileBoundaries } from '../../util/geo_tile_utils'; -import { IVectorSource } from '../vector_source'; import { AbstractESSourceDescriptor, AbstractSourceDescriptor, DynamicStylePropertyOptions, MapExtent, - StyleMetaData, VectorSourceRequestMeta, } from '../../../../common/descriptor_types'; import { IVectorStyle } from '../../styles/vector/vector_style'; @@ -45,45 +43,12 @@ import { IField } from '../../fields/field'; import { FieldFormatter } from '../../../../common/constants'; import { isValidStringConfig } from '../../util/valid_string_config'; import { mergeExecutionContext } from '../execution_context_utils'; +import type { IESSource } from './types'; export function isSearchSourceAbortError(error: Error) { return error.name === 'AbortError'; } -export interface IESSource extends IVectorSource { - isESSource(): true; - - getId(): string; - - getIndexPattern(): Promise; - - getIndexPatternId(): string; - - getGeoFieldName(): string; - - loadStylePropsMeta({ - layerName, - style, - dynamicStyleProps, - registerCancelCallback, - sourceQuery, - timeFilters, - searchSessionId, - inspectorAdapters, - executionContext, - }: { - layerName: string; - style: IVectorStyle; - dynamicStyleProps: Array>; - registerCancelCallback: (callback: () => void) => void; - sourceQuery?: Query; - timeFilters: TimeRange; - searchSessionId?: string; - inspectorAdapters: Adapters; - executionContext: KibanaExecutionContext; - }): Promise<{ styleMeta: StyleMetaData; warnings: SearchResponseWarning[] }>; -} - export class AbstractESSource extends AbstractVectorSource implements IESSource { indexPattern?: DataView; @@ -151,10 +116,6 @@ export class AbstractESSource extends AbstractVectorSource implements IESSource return []; } - isESSource(): true { - return true; - } - cloneDescriptor(): AbstractSourceDescriptor { const clonedDescriptor = copyPersistentState(this._descriptor); // id used as uuid to track requests in inspector diff --git a/x-pack/plugins/maps/public/classes/sources/es_source/index.ts b/x-pack/plugins/maps/public/classes/sources/es_source/index.ts index 760ee23109efff..8264b353d7a508 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_source/index.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_source/index.ts @@ -5,4 +5,6 @@ * 2.0. */ -export * from './es_source'; +export { AbstractESSource } from './es_source'; +export type { IESSource } from './types'; +export { isESSource, isESVectorTileSource, hasESSourceMethod } from './types'; diff --git a/x-pack/plugins/maps/public/classes/sources/es_source/types.ts b/x-pack/plugins/maps/public/classes/sources/es_source/types.ts new file mode 100644 index 00000000000000..385a00b9004887 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/es_source/types.ts @@ -0,0 +1,75 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Adapters } from '@kbn/inspector-plugin/common/adapters'; +import type { Query } from '@kbn/data-plugin/common'; +import type { KibanaExecutionContext } from '@kbn/core/public'; +import type { TimeRange } from '@kbn/es-query'; +import type { DataView } from '@kbn/data-plugin/common'; +import type { SearchResponseWarning } from '@kbn/search-response-warnings'; +import type { ISource } from '../source'; +import { type IVectorSource, hasVectorSourceMethod } from '../vector_source'; +import { DynamicStylePropertyOptions, StyleMetaData } from '../../../../common/descriptor_types'; +import { IVectorStyle } from '../../styles/vector/vector_style'; +import { IDynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property'; + +export function isESVectorTileSource(source: ISource): boolean { + return ( + hasVectorSourceMethod(source, 'isMvt') && + source.isMvt() && + hasESSourceMethod(source, 'getIndexPatternId') + ); +} + +export function isESSource(source: ISource): source is IESSource { + return ( + typeof (source as IESSource).getId === 'function' && + typeof (source as IESSource).getIndexPattern === 'function' && + typeof (source as IESSource).getIndexPatternId === 'function' && + typeof (source as IESSource).getGeoFieldName === 'function' && + typeof (source as IESSource).loadStylePropsMeta === 'function' + ); +} + +export function hasESSourceMethod( + source: ISource, + methodName: keyof IESSource +): source is Pick { + return typeof (source as IESSource)[methodName] === 'function'; +} + +export interface IESSource extends IVectorSource { + getId(): string; + + getIndexPattern(): Promise; + + getIndexPatternId(): string; + + getGeoFieldName(): string; + + loadStylePropsMeta({ + layerName, + style, + dynamicStyleProps, + registerCancelCallback, + sourceQuery, + timeFilters, + searchSessionId, + inspectorAdapters, + executionContext, + }: { + layerName: string; + style: IVectorStyle; + dynamicStyleProps: Array>; + registerCancelCallback: (callback: () => void) => void; + sourceQuery?: Query; + timeFilters: TimeRange; + searchSessionId?: string; + inspectorAdapters: Adapters; + executionContext: KibanaExecutionContext; + }): Promise<{ styleMeta: StyleMetaData; warnings: SearchResponseWarning[] }>; +} diff --git a/x-pack/plugins/maps/public/classes/sources/source.ts b/x-pack/plugins/maps/public/classes/sources/source.ts index a2a18b79a09282..c40388349f2297 100644 --- a/x-pack/plugins/maps/public/classes/sources/source.ts +++ b/x-pack/plugins/maps/public/classes/sources/source.ts @@ -59,10 +59,6 @@ export interface ISource { isTimeAware(): Promise; getImmutableProperties(dataFilters: DataFilters): Promise; getAttributionProvider(): (() => Promise) | null; - /* - * Returns true when source implements IESSource interface - */ - isESSource(): boolean; renderSourceSettingsEditor(sourceEditorArgs: SourceEditorArgs): ReactElement | null; supportsFitToBounds(): Promise; cloneDescriptor(): AbstractSourceDescriptor; @@ -146,10 +142,6 @@ export class AbstractSource implements ISource { return []; } - isESSource(): boolean { - return false; - } - // Returns function used to format value async createFieldFormatter(field: IField): Promise { return null; diff --git a/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts b/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts index 7ffc2955a79a65..cec5b1439dd5ca 100644 --- a/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts +++ b/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts @@ -95,14 +95,14 @@ const IS_POINT_FEATURE = [ export function getPointFilterExpression( isSourceGeoJson: boolean, - isESSource: boolean, + isESVectorTileSource: boolean, joinFilter?: FilterSpecification, timesliceMaskConfig?: TimesliceMaskConfig ): FilterSpecification { const filters: FilterSpecification[] = []; if (isSourceGeoJson) { filters.push(EXCLUDE_CENTROID_FEATURES); - } else if (!isSourceGeoJson && isESSource) { + } else if (isESVectorTileSource) { filters.push(['!=', ['get', '_mvt_label_position'], true]); } filters.push(IS_POINT_FEATURE); @@ -112,7 +112,7 @@ export function getPointFilterExpression( export function getLabelFilterExpression( isSourceGeoJson: boolean, - isESSource: boolean, + isESVectorTileSource: boolean, joinFilter?: FilterSpecification, timesliceMaskConfig?: TimesliceMaskConfig ): FilterSpecification { @@ -123,7 +123,7 @@ export function getLabelFilterExpression( // For GeoJSON sources, show label for centroid features or point/multi-point features only. // no explicit isCentroidFeature filter is needed, centroids are points and are included in the geometry filter. filters.push(IS_POINT_FEATURE); - } else if (!isSourceGeoJson && isESSource) { + } else if (isESVectorTileSource) { filters.push(['==', ['get', '_mvt_label_position'], true]); } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap index 6acd12f1b45a67..f4ab341e00be5a 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap @@ -84,7 +84,6 @@ exports[`EditLayerPanel is rendered 1`] = ` "hasErrors": [Function], "hasJoins": [Function], "renderSourceSettingsEditor": [Function], - "supportsElasticsearchFilters": [Function], "supportsFeatureEditing": [Function], "supportsFitToBounds": [Function], } @@ -116,7 +115,6 @@ exports[`EditLayerPanel is rendered 1`] = ` "hasErrors": [Function], "hasJoins": [Function], "renderSourceSettingsEditor": [Function], - "supportsElasticsearchFilters": [Function], "supportsFeatureEditing": [Function], "supportsFitToBounds": [Function], } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx index c6c78cf9786a68..7ffece731afab8 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx @@ -74,9 +74,6 @@ const mockLayer = { canShowTooltip: () => { return true; }, - supportsElasticsearchFilters: () => { - return false; - }, getLayerTypeIconName: () => { return 'vector'; }, diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx index 650e2df8dc1144..5562b08ed45b98 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx @@ -29,6 +29,7 @@ import { getData, getCore } from '../../kibana_services'; import { ILayer } from '../../classes/layers/layer'; import { isVectorLayer } from '../../classes/layers/vector_layer'; import { OnSourceChangeArgs } from '../../classes/sources/source'; +import { isESSource } from '../../classes/sources/es_source'; import { IField } from '../../classes/fields/field'; import { isLayerGroup } from '../../classes/layers/layer_group'; import { isSpatialJoin } from '../../classes/joins/is_spatial_join'; @@ -127,7 +128,7 @@ export class EditLayerPanel extends Component { if ( !this.props.selectedLayer || isLayerGroup(this.props.selectedLayer) || - !this.props.selectedLayer.supportsElasticsearchFilters() + !isESSource(this.props.selectedLayer.getSource()) ) { return null; } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx index 8bc8ea05d481ee..6dc06bed2de62a 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx @@ -13,6 +13,7 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { Join } from './resources/join'; import { JoinDocumentationPopover } from './resources/join_documentation_popover'; import { IVectorLayer } from '../../../classes/layers/vector_layer'; +import { isESSource } from '../../../classes/sources/es_source'; import { JoinDescriptor } from '../../../../common/descriptor_types'; import { SOURCE_TYPES, VECTOR_SHAPE_TYPE } from '../../../../common/constants'; import { AddJoinButton } from './add_join_button'; @@ -38,7 +39,7 @@ export function JoinEditor({ joins, layer, onChange, leftJoinFields, layerDispla useEffect(() => { let ignore = false; const source = layer.getSource(); - if (!source.isESSource()) { + if (!isESSource(source)) { setSpatialJoinDisableReason( i18n.translate('xpack.maps.layerPanel.joinEditor.spatialJoin.disabled.esSourceOnly', { defaultMessage: 'Spatial joins are not supported for {sourceType}.', diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.test.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.test.tsx index c8d6395c743ba6..7fe26cfe910db5 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.test.tsx @@ -58,6 +58,10 @@ class MockMbMap { }, }; } + + querySourceFeatures() { + return []; + } } class MockLayer { @@ -75,15 +79,22 @@ class MockLayer { return this._mbSourceId === mbSourceId; } + getMbSourceId() { + return this._mbSourceId; + } + isVisible() { return true; } getSource() { return { - isESSource() { + isMvt: () => { return true; }, + getIndexPatternId: () => { + return '1234'; + }, }; } } @@ -281,9 +292,6 @@ describe('TileStatusTracker', () => { const geojsonLayer1 = createMockLayer('layer1', 'layer1Source'); geojsonLayer1.getSource = () => { return { - isESSource() { - return true; - }, isMvt() { return false; }, diff --git a/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.tsx b/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.tsx index 972e691f6695e9..ba57b19147b72b 100644 --- a/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.tsx +++ b/x-pack/plugins/maps/public/connected_components/mb_map/tile_status_tracker/tile_status_tracker.tsx @@ -13,7 +13,7 @@ import type { TileError, TileMetaFeature } from '../../../../common/descriptor_t import { SPATIAL_FILTERS_LAYER_ID } from '../../../../common/constants'; import { ILayer } from '../../../classes/layers/layer'; import { isLayerGroup } from '../../../classes/layers/layer_group'; -import { IVectorSource } from '../../../classes/sources/vector_source'; +import { isESVectorTileSource } from '../../../classes/sources/es_source'; import { getTileKey as getCenterTileKey } from '../../../classes/util/geo_tile_utils'; import { boundsToExtent } from '../../../classes/util/maplibre_utils'; import { ES_MVT_META_LAYER_NAME } from '../../../classes/util/tile_meta_feature_utils'; @@ -69,12 +69,7 @@ export class TileStatusTracker extends Component { return; } - const source = layer.getSource(); - if ( - source.isESSource() && - typeof (source as IVectorSource).isMvt === 'function' && - !(source as IVectorSource).isMvt() - ) { + if (!isESVectorTileSource(layer.getSource())) { // clear tile cache when layer is not tiled this._tileErrorCache.clearLayer(layer.getId(), this._updateTileStatusForAllLayers); } @@ -156,7 +151,7 @@ export class TileStatusTracker extends Component { const ajaxError = 'body' in e.error && 'statusText' in e.error ? (e.error as AJAXError) : undefined; - if (!ajaxError || !targetLayer.getSource().isESSource()) { + if (!ajaxError || !isESVectorTileSource(targetLayer.getSource())) { this._updateTileStatusForAllLayers(); return; } @@ -254,11 +249,7 @@ export class TileStatusTracker extends Component { }, 100); _getTileMetaFeatures = (layer: ILayer) => { - const source = layer.getSource(); - return layer.isVisible() && - source.isESSource() && - typeof (source as IVectorSource).isMvt === 'function' && - (source as IVectorSource).isMvt() + return layer.isVisible() && isESVectorTileSource(layer.getSource()) ? // querySourceFeatures can return duplicated features when features cross tile boundaries. // Tile meta will never have duplicated features since by their nature, tile meta is a feature contained within a single tile (this.props.mbMap diff --git a/x-pack/plugins/ml/public/maps/anomaly_source.tsx b/x-pack/plugins/ml/public/maps/anomaly_source.tsx index 27d43eeb95771c..b1616506232699 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_source.tsx +++ b/x-pack/plugins/ml/public/maps/anomaly_source.tsx @@ -336,11 +336,6 @@ export class AnomalySource implements IVectorSource { return []; } - isESSource(): boolean { - // IGNORE: This is only relevant if your source is backed by an index-pattern - return false; - } - isFilterByMapBounds(): boolean { // Only implement if you can query this data with a bounding-box return false;