diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index e433aba72a..f0983b1f04 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -1104,11 +1104,8 @@ function writeDuringFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; - const ns = FESNS[version]; - const valueReference = createElementNS(ns, 'ValueReference'); - writeStringTextNode(valueReference, filter.propertyName); - node.appendChild(valueReference); + writePropertyName(version, node, filter.propertyName); const timePeriod = createElementNS(GMLNS, 'TimePeriod'); node.appendChild(timePeriod); @@ -1176,12 +1173,11 @@ function writeComparisonFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; - const ns = OGCNS[context['version']]; if (filter.matchCase !== undefined) { node.setAttribute('matchCase', filter.matchCase.toString()); } writePropertyName(version, node, filter.propertyName); - writeOgcLiteral(ns, node, '' + filter.expression); + writeLiteral(version, node, '' + filter.expression); } /** @@ -1205,17 +1201,17 @@ function writeIsBetweenFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; - const ns = OGCNS[context['version']]; + const ns = getFilterNS(version); writePropertyName(version, node, filter.propertyName); const lowerBoundary = createElementNS(ns, 'LowerBoundary'); node.appendChild(lowerBoundary); - writeOgcLiteral(ns, lowerBoundary, '' + filter.lowerBoundary); + writeLiteral(version, lowerBoundary, '' + filter.lowerBoundary); const upperBoundary = createElementNS(ns, 'UpperBoundary'); node.appendChild(upperBoundary); - writeOgcLiteral(ns, upperBoundary, '' + filter.upperBoundary); + writeLiteral(version, upperBoundary, '' + filter.upperBoundary); } /** @@ -1227,7 +1223,6 @@ function writeIsLikeFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; - const ns = OGCNS[version]; node.setAttribute('wildCard', filter.wildCard); node.setAttribute('singleChar', filter.singleChar); node.setAttribute('escapeChar', filter.escapeChar); @@ -1235,7 +1230,7 @@ function writeIsLikeFilter(node, filter, objectStack) { node.setAttribute('matchCase', filter.matchCase.toString()); } writePropertyName(version, node, filter.propertyName); - writeOgcLiteral(ns, node, '' + filter.pattern); + writeLiteral(version, node, '' + filter.pattern); } /** @@ -1244,12 +1239,21 @@ function writeIsLikeFilter(node, filter, objectStack) { * @param {Node} node Node. * @param {string} value Value. */ -function writeOgcExpression(ns, tagName, node, value) { +function writeExpression(ns, tagName, node, value) { const property = createElementNS(ns, tagName); writeStringTextNode(property, value); node.appendChild(property); } +/** + * @param {string} version Version. + * @param {Node} node Node. + * @param {string} value PropertyName value. + */ +function writeLiteral(version, node, value) { + writeExpression(getFilterNS(version), 'Literal', node, value); +} + /** * @param {string} version Version. * @param {Node} node Node. @@ -1257,30 +1261,12 @@ function writeOgcExpression(ns, tagName, node, value) { */ function writePropertyName(version, node, value) { if (version === '2.0.0') { - writeFesValueReference(FESNS[version], node, value); + writeExpression(FESNS[version], 'ValueReference', node, value); } else { - writeOgcExpression(OGCNS[version], 'PropertyName', node, value); + writeExpression(OGCNS[version], 'PropertyName', node, value); } } -/** - * @param {string} ns Namespace. - * @param {Node} node Node. - * @param {string} value PropertyName value. - */ -function writeFesValueReference(ns, node, value) { - writeOgcExpression(ns, 'ValueReference', node, value); -} - -/** - * @param {string} ns Namespace. - * @param {Node} node Node. - * @param {string} value PropertyName value. - */ -function writeOgcLiteral(ns, node, value) { - writeOgcExpression(ns, 'Literal', node, value); -} - /** * @param {Node} node Node. * @param {string} time PropertyName value. diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index 4881d588c1..fc30e14e5d 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -687,7 +687,7 @@ describe('ol.format.WFS', function () { expect(serialized.firstElementChild).to.xmleql(parse(text)); }); - it('creates a dwithin filter for WFS 1.x', function () { + it('creates a dwithin filter', function () { const text = '' + - ' ' + - ' ' + - ' the_geom' + - ' ' + - ' ' + - ' ' + - ' ' + - ' 10 20 10 25 15 25 15 20 10 20' + - ' ' + - ' ' + - ' ' + - ' ' + - ' 10' + - ' ' + - ' ' + - ''; - const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ - srsName: 'EPSG:4326', - featureTypes: ['area'], - filter: dwithinFilter( - 'the_geom', - new Polygon([ - [ - [10, 20], - [10, 25], - [15, 25], - [15, 20], - [10, 20], - ], - ]), - 10, - 'm' - ), - }); - expect(serialized.firstElementChild).to.xmleql(parse(text)); - }); - it('creates During property filter', function () { const text = '' + ' ' + ' ' + - ' date_prop' + + ' date_prop' + ' ' + ' ' + ' ' + @@ -1680,5 +1638,176 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> expect(serialized).to.xmleql(parse(text)); }); }); + + it('creates a dwithin filter', function () { + const text = + '' + + ' ' + + ' ' + + ' the_geom' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 10 20 10 25 15 25 15 20 10 20' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 10' + + ' ' + + ' ' + + ''; + const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ + srsName: 'EPSG:4326', + featureTypes: ['area'], + filter: dwithinFilter( + 'the_geom', + new Polygon([ + [ + [10, 20], + [10, 25], + [15, 25], + [15, 20], + [10, 20], + ], + ]), + 10, + 'm' + ), + }); + expect(serialized.firstElementChild).to.xmleql(parse(text)); + }); + + it('creates isLike property filter', function () { + const text = + '' + + ' ' + + ' ' + + ' name' + + ' New*' + + ' ' + + ' ' + + ''; + const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ + srsName: 'urn:ogc:def:crs:EPSG::4326', + featureNS: 'http://www.openplans.org/topp', + featurePrefix: 'topp', + featureTypes: ['states'], + filter: likeFilter('name', 'New*'), + }); + expect(serialized.firstElementChild).to.xmleql(parse(text)); + }); + + it('creates isBetween property filter', function () { + const text = + '' + + ' ' + + ' ' + + ' area' + + ' 100' + + ' 1000' + + ' ' + + ' ' + + ''; + const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ + srsName: 'urn:ogc:def:crs:EPSG::4326', + featureNS: 'http://www.openplans.org/topp', + featurePrefix: 'topp', + featureTypes: ['states'], + filter: betweenFilter('area', 100, 1000), + }); + expect(serialized.firstElementChild).to.xmleql(parse(text)); + }); + + it('creates greater/less than property filters', function () { + const text = + '' + + ' ' + + ' ' + + ' ' + + ' ' + + ' area' + + ' 100' + + ' ' + + ' ' + + ' pop' + + ' 20000' + + ' ' + + ' ' + + ' ' + + ' ' + + ' area' + + ' 100' + + ' ' + + ' ' + + ' pop' + + ' 20000' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ + srsName: 'urn:ogc:def:crs:EPSG::4326', + featureNS: 'http://www.openplans.org/topp', + featurePrefix: 'topp', + featureTypes: ['states'], + filter: orFilter( + andFilter( + greaterThanFilter('area', 100), + greaterThanOrEqualToFilter('pop', 20000) + ), + andFilter( + lessThanFilter('area', 100), + lessThanOrEqualToFilter('pop', 20000) + ) + ), + }); + expect(serialized.firstElementChild).to.xmleql(parse(text)); + }); + + it('creates During property filter', function () { + const text = + '' + + ' ' + + ' ' + + ' date_prop' + + ' ' + + ' ' + + ' ' + + ' 2010-01-20T00:00:00Z' + + ' ' + + ' ' + + ' ' + + ' ' + + ' 2012-12-31T00:00:00Z' + + ' ' + + ' ' + + ' ' + + ' ' + + ' ' + + ''; + + const serialized = new WFS({version: '2.0.0'}).writeGetFeature({ + srsName: 'EPSG:4326', + featureTypes: ['states'], + filter: duringFilter( + 'date_prop', + '2010-01-20T00:00:00Z', + '2012-12-31T00:00:00Z' + ), + }); + expect(serialized.firstElementChild).to.xmleql(parse(text)); + }); }); });