UNPKG

@elastic/eui

Version:

Elastic UI Component Library

356 lines (355 loc) 13.5 kB
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); } function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); } function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); } function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); } function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License * 2.0 and the Server Side Public License, v 1; you may not use this file except * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ import { isArray, isDateLike, isString } from '../../../services/predicate'; import { keysOf } from '../../common'; import { AST } from './ast'; import { printIso8601 } from './date_format'; import { dateValue, isDateValue } from './date_value'; var processDateOperation = function processDateOperation(value, operator) { var granularity = value.granularity, resolve = value.resolve; var expression = printIso8601(resolve()); if (!granularity) { return { operator: operator, expression: expression }; } switch (operator) { case AST.Operator.GT: expression = "".concat(expression, "||+1").concat(granularity.es, "/").concat(granularity.es); return { operator: AST.Operator.GTE, expression: expression }; case AST.Operator.GTE: expression = "".concat(expression, "||/").concat(granularity.es); return { operator: operator, expression: expression }; case AST.Operator.LT: expression = "".concat(expression, "||/").concat(granularity.es); return { operator: operator, expression: expression }; case AST.Operator.LTE: expression = "".concat(expression, "||+1").concat(granularity.es, "/").concat(granularity.es); return { operator: AST.Operator.LT, expression: expression }; default: expression = "".concat(expression, "||/").concat(granularity.es); return { expression: expression }; } }; export var _termValuesToQuery = function _termValuesToQuery(values, options) { var body = { query: values.map(function (value) { if (isString(value) && value.match(/\s/)) { return "+\"".concat(value, "\""); } return "+".concat(value); }).join(' ') }; if (body.query === '') { return; } if (options.defaultFields) { body.fields = options.defaultFields; } return { simple_query_string: body }; }; export var _fieldValuesToQuery = function _fieldValuesToQuery(field, operations, andOr) { var queries = []; keysOf(operations).forEach(function (operator) { var values = operations[operator]; switch (operator) { case AST.Operator.EQ: var terms = []; var phrases = []; var dates = []; values.forEach(function (value) { if (isDateValue(value)) { dates.push(value); } else if (isDateLike(value)) { dates.push(dateValue(value)); } else if (isString(value) && value.match(/\s/)) { phrases.push(value); } else { terms.push(value); } }); if (terms.length > 1) { queries.push({ bool: _defineProperty({}, andOr === 'and' ? 'must' : 'should', _toConsumableArray(terms.map(function (value) { return { match: _defineProperty({}, field, { query: value, operator: andOr }) }; }))) }); } else if (terms.length === 1) { queries.push({ match: _defineProperty({}, field, { query: terms[0], operator: andOr }) }); } if (phrases.length > 0) { queries.push.apply(queries, _toConsumableArray(phrases.map(function (phrase) { return { match_phrase: _defineProperty({}, field, phrase) }; }))); } if (dates.length > 0) { queries.push.apply(queries, _toConsumableArray(dates.map(function (value) { return { match: _defineProperty({}, field, processDateOperation(value).expression) }; }))); } break; default: values.forEach(function (value) { if (isDateValue(value)) { var operation = processDateOperation(value, operator); queries.push({ range: _defineProperty({}, field, _defineProperty({}, operation.operator, operation.expression)) }); } else { queries.push({ range: _defineProperty({}, field, _defineProperty({}, operator, value)) }); } }); } }); if (queries.length === 1) { return queries[0]; } var key = andOr === 'and' ? 'must' : 'should'; return { bool: _defineProperty({}, key, [].concat(queries)) }; }; export var _isFlagToQuery = function _isFlagToQuery(flag, on) { return { term: _defineProperty({}, flag, on) }; }; var collectTerms = function collectTerms(clauses) { var values = { must: [], mustNot: [] }; var _iterator = _createForOfIteratorHelper(clauses), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var clause = _step.value; if (AST.Match.isMustClause(clause)) { values.must.push(clause.value); } else { values.mustNot.push(clause.value); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return values; }; var collectFields = function collectFields(clauses) { var fieldArray = function fieldArray(obj, field, operator) { if (!obj[field]) { obj[field] = {}; } if (!obj[field][operator]) { obj[field][operator] = []; } return obj[field][operator]; }; return clauses.reduce(function (fields, clause) { if (AST.Match.isMustClause(clause)) { if (isArray(clause.value)) { var _fieldArray; (_fieldArray = fieldArray(fields.must.or, clause.field, clause.operator)).push.apply(_fieldArray, _toConsumableArray(clause.value)); } else { fieldArray(fields.must.and, clause.field, clause.operator).push(clause.value); } } else { if (isArray(clause.value)) { var _fieldArray2; (_fieldArray2 = fieldArray(fields.mustNot.or, clause.field, clause.operator)).push.apply(_fieldArray2, _toConsumableArray(clause.value)); } else { fieldArray(fields.mustNot.and, clause.field, clause.operator).push(clause.value); } } return fields; }, { must: { and: {}, or: {} }, mustNot: { and: {}, or: {} } }); }; var clausesToEsQueryDsl = function clausesToEsQueryDsl(_ref) { var fields = _ref.fields, terms = _ref.terms, is = _ref.is; var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; var extraMustQueries = options.extraMustQueries || []; var extraMustNotQueries = options.extraMustNotQueries || []; var termValuesToQuery = options.termValuesToQuery || _termValuesToQuery; var fieldValuesToQuery = options.fieldValuesToQuery || _fieldValuesToQuery; var isFlagToQuery = options.isFlagToQuery || _isFlagToQuery; var must = []; must.push.apply(must, _toConsumableArray(extraMustQueries)); var termMustQuery = termValuesToQuery(terms.must, options); if (termMustQuery) { must.push(termMustQuery); } Object.keys(fields.must.and).forEach(function (field) { must.push(fieldValuesToQuery(field, fields.must.and[field], 'and')); }); Object.keys(fields.must.or).forEach(function (field) { must.push(fieldValuesToQuery(field, fields.must.or[field], 'or')); }); is.forEach(function (clause) { must.push(isFlagToQuery(clause.flag, AST.Match.isMustClause(clause))); }); var mustNot = []; mustNot.push.apply(mustNot, _toConsumableArray(extraMustNotQueries)); var termMustNotQuery = termValuesToQuery(terms.mustNot, options); if (termMustNotQuery) { mustNot.push(termMustNotQuery); } Object.keys(fields.mustNot.and).forEach(function (field) { mustNot.push(fieldValuesToQuery(field, fields.mustNot.and[field], 'and')); }); Object.keys(fields.mustNot.or).forEach(function (field) { mustNot.push(fieldValuesToQuery(field, fields.mustNot.or[field], 'or')); }); var bool = {}; if (must.length !== 0) { bool.must = must; } if (mustNot.length !== 0) { bool.must_not = mustNot; } return bool; }; var EMPTY_TERMS = { must: [], mustNot: [] }; var EMPTY_FIELDS = { must: { and: {}, or: {} }, mustNot: { and: {}, or: {} } }; export var astToEsQueryDsl = function astToEsQueryDsl(ast) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; if (ast.clauses.length === 0) { return { match_all: {} }; } var terms = collectTerms(ast.getTermClauses()); var fields = collectFields(ast.getFieldClauses()); var is = ast.getIsClauses(); var matchesBool = clausesToEsQueryDsl({ terms: terms, fields: fields, is: is }, options); var hasTopMatches = Object.keys(matchesBool).length > 0; var groupClauses = ast.getGroupClauses(); if (groupClauses.length === 0) { // there are no GroupClauses, everything at top level is combined as a must return { bool: matchesBool }; } else { // there is at least one GroupClause, wrap the above clauses in another layer and append the ORs var must = groupClauses.reduce(function (must, groupClause) { var clauses = groupClause.value.reduce(function (clauses, clause) { if (AST.Term.isInstance(clause)) { clauses.push(clausesToEsQueryDsl({ terms: collectTerms([clause]), fields: EMPTY_FIELDS, is: [] })); } else if (AST.Field.isInstance(clause)) { clauses.push(clausesToEsQueryDsl({ terms: EMPTY_TERMS, fields: collectFields([clause]), is: [] })); } else if (AST.Is.isInstance(clause)) { clauses.push(clausesToEsQueryDsl({ terms: EMPTY_TERMS, fields: EMPTY_FIELDS, is: [clause] })); } return clauses; }, []); must.push({ bool: { should: clauses.map(function (clause) { return { bool: clause }; }) } }); return must; }, hasTopMatches // only include the first match group if there are any conditions ? [{ bool: matchesBool }] : []); return { bool: { must: must } }; } };