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:
@@ -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") {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user