Skip to content

Commit 6a18821

Browse files
committedSep 13, 2018
Add more node methods
1 parent edfa401 commit 6a18821

File tree

2 files changed

+151
-150
lines changed

2 files changed

+151
-150
lines changed
 

‎src/core/qgsogcutils.cpp

Lines changed: 147 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -1718,104 +1718,35 @@ QgsExpressionNode *QgsOgcUtils::nodeFromOgcFilter( QDomElement &element, QString
17181718
QgsExpressionNodeBinaryOperator *QgsOgcUtils::nodeBinaryOperatorFromOgcFilter( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer )
17191719
{
17201720
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0, layer );
1721-
QgsExpressionNode *node = utils.nodeBinaryOperatorFromOgcFilter( element );
1721+
QgsExpressionNodeBinaryOperator *node = utils.nodeBinaryOperatorFromOgcFilter( element );
17221722
errorMessage = utils.errorMessage();
1723-
retur node;
1723+
return node;
17241724
}
17251725

17261726
QgsExpressionNodeFunction *QgsOgcUtils::nodeSpatialOperatorFromOgcFilter( QDomElement &element, QString &errorMessage )
17271727
{
1728-
// we are exploiting the fact that our function names are the same as the XML tag names
1729-
int opIdx = QgsExpression::functionIndex( element.tagName().toLower() );
1730-
1731-
QgsExpressionNode::NodeList *gml2Args = new QgsExpressionNode::NodeList();
1732-
QDomElement childElem = element.firstChildElement();
1733-
QString gml2Str;
1734-
while ( !childElem.isNull() && gml2Str.isEmpty() )
1735-
{
1736-
if ( childElem.tagName() != QLatin1String( "PropertyName" ) )
1737-
{
1738-
QTextStream gml2Stream( &gml2Str );
1739-
childElem.save( gml2Stream, 0 );
1740-
}
1741-
childElem = childElem.nextSiblingElement();
1742-
}
1743-
if ( !gml2Str.isEmpty() )
1744-
{
1745-
gml2Args->append( new QgsExpressionNodeLiteral( QVariant( gml2Str.remove( '\n' ) ) ) );
1746-
}
1747-
else
1748-
{
1749-
errorMessage = QObject::tr( "No OGC Geometry found" );
1750-
delete gml2Args;
1751-
return nullptr;
1752-
}
1753-
1754-
QgsExpressionNode::NodeList *opArgs = new QgsExpressionNode::NodeList();
1755-
opArgs->append( new QgsExpressionNodeFunction( QgsExpression::functionIndex( QStringLiteral( "$geometry" ) ), new QgsExpressionNode::NodeList() ) );
1756-
opArgs->append( new QgsExpressionNodeFunction( QgsExpression::functionIndex( QStringLiteral( "geomFromGML" ) ), gml2Args ) );
1757-
1758-
return new QgsExpressionNodeFunction( opIdx, opArgs );
1728+
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1729+
QgsExpressionNodeFunction *node = utils.nodeSpatialOperatorFromOgcFilter( element );
1730+
errorMessage = utils.errorMessage();
1731+
return node;
17591732
}
17601733

1761-
17621734
QgsExpressionNodeUnaryOperator *QgsOgcUtils::nodeNotFromOgcFilter( QDomElement &element, QString &errorMessage )
17631735
{
1764-
if ( element.tagName() != QLatin1String( "Not" ) )
1765-
return nullptr;
1766-
1767-
QDomElement operandElem = element.firstChildElement();
1768-
QgsExpressionNode *operand = nodeFromOgcFilter( operandElem, errorMessage );
1769-
if ( !operand )
1770-
{
1771-
if ( errorMessage.isEmpty() )
1772-
errorMessage = QObject::tr( "invalid operand for '%1' unary operator" ).arg( element.tagName() );
1773-
return nullptr;
1774-
}
1775-
1776-
return new QgsExpressionNodeUnaryOperator( QgsExpressionNodeUnaryOperator::uoNot, operand );
1736+
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1737+
QgsExpressionNodeUnaryOperator *node = utils.nodeNotFromOgcFilter( element );
1738+
errorMessage = utils.errorMessage();
1739+
return node;
17771740
}
17781741

1779-
17801742
QgsExpressionNodeFunction *QgsOgcUtils::nodeFunctionFromOgcFilter( QDomElement &element, QString &errorMessage )
17811743
{
1782-
if ( element.isNull() || element.tagName() != QLatin1String( "Function" ) )
1783-
{
1784-
errorMessage = QObject::tr( "ogc:Function expected, got %1" ).arg( element.tagName() );
1785-
return nullptr;
1786-
}
1787-
1788-
for ( int i = 0; i < QgsExpression::Functions().size(); i++ )
1789-
{
1790-
QgsExpressionFunction *funcDef = QgsExpression::Functions()[i];
1791-
1792-
if ( element.attribute( QStringLiteral( "name" ) ) != funcDef->name() )
1793-
continue;
1794-
1795-
QgsExpressionNode::NodeList *args = new QgsExpressionNode::NodeList();
1796-
1797-
QDomElement operandElem = element.firstChildElement();
1798-
while ( !operandElem.isNull() )
1799-
{
1800-
QgsExpressionNode *op = nodeFromOgcFilter( operandElem, errorMessage );
1801-
if ( !op )
1802-
{
1803-
delete args;
1804-
return nullptr;
1805-
}
1806-
args->append( op );
1807-
1808-
operandElem = operandElem.nextSiblingElement();
1809-
}
1810-
1811-
return new QgsExpressionNodeFunction( i, args );
1812-
}
1813-
1814-
return nullptr;
1744+
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1745+
QgsExpressionNodeFunction *node = utils.nodeFunctionFromOgcFilter( element );
1746+
errorMessage = utils.errorMessage();
1747+
return node;
18151748
}
18161749

1817-
1818-
18191750
QgsExpressionNode *QgsOgcUtils::nodeLiteralFromOgcFilter( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer )
18201751
{
18211752
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0, layer );
@@ -1824,81 +1755,28 @@ QgsExpressionNode *QgsOgcUtils::nodeLiteralFromOgcFilter( QDomElement &element,
18241755
return node;
18251756
}
18261757

1827-
18281758
QgsExpressionNodeColumnRef *QgsOgcUtils::nodeColumnRefFromOgcFilter( QDomElement &element, QString &errorMessage )
18291759
{
18301760
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1831-
QgsExpressionNode *node = utils.nodeColumnRefFromOgcFilter( element );
1761+
QgsExpressionNodeColumnRef *node = utils.nodeColumnRefFromOgcFilter( element );
18321762
errorMessage = utils.errorMessage();
18331763
return node;
18341764
}
18351765

1836-
18371766
QgsExpressionNode *QgsOgcUtils::nodeIsBetweenFromOgcFilter( QDomElement &element, QString &errorMessage )
18381767
{
1839-
// <ogc:PropertyIsBetween> encode a Range check
1840-
QgsExpressionNode *operand = nullptr, *lowerBound = nullptr;
1841-
QgsExpressionNode *operand2 = nullptr, *upperBound = nullptr;
1842-
1843-
QDomElement operandElem = element.firstChildElement();
1844-
while ( !operandElem.isNull() )
1845-
{
1846-
if ( operandElem.tagName() == QLatin1String( "LowerBoundary" ) )
1847-
{
1848-
QDomElement lowerBoundElem = operandElem.firstChildElement();
1849-
lowerBound = nodeFromOgcFilter( lowerBoundElem, errorMessage );
1850-
}
1851-
else if ( operandElem.tagName() == QLatin1String( "UpperBoundary" ) )
1852-
{
1853-
QDomElement upperBoundElem = operandElem.firstChildElement();
1854-
upperBound = nodeFromOgcFilter( upperBoundElem, errorMessage );
1855-
}
1856-
else
1857-
{
1858-
// <ogc:expression>
1859-
// both operand and operand2 contain the same expression,
1860-
// they are respectively compared to lower bound and upper bound
1861-
operand = nodeFromOgcFilter( operandElem, errorMessage );
1862-
operand2 = nodeFromOgcFilter( operandElem, errorMessage );
1863-
}
1864-
1865-
if ( operand && lowerBound && operand2 && upperBound )
1866-
break;
1867-
1868-
operandElem = operandElem.nextSiblingElement();
1869-
}
1870-
1871-
if ( !operand || !lowerBound || !operand2 || !upperBound )
1872-
{
1873-
delete operand;
1874-
delete lowerBound;
1875-
delete upperBound;
1876-
1877-
errorMessage = QObject::tr( "missing some required sub-elements in ogc:PropertyIsBetween" );
1878-
return nullptr;
1879-
}
1880-
1881-
QgsExpressionNode *geOperator = new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boGE, operand, lowerBound );
1882-
QgsExpressionNode *leOperator = new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boLE, operand2, upperBound );
1883-
return new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boAnd, geOperator, leOperator );
1768+
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1769+
QgsExpressionNode *node = utils.nodeIsBetweenFromOgcFilter( element );
1770+
errorMessage = utils.errorMessage();
1771+
return node;
18841772
}
18851773

1886-
18871774
QgsExpressionNodeBinaryOperator *QgsOgcUtils::nodePropertyIsNullFromOgcFilter( QDomElement &element, QString &errorMessage )
18881775
{
1889-
// convert ogc:PropertyIsNull to IS operator with NULL right operand
1890-
if ( element.tagName() != QLatin1String( "PropertyIsNull" ) )
1891-
{
1892-
return nullptr;
1893-
}
1894-
1895-
QDomElement operandElem = element.firstChildElement();
1896-
QgsExpressionNode *opLeft = nodeFromOgcFilter( operandElem, errorMessage );
1897-
if ( !opLeft )
1898-
return nullptr;
1899-
1900-
QgsExpressionNode *opRight = new QgsExpressionNodeLiteral( QVariant() );
1901-
return new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boIs, opLeft, opRight );
1776+
QgsOgcUtilsExprFromFilter utils( QgsOgcUtils::FILTER_OGC_1_0 );
1777+
QgsExpressionNodeBinaryOperator *node = utils.nodePropertyIsNullFromOgcFilter( element );
1778+
errorMessage = utils.errorMessage();
1779+
return node;
19021780
}
19031781

19041782

@@ -3243,30 +3121,29 @@ QgsExpressionNode *QgsOgcUtilsExprFromFilter::nodeFromOgcFilter( const QDomEleme
32433121
}
32443122

32453123
// check for other OGC operators, convert them to expressions
3246-
32473124
if ( element.tagName() == QLatin1String( "Not" ) )
32483125
{
3249-
// return nodeNotFromOgcFilter( element, errorMessage );
3126+
return nodeNotFromOgcFilter( element );
32503127
}
32513128
else if ( element.tagName() == QLatin1String( "PropertyIsNull" ) )
32523129
{
3253-
// return nodePropertyIsNullFromOgcFilter( element, errorMessage );
3130+
return nodePropertyIsNullFromOgcFilter( element );
32543131
}
32553132
else if ( element.tagName() == QLatin1String( "Literal" ) )
32563133
{
32573134
return nodeLiteralFromOgcFilter( element );
32583135
}
32593136
else if ( element.tagName() == QLatin1String( "Function" ) )
32603137
{
3261-
// return nodeFunctionFromOgcFilter( element, errorMessage );
3138+
return nodeFunctionFromOgcFilter( element );
32623139
}
32633140
else if ( element.tagName() == mPropertyName )
32643141
{
32653142
return nodeColumnRefFromOgcFilter( element );
32663143
}
32673144
else if ( element.tagName() == QLatin1String( "PropertyIsBetween" ) )
32683145
{
3269-
// return nodeIsBetweenFromOgcFilter( element, errorMessage );
3146+
return nodeIsBetweenFromOgcFilter( element );
32703147
}
32713148

32723149
mErrorMessage += QObject::tr( "unable to convert '%1' element to a valid expression: it is not supported yet or it has invalid arguments" ).arg( element.tagName() );
@@ -3519,6 +3396,126 @@ QgsExpressionNode *QgsOgcUtilsExprFromFilter::nodeLiteralFromOgcFilter( const QD
35193396
return nullptr;
35203397
}
35213398

3399+
QgsExpressionNodeUnaryOperator *QgsOgcUtilsExprFromFilter::nodeNotFromOgcFilter( const QDomElement &element )
3400+
{
3401+
if ( element.tagName() != QLatin1String( "Not" ) )
3402+
return nullptr;
3403+
3404+
QDomElement operandElem = element.firstChildElement();
3405+
QgsExpressionNode *operand = nodeFromOgcFilter( operandElem );
3406+
if ( !operand )
3407+
{
3408+
if ( mErrorMessage.isEmpty() )
3409+
mErrorMessage = QObject::tr( "invalid operand for '%1' unary operator" ).arg( element.tagName() );
3410+
return nullptr;
3411+
}
3412+
3413+
return new QgsExpressionNodeUnaryOperator( QgsExpressionNodeUnaryOperator::uoNot, operand );
3414+
}
3415+
3416+
QgsExpressionNodeBinaryOperator *QgsOgcUtilsExprFromFilter::nodePropertyIsNullFromOgcFilter( const QDomElement &element )
3417+
{
3418+
// convert ogc:PropertyIsNull to IS operator with NULL right operand
3419+
if ( element.tagName() != QLatin1String( "PropertyIsNull" ) )
3420+
{
3421+
return nullptr;
3422+
}
3423+
3424+
QDomElement operandElem = element.firstChildElement();
3425+
QgsExpressionNode *opLeft = nodeFromOgcFilter( operandElem );
3426+
if ( !opLeft )
3427+
return nullptr;
3428+
3429+
QgsExpressionNode *opRight = new QgsExpressionNodeLiteral( QVariant() );
3430+
return new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boIs, opLeft, opRight );
3431+
}
3432+
3433+
QgsExpressionNodeFunction *QgsOgcUtilsExprFromFilter::nodeFunctionFromOgcFilter( const QDomElement &element )
3434+
{
3435+
if ( element.isNull() || element.tagName() != QLatin1String( "Function" ) )
3436+
{
3437+
mErrorMessage = QObject::tr( "ogc:Function expected, got %1" ).arg( element.tagName() );
3438+
return nullptr;
3439+
}
3440+
3441+
for ( int i = 0; i < QgsExpression::Functions().size(); i++ )
3442+
{
3443+
QgsExpressionFunction *funcDef = QgsExpression::Functions()[i];
3444+
3445+
if ( element.attribute( QStringLiteral( "name" ) ) != funcDef->name() )
3446+
continue;
3447+
3448+
QgsExpressionNode::NodeList *args = new QgsExpressionNode::NodeList();
3449+
3450+
QDomElement operandElem = element.firstChildElement();
3451+
while ( !operandElem.isNull() )
3452+
{
3453+
QgsExpressionNode *op = nodeFromOgcFilter( operandElem );
3454+
if ( !op )
3455+
{
3456+
delete args;
3457+
return nullptr;
3458+
}
3459+
args->append( op );
3460+
3461+
operandElem = operandElem.nextSiblingElement();
3462+
}
3463+
3464+
return new QgsExpressionNodeFunction( i, args );
3465+
}
3466+
3467+
return nullptr;
3468+
}
3469+
3470+
QgsExpressionNode *QgsOgcUtilsExprFromFilter::nodeIsBetweenFromOgcFilter( const QDomElement &element )
3471+
{
3472+
// <ogc:PropertyIsBetween> encode a Range check
3473+
QgsExpressionNode *operand = nullptr, *lowerBound = nullptr;
3474+
QgsExpressionNode *operand2 = nullptr, *upperBound = nullptr;
3475+
3476+
QDomElement operandElem = element.firstChildElement();
3477+
while ( !operandElem.isNull() )
3478+
{
3479+
if ( operandElem.tagName() == QLatin1String( "LowerBoundary" ) )
3480+
{
3481+
QDomElement lowerBoundElem = operandElem.firstChildElement();
3482+
lowerBound = nodeFromOgcFilter( lowerBoundElem );
3483+
}
3484+
else if ( operandElem.tagName() == QLatin1String( "UpperBoundary" ) )
3485+
{
3486+
QDomElement upperBoundElem = operandElem.firstChildElement();
3487+
upperBound = nodeFromOgcFilter( upperBoundElem );
3488+
}
3489+
else
3490+
{
3491+
// <ogc:expression>
3492+
// both operand and operand2 contain the same expression,
3493+
// they are respectively compared to lower bound and upper bound
3494+
operand = nodeFromOgcFilter( operandElem );
3495+
operand2 = nodeFromOgcFilter( operandElem );
3496+
}
3497+
3498+
if ( operand && lowerBound && operand2 && upperBound )
3499+
break;
3500+
3501+
operandElem = operandElem.nextSiblingElement();
3502+
}
3503+
3504+
if ( !operand || !lowerBound || !operand2 || !upperBound )
3505+
{
3506+
delete operand;
3507+
delete lowerBound;
3508+
delete upperBound;
3509+
3510+
mErrorMessage = QObject::tr( "missing some required sub-elements in ogc:PropertyIsBetween" );
3511+
return nullptr;
3512+
}
3513+
3514+
QgsExpressionNode *geOperator = new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boGE, operand, lowerBound );
3515+
QgsExpressionNode *leOperator = new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boLE, operand2, upperBound );
3516+
return new QgsExpressionNodeBinaryOperator( QgsExpressionNodeBinaryOperator::boAnd, geOperator, leOperator );
3517+
}
3518+
35223519
QString QgsOgcUtilsExprFromFilter::errorMessage() const
35233520
{
35243521
return mErrorMessage;

‎src/core/qgsogcutils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,10 @@ class QgsOgcUtilsExprFromFilter
383383
QgsExpressionNodeFunction *nodeSpatialOperatorFromOgcFilter( const QDomElement &element );
384384
QgsExpressionNodeColumnRef *nodeColumnRefFromOgcFilter( const QDomElement &element );
385385
QgsExpressionNode *nodeLiteralFromOgcFilter( const QDomElement &element );
386+
QgsExpressionNodeUnaryOperator *nodeNotFromOgcFilter( const QDomElement &element );
387+
QgsExpressionNodeBinaryOperator *nodePropertyIsNullFromOgcFilter( const QDomElement &element );
388+
QgsExpressionNodeFunction *nodeFunctionFromOgcFilter( const QDomElement &element );
389+
QgsExpressionNode *nodeIsBetweenFromOgcFilter( const QDomElement &element );
386390

387391
private:
388392
QgsOgcUtils::FilterVersion mVersion = QgsOgcUtils::FILTER_OGC_1_0;

0 commit comments

Comments
 (0)
Please sign in to comment.