diff --git a/.eslintignore b/.eslintignore
index cf13fc28467d94..90155ca9cb681e 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -8,6 +8,7 @@ bower_components
/plugins
/built_assets
/html_docs
+/src/plugins/data/common/es_query/kuery/ast/_generated_/**
/src/fixtures/vislib/mock_data
/src/legacy/ui/public/angular-bootstrap
/src/legacy/ui/public/flot-charts
@@ -19,7 +20,6 @@ bower_components
/src/core/lib/kbn_internal_native_observable
/packages/*/target
/packages/eslint-config-kibana
-/packages/kbn-es-query/src/kuery/ast/kuery.js
/packages/kbn-pm/dist
/packages/kbn-plugin-generator/sao_template/template
/packages/kbn-ui-framework/dist
diff --git a/.i18nrc.json b/.i18nrc.json
index 2cdf7d2b039c6c..e5ba6762da154d 100644
--- a/.i18nrc.json
+++ b/.i18nrc.json
@@ -16,7 +16,6 @@
"interpreter": "src/legacy/core_plugins/interpreter",
"kbn": "src/legacy/core_plugins/kibana",
"kbnDocViews": "src/legacy/core_plugins/kbn_doc_views",
- "kbnESQuery": "packages/kbn-es-query",
"kbnVislibVisTypes": "src/legacy/core_plugins/kbn_vislib_vis_types",
"kibana_react": "src/legacy/core_plugins/kibana_react",
"kibana-react": "src/plugins/kibana_react",
diff --git a/docs/development/core/public/kibana-plugin-public.savedobjectsclient.find.md b/docs/development/core/public/kibana-plugin-public.savedobjectsclient.find.md
index 866755e78648af..cecceb04240e60 100644
--- a/docs/development/core/public/kibana-plugin-public.savedobjectsclient.find.md
+++ b/docs/development/core/public/kibana-plugin-public.savedobjectsclient.find.md
@@ -9,5 +9,5 @@ Search for objects
Signature:
```typescript
-find: (options: Pick) => Promise>;
+find: (options: Pick) => Promise>;
```
diff --git a/docs/development/core/public/kibana-plugin-public.savedobjectsclient.md b/docs/development/core/public/kibana-plugin-public.savedobjectsclient.md
index 50451b813a61c0..c4ceb47f66e1bb 100644
--- a/docs/development/core/public/kibana-plugin-public.savedobjectsclient.md
+++ b/docs/development/core/public/kibana-plugin-public.savedobjectsclient.md
@@ -20,7 +20,7 @@ export declare class SavedObjectsClient
| [bulkGet](./kibana-plugin-public.savedobjectsclient.bulkget.md) | | (objects?: {
id: string;
type: string;
}[]) => Promise<SavedObjectsBatchResponse<SavedObjectAttributes>>
| Returns an array of objects by id |
| [create](./kibana-plugin-public.savedobjectsclient.create.md) | | <T extends SavedObjectAttributes>(type: string, attributes: T, options?: SavedObjectsCreateOptions) => Promise<SimpleSavedObject<T>>
| Persists an object |
| [delete](./kibana-plugin-public.savedobjectsclient.delete.md) | | (type: string, id: string) => Promise<{}>
| Deletes an object |
-| [find](./kibana-plugin-public.savedobjectsclient.find.md) | | <T extends SavedObjectAttributes>(options: Pick<SavedObjectFindOptionsServer, "search" | "filter" | "type" | "searchFields" | "defaultSearchOperator" | "hasReference" | "sortField" | "page" | "perPage" | "fields">) => Promise<SavedObjectsFindResponsePublic<T>>
| Search for objects |
+| [find](./kibana-plugin-public.savedobjectsclient.find.md) | | <T extends SavedObjectAttributes>(options: Pick<SavedObjectFindOptionsServer, "search" | "filter" | "type" | "fields" | "searchFields" | "defaultSearchOperator" | "hasReference" | "sortField" | "page" | "perPage">) => Promise<SavedObjectsFindResponsePublic<T>>
| Search for objects |
| [get](./kibana-plugin-public.savedobjectsclient.get.md) | | <T extends SavedObjectAttributes>(type: string, id: string) => Promise<SimpleSavedObject<T>>
| Fetches a single object |
## Methods
diff --git a/package.json b/package.json
index a4f7b869aef6f6..55a306c92c1959 100644
--- a/package.json
+++ b/package.json
@@ -121,7 +121,6 @@
"@kbn/babel-code-parser": "1.0.0",
"@kbn/babel-preset": "1.0.0",
"@kbn/config-schema": "1.0.0",
- "@kbn/es-query": "1.0.0",
"@kbn/i18n": "1.0.0",
"@kbn/interpreter": "1.0.0",
"@kbn/pm": "1.0.0",
diff --git a/packages/kbn-es-query/README.md b/packages/kbn-es-query/README.md
deleted file mode 100644
index fc403447877d81..00000000000000
--- a/packages/kbn-es-query/README.md
+++ /dev/null
@@ -1,92 +0,0 @@
-# kbn-es-query
-
-This module is responsible for generating Elasticsearch queries for Kibana. See explanations below for each of the subdirectories.
-
-## es_query
-
-This folder contains the code that combines Lucene/KQL queries and filters into an Elasticsearch query.
-
-```javascript
-buildEsQuery(indexPattern, queries, filters, config)
-```
-
-Generates the Elasticsearch query DSL from combining the queries and filters provided.
-
-```javascript
-buildQueryFromFilters(filters, indexPattern)
-```
-
-Generates the Elasticsearch query DSL from the given filters.
-
-```javascript
-luceneStringToDsl(query)
-```
-
-Generates the Elasticsearch query DSL from the given Lucene query.
-
-```javascript
-migrateFilter(filter, indexPattern)
-```
-
-Migrates a filter from a previous version of Elasticsearch to the current version.
-
-```javascript
-decorateQuery(query, queryStringOptions)
-```
-
-Decorates an Elasticsearch query_string query with the given options.
-
-## filters
-
-This folder contains the code related to Kibana Filter objects, including their definitions, and helper functions to create them. Filters in Kibana always contain a `meta` property which describes which `index` the filter corresponds to, as well as additional data about the specific filter.
-
-The object that is created by each of the following functions corresponds to a Filter object in the `lib` directory (e.g. `PhraseFilter`, `RangeFilter`, etc.)
-
-```javascript
-buildExistsFilter(field, indexPattern)
-```
-
-Creates a filter (`ExistsFilter`) where the given field exists.
-
-```javascript
-buildPhraseFilter(field, value, indexPattern)
-```
-
-Creates an filter (`PhraseFilter`) where the given field matches the given value.
-
-```javascript
-buildPhrasesFilter(field, params, indexPattern)
-```
-
-Creates a filter (`PhrasesFilter`) where the given field matches one or more of the given values. `params` should be an array of values.
-
-```javascript
-buildQueryFilter(query, index)
-```
-
-Creates a filter (`CustomFilter`) corresponding to a raw Elasticsearch query DSL object.
-
-```javascript
-buildRangeFilter(field, params, indexPattern)
-```
-
-Creates a filter (`RangeFilter`) where the value for the given field is in the given range. `params` should contain `lt`, `lte`, `gt`, and/or `gte`.
-
-## kuery
-
-This folder contains the code corresponding to generating Elasticsearch queries using the Kibana query language.
-
-In general, you will only need to worry about the following functions from the `ast` folder:
-
-```javascript
-fromExpression(expression)
-```
-
-Generates an abstract syntax tree corresponding to the raw Kibana query `expression`.
-
-```javascript
-toElasticsearchQuery(node, indexPattern)
-```
-
-Takes an abstract syntax tree (generated from the previous method) and generates the Elasticsearch query DSL using the given `indexPattern`. Note that if no `indexPattern` is provided, then an Elasticsearch query DSL will still be generated, ignoring things like the index pattern scripted fields, field types, etc.
-
diff --git a/packages/kbn-es-query/babel.config.js b/packages/kbn-es-query/babel.config.js
deleted file mode 100644
index 68783433fc711c..00000000000000
--- a/packages/kbn-es-query/babel.config.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-// We can't use common Kibana presets here because of babel versions incompatibility
-module.exports = {
- env: {
- public: {
- presets: [
- '@kbn/babel-preset/webpack_preset'
- ],
- },
- server: {
- presets: [
- '@kbn/babel-preset/node_preset'
- ],
- },
- },
- ignore: ['**/__tests__/**/*', '**/*.test.ts', '**/*.test.tsx'],
-};
diff --git a/packages/kbn-es-query/index.d.ts b/packages/kbn-es-query/index.d.ts
deleted file mode 100644
index 9bbd0a193dfed1..00000000000000
--- a/packages/kbn-es-query/index.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export * from './src';
diff --git a/packages/kbn-es-query/package.json b/packages/kbn-es-query/package.json
deleted file mode 100644
index 2cd2a8f53d2eed..00000000000000
--- a/packages/kbn-es-query/package.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "name": "@kbn/es-query",
- "main": "target/server/index.js",
- "browser": "target/public/index.js",
- "version": "1.0.0",
- "license": "Apache-2.0",
- "private": true,
- "scripts": {
- "build": "node scripts/build",
- "kbn:bootstrap": "node scripts/build --source-maps",
- "kbn:watch": "node scripts/build --source-maps --watch"
- },
- "dependencies": {
- "lodash": "npm:@elastic/lodash@3.10.1-kibana3",
- "moment-timezone": "^0.5.27",
- "@kbn/i18n": "1.0.0"
- },
- "devDependencies": {
- "@babel/cli": "^7.5.5",
- "@babel/core": "^7.5.5",
- "@kbn/babel-preset": "1.0.0",
- "@kbn/dev-utils": "1.0.0",
- "@kbn/expect": "1.0.0",
- "del": "^5.1.0",
- "getopts": "^2.2.4",
- "supports-color": "^7.0.0"
- }
-}
diff --git a/packages/kbn-es-query/scripts/build.js b/packages/kbn-es-query/scripts/build.js
deleted file mode 100644
index 6d53a8469b0e04..00000000000000
--- a/packages/kbn-es-query/scripts/build.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-require('../tasks/build_cli');
diff --git a/packages/kbn-es-query/src/__fixtures__/filter_skeleton.json b/packages/kbn-es-query/src/__fixtures__/filter_skeleton.json
deleted file mode 100644
index 1799d04a0fbd89..00000000000000
--- a/packages/kbn-es-query/src/__fixtures__/filter_skeleton.json
+++ /dev/null
@@ -1,5 +0,0 @@
-{
- "meta": {
- "index": "logstash-*"
- }
-}
diff --git a/packages/kbn-es-query/src/__fixtures__/index_pattern_response.json b/packages/kbn-es-query/src/__fixtures__/index_pattern_response.json
deleted file mode 100644
index 588e6ada69cfe4..00000000000000
--- a/packages/kbn-es-query/src/__fixtures__/index_pattern_response.json
+++ /dev/null
@@ -1,303 +0,0 @@
-{
- "id": "logstash-*",
- "title": "logstash-*",
- "fields": [
- {
- "name": "bytes",
- "type": "number",
- "esTypes": ["long"],
- "count": 10,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "ssl",
- "type": "boolean",
- "esTypes": ["boolean"],
- "count": 20,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "@timestamp",
- "type": "date",
- "esTypes": ["date"],
- "count": 30,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "time",
- "type": "date",
- "esTypes": ["date"],
- "count": 30,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "@tags",
- "type": "string",
- "esTypes": ["keyword"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "utc_time",
- "type": "date",
- "esTypes": ["date"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "phpmemory",
- "type": "number",
- "esTypes": ["integer"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "ip",
- "type": "ip",
- "esTypes": ["ip"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "request_body",
- "type": "attachment",
- "esTypes": ["attachment"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "point",
- "type": "geo_point",
- "esTypes": ["geo_point"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "area",
- "type": "geo_shape",
- "esTypes": ["geo_shape"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "hashed",
- "type": "murmur3",
- "esTypes": ["murmur3"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": false,
- "readFromDocValues": false
- },
- {
- "name": "geo.coordinates",
- "type": "geo_point",
- "esTypes": ["geo_point"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "extension",
- "type": "string",
- "esTypes": ["keyword"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "machine.os",
- "type": "string",
- "esTypes": ["text"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "machine.os.raw",
- "type": "string",
- "esTypes": ["keyword"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true,
- "subType": { "multi": { "parent": "machine.os" } }
- },
- {
- "name": "geo.src",
- "type": "string",
- "esTypes": ["keyword"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "_id",
- "type": "string",
- "esTypes": ["_id"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "_type",
- "type": "string",
- "esTypes": ["_type"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "_source",
- "type": "_source",
- "esTypes": ["_source"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "non-filterable",
- "type": "string",
- "esTypes": ["text"],
- "count": 0,
- "scripted": false,
- "searchable": false,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "non-sortable",
- "type": "string",
- "esTypes": ["text"],
- "count": 0,
- "scripted": false,
- "searchable": false,
- "aggregatable": false,
- "readFromDocValues": false
- },
- {
- "name": "custom_user_field",
- "type": "conflict",
- "esTypes": ["long", "text"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": true
- },
- {
- "name": "script string",
- "type": "string",
- "count": 0,
- "scripted": true,
- "script": "'i am a string'",
- "lang": "expression",
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "script number",
- "type": "number",
- "count": 0,
- "scripted": true,
- "script": "1234",
- "lang": "expression",
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "script date",
- "type": "date",
- "count": 0,
- "scripted": true,
- "script": "1234",
- "lang": "painless",
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "script murmur3",
- "type": "murmur3",
- "count": 0,
- "scripted": true,
- "script": "1234",
- "lang": "expression",
- "searchable": true,
- "aggregatable": true,
- "readFromDocValues": false
- },
- {
- "name": "nestedField.child",
- "type": "string",
- "esTypes": ["text"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": false,
- "readFromDocValues": false,
- "subType": { "nested": { "path": "nestedField" } }
- },
- {
- "name": "nestedField.nestedChild.doublyNestedChild",
- "type": "string",
- "esTypes": ["text"],
- "count": 0,
- "scripted": false,
- "searchable": true,
- "aggregatable": false,
- "readFromDocValues": false,
- "subType": { "nested": { "path": "nestedField.nestedChild" } }
- }
- ]
-}
diff --git a/packages/kbn-es-query/src/index.d.ts b/packages/kbn-es-query/src/index.d.ts
deleted file mode 100644
index 79e6903b186448..00000000000000
--- a/packages/kbn-es-query/src/index.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export * from './kuery';
diff --git a/packages/kbn-es-query/src/index.js b/packages/kbn-es-query/src/index.js
deleted file mode 100644
index 79e6903b186448..00000000000000
--- a/packages/kbn-es-query/src/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export * from './kuery';
diff --git a/packages/kbn-es-query/src/kuery/ast/__tests__/ast.js b/packages/kbn-es-query/src/kuery/ast/__tests__/ast.js
deleted file mode 100644
index 3cbe1203bc5330..00000000000000
--- a/packages/kbn-es-query/src/kuery/ast/__tests__/ast.js
+++ /dev/null
@@ -1,415 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import * as ast from '../ast';
-import expect from '@kbn/expect';
-import { nodeTypes } from '../../node_types/index';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
-
-let indexPattern;
-
-describe('kuery AST API', function () {
-
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- describe('fromKueryExpression', function () {
-
- it('should return a match all "is" function for whitespace', function () {
- const expected = nodeTypes.function.buildNode('is', '*', '*');
- const actual = ast.fromKueryExpression(' ');
- expect(actual).to.eql(expected);
- });
-
- it('should return an "is" function with a null field for single literals', function () {
- const expected = nodeTypes.function.buildNode('is', null, 'foo');
- const actual = ast.fromKueryExpression('foo');
- expect(actual).to.eql(expected);
- });
-
- it('should ignore extraneous whitespace at the beginning and end of the query', function () {
- const expected = nodeTypes.function.buildNode('is', null, 'foo');
- const actual = ast.fromKueryExpression(' foo ');
- expect(actual).to.eql(expected);
- });
-
- it('should not split on whitespace', function () {
- const expected = nodeTypes.function.buildNode('is', null, 'foo bar');
- const actual = ast.fromKueryExpression('foo bar');
- expect(actual).to.eql(expected);
- });
-
- it('should support "and" as a binary operator', function () {
- const expected = nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('is', null, 'foo'),
- nodeTypes.function.buildNode('is', null, 'bar'),
- ]);
- const actual = ast.fromKueryExpression('foo and bar');
- expect(actual).to.eql(expected);
- });
-
- it('should support "or" as a binary operator', function () {
- const expected = nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', null, 'foo'),
- nodeTypes.function.buildNode('is', null, 'bar'),
- ]);
- const actual = ast.fromKueryExpression('foo or bar');
- expect(actual).to.eql(expected);
- });
-
- it('should support negation of queries with a "not" prefix', function () {
- const expected = nodeTypes.function.buildNode('not',
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', null, 'foo'),
- nodeTypes.function.buildNode('is', null, 'bar'),
- ])
- );
- const actual = ast.fromKueryExpression('not (foo or bar)');
- expect(actual).to.eql(expected);
- });
-
- it('"and" should have a higher precedence than "or"', function () {
- const expected = nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', null, 'foo'),
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('is', null, 'bar'),
- nodeTypes.function.buildNode('is', null, 'baz'),
- ]),
- nodeTypes.function.buildNode('is', null, 'qux'),
- ])
- ]);
- const actual = ast.fromKueryExpression('foo or bar and baz or qux');
- expect(actual).to.eql(expected);
- });
-
- it('should support grouping to override default precedence', function () {
- const expected = nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', null, 'foo'),
- nodeTypes.function.buildNode('is', null, 'bar'),
- ]),
- nodeTypes.function.buildNode('is', null, 'baz'),
- ]);
- const actual = ast.fromKueryExpression('(foo or bar) and baz');
- expect(actual).to.eql(expected);
- });
-
- it('should support matching against specific fields', function () {
- const expected = nodeTypes.function.buildNode('is', 'foo', 'bar');
- const actual = ast.fromKueryExpression('foo:bar');
- expect(actual).to.eql(expected);
- });
-
- it('should also not split on whitespace when matching specific fields', function () {
- const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz');
- const actual = ast.fromKueryExpression('foo:bar baz');
- expect(actual).to.eql(expected);
- });
-
- it('should treat quoted values as phrases', function () {
- const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz', true);
- const actual = ast.fromKueryExpression('foo:"bar baz"');
- expect(actual).to.eql(expected);
- });
-
- it('should support a shorthand for matching multiple values against a single field', function () {
- const expected = nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', 'foo', 'bar'),
- nodeTypes.function.buildNode('is', 'foo', 'baz'),
- ]);
- const actual = ast.fromKueryExpression('foo:(bar or baz)');
- expect(actual).to.eql(expected);
- });
-
- it('should support "and" and "not" operators and grouping in the shorthand as well', function () {
- const expected = nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', 'foo', 'bar'),
- nodeTypes.function.buildNode('is', 'foo', 'baz'),
- ]),
- nodeTypes.function.buildNode('not',
- nodeTypes.function.buildNode('is', 'foo', 'qux')
- ),
- ]);
- const actual = ast.fromKueryExpression('foo:((bar or baz) and not qux)');
- expect(actual).to.eql(expected);
- });
-
- it('should support exclusive range operators', function () {
- const expected = nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('range', 'bytes', {
- gt: 1000,
- }),
- nodeTypes.function.buildNode('range', 'bytes', {
- lt: 8000,
- }),
- ]);
- const actual = ast.fromKueryExpression('bytes > 1000 and bytes < 8000');
- expect(actual).to.eql(expected);
- });
-
- it('should support inclusive range operators', function () {
- const expected = nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('range', 'bytes', {
- gte: 1000,
- }),
- nodeTypes.function.buildNode('range', 'bytes', {
- lte: 8000,
- }),
- ]);
- const actual = ast.fromKueryExpression('bytes >= 1000 and bytes <= 8000');
- expect(actual).to.eql(expected);
- });
-
- it('should support wildcards in field names', function () {
- const expected = nodeTypes.function.buildNode('is', 'machine*', 'osx');
- const actual = ast.fromKueryExpression('machine*:osx');
- expect(actual).to.eql(expected);
- });
-
- it('should support wildcards in values', function () {
- const expected = nodeTypes.function.buildNode('is', 'foo', 'ba*');
- const actual = ast.fromKueryExpression('foo:ba*');
- expect(actual).to.eql(expected);
- });
-
- it('should create an exists "is" query when a field is given and "*" is the value', function () {
- const expected = nodeTypes.function.buildNode('is', 'foo', '*');
- const actual = ast.fromKueryExpression('foo:*');
- expect(actual).to.eql(expected);
- });
-
- it('should support nested queries indicated by curly braces', () => {
- const expected = nodeTypes.function.buildNode(
- 'nested',
- 'nestedField',
- nodeTypes.function.buildNode('is', 'childOfNested', 'foo')
- );
- const actual = ast.fromKueryExpression('nestedField:{ childOfNested: foo }');
- expect(actual).to.eql(expected);
- });
-
- it('should support nested subqueries and subqueries inside nested queries', () => {
- const expected = nodeTypes.function.buildNode(
- 'and',
- [
- nodeTypes.function.buildNode('is', 'response', '200'),
- nodeTypes.function.buildNode(
- 'nested',
- 'nestedField',
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode('is', 'childOfNested', 'foo'),
- nodeTypes.function.buildNode('is', 'childOfNested', 'bar'),
- ])
- )]);
- const actual = ast.fromKueryExpression('response:200 and nestedField:{ childOfNested:foo or childOfNested:bar }');
- expect(actual).to.eql(expected);
- });
-
- it('should support nested sub-queries inside paren groups', () => {
- const expected = nodeTypes.function.buildNode(
- 'and',
- [
- nodeTypes.function.buildNode('is', 'response', '200'),
- nodeTypes.function.buildNode('or', [
- nodeTypes.function.buildNode(
- 'nested',
- 'nestedField',
- nodeTypes.function.buildNode('is', 'childOfNested', 'foo')
- ),
- nodeTypes.function.buildNode(
- 'nested',
- 'nestedField',
- nodeTypes.function.buildNode('is', 'childOfNested', 'bar')
- ),
- ])
- ]);
- const actual = ast.fromKueryExpression('response:200 and ( nestedField:{ childOfNested:foo } or nestedField:{ childOfNested:bar } )');
- expect(actual).to.eql(expected);
- });
-
- it('should support nested groups inside other nested groups', () => {
- const expected = nodeTypes.function.buildNode(
- 'nested',
- 'nestedField',
- nodeTypes.function.buildNode(
- 'nested',
- 'nestedChild',
- nodeTypes.function.buildNode('is', 'doublyNestedChild', 'foo')
- )
- );
- const actual = ast.fromKueryExpression('nestedField:{ nestedChild:{ doublyNestedChild:foo } }');
- expect(actual).to.eql(expected);
- });
- });
-
- describe('fromLiteralExpression', function () {
-
- it('should create literal nodes for unquoted values with correct primitive types', function () {
- const stringLiteral = nodeTypes.literal.buildNode('foo');
- const booleanFalseLiteral = nodeTypes.literal.buildNode(false);
- const booleanTrueLiteral = nodeTypes.literal.buildNode(true);
- const numberLiteral = nodeTypes.literal.buildNode(42);
-
- expect(ast.fromLiteralExpression('foo')).to.eql(stringLiteral);
- expect(ast.fromLiteralExpression('true')).to.eql(booleanTrueLiteral);
- expect(ast.fromLiteralExpression('false')).to.eql(booleanFalseLiteral);
- expect(ast.fromLiteralExpression('42')).to.eql(numberLiteral);
- });
-
- it('should allow escaping of special characters with a backslash', function () {
- const expected = nodeTypes.literal.buildNode('\\():<>"*');
- // yo dawg
- const actual = ast.fromLiteralExpression('\\\\\\(\\)\\:\\<\\>\\"\\*');
- expect(actual).to.eql(expected);
- });
-
- it('should support double quoted strings that do not need escapes except for quotes', function () {
- const expected = nodeTypes.literal.buildNode('\\():<>"*');
- const actual = ast.fromLiteralExpression('"\\():<>\\"*"');
- expect(actual).to.eql(expected);
- });
-
- it('should support escaped backslashes inside quoted strings', function () {
- const expected = nodeTypes.literal.buildNode('\\');
- const actual = ast.fromLiteralExpression('"\\\\"');
- expect(actual).to.eql(expected);
- });
-
- it('should detect wildcards and build wildcard AST nodes', function () {
- const expected = nodeTypes.wildcard.buildNode('foo*bar');
- const actual = ast.fromLiteralExpression('foo*bar');
- expect(actual).to.eql(expected);
- });
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return the given node type\'s ES query representation', function () {
- const node = nodeTypes.function.buildNode('exists', 'response');
- const expected = nodeTypes.function.toElasticsearchQuery(node, indexPattern);
- const result = ast.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an empty "and" function for undefined nodes and unknown node types', function () {
- const expected = nodeTypes.function.toElasticsearchQuery(nodeTypes.function.buildNode('and', []));
-
- expect(ast.toElasticsearchQuery()).to.eql(expected);
-
- const noTypeNode = nodeTypes.function.buildNode('exists', 'foo');
- delete noTypeNode.type;
- expect(ast.toElasticsearchQuery(noTypeNode)).to.eql(expected);
-
- const unknownTypeNode = nodeTypes.function.buildNode('exists', 'foo');
- unknownTypeNode.type = 'notValid';
- expect(ast.toElasticsearchQuery(unknownTypeNode)).to.eql(expected);
- });
-
- it('should return the given node type\'s ES query representation including a time zone parameter when one is provided', function () {
- const config = { dateFormatTZ: 'America/Phoenix' };
- const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
- const expected = nodeTypes.function.toElasticsearchQuery(node, indexPattern, config);
- const result = ast.toElasticsearchQuery(node, indexPattern, config);
- expect(result).to.eql(expected);
- });
-
- });
-
- describe('doesKueryExpressionHaveLuceneSyntaxError', function () {
- it('should return true for Lucene ranges', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: [1 TO 10]');
- expect(result).to.eql(true);
- });
-
- it('should return false for KQL ranges', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar < 1');
- expect(result).to.eql(false);
- });
-
- it('should return true for Lucene exists', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('_exists_: bar');
- expect(result).to.eql(true);
- });
-
- it('should return false for KQL exists', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar:*');
- expect(result).to.eql(false);
- });
-
- it('should return true for Lucene wildcards', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: ba?');
- expect(result).to.eql(true);
- });
-
- it('should return false for KQL wildcards', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: ba*');
- expect(result).to.eql(false);
- });
-
- it('should return true for Lucene regex', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: /ba.*/');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene fuzziness', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: ba~');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene proximity', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: "ba"~2');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene boosting', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('bar: ba^2');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene + operator', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('+foo: bar');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene - operators', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('-foo: bar');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene && operators', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('foo: bar && baz: qux');
- expect(result).to.eql(true);
- });
-
- it('should return true for Lucene || operators', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('foo: bar || baz: qux');
- expect(result).to.eql(true);
- });
-
- it('should return true for mixed KQL/Lucene queries', function () {
- const result = ast.doesKueryExpressionHaveLuceneSyntaxError('foo: bar and (baz: qux || bag)');
- expect(result).to.eql(true);
- });
- });
-
-});
diff --git a/packages/kbn-es-query/src/kuery/ast/ast.d.ts b/packages/kbn-es-query/src/kuery/ast/ast.d.ts
deleted file mode 100644
index ef3d0ee8288746..00000000000000
--- a/packages/kbn-es-query/src/kuery/ast/ast.d.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import { JsonObject } from '..';
-
-/**
- * WARNING: these typings are incomplete
- */
-
-export type KueryNode = any;
-
-export type DslQuery = any;
-
-export interface KueryParseOptions {
- helpers: {
- [key: string]: any;
- };
- startRule: string;
- allowLeadingWildcards: boolean;
-}
-
-export function fromKueryExpression(
- expression: string | DslQuery,
- parseOptions?: Partial
-): KueryNode;
-
-export function toElasticsearchQuery(
- node: KueryNode,
- indexPattern?: any,
- config?: Record,
- context?: Record
-): JsonObject;
-
-export function doesKueryExpressionHaveLuceneSyntaxError(expression: string): boolean;
diff --git a/packages/kbn-es-query/src/kuery/ast/index.d.ts b/packages/kbn-es-query/src/kuery/ast/index.d.ts
deleted file mode 100644
index 9e68d01d046cca..00000000000000
--- a/packages/kbn-es-query/src/kuery/ast/index.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export * from '../ast/ast';
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/geo_bounding_box.js b/packages/kbn-es-query/src/kuery/functions/__tests__/geo_bounding_box.js
deleted file mode 100644
index 7afa0fcce1bfeb..00000000000000
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/geo_bounding_box.js
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import * as geoBoundingBox from '../geo_bounding_box';
-import { nodeTypes } from '../../node_types';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
-
-let indexPattern;
-const params = {
- bottomRight: {
- lat: 50.73,
- lon: -135.35
- },
- topLeft: {
- lat: 73.12,
- lon: -174.37
- }
-};
-
-describe('kuery functions', function () {
- describe('geoBoundingBox', function () {
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- describe('buildNodeParams', function () {
-
- it('should return an "arguments" param', function () {
- const result = geoBoundingBox.buildNodeParams('geo', params);
- expect(result).to.only.have.keys('arguments');
- });
-
- it('arguments should contain the provided fieldName as a literal', function () {
- const result = geoBoundingBox.buildNodeParams('geo', params);
- const { arguments: [ fieldName ] } = result;
-
- expect(fieldName).to.have.property('type', 'literal');
- expect(fieldName).to.have.property('value', 'geo');
- });
-
- it('arguments should contain the provided params as named arguments with "lat, lon" string values', function () {
- const result = geoBoundingBox.buildNodeParams('geo', params);
- const { arguments: [ , ...args ] } = result;
-
- args.map((param) => {
- expect(param).to.have.property('type', 'namedArg');
- expect(['bottomRight', 'topLeft'].includes(param.name)).to.be(true);
- expect(param.value.type).to.be('literal');
-
- const expectedParam = params[param.name];
- const expectedLatLon = `${expectedParam.lat}, ${expectedParam.lon}`;
- expect(param.value.value).to.be(expectedLatLon);
- });
- });
-
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return an ES geo_bounding_box query representing the given node', function () {
- const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
- const result = geoBoundingBox.toElasticsearchQuery(node, indexPattern);
- expect(result).to.have.property('geo_bounding_box');
- expect(result.geo_bounding_box.geo).to.have.property('top_left', '73.12, -174.37');
- expect(result.geo_bounding_box.geo).to.have.property('bottom_right', '50.73, -135.35');
- });
-
- it('should return an ES geo_bounding_box query without an index pattern', function () {
- const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
- const result = geoBoundingBox.toElasticsearchQuery(node);
- expect(result).to.have.property('geo_bounding_box');
- expect(result.geo_bounding_box.geo).to.have.property('top_left', '73.12, -174.37');
- expect(result.geo_bounding_box.geo).to.have.property('bottom_right', '50.73, -135.35');
- });
-
- it('should use the ignore_unmapped parameter', function () {
- const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
- const result = geoBoundingBox.toElasticsearchQuery(node, indexPattern);
- expect(result.geo_bounding_box.ignore_unmapped).to.be(true);
- });
-
- it('should throw an error for scripted fields', function () {
- const node = nodeTypes.function.buildNode('geoBoundingBox', 'script number', params);
- expect(geoBoundingBox.toElasticsearchQuery)
- .withArgs(node, indexPattern).to.throwException(/Geo bounding box query does not support scripted fields/);
- });
-
- it('should use a provided nested context to create a full field name', function () {
- const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
- const result = geoBoundingBox.toElasticsearchQuery(
- node,
- indexPattern,
- {},
- { nested: { path: 'nestedField' } }
- );
- expect(result).to.have.property('geo_bounding_box');
- expect(result.geo_bounding_box).to.have.property('nestedField.geo');
- });
-
- });
- });
-});
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/geo_polygon.js b/packages/kbn-es-query/src/kuery/functions/__tests__/geo_polygon.js
deleted file mode 100644
index c1f2fae0bb3e1f..00000000000000
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/geo_polygon.js
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import * as geoPolygon from '../geo_polygon';
-import { nodeTypes } from '../../node_types';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
-
-
-let indexPattern;
-const points = [
- {
- lat: 69.77,
- lon: -171.56
- },
- {
- lat: 50.06,
- lon: -169.10
- },
- {
- lat: 69.16,
- lon: -125.85
- }
-];
-
-describe('kuery functions', function () {
-
- describe('geoPolygon', function () {
-
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- describe('buildNodeParams', function () {
-
- it('should return an "arguments" param', function () {
- const result = geoPolygon.buildNodeParams('geo', points);
- expect(result).to.only.have.keys('arguments');
- });
-
- it('arguments should contain the provided fieldName as a literal', function () {
- const result = geoPolygon.buildNodeParams('geo', points);
- const { arguments: [ fieldName ] } = result;
-
- expect(fieldName).to.have.property('type', 'literal');
- expect(fieldName).to.have.property('value', 'geo');
- });
-
- it('arguments should contain the provided points literal "lat, lon" string values', function () {
- const result = geoPolygon.buildNodeParams('geo', points);
- const { arguments: [ , ...args ] } = result;
-
- args.forEach((param, index) => {
- expect(param).to.have.property('type', 'literal');
- const expectedPoint = points[index];
- const expectedLatLon = `${expectedPoint.lat}, ${expectedPoint.lon}`;
- expect(param.value).to.be(expectedLatLon);
- });
- });
-
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return an ES geo_polygon query representing the given node', function () {
- const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
- const result = geoPolygon.toElasticsearchQuery(node, indexPattern);
- expect(result).to.have.property('geo_polygon');
- expect(result.geo_polygon.geo).to.have.property('points');
-
- result.geo_polygon.geo.points.forEach((point, index) => {
- const expectedLatLon = `${points[index].lat}, ${points[index].lon}`;
- expect(point).to.be(expectedLatLon);
- });
- });
-
- it('should return an ES geo_polygon query without an index pattern', function () {
- const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
- const result = geoPolygon.toElasticsearchQuery(node);
- expect(result).to.have.property('geo_polygon');
- expect(result.geo_polygon.geo).to.have.property('points');
-
- result.geo_polygon.geo.points.forEach((point, index) => {
- const expectedLatLon = `${points[index].lat}, ${points[index].lon}`;
- expect(point).to.be(expectedLatLon);
- });
- });
-
- it('should use the ignore_unmapped parameter', function () {
- const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
- const result = geoPolygon.toElasticsearchQuery(node, indexPattern);
- expect(result.geo_polygon.ignore_unmapped).to.be(true);
- });
-
- it('should throw an error for scripted fields', function () {
- const node = nodeTypes.function.buildNode('geoPolygon', 'script number', points);
- expect(geoPolygon.toElasticsearchQuery)
- .withArgs(node, indexPattern).to.throwException(/Geo polygon query does not support scripted fields/);
- });
-
- it('should use a provided nested context to create a full field name', function () {
- const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
- const result = geoPolygon.toElasticsearchQuery(
- node,
- indexPattern,
- {},
- { nested: { path: 'nestedField' } }
- );
- expect(result).to.have.property('geo_polygon');
- expect(result.geo_polygon).to.have.property('nestedField.geo');
- });
- });
- });
-});
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/is.js b/packages/kbn-es-query/src/kuery/functions/__tests__/is.js
deleted file mode 100644
index b2f3d7ec16a658..00000000000000
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/is.js
+++ /dev/null
@@ -1,310 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import * as is from '../is';
-import { nodeTypes } from '../../node_types';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
-
-let indexPattern;
-
-describe('kuery functions', function () {
-
- describe('is', function () {
-
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- describe('buildNodeParams', function () {
-
- it('fieldName and value should be required arguments', function () {
- expect(is.buildNodeParams).to.throwException(/fieldName is a required argument/);
- expect(is.buildNodeParams).withArgs('foo').to.throwException(/value is a required argument/);
- });
-
- it('arguments should contain the provided fieldName and value as literals', function () {
- const { arguments: [fieldName, value] } = is.buildNodeParams('response', 200);
-
- expect(fieldName).to.have.property('type', 'literal');
- expect(fieldName).to.have.property('value', 'response');
-
- expect(value).to.have.property('type', 'literal');
- expect(value).to.have.property('value', 200);
- });
-
- it('should detect wildcards in the provided arguments', function () {
- const { arguments: [fieldName, value] } = is.buildNodeParams('machine*', 'win*');
-
- expect(fieldName).to.have.property('type', 'wildcard');
- expect(value).to.have.property('type', 'wildcard');
- });
-
- it('should default to a non-phrase query', function () {
- const { arguments: [, , isPhrase] } = is.buildNodeParams('response', 200);
- expect(isPhrase.value).to.be(false);
- });
-
- it('should allow specification of a phrase query', function () {
- const { arguments: [, , isPhrase] } = is.buildNodeParams('response', 200, true);
- expect(isPhrase.value).to.be(true);
- });
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return an ES match_all query when fieldName and value are both "*"', function () {
- const expected = {
- match_all: {}
- };
-
- const node = nodeTypes.function.buildNode('is', '*', '*');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an ES multi_match query using default_field when fieldName is null', function () {
- const expected = {
- multi_match: {
- query: 200,
- type: 'best_fields',
- lenient: true,
- }
- };
-
- const node = nodeTypes.function.buildNode('is', null, 200);
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an ES query_string query using default_field when fieldName is null and value contains a wildcard', function () {
- const expected = {
- query_string: {
- query: 'jpg*',
- }
- };
-
- const node = nodeTypes.function.buildNode('is', null, 'jpg*');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an ES bool query with a sub-query for each field when fieldName is "*"', function () {
- const node = nodeTypes.function.buildNode('is', '*', 200);
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.have.property('bool');
- expect(result.bool.should).to.have.length(indexPattern.fields.length);
- });
-
- it('should return an ES exists query when value is "*"', function () {
- const expected = {
- bool: {
- should: [
- { exists: { field: 'extension' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', '*');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an ES match query when a concrete fieldName and value are provided', function () {
- const expected = {
- bool: {
- should: [
- { match: { extension: 'jpg' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should return an ES match query when a concrete fieldName and value are provided without an index pattern', function () {
- const expected = {
- bool: {
- should: [
- { match: { extension: 'jpg' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
- const result = is.toElasticsearchQuery(node);
- expect(result).to.eql(expected);
- });
-
- it('should support creation of phrase queries', function () {
- const expected = {
- bool: {
- should: [
- { match_phrase: { extension: 'jpg' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', 'jpg', true);
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should create a query_string query for wildcard values', function () {
- const expected = {
- bool: {
- should: [
- {
- query_string: {
- fields: ['extension'],
- query: 'jpg*'
- }
- },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', 'jpg*');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should support scripted fields', function () {
- const node = nodeTypes.function.buildNode('is', 'script string', 'foo');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result.bool.should[0]).to.have.key('script');
- });
-
- it('should support date fields without a dateFormat provided', function () {
- const expected = {
- bool: {
- should: [
- {
- range: {
- '@timestamp': {
- gte: '2018-04-03T19:04:17',
- lte: '2018-04-03T19:04:17',
- }
- }
- }
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should support date fields with a dateFormat provided', function () {
- const config = { dateFormatTZ: 'America/Phoenix' };
- const expected = {
- bool: {
- should: [
- {
- range: {
- '@timestamp': {
- gte: '2018-04-03T19:04:17',
- lte: '2018-04-03T19:04:17',
- time_zone: 'America/Phoenix',
- }
- }
- }
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
- const result = is.toElasticsearchQuery(node, indexPattern, config);
- expect(result).to.eql(expected);
- });
-
- it('should use a provided nested context to create a full field name', function () {
- const expected = {
- bool: {
- should: [
- { match: { 'nestedField.extension': 'jpg' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
- const result = is.toElasticsearchQuery(
- node,
- indexPattern,
- {},
- { nested: { path: 'nestedField' } }
- );
- expect(result).to.eql(expected);
- });
-
- it('should support wildcard field names', function () {
- const expected = {
- bool: {
- should: [
- { match: { extension: 'jpg' } },
- ],
- minimum_should_match: 1
- }
- };
-
- const node = nodeTypes.function.buildNode('is', 'ext*', 'jpg');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
-
- it('should automatically add a nested query when a wildcard field name covers a nested field', () => {
- const expected = {
- bool: {
- should: [
- {
- nested: {
- path: 'nestedField.nestedChild',
- query: {
- match: {
- 'nestedField.nestedChild.doublyNestedChild': 'foo'
- }
- },
- score_mode: 'none'
- }
- }
- ],
- minimum_should_match: 1
- }
- };
-
-
- const node = nodeTypes.function.buildNode('is', '*doublyNested*', 'foo');
- const result = is.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
- });
- });
- });
-});
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_full_field_name_node.js b/packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_full_field_name_node.js
deleted file mode 100644
index dae15979a161cd..00000000000000
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_full_field_name_node.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import { nodeTypes } from '../../../node_types';
-import indexPatternResponse from '../../../../__fixtures__/index_pattern_response.json';
-import { getFullFieldNameNode } from '../../utils/get_full_field_name_node';
-
-let indexPattern;
-
-describe('getFullFieldNameNode', function () {
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- it('should return unchanged name node if no nested path is passed in', () => {
- const nameNode = nodeTypes.literal.buildNode('notNested');
- const result = getFullFieldNameNode(nameNode, indexPattern);
- expect(result).to.eql(nameNode);
- });
-
- it('should add the nested path if it is valid according to the index pattern', () => {
- const nameNode = nodeTypes.literal.buildNode('child');
- const result = getFullFieldNameNode(nameNode, indexPattern, 'nestedField');
- expect(result).to.eql(nodeTypes.literal.buildNode('nestedField.child'));
- });
-
- it('should throw an error if a path is provided for a non-nested field', () => {
- const nameNode = nodeTypes.literal.buildNode('os');
- expect(getFullFieldNameNode)
- .withArgs(nameNode, indexPattern, 'machine')
- .to
- .throwException(/machine.os is not a nested field but is in nested group "machine" in the KQL expression/);
- });
-
- it('should throw an error if a nested field is not passed with a path', () => {
- const nameNode = nodeTypes.literal.buildNode('nestedField.child');
- expect(getFullFieldNameNode)
- .withArgs(nameNode, indexPattern)
- .to
- .throwException(/nestedField.child is a nested field, but is not in a nested group in the KQL expression./);
- });
-
- it('should throw an error if a nested field is passed with the wrong path', () => {
- const nameNode = nodeTypes.literal.buildNode('nestedChild.doublyNestedChild');
- expect(getFullFieldNameNode)
- .withArgs(nameNode, indexPattern, 'nestedField')
- .to
- // eslint-disable-next-line max-len
- .throwException(/Nested field nestedField.nestedChild.doublyNestedChild is being queried with the incorrect nested path. The correct path is nestedField.nestedChild/);
- });
-
- it('should skip error checking for wildcard names', () => {
- const nameNode = nodeTypes.wildcard.buildNode('nested*');
- const result = getFullFieldNameNode(nameNode, indexPattern);
- expect(result).to.eql(nameNode);
- });
-
- it('should skip error checking if no index pattern is passed in', () => {
- const nameNode = nodeTypes.literal.buildNode('os');
- expect(getFullFieldNameNode)
- .withArgs(nameNode, null, 'machine')
- .to
- .not
- .throwException();
-
- const result = getFullFieldNameNode(nameNode, null, 'machine');
- expect(result).to.eql(nodeTypes.literal.buildNode('machine.os'));
- });
-
-});
diff --git a/packages/kbn-es-query/src/kuery/node_types/__tests__/function.js b/packages/kbn-es-query/src/kuery/node_types/__tests__/function.js
deleted file mode 100644
index de00c083fc8304..00000000000000
--- a/packages/kbn-es-query/src/kuery/node_types/__tests__/function.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import * as functionType from '../function';
-import _ from 'lodash';
-import expect from '@kbn/expect';
-import * as isFunction from '../../functions/is';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
-
-import { nodeTypes } from '../../node_types';
-
-describe('kuery node types', function () {
-
- describe('function', function () {
-
- let indexPattern;
-
- beforeEach(() => {
- indexPattern = indexPatternResponse;
- });
-
- describe('buildNode', function () {
-
- it('should return a node representing the given kuery function', function () {
- const result = functionType.buildNode('is', 'extension', 'jpg');
- expect(result).to.have.property('type', 'function');
- expect(result).to.have.property('function', 'is');
- expect(result).to.have.property('arguments');
- });
-
- });
-
- describe('buildNodeWithArgumentNodes', function () {
-
- it('should return a function node with the given argument list untouched', function () {
- const fieldNameLiteral = nodeTypes.literal.buildNode('extension');
- const valueLiteral = nodeTypes.literal.buildNode('jpg');
- const argumentNodes = [fieldNameLiteral, valueLiteral];
- const result = functionType.buildNodeWithArgumentNodes('is', argumentNodes);
-
- expect(result).to.have.property('type', 'function');
- expect(result).to.have.property('function', 'is');
- expect(result).to.have.property('arguments');
- expect(result.arguments).to.be(argumentNodes);
- expect(result.arguments).to.eql(argumentNodes);
- });
-
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return the given function type\'s ES query representation', function () {
- const node = functionType.buildNode('is', 'extension', 'jpg');
- const expected = isFunction.toElasticsearchQuery(node, indexPattern);
- const result = functionType.toElasticsearchQuery(node, indexPattern);
- expect(_.isEqual(expected, result)).to.be(true);
- });
-
- });
-
-
- });
-
-});
diff --git a/packages/kbn-es-query/src/kuery/node_types/__tests__/named_arg.js b/packages/kbn-es-query/src/kuery/node_types/__tests__/named_arg.js
deleted file mode 100644
index cfb8f6d5274dbe..00000000000000
--- a/packages/kbn-es-query/src/kuery/node_types/__tests__/named_arg.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import * as namedArg from '../named_arg';
-import { nodeTypes } from '../../node_types';
-
-describe('kuery node types', function () {
-
- describe('named arg', function () {
-
- describe('buildNode', function () {
-
- it('should return a node representing a named argument with the given value', function () {
- const result = namedArg.buildNode('fieldName', 'foo');
- expect(result).to.have.property('type', 'namedArg');
- expect(result).to.have.property('name', 'fieldName');
- expect(result).to.have.property('value');
-
- const literalValue = result.value;
- expect(literalValue).to.have.property('type', 'literal');
- expect(literalValue).to.have.property('value', 'foo');
- });
-
- it('should support literal nodes as values', function () {
- const value = nodeTypes.literal.buildNode('foo');
- const result = namedArg.buildNode('fieldName', value);
- expect(result.value).to.be(value);
- expect(result.value).to.eql(value);
- });
-
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return the argument value represented by the given node', function () {
- const node = namedArg.buildNode('fieldName', 'foo');
- const result = namedArg.toElasticsearchQuery(node);
- expect(result).to.be('foo');
- });
-
- });
-
- });
-
-});
diff --git a/packages/kbn-es-query/src/kuery/node_types/__tests__/wildcard.js b/packages/kbn-es-query/src/kuery/node_types/__tests__/wildcard.js
deleted file mode 100644
index 0c4379378c6d6f..00000000000000
--- a/packages/kbn-es-query/src/kuery/node_types/__tests__/wildcard.js
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import * as wildcard from '../wildcard';
-
-describe('kuery node types', function () {
-
- describe('wildcard', function () {
-
- describe('buildNode', function () {
-
- it('should accept a string argument representing a wildcard string', function () {
- const wildcardValue = `foo${wildcard.wildcardSymbol}bar`;
- const result = wildcard.buildNode(wildcardValue);
- expect(result).to.have.property('type', 'wildcard');
- expect(result).to.have.property('value', wildcardValue);
- });
-
- it('should accept and parse a wildcard string', function () {
- const result = wildcard.buildNode('foo*bar');
- expect(result).to.have.property('type', 'wildcard');
- expect(result.value).to.be(`foo${wildcard.wildcardSymbol}bar`);
- });
-
- });
-
- describe('toElasticsearchQuery', function () {
-
- it('should return the string representation of the wildcard literal', function () {
- const node = wildcard.buildNode('foo*bar');
- const result = wildcard.toElasticsearchQuery(node);
- expect(result).to.be('foo*bar');
- });
-
- });
-
- describe('toQueryStringQuery', function () {
-
- it('should return the string representation of the wildcard literal', function () {
- const node = wildcard.buildNode('foo*bar');
- const result = wildcard.toQueryStringQuery(node);
- expect(result).to.be('foo*bar');
- });
-
- it('should escape query_string query special characters other than wildcard', function () {
- const node = wildcard.buildNode('+foo*bar');
- const result = wildcard.toQueryStringQuery(node);
- expect(result).to.be('\\+foo*bar');
- });
-
- });
-
- describe('test', function () {
-
- it('should return a boolean indicating whether the string matches the given wildcard node', function () {
- const node = wildcard.buildNode('foo*bar');
- expect(wildcard.test(node, 'foobar')).to.be(true);
- expect(wildcard.test(node, 'foobazbar')).to.be(true);
- expect(wildcard.test(node, 'foobar')).to.be(true);
-
- expect(wildcard.test(node, 'fooqux')).to.be(false);
- expect(wildcard.test(node, 'bazbar')).to.be(false);
- });
-
- it('should return a true even when the string has newlines or tabs', function () {
- const node = wildcard.buildNode('foo*bar');
- expect(wildcard.test(node, 'foo\nbar')).to.be(true);
- expect(wildcard.test(node, 'foo\tbar')).to.be(true);
- });
- });
-
- describe('hasLeadingWildcard', function () {
- it('should determine whether a wildcard node contains a leading wildcard', function () {
- const node = wildcard.buildNode('foo*bar');
- expect(wildcard.hasLeadingWildcard(node)).to.be(false);
-
- const leadingWildcardNode = wildcard.buildNode('*foobar');
- expect(wildcard.hasLeadingWildcard(leadingWildcardNode)).to.be(true);
- });
-
- // Lone wildcards become exists queries, so we aren't worried about their performance
- it('should not consider a lone wildcard to be a leading wildcard', function () {
- const leadingWildcardNode = wildcard.buildNode('*');
- expect(wildcard.hasLeadingWildcard(leadingWildcardNode)).to.be(false);
- });
- });
-
- });
-
-});
diff --git a/packages/kbn-es-query/src/utils/__tests__/get_time_zone_from_settings.js b/packages/kbn-es-query/src/utils/__tests__/get_time_zone_from_settings.js
deleted file mode 100644
index 6deaccadfdb76c..00000000000000
--- a/packages/kbn-es-query/src/utils/__tests__/get_time_zone_from_settings.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import expect from '@kbn/expect';
-import { getTimeZoneFromSettings } from '../get_time_zone_from_settings';
-
-describe('get timezone from settings', function () {
-
- it('should return the config timezone if the time zone is set', function () {
- const result = getTimeZoneFromSettings('America/Chicago');
- expect(result).to.eql('America/Chicago');
- });
-
- it('should return the system timezone if the time zone is set to "Browser"', function () {
- const result = getTimeZoneFromSettings('Browser');
- expect(result).to.not.equal('Browser');
- });
-
-});
-
diff --git a/packages/kbn-es-query/src/utils/filters.js b/packages/kbn-es-query/src/utils/filters.js
deleted file mode 100644
index 6e4f5c342688ce..00000000000000
--- a/packages/kbn-es-query/src/utils/filters.js
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import { pick, get, reduce, map } from 'lodash';
-
-/** @deprecated
- * @see src/plugins/data/public/es_query/filters/phrase_filter.ts
- * Code was already moved into src/plugins/data/public.
- * This method will be removed after moving 'es_query' into new platform
- * */
-export const getConvertedValueForField = (field, value) => {
- if (typeof value !== 'boolean' && field.type === 'boolean') {
- if ([1, 'true'].includes(value)) {
- return true;
- } else if ([0, 'false'].includes(value)) {
- return false;
- } else {
- throw new Error(`${value} is not a valid boolean value for boolean field ${field.name}`);
- }
- }
- return value;
-};
-
-/** @deprecated
- * @see src/plugins/data/public/es_query/filters/phrase_filter.ts
- * Code was already moved into src/plugins/data/public.
- * This method will be removed after moving 'es_query' into new platform
- * */
-export const buildInlineScriptForPhraseFilter = (scriptedField) => {
- // We must wrap painless scripts in a lambda in case they're more than a simple expression
- if (scriptedField.lang === 'painless') {
- return (
- `boolean compare(Supplier s, def v) {return s.get() == v;}` +
- `compare(() -> { ${scriptedField.script} }, params.value);`
- );
- } else {
- return `(${scriptedField.script}) == value`;
- }
-};
-
-/** @deprecated
- * @see src/plugins/data/public/es_query/filters/phrase_filter.ts
- * Code was already moved into src/plugins/data/public.
- * This method will be removed after moving 'es_query' into new platform
- * */
-export function getPhraseScript(field, value) {
- const convertedValue = getConvertedValueForField(field, value);
- const script = buildInlineScriptForPhraseFilter(field);
-
- return {
- script: {
- source: script,
- lang: field.lang,
- params: {
- value: convertedValue,
- },
- },
- };
-}
-
-/** @deprecated
- * @see src/plugins/data/public/es_query/filters/range_filter.ts
- * Code was already moved into src/plugins/data/public.
- * This method will be removed after moving 'kuery' into new platform
- * */
-export function getRangeScript(field, params) {
- const operators = {
- gt: '>',
- gte: '>=',
- lte: '<=',
- lt: '<',
- };
- const comparators = {
- gt: 'boolean gt(Supplier s, def v) {return s.get() > v}',
- gte: 'boolean gte(Supplier s, def v) {return s.get() >= v}',
- lte: 'boolean lte(Supplier s, def v) {return s.get() <= v}',
- lt: 'boolean lt(Supplier s, def v) {return s.get() < v}',
- };
-
- const dateComparators = {
- gt: 'boolean gt(Supplier s, def v) {return s.get().toInstant().isAfter(Instant.parse(v))}',
- gte: 'boolean gte(Supplier s, def v) {return !s.get().toInstant().isBefore(Instant.parse(v))}',
- lte: 'boolean lte(Supplier s, def v) {return !s.get().toInstant().isAfter(Instant.parse(v))}',
- lt: 'boolean lt(Supplier s, def v) {return s.get().toInstant().isBefore(Instant.parse(v))}',
- };
-
- const knownParams = pick(params, (val, key) => {
- return key in operators;
- });
- let script = map(knownParams, (val, key) => {
- return '(' + field.script + ')' + get(operators, key) + key;
- }).join(' && ');
-
- // We must wrap painless scripts in a lambda in case they're more than a simple expression
- if (field.lang === 'painless') {
- const comp = field.type === 'date' ? dateComparators : comparators;
- const currentComparators = reduce(
- knownParams,
- (acc, val, key) => acc.concat(get(comp, key)),
- []
- ).join(' ');
-
- const comparisons = map(knownParams, (val, key) => {
- return `${key}(() -> { ${field.script} }, params.${key})`;
- }).join(' && ');
-
- script = `${currentComparators}${comparisons}`;
- }
-
- return {
- script: {
- source: script,
- params: knownParams,
- lang: field.lang,
- },
- };
-}
diff --git a/packages/kbn-es-query/src/utils/get_time_zone_from_settings.js b/packages/kbn-es-query/src/utils/get_time_zone_from_settings.js
deleted file mode 100644
index 1a06941ece1274..00000000000000
--- a/packages/kbn-es-query/src/utils/get_time_zone_from_settings.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import moment from 'moment-timezone';
-const detectedTimezone = moment.tz.guess();
-
-export function getTimeZoneFromSettings(dateFormatTZ) {
- if (dateFormatTZ === 'Browser') {
- return detectedTimezone;
- }
- return dateFormatTZ;
-}
diff --git a/packages/kbn-es-query/src/utils/index.js b/packages/kbn-es-query/src/utils/index.js
deleted file mode 100644
index 27f51c1f44cf2f..00000000000000
--- a/packages/kbn-es-query/src/utils/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-export * from './get_time_zone_from_settings';
diff --git a/packages/kbn-es-query/tasks/build_cli.js b/packages/kbn-es-query/tasks/build_cli.js
deleted file mode 100644
index 2a43c4d10e0070..00000000000000
--- a/packages/kbn-es-query/tasks/build_cli.js
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Licensed to Elasticsearch B.V. under one or more contributor
- * license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright
- * ownership. Elasticsearch B.V. licenses this file to you under
- * the Apache License, Version 2.0 (the "License"); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-const { resolve } = require('path');
-
-const getopts = require('getopts');
-const del = require('del');
-const supportsColor = require('supports-color');
-const { ToolingLog, withProcRunner, pickLevelFromFlags } = require('@kbn/dev-utils');
-
-const ROOT_DIR = resolve(__dirname, '..');
-const BUILD_DIR = resolve(ROOT_DIR, 'target');
-
-const padRight = (width, str) =>
- str.length >= width ? str : `${str}${' '.repeat(width - str.length)}`;
-
-const unknownFlags = [];
-const flags = getopts(process.argv, {
- boolean: ['watch', 'help', 'source-maps'],
- unknown(name) {
- unknownFlags.push(name);
- },
-});
-
-const log = new ToolingLog({
- level: pickLevelFromFlags(flags),
- writeTo: process.stdout,
-});
-
-if (unknownFlags.length) {
- log.error(`Unknown flag(s): ${unknownFlags.join(', ')}`);
- flags.help = true;
- process.exitCode = 1;
-}
-
-if (flags.help) {
- log.info(`
- Simple build tool for @kbn/es-query package
-
- --watch Run in watch mode
- --source-maps Include sourcemaps
- --help Show this message
- `);
- process.exit();
-}
-
-withProcRunner(log, async proc => {
- log.info('Deleting old output');
- await del(BUILD_DIR);
-
- const cwd = ROOT_DIR;
- const env = { ...process.env };
- if (supportsColor.stdout) {
- env.FORCE_COLOR = 'true';
- }
-
- log.info(`Starting babel and typescript${flags.watch ? ' in watch mode' : ''}`);
- await Promise.all([
- ...['public', 'server'].map(subTask =>
- proc.run(padRight(12, `babel:${subTask}`), {
- cmd: 'babel',
- args: [
- 'src',
- '--config-file',
- require.resolve('../babel.config.js'),
- '--out-dir',
- resolve(BUILD_DIR, subTask),
- '--extensions',
- '.js,.ts,.tsx',
- ...(flags.watch ? ['--watch'] : ['--quiet']),
- ...(flags['source-maps'] ? ['--source-map', 'inline'] : []),
- ],
- wait: true,
- cwd,
- env: {
- ...env,
- BABEL_ENV: subTask,
- },
- })
- ),
- ]);
-
- log.success('Complete');
-}).catch(error => {
- log.error(error);
- process.exit(1);
-});
diff --git a/packages/kbn-es-query/tsconfig.browser.json b/packages/kbn-es-query/tsconfig.browser.json
deleted file mode 100644
index 4a914074712661..00000000000000
--- a/packages/kbn-es-query/tsconfig.browser.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../../tsconfig.browser.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./target/public"
- },
- "include": [
- "index.d.ts",
- "src/**/*.ts"
- ]
-}
diff --git a/packages/kbn-es-query/tsconfig.json b/packages/kbn-es-query/tsconfig.json
deleted file mode 100644
index 05f51bbccd2ff3..00000000000000
--- a/packages/kbn-es-query/tsconfig.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "extends": "../../tsconfig.json",
- "compilerOptions": {
- "rootDir": "./src",
- "outDir": "./target/server"
- },
- "include": [
- "index.d.ts",
- "src/**/*.ts"
- ]
-}
diff --git a/src/core/public/public.api.md b/src/core/public/public.api.md
index 16a634b2d32872..30a98c9046ff50 100644
--- a/src/core/public/public.api.md
+++ b/src/core/public/public.api.md
@@ -846,7 +846,7 @@ export class SavedObjectsClient {
bulkUpdate(objects?: SavedObjectsBulkUpdateObject[]): Promise>;
create: (type: string, attributes: T, options?: SavedObjectsCreateOptions) => Promise>;
delete: (type: string, id: string) => Promise<{}>;
- find: (options: Pick) => Promise>;
+ find: (options: Pick) => Promise>;
get: (type: string, id: string) => Promise>;
update(type: string, id: string, attributes: T, { version, migrationVersion, references }?: SavedObjectsUpdateOptions): Promise>;
}
diff --git a/src/core/server/saved_objects/service/lib/filter_utils.test.ts b/src/core/server/saved_objects/service/lib/filter_utils.test.ts
index 4c4f321695d706..13a132ab9dd67b 100644
--- a/src/core/server/saved_objects/service/lib/filter_utils.test.ts
+++ b/src/core/server/saved_objects/service/lib/filter_utils.test.ts
@@ -17,7 +17,7 @@
* under the License.
*/
-import { fromKueryExpression } from '@kbn/es-query';
+import { esKuery } from '../../../../../plugins/data/server';
import { validateFilterKueryNode, validateConvertFilterToKueryNode } from './filter_utils';
@@ -64,7 +64,7 @@ describe('Filter Utils', () => {
test('Validate a simple filter', () => {
expect(
validateConvertFilterToKueryNode(['foo'], 'foo.attributes.title: "best"', mockMappings)
- ).toEqual(fromKueryExpression('foo.title: "best"'));
+ ).toEqual(esKuery.fromKueryExpression('foo.title: "best"'));
});
test('Assemble filter kuery node saved object attributes with one saved object type', () => {
expect(
@@ -74,7 +74,7 @@ describe('Filter Utils', () => {
mockMappings
)
).toEqual(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'(type: foo and updatedAt: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)'
)
);
@@ -88,7 +88,7 @@ describe('Filter Utils', () => {
mockMappings
)
).toEqual(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'(type: foo and updatedAt: 5678654567) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or foo.description :*)'
)
);
@@ -102,7 +102,7 @@ describe('Filter Utils', () => {
mockMappings
)
).toEqual(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'((type: bar and updatedAt: 5678654567) or (type: foo and updatedAt: 5678654567)) and foo.bytes > 1000 and foo.bytes < 8000 and foo.title: "best" and (foo.description: t* or bar.description :*)'
)
);
@@ -130,7 +130,7 @@ describe('Filter Utils', () => {
describe('#validateFilterKueryNode', () => {
test('Validate filter query through KueryNode - happy path', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)'
),
['foo'],
@@ -185,7 +185,7 @@ describe('Filter Utils', () => {
test('Return Error if key is not wrapper by a saved object type', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)'
),
['foo'],
@@ -240,7 +240,7 @@ describe('Filter Utils', () => {
test('Return Error if key of a saved object type is not wrapped with attributes', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'foo.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.description :*)'
),
['foo'],
@@ -297,7 +297,7 @@ describe('Filter Utils', () => {
test('Return Error if filter is not using an allowed type', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'bar.updatedAt: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.title: "best" and (foo.attributes.description: t* or foo.attributes.description :*)'
),
['foo'],
@@ -352,7 +352,7 @@ describe('Filter Utils', () => {
test('Return Error if filter is using an non-existing key in the index patterns of the saved object type', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression(
+ esKuery.fromKueryExpression(
'foo.updatedAt33: 5678654567 and foo.attributes.bytes > 1000 and foo.attributes.bytes < 8000 and foo.attributes.header: "best" and (foo.attributes.description: t* or foo.attributes.description :*)'
),
['foo'],
@@ -408,7 +408,7 @@ describe('Filter Utils', () => {
test('Return Error if filter is using an non-existing key null key', () => {
const validationObject = validateFilterKueryNode(
- fromKueryExpression('foo.attributes.description: hello AND bye'),
+ esKuery.fromKueryExpression('foo.attributes.description: hello AND bye'),
['foo'],
mockMappings
);
diff --git a/src/core/server/saved_objects/service/lib/filter_utils.ts b/src/core/server/saved_objects/service/lib/filter_utils.ts
index e331d3eff990f7..3cf499de541ee4 100644
--- a/src/core/server/saved_objects/service/lib/filter_utils.ts
+++ b/src/core/server/saved_objects/service/lib/filter_utils.ts
@@ -17,18 +17,18 @@
* under the License.
*/
-import { fromKueryExpression, KueryNode, nodeTypes } from '@kbn/es-query';
import { get, set } from 'lodash';
import { SavedObjectsErrorHelpers } from './errors';
import { IndexMapping } from '../../mappings';
+import { esKuery } from '../../../../../plugins/data/server';
export const validateConvertFilterToKueryNode = (
allowedTypes: string[],
filter: string,
indexMapping: IndexMapping
-): KueryNode => {
+): esKuery.KueryNode | undefined => {
if (filter && filter.length > 0 && indexMapping) {
- const filterKueryNode = fromKueryExpression(filter);
+ const filterKueryNode = esKuery.fromKueryExpression(filter);
const validationFilterKuery = validateFilterKueryNode(
filterKueryNode,
@@ -54,7 +54,7 @@ export const validateConvertFilterToKueryNode = (
validationFilterKuery.forEach(item => {
const path: string[] = item.astPath.length === 0 ? [] : item.astPath.split('.');
- const existingKueryNode: KueryNode =
+ const existingKueryNode: esKuery.KueryNode =
path.length === 0 ? filterKueryNode : get(filterKueryNode, path);
if (item.isSavedObjectAttr) {
existingKueryNode.arguments[0].value = existingKueryNode.arguments[0].value.split('.')[1];
@@ -63,8 +63,8 @@ export const validateConvertFilterToKueryNode = (
set(
filterKueryNode,
path,
- nodeTypes.function.buildNode('and', [
- nodeTypes.function.buildNode('is', 'type', itemType[0]),
+ esKuery.nodeTypes.function.buildNode('and', [
+ esKuery.nodeTypes.function.buildNode('is', 'type', itemType[0]),
existingKueryNode,
])
);
@@ -79,7 +79,6 @@ export const validateConvertFilterToKueryNode = (
});
return filterKueryNode;
}
- return null;
};
interface ValidateFilterKueryNode {
@@ -91,41 +90,44 @@ interface ValidateFilterKueryNode {
}
export const validateFilterKueryNode = (
- astFilter: KueryNode,
+ astFilter: esKuery.KueryNode,
types: string[],
indexMapping: IndexMapping,
storeValue: boolean = false,
path: string = 'arguments'
): ValidateFilterKueryNode[] => {
- return astFilter.arguments.reduce((kueryNode: string[], ast: KueryNode, index: number) => {
- if (ast.arguments) {
- const myPath = `${path}.${index}`;
- return [
- ...kueryNode,
- ...validateFilterKueryNode(
- ast,
- types,
- indexMapping,
- ast.type === 'function' && ['is', 'range'].includes(ast.function),
- `${myPath}.arguments`
- ),
- ];
- }
- if (storeValue && index === 0) {
- const splitPath = path.split('.');
- return [
- ...kueryNode,
- {
- astPath: splitPath.slice(0, splitPath.length - 1).join('.'),
- error: hasFilterKeyError(ast.value, types, indexMapping),
- isSavedObjectAttr: isSavedObjectAttr(ast.value, indexMapping),
- key: ast.value,
- type: getType(ast.value),
- },
- ];
- }
- return kueryNode;
- }, []);
+ return astFilter.arguments.reduce(
+ (kueryNode: string[], ast: esKuery.KueryNode, index: number) => {
+ if (ast.arguments) {
+ const myPath = `${path}.${index}`;
+ return [
+ ...kueryNode,
+ ...validateFilterKueryNode(
+ ast,
+ types,
+ indexMapping,
+ ast.type === 'function' && ['is', 'range'].includes(ast.function),
+ `${myPath}.arguments`
+ ),
+ ];
+ }
+ if (storeValue && index === 0) {
+ const splitPath = path.split('.');
+ return [
+ ...kueryNode,
+ {
+ astPath: splitPath.slice(0, splitPath.length - 1).join('.'),
+ error: hasFilterKeyError(ast.value, types, indexMapping),
+ isSavedObjectAttr: isSavedObjectAttr(ast.value, indexMapping),
+ key: ast.value,
+ type: getType(ast.value),
+ },
+ ];
+ }
+ return kueryNode;
+ },
+ []
+ );
};
const getType = (key: string | undefined | null) =>
diff --git a/src/core/server/saved_objects/service/lib/repository.test.js b/src/core/server/saved_objects/service/lib/repository.test.js
index 79a3e573ab98c9..3d81c2c2efd526 100644
--- a/src/core/server/saved_objects/service/lib/repository.test.js
+++ b/src/core/server/saved_objects/service/lib/repository.test.js
@@ -1289,8 +1289,7 @@ describe('SavedObjectsRepository', () => {
type: 'foo',
id: '1',
},
- indexPattern: undefined,
- kueryNode: null,
+ kueryNode: undefined,
};
await savedObjectsRepository.find(relevantOpts);
diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts
index 51d4a8ad50ad63..e8f1fb16461c1d 100644
--- a/src/core/server/saved_objects/service/lib/repository.ts
+++ b/src/core/server/saved_objects/service/lib/repository.ts
@@ -448,11 +448,11 @@ export class SavedObjectsRepository {
}
let kueryNode;
+
try {
- kueryNode =
- filter && filter !== ''
- ? validateConvertFilterToKueryNode(allowedTypes, filter, this._mappings)
- : null;
+ if (filter) {
+ kueryNode = validateConvertFilterToKueryNode(allowedTypes, filter, this._mappings);
+ }
} catch (e) {
if (e.name === 'KQLSyntaxError') {
throw SavedObjectsErrorHelpers.createBadRequestError('KQLSyntaxError: ' + e.message);
diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts
index bee35b899d83c5..cfeb258c2f03b4 100644
--- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts
+++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.ts
@@ -16,7 +16,7 @@
* specific language governing permissions and limitations
* under the License.
*/
-import { toElasticsearchQuery, KueryNode } from '@kbn/es-query';
+import { esKuery } from '../../../../../../plugins/data/server';
import { getRootPropertiesObjects, IndexMapping } from '../../../mappings';
import { SavedObjectsSchema } from '../../../schema';
@@ -91,7 +91,7 @@ interface QueryParams {
searchFields?: string[];
defaultSearchOperator?: string;
hasReference?: HasReferenceQueryParams;
- kueryNode?: KueryNode;
+ kueryNode?: esKuery.KueryNode;
}
/**
@@ -111,7 +111,7 @@ export function getQueryParams({
const types = getTypes(mappings, type);
const bool: any = {
filter: [
- ...(kueryNode != null ? [toElasticsearchQuery(kueryNode)] : []),
+ ...(kueryNode != null ? [esKuery.toElasticsearchQuery(kueryNode)] : []),
{
bool: {
must: hasReference
diff --git a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts
index 868ca51a76eab8..f2bbc3ef564a14 100644
--- a/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts
+++ b/src/core/server/saved_objects/service/lib/search_dsl/search_dsl.ts
@@ -17,13 +17,13 @@
* under the License.
*/
-import { KueryNode } from '@kbn/es-query';
import Boom from 'boom';
import { IndexMapping } from '../../../mappings';
import { SavedObjectsSchema } from '../../../schema';
import { getQueryParams } from './query_params';
import { getSortingParams } from './sorting_params';
+import { esKuery } from '../../../../../../plugins/data/server';
interface GetSearchDslOptions {
type: string | string[];
@@ -37,7 +37,7 @@ interface GetSearchDslOptions {
type: string;
id: string;
};
- kueryNode?: KueryNode;
+ kueryNode?: esKuery.KueryNode;
}
export function getSearchDsl(
diff --git a/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_top_row.tsx b/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_top_row.tsx
index 1bf8ac086d3411..ed3c2413b0eb49 100644
--- a/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_top_row.tsx
+++ b/src/legacy/core_plugins/data/public/query/query_bar/components/query_bar_top_row.tsx
@@ -18,11 +18,8 @@
*/
import dateMath from '@elastic/datemath';
-import { doesKueryExpressionHaveLuceneSyntaxError } from '@kbn/es-query';
-
import classNames from 'classnames';
import React, { useState } from 'react';
-
import {
EuiButton,
EuiFlexGroup,
@@ -42,9 +39,9 @@ import {
Query,
PersistedLog,
getQueryLog,
+ esKuery,
} from '../../../../../../../plugins/data/public';
import { useKibana, toMountPoint } from '../../../../../../../plugins/kibana_react/public';
-
import { IndexPattern } from '../../../index_patterns';
import { QueryBarInput } from './query_bar_input';
@@ -300,7 +297,7 @@ function QueryBarTopRowUI(props: Props) {
language === 'kuery' &&
typeof query === 'string' &&
(!storage || !storage.get('kibana.luceneSyntaxWarningOptOut')) &&
- doesKueryExpressionHaveLuceneSyntaxError(query)
+ esKuery.doesKueryExpressionHaveLuceneSyntaxError(query)
) {
const toast = notifications!.toasts.addWarning({
title: intl.formatMessage({
diff --git a/src/legacy/core_plugins/timelion/public/vis/timelion_request_handler.ts b/src/legacy/core_plugins/timelion/public/vis/timelion_request_handler.ts
index 74111bf7948775..14cd3d0083e6ab 100644
--- a/src/legacy/core_plugins/timelion/public/vis/timelion_request_handler.ts
+++ b/src/legacy/core_plugins/timelion/public/vis/timelion_request_handler.ts
@@ -83,7 +83,7 @@ export function getTimelionRequestHandler(dependencies: TimelionVisualizationDep
sheet: [expression],
extended: {
es: {
- filter: esQuery.buildEsQuery(null, query, filters, esQueryConfigs),
+ filter: esQuery.buildEsQuery(undefined, query, filters, esQueryConfigs),
},
},
time: {
diff --git a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js
index 2b42c22ad7c435..1d42b773369334 100644
--- a/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js
+++ b/src/legacy/core_plugins/vis_type_timeseries/public/components/vis_editor.js
@@ -22,7 +22,6 @@ import React, { Component } from 'react';
import * as Rx from 'rxjs';
import { share } from 'rxjs/operators';
import { isEqual, isEmpty, debounce } from 'lodash';
-import { fromKueryExpression } from '@kbn/es-query';
import { VisEditorVisualization } from './vis_editor_visualization';
import { Visualization } from './visualization';
import { VisPicker } from './vis_picker';
@@ -30,6 +29,7 @@ import { PanelConfig } from './panel_config';
import { createBrushHandler } from '../lib/create_brush_handler';
import { fetchFields } from '../lib/fetch_fields';
import { extractIndexPatterns } from '../../common/extract_index_patterns';
+import { esKuery } from '../../../../../plugins/data/public';
import { npStart } from 'ui/new_platform';
@@ -88,7 +88,7 @@ export class VisEditor extends Component {
if (filterQuery && filterQuery.language === 'kuery') {
try {
const queryOptions = this.coreContext.uiSettings.get('query:allowLeadingWildcards');
- fromKueryExpression(filterQuery.query, { allowLeadingWildcards: queryOptions });
+ esKuery.fromKueryExpression(filterQuery.query, { allowLeadingWildcards: queryOptions });
} catch (error) {
return false;
}
diff --git a/src/legacy/core_plugins/vis_type_vega/public/vega_request_handler.ts b/src/legacy/core_plugins/vis_type_vega/public/vega_request_handler.ts
index 83ae31bf874001..26380bf2b9d94f 100644
--- a/src/legacy/core_plugins/vis_type_vega/public/vega_request_handler.ts
+++ b/src/legacy/core_plugins/vis_type_vega/public/vega_request_handler.ts
@@ -49,7 +49,7 @@ export function createVegaRequestHandler({
timeCache.setTimeRange(timeRange);
const esQueryConfigs = esQuery.getEsQueryConfig(uiSettings);
- const filtersDsl = esQuery.buildEsQuery(null, query, filters, esQueryConfigs);
+ const filtersDsl = esQuery.buildEsQuery(undefined, query, filters, esQueryConfigs);
const vp = new VegaParser(visParams.spec, searchCache, timeCache, filtersDsl, serviceSettings);
return vp.parseAsync();
diff --git a/src/plugins/data/common/es_query/es_query/build_es_query.test.ts b/src/plugins/data/common/es_query/es_query/build_es_query.test.ts
index 3db23051b6ced9..405754ffcb572d 100644
--- a/src/plugins/data/common/es_query/es_query/build_es_query.test.ts
+++ b/src/plugins/data/common/es_query/es_query/build_es_query.test.ts
@@ -18,7 +18,7 @@
*/
import { buildEsQuery } from './build_es_query';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
+import { fromKueryExpression, toElasticsearchQuery } from '../kuery';
import { luceneStringToDsl } from './lucene_string_to_dsl';
import { decorateQuery } from './decorate_query';
import { IIndexPattern } from '../../index_patterns';
diff --git a/src/plugins/data/common/es_query/es_query/build_es_query.ts b/src/plugins/data/common/es_query/es_query/build_es_query.ts
index b7544967936603..e4f5f1f9e216c8 100644
--- a/src/plugins/data/common/es_query/es_query/build_es_query.ts
+++ b/src/plugins/data/common/es_query/es_query/build_es_query.ts
@@ -41,7 +41,7 @@ export interface EsQueryConfig {
* config contains dateformat:tz
*/
export function buildEsQuery(
- indexPattern: IIndexPattern | null,
+ indexPattern: IIndexPattern | undefined,
queries: Query | Query[],
filters: Filter | Filter[],
config: EsQueryConfig = {
diff --git a/src/plugins/data/common/es_query/es_query/filter_matches_index.test.ts b/src/plugins/data/common/es_query/es_query/filter_matches_index.test.ts
index 6e03c665290ae9..669c5a62af7263 100644
--- a/src/plugins/data/common/es_query/es_query/filter_matches_index.test.ts
+++ b/src/plugins/data/common/es_query/es_query/filter_matches_index.test.ts
@@ -31,9 +31,8 @@ describe('filterMatchesIndex', () => {
it('should return true if no index pattern is passed', () => {
const filter = { meta: { index: 'foo', key: 'bar' } } as Filter;
- const indexPattern = null;
- expect(filterMatchesIndex(filter, indexPattern)).toBe(true);
+ expect(filterMatchesIndex(filter, undefined)).toBe(true);
});
it('should return true if the filter key matches a field name', () => {
diff --git a/src/plugins/data/common/es_query/es_query/filter_matches_index.ts b/src/plugins/data/common/es_query/es_query/filter_matches_index.ts
index 9b68f5088c4479..a9cd3d8b7ba268 100644
--- a/src/plugins/data/common/es_query/es_query/filter_matches_index.ts
+++ b/src/plugins/data/common/es_query/es_query/filter_matches_index.ts
@@ -25,7 +25,7 @@ import { Filter } from '../filters';
* this to check if `filter.meta.index` matches `indexPattern.id` instead, but that's a breaking
* change.
*/
-export function filterMatchesIndex(filter: Filter, indexPattern: IIndexPattern | null) {
+export function filterMatchesIndex(filter: Filter, indexPattern?: IIndexPattern | null) {
if (!filter.meta?.key || !indexPattern) {
return true;
}
diff --git a/src/plugins/data/common/es_query/es_query/from_filters.ts b/src/plugins/data/common/es_query/es_query/from_filters.ts
index 1e0957d8165908..e33040485bf47d 100644
--- a/src/plugins/data/common/es_query/es_query/from_filters.ts
+++ b/src/plugins/data/common/es_query/es_query/from_filters.ts
@@ -54,7 +54,7 @@ const translateToQuery = (filter: Filter) => {
export const buildQueryFromFilters = (
filters: Filter[] = [],
- indexPattern: IIndexPattern | null,
+ indexPattern: IIndexPattern | undefined,
ignoreFilterIfFieldNotInIndex: boolean = false
) => {
filters = filters.filter(filter => filter && !isFilterDisabled(filter));
diff --git a/src/plugins/data/common/es_query/es_query/from_kuery.test.ts b/src/plugins/data/common/es_query/es_query/from_kuery.test.ts
index 000815b51f6208..4574cd5ffd0cbd 100644
--- a/src/plugins/data/common/es_query/es_query/from_kuery.test.ts
+++ b/src/plugins/data/common/es_query/es_query/from_kuery.test.ts
@@ -18,7 +18,7 @@
*/
import { buildQueryFromKuery } from './from_kuery';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
+import { fromKueryExpression, toElasticsearchQuery } from '../kuery';
import { IIndexPattern } from '../../index_patterns';
import { fields } from '../../index_patterns/mocks';
import { Query } from '../../query/types';
@@ -30,7 +30,7 @@ describe('build query', () => {
describe('buildQueryFromKuery', () => {
test('should return the parameters of an Elasticsearch bool query', () => {
- const result = buildQueryFromKuery(null, [], true);
+ const result = buildQueryFromKuery(undefined, [], true);
const expected = {
must: [],
filter: [],
diff --git a/src/plugins/data/common/es_query/es_query/from_kuery.ts b/src/plugins/data/common/es_query/es_query/from_kuery.ts
index f91c3d97b95b43..f4ec0fe0b34c5e 100644
--- a/src/plugins/data/common/es_query/es_query/from_kuery.ts
+++ b/src/plugins/data/common/es_query/es_query/from_kuery.ts
@@ -17,12 +17,12 @@
* under the License.
*/
-import { fromKueryExpression, toElasticsearchQuery, nodeTypes, KueryNode } from '@kbn/es-query';
+import { fromKueryExpression, toElasticsearchQuery, nodeTypes, KueryNode } from '../kuery';
import { IIndexPattern } from '../../index_patterns';
import { Query } from '../../query/types';
export function buildQueryFromKuery(
- indexPattern: IIndexPattern | null,
+ indexPattern: IIndexPattern | undefined,
queries: Query[] = [],
allowLeadingWildcards: boolean = false,
dateFormatTZ?: string
@@ -35,22 +35,20 @@ export function buildQueryFromKuery(
}
function buildQuery(
- indexPattern: IIndexPattern | null,
+ indexPattern: IIndexPattern | undefined,
queryASTs: KueryNode[],
config: Record = {}
) {
- const compoundQueryAST: KueryNode = nodeTypes.function.buildNode('and', queryASTs);
- const kueryQuery: Record = toElasticsearchQuery(
- compoundQueryAST,
- indexPattern,
- config
- );
+ const compoundQueryAST = nodeTypes.function.buildNode('and', queryASTs);
+ const kueryQuery = toElasticsearchQuery(compoundQueryAST, indexPattern, config);
- return {
- must: [],
- filter: [],
- should: [],
- must_not: [],
- ...kueryQuery.bool,
- };
+ return Object.assign(
+ {
+ must: [],
+ filter: [],
+ should: [],
+ must_not: [],
+ },
+ kueryQuery.bool
+ );
}
diff --git a/src/plugins/data/common/es_query/es_query/migrate_filter.test.ts b/src/plugins/data/common/es_query/es_query/migrate_filter.test.ts
index 4617ee1a1c43d3..e01240da87543b 100644
--- a/src/plugins/data/common/es_query/es_query/migrate_filter.test.ts
+++ b/src/plugins/data/common/es_query/es_query/migrate_filter.test.ts
@@ -40,7 +40,7 @@ describe('migrateFilter', function() {
} as unknown) as PhraseFilter;
it('should migrate match filters of type phrase', function() {
- const migratedFilter = migrateFilter(oldMatchPhraseFilter, null);
+ const migratedFilter = migrateFilter(oldMatchPhraseFilter, undefined);
expect(isEqual(migratedFilter, newMatchPhraseFilter)).toBe(true);
});
@@ -48,7 +48,7 @@ describe('migrateFilter', function() {
it('should not modify the original filter', function() {
const oldMatchPhraseFilterCopy = clone(oldMatchPhraseFilter, true);
- migrateFilter(oldMatchPhraseFilter, null);
+ migrateFilter(oldMatchPhraseFilter, undefined);
expect(isEqual(oldMatchPhraseFilter, oldMatchPhraseFilterCopy)).toBe(true);
});
@@ -57,7 +57,7 @@ describe('migrateFilter', function() {
const originalFilter = {
match_all: {},
} as MatchAllFilter;
- const migratedFilter = migrateFilter(originalFilter, null);
+ const migratedFilter = migrateFilter(originalFilter, undefined);
expect(migratedFilter).toBe(originalFilter);
expect(isEqual(migratedFilter, originalFilter)).toBe(true);
diff --git a/src/plugins/data/common/es_query/es_query/migrate_filter.ts b/src/plugins/data/common/es_query/es_query/migrate_filter.ts
index 258ab9e7031319..fdc40768ebe41c 100644
--- a/src/plugins/data/common/es_query/es_query/migrate_filter.ts
+++ b/src/plugins/data/common/es_query/es_query/migrate_filter.ts
@@ -43,7 +43,7 @@ function isMatchPhraseFilter(filter: any): filter is DeprecatedMatchPhraseFilter
return Boolean(fieldName && get(filter, ['match', fieldName, 'type']) === 'phrase');
}
-export function migrateFilter(filter: Filter, indexPattern: IIndexPattern | null) {
+export function migrateFilter(filter: Filter, indexPattern?: IIndexPattern) {
if (isMatchPhraseFilter(filter)) {
const fieldName = Object.keys(filter.match)[0];
const params: Record = get(filter, ['match', fieldName]);
diff --git a/src/plugins/data/common/es_query/index.ts b/src/plugins/data/common/es_query/index.ts
index 56eb45c4b1dcaf..937fe09903b6bc 100644
--- a/src/plugins/data/common/es_query/index.ts
+++ b/src/plugins/data/common/es_query/index.ts
@@ -18,6 +18,7 @@
*/
import * as esQuery from './es_query';
import * as esFilters from './filters';
+import * as esKuery from './kuery';
import * as utils from './utils';
-export { esFilters, esQuery, utils };
+export { esFilters, esQuery, utils, esKuery };
diff --git a/packages/kbn-es-query/src/kuery/ast/kuery.js b/src/plugins/data/common/es_query/kuery/ast/_generated_/kuery.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/ast/kuery.js
rename to src/plugins/data/common/es_query/kuery/ast/_generated_/kuery.js
diff --git a/src/plugins/data/common/es_query/kuery/ast/ast.test.ts b/src/plugins/data/common/es_query/kuery/ast/ast.test.ts
new file mode 100644
index 00000000000000..e441420760475c
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/ast/ast.test.ts
@@ -0,0 +1,421 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {
+ fromKueryExpression,
+ fromLiteralExpression,
+ toElasticsearchQuery,
+ doesKueryExpressionHaveLuceneSyntaxError,
+} from './ast';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+import { KueryNode } from '../types';
+
+describe('kuery AST API', () => {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ describe('fromKueryExpression', () => {
+ test('should return a match all "is" function for whitespace', () => {
+ const expected = nodeTypes.function.buildNode('is', '*', '*');
+ const actual = fromKueryExpression(' ');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should return an "is" function with a null field for single literals', () => {
+ const expected = nodeTypes.function.buildNode('is', null, 'foo');
+ const actual = fromKueryExpression('foo');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should ignore extraneous whitespace at the beginning and end of the query', () => {
+ const expected = nodeTypes.function.buildNode('is', null, 'foo');
+ const actual = fromKueryExpression(' foo ');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should not split on whitespace', () => {
+ const expected = nodeTypes.function.buildNode('is', null, 'foo bar');
+ const actual = fromKueryExpression('foo bar');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support "and" as a binary operator', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('is', null, 'foo'),
+ nodeTypes.function.buildNode('is', null, 'bar'),
+ ]);
+ const actual = fromKueryExpression('foo and bar');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support "or" as a binary operator', () => {
+ const expected = nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', null, 'foo'),
+ nodeTypes.function.buildNode('is', null, 'bar'),
+ ]);
+ const actual = fromKueryExpression('foo or bar');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support negation of queries with a "not" prefix', () => {
+ const expected = nodeTypes.function.buildNode(
+ 'not',
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', null, 'foo'),
+ nodeTypes.function.buildNode('is', null, 'bar'),
+ ])
+ );
+ const actual = fromKueryExpression('not (foo or bar)');
+ expect(actual).toEqual(expected);
+ });
+
+ test('"and" should have a higher precedence than "or"', () => {
+ const expected = nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', null, 'foo'),
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('is', null, 'bar'),
+ nodeTypes.function.buildNode('is', null, 'baz'),
+ ]),
+ nodeTypes.function.buildNode('is', null, 'qux'),
+ ]),
+ ]);
+ const actual = fromKueryExpression('foo or bar and baz or qux');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support grouping to override default precedence', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', null, 'foo'),
+ nodeTypes.function.buildNode('is', null, 'bar'),
+ ]),
+ nodeTypes.function.buildNode('is', null, 'baz'),
+ ]);
+ const actual = fromKueryExpression('(foo or bar) and baz');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support matching against specific fields', () => {
+ const expected = nodeTypes.function.buildNode('is', 'foo', 'bar');
+ const actual = fromKueryExpression('foo:bar');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should also not split on whitespace when matching specific fields', () => {
+ const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz');
+ const actual = fromKueryExpression('foo:bar baz');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should treat quoted values as phrases', () => {
+ const expected = nodeTypes.function.buildNode('is', 'foo', 'bar baz', true);
+ const actual = fromKueryExpression('foo:"bar baz"');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support a shorthand for matching multiple values against a single field', () => {
+ const expected = nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', 'foo', 'bar'),
+ nodeTypes.function.buildNode('is', 'foo', 'baz'),
+ ]);
+ const actual = fromKueryExpression('foo:(bar or baz)');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support "and" and "not" operators and grouping in the shorthand as well', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', 'foo', 'bar'),
+ nodeTypes.function.buildNode('is', 'foo', 'baz'),
+ ]),
+ nodeTypes.function.buildNode('not', nodeTypes.function.buildNode('is', 'foo', 'qux')),
+ ]);
+ const actual = fromKueryExpression('foo:((bar or baz) and not qux)');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support exclusive range operators', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('range', 'bytes', {
+ gt: 1000,
+ }),
+ nodeTypes.function.buildNode('range', 'bytes', {
+ lt: 8000,
+ }),
+ ]);
+ const actual = fromKueryExpression('bytes > 1000 and bytes < 8000');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support inclusive range operators', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('range', 'bytes', {
+ gte: 1000,
+ }),
+ nodeTypes.function.buildNode('range', 'bytes', {
+ lte: 8000,
+ }),
+ ]);
+ const actual = fromKueryExpression('bytes >= 1000 and bytes <= 8000');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support wildcards in field names', () => {
+ const expected = nodeTypes.function.buildNode('is', 'machine*', 'osx');
+ const actual = fromKueryExpression('machine*:osx');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support wildcards in values', () => {
+ const expected = nodeTypes.function.buildNode('is', 'foo', 'ba*');
+ const actual = fromKueryExpression('foo:ba*');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should create an exists "is" query when a field is given and "*" is the value', () => {
+ const expected = nodeTypes.function.buildNode('is', 'foo', '*');
+ const actual = fromKueryExpression('foo:*');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support nested queries indicated by curly braces', () => {
+ const expected = nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedField',
+ nodeTypes.function.buildNode('is', 'childOfNested', 'foo')
+ );
+ const actual = fromKueryExpression('nestedField:{ childOfNested: foo }');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support nested subqueries and subqueries inside nested queries', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('is', 'response', '200'),
+ nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedField',
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode('is', 'childOfNested', 'foo'),
+ nodeTypes.function.buildNode('is', 'childOfNested', 'bar'),
+ ])
+ ),
+ ]);
+ const actual = fromKueryExpression(
+ 'response:200 and nestedField:{ childOfNested:foo or childOfNested:bar }'
+ );
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support nested sub-queries inside paren groups', () => {
+ const expected = nodeTypes.function.buildNode('and', [
+ nodeTypes.function.buildNode('is', 'response', '200'),
+ nodeTypes.function.buildNode('or', [
+ nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedField',
+ nodeTypes.function.buildNode('is', 'childOfNested', 'foo')
+ ),
+ nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedField',
+ nodeTypes.function.buildNode('is', 'childOfNested', 'bar')
+ ),
+ ]),
+ ]);
+ const actual = fromKueryExpression(
+ 'response:200 and ( nestedField:{ childOfNested:foo } or nestedField:{ childOfNested:bar } )'
+ );
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support nested groups inside other nested groups', () => {
+ const expected = nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedField',
+ nodeTypes.function.buildNode(
+ 'nested',
+ 'nestedChild',
+ nodeTypes.function.buildNode('is', 'doublyNestedChild', 'foo')
+ )
+ );
+ const actual = fromKueryExpression('nestedField:{ nestedChild:{ doublyNestedChild:foo } }');
+ expect(actual).toEqual(expected);
+ });
+ });
+
+ describe('fromLiteralExpression', () => {
+ test('should create literal nodes for unquoted values with correct primitive types', () => {
+ const stringLiteral = nodeTypes.literal.buildNode('foo');
+ const booleanFalseLiteral = nodeTypes.literal.buildNode(false);
+ const booleanTrueLiteral = nodeTypes.literal.buildNode(true);
+ const numberLiteral = nodeTypes.literal.buildNode(42);
+
+ expect(fromLiteralExpression('foo')).toEqual(stringLiteral);
+ expect(fromLiteralExpression('true')).toEqual(booleanTrueLiteral);
+ expect(fromLiteralExpression('false')).toEqual(booleanFalseLiteral);
+ expect(fromLiteralExpression('42')).toEqual(numberLiteral);
+ });
+
+ test('should allow escaping of special characters with a backslash', () => {
+ const expected = nodeTypes.literal.buildNode('\\():<>"*');
+ // yo dawg
+ const actual = fromLiteralExpression('\\\\\\(\\)\\:\\<\\>\\"\\*');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support double quoted strings that do not need escapes except for quotes', () => {
+ const expected = nodeTypes.literal.buildNode('\\():<>"*');
+ const actual = fromLiteralExpression('"\\():<>\\"*"');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should support escaped backslashes inside quoted strings', () => {
+ const expected = nodeTypes.literal.buildNode('\\');
+ const actual = fromLiteralExpression('"\\\\"');
+ expect(actual).toEqual(expected);
+ });
+
+ test('should detect wildcards and build wildcard AST nodes', () => {
+ const expected = nodeTypes.wildcard.buildNode('foo*bar');
+ const actual = fromLiteralExpression('foo*bar');
+ expect(actual).toEqual(expected);
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test("should return the given node type's ES query representation", () => {
+ const node = nodeTypes.function.buildNode('exists', 'response');
+ const expected = nodeTypes.function.toElasticsearchQuery(node, indexPattern);
+ const result = toElasticsearchQuery(node, indexPattern);
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an empty "and" function for undefined nodes and unknown node types', () => {
+ const expected = nodeTypes.function.toElasticsearchQuery(
+ nodeTypes.function.buildNode('and', []),
+ indexPattern
+ );
+
+ expect(toElasticsearchQuery((null as unknown) as KueryNode, undefined)).toEqual(expected);
+
+ const noTypeNode = nodeTypes.function.buildNode('exists', 'foo');
+ delete noTypeNode.type;
+ expect(toElasticsearchQuery(noTypeNode)).toEqual(expected);
+
+ const unknownTypeNode = nodeTypes.function.buildNode('exists', 'foo');
+
+ // @ts-ignore
+ unknownTypeNode.type = 'notValid';
+ expect(toElasticsearchQuery(unknownTypeNode)).toEqual(expected);
+ });
+
+ test("should return the given node type's ES query representation including a time zone parameter when one is provided", () => {
+ const config = { dateFormatTZ: 'America/Phoenix' };
+ const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
+ const expected = nodeTypes.function.toElasticsearchQuery(node, indexPattern, config);
+ const result = toElasticsearchQuery(node, indexPattern, config);
+ expect(result).toEqual(expected);
+ });
+ });
+
+ describe('doesKueryExpressionHaveLuceneSyntaxError', () => {
+ test('should return true for Lucene ranges', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: [1 TO 10]');
+ expect(result).toEqual(true);
+ });
+
+ test('should return false for KQL ranges', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar < 1');
+ expect(result).toEqual(false);
+ });
+
+ test('should return true for Lucene exists', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('_exists_: bar');
+ expect(result).toEqual(true);
+ });
+
+ test('should return false for KQL exists', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar:*');
+ expect(result).toEqual(false);
+ });
+
+ test('should return true for Lucene wildcards', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: ba?');
+ expect(result).toEqual(true);
+ });
+
+ test('should return false for KQL wildcards', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: ba*');
+ expect(result).toEqual(false);
+ });
+
+ test('should return true for Lucene regex', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: /ba.*/');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene fuzziness', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: ba~');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene proximity', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: "ba"~2');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene boosting', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('bar: ba^2');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene + operator', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('+foo: bar');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene - operators', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('-foo: bar');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene && operators', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('foo: bar && baz: qux');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for Lucene || operators', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('foo: bar || baz: qux');
+ expect(result).toEqual(true);
+ });
+
+ test('should return true for mixed KQL/Lucene queries', () => {
+ const result = doesKueryExpressionHaveLuceneSyntaxError('foo: bar and (baz: qux || bag)');
+ expect(result).toEqual(true);
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/ast/ast.js b/src/plugins/data/common/es_query/kuery/ast/ast.ts
similarity index 53%
rename from packages/kbn-es-query/src/kuery/ast/ast.js
rename to src/plugins/data/common/es_query/kuery/ast/ast.ts
index 1688995d46f80e..253f4326179725 100644
--- a/packages/kbn-es-query/src/kuery/ast/ast.js
+++ b/src/plugins/data/common/es_query/kuery/ast/ast.ts
@@ -17,21 +17,44 @@
* under the License.
*/
-import _ from 'lodash';
import { nodeTypes } from '../node_types/index';
-import { parse as parseKuery } from './kuery';
-import { KQLSyntaxError } from '../errors';
+import { KQLSyntaxError } from '../kuery_syntax_error';
+import { KueryNode, JsonObject, DslQuery, KueryParseOptions } from '../types';
+import { IIndexPattern } from '../../../index_patterns/types';
-export function fromLiteralExpression(expression, parseOptions) {
- parseOptions = {
- ...parseOptions,
- startRule: 'Literal',
- };
+// @ts-ignore
+import { parse as parseKuery } from './_generated_/kuery';
- return fromExpression(expression, parseOptions, parseKuery);
-}
+const fromExpression = (
+ expression: string | DslQuery,
+ parseOptions: Partial = {},
+ parse: Function = parseKuery
+): KueryNode => {
+ if (typeof expression === 'undefined') {
+ throw new Error('expression must be a string, got undefined instead');
+ }
+
+ return parse(expression, { ...parseOptions, helpers: { nodeTypes } });
+};
+
+export const fromLiteralExpression = (
+ expression: string | DslQuery,
+ parseOptions: Partial = {}
+): KueryNode => {
+ return fromExpression(
+ expression,
+ {
+ ...parseOptions,
+ startRule: 'Literal',
+ },
+ parseKuery
+ );
+};
-export function fromKueryExpression(expression, parseOptions) {
+export const fromKueryExpression = (
+ expression: string | DslQuery,
+ parseOptions: Partial = {}
+): KueryNode => {
try {
return fromExpression(expression, parseOptions, parseKuery);
} catch (error) {
@@ -41,20 +64,18 @@ export function fromKueryExpression(expression, parseOptions) {
throw error;
}
}
-}
+};
-function fromExpression(expression, parseOptions = {}, parse = parseKuery) {
- if (_.isUndefined(expression)) {
- throw new Error('expression must be a string, got undefined instead');
+export const doesKueryExpressionHaveLuceneSyntaxError = (
+ expression: string | DslQuery
+): boolean => {
+ try {
+ fromExpression(expression, { errorOnLuceneSyntax: true }, parseKuery);
+ return false;
+ } catch (e) {
+ return e.message.startsWith('Lucene');
}
-
- parseOptions = {
- ...parseOptions,
- helpers: { nodeTypes },
- };
-
- return parse(expression, parseOptions);
-}
+};
/**
* @params {String} indexPattern
@@ -63,19 +84,17 @@ function fromExpression(expression, parseOptions = {}, parse = parseKuery) {
* IndexPattern isn't required, but if you pass one in, we can be more intelligent
* about how we craft the queries (e.g. scripted fields)
*/
-export function toElasticsearchQuery(node, indexPattern, config = {}, context = {}) {
+export const toElasticsearchQuery = (
+ node: KueryNode,
+ indexPattern?: IIndexPattern,
+ config?: Record,
+ context?: Record
+): JsonObject => {
if (!node || !node.type || !nodeTypes[node.type]) {
- return toElasticsearchQuery(nodeTypes.function.buildNode('and', []));
+ return toElasticsearchQuery(nodeTypes.function.buildNode('and', []), indexPattern);
}
- return nodeTypes[node.type].toElasticsearchQuery(node, indexPattern, config, context);
-}
+ const nodeType = (nodeTypes[node.type] as unknown) as any;
-export function doesKueryExpressionHaveLuceneSyntaxError(expression) {
- try {
- fromExpression(expression, { errorOnLuceneSyntax: true }, parseKuery);
- return false;
- } catch (e) {
- return (e.message.startsWith('Lucene'));
- }
-}
+ return nodeType.toElasticsearchQuery(node, indexPattern, config, context);
+};
diff --git a/packages/kbn-es-query/src/kuery/ast/index.js b/src/plugins/data/common/es_query/kuery/ast/index.ts
similarity index 100%
rename from packages/kbn-es-query/src/kuery/ast/index.js
rename to src/plugins/data/common/es_query/kuery/ast/index.ts
diff --git a/packages/kbn-es-query/src/kuery/ast/kuery.peg b/src/plugins/data/common/es_query/kuery/ast/kuery.peg
similarity index 100%
rename from packages/kbn-es-query/src/kuery/ast/kuery.peg
rename to src/plugins/data/common/es_query/kuery/ast/kuery.peg
diff --git a/packages/kbn-es-query/src/kuery/functions/and.js b/src/plugins/data/common/es_query/kuery/functions/and.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/and.js
rename to src/plugins/data/common/es_query/kuery/functions/and.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/and.js b/src/plugins/data/common/es_query/kuery/functions/and.test.ts
similarity index 50%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/and.js
rename to src/plugins/data/common/es_query/kuery/functions/and.test.ts
index 07289a878e8c1e..133e691b27dbad 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/and.js
+++ b/src/plugins/data/common/es_query/kuery/functions/and.test.ts
@@ -17,43 +17,53 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as and from '../and';
-import { nodeTypes } from '../../node_types';
-import * as ast from '../../ast';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+import * as ast from '../ast';
-let indexPattern;
+// @ts-ignore
+import * as and from './and';
const childNode1 = nodeTypes.function.buildNode('is', 'machine.os', 'osx');
const childNode2 = nodeTypes.function.buildNode('is', 'extension', 'jpg');
-describe('kuery functions', function () {
- describe('and', function () {
+describe('kuery functions', () => {
+ describe('and', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('buildNodeParams', function () {
-
- it('arguments should contain the unmodified child nodes', function () {
+ describe('buildNodeParams', () => {
+ test('arguments should contain the unmodified child nodes', () => {
const result = and.buildNodeParams([childNode1, childNode2]);
- const { arguments: [ actualChildNode1, actualChildNode2 ] } = result;
- expect(actualChildNode1).to.be(childNode1);
- expect(actualChildNode2).to.be(childNode2);
+ const {
+ arguments: [actualChildNode1, actualChildNode2],
+ } = result;
+
+ expect(actualChildNode1).toBe(childNode1);
+ expect(actualChildNode2).toBe(childNode2);
});
});
- describe('toElasticsearchQuery', function () {
-
- it('should wrap subqueries in an ES bool query\'s filter clause', function () {
+ describe('toElasticsearchQuery', () => {
+ test("should wrap subqueries in an ES bool query's filter clause", () => {
const node = nodeTypes.function.buildNode('and', [childNode1, childNode2]);
const result = and.toElasticsearchQuery(node, indexPattern);
- expect(result).to.only.have.keys('bool');
- expect(result.bool).to.only.have.keys('filter');
- expect(result.bool.filter).to.eql(
- [childNode1, childNode2].map((childNode) => ast.toElasticsearchQuery(childNode, indexPattern))
+
+ expect(result).toHaveProperty('bool');
+ expect(Object.keys(result).length).toBe(1);
+ expect(result.bool).toHaveProperty('filter');
+ expect(Object.keys(result.bool).length).toBe(1);
+
+ expect(result.bool.filter).toEqual(
+ [childNode1, childNode2].map(childNode =>
+ ast.toElasticsearchQuery(childNode, indexPattern)
+ )
);
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/exists.js b/src/plugins/data/common/es_query/kuery/functions/exists.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/exists.js
rename to src/plugins/data/common/es_query/kuery/functions/exists.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/exists.js b/src/plugins/data/common/es_query/kuery/functions/exists.test.ts
similarity index 51%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/exists.js
rename to src/plugins/data/common/es_query/kuery/functions/exists.test.ts
index ee4cfab94e614d..8443436cf4cfb1 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/exists.js
+++ b/src/plugins/data/common/es_query/kuery/functions/exists.test.ts
@@ -17,67 +17,73 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as exists from '../exists';
-import { nodeTypes } from '../../node_types';
-import _ from 'lodash';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+// @ts-ignore
+import * as exists from './exists';
-let indexPattern;
-
-describe('kuery functions', function () {
- describe('exists', function () {
+describe('kuery functions', () => {
+ describe('exists', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('buildNodeParams', function () {
- it('should return a single "arguments" param', function () {
+ describe('buildNodeParams', () => {
+ test('should return a single "arguments" param', () => {
const result = exists.buildNodeParams('response');
- expect(result).to.only.have.key('arguments');
+
+ expect(result).toHaveProperty('arguments');
+ expect(Object.keys(result).length).toBe(1);
});
- it('arguments should contain the provided fieldName as a literal', function () {
- const { arguments: [ arg ] } = exists.buildNodeParams('response');
- expect(arg).to.have.property('type', 'literal');
- expect(arg).to.have.property('value', 'response');
+ test('arguments should contain the provided fieldName as a literal', () => {
+ const {
+ arguments: [arg],
+ } = exists.buildNodeParams('response');
+
+ expect(arg).toHaveProperty('type', 'literal');
+ expect(arg).toHaveProperty('value', 'response');
});
});
- describe('toElasticsearchQuery', function () {
- it('should return an ES exists query', function () {
+ describe('toElasticsearchQuery', () => {
+ test('should return an ES exists query', () => {
const expected = {
- exists: { field: 'response' }
+ exists: { field: 'response' },
};
-
const existsNode = nodeTypes.function.buildNode('exists', 'response');
const result = exists.toElasticsearchQuery(existsNode, indexPattern);
- expect(_.isEqual(expected, result)).to.be(true);
+
+ expect(expected).toEqual(result);
});
- it('should return an ES exists query without an index pattern', function () {
+ test('should return an ES exists query without an index pattern', () => {
const expected = {
- exists: { field: 'response' }
+ exists: { field: 'response' },
};
-
const existsNode = nodeTypes.function.buildNode('exists', 'response');
const result = exists.toElasticsearchQuery(existsNode);
- expect(_.isEqual(expected, result)).to.be(true);
+
+ expect(expected).toEqual(result);
});
- it('should throw an error for scripted fields', function () {
+ test('should throw an error for scripted fields', () => {
const existsNode = nodeTypes.function.buildNode('exists', 'script string');
- expect(exists.toElasticsearchQuery)
- .withArgs(existsNode, indexPattern).to.throwException(/Exists query does not support scripted fields/);
+ expect(() => exists.toElasticsearchQuery(existsNode, indexPattern)).toThrowError(
+ /Exists query does not support scripted fields/
+ );
});
- it('should use a provided nested context to create a full field name', function () {
+ test('should use a provided nested context to create a full field name', () => {
const expected = {
- exists: { field: 'nestedField.response' }
+ exists: { field: 'nestedField.response' },
};
-
const existsNode = nodeTypes.function.buildNode('exists', 'response');
const result = exists.toElasticsearchQuery(
existsNode,
@@ -85,7 +91,8 @@ describe('kuery functions', function () {
{},
{ nested: { path: 'nestedField' } }
);
- expect(_.isEqual(expected, result)).to.be(true);
+
+ expect(expected).toEqual(result);
});
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/geo_bounding_box.js b/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/geo_bounding_box.js
rename to src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.js
diff --git a/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.test.ts b/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.test.ts
new file mode 100644
index 00000000000000..cf287ff2c437ac
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/functions/geo_bounding_box.test.ts
@@ -0,0 +1,133 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { get } from 'lodash';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+
+// @ts-ignore
+import * as geoBoundingBox from './geo_bounding_box';
+
+const params = {
+ bottomRight: {
+ lat: 50.73,
+ lon: -135.35,
+ },
+ topLeft: {
+ lat: 73.12,
+ lon: -174.37,
+ },
+};
+
+describe('kuery functions', () => {
+ describe('geoBoundingBox', () => {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ describe('buildNodeParams', () => {
+ test('should return an "arguments" param', () => {
+ const result = geoBoundingBox.buildNodeParams('geo', params);
+
+ expect(result).toHaveProperty('arguments');
+ expect(Object.keys(result).length).toBe(1);
+ });
+
+ test('arguments should contain the provided fieldName as a literal', () => {
+ const result = geoBoundingBox.buildNodeParams('geo', params);
+ const {
+ arguments: [fieldName],
+ } = result;
+
+ expect(fieldName).toHaveProperty('type', 'literal');
+ expect(fieldName).toHaveProperty('value', 'geo');
+ });
+
+ test('arguments should contain the provided params as named arguments with "lat, lon" string values', () => {
+ const result = geoBoundingBox.buildNodeParams('geo', params);
+ const {
+ arguments: [, ...args],
+ } = result;
+
+ args.map((param: any) => {
+ expect(param).toHaveProperty('type', 'namedArg');
+ expect(['bottomRight', 'topLeft'].includes(param.name)).toBe(true);
+ expect(param.value.type).toBe('literal');
+
+ const { lat, lon } = get(params, param.name);
+
+ expect(param.value.value).toBe(`${lat}, ${lon}`);
+ });
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test('should return an ES geo_bounding_box query representing the given node', () => {
+ const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
+ const result = geoBoundingBox.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toHaveProperty('geo_bounding_box');
+ expect(result.geo_bounding_box.geo).toHaveProperty('top_left', '73.12, -174.37');
+ expect(result.geo_bounding_box.geo).toHaveProperty('bottom_right', '50.73, -135.35');
+ });
+
+ test('should return an ES geo_bounding_box query without an index pattern', () => {
+ const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
+ const result = geoBoundingBox.toElasticsearchQuery(node);
+
+ expect(result).toHaveProperty('geo_bounding_box');
+ expect(result.geo_bounding_box.geo).toHaveProperty('top_left', '73.12, -174.37');
+ expect(result.geo_bounding_box.geo).toHaveProperty('bottom_right', '50.73, -135.35');
+ });
+
+ test('should use the ignore_unmapped parameter', () => {
+ const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
+ const result = geoBoundingBox.toElasticsearchQuery(node, indexPattern);
+
+ expect(result.geo_bounding_box.ignore_unmapped).toBe(true);
+ });
+
+ test('should throw an error for scripted fields', () => {
+ const node = nodeTypes.function.buildNode('geoBoundingBox', 'script number', params);
+
+ expect(() => geoBoundingBox.toElasticsearchQuery(node, indexPattern)).toThrowError(
+ /Geo bounding box query does not support scripted fields/
+ );
+ });
+
+ test('should use a provided nested context to create a full field name', () => {
+ const node = nodeTypes.function.buildNode('geoBoundingBox', 'geo', params);
+ const result = geoBoundingBox.toElasticsearchQuery(
+ node,
+ indexPattern,
+ {},
+ { nested: { path: 'nestedField' } }
+ );
+
+ expect(result).toHaveProperty('geo_bounding_box');
+ expect(result.geo_bounding_box['nestedField.geo']).toBeDefined();
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/functions/geo_polygon.js b/src/plugins/data/common/es_query/kuery/functions/geo_polygon.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/geo_polygon.js
rename to src/plugins/data/common/es_query/kuery/functions/geo_polygon.js
diff --git a/src/plugins/data/common/es_query/kuery/functions/geo_polygon.test.ts b/src/plugins/data/common/es_query/kuery/functions/geo_polygon.test.ts
new file mode 100644
index 00000000000000..84500cb4ade7e6
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/functions/geo_polygon.test.ts
@@ -0,0 +1,143 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+
+// @ts-ignore
+import * as geoPolygon from './geo_polygon';
+
+const points = [
+ {
+ lat: 69.77,
+ lon: -171.56,
+ },
+ {
+ lat: 50.06,
+ lon: -169.1,
+ },
+ {
+ lat: 69.16,
+ lon: -125.85,
+ },
+];
+
+describe('kuery functions', () => {
+ describe('geoPolygon', () => {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ describe('buildNodeParams', () => {
+ test('should return an "arguments" param', () => {
+ const result = geoPolygon.buildNodeParams('geo', points);
+
+ expect(result).toHaveProperty('arguments');
+ expect(Object.keys(result).length).toBe(1);
+ });
+
+ test('arguments should contain the provided fieldName as a literal', () => {
+ const result = geoPolygon.buildNodeParams('geo', points);
+ const {
+ arguments: [fieldName],
+ } = result;
+
+ expect(fieldName).toHaveProperty('type', 'literal');
+ expect(fieldName).toHaveProperty('value', 'geo');
+ });
+
+ test('arguments should contain the provided points literal "lat, lon" string values', () => {
+ const result = geoPolygon.buildNodeParams('geo', points);
+ const {
+ arguments: [, ...args],
+ } = result;
+
+ args.forEach((param: any, index: number) => {
+ const expectedPoint = points[index];
+ const expectedLatLon = `${expectedPoint.lat}, ${expectedPoint.lon}`;
+
+ expect(param).toHaveProperty('type', 'literal');
+ expect(param.value).toBe(expectedLatLon);
+ });
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test('should return an ES geo_polygon query representing the given node', () => {
+ const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
+ const result = geoPolygon.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toHaveProperty('geo_polygon');
+ expect(result.geo_polygon.geo).toHaveProperty('points');
+
+ result.geo_polygon.geo.points.forEach((point: any, index: number) => {
+ const expectedLatLon = `${points[index].lat}, ${points[index].lon}`;
+
+ expect(point).toBe(expectedLatLon);
+ });
+ });
+
+ test('should return an ES geo_polygon query without an index pattern', () => {
+ const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
+ const result = geoPolygon.toElasticsearchQuery(node);
+
+ expect(result).toHaveProperty('geo_polygon');
+ expect(result.geo_polygon.geo).toHaveProperty('points');
+
+ result.geo_polygon.geo.points.forEach((point: any, index: number) => {
+ const expectedLatLon = `${points[index].lat}, ${points[index].lon}`;
+
+ expect(point).toBe(expectedLatLon);
+ });
+ });
+
+ test('should use the ignore_unmapped parameter', () => {
+ const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
+ const result = geoPolygon.toElasticsearchQuery(node, indexPattern);
+
+ expect(result.geo_polygon.ignore_unmapped).toBe(true);
+ });
+
+ test('should throw an error for scripted fields', () => {
+ const node = nodeTypes.function.buildNode('geoPolygon', 'script number', points);
+ expect(() => geoPolygon.toElasticsearchQuery(node, indexPattern)).toThrowError(
+ /Geo polygon query does not support scripted fields/
+ );
+ });
+
+ test('should use a provided nested context to create a full field name', () => {
+ const node = nodeTypes.function.buildNode('geoPolygon', 'geo', points);
+ const result = geoPolygon.toElasticsearchQuery(
+ node,
+ indexPattern,
+ {},
+ { nested: { path: 'nestedField' } }
+ );
+
+ expect(result).toHaveProperty('geo_polygon');
+ expect(result.geo_polygon['nestedField.geo']).toBeDefined();
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/functions/index.js b/src/plugins/data/common/es_query/kuery/functions/index.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/index.js
rename to src/plugins/data/common/es_query/kuery/functions/index.js
diff --git a/packages/kbn-es-query/src/kuery/functions/is.js b/src/plugins/data/common/es_query/kuery/functions/is.js
similarity index 95%
rename from packages/kbn-es-query/src/kuery/functions/is.js
rename to src/plugins/data/common/es_query/kuery/functions/is.js
index 63ade9e8793a7b..4f2f298c4707d1 100644
--- a/packages/kbn-es-query/src/kuery/functions/is.js
+++ b/src/plugins/data/common/es_query/kuery/functions/is.js
@@ -17,20 +17,22 @@
* under the License.
*/
-import _ from 'lodash';
-import * as ast from '../ast';
-import * as literal from '../node_types/literal';
-import * as wildcard from '../node_types/wildcard';
-import { getPhraseScript } from '../../utils/filters';
+import { get, isUndefined } from 'lodash';
+import { getPhraseScript } from '../../filters';
import { getFields } from './utils/get_fields';
import { getTimeZoneFromSettings } from '../../utils/get_time_zone_from_settings';
import { getFullFieldNameNode } from './utils/get_full_field_name_node';
+import * as ast from '../ast';
+
+import * as literal from '../node_types/literal';
+import * as wildcard from '../node_types/wildcard';
+
export function buildNodeParams(fieldName, value, isPhrase = false) {
- if (_.isUndefined(fieldName)) {
+ if (isUndefined(fieldName)) {
throw new Error('fieldName is a required argument');
}
- if (_.isUndefined(value)) {
+ if (isUndefined(value)) {
throw new Error('value is a required argument');
}
const fieldNode = typeof fieldName === 'string' ? ast.fromLiteralExpression(fieldName) : literal.buildNode(fieldName);
@@ -45,7 +47,7 @@ export function toElasticsearchQuery(node, indexPattern = null, config = {}, con
const { arguments: [fieldNameArg, valueArg, isPhraseArg] } = node;
const fullFieldNameArg = getFullFieldNameNode(fieldNameArg, indexPattern, context.nested ? context.nested.path : undefined);
const fieldName = ast.toElasticsearchQuery(fullFieldNameArg);
- const value = !_.isUndefined(valueArg) ? ast.toElasticsearchQuery(valueArg) : valueArg;
+ const value = !isUndefined(valueArg) ? ast.toElasticsearchQuery(valueArg) : valueArg;
const type = isPhraseArg.value ? 'phrase' : 'best_fields';
if (fullFieldNameArg.value === null) {
if (valueArg.type === 'wildcard') {
@@ -94,7 +96,7 @@ export function toElasticsearchQuery(node, indexPattern = null, config = {}, con
// users handle this themselves so we automatically add nested queries in this scenario.
if (
!(fullFieldNameArg.type === 'wildcard')
- || !_.get(field, 'subType.nested')
+ || !get(field, 'subType.nested')
|| context.nested
) {
return query;
diff --git a/src/plugins/data/common/es_query/kuery/functions/is.test.ts b/src/plugins/data/common/es_query/kuery/functions/is.test.ts
new file mode 100644
index 00000000000000..df147bad54a34b
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/functions/is.test.ts
@@ -0,0 +1,305 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+
+// @ts-ignore
+import * as is from './is';
+import { IIndexPattern } from '../../../index_patterns';
+
+describe('kuery functions', () => {
+ describe('is', () => {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ describe('buildNodeParams', () => {
+ test('fieldName and value should be required arguments', () => {
+ expect(() => is.buildNodeParams()).toThrowError(/fieldName is a required argument/);
+ expect(() => is.buildNodeParams('foo')).toThrowError(/value is a required argument/);
+ });
+
+ test('arguments should contain the provided fieldName and value as literals', () => {
+ const {
+ arguments: [fieldName, value],
+ } = is.buildNodeParams('response', 200);
+
+ expect(fieldName).toHaveProperty('type', 'literal');
+ expect(fieldName).toHaveProperty('value', 'response');
+ expect(value).toHaveProperty('type', 'literal');
+ expect(value).toHaveProperty('value', 200);
+ });
+
+ test('should detect wildcards in the provided arguments', () => {
+ const {
+ arguments: [fieldName, value],
+ } = is.buildNodeParams('machine*', 'win*');
+
+ expect(fieldName).toHaveProperty('type', 'wildcard');
+ expect(value).toHaveProperty('type', 'wildcard');
+ });
+
+ test('should default to a non-phrase query', () => {
+ const {
+ arguments: [, , isPhrase],
+ } = is.buildNodeParams('response', 200);
+ expect(isPhrase.value).toBe(false);
+ });
+
+ test('should allow specification of a phrase query', () => {
+ const {
+ arguments: [, , isPhrase],
+ } = is.buildNodeParams('response', 200, true);
+ expect(isPhrase.value).toBe(true);
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test('should return an ES match_all query when fieldName and value are both "*"', () => {
+ const expected = {
+ match_all: {},
+ };
+ const node = nodeTypes.function.buildNode('is', '*', '*');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an ES multi_match query using default_field when fieldName is null', () => {
+ const expected = {
+ multi_match: {
+ query: 200,
+ type: 'best_fields',
+ lenient: true,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', null, 200);
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an ES query_string query using default_field when fieldName is null and value contains a wildcard', () => {
+ const expected = {
+ query_string: {
+ query: 'jpg*',
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', null, 'jpg*');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an ES bool query with a sub-query for each field when fieldName is "*"', () => {
+ const node = nodeTypes.function.buildNode('is', '*', 200);
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toHaveProperty('bool');
+ expect(result.bool.should.length).toBe(indexPattern.fields.length);
+ });
+
+ test('should return an ES exists query when value is "*"', () => {
+ const expected = {
+ bool: {
+ should: [{ exists: { field: 'extension' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', '*');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an ES match query when a concrete fieldName and value are provided', () => {
+ const expected = {
+ bool: {
+ should: [{ match: { extension: 'jpg' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should return an ES match query when a concrete fieldName and value are provided without an index pattern', () => {
+ const expected = {
+ bool: {
+ should: [{ match: { extension: 'jpg' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
+ const result = is.toElasticsearchQuery(node);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should support creation of phrase queries', () => {
+ const expected = {
+ bool: {
+ should: [{ match_phrase: { extension: 'jpg' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', 'jpg', true);
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should create a query_string query for wildcard values', () => {
+ const expected = {
+ bool: {
+ should: [
+ {
+ query_string: {
+ fields: ['extension'],
+ query: 'jpg*',
+ },
+ },
+ ],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', 'jpg*');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should support scripted fields', () => {
+ const node = nodeTypes.function.buildNode('is', 'script string', 'foo');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result.bool.should[0]).toHaveProperty('script');
+ });
+
+ test('should support date fields without a dateFormat provided', () => {
+ const expected = {
+ bool: {
+ should: [
+ {
+ range: {
+ '@timestamp': {
+ gte: '2018-04-03T19:04:17',
+ lte: '2018-04-03T19:04:17',
+ },
+ },
+ },
+ ],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should support date fields with a dateFormat provided', () => {
+ const config = { dateFormatTZ: 'America/Phoenix' };
+ const expected = {
+ bool: {
+ should: [
+ {
+ range: {
+ '@timestamp': {
+ gte: '2018-04-03T19:04:17',
+ lte: '2018-04-03T19:04:17',
+ time_zone: 'America/Phoenix',
+ },
+ },
+ },
+ ],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', '@timestamp', '"2018-04-03T19:04:17"');
+ const result = is.toElasticsearchQuery(node, indexPattern, config);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should use a provided nested context to create a full field name', () => {
+ const expected = {
+ bool: {
+ should: [{ match: { 'nestedField.extension': 'jpg' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'extension', 'jpg');
+ const result = is.toElasticsearchQuery(
+ node,
+ indexPattern,
+ {},
+ { nested: { path: 'nestedField' } }
+ );
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should support wildcard field names', () => {
+ const expected = {
+ bool: {
+ should: [{ match: { extension: 'jpg' } }],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', 'ext*', 'jpg');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+
+ test('should automatically add a nested query when a wildcard field name covers a nested field', () => {
+ const expected = {
+ bool: {
+ should: [
+ {
+ nested: {
+ path: 'nestedField.nestedChild',
+ query: {
+ match: {
+ 'nestedField.nestedChild.doublyNestedChild': 'foo',
+ },
+ },
+ score_mode: 'none',
+ },
+ },
+ ],
+ minimum_should_match: 1,
+ },
+ };
+ const node = nodeTypes.function.buildNode('is', '*doublyNested*', 'foo');
+ const result = is.toElasticsearchQuery(node, indexPattern);
+
+ expect(result).toEqual(expected);
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/functions/nested.js b/src/plugins/data/common/es_query/kuery/functions/nested.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/nested.js
rename to src/plugins/data/common/es_query/kuery/functions/nested.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/nested.js b/src/plugins/data/common/es_query/kuery/functions/nested.test.ts
similarity index 54%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/nested.js
rename to src/plugins/data/common/es_query/kuery/functions/nested.test.ts
index 5ba73e485ddf1d..945a36d304a057 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/nested.js
+++ b/src/plugins/data/common/es_query/kuery/functions/nested.test.ts
@@ -17,52 +17,60 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as nested from '../nested';
-import { nodeTypes } from '../../node_types';
-import * as ast from '../../ast';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
-let indexPattern;
+import * as ast from '../ast';
+
+// @ts-ignore
+import * as nested from './nested';
const childNode = nodeTypes.function.buildNode('is', 'child', 'foo');
-describe('kuery functions', function () {
- describe('nested', function () {
+describe('kuery functions', () => {
+ describe('nested', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('buildNodeParams', function () {
-
- it('arguments should contain the unmodified child nodes', function () {
+ describe('buildNodeParams', () => {
+ test('arguments should contain the unmodified child nodes', () => {
const result = nested.buildNodeParams('nestedField', childNode);
- const { arguments: [ resultPath, resultChildNode ] } = result;
- expect(ast.toElasticsearchQuery(resultPath)).to.be('nestedField');
- expect(resultChildNode).to.be(childNode);
+ const {
+ arguments: [resultPath, resultChildNode],
+ } = result;
+
+ expect(ast.toElasticsearchQuery(resultPath)).toBe('nestedField');
+ expect(resultChildNode).toBe(childNode);
});
});
- describe('toElasticsearchQuery', function () {
-
- it('should wrap subqueries in an ES nested query', function () {
+ describe('toElasticsearchQuery', () => {
+ test('should wrap subqueries in an ES nested query', () => {
const node = nodeTypes.function.buildNode('nested', 'nestedField', childNode);
const result = nested.toElasticsearchQuery(node, indexPattern);
- expect(result).to.only.have.keys('nested');
- expect(result.nested.path).to.be('nestedField');
- expect(result.nested.score_mode).to.be('none');
+
+ expect(result).toHaveProperty('nested');
+ expect(Object.keys(result).length).toBe(1);
+
+ expect(result.nested.path).toBe('nestedField');
+ expect(result.nested.score_mode).toBe('none');
});
- it('should pass the nested path to subqueries so the full field name can be used', function () {
+ test('should pass the nested path to subqueries so the full field name can be used', () => {
const node = nodeTypes.function.buildNode('nested', 'nestedField', childNode);
const result = nested.toElasticsearchQuery(node, indexPattern);
const expectedSubQuery = ast.toElasticsearchQuery(
nodeTypes.function.buildNode('is', 'nestedField.child', 'foo')
);
- expect(result.nested.query).to.eql(expectedSubQuery);
- });
+ expect(result.nested.query).toEqual(expectedSubQuery);
+ });
});
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/not.js b/src/plugins/data/common/es_query/kuery/functions/not.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/not.js
rename to src/plugins/data/common/es_query/kuery/functions/not.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/not.js b/src/plugins/data/common/es_query/kuery/functions/not.test.ts
similarity index 50%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/not.js
rename to src/plugins/data/common/es_query/kuery/functions/not.test.ts
index 7a2d7fa39c1528..01c1976b939ea0 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/not.js
+++ b/src/plugins/data/common/es_query/kuery/functions/not.test.ts
@@ -17,44 +17,50 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as not from '../not';
-import { nodeTypes } from '../../node_types';
-import * as ast from '../../ast';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
-let indexPattern;
+import * as ast from '../ast';
-const childNode = nodeTypes.function.buildNode('is', 'extension', 'jpg');
+// @ts-ignore
+import * as not from './not';
-describe('kuery functions', function () {
+const childNode = nodeTypes.function.buildNode('is', 'extension', 'jpg');
- describe('not', function () {
+describe('kuery functions', () => {
+ describe('not', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('buildNodeParams', function () {
+ describe('buildNodeParams', () => {
+ test('arguments should contain the unmodified child node', () => {
+ const {
+ arguments: [actualChild],
+ } = not.buildNodeParams(childNode);
- it('arguments should contain the unmodified child node', function () {
- const { arguments: [ actualChild ] } = not.buildNodeParams(childNode);
- expect(actualChild).to.be(childNode);
+ expect(actualChild).toBe(childNode);
});
-
-
});
- describe('toElasticsearchQuery', function () {
-
- it('should wrap a subquery in an ES bool query\'s must_not clause', function () {
+ describe('toElasticsearchQuery', () => {
+ test("should wrap a subquery in an ES bool query's must_not clause", () => {
const node = nodeTypes.function.buildNode('not', childNode);
const result = not.toElasticsearchQuery(node, indexPattern);
- expect(result).to.only.have.keys('bool');
- expect(result.bool).to.only.have.keys('must_not');
- expect(result.bool.must_not).to.eql(ast.toElasticsearchQuery(childNode, indexPattern));
- });
+ expect(result).toHaveProperty('bool');
+ expect(Object.keys(result).length).toBe(1);
+
+ expect(result.bool).toHaveProperty('must_not');
+ expect(Object.keys(result.bool).length).toBe(1);
+
+ expect(result.bool.must_not).toEqual(ast.toElasticsearchQuery(childNode, indexPattern));
+ });
});
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/or.js b/src/plugins/data/common/es_query/kuery/functions/or.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/or.js
rename to src/plugins/data/common/es_query/kuery/functions/or.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/or.js b/src/plugins/data/common/es_query/kuery/functions/or.test.ts
similarity index 52%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/or.js
rename to src/plugins/data/common/es_query/kuery/functions/or.test.ts
index f24f24b98e7fbd..a6590546e5fc5c 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/or.js
+++ b/src/plugins/data/common/es_query/kuery/functions/or.test.ts
@@ -17,56 +17,61 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as or from '../or';
-import { nodeTypes } from '../../node_types';
-import * as ast from '../../ast';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
-let indexPattern;
+import * as ast from '../ast';
+
+// @ts-ignore
+import * as or from './or';
const childNode1 = nodeTypes.function.buildNode('is', 'machine.os', 'osx');
const childNode2 = nodeTypes.function.buildNode('is', 'extension', 'jpg');
-describe('kuery functions', function () {
-
- describe('or', function () {
+describe('kuery functions', () => {
+ describe('or', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
-
- describe('buildNodeParams', function () {
-
- it('arguments should contain the unmodified child nodes', function () {
+ describe('buildNodeParams', () => {
+ test('arguments should contain the unmodified child nodes', () => {
const result = or.buildNodeParams([childNode1, childNode2]);
- const { arguments: [ actualChildNode1, actualChildNode2 ] } = result;
- expect(actualChildNode1).to.be(childNode1);
- expect(actualChildNode2).to.be(childNode2);
- });
+ const {
+ arguments: [actualChildNode1, actualChildNode2],
+ } = result;
+ expect(actualChildNode1).toBe(childNode1);
+ expect(actualChildNode2).toBe(childNode2);
+ });
});
- describe('toElasticsearchQuery', function () {
-
- it('should wrap subqueries in an ES bool query\'s should clause', function () {
+ describe('toElasticsearchQuery', () => {
+ test("should wrap subqueries in an ES bool query's should clause", () => {
const node = nodeTypes.function.buildNode('or', [childNode1, childNode2]);
const result = or.toElasticsearchQuery(node, indexPattern);
- expect(result).to.only.have.keys('bool');
- expect(result.bool).to.have.keys('should');
- expect(result.bool.should).to.eql(
- [childNode1, childNode2].map((childNode) => ast.toElasticsearchQuery(childNode, indexPattern))
+
+ expect(result).toHaveProperty('bool');
+ expect(Object.keys(result).length).toBe(1);
+ expect(result.bool).toHaveProperty('should');
+ expect(result.bool.should).toEqual(
+ [childNode1, childNode2].map(childNode =>
+ ast.toElasticsearchQuery(childNode, indexPattern)
+ )
);
});
- it('should require one of the clauses to match', function () {
+ test('should require one of the clauses to match', () => {
const node = nodeTypes.function.buildNode('or', [childNode1, childNode2]);
const result = or.toElasticsearchQuery(node, indexPattern);
- expect(result.bool).to.have.property('minimum_should_match', 1);
- });
+ expect(result.bool).toHaveProperty('minimum_should_match', 1);
+ });
});
-
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/range.js b/src/plugins/data/common/es_query/kuery/functions/range.js
similarity index 98%
rename from packages/kbn-es-query/src/kuery/functions/range.js
rename to src/plugins/data/common/es_query/kuery/functions/range.js
index f7719998ad5240..80181cfc003f1c 100644
--- a/packages/kbn-es-query/src/kuery/functions/range.js
+++ b/src/plugins/data/common/es_query/kuery/functions/range.js
@@ -20,7 +20,7 @@
import _ from 'lodash';
import { nodeTypes } from '../node_types';
import * as ast from '../ast';
-import { getRangeScript } from '../../utils/filters';
+import { getRangeScript } from '../../filters';
import { getFields } from './utils/get_fields';
import { getTimeZoneFromSettings } from '../../utils/get_time_zone_from_settings';
import { getFullFieldNameNode } from './utils/get_full_field_name_node';
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/range.js b/src/plugins/data/common/es_query/kuery/functions/range.test.ts
similarity index 54%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/range.js
rename to src/plugins/data/common/es_query/kuery/functions/range.test.ts
index 2361e8bb667691..ed8e40830df021 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/range.js
+++ b/src/plugins/data/common/es_query/kuery/functions/range.test.ts
@@ -17,53 +17,57 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as range from '../range';
-import { nodeTypes } from '../../node_types';
-import indexPatternResponse from '../../../__fixtures__/index_pattern_response.json';
+import { get } from 'lodash';
+import { nodeTypes } from '../node_types';
+import { fields } from '../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../index_patterns';
+import { RangeFilterParams } from '../../filters';
-let indexPattern;
-
-describe('kuery functions', function () {
-
- describe('range', function () {
+// @ts-ignore
+import * as range from './range';
+describe('kuery functions', () => {
+ describe('range', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('buildNodeParams', function () {
-
- it('arguments should contain the provided fieldName as a literal', function () {
+ describe('buildNodeParams', () => {
+ test('arguments should contain the provided fieldName as a literal', () => {
const result = range.buildNodeParams('bytes', { gt: 1000, lt: 8000 });
- const { arguments: [fieldName] } = result;
+ const {
+ arguments: [fieldName],
+ } = result;
- expect(fieldName).to.have.property('type', 'literal');
- expect(fieldName).to.have.property('value', 'bytes');
+ expect(fieldName).toHaveProperty('type', 'literal');
+ expect(fieldName).toHaveProperty('value', 'bytes');
});
- it('arguments should contain the provided params as named arguments', function () {
- const givenParams = { gt: 1000, lt: 8000, format: 'epoch_millis' };
+ test('arguments should contain the provided params as named arguments', () => {
+ const givenParams: RangeFilterParams = { gt: 1000, lt: 8000, format: 'epoch_millis' };
const result = range.buildNodeParams('bytes', givenParams);
- const { arguments: [, ...params] } = result;
+ const {
+ arguments: [, ...params],
+ } = result;
- expect(params).to.be.an('array');
- expect(params).to.not.be.empty();
+ expect(Array.isArray(params)).toBeTruthy();
+ expect(params.length).toBeGreaterThan(1);
- params.map((param) => {
- expect(param).to.have.property('type', 'namedArg');
- expect(['gt', 'lt', 'format'].includes(param.name)).to.be(true);
- expect(param.value.type).to.be('literal');
- expect(param.value.value).to.be(givenParams[param.name]);
+ params.map((param: any) => {
+ expect(param).toHaveProperty('type', 'namedArg');
+ expect(['gt', 'lt', 'format'].includes(param.name)).toBe(true);
+ expect(param.value.type).toBe('literal');
+ expect(param.value.value).toBe(get(givenParams, param.name));
});
});
-
});
- describe('toElasticsearchQuery', function () {
-
- it('should return an ES range query for the node\'s field and params', function () {
+ describe('toElasticsearchQuery', () => {
+ test("should return an ES range query for the node's field and params", () => {
const expected = {
bool: {
should: [
@@ -71,21 +75,21 @@ describe('kuery functions', function () {
range: {
bytes: {
gt: 1000,
- lt: 8000
- }
- }
- }
+ lt: 8000,
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
-
const node = nodeTypes.function.buildNode('range', 'bytes', { gt: 1000, lt: 8000 });
const result = range.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should return an ES range query without an index pattern', function () {
+ test('should return an ES range query without an index pattern', () => {
const expected = {
bool: {
should: [
@@ -93,21 +97,22 @@ describe('kuery functions', function () {
range: {
bytes: {
gt: 1000,
- lt: 8000
- }
- }
- }
+ lt: 8000,
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
const node = nodeTypes.function.buildNode('range', 'bytes', { gt: 1000, lt: 8000 });
const result = range.toElasticsearchQuery(node);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should support wildcard field names', function () {
+ test('should support wildcard field names', () => {
const expected = {
bool: {
should: [
@@ -115,27 +120,29 @@ describe('kuery functions', function () {
range: {
bytes: {
gt: 1000,
- lt: 8000
- }
- }
- }
+ lt: 8000,
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
const node = nodeTypes.function.buildNode('range', 'byt*', { gt: 1000, lt: 8000 });
const result = range.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should support scripted fields', function () {
+ test('should support scripted fields', () => {
const node = nodeTypes.function.buildNode('range', 'script number', { gt: 1000, lt: 8000 });
const result = range.toElasticsearchQuery(node, indexPattern);
- expect(result.bool.should[0]).to.have.key('script');
+
+ expect(result.bool.should[0]).toHaveProperty('script');
});
- it('should support date fields without a dateFormat provided', function () {
+ test('should support date fields without a dateFormat provided', () => {
const expected = {
bool: {
should: [
@@ -144,20 +151,23 @@ describe('kuery functions', function () {
'@timestamp': {
gt: '2018-01-03T19:04:17',
lt: '2018-04-03T19:04:17',
- }
- }
- }
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
-
- const node = nodeTypes.function.buildNode('range', '@timestamp', { gt: '2018-01-03T19:04:17', lt: '2018-04-03T19:04:17' });
+ const node = nodeTypes.function.buildNode('range', '@timestamp', {
+ gt: '2018-01-03T19:04:17',
+ lt: '2018-04-03T19:04:17',
+ });
const result = range.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should support date fields with a dateFormat provided', function () {
+ test('should support date fields with a dateFormat provided', () => {
const config = { dateFormatTZ: 'America/Phoenix' };
const expected = {
bool: {
@@ -168,20 +178,23 @@ describe('kuery functions', function () {
gt: '2018-01-03T19:04:17',
lt: '2018-04-03T19:04:17',
time_zone: 'America/Phoenix',
- }
- }
- }
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
-
- const node = nodeTypes.function.buildNode('range', '@timestamp', { gt: '2018-01-03T19:04:17', lt: '2018-04-03T19:04:17' });
+ const node = nodeTypes.function.buildNode('range', '@timestamp', {
+ gt: '2018-01-03T19:04:17',
+ lt: '2018-04-03T19:04:17',
+ });
const result = range.toElasticsearchQuery(node, indexPattern, config);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should use a provided nested context to create a full field name', function () {
+ test('should use a provided nested context to create a full field name', () => {
const expected = {
bool: {
should: [
@@ -189,15 +202,14 @@ describe('kuery functions', function () {
range: {
'nestedField.bytes': {
gt: 1000,
- lt: 8000
- }
- }
- }
+ lt: 8000,
+ },
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
-
const node = nodeTypes.function.buildNode('range', 'bytes', { gt: 1000, lt: 8000 });
const result = range.toElasticsearchQuery(
node,
@@ -205,10 +217,11 @@ describe('kuery functions', function () {
{},
{ nested: { path: 'nestedField' } }
);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
- it('should automatically add a nested query when a wildcard field name covers a nested field', function () {
+ test('should automatically add a nested query when a wildcard field name covers a nested field', () => {
const expected = {
bool: {
should: [
@@ -219,21 +232,24 @@ describe('kuery functions', function () {
range: {
'nestedField.nestedChild.doublyNestedChild': {
gt: 1000,
- lt: 8000
- }
- }
+ lt: 8000,
+ },
+ },
},
- score_mode: 'none'
- }
- }
+ score_mode: 'none',
+ },
+ },
],
- minimum_should_match: 1
- }
+ minimum_should_match: 1,
+ },
};
-
- const node = nodeTypes.function.buildNode('range', '*doublyNested*', { gt: 1000, lt: 8000 });
+ const node = nodeTypes.function.buildNode('range', '*doublyNested*', {
+ gt: 1000,
+ lt: 8000,
+ });
const result = range.toElasticsearchQuery(node, indexPattern);
- expect(result).to.eql(expected);
+
+ expect(result).toEqual(expected);
});
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/utils/get_fields.js b/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/utils/get_fields.js
rename to src/plugins/data/common/es_query/kuery/functions/utils/get_fields.js
diff --git a/packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_fields.js b/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts
similarity index 52%
rename from packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_fields.js
rename to src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts
index 7718479130a8af..d48f0943082c92 100644
--- a/packages/kbn-es-query/src/kuery/functions/__tests__/utils/get_fields.js
+++ b/src/plugins/data/common/es_query/kuery/functions/utils/get_fields.test.ts
@@ -17,39 +17,41 @@
* under the License.
*/
-import { getFields } from '../../utils/get_fields';
-import expect from '@kbn/expect';
-import indexPatternResponse from '../../../../__fixtures__/index_pattern_response.json';
+import { fields } from '../../../../index_patterns/mocks';
-import { nodeTypes } from '../../..';
+import { nodeTypes } from '../../index';
+import { IIndexPattern, IFieldType } from '../../../../index_patterns';
-let indexPattern;
-
-describe('getFields', function () {
+// @ts-ignore
+import { getFields } from './get_fields';
+describe('getFields', () => {
+ let indexPattern: IIndexPattern;
beforeEach(() => {
- indexPattern = indexPatternResponse;
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
});
- describe('field names without a wildcard', function () {
-
- it('should return an empty array if the field does not exist in the index pattern', function () {
+ describe('field names without a wildcard', () => {
+ test('should return an empty array if the field does not exist in the index pattern', () => {
const fieldNameNode = nodeTypes.literal.buildNode('nonExistentField');
- const expected = [];
const actual = getFields(fieldNameNode, indexPattern);
- expect(actual).to.eql(expected);
+
+ expect(actual).toEqual([]);
});
- it('should return the single matching field in an array', function () {
+ test('should return the single matching field in an array', () => {
const fieldNameNode = nodeTypes.literal.buildNode('extension');
const results = getFields(fieldNameNode, indexPattern);
- expect(results).to.be.an('array');
- expect(results).to.have.length(1);
- expect(results[0].name).to.be('extension');
+
+ expect(results).toHaveLength(1);
+ expect(Array.isArray(results)).toBeTruthy();
+ expect(results[0].name).toBe('extension');
});
- it('should not match a wildcard in a literal node', function () {
+ test('should not match a wildcard in a literal node', () => {
const indexPatternWithWildField = {
title: 'wildIndex',
fields: [
@@ -61,37 +63,32 @@ describe('getFields', function () {
const fieldNameNode = nodeTypes.literal.buildNode('foo*');
const results = getFields(fieldNameNode, indexPatternWithWildField);
- expect(results).to.be.an('array');
- expect(results).to.have.length(1);
- expect(results[0].name).to.be('foo*');
- // ensure the wildcard is not actually being parsed
- const expected = [];
+ expect(results).toHaveLength(1);
+ expect(Array.isArray(results)).toBeTruthy();
+ expect(results[0].name).toBe('foo*');
+
const actual = getFields(nodeTypes.literal.buildNode('fo*'), indexPatternWithWildField);
- expect(actual).to.eql(expected);
+ expect(actual).toEqual([]);
});
});
- describe('field name patterns with a wildcard', function () {
-
- it('should return an empty array if it does not match any fields in the index pattern', function () {
+ describe('field name patterns with a wildcard', () => {
+ test('should return an empty array if test does not match any fields in the index pattern', () => {
const fieldNameNode = nodeTypes.wildcard.buildNode('nonExistent*');
- const expected = [];
const actual = getFields(fieldNameNode, indexPattern);
- expect(actual).to.eql(expected);
+
+ expect(actual).toEqual([]);
});
- it('should return all fields that match the pattern in an array', function () {
+ test('should return all fields that match the pattern in an array', () => {
const fieldNameNode = nodeTypes.wildcard.buildNode('machine*');
const results = getFields(fieldNameNode, indexPattern);
- expect(results).to.be.an('array');
- expect(results).to.have.length(2);
- expect(results.find((field) => {
- return field.name === 'machine.os';
- })).to.be.ok();
- expect(results.find((field) => {
- return field.name === 'machine.os.raw';
- })).to.be.ok();
+
+ expect(Array.isArray(results)).toBeTruthy();
+ expect(results).toHaveLength(2);
+ expect(results.find((field: IFieldType) => field.name === 'machine.os')).toBeDefined();
+ expect(results.find((field: IFieldType) => field.name === 'machine.os.raw')).toBeDefined();
});
});
});
diff --git a/packages/kbn-es-query/src/kuery/functions/utils/get_full_field_name_node.js b/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/functions/utils/get_full_field_name_node.js
rename to src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.js
diff --git a/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.test.ts b/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.test.ts
new file mode 100644
index 00000000000000..e138e22b76ad30
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/functions/utils/get_full_field_name_node.test.ts
@@ -0,0 +1,87 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { nodeTypes } from '../../node_types';
+import { fields } from '../../../../index_patterns/mocks';
+import { IIndexPattern } from '../../../../index_patterns';
+
+// @ts-ignore
+import { getFullFieldNameNode } from './get_full_field_name_node';
+
+describe('getFullFieldNameNode', function() {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ test('should return unchanged name node if no nested path is passed in', () => {
+ const nameNode = nodeTypes.literal.buildNode('notNested');
+ const result = getFullFieldNameNode(nameNode, indexPattern);
+
+ expect(result).toEqual(nameNode);
+ });
+
+ test('should add the nested path if test is valid according to the index pattern', () => {
+ const nameNode = nodeTypes.literal.buildNode('child');
+ const result = getFullFieldNameNode(nameNode, indexPattern, 'nestedField');
+
+ expect(result).toEqual(nodeTypes.literal.buildNode('nestedField.child'));
+ });
+
+ test('should throw an error if a path is provided for a non-nested field', () => {
+ const nameNode = nodeTypes.literal.buildNode('os');
+ expect(() => getFullFieldNameNode(nameNode, indexPattern, 'machine')).toThrowError(
+ /machine.os is not a nested field but is in nested group "machine" in the KQL expression/
+ );
+ });
+
+ test('should throw an error if a nested field is not passed with a path', () => {
+ const nameNode = nodeTypes.literal.buildNode('nestedField.child');
+
+ expect(() => getFullFieldNameNode(nameNode, indexPattern)).toThrowError(
+ /nestedField.child is a nested field, but is not in a nested group in the KQL expression./
+ );
+ });
+
+ test('should throw an error if a nested field is passed with the wrong path', () => {
+ const nameNode = nodeTypes.literal.buildNode('nestedChild.doublyNestedChild');
+
+ expect(() => getFullFieldNameNode(nameNode, indexPattern, 'nestedField')).toThrowError(
+ /Nested field nestedField.nestedChild.doublyNestedChild is being queried with the incorrect nested path. The correct path is nestedField.nestedChild/
+ );
+ });
+
+ test('should skip error checking for wildcard names', () => {
+ const nameNode = nodeTypes.wildcard.buildNode('nested*');
+ const result = getFullFieldNameNode(nameNode, indexPattern);
+
+ expect(result).toEqual(nameNode);
+ });
+
+ test('should skip error checking if no index pattern is passed in', () => {
+ const nameNode = nodeTypes.literal.buildNode('os');
+ expect(() => getFullFieldNameNode(nameNode, null, 'machine')).not.toThrowError();
+
+ const result = getFullFieldNameNode(nameNode, null, 'machine');
+ expect(result).toEqual(nodeTypes.literal.buildNode('machine.os'));
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/index.js b/src/plugins/data/common/es_query/kuery/index.ts
similarity index 91%
rename from packages/kbn-es-query/src/kuery/index.js
rename to src/plugins/data/common/es_query/kuery/index.ts
index e0cacada7f274e..4184dea62ef2c4 100644
--- a/packages/kbn-es-query/src/kuery/index.js
+++ b/src/plugins/data/common/es_query/kuery/index.ts
@@ -17,6 +17,8 @@
* under the License.
*/
-export * from './ast';
+export { KQLSyntaxError } from './kuery_syntax_error';
export { nodeTypes } from './node_types';
-export * from './errors';
+export * from './ast';
+
+export * from './types';
diff --git a/packages/kbn-es-query/src/kuery/errors/index.test.js b/src/plugins/data/common/es_query/kuery/kuery_syntax_error.test.ts
similarity index 66%
rename from packages/kbn-es-query/src/kuery/errors/index.test.js
rename to src/plugins/data/common/es_query/kuery/kuery_syntax_error.test.ts
index d8040e464b696b..cfe2f86e813cad 100644
--- a/packages/kbn-es-query/src/kuery/errors/index.test.js
+++ b/src/plugins/data/common/es_query/kuery/kuery_syntax_error.test.ts
@@ -17,89 +17,92 @@
* under the License.
*/
-import { fromKueryExpression } from '../ast';
-
+import { fromKueryExpression } from './ast';
describe('kql syntax errors', () => {
-
it('should throw an error for a field query missing a value', () => {
expect(() => {
fromKueryExpression('response:');
- }).toThrow('Expected "(", "{", value, whitespace but end of input found.\n' +
- 'response:\n' +
- '---------^');
+ }).toThrow(
+ 'Expected "(", "{", value, whitespace but end of input found.\n' +
+ 'response:\n' +
+ '---------^'
+ );
});
it('should throw an error for an OR query missing a right side sub-query', () => {
expect(() => {
fromKueryExpression('response:200 or ');
- }).toThrow('Expected "(", NOT, field name, value but end of input found.\n' +
- 'response:200 or \n' +
- '----------------^');
+ }).toThrow(
+ 'Expected "(", NOT, field name, value but end of input found.\n' +
+ 'response:200 or \n' +
+ '----------------^'
+ );
});
it('should throw an error for an OR list of values missing a right side sub-query', () => {
expect(() => {
fromKueryExpression('response:(200 or )');
- }).toThrow('Expected "(", NOT, value but ")" found.\n' +
- 'response:(200 or )\n' +
- '-----------------^');
+ }).toThrow(
+ 'Expected "(", NOT, value but ")" found.\n' + 'response:(200 or )\n' + '-----------------^'
+ );
});
it('should throw an error for a NOT query missing a sub-query', () => {
expect(() => {
fromKueryExpression('response:200 and not ');
- }).toThrow('Expected "(", field name, value but end of input found.\n' +
- 'response:200 and not \n' +
- '---------------------^');
+ }).toThrow(
+ 'Expected "(", field name, value but end of input found.\n' +
+ 'response:200 and not \n' +
+ '---------------------^'
+ );
});
it('should throw an error for a NOT list missing a sub-query', () => {
expect(() => {
fromKueryExpression('response:(200 and not )');
- }).toThrow('Expected "(", value but ")" found.\n' +
- 'response:(200 and not )\n' +
- '----------------------^');
+ }).toThrow(
+ 'Expected "(", value but ")" found.\n' +
+ 'response:(200 and not )\n' +
+ '----------------------^'
+ );
});
it('should throw an error for unbalanced quotes', () => {
expect(() => {
fromKueryExpression('foo:"ba ');
- }).toThrow('Expected "(", "{", value, whitespace but """ found.\n' +
- 'foo:"ba \n' +
- '----^');
+ }).toThrow('Expected "(", "{", value, whitespace but """ found.\n' + 'foo:"ba \n' + '----^');
});
it('should throw an error for unescaped quotes in a quoted string', () => {
expect(() => {
fromKueryExpression('foo:"ba "r"');
- }).toThrow('Expected AND, OR, end of input, whitespace but "r" found.\n' +
- 'foo:"ba "r"\n' +
- '---------^');
+ }).toThrow(
+ 'Expected AND, OR, end of input, whitespace but "r" found.\n' + 'foo:"ba "r"\n' + '---------^'
+ );
});
it('should throw an error for unescaped special characters in literals', () => {
expect(() => {
fromKueryExpression('foo:ba:r');
- }).toThrow('Expected AND, OR, end of input, whitespace but ":" found.\n' +
- 'foo:ba:r\n' +
- '------^');
+ }).toThrow(
+ 'Expected AND, OR, end of input, whitespace but ":" found.\n' + 'foo:ba:r\n' + '------^'
+ );
});
it('should throw an error for range queries missing a value', () => {
expect(() => {
fromKueryExpression('foo > ');
- }).toThrow('Expected literal, whitespace but end of input found.\n' +
- 'foo > \n' +
- '------^');
+ }).toThrow('Expected literal, whitespace but end of input found.\n' + 'foo > \n' + '------^');
});
it('should throw an error for range queries missing a field', () => {
expect(() => {
fromKueryExpression('< 1000');
- }).toThrow('Expected "(", NOT, end of input, field name, value, whitespace but "<" found.\n' +
- '< 1000\n' +
- '^');
+ }).toThrow(
+ 'Expected "(", NOT, end of input, field name, value, whitespace but "<" found.\n' +
+ '< 1000\n' +
+ '^'
+ );
});
-
});
diff --git a/packages/kbn-es-query/src/kuery/errors/index.js b/src/plugins/data/common/es_query/kuery/kuery_syntax_error.ts
similarity index 55%
rename from packages/kbn-es-query/src/kuery/errors/index.js
rename to src/plugins/data/common/es_query/kuery/kuery_syntax_error.ts
index 82e1aee7b775a1..7c90119fcc1bc3 100644
--- a/packages/kbn-es-query/src/kuery/errors/index.js
+++ b/src/plugins/data/common/es_query/kuery/kuery_syntax_error.ts
@@ -20,35 +20,46 @@
import { repeat } from 'lodash';
import { i18n } from '@kbn/i18n';
-const endOfInputText = i18n.translate('kbnESQuery.kql.errors.endOfInputText', {
+const endOfInputText = i18n.translate('data.common.esQuery.kql.errors.endOfInputText', {
defaultMessage: 'end of input',
});
-export class KQLSyntaxError extends Error {
+const grammarRuleTranslations: Record = {
+ fieldName: i18n.translate('data.common.esQuery.kql.errors.fieldNameText', {
+ defaultMessage: 'field name',
+ }),
+ value: i18n.translate('data.common.esQuery.kql.errors.valueText', {
+ defaultMessage: 'value',
+ }),
+ literal: i18n.translate('data.common.esQuery.kql.errors.literalText', {
+ defaultMessage: 'literal',
+ }),
+ whitespace: i18n.translate('data.common.esQuery.kql.errors.whitespaceText', {
+ defaultMessage: 'whitespace',
+ }),
+};
+
+interface KQLSyntaxErrorData extends Error {
+ found: string;
+ expected: KQLSyntaxErrorExpected[];
+ location: any;
+}
- constructor(error, expression) {
- const grammarRuleTranslations = {
- fieldName: i18n.translate('kbnESQuery.kql.errors.fieldNameText', {
- defaultMessage: 'field name',
- }),
- value: i18n.translate('kbnESQuery.kql.errors.valueText', {
- defaultMessage: 'value',
- }),
- literal: i18n.translate('kbnESQuery.kql.errors.literalText', {
- defaultMessage: 'literal',
- }),
- whitespace: i18n.translate('kbnESQuery.kql.errors.whitespaceText', {
- defaultMessage: 'whitespace',
- }),
- };
+interface KQLSyntaxErrorExpected {
+ description: string;
+}
+
+export class KQLSyntaxError extends Error {
+ shortMessage: string;
- const translatedExpectations = error.expected.map((expected) => {
+ constructor(error: KQLSyntaxErrorData, expression: any) {
+ const translatedExpectations = error.expected.map(expected => {
return grammarRuleTranslations[expected.description] || expected.description;
});
const translatedExpectationText = translatedExpectations.join(', ');
- const message = i18n.translate('kbnESQuery.kql.errors.syntaxError', {
+ const message = i18n.translate('data.common.esQuery.kql.errors.syntaxError', {
defaultMessage: 'Expected {expectedList} but {foundInput} found.',
values: {
expectedList: translatedExpectationText,
@@ -56,11 +67,9 @@ export class KQLSyntaxError extends Error {
},
});
- const fullMessage = [
- message,
- expression,
- repeat('-', error.location.start.offset) + '^',
- ].join('\n');
+ const fullMessage = [message, expression, repeat('-', error.location.start.offset) + '^'].join(
+ '\n'
+ );
super(fullMessage);
this.name = 'KQLSyntaxError';
diff --git a/packages/kbn-es-query/src/kuery/node_types/function.js b/src/plugins/data/common/es_query/kuery/node_types/function.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/node_types/function.js
rename to src/plugins/data/common/es_query/kuery/node_types/function.js
diff --git a/src/plugins/data/common/es_query/kuery/node_types/function.test.ts b/src/plugins/data/common/es_query/kuery/node_types/function.test.ts
new file mode 100644
index 00000000000000..ca9798eb6e74f5
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/node_types/function.test.ts
@@ -0,0 +1,75 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { fields } from '../../../index_patterns/mocks';
+
+import { nodeTypes } from './index';
+import { IIndexPattern } from '../../../index_patterns';
+
+// @ts-ignore
+import { buildNode, buildNodeWithArgumentNodes, toElasticsearchQuery } from './function';
+// @ts-ignore
+import { toElasticsearchQuery as isFunctionToElasticsearchQuery } from '../functions/is';
+
+describe('kuery node types', () => {
+ describe('function', () => {
+ let indexPattern: IIndexPattern;
+
+ beforeEach(() => {
+ indexPattern = ({
+ fields,
+ } as unknown) as IIndexPattern;
+ });
+
+ describe('buildNode', () => {
+ test('should return a node representing the given kuery function', () => {
+ const result = buildNode('is', 'extension', 'jpg');
+
+ expect(result).toHaveProperty('type', 'function');
+ expect(result).toHaveProperty('function', 'is');
+ expect(result).toHaveProperty('arguments');
+ });
+ });
+
+ describe('buildNodeWithArgumentNodes', () => {
+ test('should return a function node with the given argument list untouched', () => {
+ const fieldNameLiteral = nodeTypes.literal.buildNode('extension');
+ const valueLiteral = nodeTypes.literal.buildNode('jpg');
+ const argumentNodes = [fieldNameLiteral, valueLiteral];
+ const result = buildNodeWithArgumentNodes('is', argumentNodes);
+
+ expect(result).toHaveProperty('type', 'function');
+ expect(result).toHaveProperty('function', 'is');
+ expect(result).toHaveProperty('arguments');
+ expect(result.arguments).toBe(argumentNodes);
+ expect(result.arguments).toEqual(argumentNodes);
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test("should return the given function type's ES query representation", () => {
+ const node = buildNode('is', 'extension', 'jpg');
+ const expected = isFunctionToElasticsearchQuery(node, indexPattern);
+ const result = toElasticsearchQuery(node, indexPattern);
+
+ expect(expected).toEqual(result);
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/node_types/index.d.ts b/src/plugins/data/common/es_query/kuery/node_types/index.d.ts
similarity index 72%
rename from packages/kbn-es-query/src/kuery/node_types/index.d.ts
rename to src/plugins/data/common/es_query/kuery/node_types/index.d.ts
index daf8032f9fe0ef..720d64e11a0f89 100644
--- a/packages/kbn-es-query/src/kuery/node_types/index.d.ts
+++ b/src/plugins/data/common/es_query/kuery/node_types/index.d.ts
@@ -21,7 +21,8 @@
* WARNING: these typings are incomplete
*/
-import { JsonObject, JsonValue } from '..';
+import { IIndexPattern } from '../../../index_patterns';
+import { KueryNode, JsonValue } from '..';
type FunctionName =
| 'is'
@@ -34,6 +35,17 @@ type FunctionName =
| 'geoPolygon'
| 'nested';
+interface FunctionType {
+ buildNode: (functionName: FunctionName, ...args: any[]) => FunctionTypeBuildNode;
+ buildNodeWithArgumentNodes: (functionName: FunctionName, ...args: any[]) => FunctionTypeBuildNode;
+ toElasticsearchQuery: (
+ node: any,
+ indexPattern?: IIndexPattern,
+ config?: Record,
+ context?: Record
+ ) => JsonValue;
+}
+
interface FunctionTypeBuildNode {
type: 'function';
function: FunctionName;
@@ -41,32 +53,40 @@ interface FunctionTypeBuildNode {
arguments: any[];
}
-interface FunctionType {
- buildNode: (functionName: FunctionName, ...args: any[]) => FunctionTypeBuildNode;
- buildNodeWithArgumentNodes: (functionName: FunctionName, ...args: any[]) => FunctionTypeBuildNode;
- toElasticsearchQuery: (node: any, indexPattern: any, config: JsonObject) => JsonValue;
-}
-
interface LiteralType {
- buildNode: (
- value: null | boolean | number | string
- ) => { type: 'literal'; value: null | boolean | number | string };
+ buildNode: (value: null | boolean | number | string) => LiteralTypeBuildNode;
toElasticsearchQuery: (node: any) => null | boolean | number | string;
}
+interface LiteralTypeBuildNode {
+ type: 'literal';
+ value: null | boolean | number | string;
+}
+
interface NamedArgType {
- buildNode: (name: string, value: any) => { type: 'namedArg'; name: string; value: any };
+ buildNode: (name: string, value: any) => NamedArgTypeBuildNode;
toElasticsearchQuery: (node: any) => string;
}
+interface NamedArgTypeBuildNode {
+ type: 'namedArg';
+ name: string;
+ value: any;
+}
+
interface WildcardType {
- buildNode: (value: string) => { type: 'wildcard'; value: string };
+ buildNode: (value: string) => WildcardTypeBuildNode;
test: (node: any, string: string) => boolean;
toElasticsearchQuery: (node: any) => string;
toQueryStringQuery: (node: any) => string;
hasLeadingWildcard: (node: any) => boolean;
}
+interface WildcardTypeBuildNode {
+ type: 'wildcard';
+ value: string;
+}
+
interface NodeTypes {
function: FunctionType;
literal: LiteralType;
diff --git a/packages/kbn-es-query/src/kuery/node_types/index.js b/src/plugins/data/common/es_query/kuery/node_types/index.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/node_types/index.js
rename to src/plugins/data/common/es_query/kuery/node_types/index.js
diff --git a/packages/kbn-es-query/src/kuery/node_types/literal.js b/src/plugins/data/common/es_query/kuery/node_types/literal.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/node_types/literal.js
rename to src/plugins/data/common/es_query/kuery/node_types/literal.js
diff --git a/packages/kbn-es-query/src/kuery/node_types/__tests__/literal.js b/src/plugins/data/common/es_query/kuery/node_types/literal.test.ts
similarity index 54%
rename from packages/kbn-es-query/src/kuery/node_types/__tests__/literal.js
rename to src/plugins/data/common/es_query/kuery/node_types/literal.test.ts
index 25fe2bcc45a453..60fe2d6d1013c6 100644
--- a/packages/kbn-es-query/src/kuery/node_types/__tests__/literal.js
+++ b/src/plugins/data/common/es_query/kuery/node_types/literal.test.ts
@@ -17,34 +17,27 @@
* under the License.
*/
-import expect from '@kbn/expect';
-import * as literal from '../literal';
+// @ts-ignore
+import { buildNode, toElasticsearchQuery } from './literal';
-describe('kuery node types', function () {
+describe('kuery node types', () => {
+ describe('literal', () => {
+ describe('buildNode', () => {
+ test('should return a node representing the given value', () => {
+ const result = buildNode('foo');
- describe('literal', function () {
-
- describe('buildNode', function () {
-
- it('should return a node representing the given value', function () {
- const result = literal.buildNode('foo');
- expect(result).to.have.property('type', 'literal');
- expect(result).to.have.property('value', 'foo');
+ expect(result).toHaveProperty('type', 'literal');
+ expect(result).toHaveProperty('value', 'foo');
});
-
});
- describe('toElasticsearchQuery', function () {
+ describe('toElasticsearchQuery', () => {
+ test('should return the literal value represented by the given node', () => {
+ const node = buildNode('foo');
+ const result = toElasticsearchQuery(node);
- it('should return the literal value represented by the given node', function () {
- const node = literal.buildNode('foo');
- const result = literal.toElasticsearchQuery(node);
- expect(result).to.be('foo');
+ expect(result).toBe('foo');
});
-
});
-
-
});
-
});
diff --git a/packages/kbn-es-query/src/kuery/node_types/named_arg.js b/src/plugins/data/common/es_query/kuery/node_types/named_arg.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/node_types/named_arg.js
rename to src/plugins/data/common/es_query/kuery/node_types/named_arg.js
diff --git a/src/plugins/data/common/es_query/kuery/node_types/named_arg.test.ts b/src/plugins/data/common/es_query/kuery/node_types/named_arg.test.ts
new file mode 100644
index 00000000000000..36c40d28e55c22
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/node_types/named_arg.test.ts
@@ -0,0 +1,57 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import { nodeTypes } from './index';
+
+// @ts-ignore
+import { buildNode, toElasticsearchQuery } from './named_arg';
+
+describe('kuery node types', () => {
+ describe('named arg', () => {
+ describe('buildNode', () => {
+ test('should return a node representing a named argument with the given value', () => {
+ const result = buildNode('fieldName', 'foo');
+ expect(result).toHaveProperty('type', 'namedArg');
+ expect(result).toHaveProperty('name', 'fieldName');
+ expect(result).toHaveProperty('value');
+
+ const literalValue = result.value;
+ expect(literalValue).toHaveProperty('type', 'literal');
+ expect(literalValue).toHaveProperty('value', 'foo');
+ });
+
+ test('should support literal nodes as values', () => {
+ const value = nodeTypes.literal.buildNode('foo');
+ const result = buildNode('fieldName', value);
+
+ expect(result.value).toBe(value);
+ expect(result.value).toEqual(value);
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test('should return the argument value represented by the given node', () => {
+ const node = buildNode('fieldName', 'foo');
+ const result = toElasticsearchQuery(node);
+
+ expect(result).toBe('foo');
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/node_types/wildcard.js b/src/plugins/data/common/es_query/kuery/node_types/wildcard.js
similarity index 100%
rename from packages/kbn-es-query/src/kuery/node_types/wildcard.js
rename to src/plugins/data/common/es_query/kuery/node_types/wildcard.js
diff --git a/src/plugins/data/common/es_query/kuery/node_types/wildcard.test.ts b/src/plugins/data/common/es_query/kuery/node_types/wildcard.test.ts
new file mode 100644
index 00000000000000..7e221d96b49e91
--- /dev/null
+++ b/src/plugins/data/common/es_query/kuery/node_types/wildcard.test.ts
@@ -0,0 +1,110 @@
+/*
+ * Licensed to Elasticsearch B.V. under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch B.V. licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import {
+ buildNode,
+ wildcardSymbol,
+ hasLeadingWildcard,
+ toElasticsearchQuery,
+ test as testNode,
+ toQueryStringQuery,
+ // @ts-ignore
+} from './wildcard';
+
+describe('kuery node types', () => {
+ describe('wildcard', () => {
+ describe('buildNode', () => {
+ test('should accept a string argument representing a wildcard string', () => {
+ const wildcardValue = `foo${wildcardSymbol}bar`;
+ const result = buildNode(wildcardValue);
+
+ expect(result).toHaveProperty('type', 'wildcard');
+ expect(result).toHaveProperty('value', wildcardValue);
+ });
+
+ test('should accept and parse a wildcard string', () => {
+ const result = buildNode('foo*bar');
+
+ expect(result).toHaveProperty('type', 'wildcard');
+ expect(result.value).toBe(`foo${wildcardSymbol}bar`);
+ });
+ });
+
+ describe('toElasticsearchQuery', () => {
+ test('should return the string representation of the wildcard literal', () => {
+ const node = buildNode('foo*bar');
+ const result = toElasticsearchQuery(node);
+
+ expect(result).toBe('foo*bar');
+ });
+ });
+
+ describe('toQueryStringQuery', () => {
+ test('should return the string representation of the wildcard literal', () => {
+ const node = buildNode('foo*bar');
+ const result = toQueryStringQuery(node);
+
+ expect(result).toBe('foo*bar');
+ });
+
+ test('should escape query_string query special characters other than wildcard', () => {
+ const node = buildNode('+foo*bar');
+ const result = toQueryStringQuery(node);
+
+ expect(result).toBe('\\+foo*bar');
+ });
+ });
+
+ describe('test', () => {
+ test('should return a boolean indicating whether the string matches the given wildcard node', () => {
+ const node = buildNode('foo*bar');
+
+ expect(testNode(node, 'foobar')).toBe(true);
+ expect(testNode(node, 'foobazbar')).toBe(true);
+ expect(testNode(node, 'foobar')).toBe(true);
+ expect(testNode(node, 'fooqux')).toBe(false);
+ expect(testNode(node, 'bazbar')).toBe(false);
+ });
+
+ test('should return a true even when the string has newlines or tabs', () => {
+ const node = buildNode('foo*bar');
+
+ expect(testNode(node, 'foo\nbar')).toBe(true);
+ expect(testNode(node, 'foo\tbar')).toBe(true);
+ });
+ });
+
+ describe('hasLeadingWildcard', () => {
+ test('should determine whether a wildcard node contains a leading wildcard', () => {
+ const node = buildNode('foo*bar');
+ expect(hasLeadingWildcard(node)).toBe(false);
+
+ const leadingWildcardNode = buildNode('*foobar');
+ expect(hasLeadingWildcard(leadingWildcardNode)).toBe(true);
+ });
+
+ // Lone wildcards become exists queries, so we aren't worried about their performance
+ test('should not consider a lone wildcard to be a leading wildcard', () => {
+ const leadingWildcardNode = buildNode('*');
+
+ expect(hasLeadingWildcard(leadingWildcardNode)).toBe(false);
+ });
+ });
+ });
+});
diff --git a/packages/kbn-es-query/src/kuery/index.d.ts b/src/plugins/data/common/es_query/kuery/types.ts
similarity index 73%
rename from packages/kbn-es-query/src/kuery/index.d.ts
rename to src/plugins/data/common/es_query/kuery/types.ts
index b01a8914f68ef3..86cb7e08a767c1 100644
--- a/packages/kbn-es-query/src/kuery/index.d.ts
+++ b/src/plugins/data/common/es_query/kuery/types.ts
@@ -17,14 +17,29 @@
* under the License.
*/
-export * from './ast';
+import { NodeTypes } from './node_types';
+
+export interface KueryNode {
+ type: keyof NodeTypes;
+ [key: string]: any;
+}
+
+export type DslQuery = any;
+
+export interface KueryParseOptions {
+ helpers: {
+ [key: string]: any;
+ };
+ startRule: string;
+ allowLeadingWildcards: boolean;
+ errorOnLuceneSyntax: boolean;
+}
+
export { nodeTypes } from './node_types';
+export type JsonArray = JsonValue[];
export type JsonValue = null | boolean | number | string | JsonObject | JsonArray;
export interface JsonObject {
[key: string]: JsonValue;
}
-
-// eslint-disable-next-line @typescript-eslint/no-empty-interface
-export interface JsonArray extends Array {}
diff --git a/src/plugins/data/common/field_formats/converters/custom.ts b/src/plugins/data/common/field_formats/converters/custom.ts
index 687870306c8731..1c17e231cace83 100644
--- a/src/plugins/data/common/field_formats/converters/custom.ts
+++ b/src/plugins/data/common/field_formats/converters/custom.ts
@@ -17,10 +17,10 @@
* under the License.
*/
-import { FieldFormat } from '../field_format';
+import { FieldFormat, IFieldFormatType } from '../field_format';
import { TextContextTypeConvert, FIELD_FORMAT_IDS } from '../types';
-export const createCustomFieldFormat = (convert: TextContextTypeConvert) =>
+export const createCustomFieldFormat = (convert: TextContextTypeConvert): IFieldFormatType =>
class CustomFieldFormat extends FieldFormat {
static id = FIELD_FORMAT_IDS.CUSTOM;
diff --git a/src/plugins/data/common/field_formats/field_format.ts b/src/plugins/data/common/field_formats/field_format.ts
index 6b5f665c6e20e5..dd445a33f21c5f 100644
--- a/src/plugins/data/common/field_formats/field_format.ts
+++ b/src/plugins/data/common/field_formats/field_format.ts
@@ -73,7 +73,7 @@ export abstract class FieldFormat {
*/
public type: any = this.constructor;
- private readonly _params: any;
+ protected readonly _params: any;
protected getConfig: Function | undefined;
constructor(_params: any = {}, getConfig?: Function) {
diff --git a/tasks/config/peg.js b/tasks/config/peg.js
index 7c3e597ae12d2c..a9d066f3cd49fa 100644
--- a/tasks/config/peg.js
+++ b/tasks/config/peg.js
@@ -19,8 +19,8 @@
module.exports = {
kuery: {
- src: 'packages/kbn-es-query/src/kuery/ast/kuery.peg',
- dest: 'packages/kbn-es-query/src/kuery/ast/kuery.js',
+ src: 'src/plugins/data/common/es_query/kuery/ast/kuery.peg',
+ dest: 'src/plugins/data/common/es_query/kuery/ast/_generated_/kuery.js',
options: {
allowedStartRules: ['start', 'Literal']
}
diff --git a/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/index.tsx b/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/index.tsx
index 52be4d4fba7748..32fbe46ac560c4 100644
--- a/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/index.tsx
+++ b/x-pack/legacy/plugins/apm/public/components/shared/KueryBar/index.tsx
@@ -7,7 +7,6 @@
import React, { useState } from 'react';
import { uniqueId, startsWith } from 'lodash';
import styled from 'styled-components';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import { i18n } from '@kbn/i18n';
import { fromQuery, toQuery } from '../Links/url_helpers';
// @ts-ignore
@@ -16,13 +15,14 @@ import { getBoolFilter } from './get_bool_filter';
import { useLocation } from '../../../hooks/useLocation';
import { useUrlParams } from '../../../hooks/useUrlParams';
import { history } from '../../../utils/history';
+import { usePlugins } from '../../../new-platform/plugin';
+import { useDynamicIndexPattern } from '../../../hooks/useDynamicIndexPattern';
import {
- AutocompleteSuggestion,
AutocompleteProvider,
+ AutocompleteSuggestion,
+ esKuery,
IIndexPattern
} from '../../../../../../../../src/plugins/data/public';
-import { useDynamicIndexPattern } from '../../../hooks/useDynamicIndexPattern';
-import { usePlugins } from '../../../new-platform/plugin';
const Container = styled.div`
margin-bottom: 10px;
@@ -34,8 +34,8 @@ interface State {
}
function convertKueryToEsQuery(kuery: string, indexPattern: IIndexPattern) {
- const ast = fromKueryExpression(kuery);
- return toElasticsearchQuery(ast, indexPattern);
+ const ast = esKuery.fromKueryExpression(kuery);
+ return esKuery.toElasticsearchQuery(ast, indexPattern);
}
function getSuggestions(
diff --git a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts
index cee097d010212b..a6f6d36ecfc81a 100644
--- a/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts
+++ b/x-pack/legacy/plugins/apm/server/lib/helpers/convert_ui_filters/get_ui_filters_es.ts
@@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { toElasticsearchQuery, fromKueryExpression } from '@kbn/es-query';
import { ESFilter } from '../../../../typings/elasticsearch';
import { UIFilters } from '../../../../typings/ui-filters';
import { getEnvironmentUiFilterES } from './get_environment_ui_filter_es';
@@ -12,10 +11,13 @@ import {
localUIFilters,
localUIFilterNames
} from '../../ui_filters/local_ui_filters/config';
-import { StaticIndexPattern } from '../../../../../../../../src/legacy/core_plugins/data/public';
+import {
+ esKuery,
+ IIndexPattern
+} from '../../../../../../../../src/plugins/data/server';
export function getUiFiltersES(
- indexPattern: StaticIndexPattern | undefined,
+ indexPattern: IIndexPattern | undefined,
uiFilters: UIFilters
) {
const { kuery, environment, ...localFilterValues } = uiFilters;
@@ -43,13 +45,13 @@ export function getUiFiltersES(
}
function getKueryUiFilterES(
- indexPattern: StaticIndexPattern | undefined,
+ indexPattern: IIndexPattern | undefined,
kuery?: string
) {
if (!kuery || !indexPattern) {
return;
}
- const ast = fromKueryExpression(kuery);
- return toElasticsearchQuery(ast, indexPattern) as ESFilter;
+ const ast = esKuery.fromKueryExpression(kuery);
+ return esKuery.toElasticsearchQuery(ast, indexPattern) as ESFilter;
}
diff --git a/x-pack/legacy/plugins/beats_management/public/lib/adapters/elasticsearch/rest.ts b/x-pack/legacy/plugins/beats_management/public/lib/adapters/elasticsearch/rest.ts
index 526728bd77cac6..83c610800b89ba 100644
--- a/x-pack/legacy/plugins/beats_management/public/lib/adapters/elasticsearch/rest.ts
+++ b/x-pack/legacy/plugins/beats_management/public/lib/adapters/elasticsearch/rest.ts
@@ -4,11 +4,10 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import { isEmpty } from 'lodash';
import { npStart } from 'ui/new_platform';
import { ElasticsearchAdapter } from './adapter_types';
-import { AutocompleteSuggestion } from '../../../../../../../../src/plugins/data/public';
+import { AutocompleteSuggestion, esKuery } from '../../../../../../../../src/plugins/data/public';
import { setup as data } from '../../../../../../../../src/legacy/core_plugins/data/public/legacy';
const getAutocompleteProvider = (language: string) =>
@@ -20,7 +19,7 @@ export class RestElasticsearchAdapter implements ElasticsearchAdapter {
public isKueryValid(kuery: string): boolean {
try {
- fromKueryExpression(kuery);
+ esKuery.fromKueryExpression(kuery);
} catch (err) {
return false;
}
@@ -31,9 +30,9 @@ export class RestElasticsearchAdapter implements ElasticsearchAdapter {
if (!this.isKueryValid(kuery)) {
return '';
}
- const ast = fromKueryExpression(kuery);
+ const ast = esKuery.fromKueryExpression(kuery);
const indexPattern = await this.getIndexPattern();
- return JSON.stringify(toElasticsearchQuery(ast, indexPattern));
+ return JSON.stringify(esKuery.toElasticsearchQuery(ast, indexPattern));
}
public async getSuggestions(
kuery: string,
diff --git a/x-pack/legacy/plugins/graph/public/components/search_bar.tsx b/x-pack/legacy/plugins/graph/public/components/search_bar.tsx
index 82e50c702997f5..56458e5de273fe 100644
--- a/x-pack/legacy/plugins/graph/public/components/search_bar.tsx
+++ b/x-pack/legacy/plugins/graph/public/components/search_bar.tsx
@@ -9,12 +9,9 @@ import React, { useState, useEffect } from 'react';
import { i18n } from '@kbn/i18n';
import { connect } from 'react-redux';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
-import { IDataPluginServices, Query } from 'src/plugins/data/public';
import { IndexPatternSavedObject, IndexPatternProvider } from '../types';
import { QueryBarInput, IndexPattern } from '../../../../../../src/legacy/core_plugins/data/public';
import { openSourceModal } from '../services/source_modal';
-
import {
GraphState,
datasourceSelector,
@@ -23,6 +20,7 @@ import {
} from '../state_management';
import { useKibana } from '../../../../../../src/plugins/kibana_react/public';
+import { IDataPluginServices, Query, esKuery } from '../../../../../../src/plugins/data/public';
export interface OuterSearchBarProps {
isLoading: boolean;
@@ -44,7 +42,10 @@ export interface SearchBarProps extends OuterSearchBarProps {
function queryToString(query: Query, indexPattern: IndexPattern) {
if (query.language === 'kuery' && typeof query.query === 'string') {
- const dsl = toElasticsearchQuery(fromKueryExpression(query.query as string), indexPattern);
+ const dsl = esKuery.toElasticsearchQuery(
+ esKuery.fromKueryExpression(query.query as string),
+ indexPattern
+ );
// JSON representation of query will be handled by existing logic.
// TODO clean this up and handle it in the data fetch layer once
// it moved to typescript.
diff --git a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx
index 1353b065bc4449..a851f8380b9156 100644
--- a/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx
+++ b/x-pack/legacy/plugins/infra/public/components/metrics_explorer/kuery_bar.tsx
@@ -4,7 +4,6 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { fromKueryExpression } from '@kbn/es-query';
import { i18n } from '@kbn/i18n';
import React, { useEffect, useState } from 'react';
@@ -12,6 +11,7 @@ import { StaticIndexPattern } from 'ui/index_patterns';
import { WithKueryAutocompletion } from '../../containers/with_kuery_autocompletion';
import { AutocompleteField } from '../autocomplete_field';
import { isDisplayable } from '../../utils/is_displayable';
+import { esKuery } from '../../../../../../../src/plugins/data/public';
interface Props {
derivedIndexPattern: StaticIndexPattern;
@@ -21,7 +21,7 @@ interface Props {
function validateQuery(query: string) {
try {
- fromKueryExpression(query);
+ esKuery.fromKueryExpression(query);
} catch (err) {
return false;
}
diff --git a/x-pack/legacy/plugins/infra/public/store/local/log_filter/selectors.ts b/x-pack/legacy/plugins/infra/public/store/local/log_filter/selectors.ts
index 069f631b9c0264..f17f7be4defe98 100644
--- a/x-pack/legacy/plugins/infra/public/store/local/log_filter/selectors.ts
+++ b/x-pack/legacy/plugins/infra/public/store/local/log_filter/selectors.ts
@@ -5,10 +5,8 @@
*/
import { createSelector } from 'reselect';
-
-import { fromKueryExpression } from '@kbn/es-query';
-
import { LogFilterState } from './reducer';
+import { esKuery } from '../../../../../../../../src/plugins/data/public';
export const selectLogFilterQuery = (state: LogFilterState) =>
state.filterQuery ? state.filterQuery.query : null;
@@ -23,7 +21,7 @@ export const selectIsLogFilterQueryDraftValid = createSelector(
filterQueryDraft => {
if (filterQueryDraft && filterQueryDraft.kind === 'kuery') {
try {
- fromKueryExpression(filterQueryDraft.expression);
+ esKuery.fromKueryExpression(filterQueryDraft.expression);
} catch (err) {
return false;
}
diff --git a/x-pack/legacy/plugins/infra/public/store/local/waffle_filter/selectors.ts b/x-pack/legacy/plugins/infra/public/store/local/waffle_filter/selectors.ts
index 7d518b5e20f2dd..0acce82950f779 100644
--- a/x-pack/legacy/plugins/infra/public/store/local/waffle_filter/selectors.ts
+++ b/x-pack/legacy/plugins/infra/public/store/local/waffle_filter/selectors.ts
@@ -6,8 +6,7 @@
import { createSelector } from 'reselect';
-import { fromKueryExpression } from '@kbn/es-query';
-
+import { esKuery } from '../../../../../../../../src/plugins/data/public';
import { WaffleFilterState } from './reducer';
export const selectWaffleFilterQuery = (state: WaffleFilterState) =>
@@ -23,7 +22,7 @@ export const selectIsWaffleFilterQueryDraftValid = createSelector(
filterQueryDraft => {
if (filterQueryDraft && filterQueryDraft.kind === 'kuery') {
try {
- fromKueryExpression(filterQueryDraft.expression);
+ esKuery.fromKueryExpression(filterQueryDraft.expression);
} catch (err) {
return false;
}
diff --git a/x-pack/legacy/plugins/infra/public/utils/kuery.ts b/x-pack/legacy/plugins/infra/public/utils/kuery.ts
index 4a767f2777512f..2e793d53b46226 100644
--- a/x-pack/legacy/plugins/infra/public/utils/kuery.ts
+++ b/x-pack/legacy/plugins/infra/public/utils/kuery.ts
@@ -4,8 +4,8 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import { StaticIndexPattern } from 'ui/index_patterns';
+import { esKuery } from '../../../../../../src/plugins/data/public';
export const convertKueryToElasticSearchQuery = (
kueryExpression: string,
@@ -13,7 +13,9 @@ export const convertKueryToElasticSearchQuery = (
) => {
try {
return kueryExpression
- ? JSON.stringify(toElasticsearchQuery(fromKueryExpression(kueryExpression), indexPattern))
+ ? JSON.stringify(
+ esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(kueryExpression), indexPattern)
+ )
: '';
} catch (err) {
return '';
diff --git a/x-pack/legacy/plugins/kuery_autocomplete/public/autocomplete_providers/index.js b/x-pack/legacy/plugins/kuery_autocomplete/public/autocomplete_providers/index.js
index 8a82194470ace4..7b0e42283d5f59 100644
--- a/x-pack/legacy/plugins/kuery_autocomplete/public/autocomplete_providers/index.js
+++ b/x-pack/legacy/plugins/kuery_autocomplete/public/autocomplete_providers/index.js
@@ -5,11 +5,11 @@
*/
import { flatten, mapValues, uniq } from 'lodash';
-import { fromKueryExpression } from '@kbn/es-query';
import { getSuggestionsProvider as field } from './field';
import { getSuggestionsProvider as value } from './value';
import { getSuggestionsProvider as operator } from './operator';
import { getSuggestionsProvider as conjunction } from './conjunction';
+import { esKuery } from '../../../../../../src/plugins/data/public';
const cursorSymbol = '@kuery-cursor@';
@@ -27,7 +27,7 @@ export const kueryProvider = ({ config, indexPatterns, boolFilter }) => {
let cursorNode;
try {
- cursorNode = fromKueryExpression(cursoredQuery, { cursorSymbol, parseCursor: true });
+ cursorNode = esKuery.fromKueryExpression(cursoredQuery, { cursorSymbol, parseCursor: true });
} catch (e) {
cursorNode = {};
}
diff --git a/x-pack/legacy/plugins/ml/public/application/components/kql_filter_bar/utils.js b/x-pack/legacy/plugins/ml/public/application/components/kql_filter_bar/utils.js
index 16e4a563c33ae8..18b3382175fdd7 100644
--- a/x-pack/legacy/plugins/ml/public/application/components/kql_filter_bar/utils.js
+++ b/x-pack/legacy/plugins/ml/public/application/components/kql_filter_bar/utils.js
@@ -4,7 +4,7 @@
* you may not use this file except in compliance with the Elastic License.
*/
import { npStart } from 'ui/new_platform';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
+import { esKuery } from '../../../../../../../../src/plugins/data/public';
const getAutocompleteProvider = language => npStart.plugins.data.autocomplete.getProvider(language);
@@ -35,8 +35,8 @@ export async function getSuggestions(
}
function convertKueryToEsQuery(kuery, indexPattern) {
- const ast = fromKueryExpression(kuery);
- return toElasticsearchQuery(ast, indexPattern);
+ const ast = esKuery.fromKueryExpression(kuery);
+ return esKuery.toElasticsearchQuery(ast, indexPattern);
}
// Recommended by MDN for escaping user input to be treated as a literal string within a regular expression
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
@@ -53,7 +53,7 @@ export function escapeDoubleQuotes(string) {
}
export function getKqlQueryValues(inputValue, indexPattern) {
- const ast = fromKueryExpression(inputValue);
+ const ast = esKuery.fromKueryExpression(inputValue);
const isAndOperator = (ast.function === 'and');
const query = convertKueryToEsQuery(inputValue, indexPattern);
const filteredFields = [];
diff --git a/x-pack/legacy/plugins/siem/public/lib/keury/index.ts b/x-pack/legacy/plugins/siem/public/lib/keury/index.ts
index b6819e54575d60..d82079dd05d31e 100644
--- a/x-pack/legacy/plugins/siem/public/lib/keury/index.ts
+++ b/x-pack/legacy/plugins/siem/public/lib/keury/index.ts
@@ -4,12 +4,12 @@
* you may not use this file except in compliance with the Elastic License.
*/
-import { fromKueryExpression, toElasticsearchQuery, JsonObject } from '@kbn/es-query';
import { isEmpty, isString, flow } from 'lodash/fp';
import {
Query,
esFilters,
esQuery,
+ esKuery,
IIndexPattern,
} from '../../../../../../../src/plugins/data/public';
@@ -21,7 +21,9 @@ export const convertKueryToElasticSearchQuery = (
) => {
try {
return kueryExpression
- ? JSON.stringify(toElasticsearchQuery(fromKueryExpression(kueryExpression), indexPattern))
+ ? JSON.stringify(
+ esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(kueryExpression), indexPattern)
+ )
: '';
} catch (err) {
return '';
@@ -31,10 +33,10 @@ export const convertKueryToElasticSearchQuery = (
export const convertKueryToDslFilter = (
kueryExpression: string,
indexPattern: IIndexPattern
-): JsonObject => {
+): esKuery.JsonObject => {
try {
return kueryExpression
- ? toElasticsearchQuery(fromKueryExpression(kueryExpression), indexPattern)
+ ? esKuery.toElasticsearchQuery(esKuery.fromKueryExpression(kueryExpression), indexPattern)
: {};
} catch (err) {
return {};
@@ -55,7 +57,7 @@ export const escapeQueryValue = (val: number | string = ''): string | number =>
export const isFromKueryExpressionValid = (kqlFilterQuery: KueryFilterQuery | null): boolean => {
if (kqlFilterQuery && kqlFilterQuery.kind === 'kuery') {
try {
- fromKueryExpression(kqlFilterQuery.expression);
+ esKuery.fromKueryExpression(kqlFilterQuery.expression);
} catch (err) {
return false;
}
diff --git a/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/step_define_rule/schema.tsx b/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/step_define_rule/schema.tsx
index 500557a2c2a96f..58a9e57b32ce60 100644
--- a/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/step_define_rule/schema.tsx
+++ b/x-pack/legacy/plugins/siem/public/pages/detection_engine/create_rule/components/step_define_rule/schema.tsx
@@ -6,7 +6,6 @@
import { i18n } from '@kbn/i18n';
import { EuiText } from '@elastic/eui';
-import { fromKueryExpression } from '@kbn/es-query';
import { isEmpty } from 'lodash/fp';
import React from 'react';
@@ -17,6 +16,7 @@ import {
} from '../../../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib';
import { fieldValidators } from '../../../../../../../../../../src/plugins/es_ui_shared/static/forms/helpers';
import { ERROR_CODE } from '../../../../../../../../../../src/plugins/es_ui_shared/static/forms/helpers/field_validators/types';
+import { esKuery } from '../../../../../../../../../../src/plugins/data/public';
import * as CreateRuleI18n from '../../translations';
@@ -106,7 +106,7 @@ export const schema: FormSchema = {
const { query } = value as FieldValueQueryBar;
if (!isEmpty(query.query as string) && query.language === 'kuery') {
try {
- fromKueryExpression(query.query);
+ esKuery.fromKueryExpression(query.query);
} catch (err) {
return {
code: 'ERR_FIELD_FORMAT',
diff --git a/x-pack/legacy/plugins/transform/public/app/lib/kibana/common.ts b/x-pack/legacy/plugins/transform/public/app/lib/kibana/common.ts
index 16100089a9e56f..b465392a50ae14 100644
--- a/x-pack/legacy/plugins/transform/public/app/lib/kibana/common.ts
+++ b/x-pack/legacy/plugins/transform/public/app/lib/kibana/common.ts
@@ -104,7 +104,7 @@ export function createSearchItems(
const filters = fs.length ? fs : [];
const esQueryConfigs = esQuery.getEsQueryConfig(config);
- combinedQuery = esQuery.buildEsQuery(indexPattern || null, [query], filters, esQueryConfigs);
+ combinedQuery = esQuery.buildEsQuery(indexPattern, [query], filters, esQueryConfigs);
}
return {
diff --git a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/index.tsx b/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/index.tsx
index f529c9cd9d53fc..da392660eb70e8 100644
--- a/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/index.tsx
+++ b/x-pack/legacy/plugins/uptime/public/components/functional/kuery_bar/index.tsx
@@ -9,14 +9,17 @@ import { uniqueId, startsWith } from 'lodash';
import { EuiCallOut } from '@elastic/eui';
import styled from 'styled-components';
import { FormattedMessage } from '@kbn/i18n/react';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
-import { AutocompleteProviderRegister, AutocompleteSuggestion } from 'src/plugins/data/public';
-import { StaticIndexPattern } from 'src/legacy/core_plugins/data/public/index_patterns/index_patterns';
import { Typeahead } from './typeahead';
import { getIndexPattern } from '../../../lib/adapters/index_pattern';
import { UptimeSettingsContext } from '../../../contexts';
import { useUrlParams } from '../../../hooks';
import { toStaticIndexPattern } from '../../../lib/helper';
+import {
+ AutocompleteProviderRegister,
+ AutocompleteSuggestion,
+ esKuery,
+ IIndexPattern,
+} from '../../../../../../../../src/plugins/data/public';
const Container = styled.div`
margin-bottom: 10px;
@@ -27,15 +30,15 @@ interface State {
isLoadingIndexPattern: boolean;
}
-function convertKueryToEsQuery(kuery: string, indexPattern: unknown) {
- const ast = fromKueryExpression(kuery);
- return toElasticsearchQuery(ast, indexPattern);
+function convertKueryToEsQuery(kuery: string, indexPattern: IIndexPattern) {
+ const ast = esKuery.fromKueryExpression(kuery);
+ return esKuery.toElasticsearchQuery(ast, indexPattern);
}
function getSuggestions(
query: string,
selectionStart: number,
- apmIndexPattern: StaticIndexPattern,
+ apmIndexPattern: IIndexPattern,
autocomplete: Pick
) {
const autocompleteProvider = autocomplete.getProvider('kuery');
diff --git a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx
index ded16c3f8eb2f0..09d40d32b696c1 100644
--- a/x-pack/legacy/plugins/uptime/public/pages/overview.tsx
+++ b/x-pack/legacy/plugins/uptime/public/pages/overview.tsx
@@ -6,10 +6,8 @@
import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui';
import { i18n } from '@kbn/i18n';
-import { fromKueryExpression, toElasticsearchQuery } from '@kbn/es-query';
import React, { Fragment, useContext, useEffect, useState } from 'react';
import styled from 'styled-components';
-import { AutocompleteProviderRegister } from 'src/plugins/data/public';
import { getOverviewPageBreadcrumbs } from '../breadcrumbs';
import {
EmptyState,
@@ -26,6 +24,7 @@ import { stringifyUrlParams } from '../lib/helper/stringify_url_params';
import { useTrackPageview } from '../../../infra/public';
import { getIndexPattern } from '../lib/adapters/index_pattern';
import { combineFiltersAndUserSearch, stringifyKueries, toStaticIndexPattern } from '../lib/helper';
+import { AutocompleteProviderRegister, esKuery } from '../../../../../../src/plugins/data/public';
interface OverviewPageProps {
basePath: string;
@@ -109,8 +108,8 @@ export const OverviewPage = ({
if (indexPattern) {
const staticIndexPattern = toStaticIndexPattern(indexPattern);
const combinedFilterString = combineFiltersAndUserSearch(filterQueryString, kueryString);
- const ast = fromKueryExpression(combinedFilterString);
- const elasticsearchQuery = toElasticsearchQuery(ast, staticIndexPattern);
+ const ast = esKuery.fromKueryExpression(combinedFilterString);
+ const elasticsearchQuery = esKuery.toElasticsearchQuery(ast, staticIndexPattern);
filters = JSON.stringify(elasticsearchQuery);
}
}
diff --git a/x-pack/package.json b/x-pack/package.json
index bc7b220bf81f50..427408fa8128e6 100644
--- a/x-pack/package.json
+++ b/x-pack/package.json
@@ -185,7 +185,6 @@
"@kbn/babel-preset": "1.0.0",
"@kbn/config-schema": "1.0.0",
"@kbn/elastic-idx": "1.0.0",
- "@kbn/es-query": "1.0.0",
"@kbn/i18n": "1.0.0",
"@kbn/interpreter": "1.0.0",
"@kbn/ui-framework": "1.0.0",
diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json
index f83d0c9ea3c9a3..0dcaed032fa06b 100644
--- a/x-pack/plugins/translations/translations/ja-JP.json
+++ b/x-pack/plugins/translations/translations/ja-JP.json
@@ -2527,12 +2527,12 @@
"kbnDocViews.table.fieldNamesBeginningWithUnderscoreUnsupportedAriaLabel": "警告",
"kbnDocViews.table.noCachedMappingForThisFieldAriaLabel": "警告",
"kbnDocViews.table.toggleFieldDetails": "フィールド詳細を切り替える",
- "kbnESQuery.kql.errors.endOfInputText": "インプットの終わり",
- "kbnESQuery.kql.errors.fieldNameText": "フィールド名",
- "kbnESQuery.kql.errors.literalText": "文字通り",
- "kbnESQuery.kql.errors.syntaxError": "{expectedList} が予測されましたが {foundInput} が検出されました。",
- "kbnESQuery.kql.errors.valueText": "値",
- "kbnESQuery.kql.errors.whitespaceText": "ホワイトスペース",
+ "data.common.esQuery.kql.errors.endOfInputText": "インプットの終わり",
+ "data.common.esQuery.kql.errors.fieldNameText": "フィールド名",
+ "data.common.esQuery.kql.errors.literalText": "文字通り",
+ "data.common.esQuery.kql.errors.syntaxError": "{expectedList} が予測されましたが {foundInput} が検出されました。",
+ "data.common.esQuery.kql.errors.valueText": "値",
+ "data.common.esQuery.kql.errors.whitespaceText": "ホワイトスペース",
"kbnVislibVisTypes.area.areaDescription": "折れ線グラフの下の数量を強調します。",
"kbnVislibVisTypes.area.areaTitle": "エリア",
"kbnVislibVisTypes.area.groupTitle": "系列を分割",
diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json
index a830eaacd29e35..8ea1100af97eca 100644
--- a/x-pack/plugins/translations/translations/zh-CN.json
+++ b/x-pack/plugins/translations/translations/zh-CN.json
@@ -2528,12 +2528,12 @@
"kbnDocViews.table.fieldNamesBeginningWithUnderscoreUnsupportedAriaLabel": "警告",
"kbnDocViews.table.noCachedMappingForThisFieldAriaLabel": "警告",
"kbnDocViews.table.toggleFieldDetails": "切换字段详细信息",
- "kbnESQuery.kql.errors.endOfInputText": "输入结束",
- "kbnESQuery.kql.errors.fieldNameText": "字段名称",
- "kbnESQuery.kql.errors.literalText": "文本",
- "kbnESQuery.kql.errors.syntaxError": "应为 {expectedList},但却找到了 {foundInput}。",
- "kbnESQuery.kql.errors.valueText": "值",
- "kbnESQuery.kql.errors.whitespaceText": "空白",
+ "data.common.esQuery.kql.errors.endOfInputText": "输入结束",
+ "data.common.esQuery.kql.errors.fieldNameText": "字段名称",
+ "data.common.esQuery.kql.errors.literalText": "文本",
+ "data.common.esQuery.kql.errors.syntaxError": "应为 {expectedList},但却找到了 {foundInput}。",
+ "data.common.esQuery.kql.errors.valueText": "值",
+ "data.common.esQuery.kql.errors.whitespaceText": "空白",
"kbnVislibVisTypes.area.areaDescription": "突出折线图下方的数量",
"kbnVislibVisTypes.area.areaTitle": "面积图",
"kbnVislibVisTypes.area.groupTitle": "拆分序列",