Skip to content

Commit 786de4b

Browse files
committed
Port server to expression contexts
1 parent a1e21f3 commit 786de4b

File tree

2 files changed

+30
-8
lines changed

2 files changed

+30
-8
lines changed

src/server/qgswfsserver.cpp

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,10 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
393393
long featureCounter = 0;
394394
int layerPrec = 8;
395395

396+
QgsExpressionContext expressionContext;
397+
expressionContext << QgsExpressionContextUtils::globalScope()
398+
<< QgsExpressionContextUtils::projectScope();
399+
396400
QDomDocument doc;
397401
QString errorMsg;
398402
if ( doc.setContent( mParameters.value( "REQUEST_BODY" ), true, &errorMsg ) )
@@ -434,6 +438,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
434438
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( currentLayer );
435439
if ( layer && wfsLayersId.contains( layer->id() ) )
436440
{
441+
expressionContext << QgsExpressionContextUtils::layerScope( layer );
442+
437443
//is there alias info for this vector layer?
438444
QMap< int, QString > layerAliasInfo;
439445
const QMap< QString, QString >& aliasMap = layer->attributeAliases();
@@ -599,7 +605,9 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
599605
}
600606
while ( fit.nextFeature( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
601607
{
602-
QVariant res = filter->evaluate( &feature, fields );
608+
expressionContext.setFeature( feature );
609+
610+
QVariant res = filter->evaluate( &expressionContext );
603611
if ( filter->hasEvalError() )
604612
{
605613
throw QgsMapServiceException( "RequestNotWellFormed", filter->evalErrorString() );
@@ -783,6 +791,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
783791
QgsVectorLayer* layer = dynamic_cast<QgsVectorLayer*>( currentLayer );
784792
if ( layer && wfsLayersId.contains( layer->id() ) )
785793
{
794+
expressionContext << QgsExpressionContextUtils::layerScope( layer );
795+
786796
//is there alias info for this vector layer?
787797
QMap< int, QString > layerAliasInfo;
788798
const QMap< QString, QString >& aliasMap = layer->attributeAliases();
@@ -908,7 +918,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
908918
}
909919
while ( fit.nextFeature( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
910920
{
911-
QVariant res = filter->evaluate( &feature, fields );
921+
expressionContext.setFeature( feature );
922+
QVariant res = filter->evaluate( &expressionContext );
912923
if ( filter->hasEvalError() )
913924
{
914925
throw QgsMapServiceException( "RequestNotWellFormed", QString( "Expression filter eval error message: %1." ).arg( filter->evalErrorString() ) );
@@ -1026,7 +1037,8 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
10261037
QgsFeatureIterator fit = layer->getFeatures( req );
10271038
while ( fit.nextFeature( feature ) && ( maxFeatures == -1 || featureCounter < maxFeat ) )
10281039
{
1029-
QVariant res = filter->evaluate( &feature, fields );
1040+
expressionContext.setFeature( feature );
1041+
QVariant res = filter->evaluate( &expressionContext );
10301042
if ( filter->hasEvalError() )
10311043
{
10321044
throw QgsMapServiceException( "RequestNotWellFormed", QString( "OGC expression filter eval error message: %1." ).arg( filter->evalErrorString() ) );
@@ -1662,9 +1674,12 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( QDomElement filterElem, Qgs
16621674
QgsFeature feature;
16631675
const QgsFields& fields = provider->fields();
16641676
QgsFeatureIterator fit = layer->getFeatures();
1677+
QgsExpressionContext context = QgsExpressionContextUtils::createFeatureBasedContext( feature, fields );
1678+
16651679
while ( fit.nextFeature( feature ) )
16661680
{
1667-
QVariant res = filter->evaluate( &feature, fields );
1681+
context.setFeature( feature );
1682+
QVariant res = filter->evaluate( &context );
16681683
if ( filter->hasEvalError() )
16691684
{
16701685
throw QgsMapServiceException( "RequestNotWellFormed", filter->evalErrorString() );

src/server/qgswmsserver.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2143,7 +2143,7 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
21432143
attributeElement.setAttribute( "value",
21442144
replaceValueMapAndRelation(
21452145
layer, i,
2146-
featureAttributes[i].isNull() ? QString::null : QgsExpression::replaceExpressionText( featureAttributes[i].toString(), &feature, layer )
2146+
featureAttributes[i].isNull() ? QString::null : QgsExpression::replaceExpressionText( featureAttributes[i].toString(), &renderContext.expressionContext() )
21472147
)
21482148
);
21492149
featureElement.appendChild( attributeElement );
@@ -2157,7 +2157,7 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
21572157
{
21582158
QDomElement maptipElem = infoDocument.createElement( "Attribute" );
21592159
maptipElem.setAttribute( "name", "maptip" );
2160-
maptipElem.setAttribute( "value", QgsExpression::replaceExpressionText( displayField, &feature, layer ) );
2160+
maptipElem.setAttribute( "value", QgsExpression::replaceExpressionText( displayField, &renderContext.expressionContext() ) );
21612161
featureElement.appendChild( maptipElem );
21622162
}
21632163
}
@@ -3001,6 +3001,13 @@ QDomElement QgsWMSServer::createFeatureGML(
30013001

30023002
QgsGeometry* geom = feat->geometry();
30033003

3004+
QgsExpressionContext expressionContext;
3005+
expressionContext << QgsExpressionContextUtils::globalScope()
3006+
<< QgsExpressionContextUtils::projectScope();
3007+
if ( layer )
3008+
expressionContext << QgsExpressionContextUtils::layerScope( layer );
3009+
expressionContext.setFeature( *feat );
3010+
30043011
// always add bounding box info if feature contains geometry
30053012
if ( geom && geom->type() != QGis::UnknownGeometry && geom->type() != QGis::NoGeometry )
30063013
{
@@ -3083,7 +3090,7 @@ QDomElement QgsWMSServer::createFeatureGML(
30833090
QString fieldTextString = featureAttributes[i].toString();
30843091
if ( layer )
30853092
{
3086-
fieldTextString = replaceValueMapAndRelation( layer, i, QgsExpression::replaceExpressionText( fieldTextString, feat, layer ) );
3093+
fieldTextString = replaceValueMapAndRelation( layer, i, QgsExpression::replaceExpressionText( fieldTextString, &expressionContext ) );
30873094
}
30883095
QDomText fieldText = doc.createTextNode( fieldTextString );
30893096
fieldElem.appendChild( fieldText );
@@ -3096,7 +3103,7 @@ QDomElement QgsWMSServer::createFeatureGML(
30963103
QString displayField = layer->displayField();
30973104
if ( !displayField.isEmpty() )
30983105
{
3099-
QString fieldTextString = QgsExpression::replaceExpressionText( displayField, feat, layer );
3106+
QString fieldTextString = QgsExpression::replaceExpressionText( displayField, &expressionContext );
31003107
QDomElement fieldElem = doc.createElement( "qgs:maptip" );
31013108
QDomText maptipText = doc.createTextNode( fieldTextString );
31023109
fieldElem.appendChild( maptipText );

0 commit comments

Comments
 (0)