Skip to content

Commit b9f0c06

Browse files
committed
More use of implicit sharing of QgsExpression
1 parent efaae1f commit b9f0c06

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

src/core/qgsexpressionfieldbuffer.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ void QgsExpressionFieldBuffer::removeExpression( int index )
3636
void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp )
3737
{
3838
mExpressions[index].expression = exp;
39+
mExpressions[index].cachedExpression = QgsExpression( exp );
3940
}
4041

4142
void QgsExpressionFieldBuffer::writeXml( QDomNode& layerNode, QDomDocument& document ) const

src/core/qgsexpressionfieldbuffer.h

+7-2
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <QDomNode>
2424

2525
#include "qgsfield.h"
26+
#include "qgsexpression.h"
2627

2728
/**
2829
* Buffers information about expression fields for a vector layer.
@@ -34,10 +35,14 @@ class CORE_EXPORT QgsExpressionFieldBuffer
3435
public:
3536
typedef struct ExpressionField
3637
{
37-
ExpressionField() {}
38-
ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), field( fld ) {}
38+
ExpressionField() : cachedExpression( expression ) {}
39+
ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), cachedExpression( exp ), field( fld ) {}
3940

41+
/**
42+
* @deprecated use cachedExpression instead
43+
*/
4044
QString expression;
45+
QgsExpression cachedExpression;
4146
QgsField field;
4247
} ExpressionField;
4348

src/core/qgsvectorlayerfeatureiterator.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ void QgsVectorLayerFeatureIterator::prepareExpressions()
530530
|| mRequest.subsetOfAttributes().contains( i ) )
531531
{
532532
int oi = mSource->mFields.fieldOriginIndex( i );
533-
QgsExpression* exp = new QgsExpression( exps[oi].expression );
533+
QgsExpression* exp = new QgsExpression( exps[oi].cachedExpression );
534534
exp->prepare( mExpressionContext.data() );
535535
mExpressionFieldInfo.insert( i, exp );
536536

tests/src/python/test_qgsvectorlayer.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -965,16 +965,16 @@ def test_ExpressionField(self):
965965

966966
idx = layer.addExpressionField('5', QgsField('test', QVariant.LongLong))
967967

968-
assert(layer.getFeatures().next()[idx] == 5)
969-
assert(layer.pendingFields().count() == cnt + 1)
968+
self.assertEquals(layer.getFeatures().next()[idx], 5)
969+
self.assertEquals(layer.pendingFields().count(), cnt + 1)
970970

971971
layer.updateExpressionField(idx, '9')
972972

973-
assert(layer.getFeatures().next()[idx] == 9)
973+
self.assertEquals(layer.getFeatures().next()[idx], 9)
974974

975975
layer.removeExpressionField(idx)
976976

977-
assert(layer.pendingFields().count() == cnt)
977+
self.assertEquals(layer.pendingFields().count(), cnt)
978978

979979
def test_ExpressionFilter(self):
980980
layer = createLayerWithOnePoint()

0 commit comments

Comments
 (0)