22
22
#include " qgswkbptr.h"
23
23
#include " qgscoordinatereferencesystem.h"
24
24
#include " qgsrectangle.h"
25
+ #include " qgsproject.h"
25
26
26
27
#include < QColor>
27
28
#include < QStringList>
@@ -2145,7 +2146,7 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp, QD
2145
2146
QStringLiteral ( " geometry" ), QString (), false , false , errorMessage );
2146
2147
}
2147
2148
2148
- QDomElement QgsOgcUtils::expressionToOgcFilter ( const QgsExpression &exp ,
2149
+ QDomElement QgsOgcUtils::expressionToOgcFilter ( const QgsExpression &expression ,
2149
2150
QDomDocument &doc,
2150
2151
GMLVersion gmlVersion,
2151
2152
FilterVersion filterVersion,
@@ -2155,11 +2156,15 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp,
2155
2156
bool invertAxisOrientation,
2156
2157
QString *errorMessage )
2157
2158
{
2158
- if ( !exp .rootNode () )
2159
+ if ( !expression .rootNode () )
2159
2160
return QDomElement ();
2160
2161
2162
+ QgsExpression exp = expression;
2163
+
2164
+ QgsExpressionContext context;
2165
+ context << QgsExpressionContextUtils::globalScope () << QgsExpressionContextUtils::projectScope ( QgsProject::instance () );
2161
2166
QgsOgcUtilsExprToFilter utils ( doc, gmlVersion, filterVersion, geometryName, srsName, honourAxisOrientation, invertAxisOrientation );
2162
- QDomElement exprRootElem = utils.expressionNodeToOgcFilter ( exp .rootNode () );
2167
+ QDomElement exprRootElem = utils.expressionNodeToOgcFilter ( exp .rootNode (), & exp , &context );
2163
2168
if ( errorMessage )
2164
2169
*errorMessage = utils.errorMessage ();
2165
2170
if ( exprRootElem.isNull () )
@@ -2182,7 +2187,7 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp,
2182
2187
return filterElem;
2183
2188
}
2184
2189
2185
- QDomElement QgsOgcUtils::expressionToOgcExpression ( const QgsExpression &exp ,
2190
+ QDomElement QgsOgcUtils::expressionToOgcExpression ( const QgsExpression &expression ,
2186
2191
QDomDocument &doc,
2187
2192
GMLVersion gmlVersion,
2188
2193
FilterVersion filterVersion,
@@ -2192,6 +2197,11 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp,
2192
2197
bool invertAxisOrientation,
2193
2198
QString *errorMessage )
2194
2199
{
2200
+ QgsExpressionContext context;
2201
+ context << QgsExpressionContextUtils::globalScope () << QgsExpressionContextUtils::projectScope ( QgsProject::instance () );
2202
+
2203
+ QgsExpression exp = expression;
2204
+
2195
2205
const QgsExpressionNode *node = exp .rootNode ();
2196
2206
if ( !node )
2197
2207
return QDomElement ();
@@ -2203,7 +2213,7 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp,
2203
2213
case QgsExpressionNode::ntColumnRef:
2204
2214
{
2205
2215
QgsOgcUtilsExprToFilter utils ( doc, gmlVersion, filterVersion, geometryName, srsName, honourAxisOrientation, invertAxisOrientation );
2206
- QDomElement exprRootElem = utils.expressionNodeToOgcFilter ( node );
2216
+ QDomElement exprRootElem = utils.expressionNodeToOgcFilter ( node, & exp , &context );
2207
2217
2208
2218
if ( errorMessage )
2209
2219
*errorMessage = utils.errorMessage ();
@@ -2266,34 +2276,32 @@ QDomElement QgsOgcUtils::SQLStatementToOgcFilter( const QgsSQLStatement &stateme
2266
2276
//
2267
2277
2268
2278
2269
- QDomElement QgsOgcUtilsExprToFilter::expressionNodeToOgcFilter ( const QgsExpressionNode *node )
2279
+ QDomElement QgsOgcUtilsExprToFilter::expressionNodeToOgcFilter ( const QgsExpressionNode *node, QgsExpression *expression, const QgsExpressionContext *context )
2270
2280
{
2271
2281
switch ( node->nodeType () )
2272
2282
{
2273
2283
case QgsExpressionNode::ntUnaryOperator:
2274
- return expressionUnaryOperatorToOgcFilter ( static_cast <const QgsExpressionNodeUnaryOperator *>( node ) );
2284
+ return expressionUnaryOperatorToOgcFilter ( static_cast <const QgsExpressionNodeUnaryOperator *>( node ), expression, context );
2275
2285
case QgsExpressionNode::ntBinaryOperator:
2276
- return expressionBinaryOperatorToOgcFilter ( static_cast <const QgsExpressionNodeBinaryOperator *>( node ) );
2286
+ return expressionBinaryOperatorToOgcFilter ( static_cast <const QgsExpressionNodeBinaryOperator *>( node ), expression, context );
2277
2287
case QgsExpressionNode::ntInOperator:
2278
- return expressionInOperatorToOgcFilter ( static_cast <const QgsExpressionNodeInOperator *>( node ) );
2288
+ return expressionInOperatorToOgcFilter ( static_cast <const QgsExpressionNodeInOperator *>( node ), expression, context );
2279
2289
case QgsExpressionNode::ntFunction:
2280
- return expressionFunctionToOgcFilter ( static_cast <const QgsExpressionNodeFunction *>( node ) );
2290
+ return expressionFunctionToOgcFilter ( static_cast <const QgsExpressionNodeFunction *>( node ), expression, context );
2281
2291
case QgsExpressionNode::ntLiteral:
2282
- return expressionLiteralToOgcFilter ( static_cast <const QgsExpressionNodeLiteral *>( node ) );
2292
+ return expressionLiteralToOgcFilter ( static_cast <const QgsExpressionNodeLiteral *>( node ), expression, context );
2283
2293
case QgsExpressionNode::ntColumnRef:
2284
- return expressionColumnRefToOgcFilter ( static_cast <const QgsExpressionNodeColumnRef *>( node ) );
2294
+ return expressionColumnRefToOgcFilter ( static_cast <const QgsExpressionNodeColumnRef *>( node ), expression, context );
2285
2295
2286
2296
default :
2287
2297
mErrorMessage = QObject::tr ( " Node type not supported: %1" ).arg ( node->nodeType () );
2288
2298
return QDomElement ();
2289
2299
}
2290
2300
}
2291
2301
2292
-
2293
- QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter ( const QgsExpressionNodeUnaryOperator *node )
2302
+ QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter ( const QgsExpressionNodeUnaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
2294
2303
{
2295
-
2296
- QDomElement operandElem = expressionNodeToOgcFilter ( node->operand () );
2304
+ QDomElement operandElem = expressionNodeToOgcFilter ( node->operand (), expression, context );
2297
2305
if ( !mErrorMessage .isEmpty () )
2298
2306
return QDomElement ();
2299
2307
@@ -2329,9 +2337,9 @@ QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter( const Q
2329
2337
}
2330
2338
2331
2339
2332
- QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter ( const QgsExpressionNodeBinaryOperator *node )
2340
+ QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter ( const QgsExpressionNodeBinaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
2333
2341
{
2334
- QDomElement leftElem = expressionNodeToOgcFilter ( node->opLeft () );
2342
+ QDomElement leftElem = expressionNodeToOgcFilter ( node->opLeft (), expression, context );
2335
2343
if ( !mErrorMessage .isEmpty () )
2336
2344
return QDomElement ();
2337
2345
@@ -2365,7 +2373,7 @@ QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const
2365
2373
2366
2374
}
2367
2375
2368
- QDomElement rightElem = expressionNodeToOgcFilter ( node->opRight () );
2376
+ QDomElement rightElem = expressionNodeToOgcFilter ( node->opRight (), expression, context );
2369
2377
if ( !mErrorMessage .isEmpty () )
2370
2378
return QDomElement ();
2371
2379
@@ -2401,8 +2409,10 @@ QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const
2401
2409
}
2402
2410
2403
2411
2404
- QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter ( const QgsExpressionNodeLiteral *node )
2412
+ QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter ( const QgsExpressionNodeLiteral *node, QgsExpression *expression, const QgsExpressionContext *context )
2405
2413
{
2414
+ Q_UNUSED ( expression )
2415
+ Q_UNUSED ( context )
2406
2416
QString value;
2407
2417
switch ( node->value ().type () )
2408
2418
{
@@ -2433,26 +2443,28 @@ QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter( const QgsExpr
2433
2443
}
2434
2444
2435
2445
2436
- QDomElement QgsOgcUtilsExprToFilter::expressionColumnRefToOgcFilter ( const QgsExpressionNodeColumnRef *node )
2446
+ QDomElement QgsOgcUtilsExprToFilter::expressionColumnRefToOgcFilter ( const QgsExpressionNodeColumnRef *node, QgsExpression *expression, const QgsExpressionContext *context )
2437
2447
{
2448
+ Q_UNUSED ( expression )
2449
+ Q_UNUSED ( context )
2438
2450
QDomElement propElem = mDoc .createElement ( mFilterPrefix + " :" + mPropertyName );
2439
2451
propElem.appendChild ( mDoc .createTextNode ( node->name () ) );
2440
2452
return propElem;
2441
2453
}
2442
2454
2443
2455
2444
2456
2445
- QDomElement QgsOgcUtilsExprToFilter::expressionInOperatorToOgcFilter ( const QgsExpressionNodeInOperator *node )
2457
+ QDomElement QgsOgcUtilsExprToFilter::expressionInOperatorToOgcFilter ( const QgsExpressionNodeInOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
2446
2458
{
2447
2459
if ( node->list ()->list ().size () == 1 )
2448
- return expressionNodeToOgcFilter ( node->list ()->list ()[0 ] );
2460
+ return expressionNodeToOgcFilter ( node->list ()->list ()[0 ], expression, context );
2449
2461
2450
2462
QDomElement orElem = mDoc .createElement ( mFilterPrefix + " :Or" );
2451
- QDomElement leftNode = expressionNodeToOgcFilter ( node->node () );
2463
+ QDomElement leftNode = expressionNodeToOgcFilter ( node->node (), expression, context );
2452
2464
2453
2465
Q_FOREACH ( QgsExpressionNode *n, node->list ()->list () )
2454
2466
{
2455
- QDomElement listNode = expressionNodeToOgcFilter ( n );
2467
+ QDomElement listNode = expressionNodeToOgcFilter ( n, expression, context );
2456
2468
if ( !mErrorMessage .isEmpty () )
2457
2469
return QDomElement ();
2458
2470
@@ -2527,7 +2539,7 @@ static QgsGeometry geometryFromConstExpr( const QgsExpressionNode *node )
2527
2539
}
2528
2540
2529
2541
2530
- QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter ( const QgsExpressionNodeFunction *node )
2542
+ QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter ( const QgsExpressionNodeFunction *node, QgsExpression *expression, const QgsExpressionContext *context )
2531
2543
{
2532
2544
QgsExpressionFunction *fd = QgsExpression::Functions ()[node->fnIndex ()];
2533
2545
@@ -2639,6 +2651,13 @@ QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExp
2639
2651
return funcElem;
2640
2652
}
2641
2653
2654
+ if ( fd->isStatic ( node, expression, context ) )
2655
+ {
2656
+ QVariant result = fd->run ( node->args (), context, expression, node );
2657
+ QgsExpressionNodeLiteral literal ( result );
2658
+ return expressionLiteralToOgcFilter ( &literal, expression, context );
2659
+ }
2660
+
2642
2661
if ( fd->params () == 0 )
2643
2662
{
2644
2663
mErrorMessage = QObject::tr ( " Special columns/constants are not supported." );
@@ -2650,7 +2669,7 @@ QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExp
2650
2669
funcElem.setAttribute ( QStringLiteral ( " name" ), fd->name () );
2651
2670
Q_FOREACH ( QgsExpressionNode *n, node->args ()->list () )
2652
2671
{
2653
- QDomElement childElem = expressionNodeToOgcFilter ( n );
2672
+ QDomElement childElem = expressionNodeToOgcFilter ( n, expression, context );
2654
2673
if ( !mErrorMessage .isEmpty () )
2655
2674
return QDomElement ();
2656
2675
0 commit comments