allows passing multiple dataviews to buildEsQuery (#140162)

This commit is contained in:
Peter Pisljar 2022-09-14 09:01:33 +02:00 committed by GitHub
parent 9fe5dd51e4
commit 59ea09f9ee
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 59 additions and 13 deletions

View file

@ -45,7 +45,7 @@ function removeMatchAll<T>(filters: T[]) {
* @public
*/
export function buildEsQuery(
indexPattern: DataViewBase | undefined,
indexPattern: DataViewBase | DataViewBase[] | undefined,
queries: AnyQuery | AnyQuery[],
filters: Filter | Filter[],
config: EsQueryConfig = {
@ -60,7 +60,7 @@ export function buildEsQuery(
const validQueries = queries.filter(isOfQueryType).filter((query) => has(query, 'query'));
const queriesByLanguage = groupBy(validQueries, 'language');
const kueryQuery = buildQueryFromKuery(
indexPattern,
Array.isArray(indexPattern) ? indexPattern[0] : indexPattern,
queriesByLanguage.kuery,
{ allowLeadingWildcards: config.allowLeadingWildcards },
{

View file

@ -15,6 +15,7 @@ describe('build query', () => {
const indexPattern: DataViewBase = {
fields,
title: 'dataView',
id: '1',
};
describe('buildQueryFromFilters', () => {
@ -201,5 +202,43 @@ describe('build query', () => {
const result = buildQueryFromFilters(filters, indexPattern, { nestedIgnoreUnmapped: true });
expect(result.filter).toEqual(expectedESQueries);
});
test('should work with multiple data views', () => {
const indexPattern2: DataViewBase = {
fields,
title: 'dataView',
id: '2',
};
const filters = [
{
query: { query_string: { query: 'foo' } },
meta: { index: '1' },
},
{
query: { query_string: { query: 'bar' } },
meta: { index: '2' },
},
] as Filter[];
const result = buildQueryFromFilters(filters, [indexPattern, indexPattern2], {
ignoreFilterIfFieldNotInIndex: false,
});
expect(result.filter).toMatchInlineSnapshot(`
Array [
Object {
"query_string": Object {
"query": "foo",
},
},
Object {
"query_string": Object {
"query": "bar",
},
},
]
`);
});
});
});

View file

@ -64,27 +64,34 @@ export interface EsQueryFiltersConfig {
* @public
*/
export const buildQueryFromFilters = (
filters: Filter[] = [],
indexPattern: DataViewBase | undefined,
inputFilters: Filter[] = [],
inputDataViews: DataViewBase | DataViewBase[] | undefined,
{ ignoreFilterIfFieldNotInIndex = false, nestedIgnoreUnmapped }: EsQueryFiltersConfig = {
ignoreFilterIfFieldNotInIndex: false,
}
): BoolQuery => {
filters = filters.filter((filter) => filter && !isFilterDisabled(filter));
const filters = inputFilters.filter((filter) => filter && !isFilterDisabled(filter));
const indexPatterns = Array.isArray(inputDataViews) ? inputDataViews : [inputDataViews];
const findIndexPattern = (id: string | undefined) => {
return indexPatterns.find((index) => index?.id === id) || indexPatterns[0];
};
const filtersToESQueries = (negate: boolean) => {
return filters
.filter((f) => !!f)
.filter(filterNegate(negate))
.filter(
(filter) => !ignoreFilterIfFieldNotInIndex || filterMatchesIndex(filter, indexPattern)
)
.map((filter) => {
return migrateFilter(filter, indexPattern);
.filter((filter) => {
const indexPattern = findIndexPattern(filter.meta?.index);
return !ignoreFilterIfFieldNotInIndex || filterMatchesIndex(filter, indexPattern);
})
.map((filter) => {
const indexPattern = findIndexPattern(filter.meta?.index);
const migratedFilter = migrateFilter(filter, indexPattern);
return handleNestedFilter(migratedFilter, indexPattern, {
ignoreUnmapped: nestedIgnoreUnmapped,
});
})
.map((filter) =>
handleNestedFilter(filter, indexPattern, { ignoreUnmapped: nestedIgnoreUnmapped })
)
.map(cleanFilter)
.map(translateToQuery);
};