Skip to content

Commit c8a76f8

Browse files
committedOct 26, 2014
support ogc binary operation with more than two operands (fixes #10053)
1 parent 7e69dbd commit c8a76f8

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed
 

‎src/core/qgsogcutils.cpp

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1595,25 +1595,37 @@ QgsExpression::NodeBinaryOperator* QgsOgcUtils::nodeBinaryOperatorFromOgcFilter(
15951595
}
15961596

15971597
QDomElement operandElem = element.firstChildElement();
1598-
QgsExpression::Node* opLeft = nodeFromOgcFilter( operandElem, errorMessage );
1599-
if ( !opLeft )
1598+
QgsExpression::Node *expr = nodeFromOgcFilter( operandElem, errorMessage ), *leftOp = expr;
1599+
if ( !expr )
16001600
{
16011601
if ( errorMessage.isEmpty() )
16021602
errorMessage = QString( "invalid left operand for '%1' binary operator" ).arg( element.tagName() );
16031603
return NULL;
16041604
}
16051605

1606-
operandElem = operandElem.nextSiblingElement();
1607-
QgsExpression::Node* opRight = nodeFromOgcFilter( operandElem, errorMessage );
1608-
if ( !opRight )
1606+
for( operandElem = operandElem.nextSiblingElement(); !operandElem.isNull(); operandElem = operandElem.nextSiblingElement() )
1607+
{
1608+
QgsExpression::Node* opRight = nodeFromOgcFilter( operandElem, errorMessage );
1609+
if ( !opRight )
1610+
{
1611+
if ( errorMessage.isEmpty() )
1612+
errorMessage = QString( "invalid right operand for '%1' binary operator" ).arg( element.tagName() );
1613+
delete expr;
1614+
return NULL;
1615+
}
1616+
1617+
expr = new QgsExpression::NodeBinaryOperator(( QgsExpression::BinaryOperator ) op, expr, opRight );
1618+
}
1619+
1620+
if( expr == leftOp )
16091621
{
16101622
if ( errorMessage.isEmpty() )
1611-
errorMessage = QString( "invalid right operand for '%1' binary operator" ).arg( element.tagName() );
1612-
delete opLeft;
1623+
errorMessage = QString( "only one operand for '%1' binary operator" ).arg( element.tagName() );
1624+
delete expr;
16131625
return NULL;
16141626
}
16151627

1616-
return new QgsExpression::NodeBinaryOperator(( QgsExpression::BinaryOperator ) op, opLeft, opRight );
1628+
return dynamic_cast< QgsExpression::NodeBinaryOperator * >( expr );
16171629
}
16181630

16191631

@@ -1843,7 +1855,6 @@ QgsExpression::Node* QgsOgcUtils::nodeIsBetweenFromOgcFilter( QDomElement& eleme
18431855
}
18441856

18451857

1846-
18471858
QgsExpression::NodeBinaryOperator* QgsOgcUtils::nodePropertyIsNullFromOgcFilter( QDomElement& element, QString& errorMessage )
18481859
{
18491860
// convert ogc:PropertyIsNull to IS operator with NULL right operand
@@ -1865,8 +1876,6 @@ QgsExpression::NodeBinaryOperator* QgsOgcUtils::nodePropertyIsNullFromOgcFilter(
18651876
/////////////////
18661877

18671878

1868-
1869-
18701879
QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression& exp, QDomDocument& doc, QString* errorMessage )
18711880
{
18721881
if ( !exp.rootNode() )

0 commit comments

Comments
 (0)
Please sign in to comment.