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