[es-query] Fix logic for detecting scripted phrase fields (#119511) (#119871)

* WIP, started updating functions for detecting scripted phrase filters

* replace script.script with query.script.script

* added test to verify detection of scripted and phrase filters

* with elastic@ email

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>

Co-authored-by: Jean-Louis Leysens <jloleysens@gmail.com>
This commit is contained in:
Kibana Machine 2021-11-29 14:51:40 -05:00 committed by GitHub
parent a5f3814947
commit 740aa538e1
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 36 additions and 9 deletions

View file

@ -5,16 +5,19 @@
* in compliance with, at your election, the Elastic License 2.0 or the Server
* Side Public License, v 1.
*/
import { set } from 'lodash';
import {
buildInlineScriptForPhraseFilter,
buildPhraseFilter,
getPhraseFilterField,
PhraseFilter,
isPhraseFilter,
isScriptedPhraseFilter,
} from './phrase_filter';
import { fields, getField } from '../stubs';
import { DataViewBase } from '../../es_query';
import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey';
import { Filter } from './types';
describe('Phrase filter builder', () => {
let indexPattern: DataViewBase;
@ -164,3 +167,23 @@ describe('getPhraseFilterField', function () {
expect(result).toBe('extension');
});
});
describe('isPhraseFilter', () => {
it('should return true if the filter is a phrases filter false otherwise', () => {
const filter: Filter = set({ meta: {} }, 'query.match_phrase', {}) as Filter;
const unknownFilter = {} as Filter;
expect(isPhraseFilter(filter)).toBe(true);
expect(isPhraseFilter(unknownFilter)).toBe(false);
});
});
describe('isScriptedPhraseFilter', () => {
it('should return true if the filter is a phrases filter false otherwise', () => {
const filter: Filter = set({ meta: {} }, 'query.script.script.params.value', {}) as Filter;
const unknownFilter = {} as Filter;
expect(isScriptedPhraseFilter(filter)).toBe(true);
expect(isPhraseFilter(unknownFilter)).toBe(false);
});
});

View file

@ -31,8 +31,10 @@ export type PhraseFilter = Filter & {
export type ScriptedPhraseFilter = Filter & {
meta: PhraseFilterMeta;
script: {
script: estypes.InlineScript;
query: {
script: {
script: estypes.InlineScript;
};
};
};
@ -58,7 +60,7 @@ export const isPhraseFilter = (filter: Filter): filter is PhraseFilter => {
* @public
*/
export const isScriptedPhraseFilter = (filter: Filter): filter is ScriptedPhraseFilter =>
has(filter, 'script.script.params.value');
has(filter, 'query.script.script.params.value');
/** @internal */
export const getPhraseFilterField = (filter: PhraseFilter) => {
@ -77,7 +79,7 @@ export const getPhraseFilterValue = (
const queryValue = Object.values(queryConfig)[0];
return isPlainObject(queryValue) ? queryValue.query : queryValue;
} else {
return filter.script.script.params?.value;
return filter.query?.script?.script?.params?.value;
}
};

View file

@ -40,7 +40,9 @@ function getExistingFilter(
}
if (isScriptedPhraseFilter(filter)) {
return filter.meta.field === fieldName && filter.script.script.params?.value === value;
return (
filter.meta.field === fieldName && filter.query?.script?.script?.params?.value === value
);
}
}) as any;
}

View file

@ -20,7 +20,7 @@ import {
import { FilterValueFormatter } from '../../../../../common';
const getScriptedPhraseValue = (filter: PhraseFilter) =>
get(filter, ['script', 'script', 'params', 'value']);
get(filter, ['query', 'script', 'script', 'params', 'value']);
const getFormattedValueFn = (value: any) => {
return (formatter?: FilterValueFormatter) => {

View file

@ -97,8 +97,8 @@ export class PhraseFilterManager extends FilterManager {
}
// scripted field filter
if (_.has(kbnFilter, 'script')) {
return _.get(kbnFilter, 'script.script.params.value');
if (_.has(kbnFilter, 'query.script')) {
return _.get(kbnFilter, 'query.script.script.params.value');
}
// single phrase filter