Merge pull request #744 from bartvde/cqlnull

add support for OpenLayers.Filter.Comparison.IS_NULL in CQL format (thanks @elemoine for the review)
This commit is contained in:
Bart van den Eijnden
2012-11-05 06:42:38 -08:00
2 changed files with 29 additions and 5 deletions

View File

@@ -28,6 +28,7 @@ OpenLayers.Format.CQL = (function() {
patterns = { patterns = {
PROPERTY: /^[_a-zA-Z]\w*/, PROPERTY: /^[_a-zA-Z]\w*/,
COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i, COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i,
IS_NULL: /^IS NULL/i,
COMMA: /^,/, COMMA: /^,/,
LOGICAL: /^(AND|OR)/i, LOGICAL: /^(AND|OR)/i,
VALUE: /^('([^']|'')*'|\d+(\.\d*)?|\.\d+)/, VALUE: /^('([^']|'')*'|\d+(\.\d*)?|\.\d+)/,
@@ -66,8 +67,9 @@ OpenLayers.Format.CQL = (function() {
follows = { follows = {
LPAREN: ['GEOMETRY', 'SPATIAL', 'PROPERTY', 'VALUE', 'LPAREN'], LPAREN: ['GEOMETRY', 'SPATIAL', 'PROPERTY', 'VALUE', 'LPAREN'],
RPAREN: ['NOT', 'LOGICAL', 'END', 'RPAREN'], RPAREN: ['NOT', 'LOGICAL', 'END', 'RPAREN'],
PROPERTY: ['COMPARISON', 'BETWEEN', 'COMMA'], PROPERTY: ['COMPARISON', 'BETWEEN', 'COMMA', 'IS_NULL'],
BETWEEN: ['VALUE'], BETWEEN: ['VALUE'],
IS_NULL: ['END'],
COMPARISON: ['VALUE'], COMPARISON: ['VALUE'],
COMMA: ['GEOMETRY', 'VALUE', 'PROPERTY'], COMMA: ['GEOMETRY', 'VALUE', 'PROPERTY'],
VALUE: ['LOGICAL', 'COMMA', 'RPAREN', 'END'], VALUE: ['LOGICAL', 'COMMA', 'RPAREN', 'END'],
@@ -85,7 +87,8 @@ OpenLayers.Format.CQL = (function() {
'>': OpenLayers.Filter.Comparison.GREATER_THAN, '>': OpenLayers.Filter.Comparison.GREATER_THAN,
'>=': OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO, '>=': OpenLayers.Filter.Comparison.GREATER_THAN_OR_EQUAL_TO,
'LIKE': OpenLayers.Filter.Comparison.LIKE, 'LIKE': OpenLayers.Filter.Comparison.LIKE,
'BETWEEN': OpenLayers.Filter.Comparison.BETWEEN 'BETWEEN': OpenLayers.Filter.Comparison.BETWEEN,
'IS NULL': OpenLayers.Filter.Comparison.IS_NULL
}, },
operatorReverse = {}, operatorReverse = {},
@@ -181,6 +184,7 @@ OpenLayers.Format.CQL = (function() {
break; break;
case "COMPARISON": case "COMPARISON":
case "BETWEEN": case "BETWEEN":
case "IS_NULL":
case "LOGICAL": case "LOGICAL":
var p = precedence[tok.type]; var p = precedence[tok.type];
@@ -257,6 +261,12 @@ OpenLayers.Format.CQL = (function() {
value: value, value: value,
type: operators[tok.text.toUpperCase()] 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": case "VALUE":
var match = tok.text.match(/^'(.*)'$/); var match = tok.text.match(/^'(.*)'$/);
if (match) { if (match) {
@@ -419,10 +429,10 @@ OpenLayers.Format.CQL = (function() {
this.write(filter.lowerBoundary) + " AND " + this.write(filter.lowerBoundary) + " AND " +
this.write(filter.upperBoundary); this.write(filter.upperBoundary);
} else { } else {
return (filter.value !== null) ? filter.property +
return filter.property +
" " + operatorReverse[filter.type] + " " + " " + operatorReverse[filter.type] + " " +
this.write(filter.value); this.write(filter.value) : filter.property +
" " + operatorReverse[filter.type];
} }
case undefined: case undefined:
if (typeof filter === "string") { if (typeof filter === "string") {

View File

@@ -344,6 +344,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");
}
</script> </script>
</head> </head>
<body></body> <body></body>