Skip to content

Commit

Permalink
use index patterns and search services for autocomplete (#92861)
Browse files Browse the repository at this point in the history
* use index patterns and search services for autocomplete

* imports

* extend DataRequestHandlerContext

* Catch error if index patterns service can't be created.

* doc

Co-authored-by: Kibana Machine <[email protected]>
  • Loading branch information
lizozom and kibanamachine authored Mar 17, 2021
1 parent ff16550 commit 2ef7f3b
Show file tree
Hide file tree
Showing 18 changed files with 96 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ export declare class IndexPatternsServiceProvider implements Plugin<void, IndexP
| Method | Modifiers | Description |
| --- | --- | --- |
| [setup(core, { expressions })](./kibana-plugin-plugins-data-server.indexpatternsserviceprovider.setup.md) | | |
| [setup(core, { logger, expressions })](./kibana-plugin-plugins-data-server.indexpatternsserviceprovider.setup.md) | | |
| [start(core, { fieldFormats, logger })](./kibana-plugin-plugins-data-server.indexpatternsserviceprovider.start.md) | | |
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,15 @@
<b>Signature:</b>

```typescript
setup(core: CoreSetup<DataPluginStartDependencies, DataPluginStart>, { expressions }: IndexPatternsServiceSetupDeps): void;
setup(core: CoreSetup<DataPluginStartDependencies, DataPluginStart>, { logger, expressions }: IndexPatternsServiceSetupDeps): void;
```

## Parameters

| Parameter | Type | Description |
| --- | --- | --- |
| core | <code>CoreSetup&lt;DataPluginStartDependencies, DataPluginStart&gt;</code> | |
| { expressions } | <code>IndexPatternsServiceSetupDeps</code> | |
| { logger, expressions } | <code>IndexPatternsServiceSetupDeps</code> | |

<b>Returns:</b>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,5 @@
| [KibanaContext](./kibana-plugin-plugins-data-server.kibanacontext.md) | |
| [ParsedInterval](./kibana-plugin-plugins-data-server.parsedinterval.md) | |
| [Query](./kibana-plugin-plugins-data-server.query.md) | |
| [SearchRequestHandlerContext](./kibana-plugin-plugins-data-server.searchrequesthandlercontext.md) | |
| [TimeRange](./kibana-plugin-plugins-data-server.timerange.md) | |

This file was deleted.

3 changes: 2 additions & 1 deletion src/plugins/data/server/autocomplete/routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@
import { Observable } from 'rxjs';
import { CoreSetup, SharedGlobalConfig } from 'kibana/server';
import { registerValueSuggestionsRoute } from './value_suggestions_route';
import { DataRequestHandlerContext } from '../types';

export function registerRoutes({ http }: CoreSetup, config$: Observable<SharedGlobalConfig>): void {
const router = http.createRouter();
const router = http.createRouter<DataRequestHandlerContext>();

registerValueSuggestionsRoute(router, config$);
}
36 changes: 26 additions & 10 deletions src/plugins/data/server/autocomplete/value_suggestions_route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,12 @@ import { IRouter, SharedGlobalConfig } from 'kibana/server';

import { Observable } from 'rxjs';
import { first } from 'rxjs/operators';
import { IFieldType, Filter } from '../index';
import { findIndexPatternById, getFieldByName } from '../index_patterns';
import { IFieldType, Filter, ES_SEARCH_STRATEGY, IEsSearchRequest } from '../index';
import { getRequestAbortedSignal } from '../lib';
import { DataRequestHandlerContext } from '../types';

export function registerValueSuggestionsRoute(
router: IRouter,
router: IRouter<DataRequestHandlerContext>,
config$: Observable<SharedGlobalConfig>
) {
router.post(
Expand All @@ -44,24 +44,40 @@ export function registerValueSuggestionsRoute(
const config = await config$.pipe(first()).toPromise();
const { field: fieldName, query, filters } = request.body;
const { index } = request.params;
const { client } = context.core.elasticsearch.legacy;
const signal = getRequestAbortedSignal(request.events.aborted$);

if (!context.indexPatterns) {
return response.badRequest();
}

const autocompleteSearchOptions = {
timeout: `${config.kibana.autocompleteTimeout.asMilliseconds()}ms`,
terminate_after: config.kibana.autocompleteTerminateAfter.asMilliseconds(),
};

const indexPattern = await findIndexPatternById(context.core.savedObjects.client, index);

const field = indexPattern && getFieldByName(fieldName, indexPattern);
const indexPatterns = await context.indexPatterns.find(index, 1);
if (!indexPatterns || indexPatterns.length === 0) {
return response.notFound();
}
const field = indexPatterns[0].getFieldByName(fieldName);
const body = await getBody(autocompleteSearchOptions, field || fieldName, query, filters);

const result = await client.callAsCurrentUser('search', { index, body }, { signal });
const searchRequest: IEsSearchRequest = {
params: {
index,
body,
},
};
const { rawResponse } = await context.search
.search(searchRequest, {
strategy: ES_SEARCH_STRATEGY,
abortSignal: signal,
})
.toPromise();

const buckets: any[] =
get(result, 'aggregations.suggestions.buckets') ||
get(result, 'aggregations.nestedSuggestions.suggestions.buckets');
get(rawResponse, 'aggregations.suggestions.buckets') ||
get(rawResponse, 'aggregations.nestedSuggestions.suggestions.buckets');

return response.ok({ body: map(buckets || [], 'key') });
}
Expand Down
4 changes: 2 additions & 2 deletions src/plugins/data/server/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -236,10 +236,10 @@ export {
SearchUsage,
SearchSessionService,
ISearchSessionService,
SearchRequestHandlerContext,
DataRequestHandlerContext,
} from './search';

export { DataRequestHandlerContext } from './types';

// Search namespace
export const search = {
aggs: {
Expand Down
4 changes: 4 additions & 0 deletions src/plugins/data/server/index_patterns/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
* Side Public License, v 1.
*/

import { IndexPatternsService } from '../../common/index_patterns';

export * from './utils';
export {
IndexPatternsFetcher,
Expand All @@ -15,3 +17,5 @@ export {
getCapabilitiesForRollupIndices,
} from './fetcher';
export { IndexPatternsServiceProvider, IndexPatternsServiceStart } from './index_patterns_service';

export type IndexPatternsHandlerContext = IndexPatternsService;
20 changes: 19 additions & 1 deletion src/plugins/data/server/index_patterns/index_patterns_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import { getIndexPatternLoad } from './expressions';
import { UiSettingsServerToCommon } from './ui_settings_wrapper';
import { IndexPatternsApiServer } from './index_patterns_api_client';
import { SavedObjectsClientServerToCommon } from './saved_objects_client_wrapper';
import { DataRequestHandlerContext } from '../types';

export interface IndexPatternsServiceStart {
indexPatternsServiceFactory: (
Expand All @@ -35,6 +36,7 @@ export interface IndexPatternsServiceStart {

export interface IndexPatternsServiceSetupDeps {
expressions: ExpressionsServerSetup;
logger: Logger;
}

export interface IndexPatternsServiceStartDeps {
Expand All @@ -45,11 +47,27 @@ export interface IndexPatternsServiceStartDeps {
export class IndexPatternsServiceProvider implements Plugin<void, IndexPatternsServiceStart> {
public setup(
core: CoreSetup<DataPluginStartDependencies, DataPluginStart>,
{ expressions }: IndexPatternsServiceSetupDeps
{ logger, expressions }: IndexPatternsServiceSetupDeps
) {
core.savedObjects.registerType(indexPatternSavedObjectType);
core.capabilities.registerProvider(capabilitiesProvider);

core.http.registerRouteHandlerContext<DataRequestHandlerContext, 'indexPatterns'>(
'indexPatterns',
async (context, request) => {
const [coreStart, , dataStart] = await core.getStartServices();
try {
return await dataStart.indexPatterns.indexPatternsServiceFactory(
coreStart.savedObjects.getScopedClient(request),
coreStart.elasticsearch.client.asScoped(request).asCurrentUser
);
} catch (e) {
logger.error(e);
return undefined;
}
}
);

registerRoutes(core.http, core.getStartServices);

expressions.registerFunction(getIndexPatternLoad({ getStartServices: core.getStartServices }));
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/data/server/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
} from './search/mocks';
import { createFieldFormatsSetupMock, createFieldFormatsStartMock } from './field_formats/mocks';
import { createIndexPatternsStartMock } from './index_patterns/mocks';
import { DataRequestHandlerContext } from './search';
import { DataRequestHandlerContext } from './types';

function createSetupContract() {
return {
Expand Down
5 changes: 4 additions & 1 deletion src/plugins/data/server/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,10 @@ export class DataServerPlugin
this.queryService.setup(core);
this.autocompleteService.setup(core);
this.kqlTelemetryService.setup(core, { usageCollection });
this.indexPatterns.setup(core, { expressions });
this.indexPatterns.setup(core, {
expressions,
logger: this.logger.get('indexPatterns'),
});

core.uiSettings.register(getUiSettings());

Expand Down
2 changes: 1 addition & 1 deletion src/plugins/data/server/search/routes/msearch.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { SearchRouteDependencies } from '../search_service';

import { getCallMsearch } from './call_msearch';
import { reportServerError } from '../../../../kibana_utils/server';
import type { DataPluginRouter } from '../types';
import type { DataPluginRouter } from '../../types';
/**
* The msearch route takes in an array of searches, each consisting of header
* and body json, and reformts them into a single request for the _msearch API.
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/data/server/search/routes/search.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { first } from 'rxjs/operators';
import { schema } from '@kbn/config-schema';
import { getRequestAbortedSignal } from '../../lib';
import { reportServerError } from '../../../../kibana_utils/server';
import type { DataPluginRouter } from '../types';
import type { DataPluginRouter } from '../../types';

export function registerSearchRoute(router: DataPluginRouter): void {
router.post(
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/data/server/search/search_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ import type {
ISearchStrategy,
SearchEnhancements,
SearchStrategyDependencies,
DataRequestHandlerContext,
} from './types';

import { AggsService } from './aggs';
Expand Down Expand Up @@ -66,6 +65,7 @@ import { ConfigSchema } from '../../config';
import { ISearchSessionService, SearchSessionService } from './session';
import { KbnServerError } from '../../../kibana_utils/server';
import { registerBsearchRoute } from './routes/bsearch';
import { DataRequestHandlerContext } from '../types';

type StrategyMap = Record<string, ISearchStrategy<any, any>>;

Expand Down
11 changes: 0 additions & 11 deletions src/plugins/data/server/search/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,10 @@

import { Observable } from 'rxjs';
import type {
IRouter,
IScopedClusterClient,
IUiSettingsClient,
SavedObjectsClientContract,
KibanaRequest,
RequestHandlerContext,
} from 'src/core/server';
import {
ISearchOptions,
Expand Down Expand Up @@ -116,12 +114,3 @@ export interface ISearchStart<
}

export type SearchRequestHandlerContext = IScopedSearchClient;

/**
* @internal
*/
export interface DataRequestHandlerContext extends RequestHandlerContext {
search: SearchRequestHandlerContext;
}

export type DataPluginRouter = IRouter<DataRequestHandlerContext>;
15 changes: 8 additions & 7 deletions src/plugins/data/server/server.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -312,6 +312,12 @@ export const config: PluginConfigDescriptor<ConfigSchema>;

// @internal (undocumented)
export interface DataRequestHandlerContext extends RequestHandlerContext {
// Warning: (ae-forgotten-export) The symbol "IndexPatternsHandlerContext" needs to be exported by the entry point index.d.ts
//
// (undocumented)
indexPatterns?: IndexPatternsHandlerContext;
// Warning: (ae-forgotten-export) The symbol "SearchRequestHandlerContext" needs to be exported by the entry point index.d.ts
//
// (undocumented)
search: SearchRequestHandlerContext;
}
Expand Down Expand Up @@ -954,7 +960,7 @@ export class IndexPatternsServiceProvider implements Plugin_3<void, IndexPattern
// Warning: (ae-forgotten-export) The symbol "IndexPatternsServiceSetupDeps" needs to be exported by the entry point index.d.ts
//
// (undocumented)
setup(core: CoreSetup_2<DataPluginStartDependencies, PluginStart>, { expressions }: IndexPatternsServiceSetupDeps): void;
setup(core: CoreSetup_2<DataPluginStartDependencies, PluginStart>, { logger, expressions }: IndexPatternsServiceSetupDeps): void;
// Warning: (ae-forgotten-export) The symbol "IndexPatternsServiceStartDeps" needs to be exported by the entry point index.d.ts
//
// (undocumented)
Expand Down Expand Up @@ -1319,11 +1325,6 @@ export const search: {
tabifyGetColumns: typeof tabifyGetColumns;
};

// Warning: (ae-missing-release-tag) "SearchRequestHandlerContext" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export type SearchRequestHandlerContext = IScopedSearchClient;

// @internal
export class SearchSessionService implements ISearchSessionService {
constructor();
Expand Down Expand Up @@ -1515,7 +1516,7 @@ export function usageProvider(core: CoreSetup_2): SearchUsage;
// src/plugins/data/server/index.ts:270:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts
// src/plugins/data/server/index.ts:271:1 - (ae-forgotten-export) The symbol "calcAutoIntervalLessThan" needs to be exported by the entry point index.d.ts
// src/plugins/data/server/plugin.ts:79:74 - (ae-forgotten-export) The symbol "DataEnhancements" needs to be exported by the entry point index.d.ts
// src/plugins/data/server/search/types.ts:114:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts
// src/plugins/data/server/search/types.ts:112:5 - (ae-forgotten-export) The symbol "ISearchStartSearchSource" needs to be exported by the entry point index.d.ts

// (No @packageDocumentation comment for this package)

Expand Down
22 changes: 22 additions & 0 deletions src/plugins/data/server/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0 and the Server Side Public License, v 1; you may not use this file except
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/

import type { IRouter, RequestHandlerContext } from 'src/core/server';

import { SearchRequestHandlerContext } from './search';
import { IndexPatternsHandlerContext } from './index_patterns';

/**
* @internal
*/
export interface DataRequestHandlerContext extends RequestHandlerContext {
search: SearchRequestHandlerContext;
indexPatterns?: IndexPatternsHandlerContext;
}

export type DataPluginRouter = IRouter<DataRequestHandlerContext>;
6 changes: 2 additions & 4 deletions x-pack/plugins/infra/server/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
* 2.0.
*/

import type { RequestHandlerContext } from 'src/core/server';
import type { SearchRequestHandlerContext } from '../../../../src/plugins/data/server';
import type { DataRequestHandlerContext } from '../../../../src/plugins/data/server';
import { MlPluginSetup } from '../../ml/server';

export type MlSystem = ReturnType<MlPluginSetup['mlSystemProvider']>;
Expand All @@ -27,7 +26,6 @@ export type InfraRequestHandlerContext = InfraMlRequestHandlerContext &
/**
* @internal
*/
export interface InfraPluginRequestHandlerContext extends RequestHandlerContext {
export interface InfraPluginRequestHandlerContext extends DataRequestHandlerContext {
infra: InfraRequestHandlerContext;
search: SearchRequestHandlerContext;
}

0 comments on commit 2ef7f3b

Please sign in to comment.