Skip to content

Commit

Permalink
fix IN operator on SQLStatementToFilter when list has only one item
Browse files Browse the repository at this point in the history
  • Loading branch information
signedav committed Apr 19, 2023
1 parent 7f84aaa commit b603a2e
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 1 deletion.
15 changes: 14 additions & 1 deletion src/core/qgsogcutils.cpp
Expand Up @@ -2716,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
20 changes: 20 additions & 0 deletions tests/src/core/testqgsogcutils.cpp
Expand Up @@ -1079,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 b603a2e

Please sign in to comment.