Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Port field calculator to contexts
  • Loading branch information
nyalldawson committed Aug 22, 2015
1 parent cf3cf19 commit c1adf62
Show file tree
Hide file tree
Showing 4 changed files with 26 additions and 10 deletions.
4 changes: 2 additions & 2 deletions python/core/qgsexpression.sip
Expand Up @@ -77,9 +77,9 @@ class QgsExpression
void setEvalErrorString( const QString& str );

//! Set the number for $rownum special column
void setCurrentRowNumber( int rowNumber );
void setCurrentRowNumber( int rowNumber ) /Deprecated/;
//! Return the number used for $rownum special column
int currentRowNumber();
int currentRowNumber() /Deprecated/;

//! Assign a special column
static void setSpecialColumn( const QString& name, QVariant value );
Expand Down
20 changes: 15 additions & 5 deletions src/app/qgsfieldcalculator.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qgsproject.h"
#include "qgsvectordataprovider.h"
#include "qgsvectorlayer.h"
#include "qgsexpressioncontext.h"

#include <QMessageBox>
#include <QSettings>
Expand Down Expand Up @@ -147,12 +148,16 @@ void QgsFieldCalculator::accept()
myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() );
myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) );


QString calcString = builder->expressionText();
QgsExpression exp( calcString );
exp.setGeomCalculator( myDa );

if ( ! exp.prepare( mVectorLayer->fields() ) )
QgsExpressionContext expContext;
expContext << QgsExpressionContextUtils::globalScope()
<< QgsExpressionContextUtils::projectScope()
<< QgsExpressionContextUtils::layerScope( mVectorLayer );

if ( !exp.prepare( &expContext ) )
{
QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() );
return;
Expand Down Expand Up @@ -209,7 +214,9 @@ void QgsFieldCalculator::accept()
}
}

if ( ! exp.prepare( mVectorLayer->fields() ) )
//update expression context with new fields
expContext.setFields( mVectorLayer->fields() );
if ( ! exp.prepare( &expContext ) )
{
QApplication::restoreOverrideCursor();
QMessageBox::critical( 0, tr( "Evaluation error" ), exp.evalErrorString() );
Expand Down Expand Up @@ -252,8 +259,11 @@ void QgsFieldCalculator::accept()
continue;
}
}
exp.setCurrentRowNumber( rownum );
QVariant value = exp.evaluate( &feature );

expContext.setFeature( feature );
expContext.lastScope()->setVariable( QString( "_rownum_" ), rownum );

QVariant value = exp.evaluate( &expContext );
field.convertCompatible( value );
if ( exp.hasEvalError() )
{
Expand Down
8 changes: 7 additions & 1 deletion src/core/qgsexpression.cpp
Expand Up @@ -848,9 +848,15 @@ static QVariant fcnSubstr( const QVariantList& values, const QgsExpressionContex
return QVariant( str.mid( from -1, len ) );
}

static QVariant fcnRowNumber( const QVariantList&, const QgsExpressionContext*, QgsExpression* parent )
static QVariant fcnRowNumber( const QVariantList&, const QgsExpressionContext* context, QgsExpression* parent )
{
if ( context && context->hasVariable( "_rownum_" ) )
return context->variable( "_rownum_" );

Q_NOWARN_DEPRECATED_PUSH
return QVariant( parent->currentRowNumber() );
Q_NOWARN_DEPRECATED_POP
//when above is removed - return QVariant()
}

#define FEAT_FROM_CONTEXT(c, f) if (!c || !c->hasVariable(QgsExpressionContext::EXPR_FEATURE)) return QVariant(); \
Expand Down
4 changes: 2 additions & 2 deletions src/core/qgsexpression.h
Expand Up @@ -162,9 +162,9 @@ class CORE_EXPORT QgsExpression
void setEvalErrorString( const QString& str ) { mEvalErrorString = str; }

//! Set the number for $rownum special column
void setCurrentRowNumber( int rowNumber ) { mRowNumber = rowNumber; }
Q_DECL_DEPRECATED void setCurrentRowNumber( int rowNumber ) { mRowNumber = rowNumber; }
//! Return the number used for $rownum special column
int currentRowNumber() { return mRowNumber; }
Q_DECL_DEPRECATED int currentRowNumber() { return mRowNumber; }

//! Assign a special column
static void setSpecialColumn( const QString& name, QVariant value );
Expand Down

0 comments on commit c1adf62

Please sign in to comment.