Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

use index patterns and search services for autocomplete #92861

Merged
merged 12 commits into from
Mar 17, 2021
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);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think you want to use get instead of find. find searches by title, get uses id

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

get uses the id fields, and the index here is the title.

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;
}