Skip to content

Commit

Permalink
Merge pull request #52733 from signedav/fix_single_IN
Browse files Browse the repository at this point in the history
Fix OGC Filter on IN operator with only one list item
  • Loading branch information
elpaso committed Apr 21, 2023
2 parents 9423166 + b603a2e commit 18bed46
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 2 deletions.
30 changes: 28 additions & 2 deletions src/core/qgsogcutils.cpp
Expand Up @@ -2216,7 +2216,20 @@ QDomElement QgsOgcUtilsExprToFilter::expressionColumnRefToOgcFilter( const QgsEx
QDomElement QgsOgcUtilsExprToFilter::expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
{
if ( node->list()->list().size() == 1 )
return expressionNodeToOgcFilter( node->list()->list()[0], expression, context );
{
const QDomElement leftNode = expressionNodeToOgcFilter( node->node(), expression, context );
const QDomElement firstListNode = expressionNodeToOgcFilter( node->list()->list().first(), expression, context );
QDomElement eqElem = mDoc.createElement( mFilterPrefix + ":PropertyIsEqualTo" );
eqElem.appendChild( leftNode );
eqElem.appendChild( firstListNode );
if ( node->isNotIn() )
{
QDomElement notElem = mDoc.createElement( mFilterPrefix + ":Not" );
notElem.appendChild( eqElem );
return notElem;
}
return eqElem;
}

QDomElement orElem = mDoc.createElement( mFilterPrefix + ":Or" );
const QDomElement leftNode = expressionNodeToOgcFilter( node->node(), expression, context );
Expand Down Expand Up @@ -2703,7 +2716,20 @@ QDomElement QgsOgcUtilsSQLStatementToFilter::toOgcFilter( const QgsSQLStatement:
QDomElement QgsOgcUtilsSQLStatementToFilter::toOgcFilter( const QgsSQLStatement::NodeInOperator *node )
{
if ( node->list()->list().size() == 1 )
return toOgcFilter( node->list()->list()[0] );
{
const QDomElement leftNode = toOgcFilter( node->node() );
const QDomElement firstListNode = toOgcFilter( node->list()->list().first() );
QDomElement eqElem = mDoc.createElement( mFilterPrefix + ":PropertyIsEqualTo" );
eqElem.appendChild( leftNode );
eqElem.appendChild( firstListNode );
if ( node->isNotIn() )
{
QDomElement notElem = mDoc.createElement( mFilterPrefix + ":Not" );
notElem.appendChild( eqElem );
return notElem;
}
return eqElem;
}

QDomElement orElem = mDoc.createElement( mFilterPrefix + ":Or" );
const QDomElement leftNode = toOgcFilter( node->node() );
Expand Down
38 changes: 38 additions & 0 deletions tests/src/core/testqgsogcutils.cpp
Expand Up @@ -700,6 +700,24 @@ void TestQgsOgcUtils::testExpressionToOgcFilter_data()
"</ogc:Not>"
"</ogc:Filter>" );

QTest::newRow( "in" ) << QStringLiteral( "A IN (10)" ) << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>A</ogc:PropertyName>"
"<ogc:Literal>10</ogc:Literal>"
"</ogc:PropertyIsEqualTo>"
"</ogc:Filter>" );

QTest::newRow( "not in" ) << QStringLiteral( "A NOT IN (10)" ) << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Not>"
"<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>A</ogc:PropertyName>"
"<ogc:Literal>10</ogc:Literal>"
"</ogc:PropertyIsEqualTo>"
"</ogc:Not>"
"</ogc:Filter>" );

QTest::newRow( "intersects_bbox" ) << QStringLiteral( "intersects_bbox($geometry, geomFromWKT('POINT (5 6)'))" ) << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\" xmlns:gml=\"http://www.opengis.net/gml\">"
"<ogc:BBOX>"
Expand Down Expand Up @@ -1061,6 +1079,26 @@ void TestQgsOgcUtils::testSQLStatementToOgcFilter_data()
"</ogc:Not>"
"</ogc:Filter>" );

QTest::newRow( "in" ) << QStringLiteral( "SELECT * FROM t WHERE A IN (10)" ) <<
QgsOgcUtils::GML_2_1_2 << QgsOgcUtils::FILTER_OGC_1_0 << layerProperties << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>A</ogc:PropertyName>"
"<ogc:Literal>10</ogc:Literal>"
"</ogc:PropertyIsEqualTo>"
"</ogc:Filter>" );

QTest::newRow( "not in" ) << QStringLiteral( "SELECT * FROM t WHERE A NOT IN (10)" ) <<
QgsOgcUtils::GML_2_1_2 << QgsOgcUtils::FILTER_OGC_1_0 << layerProperties << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
"<ogc:Not>"
"<ogc:PropertyIsEqualTo>"
"<ogc:PropertyName>A</ogc:PropertyName>"
"<ogc:Literal>10</ogc:Literal>"
"</ogc:PropertyIsEqualTo>"
"</ogc:Not>"
"</ogc:Filter>" );

QTest::newRow( "between" ) << QStringLiteral( "SELECT * FROM t WHERE A BETWEEN 1 AND 2" ) <<
QgsOgcUtils::GML_2_1_2 << QgsOgcUtils::FILTER_OGC_1_0 << layerProperties << QString(
"<ogc:Filter xmlns:ogc=\"http://www.opengis.net/ogc\">"
Expand Down

0 comments on commit 18bed46

Please sign in to comment.