diff --git a/doc/errors/index.md b/doc/errors/index.md index cfbe3fe3be..5da35ba9ff 100644 --- a/doc/errors/index.md +++ b/doc/errors/index.md @@ -216,3 +216,7 @@ The `{-y}` placeholder requires a tile grid with extent. ### 56 `mapBrowserEvent` must originate from a pointer event. + +### 57 + +At least 2 conditions are required. diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index bf48039838..cbb16c40da 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -19,28 +19,28 @@ goog.require('ol.format.filter.Within'); /** - * Create a logical `` operator between two filter conditions. + * Create a logical `` operator between two or more filter conditions. * - * @param {!ol.format.filter.Filter} conditionA First filter condition. - * @param {!ol.format.filter.Filter} conditionB Second filter condition. + * @param {...ol.format.filter.Filter} conditions Filter conditions. * @returns {!ol.format.filter.And} `` operator. * @api */ -ol.format.filter.and = function(conditionA, conditionB) { - return new ol.format.filter.And(conditionA, conditionB); +ol.format.filter.and = function(conditions) { + var params = [null].concat(Array.prototype.slice.call(arguments)); + return new (Function.prototype.bind.apply(ol.format.filter.And, params)); }; /** - * Create a logical `` operator between two filter conditions. + * Create a logical `` operator between two or more filter conditions. * - * @param {!ol.format.filter.Filter} conditionA First filter condition. - * @param {!ol.format.filter.Filter} conditionB Second filter condition. + * @param {...ol.format.filter.Filter} conditions Filter conditions. * @returns {!ol.format.filter.Or} `` operator. * @api */ -ol.format.filter.or = function(conditionA, conditionB) { - return new ol.format.filter.Or(conditionA, conditionB); +ol.format.filter.or = function(conditions) { + var params = [null].concat(Array.prototype.slice.call(arguments)); + return new (Function.prototype.bind.apply(ol.format.filter.Or, params)); }; diff --git a/src/ol/format/filter/and.js b/src/ol/format/filter/and.js index 7963ba59cd..aa173c2aa9 100644 --- a/src/ol/format/filter/and.js +++ b/src/ol/format/filter/and.js @@ -1,19 +1,19 @@ goog.provide('ol.format.filter.And'); goog.require('ol'); -goog.require('ol.format.filter.LogicalBinary'); +goog.require('ol.format.filter.LogicalNary'); /** * @classdesc - * Represents a logical `` operator between two filter conditions. + * Represents a logical `` operator between two or more filter conditions. * * @constructor - * @param {!ol.format.filter.Filter} conditionA First filter condition. - * @param {!ol.format.filter.Filter} conditionB Second filter condition. - * @extends {ol.format.filter.LogicalBinary} + * @param {...ol.format.filter.Filter} conditions Conditions. + * @extends {ol.format.filter.LogicalNary} * @api */ -ol.format.filter.And = function(conditionA, conditionB) { - ol.format.filter.LogicalBinary.call(this, 'And', conditionA, conditionB); +ol.format.filter.And = function(conditions) { + var params = ['And'].concat(Array.prototype.slice.call(arguments)); + ol.format.filter.LogicalNary.apply(this, params); }; -ol.inherits(ol.format.filter.And, ol.format.filter.LogicalBinary); +ol.inherits(ol.format.filter.And, ol.format.filter.LogicalNary); diff --git a/src/ol/format/filter/logicalbinary.js b/src/ol/format/filter/logicalbinary.js deleted file mode 100644 index 9596e2b423..0000000000 --- a/src/ol/format/filter/logicalbinary.js +++ /dev/null @@ -1,35 +0,0 @@ -goog.provide('ol.format.filter.LogicalBinary'); - -goog.require('ol'); -goog.require('ol.format.filter.Logical'); - - -/** - * @classdesc - * Abstract class; normally only used for creating subclasses and not instantiated in apps. - * Base class for WFS GetFeature binary logical filters. - * - * @constructor - * @param {!string} tagName The XML tag name for this filter. - * @param {!ol.format.filter.Filter} conditionA First filter condition. - * @param {!ol.format.filter.Filter} conditionB Second filter condition. - * @extends {ol.format.filter.Logical} - */ -ol.format.filter.LogicalBinary = function(tagName, conditionA, conditionB) { - - ol.format.filter.Logical.call(this, tagName); - - /** - * @public - * @type {!ol.format.filter.Filter} - */ - this.conditionA = conditionA; - - /** - * @public - * @type {!ol.format.filter.Filter} - */ - this.conditionB = conditionB; - -}; -ol.inherits(ol.format.filter.LogicalBinary, ol.format.filter.Logical); diff --git a/src/ol/format/filter/logicalnary.js b/src/ol/format/filter/logicalnary.js new file mode 100644 index 0000000000..edd295d57a --- /dev/null +++ b/src/ol/format/filter/logicalnary.js @@ -0,0 +1,28 @@ +goog.provide('ol.format.filter.LogicalNary'); + +goog.require('ol'); +goog.require('ol.format.filter.Logical'); + + +/** + * @classdesc + * Abstract class; normally only used for creating subclasses and not instantiated in apps. + * Base class for WFS GetFeature n-ary logical filters. + * + * @constructor + * @param {!string} tagName The XML tag name for this filter. + * @param {...ol.format.filter.Filter} conditions Conditions. + * @extends {ol.format.filter.Logical} + */ +ol.format.filter.LogicalNary = function(tagName, conditions) { + + ol.format.filter.Logical.call(this, tagName); + + /** + * @public + * @type {Array.} + */ + this.conditions = Array.prototype.slice.call(arguments, 1); + ol.asserts.assert(this.conditions.length >= 2, 57); // At least 2 conditions are required. +}; +ol.inherits(ol.format.filter.LogicalNary, ol.format.filter.Logical); diff --git a/src/ol/format/filter/or.js b/src/ol/format/filter/or.js index 919a2f39db..01f04600c1 100644 --- a/src/ol/format/filter/or.js +++ b/src/ol/format/filter/or.js @@ -1,20 +1,20 @@ goog.provide('ol.format.filter.Or'); goog.require('ol'); -goog.require('ol.format.filter.LogicalBinary'); +goog.require('ol.format.filter.LogicalNary'); /** * @classdesc - * Represents a logical `` operator between two filter conditions. + * Represents a logical `` operator between two ore more filter conditions. * * @constructor - * @param {!ol.format.filter.Filter} conditionA First filter condition. - * @param {!ol.format.filter.Filter} conditionB Second filter condition. - * @extends {ol.format.filter.LogicalBinary} + * @param {...ol.format.filter.Filter} conditions Conditions. + * @extends {ol.format.filter.LogicalNary} * @api */ -ol.format.filter.Or = function(conditionA, conditionB) { - ol.format.filter.LogicalBinary.call(this, 'Or', conditionA, conditionB); +ol.format.filter.Or = function(conditions) { + var params = ['Or'].concat(Array.prototype.slice.call(arguments)); + ol.format.filter.LogicalNary.apply(this, params); }; -ol.inherits(ol.format.filter.Or, ol.format.filter.LogicalBinary); +ol.inherits(ol.format.filter.Or, ol.format.filter.LogicalNary); diff --git a/src/ol/format/wfs.js b/src/ol/format/wfs.js index 8a0a006142..5e11bf818b 100644 --- a/src/ol/format/wfs.js +++ b/src/ol/format/wfs.js @@ -599,23 +599,19 @@ ol.format.WFS.writeWithinFilter_ = function(node, filter, objectStack) { /** * @param {Node} node Node. - * @param {ol.format.filter.LogicalBinary} filter Filter. + * @param {ol.format.filter.LogicalNary} filter Filter. * @param {Array.<*>} objectStack Node stack. * @private */ ol.format.WFS.writeLogicalFilter_ = function(node, filter, objectStack) { /** @type {ol.XmlNodeStackItem} */ var item = {node: node}; - var conditionA = filter.conditionA; - ol.xml.pushSerializeAndPop(item, - ol.format.WFS.GETFEATURE_SERIALIZERS_, - ol.xml.makeSimpleNodeFactory(conditionA.getTagName()), - [conditionA], objectStack); - var conditionB = filter.conditionB; - ol.xml.pushSerializeAndPop(item, - ol.format.WFS.GETFEATURE_SERIALIZERS_, - ol.xml.makeSimpleNodeFactory(conditionB.getTagName()), - [conditionB], objectStack); + filter.conditions.forEach(function(condition) { + ol.xml.pushSerializeAndPop(item, + ol.format.WFS.GETFEATURE_SERIALIZERS_, + ol.xml.makeSimpleNodeFactory(condition.getTagName()), + [condition], objectStack); + }); }; diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index a2c888b8b0..c0cd6ed5be 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -492,6 +492,10 @@ describe('ol.format.WFS', function() { ' 3 4' + ' ' + ' ' + + ' ' + + ' population' + + ' 2000000' + + ' ' + ' ' + ' ' + ''; @@ -502,7 +506,8 @@ describe('ol.format.WFS', function() { featureTypes: ['states'], filter: ol.format.filter.and( ol.format.filter.equalTo('name', 'New York'), - ol.format.filter.bbox('the_geom', [1, 2, 3, 4], 'urn:ogc:def:crs:EPSG::4326') + ol.format.filter.bbox('the_geom', [1, 2, 3, 4], 'urn:ogc:def:crs:EPSG::4326'), + ol.format.filter.greaterThan('population', 2000000) ) }); expect(serialized.firstElementChild).to.xmleql(ol.xml.parse(text));