make sure the _expression reader can deal with combined propertyname and literals

This commit is contained in:
Bart van den Eijnden
2013-08-09 15:57:29 +02:00
parent 29954d2ff9
commit 8792973c08
2 changed files with 31 additions and 7 deletions

View File

@@ -28,28 +28,34 @@ ol.parser.ogc.Filter_v1 = function() {
this.readers = {
'http://www.opengis.net/ogc': {
_expression: function(node) {
var obj, value = '';
var obj, source = '';
for (var child = node.firstChild; child; child = child.nextSibling) {
switch (child.nodeType) {
case 1:
obj = this.readNode(child);
if (obj.property) {
value += obj.property.getName();
var name = obj.property.getName();
source += (source !== '') ? '+' + name : name;
} else if (goog.isDef(obj.value)) {
if (obj.value instanceof ol.expr.Literal) {
value += obj.value.getValue();
}
return obj.value;
}
break;
case 3: // text node
case 4: // cdata section
value += child.nodeValue;
if (source !== '') {
source += '+';
}
if (isNaN(goog.string.toNumber(child.nodeValue))) {
source += goog.string.quote(goog.string.trim(child.nodeValue));
} else {
source += goog.string.trim(child.nodeValue);
}
break;
default:
break;
}
}
return ol.expr.parse(goog.string.trim(value));
return ol.expr.parse(source);
},
'Filter': function(node, obj) {
var container = {

View File

@@ -235,6 +235,24 @@ describe('ol.parser.ogc.Filter_v1_0_0', function() {
});
describe('_expression reader works as expected', function() {
it('_expression reader handles combined propertyname and literal',
function() {
var xml = '<ogc:UpperBoundary xmlns:ogc="' +
'http://www.opengis.net/ogc">10</ogc:UpperBoundary>';
var reader = parser.readers['http://www.opengis.net/ogc'][
'_expression'];
var expr = reader.call(parser, goog.dom.xml.loadXml(
xml).documentElement);
expect(expr instanceof ol.expr.Literal).to.be.ok();
expect(expr.getValue()).to.equal(10);
xml = '<ogc:UpperBoundary xmlns:ogc="http://www.opengis.net/ogc">' +
'foo<ogc:PropertyName>x</ogc:PropertyName>bar</ogc:UpperBoundary>';
expr = reader.call(parser, goog.dom.xml.loadXml(xml).documentElement);
expect(expr.evaluate({x: 4})).to.eql('foo4bar');
});
});
});
goog.require('goog.dom.xml');