Skip to content

Commit 5e03016

Browse files
committed
Update QgsDataDefined for expression contexts
1 parent 2bb1c8a commit 5e03016

File tree

4 files changed

+55
-16
lines changed

4 files changed

+55
-16
lines changed

python/core/qgsdatadefined.sip

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,14 +120,21 @@ class QgsDataDefined
120120
* @param layer vector layer
121121
* @returns true if expression was successfully prepared
122122
*/
123-
bool prepareExpression( QgsVectorLayer* layer );
123+
bool prepareExpression( QgsVectorLayer* layer ) /Deprecated/;
124124

125125
/** Prepares the expression using a fields collection
126126
* @param fields
127127
* @returns true if expression was successfully prepared
128128
* @note added in QGIS 2.9
129129
*/
130-
bool prepareExpression( const QgsFields &fields = QgsFields() );
130+
bool prepareExpression( const QgsFields &fields ) /Deprecated/;
131+
132+
/** Prepares the expression using an expression context.
133+
* @param context expression context
134+
* @returns true if expression was successfully prepared
135+
* @note added in QGIS 2.12
136+
*/
137+
bool prepareExpression( const QgsExpressionContext &context = QgsExpressionContext() );
131138

132139
/** Returns whether the data defined object's expression is prepared
133140
* @returns true if expression is prepared
@@ -139,13 +146,19 @@ class QgsDataDefined
139146
/** Returns the columns referenced by the QgsDataDefined
140147
* @param layer vector layer, used for preparing the expression if required
141148
*/
142-
QStringList referencedColumns( QgsVectorLayer* layer );
149+
QStringList referencedColumns( QgsVectorLayer* layer ) /Deprecated/;
143150

144151
/** Returns the columns referenced by the QgsDataDefined
145152
* @param fields vector layer, used for preparing the expression if required
146153
* @note added in QGIS 2.9
147154
*/
148-
QStringList referencedColumns( const QgsFields& fields = QgsFields() );
155+
QStringList referencedColumns( const QgsFields& fields ) /Deprecated/;
156+
157+
/** Returns the columns referenced by the QgsDataDefined
158+
* @param context expression context, used for preparing the expression if required
159+
* @note added in QGIS 2.12
160+
*/
161+
QStringList referencedColumns( const QgsExpressionContext& context = QgsExpressionContext() );
149162

150163
/**
151164
* Get the field which this QgsDataDefined represents. Be aware that this may return

src/core/qgsdatadefined.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ void QgsDataDefined::setUseExpression( bool use )
115115

116116
d.detach();
117117
d->useExpression = use;
118+
d->expressionPrepared = false;
118119
d->exprRefColumns.clear();
119120
}
120121

@@ -156,17 +157,22 @@ bool QgsDataDefined::prepareExpression( QgsVectorLayer* layer )
156157
{
157158
if ( layer )
158159
{
159-
return prepareExpression( layer->fields() );
160+
return prepareExpression( QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), layer->fields() ) );
160161
}
161162
else
162163
{
163-
//preparing expression without a layer set, so pass empty field list
164-
QgsFields empty;
164+
//preparing expression without a layer set, so pass empty context
165+
QgsExpressionContext empty;
165166
return prepareExpression( empty );
166167
}
167168
}
168169

169170
bool QgsDataDefined::prepareExpression( const QgsFields &fields )
171+
{
172+
return prepareExpression( QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), fields ) );
173+
}
174+
175+
bool QgsDataDefined::prepareExpression( const QgsExpressionContext& context )
170176
{
171177
if ( !d->useExpression || d->expressionString.isEmpty() )
172178
{
@@ -194,7 +200,7 @@ bool QgsDataDefined::prepareExpression( const QgsFields &fields )
194200
}
195201
}
196202

197-
d->expression->prepare( fields );
203+
d->expression->prepare( &context );
198204
d->exprRefColumns = d->expression->referencedColumns();
199205

200206
if ( d->expression->hasEvalError() )
@@ -227,15 +233,21 @@ QStringList QgsDataDefined::referencedColumns( QgsVectorLayer* layer )
227233
{
228234
if ( layer )
229235
{
230-
return referencedColumns( layer->fields() );
236+
return referencedColumns( QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), layer->fields() ) );
231237
}
232238
else
233239
{
234-
return referencedColumns( );
240+
QgsExpressionContext empty;
241+
return referencedColumns( empty );
235242
}
236243
}
237244

238245
QStringList QgsDataDefined::referencedColumns( const QgsFields &fields )
246+
{
247+
return referencedColumns( QgsExpressionContextUtils::createFeatureBasedContext( QgsFeature(), fields ) );
248+
}
249+
250+
QStringList QgsDataDefined::referencedColumns( const QgsExpressionContext& context )
239251
{
240252
if ( !d->exprRefColumns.isEmpty() )
241253
{
@@ -247,7 +259,7 @@ QStringList QgsDataDefined::referencedColumns( const QgsFields &fields )
247259
{
248260
if ( !d->expression || !d->expressionPrepared )
249261
{
250-
prepareExpression( fields );
262+
prepareExpression( context );
251263
}
252264
}
253265
else if ( !d->field.isEmpty() )

src/core/qgsdatadefined.h

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <QExplicitlySharedDataPointer>
2222
#include "qgis.h"
2323
#include "qgsfield.h"
24+
#include "qgsexpressioncontext.h"
2425

2526
class QgsExpression;
2627
class QgsVectorLayer;
@@ -146,14 +147,21 @@ class CORE_EXPORT QgsDataDefined
146147
* @param layer vector layer
147148
* @returns true if expression was successfully prepared
148149
*/
149-
bool prepareExpression( QgsVectorLayer* layer );
150+
Q_DECL_DEPRECATED bool prepareExpression( QgsVectorLayer* layer );
150151

151152
/** Prepares the expression using a fields collection
152153
* @param fields
153154
* @returns true if expression was successfully prepared
154155
* @note added in QGIS 2.9
155156
*/
156-
bool prepareExpression( const QgsFields &fields = QgsFields() );
157+
Q_DECL_DEPRECATED bool prepareExpression( const QgsFields &fields );
158+
159+
/** Prepares the expression using an expression context.
160+
* @param context expression context
161+
* @returns true if expression was successfully prepared
162+
* @note added in QGIS 2.12
163+
*/
164+
bool prepareExpression( const QgsExpressionContext &context = QgsExpressionContext() );
157165

158166
/** Returns whether the data defined object's expression is prepared
159167
* @returns true if expression is prepared
@@ -165,13 +173,19 @@ class CORE_EXPORT QgsDataDefined
165173
/** Returns the columns referenced by the QgsDataDefined
166174
* @param layer vector layer, used for preparing the expression if required
167175
*/
168-
QStringList referencedColumns( QgsVectorLayer* layer );
176+
Q_DECL_DEPRECATED QStringList referencedColumns( QgsVectorLayer* layer );
169177

170178
/** Returns the columns referenced by the QgsDataDefined
171179
* @param fields vector layer, used for preparing the expression if required
172180
* @note added in QGIS 2.9
173181
*/
174-
QStringList referencedColumns( const QgsFields& fields = QgsFields() );
182+
Q_DECL_DEPRECATED QStringList referencedColumns( const QgsFields& fields );
183+
184+
/** Returns the columns referenced by the QgsDataDefined
185+
* @param context expression context, used for preparing the expression if required
186+
* @note added in QGIS 2.12
187+
*/
188+
QStringList referencedColumns( const QgsExpressionContext& context = QgsExpressionContext() );
175189

176190
/**
177191
* Get the field which this QgsDataDefined represents. Be aware that this may return

tests/src/core/testqgsdatadefined.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ void TestQgsDataDefined::create()
9595
void TestQgsDataDefined::copy()
9696
{
9797
QgsDataDefined original( true, true, QString( "sqrt(2)" ), QString( "field" ) );
98-
original.prepareExpression( NULL );
98+
original.prepareExpression();
9999
QgsDataDefined copy( original );
100100
QVERIFY( copy == original );
101101

0 commit comments

Comments
 (0)