diff --git a/changelogs/fragments/8713.yml b/changelogs/fragments/8713.yml new file mode 100644 index 000000000000..547b7a044bf1 --- /dev/null +++ b/changelogs/fragments/8713.yml @@ -0,0 +1,2 @@ +fix: +-[Enhancement] Update auto-complete-api-with-mds ([#8713](https://github.com/opensearch-project/OpenSearch-Dashboards/pull/8713)) \ No newline at end of file diff --git a/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.ts b/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.ts index fdbe4b5d932e..e677abc9f4c7 100644 --- a/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.ts +++ b/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.ts @@ -53,10 +53,17 @@ export const getEmptyValueSuggestions = (() => Promise.resolve([])) as ValueSugg export const setupValueSuggestionProvider = (core: CoreSetup): ValueSuggestionsGetFn => { const requestSuggestions = memoize( - (index: string, field: IFieldType, query: string, boolFilter: any = [], signal?: AbortSignal) => + ( + index: string, + field: IFieldType, + query: string, + boolFilter: any = [], + signal?: AbortSignal, + dataSourceId?: string + ) => core.http.fetch(`/api/opensearch-dashboards/suggestions/values/${index}`, { method: 'POST', - body: JSON.stringify({ query, field: field.name, boolFilter }), + body: JSON.stringify({ query, field: field.name, boolFilter, dataSourceId }), signal, }), resolver @@ -79,7 +86,13 @@ export const setupValueSuggestionProvider = (core: CoreSetup): ValueSuggestionsG } else if (!shouldSuggestValues || !field.aggregatable || field.type !== 'string') { return []; } - - return await requestSuggestions(title, field, query, boolFilter, signal); + return await requestSuggestions( + title, + field, + query, + boolFilter, + signal, + indexPattern.dataSourceRef?.id + ); }; }; diff --git a/src/plugins/data/server/autocomplete/value_suggestions_route.ts b/src/plugins/data/server/autocomplete/value_suggestions_route.ts index 1d053d05e321..379f90fd8072 100644 --- a/src/plugins/data/server/autocomplete/value_suggestions_route.ts +++ b/src/plugins/data/server/autocomplete/value_suggestions_route.ts @@ -57,6 +57,7 @@ export function registerValueSuggestionsRoute( field: schema.string(), query: schema.string(), boolFilter: schema.maybe(schema.any()), + dataSourceId: schema.maybe(schema.string({ defaultValue: '' })), }, { unknowns: 'allow' } ), @@ -64,7 +65,7 @@ export function registerValueSuggestionsRoute( }, async (context, request, response) => { const config = await config$.pipe(first()).toPromise(); - const { field: fieldName, query, boolFilter } = request.body; + const { field: fieldName, query, boolFilter, dataSourceId } = request.body; const { index } = request.params; const { client } = context.core.opensearch.legacy; const signal = getRequestAbortedSignal(request.events.aborted$); @@ -80,8 +81,15 @@ export function registerValueSuggestionsRoute( const body = await getBody(autocompleteSearchOptions, field || fieldName, query, boolFilter); try { - const result = await client.callAsCurrentUser('search', { index, body }, { signal }); - + let result; + if (dataSourceId) { + const dataSourceClient = await context.dataSource.opensearch.legacy.getClient( + dataSourceId + ); + result = await dataSourceClient.callAPI('search', { index, body }, { signal }); + } else { + result = await client.callAsCurrentUser('search', { index, body }, { signal }); + } const buckets: any[] = get(result, 'aggregations.suggestions.buckets') || get(result, 'aggregations.nestedSuggestions.suggestions.buckets');