Skip to content

Commit cf3cf19

Browse files
committed
Port virtual fields to expression contexts
1 parent d654227 commit cf3cf19

File tree

2 files changed

+15
-2
lines changed

2 files changed

+15
-2
lines changed

src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@
2222
#include "qgsvectorlayereditbuffer.h"
2323
#include "qgsvectorlayer.h"
2424
#include "qgsvectorlayerjoinbuffer.h"
25+
#include "qgsexpressioncontext.h"
2526

2627
QgsVectorLayerFeatureSource::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
}

src/core/qgsvectorlayerfeatureiterator.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class QgsVectorLayer;
2626
class QgsVectorLayerEditBuffer;
2727
class QgsVectorLayerJoinBuffer;
2828
struct QgsVectorJoinInfo;
29+
class QgsExpressionContext;
2930

3031
class QgsVectorLayerFeatureIterator;
3132

@@ -42,6 +43,8 @@ class QgsVectorLayerFeatureSource : public QgsAbstractFeatureSource
4243

4344
protected:
4445

46+
QgsVectorLayer* mLayer;
47+
4548
QgsAbstractFeatureSource* mProviderFeatureSource;
4649

4750
QgsVectorLayerJoinBuffer* mJoinBuffer;
@@ -158,6 +161,8 @@ class CORE_EXPORT QgsVectorLayerFeatureIterator : public QgsAbstractFeatureItera
158161
//! optional object to locally simplify edited (changed or added) geometries fetched by this feature iterator
159162
QgsAbstractGeometrySimplifier* mEditGeometrySimplifier;
160163

164+
QScopedPointer<QgsExpressionContext> mExpressionContext;
165+
161166
//! returns whether the iterator supports simplify geometries on provider side
162167
virtual bool providerCanSimplify( QgsSimplifyMethod::MethodType methodType ) const override;
163168
};

0 commit comments

Comments
 (0)