@@ -1718,104 +1718,35 @@ QgsExpressionNode *QgsOgcUtils::nodeFromOgcFilter( QDomElement &element, QString
1718
1718
QgsExpressionNodeBinaryOperator *QgsOgcUtils::nodeBinaryOperatorFromOgcFilter ( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer )
1719
1719
{
1720
1720
QgsOgcUtilsExprFromFilter utils ( QgsOgcUtils::FILTER_OGC_1_0, layer );
1721
- QgsExpressionNode *node = utils.nodeBinaryOperatorFromOgcFilter ( element );
1721
+ QgsExpressionNodeBinaryOperator *node = utils.nodeBinaryOperatorFromOgcFilter ( element );
1722
1722
errorMessage = utils.errorMessage ();
1723
- retur node;
1723
+ return node;
1724
1724
}
1725
1725
1726
1726
QgsExpressionNodeFunction *QgsOgcUtils::nodeSpatialOperatorFromOgcFilter ( QDomElement &element, QString &errorMessage )
1727
1727
{
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;
1759
1732
}
1760
1733
1761
-
1762
1734
QgsExpressionNodeUnaryOperator *QgsOgcUtils::nodeNotFromOgcFilter ( QDomElement &element, QString &errorMessage )
1763
1735
{
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;
1777
1740
}
1778
1741
1779
-
1780
1742
QgsExpressionNodeFunction *QgsOgcUtils::nodeFunctionFromOgcFilter ( QDomElement &element, QString &errorMessage )
1781
1743
{
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;
1815
1748
}
1816
1749
1817
-
1818
-
1819
1750
QgsExpressionNode *QgsOgcUtils::nodeLiteralFromOgcFilter ( QDomElement &element, QString &errorMessage, QgsVectorLayer *layer )
1820
1751
{
1821
1752
QgsOgcUtilsExprFromFilter utils ( QgsOgcUtils::FILTER_OGC_1_0, layer );
@@ -1824,81 +1755,28 @@ QgsExpressionNode *QgsOgcUtils::nodeLiteralFromOgcFilter( QDomElement &element,
1824
1755
return node;
1825
1756
}
1826
1757
1827
-
1828
1758
QgsExpressionNodeColumnRef *QgsOgcUtils::nodeColumnRefFromOgcFilter ( QDomElement &element, QString &errorMessage )
1829
1759
{
1830
1760
QgsOgcUtilsExprFromFilter utils ( QgsOgcUtils::FILTER_OGC_1_0 );
1831
- QgsExpressionNode *node = utils.nodeColumnRefFromOgcFilter ( element );
1761
+ QgsExpressionNodeColumnRef *node = utils.nodeColumnRefFromOgcFilter ( element );
1832
1762
errorMessage = utils.errorMessage ();
1833
1763
return node;
1834
1764
}
1835
1765
1836
-
1837
1766
QgsExpressionNode *QgsOgcUtils::nodeIsBetweenFromOgcFilter ( QDomElement &element, QString &errorMessage )
1838
1767
{
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;
1884
1772
}
1885
1773
1886
-
1887
1774
QgsExpressionNodeBinaryOperator *QgsOgcUtils::nodePropertyIsNullFromOgcFilter ( QDomElement &element, QString &errorMessage )
1888
1775
{
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;
1902
1780
}
1903
1781
1904
1782
@@ -3243,30 +3121,29 @@ QgsExpressionNode *QgsOgcUtilsExprFromFilter::nodeFromOgcFilter( const QDomEleme
3243
3121
}
3244
3122
3245
3123
// check for other OGC operators, convert them to expressions
3246
-
3247
3124
if ( element.tagName () == QLatin1String ( " Not" ) )
3248
3125
{
3249
- // return nodeNotFromOgcFilter( element, errorMessage );
3126
+ return nodeNotFromOgcFilter ( element );
3250
3127
}
3251
3128
else if ( element.tagName () == QLatin1String ( " PropertyIsNull" ) )
3252
3129
{
3253
- // return nodePropertyIsNullFromOgcFilter( element, errorMessage );
3130
+ return nodePropertyIsNullFromOgcFilter ( element );
3254
3131
}
3255
3132
else if ( element.tagName () == QLatin1String ( " Literal" ) )
3256
3133
{
3257
3134
return nodeLiteralFromOgcFilter ( element );
3258
3135
}
3259
3136
else if ( element.tagName () == QLatin1String ( " Function" ) )
3260
3137
{
3261
- // return nodeFunctionFromOgcFilter( element, errorMessage );
3138
+ return nodeFunctionFromOgcFilter ( element );
3262
3139
}
3263
3140
else if ( element.tagName () == mPropertyName )
3264
3141
{
3265
3142
return nodeColumnRefFromOgcFilter ( element );
3266
3143
}
3267
3144
else if ( element.tagName () == QLatin1String ( " PropertyIsBetween" ) )
3268
3145
{
3269
- // return nodeIsBetweenFromOgcFilter( element, errorMessage );
3146
+ return nodeIsBetweenFromOgcFilter ( element );
3270
3147
}
3271
3148
3272
3149
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
3519
3396
return nullptr ;
3520
3397
}
3521
3398
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
+
3522
3519
QString QgsOgcUtilsExprFromFilter::errorMessage () const
3523
3520
{
3524
3521
return mErrorMessage ;
0 commit comments