From b40962cb9bc48fdb145b9426b2cd3fe0f0b6154d Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Fri, 25 Jan 2019 09:12:15 -0500 Subject: [PATCH 1/8] Allow passing a default operator to use on find operations --- docs/api/saved-objects/find.asciidoc | 2 + src/server/saved_objects/routes/find.js | 1 + .../saved_objects/service/lib/repository.js | 3 + .../service/lib/repository.test.js | 3 +- .../service/lib/search_dsl/query_params.js | 4 +- .../lib/search_dsl/query_params.test.js | 64 +++++++++++++++++++ .../service/lib/search_dsl/search_dsl.js | 3 +- .../service/lib/search_dsl/search_dsl.test.js | 2 + .../service/saved_objects_client.js | 1 + .../saved_object/saved_object_loader.js | 1 + .../saved_objects/saved_objects_client.js | 1 + .../spaces_saved_objects_client.ts | 1 + 12 files changed, 83 insertions(+), 3 deletions(-) diff --git a/docs/api/saved-objects/find.asciidoc b/docs/api/saved-objects/find.asciidoc index a95cf61ffd749..c24d467bad40a 100644 --- a/docs/api/saved-objects/find.asciidoc +++ b/docs/api/saved-objects/find.asciidoc @@ -21,6 +21,8 @@ Note: You cannot access this endpoint via the Console in Kibana. (number) The page of objects to return `search` (optional):: (string) A {ref}/query-dsl-simple-query-string-query.html[simple_query_string] Elasticsearch query to filter the objects in the response +`search_operator` (optional):: + (string) The default operator to use for the `simple_query_string` `search_fields` (optional):: (array|string) The fields to perform the `simple_query_string` parsed query against `fields` (optional):: diff --git a/src/server/saved_objects/routes/find.js b/src/server/saved_objects/routes/find.js index c5890120e1441..4fb9580245e53 100644 --- a/src/server/saved_objects/routes/find.js +++ b/src/server/saved_objects/routes/find.js @@ -31,6 +31,7 @@ export const createFindRoute = (prereqs) => ({ page: Joi.number().min(0).default(1), type: Joi.array().items(Joi.string()).single().required(), search: Joi.string().allow('').optional(), + search_operator: Joi.string().allow('OR', 'AND'), search_fields: Joi.array().items(Joi.string()).single(), sort_field: Joi.array().items(Joi.string()).single(), fields: Joi.array().items(Joi.string()).single() diff --git a/src/server/saved_objects/service/lib/repository.js b/src/server/saved_objects/service/lib/repository.js index 2f28081e96606..dedbd2be8674b 100644 --- a/src/server/saved_objects/service/lib/repository.js +++ b/src/server/saved_objects/service/lib/repository.js @@ -281,6 +281,7 @@ export class SavedObjectsRepository { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] + * @property {string} [options.searchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] @@ -295,6 +296,7 @@ export class SavedObjectsRepository { const { type, search, + searchOperator, searchFields, page = 1, perPage = 20, @@ -327,6 +329,7 @@ export class SavedObjectsRepository { version: true, ...getSearchDsl(this._mappings, this._schema, { search, + searchOperator, searchFields, type, sortField, diff --git a/src/server/saved_objects/service/lib/repository.test.js b/src/server/saved_objects/service/lib/repository.test.js index 3771cdee44f7a..0e52b5a2c83ab 100644 --- a/src/server/saved_objects/service/lib/repository.test.js +++ b/src/server/saved_objects/service/lib/repository.test.js @@ -814,7 +814,7 @@ describe('SavedObjectsRepository', () => { } }); - it('passes mappings, schema, search, searchFields, type, sortField, and sortOrder to getSearchDsl', async () => { + it('passes mappings, schema, search, searchOperator, searchFields, type, sortField, and sortOrder to getSearchDsl', async () => { callAdminCluster.returns(namespacedSearchResults); const relevantOpts = { namespace: 'foo-namespace', @@ -823,6 +823,7 @@ describe('SavedObjectsRepository', () => { type: 'bar', sortField: 'name', sortOrder: 'desc', + searchOperator: 'AND', }; await savedObjectsRepository.find(relevantOpts); diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.js b/src/server/saved_objects/service/lib/search_dsl/query_params.js index 5bcff743c1082..a0374a8171336 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.js @@ -98,9 +98,10 @@ function getClauseForType(schema, namespace, type) { * @param {(string|Array)} type * @param {String} search * @param {Array} searchFields + * @param {String} searchOperator * @return {Object} */ -export function getQueryParams(mappings, schema, namespace, type, search, searchFields) { +export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator) { const types = getTypes(mappings, type); const bool = { filter: [{ @@ -116,6 +117,7 @@ export function getQueryParams(mappings, schema, namespace, type, search, search { simple_query_string: { query: search, + default_operator: searchOperator, ...getFieldsForTypes( searchFields, types diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js index 45f241ba41883..106ec56095f49 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js @@ -716,4 +716,68 @@ describe('searchDsl/queryParams', () => { }); }); }); + + describe('type (plural, namespaced and global), search, searchOperator', () => { + it('supports searchOperator', () => { + expect(getQueryParams(MAPPINGS, SCHEMA, 'foo-namespace', ['saved', 'global'], 'foo', null, 'AND')) + .toEqual({ + query: { + bool: { + filter: [ + { + bool: { + minimum_should_match: 1, + should: [ + { + bool: { + must: [ + { + term: { + type: 'saved', + }, + }, + { + term: { + namespace: 'foo-namespace', + }, + }, + ], + }, + }, + { + bool: { + must: [ + { + term: { + type: 'global', + }, + }, + ], + must_not: [ + { + exists: { + field: 'namespace', + }, + }, + ], + }, + }, + ], + }, + }, + ], + must: [ + { + simple_query_string: { + all_fields: true, + default_operator: 'AND', + query: 'foo', + }, + }, + ], + }, + }, + }); + }); + }); }); diff --git a/src/server/saved_objects/service/lib/search_dsl/search_dsl.js b/src/server/saved_objects/service/lib/search_dsl/search_dsl.js index a0434aa2f9f8b..a15d5aca382cf 100644 --- a/src/server/saved_objects/service/lib/search_dsl/search_dsl.js +++ b/src/server/saved_objects/service/lib/search_dsl/search_dsl.js @@ -26,6 +26,7 @@ export function getSearchDsl(mappings, schema, options = {}) { const { type, search, + searchOperator, searchFields, sortField, sortOrder, @@ -41,7 +42,7 @@ export function getSearchDsl(mappings, schema, options = {}) { } return { - ...getQueryParams(mappings, schema, namespace, type, search, searchFields), + ...getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator), ...getSortingParams(mappings, type, sortField, sortOrder), }; } diff --git a/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js b/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js index 18c1aa4e9a4fc..eaae01fef932c 100644 --- a/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js @@ -55,6 +55,7 @@ describe('getSearchDsl', () => { type: 'foo', search: 'bar', searchFields: ['baz'], + searchOperator: 'AND', }; getSearchDsl(mappings, schema, opts); @@ -67,6 +68,7 @@ describe('getSearchDsl', () => { opts.type, opts.search, opts.searchFields, + opts.searchOperator, ); }); diff --git a/src/server/saved_objects/service/saved_objects_client.js b/src/server/saved_objects/service/saved_objects_client.js index f1dc4dfbbc190..5e80434e5d1ab 100644 --- a/src/server/saved_objects/service/saved_objects_client.js +++ b/src/server/saved_objects/service/saved_objects_client.js @@ -139,6 +139,7 @@ export class SavedObjectsClient { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] + * @property {string} [options.searchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] diff --git a/src/ui/public/courier/saved_object/saved_object_loader.js b/src/ui/public/courier/saved_object/saved_object_loader.js index c860fc0eaf336..13e080f4b1dcd 100644 --- a/src/ui/public/courier/saved_object/saved_object_loader.js +++ b/src/ui/public/courier/saved_object/saved_object_loader.js @@ -118,6 +118,7 @@ export class SavedObjectLoader { perPage: size, page: 1, searchFields: ['title^3', 'description'], + searchOperator: 'AND', fields, }).then((resp) => { return { diff --git a/src/ui/public/saved_objects/saved_objects_client.js b/src/ui/public/saved_objects/saved_objects_client.js index c18a7276ab804..077b65582b15d 100644 --- a/src/ui/public/saved_objects/saved_objects_client.js +++ b/src/ui/public/saved_objects/saved_objects_client.js @@ -111,6 +111,7 @@ export class SavedObjectsClient { * @param {object} [options={}] * @property {string} options.type * @property {string} options.search + * @property {string} options.searchOperator * @property {string} options.searchFields - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] diff --git a/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts b/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts index ccb93b6d326fb..2096a65aa26a6 100644 --- a/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts +++ b/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts @@ -136,6 +136,7 @@ export class SpacesSavedObjectsClient implements SavedObjectsClient { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] + * @property {string} [options.searchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] From 5e8f7c4399990c07b5c623fe6b7eaa9ff96a30df Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 09:49:57 -0500 Subject: [PATCH 2/8] Default operator to OR like elasticsearch to avoid passing null --- src/server/saved_objects/service/lib/search_dsl/query_params.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.js b/src/server/saved_objects/service/lib/search_dsl/query_params.js index a0374a8171336..f327da37c63aa 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.js @@ -101,7 +101,7 @@ function getClauseForType(schema, namespace, type) { * @param {String} searchOperator * @return {Object} */ -export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator) { +export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator = 'OR') { const types = getTypes(mappings, type); const bool = { filter: [{ From 97564668573469e6eb5889679d276740f2a413d2 Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 10:05:10 -0500 Subject: [PATCH 3/8] Add dashboard search tests --- test/functional/apps/dashboard/_dashboard_listing.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/test/functional/apps/dashboard/_dashboard_listing.js b/test/functional/apps/dashboard/_dashboard_listing.js index 58c2ac379fa3c..2545ef1b4dae9 100644 --- a/test/functional/apps/dashboard/_dashboard_listing.js +++ b/test/functional/apps/dashboard/_dashboard_listing.js @@ -122,6 +122,12 @@ export default function ({ getService, getPageObjects }) { const countOfDashboards = await PageObjects.dashboard.getCountOfDashboardsInListingTable(); expect(countOfDashboards).to.equal(1); }); + + it('is using AND operator', async function () { + await PageObjects.dashboard.searchForDashboardWithName('three words'); + const countOfDashboards = await PageObjects.dashboard.getCountOfDashboardsInListingTable(); + expect(countOfDashboards).to.equal(0); + }); }); describe('search by title', function () { From 26852f6e41fc4fe86acdbf1b037298105d3b8312 Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 10:11:19 -0500 Subject: [PATCH 4/8] Make search_operator optional --- src/server/saved_objects/routes/find.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/saved_objects/routes/find.js b/src/server/saved_objects/routes/find.js index 4fb9580245e53..684d1a81ef1e4 100644 --- a/src/server/saved_objects/routes/find.js +++ b/src/server/saved_objects/routes/find.js @@ -31,7 +31,7 @@ export const createFindRoute = (prereqs) => ({ page: Joi.number().min(0).default(1), type: Joi.array().items(Joi.string()).single().required(), search: Joi.string().allow('').optional(), - search_operator: Joi.string().allow('OR', 'AND'), + search_operator: Joi.string().allow('OR', 'AND').optional(), search_fields: Joi.array().items(Joi.string()).single(), sort_field: Joi.array().items(Joi.string()).single(), fields: Joi.array().items(Joi.string()).single() From 90a03edbd08ba0809c96010a43753ebc3f32c9dd Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 10:41:44 -0500 Subject: [PATCH 5/8] Fix query_params.test.js --- .../service/lib/search_dsl/query_params.test.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js index 106ec56095f49..e56ec5e11e717 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js @@ -236,6 +236,7 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { + default_operator: 'OR', query: 'us*', all_fields: true } @@ -266,6 +267,7 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { + default_operator: 'OR', query: 'us*', all_fields: true } @@ -295,6 +297,7 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { + default_operator: 'OR', query: 'us*', all_fields: true } @@ -324,6 +327,7 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { + default_operator: 'OR', query: 'us*', all_fields: true } @@ -355,6 +359,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -386,6 +391,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title^3', 'saved.title^3', @@ -417,6 +423,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -454,6 +461,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -485,6 +493,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title^3', 'saved.title^3', @@ -516,6 +525,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -552,6 +562,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -581,6 +592,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title^3', 'global.title^3', @@ -610,6 +622,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -644,6 +657,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -673,6 +687,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title^3', 'global.title^3', @@ -702,6 +717,7 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', + default_operator: 'OR', fields: [ 'saved.title', 'global.title', From 381fa3c726a604f57f5fa0fdafe8b3700f93caa1 Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 13:24:01 -0500 Subject: [PATCH 6/8] Include searchOperator in saved_object_finder --- src/ui/public/saved_objects/components/saved_object_finder.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ui/public/saved_objects/components/saved_object_finder.js b/src/ui/public/saved_objects/components/saved_object_finder.js index 876b26d08a05e..01947ddc90845 100644 --- a/src/ui/public/saved_objects/components/saved_object_finder.js +++ b/src/ui/public/saved_objects/components/saved_object_finder.js @@ -113,7 +113,8 @@ class SavedObjectFinderUI extends React.Component { search: filter ? `${filter}*` : undefined, page: 1, perPage: chrome.getUiSettingsClient().get('savedObjects:listingLimit'), - searchFields: ['title^3', 'description'] + searchFields: ['title^3', 'description'], + searchOperator: 'AND', }); if (this.props.savedObjectType === 'visualization' From eb4c2075df703efd125797a69ccf466559d0e39a Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 14:04:12 -0500 Subject: [PATCH 7/8] Apply PR feedback --- src/server/saved_objects/routes/find.js | 2 +- src/server/saved_objects/routes/find.test.js | 14 +++++++------- .../saved_objects/service/lib/repository.js | 2 +- .../service/lib/search_dsl/query_params.js | 6 +++--- .../service/lib/search_dsl/query_params.test.js | 16 ---------------- 5 files changed, 12 insertions(+), 28 deletions(-) diff --git a/src/server/saved_objects/routes/find.js b/src/server/saved_objects/routes/find.js index 684d1a81ef1e4..6441204fdceda 100644 --- a/src/server/saved_objects/routes/find.js +++ b/src/server/saved_objects/routes/find.js @@ -31,7 +31,7 @@ export const createFindRoute = (prereqs) => ({ page: Joi.number().min(0).default(1), type: Joi.array().items(Joi.string()).single().required(), search: Joi.string().allow('').optional(), - search_operator: Joi.string().allow('OR', 'AND').optional(), + search_operator: Joi.string().valid('OR', 'AND').default('OR'), search_fields: Joi.array().items(Joi.string()).single(), sort_field: Joi.array().items(Joi.string()).single(), fields: Joi.array().items(Joi.string()).single() diff --git a/src/server/saved_objects/routes/find.test.js b/src/server/saved_objects/routes/find.test.js index 3b1de7490367e..020214491de96 100644 --- a/src/server/saved_objects/routes/find.test.js +++ b/src/server/saved_objects/routes/find.test.js @@ -105,7 +105,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['foo', 'bar'] }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['foo', 'bar'], searchOperator: 'OR' }); }); it('accepts the query parameter page/per_page', async () => { @@ -119,7 +119,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 10, page: 50, type: ['foo'] }); + expect(options).toEqual({ perPage: 10, page: 50, type: ['foo'], searchOperator: 'OR' }); }); it('accepts the query parameter search_fields', async () => { @@ -133,7 +133,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, searchFields: ['title'], type: ['foo'] }); + expect(options).toEqual({ perPage: 20, page: 1, searchFields: ['title'], type: ['foo'], searchOperator: 'OR' }); }); it('accepts the query parameter fields as a string', async () => { @@ -147,7 +147,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, fields: ['title'], type: ['foo'] }); + expect(options).toEqual({ perPage: 20, page: 1, fields: ['title'], type: ['foo'], searchOperator: 'OR' }); }); it('accepts the query parameter fields as an array', async () => { @@ -162,7 +162,7 @@ describe('GET /api/saved_objects/_find', () => { const options = savedObjectsClient.find.getCall(0).args[0]; expect(options).toEqual({ - perPage: 20, page: 1, fields: ['title', 'description'], type: ['foo'] + perPage: 20, page: 1, fields: ['title', 'description'], type: ['foo'], searchOperator: 'OR' }); }); @@ -177,7 +177,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern'] }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern'], searchOperator: 'OR' }); }); it('accepts the query parameter type as an array', async () => { @@ -191,6 +191,6 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern', 'visualization'] }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern', 'visualization'], searchOperator: 'OR' }); }); }); diff --git a/src/server/saved_objects/service/lib/repository.js b/src/server/saved_objects/service/lib/repository.js index dedbd2be8674b..48505186ffd56 100644 --- a/src/server/saved_objects/service/lib/repository.js +++ b/src/server/saved_objects/service/lib/repository.js @@ -296,7 +296,7 @@ export class SavedObjectsRepository { const { type, search, - searchOperator, + searchOperator = 'OR', searchFields, page = 1, perPage = 20, diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.js b/src/server/saved_objects/service/lib/search_dsl/query_params.js index f327da37c63aa..dec559dbf306c 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.js @@ -101,7 +101,7 @@ function getClauseForType(schema, namespace, type) { * @param {String} searchOperator * @return {Object} */ -export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator = 'OR') { +export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator) { const types = getTypes(mappings, type); const bool = { filter: [{ @@ -117,11 +117,11 @@ export function getQueryParams(mappings, schema, namespace, type, search, search { simple_query_string: { query: search, - default_operator: searchOperator, ...getFieldsForTypes( searchFields, types - ) + ), + ...(searchOperator ? { default_operator: searchOperator } : {}), } } ]; diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js index e56ec5e11e717..106ec56095f49 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js @@ -236,7 +236,6 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { - default_operator: 'OR', query: 'us*', all_fields: true } @@ -267,7 +266,6 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { - default_operator: 'OR', query: 'us*', all_fields: true } @@ -297,7 +295,6 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { - default_operator: 'OR', query: 'us*', all_fields: true } @@ -327,7 +324,6 @@ describe('searchDsl/queryParams', () => { must: [ { simple_query_string: { - default_operator: 'OR', query: 'us*', all_fields: true } @@ -359,7 +355,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -391,7 +386,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title^3', 'saved.title^3', @@ -423,7 +417,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -461,7 +454,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -493,7 +485,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title^3', 'saved.title^3', @@ -525,7 +516,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'pending.title', 'saved.title', @@ -562,7 +552,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -592,7 +581,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title^3', 'global.title^3', @@ -622,7 +610,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -657,7 +644,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title', 'global.title', @@ -687,7 +673,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title^3', 'global.title^3', @@ -717,7 +702,6 @@ describe('searchDsl/queryParams', () => { { simple_query_string: { query: 'y*', - default_operator: 'OR', fields: [ 'saved.title', 'global.title', From c384e55d8456b61742d30e5c3a170a1de6b7a453 Mon Sep 17 00:00:00 2001 From: Mike Cote Date: Mon, 28 Jan 2019 14:08:42 -0500 Subject: [PATCH 8/8] Rename searchOperator to defaultSearchOperator --- docs/api/saved-objects/find.asciidoc | 2 +- src/server/saved_objects/routes/find.js | 2 +- src/server/saved_objects/routes/find.test.js | 14 +++++++------- src/server/saved_objects/service/lib/repository.js | 6 +++--- .../saved_objects/service/lib/repository.test.js | 4 ++-- .../service/lib/search_dsl/query_params.js | 6 +++--- .../service/lib/search_dsl/query_params.test.js | 4 ++-- .../service/lib/search_dsl/search_dsl.js | 4 ++-- .../service/lib/search_dsl/search_dsl.test.js | 4 ++-- .../saved_objects/service/saved_objects_client.js | 2 +- .../courier/saved_object/saved_object_loader.js | 2 +- .../components/saved_object_finder.js | 2 +- .../public/saved_objects/saved_objects_client.js | 2 +- .../spaces_saved_objects_client.ts | 2 +- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/api/saved-objects/find.asciidoc b/docs/api/saved-objects/find.asciidoc index c24d467bad40a..8a866c9de71d7 100644 --- a/docs/api/saved-objects/find.asciidoc +++ b/docs/api/saved-objects/find.asciidoc @@ -21,7 +21,7 @@ Note: You cannot access this endpoint via the Console in Kibana. (number) The page of objects to return `search` (optional):: (string) A {ref}/query-dsl-simple-query-string-query.html[simple_query_string] Elasticsearch query to filter the objects in the response -`search_operator` (optional):: +`default_search_operator` (optional):: (string) The default operator to use for the `simple_query_string` `search_fields` (optional):: (array|string) The fields to perform the `simple_query_string` parsed query against diff --git a/src/server/saved_objects/routes/find.js b/src/server/saved_objects/routes/find.js index 6441204fdceda..27a30f0aa6427 100644 --- a/src/server/saved_objects/routes/find.js +++ b/src/server/saved_objects/routes/find.js @@ -31,7 +31,7 @@ export const createFindRoute = (prereqs) => ({ page: Joi.number().min(0).default(1), type: Joi.array().items(Joi.string()).single().required(), search: Joi.string().allow('').optional(), - search_operator: Joi.string().valid('OR', 'AND').default('OR'), + default_search_operator: Joi.string().valid('OR', 'AND').default('OR'), search_fields: Joi.array().items(Joi.string()).single(), sort_field: Joi.array().items(Joi.string()).single(), fields: Joi.array().items(Joi.string()).single() diff --git a/src/server/saved_objects/routes/find.test.js b/src/server/saved_objects/routes/find.test.js index 020214491de96..5c865c22f426b 100644 --- a/src/server/saved_objects/routes/find.test.js +++ b/src/server/saved_objects/routes/find.test.js @@ -105,7 +105,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['foo', 'bar'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['foo', 'bar'], defaultSearchOperator: 'OR' }); }); it('accepts the query parameter page/per_page', async () => { @@ -119,7 +119,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 10, page: 50, type: ['foo'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 10, page: 50, type: ['foo'], defaultSearchOperator: 'OR' }); }); it('accepts the query parameter search_fields', async () => { @@ -133,7 +133,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, searchFields: ['title'], type: ['foo'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 20, page: 1, searchFields: ['title'], type: ['foo'], defaultSearchOperator: 'OR' }); }); it('accepts the query parameter fields as a string', async () => { @@ -147,7 +147,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, fields: ['title'], type: ['foo'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 20, page: 1, fields: ['title'], type: ['foo'], defaultSearchOperator: 'OR' }); }); it('accepts the query parameter fields as an array', async () => { @@ -162,7 +162,7 @@ describe('GET /api/saved_objects/_find', () => { const options = savedObjectsClient.find.getCall(0).args[0]; expect(options).toEqual({ - perPage: 20, page: 1, fields: ['title', 'description'], type: ['foo'], searchOperator: 'OR' + perPage: 20, page: 1, fields: ['title', 'description'], type: ['foo'], defaultSearchOperator: 'OR' }); }); @@ -177,7 +177,7 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern'], defaultSearchOperator: 'OR' }); }); it('accepts the query parameter type as an array', async () => { @@ -191,6 +191,6 @@ describe('GET /api/saved_objects/_find', () => { expect(savedObjectsClient.find.calledOnce).toBe(true); const options = savedObjectsClient.find.getCall(0).args[0]; - expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern', 'visualization'], searchOperator: 'OR' }); + expect(options).toEqual({ perPage: 20, page: 1, type: ['index-pattern', 'visualization'], defaultSearchOperator: 'OR' }); }); }); diff --git a/src/server/saved_objects/service/lib/repository.js b/src/server/saved_objects/service/lib/repository.js index 48505186ffd56..0508fd854b07c 100644 --- a/src/server/saved_objects/service/lib/repository.js +++ b/src/server/saved_objects/service/lib/repository.js @@ -281,7 +281,7 @@ export class SavedObjectsRepository { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] - * @property {string} [options.searchOperator] + * @property {string} [options.defaultSearchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] @@ -296,7 +296,7 @@ export class SavedObjectsRepository { const { type, search, - searchOperator = 'OR', + defaultSearchOperator = 'OR', searchFields, page = 1, perPage = 20, @@ -329,7 +329,7 @@ export class SavedObjectsRepository { version: true, ...getSearchDsl(this._mappings, this._schema, { search, - searchOperator, + defaultSearchOperator, searchFields, type, sortField, diff --git a/src/server/saved_objects/service/lib/repository.test.js b/src/server/saved_objects/service/lib/repository.test.js index 0e52b5a2c83ab..74c70fe1691f9 100644 --- a/src/server/saved_objects/service/lib/repository.test.js +++ b/src/server/saved_objects/service/lib/repository.test.js @@ -814,7 +814,7 @@ describe('SavedObjectsRepository', () => { } }); - it('passes mappings, schema, search, searchOperator, searchFields, type, sortField, and sortOrder to getSearchDsl', async () => { + it('passes mappings, schema, search, defaultSearchOperator, searchFields, type, sortField, and sortOrder to getSearchDsl', async () => { callAdminCluster.returns(namespacedSearchResults); const relevantOpts = { namespace: 'foo-namespace', @@ -823,7 +823,7 @@ describe('SavedObjectsRepository', () => { type: 'bar', sortField: 'name', sortOrder: 'desc', - searchOperator: 'AND', + defaultSearchOperator: 'AND', }; await savedObjectsRepository.find(relevantOpts); diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.js b/src/server/saved_objects/service/lib/search_dsl/query_params.js index dec559dbf306c..47e5812e5eb2e 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.js @@ -98,10 +98,10 @@ function getClauseForType(schema, namespace, type) { * @param {(string|Array)} type * @param {String} search * @param {Array} searchFields - * @param {String} searchOperator + * @param {String} defaultSearchOperator * @return {Object} */ -export function getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator) { +export function getQueryParams(mappings, schema, namespace, type, search, searchFields, defaultSearchOperator) { const types = getTypes(mappings, type); const bool = { filter: [{ @@ -121,7 +121,7 @@ export function getQueryParams(mappings, schema, namespace, type, search, search searchFields, types ), - ...(searchOperator ? { default_operator: searchOperator } : {}), + ...(defaultSearchOperator ? { default_operator: defaultSearchOperator } : {}), } } ]; diff --git a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js index 106ec56095f49..7d9e26ecde924 100644 --- a/src/server/saved_objects/service/lib/search_dsl/query_params.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/query_params.test.js @@ -717,8 +717,8 @@ describe('searchDsl/queryParams', () => { }); }); - describe('type (plural, namespaced and global), search, searchOperator', () => { - it('supports searchOperator', () => { + describe('type (plural, namespaced and global), search, defaultSearchOperator', () => { + it('supports defaultSearchOperator', () => { expect(getQueryParams(MAPPINGS, SCHEMA, 'foo-namespace', ['saved', 'global'], 'foo', null, 'AND')) .toEqual({ query: { diff --git a/src/server/saved_objects/service/lib/search_dsl/search_dsl.js b/src/server/saved_objects/service/lib/search_dsl/search_dsl.js index a15d5aca382cf..d6a224f4c3857 100644 --- a/src/server/saved_objects/service/lib/search_dsl/search_dsl.js +++ b/src/server/saved_objects/service/lib/search_dsl/search_dsl.js @@ -26,7 +26,7 @@ export function getSearchDsl(mappings, schema, options = {}) { const { type, search, - searchOperator, + defaultSearchOperator, searchFields, sortField, sortOrder, @@ -42,7 +42,7 @@ export function getSearchDsl(mappings, schema, options = {}) { } return { - ...getQueryParams(mappings, schema, namespace, type, search, searchFields, searchOperator), + ...getQueryParams(mappings, schema, namespace, type, search, searchFields, defaultSearchOperator), ...getSortingParams(mappings, type, sortField, sortOrder), }; } diff --git a/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js b/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js index eaae01fef932c..1ba780fc79ed0 100644 --- a/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js +++ b/src/server/saved_objects/service/lib/search_dsl/search_dsl.test.js @@ -55,7 +55,7 @@ describe('getSearchDsl', () => { type: 'foo', search: 'bar', searchFields: ['baz'], - searchOperator: 'AND', + defaultSearchOperator: 'AND', }; getSearchDsl(mappings, schema, opts); @@ -68,7 +68,7 @@ describe('getSearchDsl', () => { opts.type, opts.search, opts.searchFields, - opts.searchOperator, + opts.defaultSearchOperator, ); }); diff --git a/src/server/saved_objects/service/saved_objects_client.js b/src/server/saved_objects/service/saved_objects_client.js index 5e80434e5d1ab..a354067e6f702 100644 --- a/src/server/saved_objects/service/saved_objects_client.js +++ b/src/server/saved_objects/service/saved_objects_client.js @@ -139,7 +139,7 @@ export class SavedObjectsClient { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] - * @property {string} [options.searchOperator] + * @property {string} [options.defaultSearchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] diff --git a/src/ui/public/courier/saved_object/saved_object_loader.js b/src/ui/public/courier/saved_object/saved_object_loader.js index 13e080f4b1dcd..511edd30ec549 100644 --- a/src/ui/public/courier/saved_object/saved_object_loader.js +++ b/src/ui/public/courier/saved_object/saved_object_loader.js @@ -118,7 +118,7 @@ export class SavedObjectLoader { perPage: size, page: 1, searchFields: ['title^3', 'description'], - searchOperator: 'AND', + defaultSearchOperator: 'AND', fields, }).then((resp) => { return { diff --git a/src/ui/public/saved_objects/components/saved_object_finder.js b/src/ui/public/saved_objects/components/saved_object_finder.js index 01947ddc90845..395a24a3b5520 100644 --- a/src/ui/public/saved_objects/components/saved_object_finder.js +++ b/src/ui/public/saved_objects/components/saved_object_finder.js @@ -114,7 +114,7 @@ class SavedObjectFinderUI extends React.Component { page: 1, perPage: chrome.getUiSettingsClient().get('savedObjects:listingLimit'), searchFields: ['title^3', 'description'], - searchOperator: 'AND', + defaultSearchOperator: 'AND', }); if (this.props.savedObjectType === 'visualization' diff --git a/src/ui/public/saved_objects/saved_objects_client.js b/src/ui/public/saved_objects/saved_objects_client.js index 077b65582b15d..eba1acebabe4b 100644 --- a/src/ui/public/saved_objects/saved_objects_client.js +++ b/src/ui/public/saved_objects/saved_objects_client.js @@ -111,7 +111,7 @@ export class SavedObjectsClient { * @param {object} [options={}] * @property {string} options.type * @property {string} options.search - * @property {string} options.searchOperator + * @property {string} options.defaultSearchOperator * @property {string} options.searchFields - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1] diff --git a/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts b/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts index 2096a65aa26a6..d995fd89d9ebf 100644 --- a/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts +++ b/x-pack/plugins/spaces/server/lib/saved_objects_client/spaces_saved_objects_client.ts @@ -136,7 +136,7 @@ export class SpacesSavedObjectsClient implements SavedObjectsClient { * @param {object} [options={}] * @property {(string|Array)} [options.type] * @property {string} [options.search] - * @property {string} [options.searchOperator] + * @property {string} [options.defaultSearchOperator] * @property {Array} [options.searchFields] - see Elasticsearch Simple Query String * Query field argument for more information * @property {integer} [options.page=1]