More use of implicit sharing of QgsExpression

This commit is contained in:
Matthias Kuhn 2015-12-16 23:16:49 +01:00
parent efaae1f609
commit b9f0c0625a
4 changed files with 13 additions and 7 deletions

View File

@ -36,6 +36,7 @@ void QgsExpressionFieldBuffer::removeExpression( int index )
void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp ) void QgsExpressionFieldBuffer::updateExpression( int index, const QString& exp )
{ {
mExpressions[index].expression = exp; mExpressions[index].expression = exp;
mExpressions[index].cachedExpression = QgsExpression( exp );
} }
void QgsExpressionFieldBuffer::writeXml( QDomNode& layerNode, QDomDocument& document ) const void QgsExpressionFieldBuffer::writeXml( QDomNode& layerNode, QDomDocument& document ) const

View File

@ -23,6 +23,7 @@
#include <QDomNode> #include <QDomNode>
#include "qgsfield.h" #include "qgsfield.h"
#include "qgsexpression.h"
/** /**
* Buffers information about expression fields for a vector layer. * Buffers information about expression fields for a vector layer.
@ -34,10 +35,14 @@ class CORE_EXPORT QgsExpressionFieldBuffer
public: public:
typedef struct ExpressionField typedef struct ExpressionField
{ {
ExpressionField() {} ExpressionField() : cachedExpression( expression ) {}
ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), field( fld ) {} ExpressionField( const QString& exp, const QgsField& fld ) : expression( exp ), cachedExpression( exp ), field( fld ) {}
/**
* @deprecated use cachedExpression instead
*/
QString expression; QString expression;
QgsExpression cachedExpression;
QgsField field; QgsField field;
} ExpressionField; } ExpressionField;

View File

@ -530,7 +530,7 @@ void QgsVectorLayerFeatureIterator::prepareExpressions()
|| mRequest.subsetOfAttributes().contains( i ) ) || mRequest.subsetOfAttributes().contains( i ) )
{ {
int oi = mSource->mFields.fieldOriginIndex( i ); int oi = mSource->mFields.fieldOriginIndex( i );
QgsExpression* exp = new QgsExpression( exps[oi].expression ); QgsExpression* exp = new QgsExpression( exps[oi].cachedExpression );
exp->prepare( mExpressionContext.data() ); exp->prepare( mExpressionContext.data() );
mExpressionFieldInfo.insert( i, exp ); mExpressionFieldInfo.insert( i, exp );

View File

@ -965,16 +965,16 @@ class TestQgsVectorLayer(TestCase):
idx = layer.addExpressionField('5', QgsField('test', QVariant.LongLong)) idx = layer.addExpressionField('5', QgsField('test', QVariant.LongLong))
assert(layer.getFeatures().next()[idx] == 5) self.assertEquals(layer.getFeatures().next()[idx], 5)
assert(layer.pendingFields().count() == cnt + 1) self.assertEquals(layer.pendingFields().count(), cnt + 1)
layer.updateExpressionField(idx, '9') layer.updateExpressionField(idx, '9')
assert(layer.getFeatures().next()[idx] == 9) self.assertEquals(layer.getFeatures().next()[idx], 9)
layer.removeExpressionField(idx) layer.removeExpressionField(idx)
assert(layer.pendingFields().count() == cnt) self.assertEquals(layer.pendingFields().count(), cnt)
def test_ExpressionFilter(self): def test_ExpressionFilter(self):
layer = createLayerWithOnePoint() layer = createLayerWithOnePoint()