Skip to content

Commit effaf1a

Browse files
Maja Grubictimroes
andcommitted
[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 <mail@timroes.de> * Add unit test * Add documentation Co-authored-by: Tim Roes <mail@timroes.de>
1 parent 42ee8ba commit effaf1a

2 files changed

Lines changed: 28 additions & 6 deletions

File tree

src/plugins/data/common/search/search_source/search_source.test.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,21 @@ describe('SearchSource', () => {
341341
const request = await searchSource.getSearchRequestBody();
342342
expect(request.script_fields).toEqual({ hello: {} });
343343
});
344+
345+
test('returns all scripted fields when one fields entry is *', async () => {
346+
searchSource.setField('index', ({
347+
...indexPattern,
348+
getComputedFields: () => ({
349+
storedFields: [],
350+
scriptFields: { hello: {}, world: {} },
351+
docvalueFields: [],
352+
}),
353+
} as unknown) as IndexPattern);
354+
searchSource.setField('fields', ['timestamp', '*']);
355+
356+
const request = await searchSource.getSearchRequestBody();
357+
expect(request.script_fields).toEqual({ hello: {}, world: {} });
358+
});
344359
});
345360

346361
describe('handling for when specific fields are provided', () => {

src/plugins/data/common/search/search_source/search_source.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,12 @@ export class SearchSource {
408408
case 'query':
409409
return addToRoot(key, (data[key] || []).concat(val));
410410
case 'fields':
411-
// uses new Fields API
411+
// This will pass the passed in parameters to the new fields API.
412+
// Also if will only return scripted fields that are part of the specified
413+
// array of fields. If you specify the wildcard `*` as an array element
414+
// the fields API will return all fields, and all scripted fields will be returned.
415+
// NOTE: While the fields API supports wildcards within names, e.g. `user.*`
416+
// scripted fields won't be considered for this.
412417
return addToBody('fields', val);
413418
case 'fieldsFromSource':
414419
// preserves legacy behavior
@@ -518,11 +523,13 @@ export class SearchSource {
518523
);
519524
const uniqFieldNames = [...new Set([...bodyFieldNames, ...fieldsFromSource])];
520525

521-
// filter down script_fields to only include items specified
522-
body.script_fields = pick(
523-
body.script_fields,
524-
Object.keys(body.script_fields).filter((f) => uniqFieldNames.includes(f))
525-
);
526+
if (!uniqFieldNames.includes('*')) {
527+
// filter down script_fields to only include items specified
528+
body.script_fields = pick(
529+
body.script_fields,
530+
Object.keys(body.script_fields).filter((f) => uniqFieldNames.includes(f))
531+
);
532+
}
526533

527534
// request the remaining fields from stored_fields just in case, since the
528535
// fields API does not handle stored fields

0 commit comments

Comments
 (0)