Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Port iterators to expression contexts
  • Loading branch information
nyalldawson committed Aug 22, 2015
1 parent fdfb804 commit 3b6f591
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 8 deletions.
14 changes: 13 additions & 1 deletion python/core/qgsfeaturerequest.sip
Expand Up @@ -33,7 +33,7 @@ class QgsFeatureRequest
//! construct a request with rectangle filter
explicit QgsFeatureRequest( const QgsRectangle& rect );
//! construct a request with a filter expression
explicit QgsFeatureRequest( const QgsExpression& expr );
explicit QgsFeatureRequest( const QgsExpression& expr, const QgsExpressionContext& context = QgsExpressionContext() );

FilterType filterType() const;

Expand All @@ -54,6 +54,18 @@ class QgsFeatureRequest
QgsFeatureRequest& setFilterExpression( const QString& expression );
QgsExpression* filterExpression() const;

/** Returns the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12
* @see setExpressionContext
*/
QgsExpressionContext* expressionContext();

/** Sets the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12
* @see expressionContext
*/
QgsFeatureRequest& setExpressionContext( const QgsExpressionContext& context );

/**
* Disables filter conditions.
* The spatial filter (filterRect) will be kept in place.
Expand Down
3 changes: 2 additions & 1 deletion src/core/qgsfeatureiterator.cpp
Expand Up @@ -66,7 +66,8 @@ bool QgsAbstractFeatureIterator::nextFeatureFilterExpression( QgsFeature& f )
{
while ( fetchFeature( f ) )
{
if ( mRequest.filterExpression()->evaluate( f ).toBool() )
mRequest.expressionContext()->setFeature( f );
if ( mRequest.filterExpression()->evaluate( mRequest.expressionContext() ).toBool() )
return true;
}
return false;
Expand Down
12 changes: 10 additions & 2 deletions src/core/qgsfeaturerequest.cpp
Expand Up @@ -47,10 +47,11 @@ QgsFeatureRequest::QgsFeatureRequest( const QgsRectangle& rect )
{
}

QgsFeatureRequest::QgsFeatureRequest( const QgsExpression& expr )
QgsFeatureRequest::QgsFeatureRequest( const QgsExpression& expr, const QgsExpressionContext &context )
: mFilter( FilterExpression )
, mFilterFid( -1 )
, mFilterExpression( new QgsExpression( expr.expression() ) )
, mExpressionContext( context )
, mFlags( 0 )
{
}
Expand Down Expand Up @@ -113,6 +114,12 @@ QgsFeatureRequest& QgsFeatureRequest::setFilterExpression( const QString& expres
return *this;
}

QgsFeatureRequest &QgsFeatureRequest::setExpressionContext( const QgsExpressionContext &context )
{
mExpressionContext = context;
return *this;
}

QgsFeatureRequest& QgsFeatureRequest::setFlags( QgsFeatureRequest::Flags flags )
{
mFlags = flags;
Expand Down Expand Up @@ -176,7 +183,8 @@ bool QgsFeatureRequest::acceptFeature( const QgsFeature& feature )
break;

case QgsFeatureRequest::FilterExpression:
if ( mFilterExpression->evaluate( feature ).toBool() )
mExpressionContext.setFeature( feature );
if ( mFilterExpression->evaluate( &mExpressionContext ).toBool() )
return true;
else
return false;
Expand Down
29 changes: 27 additions & 2 deletions src/core/qgsfeaturerequest.h
Expand Up @@ -20,6 +20,7 @@
#include "qgsfeature.h"
#include "qgsrectangle.h"
#include "qgsexpression.h"
#include "qgsexpressioncontext.h"
#include "qgssimplifymethod.h"

#include <QList>
Expand Down Expand Up @@ -85,7 +86,7 @@ class CORE_EXPORT QgsFeatureRequest
//! construct a request with rectangle filter
explicit QgsFeatureRequest( const QgsRectangle& rect );
//! construct a request with a filter expression
explicit QgsFeatureRequest( const QgsExpression& expr );
explicit QgsFeatureRequest( const QgsExpression& expr, const QgsExpressionContext& context = QgsExpressionContext() );
//! copy constructor
QgsFeatureRequest( const QgsFeatureRequest& rh );

Expand All @@ -108,10 +109,33 @@ class CORE_EXPORT QgsFeatureRequest
QgsFeatureRequest& setFilterFids( QgsFeatureIds fids );
const QgsFeatureIds& filterFids() const { return mFilterFids; }

//! Set filter expression. {@see QgsExpression}
/** Set the filter expression. {@see QgsExpression}
* @param expression expression string
* @see filterExpression
* @see setExpressionContext
*/
QgsFeatureRequest& setFilterExpression( const QString& expression );

/** Returns the filter expression if set.
* @see setFilterExpression
* @see expressionContext
*/
QgsExpression* filterExpression() const { return mFilterExpression; }

/** Returns the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12
* @see setExpressionContext
* @see filterExpression
*/
QgsExpressionContext* expressionContext() { return &mExpressionContext; }

/** Sets the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12
* @see expressionContext
* @see setFilterExpression
*/
QgsFeatureRequest& setExpressionContext( const QgsExpressionContext& context );

/**
* Disables filter conditions.
* The spatial filter (filterRect) will be kept in place.
Expand Down Expand Up @@ -162,6 +186,7 @@ class CORE_EXPORT QgsFeatureRequest
QgsFeatureId mFilterFid;
QgsFeatureIds mFilterFids;
QgsExpression* mFilterExpression;
QgsExpressionContext mExpressionContext;
Flags mFlags;
QgsAttributeList mAttrs;
QgsSimplifyMethod mSimplifyMethod;
Expand Down
6 changes: 4 additions & 2 deletions src/core/qgsvectorlayerfeatureiterator.cpp
Expand Up @@ -160,7 +160,8 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat

if ( mRequest.filterType() == QgsFeatureRequest::FilterExpression )
{
mRequest.filterExpression()->prepare( mSource->mFields );
mRequest.expressionContext()->setFields( mSource->mFields );
mRequest.filterExpression()->prepare( mRequest.expressionContext() );
}
}

Expand Down Expand Up @@ -380,7 +381,8 @@ bool QgsVectorLayerFeatureIterator::fetchNextChangedAttributeFeature( QgsFeature
if ( mHasVirtualAttributes )
addVirtualAttributes( f );

if ( mRequest.filterExpression()->evaluate( &f ).toBool() )
mRequest.expressionContext()->setFeature( f );
if ( mRequest.filterExpression()->evaluate( mRequest.expressionContext() ).toBool() )
{
return true;
}
Expand Down
1 change: 1 addition & 0 deletions src/core/qgsvectorlayerrenderer.cpp
Expand Up @@ -150,6 +150,7 @@ bool QgsVectorLayerRenderer::render()
if ( !rendererFilter.isEmpty() )
{
featureRequest.setFilterExpression( rendererFilter );
featureRequest.setExpressionContext( mContext.expressionContext() );
}

// enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine.
Expand Down

0 comments on commit 3b6f591

Please sign in to comment.