From ab43047e7a29a9ee239b22bb037514e5502a9c9c Mon Sep 17 00:00:00 2001 From: Jannes Bolling Date: Wed, 14 Oct 2020 17:34:17 +0200 Subject: [PATCH 1/5] add new DistanceWithin Filter --- src/ol/format/WFS.js | 23 ++++++++++++++++++ src/ol/format/filter.js | 18 ++++++++++++++ src/ol/format/filter/DWithin.js | 38 +++++++++++++++++++++++++++++ test/spec/ol/format/wfs.test.js | 43 +++++++++++++++++++++++++++++++++ 4 files changed, 122 insertions(+) create mode 100644 src/ol/format/filter/DWithin.js diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 8d842d9509..58791ecede 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -928,6 +928,7 @@ const GETFEATURE_SERIALIZERS = { 'Contains': makeChildAppender(writeContainsFilter), 'Intersects': makeChildAppender(writeIntersectsFilter), 'Within': makeChildAppender(writeWithinFilter), + 'DWithin': makeChildAppender(writeDWithinFilter), 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsLessThan': makeChildAppender(writeComparisonFilter), @@ -949,6 +950,7 @@ const GETFEATURE_SERIALIZERS = { 'Intersects': makeChildAppender(writeIntersectsFilter), 'ResourceId': makeChildAppender(writeResourceIdFilter), 'Within': makeChildAppender(writeWithinFilter), + 'DWithin': makeChildAppender(writeDWithinFilter), 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsLessThan': makeChildAppender(writeComparisonFilter), @@ -1121,6 +1123,27 @@ function writeWithinFilter(node, filter, objectStack) { format.prototype.writeGeometryElement(node, filter.geometry, objectStack); } +/** + * @param {Node} node Node. + * @param {import("./filter/DWithin.js").default} filter Filter. + * @param {Array<*>} objectStack Node stack. + */ +function writeDWithinFilter(node, filter, objectStack) { + const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); + const context = parent['context']; + const version = context['version']; + context['srsName'] = filter.srsName; + const format = GML_FORMATS[version]; + + writePropertyName(version, node, filter.geometryName); + format.prototype.writeGeometryElement(node, filter.geometry, objectStack); + + const distance = createElementNS(getFilterNS(version), 'Distance'); + writeStringTextNode(distance, filter.distance.toString()); + distance.setAttribute('uom', filter.unit); + node.appendChild(distance); +} + /** * @param {Node} node Node. * @param {import("./filter/During.js").default} filter Filter. diff --git a/src/ol/format/filter.js b/src/ol/format/filter.js index 05c8be7904..9abdd6e667 100644 --- a/src/ol/format/filter.js +++ b/src/ol/format/filter.js @@ -4,6 +4,7 @@ import And from './filter/And.js'; import Bbox from './filter/Bbox.js'; import Contains from './filter/Contains.js'; +import DWithin from './filter/DWithin.js'; import Disjoint from './filter/Disjoint.js'; import During from './filter/During.js'; import EqualTo from './filter/EqualTo.js'; @@ -131,6 +132,23 @@ export function within(geometryName, geometry, opt_srsName) { return new Within(geometryName, geometry, opt_srsName); } +/** + * Create a `` operator to test whether a geometry-valued property + * is within a distance to a given geometry. + * + * @param {!string} geometryName Geometry name to use. + * @param {!import("../geom/Geometry.js").default} geometry Geometry. + * @param {!number} distance Distance. + * @param {!string} unit Unit. + * @param {string=} opt_srsName SRS name. No srsName attribute will be + * set on geometries when this is not provided. + * @returns {!DWithin} `` operator. + * @api + */ +export function dwithin(geometryName, geometry, distance, unit, opt_srsName) { + return new DWithin(geometryName, geometry, distance, unit, opt_srsName); +} + /** * Creates a `` comparison operator. * diff --git a/src/ol/format/filter/DWithin.js b/src/ol/format/filter/DWithin.js new file mode 100644 index 0000000000..7ecc8c1510 --- /dev/null +++ b/src/ol/format/filter/DWithin.js @@ -0,0 +1,38 @@ +/** + * @module ol/format/filter/DWithin + */ +import Spatial from './Spatial.js'; + +/** + * @classdesc + * Represents a `` operator to test whether a geometry-valued property + * is within a distance to a given geometry. + * @api + */ +class DWithin extends Spatial { + /** + * @param {!string} geometryName Geometry name to use. + * @param {!import("../../geom/Geometry.js").default} geometry Geometry. + * @param {!number} distance Distance. + * @param {!string} unit Unit. + * @param {string=} opt_srsName SRS name. No srsName attribute will be + * set on geometries when this is not provided. + */ + constructor(geometryName, geometry, distance, unit, opt_srsName) { + super('DWithin', geometryName, geometry, opt_srsName); + + /** + * @public + * @type {!number} + */ + this.distance = distance; + + /** + * @public + * @type {!string} + */ + this.unit = unit; + } +} + +export default DWithin; diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index d3c407f18c..2607bd51c2 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -19,6 +19,7 @@ import { contains as containsFilter, disjoint as disjointFilter, during as duringFilter, + dwithin as dwithinFilter, equalTo as equalToFilter, greaterThan as greaterThanFilter, greaterThanOrEqualTo as greaterThanOrEqualToFilter, @@ -686,6 +687,48 @@ describe('ol.format.WFS', function () { expect(serialized.firstElementChild).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().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: Wed, 14 Oct 2020 18:32:26 +0200 Subject: [PATCH 2/5] refactor spatial filter serialization --- src/ol/format/WFS.js | 73 ++++++-------------------------------------- 1 file changed, 10 insertions(+), 63 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 58791ecede..86865fe477 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -925,9 +925,9 @@ const GETFEATURE_SERIALIZERS = { 'Or': makeChildAppender(writeLogicalFilter), 'Not': makeChildAppender(writeNotFilter), 'BBOX': makeChildAppender(writeBboxFilter), - 'Contains': makeChildAppender(writeContainsFilter), - 'Intersects': makeChildAppender(writeIntersectsFilter), - 'Within': makeChildAppender(writeWithinFilter), + 'Contains': makeChildAppender(writeSpatialFilter), + 'Intersects': makeChildAppender(writeSpatialFilter), + 'Within': makeChildAppender(writeSpatialFilter), 'DWithin': makeChildAppender(writeDWithinFilter), 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), @@ -945,11 +945,11 @@ const GETFEATURE_SERIALIZERS = { 'Or': makeChildAppender(writeLogicalFilter), 'Not': makeChildAppender(writeNotFilter), 'BBOX': makeChildAppender(writeBboxFilter), - 'Contains': makeChildAppender(writeContainsFilter), - 'Disjoint': makeChildAppender(writeDisjointFilter), - 'Intersects': makeChildAppender(writeIntersectsFilter), + 'Contains': makeChildAppender(writeSpatialFilter), + 'Disjoint': makeChildAppender(writeSpatialFilter), + 'Intersects': makeChildAppender(writeSpatialFilter), 'ResourceId': makeChildAppender(writeResourceIdFilter), - 'Within': makeChildAppender(writeWithinFilter), + 'Within': makeChildAppender(writeSpatialFilter), 'DWithin': makeChildAppender(writeDWithinFilter), 'PropertyIsEqualTo': makeChildAppender(writeComparisonFilter), 'PropertyIsNotEqualTo': makeChildAppender(writeComparisonFilter), @@ -1050,54 +1050,6 @@ function writeBboxFilter(node, filter, objectStack) { format.prototype.writeGeometryElement(node, filter.extent, objectStack); } -/** - * @param {Node} node Node. - * @param {import("./filter/Contains.js").default} filter Filter. - * @param {Array<*>} objectStack Node stack. - */ -function writeContainsFilter(node, filter, objectStack) { - const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); - const context = parent['context']; - const version = context['version']; - parent['srsName'] = filter.srsName; - const format = GML_FORMATS[version]; - - writePropertyName(version, node, filter.geometryName); - format.prototype.writeGeometryElement(node, filter.geometry, objectStack); -} - -/** - * @param {Node} node Node. - * @param {import("./filter/Intersects.js").default} filter Filter. - * @param {Array<*>} objectStack Node stack. - */ -function writeIntersectsFilter(node, filter, objectStack) { - const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); - const context = parent['context']; - const version = context['version']; - parent['srsName'] = filter.srsName; - const format = GML_FORMATS[version]; - - writePropertyName(version, node, filter.geometryName); - format.prototype.writeGeometryElement(node, filter.geometry, objectStack); -} - -/** - * @param {Node} node Node. - * @param {import("./filter/Disjoint.js").default} filter Filter. - * @param {Array<*>} objectStack Node stack. - */ -function writeDisjointFilter(node, filter, objectStack) { - const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); - const context = parent['context']; - const version = context['version']; - parent['srsName'] = filter.srsName; - const format = GML_FORMATS[version]; - - writePropertyName(version, node, filter.geometryName); - format.prototype.writeGeometryElement(node, filter.geometry, objectStack); -} - /** * @param {Element} node Element. * @param {import("./filter/ResourceId.js").default} filter Filter. @@ -1109,10 +1061,10 @@ function writeResourceIdFilter(node, filter, objectStack) { /** * @param {Node} node Node. - * @param {import("./filter/Within.js").default} filter Filter. + * @param {import("./filter/Spatial.js").default} filter Filter. * @param {Array<*>} objectStack Node stack. */ -function writeWithinFilter(node, filter, objectStack) { +function writeSpatialFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; @@ -1132,12 +1084,7 @@ function writeDWithinFilter(node, filter, objectStack) { const parent = /** @type {Object} */ (objectStack[objectStack.length - 1]); const context = parent['context']; const version = context['version']; - context['srsName'] = filter.srsName; - const format = GML_FORMATS[version]; - - writePropertyName(version, node, filter.geometryName); - format.prototype.writeGeometryElement(node, filter.geometry, objectStack); - + writeSpatialFilter(node, filter, objectStack); const distance = createElementNS(getFilterNS(version), 'Distance'); writeStringTextNode(distance, filter.distance.toString()); distance.setAttribute('uom', filter.unit); From 7261e255660fde5ac005bea2f738d44f4a67c9a0 Mon Sep 17 00:00:00 2001 From: Jannes Bolling Date: Wed, 14 Oct 2020 19:07:31 +0200 Subject: [PATCH 3/5] fix distanceWithin for WFS2.0 --- src/ol/format/WFS.js | 6 ++++- test/spec/ol/format/wfs.test.js | 46 +++++++++++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index 86865fe477..e433aba72a 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -1087,7 +1087,11 @@ function writeDWithinFilter(node, filter, objectStack) { writeSpatialFilter(node, filter, objectStack); const distance = createElementNS(getFilterNS(version), 'Distance'); writeStringTextNode(distance, filter.distance.toString()); - distance.setAttribute('uom', filter.unit); + if (version === '2.0.0') { + distance.setAttribute('uom', filter.unit); + } else { + distance.setAttribute('units', filter.unit); + } node.appendChild(distance); } diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index 2607bd51c2..4881d588c1 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', function () { + it('creates a dwithin filter for WFS 1.x', function () { const text = '' + ' ' + ' ' + - ' 10' + + ' 10' + ' ' + ' ' + ''; @@ -729,6 +729,48 @@ describe('ol.format.WFS', function () { expect(serialized.firstElementChild).to.xmleql(parse(text)); }); + it('creates a dwithin filter for WFS 2.0', 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: Thu, 15 Oct 2020 18:50:55 +0200 Subject: [PATCH 4/5] fix Filter namespace handling for WFS 2.0 requests --- src/ol/format/WFS.js | 50 +++----- test/spec/ol/format/wfs.test.js | 217 +++++++++++++++++++++++++------- 2 files changed, 191 insertions(+), 76 deletions(-) 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)); + }); }); }); From 6b86c5f78d879aad57c66b5a5ab206055cf30247 Mon Sep 17 00:00:00 2001 From: Jannes Bolling Date: Mon, 19 Oct 2020 10:37:13 +0200 Subject: [PATCH 5/5] recreate old during filter behaviour for backwardscompatibility --- src/ol/format/WFS.js | 2 +- test/spec/ol/format/wfs.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ol/format/WFS.js b/src/ol/format/WFS.js index f0983b1f04..aadbe7ec68 100644 --- a/src/ol/format/WFS.js +++ b/src/ol/format/WFS.js @@ -1105,7 +1105,7 @@ function writeDuringFilter(node, filter, objectStack) { const context = parent['context']; const version = context['version']; - writePropertyName(version, node, filter.propertyName); + writeExpression(FESNS[version], 'ValueReference', node, filter.propertyName); const timePeriod = createElementNS(GMLNS, 'TimePeriod'); node.appendChild(timePeriod); diff --git a/test/spec/ol/format/wfs.test.js b/test/spec/ol/format/wfs.test.js index fc30e14e5d..45be23a0ac 100644 --- a/test/spec/ol/format/wfs.test.js +++ b/test/spec/ol/format/wfs.test.js @@ -735,7 +735,7 @@ describe('ol.format.WFS', function () { ' typeName="states" srsName="EPSG:4326">' + ' ' + ' ' + - ' date_prop' + + ' date_prop' + ' ' + ' ' + ' ' +