Add parser for OGC Filter 1.0 and 1.1 (read/write)

This work is based on the ol.expr package by @tschaub.
It adds a few named expression functions to that package:

 * INTERSECTS, CONTAINS, DWITHIN, WITHIN (no client-side implementation as yet)
 * LIKE (like comparison with wildcard, singleChar and escapeChar)
 * IEQ (case-insensitive equality)
 * INEQ (case-insensitive non-equality)

It also adds a few extra parameters to the existing EXTENT function to be able
to deserialize and serialize all info (i.e. projection and property name).

Some changes were needed for the GML parser as well:

 * createGeometry function needed to be public
 * when parsing Box (GML2) and Envelope (GML3) also parse the srsName
 * fix up writing for Box and Envelope now that bounds is an array

Also added createDocumentFragment function to the XML parser. Implementation
is similar to OpenLayers 2.

Some addtional notes on the implementation:

 * PropertyIsBetween was implemented as an ol.expr.Logical with operator
   ol.expr.LogicalOp.AND and two ol.expr.Comparison instances with operator
   ol.expr.ComparisonOp.GTE and ol.expr.ComparisonOp.LTE
 * In OGC Filter And and Or can contain more than 2 sub filters, so this
   is translated into a hierarchy of ol.expr.Logical
This commit is contained in:
Bart van den Eijnden
2013-07-01 13:46:41 +02:00
parent a7ca22dde0
commit ab40ab6208
37 changed files with 1899 additions and 39 deletions

View File

@@ -0,0 +1,238 @@
goog.provide('ol.test.parser.ogc.Filter_v1_0_0');
describe('ol.parser.ogc.Filter_v1_0_0', function() {
var parser = new ol.parser.ogc.Filter_v1_0_0();
describe('#readwrite', function() {
it('intersects filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/intersects.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Call).to.be(true);
expect(filter.getCallee().getName()).to.eql(
ol.expr.functions.INTERSECTS);
var args = filter.getArgs();
var geom = args[0];
expect(geom instanceof ol.geom.Polygon).to.be(true);
expect(args[2]).to.eql('Geometry');
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('within filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/within.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Call).to.be(true);
expect(filter.getCallee().getName()).to.eql(ol.expr.functions.WITHIN);
var args = filter.getArgs();
var geom = args[0];
expect(geom instanceof ol.geom.Polygon).to.be(true);
expect(args[2]).to.eql('Geometry');
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('contains filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/contains.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Call).to.be(true);
expect(filter.getCallee().getName()).to.eql(
ol.expr.functions.CONTAINS);
var args = filter.getArgs();
var geom = args[0];
expect(geom instanceof ol.geom.Polygon).to.be(true);
expect(args[2]).to.eql('Geometry');
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('between filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/between.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Logical).to.be.ok();
expect(filter.getOperator()).to.eql(ol.expr.LogicalOp.AND);
expect(filter.getLeft() instanceof ol.expr.Comparison).to.be.ok();
expect(filter.getLeft().getOperator()).to.eql(ol.expr.ComparisonOp.GTE);
expect(filter.getLeft().getLeft()).to.eql('number');
expect(filter.getLeft().getRight()).to.eql(0);
expect(filter.getRight() instanceof ol.expr.Comparison).to.be.ok();
expect(filter.getRight().getOperator()).to.eql(
ol.expr.ComparisonOp.LTE);
expect(filter.getRight().getLeft()).to.eql('number');
expect(filter.getRight().getRight()).to.eql(100);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('between filter read correctly without literals', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/between2.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Logical).to.be.ok();
expect(filter.getOperator()).to.eql(ol.expr.LogicalOp.AND);
expect(filter.getLeft() instanceof ol.expr.Comparison).to.be.ok();
expect(filter.getLeft().getOperator()).to.eql(ol.expr.ComparisonOp.GTE);
expect(filter.getLeft().getLeft()).to.eql('number');
expect(filter.getLeft().getRight()).to.eql(0);
expect(filter.getRight() instanceof ol.expr.Comparison).to.be.ok();
expect(filter.getRight().getOperator()).to.eql(
ol.expr.ComparisonOp.LTE);
expect(filter.getRight().getLeft()).to.eql('number');
expect(filter.getRight().getRight()).to.eql(100);
done();
});
});
it('null filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/null.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Comparison).to.be.ok();
expect(filter.getLeft()).to.eql('prop');
expect(filter.getRight()).to.eql(null);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('BBOX written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/bbox.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(
new ol.expr.Identifier(ol.expr.functions.EXTENT),
[-180, -90, 180, 90, 'EPSG:4326', 'the_geom']);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('BBOX without geometry name written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/bbox_nogeom.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(
new ol.expr.Identifier(ol.expr.functions.EXTENT),
[-180, -90, 180, 90, 'EPSG:4326']);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('DWithin written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/dwithin.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(new ol.expr.Identifier(
ol.expr.functions.DWITHIN),
[new ol.geom.Point([2488789, 289552]), 1000, 'm', undefined,
'Geometry']);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
filter = parser.read(xml);
output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
});
// the Filter Encoding spec doesn't allow for FID filters inside logical
// filters however, to be liberal, we will write them without complaining
describe('#logicalfid', function() {
it('logical filter [OR] with fid filter written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/logicalfeatureid.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Logical(ol.expr.LogicalOp.OR,
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.LIKE),
['person', 'me', '*', '.', '!']),
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.FID),
['foo.1', 'foo.2']));
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('logical filter [AND] with fid filter written correctly',
function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/' +
'logicalfeatureidand.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Logical(ol.expr.LogicalOp.AND,
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.LIKE),
['person', 'me', '*', '.', '!']),
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.FID),
['foo.1', 'foo.2']));
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('logical filter [NOT] with fid filter written correctly',
function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/' +
'logicalfeatureidnot.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Not(
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.FID),
['foo.2']));
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
});
describe('#date', function() {
it('date writing works as expected', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_0_0/betweendates.xml';
afterLoadXml(url, function(xml) {
// ISO 8601: 2010-11-27T18:19:15.123Z
var start = new Date(Date.UTC(2010, 10, 27, 18, 19, 15, 123));
// ISO 8601: 2011-12-27T18:19:15.123Z
var end = new Date(Date.UTC(2011, 11, 27, 18, 19, 15, 123));
var filter = new ol.expr.Logical(ol.expr.LogicalOp.AND,
new ol.expr.Comparison(ol.expr.ComparisonOp.GTE, 'when', start),
new ol.expr.Comparison(ol.expr.ComparisonOp.LTE, 'when', end));
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
});
});
goog.require('goog.dom.xml');
goog.require('ol.expr');
goog.require('ol.expr.Call');
goog.require('ol.expr.Comparison');
goog.require('ol.expr.ComparisonOp');
goog.require('ol.expr.Identifier');
goog.require('ol.expr.Logical');
goog.require('ol.expr.LogicalOp');
goog.require('ol.expr.Not');
goog.require('ol.expr.functions');
goog.require('ol.geom.Point');
goog.require('ol.geom.Polygon');
goog.require('ol.parser.ogc.Filter_v1_0_0');

View File

@@ -0,0 +1,230 @@
goog.provide('ol.test.parser.ogc.Filter_v1_1_0');
describe('ol.parser.ogc.Filter_v1_1_0', function() {
var parser = new ol.parser.ogc.Filter_v1_1_0();
describe('#readwrite', function() {
it('filter read correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/test.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
expect(filter instanceof ol.expr.Logical).to.be(true);
expect(filter.getOperator()).to.eql(ol.expr.LogicalOp.OR);
var filters = [];
parser.getSubfiltersForLogical_(filter, filters);
expect(filters.length).to.eql(5);
expect(filters[0]).to.eql(new ol.expr.Logical(ol.expr.LogicalOp.AND,
new ol.expr.Comparison(
ol.expr.ComparisonOp.GTE, 'number', 1064866676),
new ol.expr.Comparison(
ol.expr.ComparisonOp.LTE, 'number', 1065512599)));
expect(filters[1]).to.eql(new ol.expr.Not(new ol.expr.Comparison(
ol.expr.ComparisonOp.LTE, 'FOO', 5000)));
expect(filters[2] instanceof ol.expr.Call).to.be(true);
expect(filters[2].getCallee().getName()).to.eql(
ol.expr.functions.LIKE);
expect(filters[2].getArgs()).to.eql(['cat', '*dog.food!*good', '*',
'.', '!', null]);
expect(filters[3] instanceof ol.expr.Call).to.be(true);
expect(filters[3].getCallee().getName()).to.eql(
ol.expr.functions.IEQ);
expect(filters[3].getArgs()).to.eql(['cat', 'dog']);
expect(filters[4] instanceof ol.expr.Comparison).to.be(true);
expect(filters[4].getOperator()).to.eql(ol.expr.ComparisonOp.EQ);
expect(filters[4].getLeft()).to.eql('cat');
expect(filters[4].getRight()).to.eql('dog');
done();
});
});
it('matchCase read correctly', function() {
var cases = [{
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsEqualTo>' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>',
exp: true
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsEqualTo matchCase="1">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>',
exp: true
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsEqualTo matchCase="true">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>',
exp: true
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsEqualTo matchCase="0">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>',
exp: false
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsEqualTo matchCase="0">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsEqualTo>' +
'</ogc:Filter>',
exp: false
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsNotEqualTo matchCase="true">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsNotEqualTo>' +
'</ogc:Filter>',
exp: true
}, {
str:
'<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">' +
'<ogc:PropertyIsNotEqualTo matchCase="false">' +
'<ogc:PropertyName>cat</ogc:PropertyName>' +
'<ogc:Literal>dog</ogc:Literal>' +
'</ogc:PropertyIsNotEqualTo>' +
'</ogc:Filter>',
exp: false
}];
var filter, c;
for (var i = 0; i < cases.length; ++i) {
c = cases[i];
filter = parser.read(c.str);
var matchCase = (filter instanceof ol.expr.Call) ? false : true;
expect(matchCase).to.eql(c.exp);
}
});
it('BBOX filter written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/bbox.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('BBOX filter without property name written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/bbox_nogeomname.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('Intersects filter read / written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/intersects.xml';
afterLoadXml(url, function(xml) {
var filter = parser.read(xml);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('Filter functions written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/function.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(new ol.expr.Identifier(
ol.expr.functions.INTERSECTS),
[new ol.expr.Call(new ol.expr.Identifier('querySingle'),
['sf:restricted', 'the_geom',
'cat=3']), undefined, 'the_geom']);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('Custom filter functions written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/customfunction.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Logical(ol.expr.LogicalOp.AND,
new ol.expr.Call(new ol.expr.Identifier(ol.expr.functions.INEQ),
['FOO', new ol.expr.Call(new ol.expr.Identifier('customFunction'),
['param1', 'param2'])]));
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('Nested filter functions written correctly', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/nestedfunction.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(new ol.expr.Identifier(
ol.expr.functions.DWITHIN),
[new ol.expr.Call(new ol.expr.Identifier('collectGeometries'),
[new ol.expr.Call(new ol.expr.Identifier('queryCollection'),
['sf:roads', 'the_geom', 'INCLUDE'])]), 200, 'meters',
undefined, 'the_geom']);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('matchCase written correctly on Like filter', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/likematchcase.xml';
afterLoadXml(url, function(xml) {
var filter = new ol.expr.Call(
new ol.expr.Identifier(ol.expr.functions.LIKE),
['person', '*me*', '*', '.', '!', false]);
var output = parser.write(filter);
expect(goog.dom.xml.loadXml(output)).to.xmleql(xml);
done();
});
});
it('sortBy written correctly on Like filter', function(done) {
var url = 'spec/ol/parser/ogc/xml/filter_v1_1_0/sortby.xml';
afterLoadXml(url, function(xml) {
var writer = parser.writers['http://www.opengis.net/ogc']['SortBy'];
var output = writer.call(parser, [{
'property': 'Title',
'order': 'ASC'
},{
'property': 'Relevance',
'order': 'DESC'
}]);
expect(output).to.xmleql(xml);
done();
});
});
});
});
goog.require('goog.dom.xml');
goog.require('ol.expr');
goog.require('ol.expr.Call');
goog.require('ol.expr.Comparison');
goog.require('ol.expr.ComparisonOp');
goog.require('ol.expr.Identifier');
goog.require('ol.expr.Logical');
goog.require('ol.expr.LogicalOp');
goog.require('ol.expr.Not');
goog.require('ol.expr.functions');
goog.require('ol.parser.ogc.Filter_v1_1_0');

View File

@@ -19,7 +19,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -47,7 +47,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -76,7 +76,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -104,7 +104,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -138,7 +138,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -170,7 +170,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -188,7 +188,7 @@ describe('ol.parser.gml_v2', function() {
var p = new ol.parser.ogc.GML_v2({srsName: 'foo',
featureNS: 'http://foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -231,7 +231,7 @@ describe('ol.parser.gml_v2', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);

View File

@@ -17,7 +17,7 @@ describe('ol.parser.gml_v3', function() {
var url = 'spec/ol/parser/ogc/xml/gml_v3/linearring.xml';
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
parser.srsName = 'foo';
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
@@ -33,7 +33,7 @@ describe('ol.parser.gml_v3', function() {
var url = 'spec/ol/parser/ogc/xml/gml_v3/linestring.xml';
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
parser.srsName = 'foo';
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
@@ -59,7 +59,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({curve: true, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -84,7 +84,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({multiCurve: false, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -99,7 +99,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -116,7 +116,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({curve: true, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -143,7 +143,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -170,7 +170,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({multiSurface: false, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -195,7 +195,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
parser.srsName = 'foo';
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(parser.serialize(node))).to.xmleql(xml);
@@ -211,7 +211,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({surface: true, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);
@@ -225,7 +225,7 @@ describe('ol.parser.gml_v3', function() {
var url = 'spec/ol/parser/ogc/xml/gml_v3/point.xml';
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
parser.srsName = 'foo';
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
@@ -240,7 +240,7 @@ describe('ol.parser.gml_v3', function() {
var url = 'spec/ol/parser/ogc/xml/gml_v3/polygon.xml';
afterLoadXml(url, function(xml) {
var obj = parser.read(xml);
var geom = parser.createGeometry_({geometry: obj.geometry});
var geom = parser.createGeometry({geometry: obj.geometry});
parser.srsName = 'foo';
var node = parser.featureNSWiters_['_geometry'].apply(parser,
[geom]).firstChild;
@@ -263,7 +263,7 @@ describe('ol.parser.gml_v3', function() {
afterLoadXml(url, function(xml) {
var p = new ol.parser.ogc.GML_v3({surface: true, srsName: 'foo'});
var obj = p.read(xml);
var geom = p.createGeometry_({geometry: obj.geometry});
var geom = p.createGeometry({geometry: obj.geometry});
var node = p.featureNSWiters_['_geometry'].apply(p,
[geom]).firstChild;
expect(goog.dom.xml.loadXml(p.serialize(node))).to.xmleql(xml);

View File

@@ -0,0 +1,23 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:Or>
<ogc:PropertyIsBetween>
<ogc:PropertyName>number</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>1064866676</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>1065512599</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
<ogc:PropertyName>cat</ogc:PropertyName>
<ogc:Literal>*dog.food!*good</ogc:Literal>
</ogc:PropertyIsLike>
<ogc:Not>
<ogc:PropertyIsLessThanOrEqualTo>
<ogc:PropertyName>FOO</ogc:PropertyName>
<ogc:Literal>5000</ogc:Literal>
</ogc:PropertyIsLessThanOrEqualTo>
</ogc:Not>
</ogc:Or>
</ogc:Filter>

View File

@@ -0,0 +1,8 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:BBOX>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates>
</gml:Box>
</ogc:BBOX>
</ogc:Filter>

View File

@@ -0,0 +1,7 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:BBOX>
<gml:Box xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:coordinates decimal="." cs="," ts=" ">-180,-90 180,90</gml:coordinates>
</gml:Box>
</ogc:BBOX>
</ogc:Filter>

View File

@@ -0,0 +1,11 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:PropertyIsBetween>
<ogc:PropertyName>number</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>0</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>100</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>

View File

@@ -0,0 +1,7 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsBetween>
<ogc:PropertyName>number</ogc:PropertyName>
<ogc:LowerBoundary>0</ogc:LowerBoundary>
<ogc:UpperBoundary>100</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>

View File

@@ -0,0 +1,11 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:PropertyIsBetween>
<ogc:PropertyName>when</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>2010-11-27T18:19:15.123Z</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>2011-12-27T18:19:15.123Z</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>

View File

@@ -0,0 +1,12 @@
<Filter xmlns="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Contains>
<PropertyName>Geometry</PropertyName>
<gml:Polygon xmlns:gml="http://www.opengis.net/gml">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</Contains>
</Filter>

View File

@@ -0,0 +1,11 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc">
<ogc:PropertyIsBetween>
<ogc:PropertyName>when</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>2010-11-27</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>2011-12-27</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
</ogc:Filter>

View File

@@ -0,0 +1,9 @@
<Filter xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<DWithin>
<PropertyName>Geometry</PropertyName>
<gml:Point xmlns:gml="http://www.opengis.net/gml">
<gml:coordinates decimal="." cs="," ts=" ">2488789,289552</gml:coordinates>
</gml:Point>
<Distance units="m">1000</Distance>
</DWithin>
</Filter>

View File

@@ -0,0 +1,12 @@
<Filter xmlns="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Intersects>
<PropertyName>Geometry</PropertyName>
<gml:Polygon xmlns:gml="http://www.opengis.net/gml">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</Intersects>
</Filter>

View File

@@ -0,0 +1,10 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:Or>
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
<ogc:PropertyName>person</ogc:PropertyName>
<ogc:Literal>me</ogc:Literal>
</ogc:PropertyIsLike>
<ogc:FeatureId fid="foo.1"/>
<ogc:FeatureId fid="foo.2"/>
</ogc:Or>
</ogc:Filter>

View File

@@ -0,0 +1,10 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:And>
<ogc:PropertyIsLike wildCard="*" singleChar="." escape="!">
<ogc:PropertyName>person</ogc:PropertyName>
<ogc:Literal>me</ogc:Literal>
</ogc:PropertyIsLike>
<ogc:FeatureId fid="foo.1"/>
<ogc:FeatureId fid="foo.2"/>
</ogc:And>
</ogc:Filter>

View File

@@ -0,0 +1,5 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:Not>
<ogc:FeatureId fid="foo.2"/>
</ogc:Not>
</ogc:Filter>

View File

@@ -0,0 +1,5 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd">
<ogc:PropertyIsNull>
<ogc:PropertyName>prop</ogc:PropertyName>
</ogc:PropertyIsNull>
</ogc:Filter>

View File

@@ -0,0 +1,12 @@
<Filter xmlns="http://www.opengis.net/ogc" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.0.0/filter.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<Within>
<PropertyName>Geometry</PropertyName>
<gml:Polygon xmlns:gml="http://www.opengis.net/gml">
<gml:outerBoundaryIs>
<gml:LinearRing>
<gml:coordinates decimal="." cs="," ts=" ">2488789,289552 2588789,289552 2588789,389552 2488789,389552 2488789,289552</gml:coordinates>
</gml:LinearRing>
</gml:outerBoundaryIs>
</gml:Polygon>
</Within>
</Filter>

View File

@@ -0,0 +1,9 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:BBOX>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:lowerCorner>-180 -90</gml:lowerCorner>
<gml:upperCorner>180 90</gml:upperCorner>
</gml:Envelope>
</ogc:BBOX>
</ogc:Filter>

View File

@@ -0,0 +1,8 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:BBOX>
<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:lowerCorner>-180 -90</gml:lowerCorner>
<gml:upperCorner>180 90</gml:upperCorner>
</gml:Envelope>
</ogc:BBOX>
</ogc:Filter>

View File

@@ -0,0 +1,11 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:And>
<ogc:PropertyIsNotEqualTo matchCase="false">
<ogc:PropertyName>FOO</ogc:PropertyName>
<ogc:Function name="customFunction">
<ogc:Literal>param1</ogc:Literal>
<ogc:Literal>param2</ogc:Literal>
</ogc:Function>
</ogc:PropertyIsNotEqualTo>
</ogc:And>
</ogc:Filter>

View File

@@ -0,0 +1,10 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:Intersects>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<ogc:Function name="querySingle">
<ogc:Literal>sf:restricted</ogc:Literal>
<ogc:Literal>the_geom</ogc:Literal>
<ogc:Literal>cat=3</ogc:Literal>
</ogc:Function>
</ogc:Intersects>
</ogc:Filter>

View File

@@ -0,0 +1,9 @@
<Filter xmlns="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<Intersects>
<PropertyName>Geometry</PropertyName>
<gml:Envelope xmlns:gml="http://www.opengis.net/gml" srsName="EPSG:4326">
<gml:lowerCorner>-180 -90</gml:lowerCorner>
<gml:upperCorner>180 90</gml:upperCorner>
</gml:Envelope>
</Intersects>
</Filter>

View File

@@ -0,0 +1,6 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:PropertyIsLike wildCard="*" singleChar="." escapeChar="!" matchCase="false">
<ogc:PropertyName>person</ogc:PropertyName>
<ogc:Literal>*me*</ogc:Literal>
</ogc:PropertyIsLike>
</ogc:Filter>

View File

@@ -0,0 +1,13 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:DWithin>
<ogc:PropertyName>the_geom</ogc:PropertyName>
<ogc:Function name="collectGeometries">
<ogc:Function name="queryCollection">
<ogc:Literal>sf:roads</ogc:Literal>
<ogc:Literal>the_geom</ogc:Literal>
<ogc:Literal>INCLUDE</ogc:Literal>
</ogc:Function>
</ogc:Function>
<ogc:Distance units="meters">200</ogc:Distance>
</ogc:DWithin>
</ogc:Filter>

View File

@@ -0,0 +1,10 @@
<ogc:SortBy xmlns:ogc="http://www.opengis.net/ogc">
<ogc:SortProperty>
<ogc:PropertyName>Title</ogc:PropertyName>
<ogc:SortOrder>ASC</ogc:SortOrder>
</ogc:SortProperty>
<ogc:SortProperty>
<ogc:PropertyName>Relevance</ogc:PropertyName>
<ogc:SortOrder>DESC</ogc:SortOrder>
</ogc:SortProperty>
</ogc:SortBy>

View File

@@ -0,0 +1,31 @@
<ogc:Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/ogc http://schemas.opengis.net/filter/1.1.0/filter.xsd">
<ogc:Or>
<ogc:PropertyIsBetween>
<ogc:PropertyName>number</ogc:PropertyName>
<ogc:LowerBoundary>
<ogc:Literal>1064866676</ogc:Literal>
</ogc:LowerBoundary>
<ogc:UpperBoundary>
<ogc:Literal>1065512599</ogc:Literal>
</ogc:UpperBoundary>
</ogc:PropertyIsBetween>
<ogc:PropertyIsLike wildCard="*" singleChar="." escapeChar="!">
<ogc:PropertyName>cat</ogc:PropertyName>
<ogc:Literal>*dog.food!*good</ogc:Literal>
</ogc:PropertyIsLike>
<ogc:Not>
<ogc:PropertyIsLessThanOrEqualTo>
<ogc:PropertyName>FOO</ogc:PropertyName>
<ogc:Literal>5000</ogc:Literal>
</ogc:PropertyIsLessThanOrEqualTo>
</ogc:Not>
<ogc:PropertyIsEqualTo>
<ogc:PropertyName>cat</ogc:PropertyName>
<ogc:Literal>dog</ogc:Literal>
</ogc:PropertyIsEqualTo>
<ogc:PropertyIsEqualTo matchCase="false">
<ogc:PropertyName>cat</ogc:PropertyName>
<ogc:Literal>dog</ogc:Literal>
</ogc:PropertyIsEqualTo>
</ogc:Or>
</ogc:Filter>