diff --git a/src/ui/public/filter_bar/__tests__/changeTimeFilter.js b/src/ui/public/filter_bar/lib/__tests__/changeTimeFilter.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/changeTimeFilter.js rename to src/ui/public/filter_bar/lib/__tests__/changeTimeFilter.js diff --git a/src/ui/public/filter_bar/__tests__/dedupFilters.js b/src/ui/public/filter_bar/lib/__tests__/dedupFilters.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/dedupFilters.js rename to src/ui/public/filter_bar/lib/__tests__/dedupFilters.js diff --git a/src/ui/public/filter_bar/__tests__/extractTimeFilter.js b/src/ui/public/filter_bar/lib/__tests__/extractTimeFilter.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/extractTimeFilter.js rename to src/ui/public/filter_bar/lib/__tests__/extractTimeFilter.js diff --git a/src/ui/public/filter_bar/__tests__/filterAppliedAndUnwrap.js b/src/ui/public/filter_bar/lib/__tests__/filterAppliedAndUnwrap.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/filterAppliedAndUnwrap.js rename to src/ui/public/filter_bar/lib/__tests__/filterAppliedAndUnwrap.js diff --git a/src/ui/public/filter_bar/__tests__/filterOutTimeBasedFilter.js b/src/ui/public/filter_bar/lib/__tests__/filterOutTimeBasedFilter.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/filterOutTimeBasedFilter.js rename to src/ui/public/filter_bar/lib/__tests__/filterOutTimeBasedFilter.js diff --git a/src/ui/public/filter_bar/__tests__/generateMappingChain.js b/src/ui/public/filter_bar/lib/__tests__/generateMappingChain.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/generateMappingChain.js rename to src/ui/public/filter_bar/lib/__tests__/generateMappingChain.js diff --git a/src/ui/public/filter_bar/__tests__/mapAndFlattenFilters.js b/src/ui/public/filter_bar/lib/__tests__/mapAndFlattenFilters.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapAndFlattenFilters.js rename to src/ui/public/filter_bar/lib/__tests__/mapAndFlattenFilters.js diff --git a/src/ui/public/filter_bar/__tests__/mapDefault.js b/src/ui/public/filter_bar/lib/__tests__/mapDefault.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapDefault.js rename to src/ui/public/filter_bar/lib/__tests__/mapDefault.js diff --git a/src/ui/public/filter_bar/__tests__/mapExists.js b/src/ui/public/filter_bar/lib/__tests__/mapExists.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapExists.js rename to src/ui/public/filter_bar/lib/__tests__/mapExists.js diff --git a/src/ui/public/filter_bar/__tests__/mapFilter.js b/src/ui/public/filter_bar/lib/__tests__/mapFilter.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapFilter.js rename to src/ui/public/filter_bar/lib/__tests__/mapFilter.js diff --git a/src/ui/public/filter_bar/__tests__/mapFlattenAndWrapFilters.js b/src/ui/public/filter_bar/lib/__tests__/mapFlattenAndWrapFilters.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapFlattenAndWrapFilters.js rename to src/ui/public/filter_bar/lib/__tests__/mapFlattenAndWrapFilters.js diff --git a/src/ui/public/filter_bar/__tests__/mapGeoBoundingBox.js b/src/ui/public/filter_bar/lib/__tests__/mapGeoBoundingBox.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapGeoBoundingBox.js rename to src/ui/public/filter_bar/lib/__tests__/mapGeoBoundingBox.js diff --git a/src/ui/public/filter_bar/lib/__tests__/mapMatchAll.js b/src/ui/public/filter_bar/lib/__tests__/mapMatchAll.js new file mode 100644 index 0000000000000..d274a7bd95dac --- /dev/null +++ b/src/ui/public/filter_bar/lib/__tests__/mapMatchAll.js @@ -0,0 +1,51 @@ + +describe('ui/filter_bar/lib', function () { + describe('mapMatchAll()', function () { + const expect = require('expect.js'); + const ngMock = require('ngMock'); + let $rootScope; + let mapMatchAll; + let filter; + + + beforeEach(ngMock.module('kibana')); + beforeEach(ngMock.inject(function (Private, _$rootScope_) { + $rootScope = _$rootScope_; + mapMatchAll = Private(require('ui/filter_bar/lib/mapMatchAll')); + filter = { + match_all: {}, + meta: { + field: 'foo', + formattedValue: 'bar' + } + }; + })); + + describe('when given a filter that is not match_all', function () { + it('filter is rejected', function (done) { + delete filter.match_all; + mapMatchAll(filter).catch(result => { + expect(result).to.be(filter); + done(); + }); + $rootScope.$apply(); + }); + }); + + describe('when given a match_all filter', function () { + let result; + beforeEach(function () { + mapMatchAll(filter).then(r => result = r); + $rootScope.$apply(); + }); + + it('key is set to meta field', function () { + expect(result).to.have.property('key', filter.meta.field); + }); + + it('value is set to meta formattedValue', function () { + expect(result).to.have.property('value', filter.meta.formattedValue); + }); + }); + }); +}); diff --git a/src/ui/public/filter_bar/__tests__/mapMissing.js b/src/ui/public/filter_bar/lib/__tests__/mapMissing.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapMissing.js rename to src/ui/public/filter_bar/lib/__tests__/mapMissing.js diff --git a/src/ui/public/filter_bar/__tests__/mapQueryString.js b/src/ui/public/filter_bar/lib/__tests__/mapQueryString.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapQueryString.js rename to src/ui/public/filter_bar/lib/__tests__/mapQueryString.js diff --git a/src/ui/public/filter_bar/__tests__/mapRange.js b/src/ui/public/filter_bar/lib/__tests__/mapRange.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapRange.js rename to src/ui/public/filter_bar/lib/__tests__/mapRange.js diff --git a/src/ui/public/filter_bar/__tests__/mapScript.js b/src/ui/public/filter_bar/lib/__tests__/mapScript.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapScript.js rename to src/ui/public/filter_bar/lib/__tests__/mapScript.js diff --git a/src/ui/public/filter_bar/__tests__/mapTerms.js b/src/ui/public/filter_bar/lib/__tests__/mapTerms.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/mapTerms.js rename to src/ui/public/filter_bar/lib/__tests__/mapTerms.js diff --git a/src/ui/public/filter_bar/__tests__/onlyDisabled.js b/src/ui/public/filter_bar/lib/__tests__/onlyDisabled.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/onlyDisabled.js rename to src/ui/public/filter_bar/lib/__tests__/onlyDisabled.js diff --git a/src/ui/public/filter_bar/__tests__/uniqFilters.js b/src/ui/public/filter_bar/lib/__tests__/uniqFilters.js similarity index 100% rename from src/ui/public/filter_bar/__tests__/uniqFilters.js rename to src/ui/public/filter_bar/lib/__tests__/uniqFilters.js diff --git a/src/ui/public/filter_bar/lib/mapFilter.js b/src/ui/public/filter_bar/lib/mapFilter.js index 8bf2a2d5cf430..ebf6bb31ae115 100644 --- a/src/ui/public/filter_bar/lib/mapFilter.js +++ b/src/ui/public/filter_bar/lib/mapFilter.js @@ -21,6 +21,7 @@ define(function (require) { // that either handles the mapping operation or not // and add it here. ProTip: These are executed in order listed var mappers = [ + Private(require('./mapMatchAll')), Private(require('./mapTerms')), Private(require('./mapRange')), Private(require('./mapExists')), diff --git a/src/ui/public/filter_bar/lib/mapMatchAll.js b/src/ui/public/filter_bar/lib/mapMatchAll.js new file mode 100644 index 0000000000000..c062fa69e0dc3 --- /dev/null +++ b/src/ui/public/filter_bar/lib/mapMatchAll.js @@ -0,0 +1,12 @@ +define(function (require) { + return function mapMatchAllProvider(Promise) { + return function (filter) { + if (filter.match_all) { + const key = filter.meta.field; + const value = filter.meta.formattedValue || 'all'; + return Promise.resolve({ key, value }); + } + return Promise.reject(filter); + }; + }; +}); diff --git a/src/ui/public/filter_manager/__tests__/lib/phrase.js b/src/ui/public/filter_manager/lib/__tests__/phrase.js similarity index 100% rename from src/ui/public/filter_manager/__tests__/lib/phrase.js rename to src/ui/public/filter_manager/lib/__tests__/phrase.js diff --git a/src/ui/public/filter_manager/__tests__/lib/query.js b/src/ui/public/filter_manager/lib/__tests__/query.js similarity index 100% rename from src/ui/public/filter_manager/__tests__/lib/query.js rename to src/ui/public/filter_manager/lib/__tests__/query.js diff --git a/src/ui/public/filter_manager/__tests__/lib/range.js b/src/ui/public/filter_manager/lib/__tests__/range.js similarity index 58% rename from src/ui/public/filter_manager/__tests__/lib/range.js rename to src/ui/public/filter_manager/lib/__tests__/range.js index 7de6608c22bb7..8145a9a3a0212 100644 --- a/src/ui/public/filter_manager/__tests__/lib/range.js +++ b/src/ui/public/filter_manager/lib/__tests__/range.js @@ -63,5 +63,53 @@ describe('Filter Manager', function () { }); }); + + describe('when given params where one side is infinite', function () { + let filter; + beforeEach(function () { + filter = fn(indexPattern.fields.byName['script number'], { gte: 0, lt: Infinity }, indexPattern); + }); + + describe('returned filter', function () { + it('is a script filter', function () { + expect(filter).to.have.property('script'); + }); + + it('contain a param for the finite side', function () { + expect(filter.script.params).to.have.property('gte', 0); + }); + + it('does not contain a param for the infinite side', function () { + expect(filter.script.params).not.to.have.property('lt'); + }); + + it('does not contain a script condition for the infinite side', function () { + const script = indexPattern.fields.byName['script number'].script; + expect(filter.script.script).to.equal(`(${script})>=gte`); + }); + }); + }); + + describe('when given params where both sides are infinite', function () { + let filter; + beforeEach(function () { + filter = fn(indexPattern.fields.byName['script number'], { gte: -Infinity, lt: Infinity }, indexPattern); + }); + + describe('returned filter', function () { + it('is a match_all filter', function () { + expect(filter).not.to.have.property('script'); + expect(filter).to.have.property('match_all'); + }); + + it('does not contain params', function () { + expect(filter).not.to.have.property('params'); + }); + + it('meta field is set to field name', function () { + expect(filter.meta.field).to.equal('script number'); + }); + }); + }); }); }); diff --git a/src/ui/public/filter_manager/lib/range.js b/src/ui/public/filter_manager/lib/range.js index 759518041e64a..4d374a51d3208 100644 --- a/src/ui/public/filter_manager/lib/range.js +++ b/src/ui/public/filter_manager/lib/range.js @@ -1,27 +1,44 @@ define(function (require) { - var _ = require('lodash'); + const _ = require('lodash'); + const OPERANDS_IN_RANGE = 2; + return function buildRangeFilter(field, params, indexPattern, formattedValue) { - var filter = { meta: { index: indexPattern.id } }; + const filter = { meta: { index: indexPattern.id } }; if (formattedValue) filter.meta.formattedValue = formattedValue; params = _.clone(params); - if (params.gte && params.gt) throw new Error('gte and gt are mutually exclusive'); - if (params.lte && params.lt) throw new Error('lte and lt are mutually exclusive'); + if ('gte' in params && 'gt' in params) throw new Error('gte and gt are mutually exclusive'); + if ('lte' in params && 'lt' in params) throw new Error('lte and lt are mutually exclusive'); + + const totalInfinite = ['gt', 'lt'].reduce((totalInfinite, op) => { + const key = op in params ? op : `${op}e`; + const isInfinite = Math.abs(params[key]) === Infinity; + + if (isInfinite) { + totalInfinite++; + delete params[key]; + } - if (field.scripted) { - var operators = { + return totalInfinite; + }, 0); + + if (totalInfinite === OPERANDS_IN_RANGE) { + filter.match_all = {}; + filter.meta.field = field.name; + } else if (field.scripted) { + const operators = { gt: '>', gte: '>=', lte: '<=', lt: '<', }; - var script = _.map(params, function (val, key) { + const script = _.map(params, function (val, key) { return '(' + field.script + ')' + operators[key] + key; }).join(' && '); - var value = _.map(params, function (val, key) { + const value = _.map(params, function (val, key) { return operators[key] + field.format.convert(val); }).join(' '); @@ -32,6 +49,7 @@ define(function (require) { filter.range = {}; filter.range[field.name] = params; } + return filter; }; });