From 27e23cce9c51892ca62197a423eebdbc1744a621 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 7 Apr 2013 17:37:31 -0600 Subject: [PATCH] Convenient factories for logical filters --- src/ol/filter/logicalfilter.js | 37 ++++++++++++++++++ test/spec/ol/filter/logicalfilter.test.js | 47 +++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/src/ol/filter/logicalfilter.js b/src/ol/filter/logicalfilter.js index cd5cc66d9e..3ba8dd932c 100644 --- a/src/ol/filter/logicalfilter.js +++ b/src/ol/filter/logicalfilter.js @@ -1,5 +1,8 @@ goog.provide('ol.filter.Logical'); goog.provide('ol.filter.LogicalOperator'); +goog.provide('ol.filter.and'); +goog.provide('ol.filter.not'); +goog.provide('ol.filter.or'); goog.require('goog.asserts'); goog.require('ol.filter.Filter'); @@ -79,3 +82,37 @@ ol.filter.LogicalOperator = { OR: '||', NOT: '!' }; + + +/** + * Create a filter that evaluates to true if any of the provided filters + * evaluate to true. + * @param {...ol.filter.Filter} var_filters Filters. + * @return {ol.filter.Logical} A logical filter. + */ +ol.filter.and = function(var_filters) { + var filters = Array.prototype.slice.call(arguments); + return new ol.filter.Logical(filters, ol.filter.LogicalOperator.AND); +}; + + +/** + * Create a new filter that is the logical compliment of another. + * @param {ol.filter.Filter} filter The filter to negate. + * @return {ol.filter.Logical} A logical filter. + */ +ol.filter.not = function(filter) { + return new ol.filter.Logical([filter], ol.filter.LogicalOperator.NOT); +}; + + +/** + * Create a filter that evaluates to true if all of the provided filters + * evaluate to true. + * @param {...ol.filter.Filter} var_filters Filters. + * @return {ol.filter.Logical} A logical filter. + */ +ol.filter.or = function(var_filters) { + var filters = Array.prototype.slice.call(arguments); + return new ol.filter.Logical(filters, ol.filter.LogicalOperator.OR); +}; diff --git a/test/spec/ol/filter/logicalfilter.test.js b/test/spec/ol/filter/logicalfilter.test.js index 61eadbb1ee..970c0d0c10 100644 --- a/test/spec/ol/filter/logicalfilter.test.js +++ b/test/spec/ol/filter/logicalfilter.test.js @@ -91,7 +91,54 @@ describe('ol.filter.Logical', function() { }); +describe('ol.filter.and', function() { + it('creates the a logical AND filter', function() { + var a = new ol.filter.Filter(); + var b = new ol.filter.Filter(); + var c = new ol.filter.Filter(); + var and = ol.filter.and(a, b, c); + expect(and).to.be.a(ol.filter.Logical); + expect(and.operator).to.be(ol.filter.LogicalOperator.AND); + var filters = and.getFilters(); + expect(filters[0]).to.be(a); + expect(filters[1]).to.be(b); + expect(filters[2]).to.be(c); + }); +}); + +describe('ol.filter.not', function() { + it('creates the logical compliment of another filter', function() { + var include = new ol.filter.Filter(function() {return true;}); + var notInclude = ol.filter.not(include); + expect(notInclude).to.be.a(ol.filter.Logical); + expect(notInclude.applies()).to.be(false); + + var exclude = new ol.filter.Filter(function() {return false;}); + var notExclude = ol.filter.not(exclude); + expect(notExclude).to.be.a(ol.filter.Logical); + expect(notExclude.applies()).to.be(true); + }); +}); + +describe('ol.filter.or', function() { + it('creates the a logical OR filter', function() { + var a = new ol.filter.Filter(); + var b = new ol.filter.Filter(); + var c = new ol.filter.Filter(); + var and = ol.filter.or(a, b, c); + expect(and).to.be.a(ol.filter.Logical); + expect(and.operator).to.be(ol.filter.LogicalOperator.OR); + var filters = and.getFilters(); + expect(filters[0]).to.be(a); + expect(filters[1]).to.be(b); + expect(filters[2]).to.be(c); + }); +}); + goog.require('ol.Feature'); goog.require('ol.filter.Filter'); goog.require('ol.filter.Logical'); goog.require('ol.filter.LogicalOperator'); +goog.require('ol.filter.and'); +goog.require('ol.filter.not'); +goog.require('ol.filter.or');