Fix #8584 (WFS requests with FILTER fails against Geoserver)

This commit is contained in:
Martin Dobias 2014-02-08 01:09:31 +07:00
parent 8b8eb562f4
commit 10c15089d1
2 changed files with 12 additions and 9 deletions

View File

@ -15,6 +15,7 @@
static const QString GML_NAMESPACE = "http://www.opengis.net/gml"; static const QString GML_NAMESPACE = "http://www.opengis.net/gml";
static const QString OGC_NAMESPACE = "http://www.opengis.net/ogc";
QgsGeometry* QgsOgcUtils::geometryFromGML( const QDomNode& geometryNode ) QgsGeometry* QgsOgcUtils::geometryFromGML( const QDomNode& geometryNode )
{ {
@ -1879,7 +1880,7 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression& exp, QDomDo
if ( exprRootElem.isNull() ) if ( exprRootElem.isNull() )
return QDomElement(); return QDomElement();
QDomElement filterElem = doc.createElement( "ogc:Filter" ); QDomElement filterElem = doc.createElementNS( OGC_NAMESPACE, "ogc:Filter" );
filterElem.appendChild( exprRootElem ); filterElem.appendChild( exprRootElem );
return filterElem; return filterElem;
} }

View File

@ -246,19 +246,21 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
QTest::addColumn<QString>( "xmlText" ); QTest::addColumn<QString>( "xmlText" );
QTest::newRow( "=" ) << QString( "NAME = 'New York'" ) << QString( QTest::newRow( "=" ) << QString( "NAME = 'New York'" ) << QString(
"<ogc:Filter><ogc:PropertyIsEqualTo>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>NAME</ogc:PropertyName>" "<ogc:PropertyName>NAME</ogc:PropertyName>"
"<ogc:Literal>New York</ogc:Literal>" "<ogc:Literal>New York</ogc:Literal>"
"</ogc:PropertyIsEqualTo></ogc:Filter>" ); "</ogc:PropertyIsEqualTo></ogc:Filter>" );
QTest::newRow( ">" ) << QString( "COUNT > 3" ) << QString( QTest::newRow( ">" ) << QString( "COUNT > 3" ) << QString(
"<ogc:Filter><ogc:PropertyIsGreaterThan>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:PropertyIsGreaterThan>"
"<ogc:PropertyName>COUNT</ogc:PropertyName>" "<ogc:PropertyName>COUNT</ogc:PropertyName>"
"<ogc:Literal>3</ogc:Literal>" "<ogc:Literal>3</ogc:Literal>"
"</ogc:PropertyIsGreaterThan></ogc:Filter>" ); "</ogc:PropertyIsGreaterThan></ogc:Filter>" );
QTest::newRow( "and+or" ) << QString( "(FIELD1 = 10 OR FIELD1 = 20) AND STATUS = 'VALID'" ) << QString( QTest::newRow( "and+or" ) << QString( "(FIELD1 = 10 OR FIELD1 = 20) AND STATUS = 'VALID'" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:And>" "<ogc:And>"
"<ogc:Or>" "<ogc:Or>"
"<ogc:PropertyIsEqualTo>" "<ogc:PropertyIsEqualTo>"
@ -278,14 +280,14 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
"</ogc:Filter>" ); "</ogc:Filter>" );
QTest::newRow( "is null" ) << QString( "X IS NULL" ) << QString( QTest::newRow( "is null" ) << QString( "X IS NULL" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:PropertyIsNull>" "<ogc:PropertyIsNull>"
"<ogc:PropertyName>X</ogc:PropertyName>" "<ogc:PropertyName>X</ogc:PropertyName>"
"</ogc:PropertyIsNull>" "</ogc:PropertyIsNull>"
"</ogc:Filter>" ); "</ogc:Filter>" );
QTest::newRow( "is not null" ) << QString( "X IS NOT NULL" ) << QString( QTest::newRow( "is not null" ) << QString( "X IS NOT NULL" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Not>" "<ogc:Not>"
"<ogc:PropertyIsNull>" "<ogc:PropertyIsNull>"
"<ogc:PropertyName>X</ogc:PropertyName>" "<ogc:PropertyName>X</ogc:PropertyName>"
@ -294,7 +296,7 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
"</ogc:Filter>" ); "</ogc:Filter>" );
QTest::newRow( "in" ) << QString( "A IN (10,20,30)" ) << QString( QTest::newRow( "in" ) << QString( "A IN (10,20,30)" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Or>" "<ogc:Or>"
"<ogc:PropertyIsEqualTo>" "<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>A</ogc:PropertyName>" "<ogc:PropertyName>A</ogc:PropertyName>"
@ -312,7 +314,7 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
"</ogc:Filter>" ); "</ogc:Filter>" );
QTest::newRow( "intersects + wkt" ) << QString( "intersects($geometry, geomFromWKT('POINT (5 6)'))" ) << QString( QTest::newRow( "intersects + wkt" ) << QString( "intersects($geometry, geomFromWKT('POINT (5 6)'))" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Intersects>" "<ogc:Intersects>"
"<ogc:PropertyName>geometry</ogc:PropertyName>" "<ogc:PropertyName>geometry</ogc:PropertyName>"
"<gml:Point><gml:coordinates cs=\",\" ts=\" \">5,6</gml:coordinates></gml:Point>" "<gml:Point><gml:coordinates cs=\",\" ts=\" \">5,6</gml:coordinates></gml:Point>"
@ -320,7 +322,7 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
"</ogc:Filter>" ); "</ogc:Filter>" );
QTest::newRow( "contains + gml" ) << QString( "contains($geometry, geomFromGML('<Point><coordinates cs=\",\" ts=\" \">5,6</coordinates></Point>'))" ) << QString( QTest::newRow( "contains + gml" ) << QString( "contains($geometry, geomFromGML('<Point><coordinates cs=\",\" ts=\" \">5,6</coordinates></Point>'))" ) << QString(
"<ogc:Filter>" "<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Contains>" "<ogc:Contains>"
"<ogc:PropertyName>geometry</ogc:PropertyName>" "<ogc:PropertyName>geometry</ogc:PropertyName>"
"<Point><coordinates cs=\",\" ts=\" \">5,6</coordinates></Point>" "<Point><coordinates cs=\",\" ts=\" \">5,6</coordinates></Point>"