From effaf1a72df165c5998a46d2f85f1e767254d596 Mon Sep 17 00:00:00 2001 From: Maja Grubic Date: Wed, 9 Dec 2020 12:08:18 +0000 Subject: [PATCH] [Search Source] Do not pick scripted fields if * provided (#85133) * [Search Source] Do not pick scripted fields if * provided * Update src/plugins/data/common/search/search_source/search_source.ts Co-authored-by: Tim Roes * Add unit test * Add documentation Co-authored-by: Tim Roes --- .../search_source/search_source.test.ts | 15 +++++++++++++++ .../search/search_source/search_source.ts | 19 +++++++++++++------ 2 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/plugins/data/common/search/search_source/search_source.test.ts b/src/plugins/data/common/search/search_source/search_source.test.ts index d0c6f0456a8f1e..ec5174df50f138 100644 --- a/src/plugins/data/common/search/search_source/search_source.test.ts +++ b/src/plugins/data/common/search/search_source/search_source.test.ts @@ -341,6 +341,21 @@ describe('SearchSource', () => { const request = await searchSource.getSearchRequestBody(); expect(request.script_fields).toEqual({ hello: {} }); }); + + test('returns all scripted fields when one fields entry is *', async () => { + searchSource.setField('index', ({ + ...indexPattern, + getComputedFields: () => ({ + storedFields: [], + scriptFields: { hello: {}, world: {} }, + docvalueFields: [], + }), + } as unknown) as IndexPattern); + searchSource.setField('fields', ['timestamp', '*']); + + const request = await searchSource.getSearchRequestBody(); + expect(request.script_fields).toEqual({ hello: {}, world: {} }); + }); }); describe('handling for when specific fields are provided', () => { diff --git a/src/plugins/data/common/search/search_source/search_source.ts b/src/plugins/data/common/search/search_source/search_source.ts index 2206d6d2816e2f..fce0b737b962ba 100644 --- a/src/plugins/data/common/search/search_source/search_source.ts +++ b/src/plugins/data/common/search/search_source/search_source.ts @@ -408,7 +408,12 @@ export class SearchSource { case 'query': return addToRoot(key, (data[key] || []).concat(val)); case 'fields': - // uses new Fields API + // This will pass the passed in parameters to the new fields API. + // Also if will only return scripted fields that are part of the specified + // array of fields. If you specify the wildcard `*` as an array element + // the fields API will return all fields, and all scripted fields will be returned. + // NOTE: While the fields API supports wildcards within names, e.g. `user.*` + // scripted fields won't be considered for this. return addToBody('fields', val); case 'fieldsFromSource': // preserves legacy behavior @@ -518,11 +523,13 @@ export class SearchSource { ); const uniqFieldNames = [...new Set([...bodyFieldNames, ...fieldsFromSource])]; - // filter down script_fields to only include items specified - body.script_fields = pick( - body.script_fields, - Object.keys(body.script_fields).filter((f) => uniqFieldNames.includes(f)) - ); + if (!uniqFieldNames.includes('*')) { + // filter down script_fields to only include items specified + body.script_fields = pick( + body.script_fields, + Object.keys(body.script_fields).filter((f) => uniqFieldNames.includes(f)) + ); + } // request the remaining fields from stored_fields just in case, since the // fields API does not handle stored fields