diff --git a/lib/OpenLayers/Format/CQL.js b/lib/OpenLayers/Format/CQL.js index 38d92e7f3f..b8260af083 100644 --- a/lib/OpenLayers/Format/CQL.js +++ b/lib/OpenLayers/Format/CQL.js @@ -28,6 +28,7 @@ OpenLayers.Format.CQL = (function() { patterns = { PROPERTY: /^[_a-zA-Z]\w*/, COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i, + IS_NULL: /^IS NULL/i, COMMA: /^,/, LOGICAL: /^(AND|OR)/i, VALUE: /^('\w+'|\d+(\.\d*)?|\.\d+)/, @@ -66,8 +67,9 @@ OpenLayers.Format.CQL = (function() { follows = { LPAREN: ['GEOMETRY', 'SPATIAL', 'PROPERTY', 'VALUE', 'LPAREN'], RPAREN: ['NOT', 'LOGICAL', 'END', 'RPAREN'], - PROPERTY: ['COMPARISON', 'BETWEEN', 'COMMA'], + PROPERTY: ['COMPARISON', 'BETWEEN', 'COMMA', 'IS_NULL'], BETWEEN: ['VALUE'], + IS_NULL: ['END'], COMPARISON: ['VALUE'], COMMA: ['GEOMETRY', 'VALUE', 'PROPERTY'], VALUE: ['LOGICAL', 'COMMA', 'RPAREN', 'END'], @@ -85,7 +87,8 @@ OpenLayers.Format.CQL = (function() { '>': OpenLayers.Filter.Comparison.GREATER_THAN, '>=': OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO, 'LIKE': OpenLayers.Filter.Comparison.LIKE, - 'BETWEEN': OpenLayers.Filter.Comparison.BETWEEN + 'BETWEEN': OpenLayers.Filter.Comparison.BETWEEN, + 'IS NULL': OpenLayers.Filter.Comparison.IS_NULL }, operatorReverse = {}, @@ -181,6 +184,7 @@ OpenLayers.Format.CQL = (function() { break; case "COMPARISON": case "BETWEEN": + case "IS_NULL": case "LOGICAL": var p = precedence[tok.type]; @@ -257,6 +261,12 @@ OpenLayers.Format.CQL = (function() { value: value, type: operators[tok.text.toUpperCase()] }); + case "IS_NULL": + var property = buildTree(); + return new OpenLayers.Filter.Comparison({ + property: property, + type: operators[tok.text.toUpperCase()] + }); case "VALUE": if ((/^'.*'$/).test(tok.text)) { return tok.text.substr(1, tok.text.length - 2); @@ -418,10 +428,10 @@ OpenLayers.Format.CQL = (function() { this.write(filter.lowerBoundary) + " AND " + this.write(filter.upperBoundary); } else { - - return filter.property + + return (filter.value !== null) ? filter.property + " " + operatorReverse[filter.type] + " " + - this.write(filter.value); + this.write(filter.value) : filter.property + + " " + operatorReverse[filter.type]; } case undefined: if (typeof filter === "string") { diff --git a/tests/Format/CQL.html b/tests/Format/CQL.html index a1c65ee0d6..63a012c294 100644 --- a/tests/Format/CQL.html +++ b/tests/Format/CQL.html @@ -281,6 +281,20 @@ function test_BETWEEN(t) { } +function test_NULL(t) { + t.plan(3); + var filter = new OpenLayers.Filter.Comparison({ + property: "GEOM", + type: "NULL" + }); + var format = new OpenLayers.Format.CQL(); + var str = 'GEOM IS NULL'; + t.eq(format.write(filter), str, "NULL filter written correctly"); + filter = format.read(str); + t.eq(filter.type, OpenLayers.Filter.Comparison.IS_NULL, "filter type is correctly parsed"); + t.eq(filter.property, "GEOM", "filter property is correctly parsed"); +} +