Skip to content

Commit a1e21f3

Browse files
committed
Port providers to expression contexts
1 parent f108dcd commit a1e21f3

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,7 +345,8 @@ bool QgsDelimitedTextFeatureIterator::nextFeatureInternal( QgsFeature& feature )
345345

346346
if ( mTestSubset )
347347
{
348-
QVariant isOk = mSource->mSubsetExpression->evaluate( &feature );
348+
mSource->mExpressionContext.setFeature( feature );
349+
QVariant isOk = mSource->mSubsetExpression->evaluate( &mSource->mExpressionContext );
349350
if ( mSource->mSubsetExpression->hasEvalError() ) continue;
350351
if ( ! isOk.toBool() ) continue;
351352
}
@@ -490,6 +491,10 @@ QgsDelimitedTextFeatureSource::QgsDelimitedTextFeatureSource( const QgsDelimited
490491
{
491492
mFile = new QgsDelimitedTextFile();
492493
mFile->setFromUrl( p->mFile->url() );
494+
495+
mExpressionContext << QgsExpressionContextUtils::globalScope()
496+
<< QgsExpressionContextUtils::projectScope();
497+
mExpressionContext.setFields( mFields );
493498
}
494499

495500
QgsDelimitedTextFeatureSource::~QgsDelimitedTextFeatureSource()

src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include <QList>
1919
#include "qgsfeatureiterator.h"
2020
#include "qgsfeature.h"
21+
#include "qgsexpressioncontext.h"
2122

2223
#include "qgsdelimitedtextprovider.h"
2324

@@ -32,6 +33,7 @@ class QgsDelimitedTextFeatureSource : public QgsAbstractFeatureSource
3233
protected:
3334
QgsDelimitedTextProvider::GeomRepresentationType mGeomRep;
3435
QgsExpression *mSubsetExpression;
36+
QgsExpressionContext mExpressionContext;
3537
QgsRectangle mExtent;
3638
bool mUseSpatialIndex;
3739
QgsSpatialIndex *mSpatialIndex;

src/providers/delimitedtext/qgsdelimitedtextprovider.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,8 @@ bool QgsDelimitedTextProvider::setSubsetString( QString subset, bool updateFeatu
10061006
}
10071007
else
10081008
{
1009-
expression->prepare( fields() );
1009+
QgsExpressionContext context = QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), fields() );
1010+
expression->prepare( &context );
10101011
if ( expression->hasEvalError() )
10111012
{
10121013
error = expression->evalErrorString();

src/providers/memory/qgsmemoryfeatureiterator.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryFeatureSource* sour
3030
if ( !mSource->mSubsetString.isEmpty() )
3131
{
3232
mSubsetExpression = new QgsExpression( mSource->mSubsetString );
33-
mSubsetExpression->prepare( mSource->mFields );
33+
mSubsetExpression->prepare( &mSource->mExpressionContext );
3434
}
3535

3636
if ( !mRequest.filterRect().isNull() && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
@@ -99,8 +99,12 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature& feature )
9999
else
100100
hasFeature = true;
101101

102-
if ( mSubsetExpression && !mSubsetExpression->evaluate( mSource->mFeatures[*mFeatureIdListIterator] ).toBool() )
103-
hasFeature = false;
102+
if ( mSubsetExpression )
103+
{
104+
mSource->mExpressionContext.setFeature( mSource->mFeatures[*mFeatureIdListIterator] );
105+
if ( !mSubsetExpression->evaluate( &mSource->mExpressionContext ).toBool() )
106+
hasFeature = false;
107+
}
104108

105109
if ( hasFeature )
106110
break;
@@ -152,8 +156,12 @@ bool QgsMemoryFeatureIterator::nextFeatureTraverseAll( QgsFeature& feature )
152156
}
153157
}
154158

155-
if ( mSubsetExpression && !mSubsetExpression->evaluate( *mSelectIterator ).toBool() )
156-
hasFeature = false;
159+
if ( mSubsetExpression )
160+
{
161+
mSource->mExpressionContext.setFeature( *mSelectIterator );
162+
if ( !mSubsetExpression->evaluate( &mSource->mExpressionContext ).toBool() )
163+
hasFeature = false;
164+
}
157165

158166
if ( hasFeature )
159167
break;
@@ -210,6 +218,9 @@ QgsMemoryFeatureSource::QgsMemoryFeatureSource( const QgsMemoryProvider* p )
210218
, mSpatialIndex( p->mSpatialIndex ? new QgsSpatialIndex( *p->mSpatialIndex ) : 0 ) // just shallow copy
211219
, mSubsetString( p->mSubsetString )
212220
{
221+
mExpressionContext << QgsExpressionContextUtils::globalScope()
222+
<< QgsExpressionContextUtils::projectScope();
223+
mExpressionContext.setFields( mFields );
213224
}
214225

215226
QgsMemoryFeatureSource::~QgsMemoryFeatureSource()

src/providers/memory/qgsmemoryfeatureiterator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#define QGSMEMORYFEATUREITERATOR_H
1717

1818
#include "qgsfeatureiterator.h"
19+
#include "qgsexpressioncontext.h"
1920

2021
class QgsMemoryProvider;
2122

@@ -37,6 +38,7 @@ class QgsMemoryFeatureSource : public QgsAbstractFeatureSource
3738
QgsFeatureMap mFeatures;
3839
QgsSpatialIndex* mSpatialIndex;
3940
QString mSubsetString;
41+
QgsExpressionContext mExpressionContext;
4042

4143
friend class QgsMemoryFeatureIterator;
4244
};

0 commit comments

Comments
 (0)