From a663d8fcaeaa857eb63d9bdf415d9e6b25aa180e Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 17 Jun 2013 17:30:44 -0600 Subject: [PATCH] Accept an expression string for rule filter --- examples/style-rules.js | 13 +++---------- src/objectliterals.jsdoc | 2 +- src/ol/expression.jsdoc | 3 +++ src/ol/style/rule.js | 23 +++++++++++++++++++---- test/spec/ol/style/rule.test.js | 6 +++--- test/spec/ol/style/style.test.js | 5 +---- 6 files changed, 30 insertions(+), 22 deletions(-) create mode 100644 src/ol/expression.jsdoc diff --git a/examples/style-rules.js b/examples/style-rules.js index 82d14b86e3..07a3a35a5c 100644 --- a/examples/style-rules.js +++ b/examples/style-rules.js @@ -3,9 +3,6 @@ goog.require('ol.RendererHint'); goog.require('ol.View2D'); goog.require('ol.control.defaults'); goog.require('ol.expression'); -goog.require('ol.filter.Filter'); -goog.require('ol.filter.Geometry'); -goog.require('ol.geom.GeometryType'); goog.require('ol.layer.Vector'); goog.require('ol.parser.GeoJSON'); goog.require('ol.proj'); @@ -19,9 +16,7 @@ goog.require('ol.style.Text'); var style = new ol.style.Style({rules: [ new ol.style.Rule({ - filter: new ol.filter.Filter(function(feature) { - return feature.get('where') == 'outer'; - }), + filter: 'where == "outer"', symbolizers: [ new ol.style.Line({ strokeColor: ol.expression.parse('color'), @@ -31,9 +26,7 @@ var style = new ol.style.Style({rules: [ ] }), new ol.style.Rule({ - filter: new ol.filter.Filter(function(feature) { - return feature.get('where') == 'inner'; - }), + filter: 'where == "inner"', symbolizers: [ new ol.style.Line({ strokeColor: '#013', @@ -48,7 +41,7 @@ var style = new ol.style.Style({rules: [ ] }), new ol.style.Rule({ - filter: new ol.filter.Geometry(ol.geom.GeometryType.POINT), + filter: 'geometryType("point")', symbolizers: [ new ol.style.Shape({ size: 40, diff --git a/src/objectliterals.jsdoc b/src/objectliterals.jsdoc index b7b5a2e460..0f5f852fee 100644 --- a/src/objectliterals.jsdoc +++ b/src/objectliterals.jsdoc @@ -552,7 +552,7 @@ /** * @typedef {Object} ol.style.RuleOptions - * @property {ol.filter.Filter|undefined} filter Filter. + * @property {ol.expression.Expression|string|undefined} filter Filter. * @property {Array.|undefined} symbolizers Symbolizers. */ diff --git a/src/ol/expression.jsdoc b/src/ol/expression.jsdoc new file mode 100644 index 0000000000..93f3016f63 --- /dev/null +++ b/src/ol/expression.jsdoc @@ -0,0 +1,3 @@ +/** + * @namespace ol.expression + */ diff --git a/src/ol/style/rule.js b/src/ol/style/rule.js index 0234fd9540..4410fdfc15 100644 --- a/src/ol/style/rule.js +++ b/src/ol/style/rule.js @@ -1,7 +1,10 @@ goog.provide('ol.style.Rule'); +goog.require('goog.asserts'); + goog.require('ol.Feature'); -goog.require('ol.filter.Filter'); +goog.require('ol.expression'); +goog.require('ol.expression.Expression'); goog.require('ol.style.Symbolizer'); @@ -12,11 +15,22 @@ goog.require('ol.style.Symbolizer'); */ ol.style.Rule = function(options) { + + var filter = null; + if (goog.isDef(options.filter)) { + if (goog.isString(options.filter)) { + filter = ol.expression.parse(options.filter); + } else { + goog.asserts.assert(options.filter instanceof ol.expression.Expression); + filter = options.filter; + } + } + /** - * @type {ol.filter.Filter} + * @type {ol.expression.Expression} * @private */ - this.filter_ = goog.isDef(options.filter) ? options.filter : null; + this.filter_ = filter; /** * @type {Array.} @@ -33,7 +47,8 @@ ol.style.Rule = function(options) { * @return {boolean} Does the rule apply to the feature? */ ol.style.Rule.prototype.applies = function(feature) { - return goog.isNull(this.filter_) ? true : this.filter_.applies(feature); + return goog.isNull(this.filter_) ? + true : !!ol.expression.evaluateFeature(this.filter_, feature); }; diff --git a/test/spec/ol/style/rule.test.js b/test/spec/ol/style/rule.test.js index d4649eda6c..789d9de889 100644 --- a/test/spec/ol/style/rule.test.js +++ b/test/spec/ol/style/rule.test.js @@ -13,14 +13,14 @@ describe('ol.style.Rule', function() { it('returns false when the rule does not apply', function() { rule = new ol.style.Rule({ - filter: new ol.filter.Filter(function() { return false; }) + filter: new ol.expression.Literal(false) }); expect(rule.applies(feature)).to.be(false); }); it('returns true when the rule applies', function() { rule = new ol.style.Rule({ - filter: new ol.filter.Filter(function() { return true; }) + filter: new ol.expression.Literal(true) }); expect(rule.applies(feature)).to.be(true); }); @@ -29,5 +29,5 @@ describe('ol.style.Rule', function() { }); goog.require('ol.Feature'); -goog.require('ol.filter.Filter'); +goog.require('ol.expression.Literal'); goog.require('ol.style.Rule'); diff --git a/test/spec/ol/style/style.test.js b/test/spec/ol/style/style.test.js index 685c09f3f3..6a35416548 100644 --- a/test/spec/ol/style/style.test.js +++ b/test/spec/ol/style/style.test.js @@ -9,9 +9,7 @@ describe('ol.style.Style', function() { var style = new ol.style.Style({ rules: [ new ol.style.Rule({ - filter: new ol.filter.Filter(function(feature) { - return feature.get('foo') == 'bar'; - }), + filter: 'foo == "bar"', symbolizers: [ new ol.style.Shape({ size: 4, @@ -66,7 +64,6 @@ goog.require('ol.Feature'); goog.require('ol.geom.LineString'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); -goog.require('ol.filter.Filter'); goog.require('ol.style.Rule'); goog.require('ol.style.Shape'); goog.require('ol.style.ShapeLiteral');