Added support for PropertyIsNull filter.

Added a simple comparison and read/write for PropertyIsNull
encoded as XML including tests for each.
This commit is contained in:
Matt Walker
2012-10-12 22:40:56 +01:00
parent 0b3f582e10
commit d5013d6df5
4 changed files with 86 additions and 1 deletions

View File

@@ -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";

View File

@@ -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",

View File

@@ -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);

View File

@@ -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 =
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsNull>' +
'<ogc:PropertyName>prop</ogc:PropertyName>' +
'</ogc:PropertyIsNull>' +
'</ogc:Filter>';
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) {