From d5013d6df52b7e34e1e9b5faded3cddd66c15960 Mon Sep 17 00:00:00 2001 From: Matt Walker Date: Fri, 12 Oct 2012 22:40:56 +0100 Subject: [PATCH] Added support for PropertyIsNull filter. Added a simple comparison and read/write for PropertyIsNull encoded as XML including tests for each. --- lib/OpenLayers/Filter/Comparison.js | 8 +++++- lib/OpenLayers/Format/Filter/v1.js | 13 ++++++++++ tests/Filter/Comparison.html | 28 +++++++++++++++++++++ tests/Format/Filter/v1.html | 38 +++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 1 deletion(-) diff --git a/lib/OpenLayers/Filter/Comparison.js b/lib/OpenLayers/Filter/Comparison.js index c57c868aea..bb40900995 100644 --- a/lib/OpenLayers/Filter/Comparison.js +++ b/lib/OpenLayers/Filter/Comparison.js @@ -26,7 +26,8 @@ OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, { * - OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; * - OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; * - OpenLayers.Filter.Comparison.BETWEEN = ".."; - * - OpenLayers.Filter.Comparison.LIKE = "~"; + * - OpenLayers.Filter.Comparison.LIKE = "~"; + * - OpenLayers.Filter.Comparison.IS_NULL = "NULL"; */ type: null, @@ -154,6 +155,10 @@ OpenLayers.Filter.Comparison = OpenLayers.Class(OpenLayers.Filter, { var regexp = new RegExp(this.value, "gi"); result = regexp.test(got); break; + case OpenLayers.Filter.Comparison.IS_NULL: + var got = context[this.property]; + result = (got === null || got === undefined); + break; } return result; }, @@ -260,3 +265,4 @@ OpenLayers.Filter.Comparison.LESS_THAN_OR_EQUAL_TO = "<="; OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO = ">="; OpenLayers.Filter.Comparison.BETWEEN = ".."; OpenLayers.Filter.Comparison.LIKE = "~"; +OpenLayers.Filter.Comparison.IS_NULL = "NULL"; diff --git a/lib/OpenLayers/Format/Filter/v1.js b/lib/OpenLayers/Format/Filter/v1.js index 4798c9b3ae..bd7cc32f09 100644 --- a/lib/OpenLayers/Format/Filter/v1.js +++ b/lib/OpenLayers/Format/Filter/v1.js @@ -212,6 +212,13 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, { "Function": function(node, obj) { //TODO write decoder for it return; + }, + "PropertyIsNull": function(node, obj) { + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL + }); + this.readChildNodes(node, filter); + obj.filters.push(filter); } } }, @@ -448,6 +455,11 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, { this.writeOgcExpression(params[i], node); } return node; + }, + "PropertyIsNull": function(filter) { + var node = this.createElementNSPlus("ogc:PropertyIsNull"); + this.writeNode("PropertyName", filter, node); + return node; } } }, @@ -480,6 +492,7 @@ OpenLayers.Format.Filter.v1 = OpenLayers.Class(OpenLayers.Format.XML, { ">=": "PropertyIsGreaterThanOrEqualTo", "..": "PropertyIsBetween", "~": "PropertyIsLike", + "NULL": "PropertyIsNull", "BBOX": "BBOX", "DWITHIN": "DWITHIN", "WITHIN": "WITHIN", diff --git a/tests/Filter/Comparison.html b/tests/Filter/Comparison.html index a0c2da35be..5dd1cc1bf2 100644 --- a/tests/Filter/Comparison.html +++ b/tests/Filter/Comparison.html @@ -164,6 +164,34 @@ }), context: {prop: "FOO"}, expect: false + }, { + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL, + property: "prop" + }), + context: {prop: null}, + expect: true + }, { + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL, + property: "prop" + }), + context: {prop: undefined}, + expect: true + }, { + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL, + property: "prop" + }), + context: {prop: "foo"}, + expect: false + }, { + filter: new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL, + property: "prop" + }), + context: {prop: 0}, + expect: false }]; t.plan(cases.length); diff --git a/tests/Format/Filter/v1.html b/tests/Format/Filter/v1.html index b109b31325..ab43d8cb51 100644 --- a/tests/Format/Filter/v1.html +++ b/tests/Format/Filter/v1.html @@ -51,6 +51,44 @@ "[1] record correct upper boundary value"); } + function test_PropertyIsNull(t) { + + t.plan(6); + + var test_xml, format, xml; + + format = new OpenLayers.Format.Filter.v1(); + xml = new OpenLayers.Format.XML(); + + test_xml = + '' + + '' + + 'prop' + + '' + + ''; + + var filter = format.read(xml.read(test_xml).documentElement); + t.eq(filter.type, OpenLayers.Filter.Comparison.IS_NULL, + "[0] read correct type"); + console.log(filter); + t.eq(filter.property, 'prop', + "[0] record correct property name"); + + var filter = new OpenLayers.Filter.Comparison({ + type: OpenLayers.Filter.Comparison.IS_NULL, + property: "prop" + }); + element = format.write(filter); + t.eq(element.firstChild.nodeName, 'ogc:PropertyIsNull', + "[1] write correct filter node name"); + t.eq(element.firstChild.childNodes.length, 1, + "[1] write correct number of filter arguments"); + t.eq(element.firstChild.firstChild.nodeName, 'ogc:PropertyName', + "[1] write correct filter argument name"); + t.eq(element.firstChild.firstChild.textContent, 'prop', + "[1] write correct filter argument value"); + + } function test_Intersects(t) {