Skip to content

Commit

Permalink
[ML] Fix new job with must_not saved search (elastic#71831) (elastic#…
Browse files Browse the repository at this point in the history
…71965)

* [ML] Fix new job with must_not saved search

* adding tests

* initialising saved search in beforeEach

* another commit for odd github issues

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>

Co-authored-by: Elastic Machine <elasticmachine@users.noreply.github.com>
  • Loading branch information
jgowdyelastic and elasticmachine authored Jul 16, 2020
1 parent 666846d commit 3883daf
Show file tree
Hide file tree
Showing 2 changed files with 217 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,209 @@
/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License;
* you may not use this file except in compliance with the Elastic License.
*/

import { IUiSettingsClient } from 'kibana/public';
import { IIndexPattern } from '../../../../../../../../src/plugins/data/common/index_patterns';
import { SavedSearchSavedObject } from '../../../../../common/types/kibana';
import { createSearchItems } from './new_job_utils';

describe('createSearchItems', () => {
const kibanaConfig = {} as IUiSettingsClient;
const indexPattern = ({
fields: [],
} as unknown) as IIndexPattern;

let savedSearch = ({} as unknown) as SavedSearchSavedObject;
beforeEach(() => {
savedSearch = ({
client: {
http: {
basePath: {
basePath: '/abc',
serverBasePath: '/abc',
},
anonymousPaths: {},
},
batchQueue: [],
},
attributes: {
title: 'not test',
description: '',
hits: 0,
columns: ['_source'],
sort: [],
version: 1,
kibanaSavedObjectMeta: {
searchSourceJSON: '',
},
},
_version: 'WzI0OSw0XQ==',
id: '4b9b1010-c678-11ea-b6e6-e942978da29c',
type: 'search',
migrationVersion: {
search: '7.4.0',
},
references: [
{
name: 'kibanaSavedObjectMeta.searchSourceJSON.index',
type: 'index-pattern',
id: '7e252840-bd27-11ea-8a6c-75d1a0bd08ab',
},
],
} as unknown) as SavedSearchSavedObject;
});

test('should match index pattern', () => {
const resp = createSearchItems(kibanaConfig, indexPattern, null);
expect(resp).toStrictEqual({
combinedQuery: { bool: { must: [{ match_all: {} }] } },
query: { query: '', language: 'lucene' },
});
});

test('should match saved search with kuery and condition', () => {
const searchSource = {
highlightAll: true,
version: true,
query: { query: 'airline : "AAL" ', language: 'kuery' },
filter: [],
indexRefName: 'kibanaSavedObjectMeta.searchSourceJSON.index',
};
savedSearch.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource);

const resp = createSearchItems(kibanaConfig, indexPattern, savedSearch);
expect(resp).toStrictEqual({
combinedQuery: {
bool: {
should: [{ match_phrase: { airline: 'AAL' } }],
minimum_should_match: 1,
filter: [],
must_not: [],
},
},
query: {
language: 'kuery',
query: 'airline : "AAL" ',
},
});
});

test('should match saved search with kuery and not condition', () => {
const searchSource = {
highlightAll: true,
version: true,
query: { query: 'NOT airline : "AAL" ', language: 'kuery' },
filter: [],
indexRefName: 'kibanaSavedObjectMeta.searchSourceJSON.index',
};
savedSearch.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource);

const resp = createSearchItems(kibanaConfig, indexPattern, savedSearch);
expect(resp).toStrictEqual({
combinedQuery: {
bool: {
filter: [],
must_not: [
{
bool: {
minimum_should_match: 1,
should: [
{
match_phrase: {
airline: 'AAL',
},
},
],
},
},
],
},
},
query: {
language: 'kuery',
query: 'NOT airline : "AAL" ',
},
});
});

test('should match saved search with kuery and condition and not condition', () => {
const searchSource = {
highlightAll: true,
version: true,
query: { query: 'airline : "AAL" and NOT airline : "AWE" ', language: 'kuery' },
filter: [],
indexRefName: 'kibanaSavedObjectMeta.searchSourceJSON.index',
};
savedSearch.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource);

const resp = createSearchItems(kibanaConfig, indexPattern, savedSearch);
expect(resp).toStrictEqual({
combinedQuery: {
bool: {
filter: [
{ bool: { should: [{ match_phrase: { airline: 'AAL' } }], minimum_should_match: 1 } },
{
bool: {
must_not: {
bool: { should: [{ match_phrase: { airline: 'AWE' } }], minimum_should_match: 1 },
},
},
},
],
must_not: [],
},
},
query: { query: 'airline : "AAL" and NOT airline : "AWE" ', language: 'kuery' },
});
});

test('should match saved search with kuery and filter', () => {
const searchSource = {
highlightAll: true,
version: true,
query: {
language: 'kuery',
query: '',
},
filter: [
{
meta: {
alias: null,
negate: false,
disabled: false,
type: 'phrase',
key: 'airline',
params: {
query: 'AAL',
},
indexRefName: 'kibanaSavedObjectMeta.searchSourceJSON.filter[0].meta.index',
},
query: {
match_phrase: {
airline: 'AAL',
},
},
$state: {
store: 'appState',
},
},
],
indexRefName: 'kibanaSavedObjectMeta.searchSourceJSON.index',
};
savedSearch.attributes.kibanaSavedObjectMeta.searchSourceJSON = JSON.stringify(searchSource);

const resp = createSearchItems(kibanaConfig, indexPattern, savedSearch);
expect(resp).toStrictEqual({
combinedQuery: {
bool: {
must: [{ match_all: {} }],
filter: [{ match_phrase: { airline: 'AAL' } }],
must_not: [],
},
},
query: { language: 'kuery', query: '' },
});
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,16 @@ export function createSearchItems(
}
const filterQuery = esQuery.buildQueryFromFilters(filters, indexPattern);

if (combinedQuery.bool.filter === undefined) {
combinedQuery.bool.filter = [];
if (Array.isArray(combinedQuery.bool.filter) === false) {
combinedQuery.bool.filter =
combinedQuery.bool.filter === undefined ? [] : [combinedQuery.bool.filter];
}
if (combinedQuery.bool.must_not === undefined) {
combinedQuery.bool.must_not = [];

if (Array.isArray(combinedQuery.bool.must_not) === false) {
combinedQuery.bool.must_not =
combinedQuery.bool.must_not === undefined ? [] : [combinedQuery.bool.must_not];
}

combinedQuery.bool.filter = [...combinedQuery.bool.filter, ...filterQuery.filter];
combinedQuery.bool.must_not = [...combinedQuery.bool.must_not, ...filterQuery.must_not];
} else {
Expand Down

0 comments on commit 3883daf

Please sign in to comment.