rli
31 oktober 2022 om 09:27
1
Er gaat iets niet goed bij het zoeken via GetFeature met een wildcard in combinatie met een ( en ) in de waarde:
b.v. ik zoek op een waarde in status die “(niet ingemeten)” moet bevatten.
Dat levert geen resultaat.
Als ik zoek op een waarde in status die “niet ingemeten” moet bevatten dan levert dat wel resultaat.
URL: https://service.pdok.nl/lv/bag/wfs/v2_0
<GetFeature xmlns="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" outputFormat="application/json" startIndex="0" count="1000"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<Query typeNames="bag:pand" srsName="EPSG:28992">
<Filter xmlns="http://www.opengis.net/fes/2.0">
<And>
<PropertyIsLike escape="" singleChar="_" wildCard="%" matchCase="true">
<ValueReference>status</ValueReference>
<Literal>%(niet ingemeten)%</Literal>
</PropertyIsLike>
<Intersects>
<ValueReference>geom</ValueReference>
<Polygon xmlns="http://www.opengis.net/gml/3.2" srsName="EPSG:28992">
<exterior>
<LinearRing srsName="EPSG:28992">
<posList srsDimension="2">143594.8315 465577.94999999995 143594.8315 465775.35 143813.0215 465775.35 143813.0215 465577.94999999995 143594.8315 465577.94999999995</posList>
</LinearRing>
</exterior>
</Polygon>
</Intersects>
</And>
</Filter>
</Query>
</GetFeature>
Hoi Ron,
Tip: Als je xml code in je bericht zet, dan werkt dat het beste als je dat markeert als “Vooraf opgemaakte tekst” (zie screenshot hieronder). Anders worden de tags geinterpreteerd als html, en verdwijnen ze. Nu blijft dus alleen de tekst van je filter over in je bericht.
Hoi @rli ,
Ik heb de oorzaak nog niet gevonden, maar wil even laten weten dat we er naar aan het kijken zijn.
rli
3 november 2022 om 06:58
5
Oke, mogelijk dat er iets mis gaat met het samenstellen van de where-clause door de haakjes?
Hoi @rli ,
De haakjes lijken inderdaad door mapserver verkeerd verwerkt te worden. (De haakjes worden in de sql query escaped, hierdoor gaat de filter mis.)
Dit lijkt ons een bug, dus ik heb hiervoor een issue aangemaakt bij het mapserver project:
opened 09:26AM - 08 Nov 22 UTC
closed 01:45PM - 16 Nov 22 UTC
## Expected behavior and actual behavior
We have a GetFeature wfs request and… want to filter on a string which contains parentheses, e.g. `Pand in gebruik (niet ingemeten)`.
Using the PropertyIsLike filter we expect to filter this feature with `*(niet ingemeten)`.
But it fails to find the feature.
PropertyIsLike snippet:
```xml
<PropertyIsLike escapeChar="[" singleChar="." wildCard="*" matchCase="true">
<ValueReference>status</ValueReference>
<Literal>* (niet ingemeten)</Literal>
</PropertyIsLike>
```
With debug log enabled we see that Mapserver converts the request to an sql stamenent and escapes these parentheses, e.g.
`... FROM "pand" WHERE ("pand"."status" GLOB '*\(niet ingemeten\)')`
Hence it doesn't find anything.
This makes it impossible to filter on strings containing parentheses. I would consider this as a bug, since the escaped parentheses in the sql doesn't seem to be of any use to me.
Or am I wrong?
## Steps to reproduce
See zip file for a simple gpkg and mapfile config.
```shell
# Start a mapserver
docker run --rm -v `pwd`:/srv/data -e MS_MAPFILE=/srv/data/config/mapfile/service.map -p 8080:80 --name mapserver pdok/mapserver
# GetFeature request which fails (but should succeed)
curl --location --request POST 'localhost:8080/lv/bag/wfs/v2_0' \
--header 'Content-Type: application/xml' \
--data-raw '<GetFeature xmlns="http://www.opengis.net/wfs/2.0" service="WFS" version="2.0.0" outputFormat="application/json" startIndex="0" count="1000"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.opengis.net/wfs/2.0 http://schemas.opengis.net/wfs/2.0/wfs.xsd">
<Query typeNames="bag:pand" srsName="EPSG:28992">
<Filter xmlns="http://www.opengis.net/fes/2.0">
<PropertyIsLike escapeChar="[" singleChar="." wildCard="*" matchCase="true">
<ValueReference>status</ValueReference>
<Literal>* (niet ingemeten)</Literal>
</PropertyIsLike>
</Filter>
</Query>
</GetFeature>'
# Corresponding SQL snippet (from mapserver debug log)
# ... FROM "pand" WHERE (("pand"."status" GLOB '* \(niet ingemeten\)'))
```
## System
[reproduce-issue.zip](https://github.com/MapServer/MapServer/files/9959603/reproduce-issue.zip)
- os: Debian buster
- mapserver verison: 7.6.4
- gdal version: libgdal20 2.4.0+dfsg-1+b1
In het specifieke geval van de bag panden kan je natuurlijk ook zonder haakjes filteren met %niet ingemeten_
. Bag panden hebben maar een beperkt aantal (10) statussen, zie:
Praktijkhandleiding BAG: Welke statussen kent de BAG en wat betekenen deze statussen? > Pand
Maargoed, dat neemt niet weg dat het wel mogelijk zou moeten zijn.
Bedankt voor het melden!
rli
8 november 2022 om 16:14
7
Het is geen usecase die in de praktijk zal voorkomen maar een testgeval met wildcard waar we toevallig tegenaan liepen. Misschien zijn er in de toekomst wel usecases waarin met wildcard en haakjes wordt gezocht. Het zou dan fijn zijn dat het wordt opgelost in Mapserver. Mapserver lijkt voor dat soort dingen minder ontwikkeld dan Geoserver, zie ook het nested query probleem (andere melding van mij).