2222#include " qgsvectorlayereditbuffer.h"
2323#include " qgsvectorlayer.h"
2424#include " qgsvectorlayerjoinbuffer.h"
25+ #include " qgsexpressioncontext.h"
2526
2627QgsVectorLayerFeatureSource::QgsVectorLayerFeatureSource ( QgsVectorLayer *layer )
2728{
29+ mLayer = layer;
2830 mProviderFeatureSource = layer->dataProvider ()->featureSource ();
2931 mFields = layer->fields ();
3032 mJoinBuffer = layer->mJoinBuffer ->clone ();
@@ -502,6 +504,11 @@ void QgsVectorLayerFeatureIterator::prepareExpressions()
502504{
503505 const QList<QgsExpressionFieldBuffer::ExpressionField> exps = mSource ->mExpressionFieldBuffer ->expressions ();
504506
507+ mExpressionContext .reset ( new QgsExpressionContext () );
508+ mExpressionContext ->appendScope ( QgsExpressionContextUtils::globalScope () );
509+ mExpressionContext ->appendScope ( QgsExpressionContextUtils::projectScope () );
510+ mExpressionContext ->setFields ( mSource ->mFields );
511+
505512 for ( int i = 0 ; i < mSource ->mFields .count (); i++ )
506513 {
507514 if ( mSource ->mFields .fieldOrigin ( i ) == QgsFields::OriginExpression )
@@ -512,7 +519,7 @@ void QgsVectorLayerFeatureIterator::prepareExpressions()
512519 {
513520 int oi = mSource ->mFields .fieldOriginIndex ( i );
514521 QgsExpression* exp = new QgsExpression ( exps[oi].expression );
515- exp->prepare ( mSource -> mFields );
522+ exp->prepare ( mExpressionContext . data () );
516523 mExpressionFieldInfo .insert ( i, exp );
517524
518525 if ( mRequest .flags () & QgsFeatureRequest::SubsetOfAttributes )
@@ -572,7 +579,8 @@ void QgsVectorLayerFeatureIterator::addVirtualAttributes( QgsFeature& f )
572579 for ( ; it != mExpressionFieldInfo .constEnd (); ++it )
573580 {
574581 QgsExpression* exp = it.value ();
575- QVariant val = exp->evaluate ( f );
582+ mExpressionContext ->setFeature ( f );
583+ QVariant val = exp->evaluate ( mExpressionContext .data () );
576584 mSource ->mFields .at ( it.key () ).convertCompatible ( val );;
577585 f.setAttribute ( it.key (), val );
578586 }
0 commit comments