Skip to content

Commit 9abd6d3

Browse files
committed
Support for static expression functions in WFS filters
1 parent c709f18 commit 9abd6d3

File tree

2 files changed

+53
-34
lines changed

2 files changed

+53
-34
lines changed

src/core/qgsogcutils.cpp

+46-27
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include "qgswkbptr.h"
2323
#include "qgscoordinatereferencesystem.h"
2424
#include "qgsrectangle.h"
25+
#include "qgsproject.h"
2526

2627
#include <QColor>
2728
#include <QStringList>
@@ -2145,7 +2146,7 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp, QD
21452146
QStringLiteral( "geometry" ), QString(), false, false, errorMessage );
21462147
}
21472148

2148-
QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp,
2149+
QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &expression,
21492150
QDomDocument &doc,
21502151
GMLVersion gmlVersion,
21512152
FilterVersion filterVersion,
@@ -2155,11 +2156,15 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp,
21552156
bool invertAxisOrientation,
21562157
QString *errorMessage )
21572158
{
2158-
if ( !exp.rootNode() )
2159+
if ( !expression.rootNode() )
21592160
return QDomElement();
21602161

2162+
QgsExpression exp = expression;
2163+
2164+
QgsExpressionContext context;
2165+
context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope( QgsProject::instance() );
21612166
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 );
21632168
if ( errorMessage )
21642169
*errorMessage = utils.errorMessage();
21652170
if ( exprRootElem.isNull() )
@@ -2182,7 +2187,7 @@ QDomElement QgsOgcUtils::expressionToOgcFilter( const QgsExpression &exp,
21822187
return filterElem;
21832188
}
21842189

2185-
QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp,
2190+
QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &expression,
21862191
QDomDocument &doc,
21872192
GMLVersion gmlVersion,
21882193
FilterVersion filterVersion,
@@ -2192,6 +2197,11 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp,
21922197
bool invertAxisOrientation,
21932198
QString *errorMessage )
21942199
{
2200+
QgsExpressionContext context;
2201+
context << QgsExpressionContextUtils::globalScope() << QgsExpressionContextUtils::projectScope( QgsProject::instance() );
2202+
2203+
QgsExpression exp = expression;
2204+
21952205
const QgsExpressionNode *node = exp.rootNode();
21962206
if ( !node )
21972207
return QDomElement();
@@ -2203,7 +2213,7 @@ QDomElement QgsOgcUtils::expressionToOgcExpression( const QgsExpression &exp,
22032213
case QgsExpressionNode::ntColumnRef:
22042214
{
22052215
QgsOgcUtilsExprToFilter utils( doc, gmlVersion, filterVersion, geometryName, srsName, honourAxisOrientation, invertAxisOrientation );
2206-
QDomElement exprRootElem = utils.expressionNodeToOgcFilter( node );
2216+
QDomElement exprRootElem = utils.expressionNodeToOgcFilter( node, &exp, &context );
22072217

22082218
if ( errorMessage )
22092219
*errorMessage = utils.errorMessage();
@@ -2266,34 +2276,32 @@ QDomElement QgsOgcUtils::SQLStatementToOgcFilter( const QgsSQLStatement &stateme
22662276
//
22672277

22682278

2269-
QDomElement QgsOgcUtilsExprToFilter::expressionNodeToOgcFilter( const QgsExpressionNode *node )
2279+
QDomElement QgsOgcUtilsExprToFilter::expressionNodeToOgcFilter( const QgsExpressionNode *node, QgsExpression *expression, const QgsExpressionContext *context )
22702280
{
22712281
switch ( node->nodeType() )
22722282
{
22732283
case QgsExpressionNode::ntUnaryOperator:
2274-
return expressionUnaryOperatorToOgcFilter( static_cast<const QgsExpressionNodeUnaryOperator *>( node ) );
2284+
return expressionUnaryOperatorToOgcFilter( static_cast<const QgsExpressionNodeUnaryOperator *>( node ), expression, context );
22752285
case QgsExpressionNode::ntBinaryOperator:
2276-
return expressionBinaryOperatorToOgcFilter( static_cast<const QgsExpressionNodeBinaryOperator *>( node ) );
2286+
return expressionBinaryOperatorToOgcFilter( static_cast<const QgsExpressionNodeBinaryOperator *>( node ), expression, context );
22772287
case QgsExpressionNode::ntInOperator:
2278-
return expressionInOperatorToOgcFilter( static_cast<const QgsExpressionNodeInOperator *>( node ) );
2288+
return expressionInOperatorToOgcFilter( static_cast<const QgsExpressionNodeInOperator *>( node ), expression, context );
22792289
case QgsExpressionNode::ntFunction:
2280-
return expressionFunctionToOgcFilter( static_cast<const QgsExpressionNodeFunction *>( node ) );
2290+
return expressionFunctionToOgcFilter( static_cast<const QgsExpressionNodeFunction *>( node ), expression, context );
22812291
case QgsExpressionNode::ntLiteral:
2282-
return expressionLiteralToOgcFilter( static_cast<const QgsExpressionNodeLiteral *>( node ) );
2292+
return expressionLiteralToOgcFilter( static_cast<const QgsExpressionNodeLiteral *>( node ), expression, context );
22832293
case QgsExpressionNode::ntColumnRef:
2284-
return expressionColumnRefToOgcFilter( static_cast<const QgsExpressionNodeColumnRef *>( node ) );
2294+
return expressionColumnRefToOgcFilter( static_cast<const QgsExpressionNodeColumnRef *>( node ), expression, context );
22852295

22862296
default:
22872297
mErrorMessage = QObject::tr( "Node type not supported: %1" ).arg( node->nodeType() );
22882298
return QDomElement();
22892299
}
22902300
}
22912301

2292-
2293-
QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter( const QgsExpressionNodeUnaryOperator *node )
2302+
QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter( const QgsExpressionNodeUnaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
22942303
{
2295-
2296-
QDomElement operandElem = expressionNodeToOgcFilter( node->operand() );
2304+
QDomElement operandElem = expressionNodeToOgcFilter( node->operand(), expression, context );
22972305
if ( !mErrorMessage.isEmpty() )
22982306
return QDomElement();
22992307

@@ -2329,9 +2337,9 @@ QDomElement QgsOgcUtilsExprToFilter::expressionUnaryOperatorToOgcFilter( const Q
23292337
}
23302338

23312339

2332-
QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const QgsExpressionNodeBinaryOperator *node )
2340+
QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const QgsExpressionNodeBinaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
23332341
{
2334-
QDomElement leftElem = expressionNodeToOgcFilter( node->opLeft() );
2342+
QDomElement leftElem = expressionNodeToOgcFilter( node->opLeft(), expression, context );
23352343
if ( !mErrorMessage.isEmpty() )
23362344
return QDomElement();
23372345

@@ -2365,7 +2373,7 @@ QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const
23652373

23662374
}
23672375

2368-
QDomElement rightElem = expressionNodeToOgcFilter( node->opRight() );
2376+
QDomElement rightElem = expressionNodeToOgcFilter( node->opRight(), expression, context );
23692377
if ( !mErrorMessage.isEmpty() )
23702378
return QDomElement();
23712379

@@ -2401,8 +2409,10 @@ QDomElement QgsOgcUtilsExprToFilter::expressionBinaryOperatorToOgcFilter( const
24012409
}
24022410

24032411

2404-
QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter( const QgsExpressionNodeLiteral *node )
2412+
QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter( const QgsExpressionNodeLiteral *node, QgsExpression *expression, const QgsExpressionContext *context )
24052413
{
2414+
Q_UNUSED( expression )
2415+
Q_UNUSED( context )
24062416
QString value;
24072417
switch ( node->value().type() )
24082418
{
@@ -2433,26 +2443,28 @@ QDomElement QgsOgcUtilsExprToFilter::expressionLiteralToOgcFilter( const QgsExpr
24332443
}
24342444

24352445

2436-
QDomElement QgsOgcUtilsExprToFilter::expressionColumnRefToOgcFilter( const QgsExpressionNodeColumnRef *node )
2446+
QDomElement QgsOgcUtilsExprToFilter::expressionColumnRefToOgcFilter( const QgsExpressionNodeColumnRef *node, QgsExpression *expression, const QgsExpressionContext *context )
24372447
{
2448+
Q_UNUSED( expression )
2449+
Q_UNUSED( context )
24382450
QDomElement propElem = mDoc.createElement( mFilterPrefix + ":" + mPropertyName );
24392451
propElem.appendChild( mDoc.createTextNode( node->name() ) );
24402452
return propElem;
24412453
}
24422454

24432455

24442456

2445-
QDomElement QgsOgcUtilsExprToFilter::expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node )
2457+
QDomElement QgsOgcUtilsExprToFilter::expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node, QgsExpression *expression, const QgsExpressionContext *context )
24462458
{
24472459
if ( node->list()->list().size() == 1 )
2448-
return expressionNodeToOgcFilter( node->list()->list()[0] );
2460+
return expressionNodeToOgcFilter( node->list()->list()[0], expression, context );
24492461

24502462
QDomElement orElem = mDoc.createElement( mFilterPrefix + ":Or" );
2451-
QDomElement leftNode = expressionNodeToOgcFilter( node->node() );
2463+
QDomElement leftNode = expressionNodeToOgcFilter( node->node(), expression, context );
24522464

24532465
Q_FOREACH ( QgsExpressionNode *n, node->list()->list() )
24542466
{
2455-
QDomElement listNode = expressionNodeToOgcFilter( n );
2467+
QDomElement listNode = expressionNodeToOgcFilter( n, expression, context );
24562468
if ( !mErrorMessage.isEmpty() )
24572469
return QDomElement();
24582470

@@ -2527,7 +2539,7 @@ static QgsGeometry geometryFromConstExpr( const QgsExpressionNode *node )
25272539
}
25282540

25292541

2530-
QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExpressionNodeFunction *node )
2542+
QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExpressionNodeFunction *node, QgsExpression *expression, const QgsExpressionContext *context )
25312543
{
25322544
QgsExpressionFunction *fd = QgsExpression::Functions()[node->fnIndex()];
25332545

@@ -2639,6 +2651,13 @@ QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExp
26392651
return funcElem;
26402652
}
26412653

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+
26422661
if ( fd->params() == 0 )
26432662
{
26442663
mErrorMessage = QObject::tr( "Special columns/constants are not supported." );
@@ -2650,7 +2669,7 @@ QDomElement QgsOgcUtilsExprToFilter::expressionFunctionToOgcFilter( const QgsExp
26502669
funcElem.setAttribute( QStringLiteral( "name" ), fd->name() );
26512670
Q_FOREACH ( QgsExpressionNode *n, node->args()->list() )
26522671
{
2653-
QDomElement childElem = expressionNodeToOgcFilter( n );
2672+
QDomElement childElem = expressionNodeToOgcFilter( n, expression, context );
26542673
if ( !mErrorMessage.isEmpty() )
26552674
return QDomElement();
26562675

src/core/qgsogcutils.h

+7-7
Original file line numberDiff line numberDiff line change
@@ -338,7 +338,7 @@ class QgsOgcUtilsExprToFilter
338338
bool invertAxisOrientation );
339339

340340
//! Convert an expression to a OGC filter
341-
QDomElement expressionNodeToOgcFilter( const QgsExpressionNode *node );
341+
QDomElement expressionNodeToOgcFilter( const QgsExpressionNode *node, QgsExpression *expression, const QgsExpressionContext *context );
342342

343343
//! Returns whether the gml: namespace is used
344344
bool GMLNamespaceUsed() const { return mGMLUsed; }
@@ -359,12 +359,12 @@ class QgsOgcUtilsExprToFilter
359359
QString mPropertyName;
360360
int mGeomId;
361361

362-
QDomElement expressionUnaryOperatorToOgcFilter( const QgsExpressionNodeUnaryOperator *node );
363-
QDomElement expressionBinaryOperatorToOgcFilter( const QgsExpressionNodeBinaryOperator *node );
364-
QDomElement expressionLiteralToOgcFilter( const QgsExpressionNodeLiteral *node );
365-
QDomElement expressionColumnRefToOgcFilter( const QgsExpressionNodeColumnRef *node );
366-
QDomElement expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node );
367-
QDomElement expressionFunctionToOgcFilter( const QgsExpressionNodeFunction *node );
362+
QDomElement expressionUnaryOperatorToOgcFilter( const QgsExpressionNodeUnaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
363+
QDomElement expressionBinaryOperatorToOgcFilter( const QgsExpressionNodeBinaryOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
364+
QDomElement expressionLiteralToOgcFilter( const QgsExpressionNodeLiteral *node, QgsExpression *expression, const QgsExpressionContext *context );
365+
QDomElement expressionColumnRefToOgcFilter( const QgsExpressionNodeColumnRef *node, QgsExpression *expression, const QgsExpressionContext *context );
366+
QDomElement expressionInOperatorToOgcFilter( const QgsExpressionNodeInOperator *node, QgsExpression *expression, const QgsExpressionContext *context );
367+
QDomElement expressionFunctionToOgcFilter( const QgsExpressionNodeFunction *node, QgsExpression *expression, const QgsExpressionContext *context );
368368
};
369369

370370
/**

0 commit comments

Comments
 (0)