From 5b9137b59288fbef0d235ea2444bb7e4731d8707 Mon Sep 17 00:00:00 2001 From: Matthew Bargar Date: Tue, 22 Nov 2016 12:38:59 -0500 Subject: [PATCH] Only include necessary comparators and add tests --- src/ui/public/filter_manager/lib/__tests__/range.js | 10 ++++++++++ src/ui/public/filter_manager/lib/range.js | 13 ++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/ui/public/filter_manager/lib/__tests__/range.js b/src/ui/public/filter_manager/lib/__tests__/range.js index 94bee0426f4b6..dc5edd687293b 100644 --- a/src/ui/public/filter_manager/lib/__tests__/range.js +++ b/src/ui/public/filter_manager/lib/__tests__/range.js @@ -43,6 +43,16 @@ describe('Filter Manager', function () { expect(fn(indexPattern.fields.byName['script number'], {gte: 1, lte: 3}, indexPattern)).to.eql(expected); }); + it('should wrap painless scripts in comparator lambdas', function () { + const expected = `boolean gte(Supplier s, def v) {return s.get() >= v} ` + + `boolean lte(Supplier s, def v) {return s.get() <= v}` + + `gte(() -> { ${indexPattern.fields.byName['script date'].script} }, params.gte) && ` + + `lte(() -> { ${indexPattern.fields.byName['script date'].script} }, params.lte)`; + + const inlineScript = fn(indexPattern.fields.byName['script date'], {gte: 1, lte: 3}, indexPattern).script.script.inline; + expect(inlineScript).to.be(expected); + }); + it('should throw an error when gte and gt, or lte and lt are both passed', function () { expect(function () { fn(indexPattern.fields.byName['script number'], {gte: 1, gt: 3}, indexPattern); diff --git a/src/ui/public/filter_manager/lib/range.js b/src/ui/public/filter_manager/lib/range.js index c3c69145f7ac4..a5463b86a03d7 100644 --- a/src/ui/public/filter_manager/lib/range.js +++ b/src/ui/public/filter_manager/lib/range.js @@ -32,6 +32,12 @@ export default function buildRangeFilter(field, params, indexPattern, formattedV 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 knownParams = _.pick(params, (val, key) => { return key in operators; }); let script = _.map(knownParams, function (val, key) { @@ -40,16 +46,13 @@ export default function buildRangeFilter(field, params, indexPattern, formattedV // We must wrap painless scripts in a lambda in case they're more than a simple expression if (field.lang === 'painless') { - const comparators = `boolean gt(Supplier s, def v) {return s.get() > v;} - boolean gte(Supplier s, def v) {return s.get() >= v;} - boolean lte(Supplier s, def v) {return s.get() <= v;} - boolean lt(Supplier s, def v) {return s.get() < v;}`; + const currentComparators = _.reduce(knownParams, (acc, val, key) => acc.concat(comparators[key]), []).join(' '); const comparisons = _.map(knownParams, function (val, key) { return `${key}(() -> { ${field.script} }, params.${key})`; }).join(' && '); - script = `${comparators}${comparisons}`; + script = `${currentComparators}${comparisons}`; } const value = _.map(knownParams, function (val, key) {