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 = {
PROPERTY: /^[_a-zA-Z]\w*/,
COMPARISON: /^(=|<>|<=|<|>=|>|LIKE)/i,
IS_NULL: /^IS NULL/i,
COMMA: /^,/,
LOGICAL: /^(AND|OR)/i,
VALUE: /^('([^']|'')*'|\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":
var match = tok.text.match(/^'(.*)'$/);
if (match) {
@@ -419,10 +429,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") {

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>
</head>
<body></body>