Skip to content

Commit

Permalink
Remove QgsFeatureRequest::FilterRect
Browse files Browse the repository at this point in the history
This enum value has not been in use since filter rects were
separated from other filter types. Leaving it in API is confusing
and leads to incorrect use.
  • Loading branch information
nyalldawson committed Mar 20, 2017
1 parent 603d02d commit f3e1772
Show file tree
Hide file tree
Showing 9 changed files with 19 additions and 46 deletions.
3 changes: 3 additions & 0 deletions doc/api_break.dox
Expand Up @@ -1049,6 +1049,9 @@ QgsFeatureRequest {#qgis_api_break_3_0_QgsFeatureRequest}
----------------- -----------------


- AllAttributes was renamed to ALL_ATTRIBUTES - AllAttributes was renamed to ALL_ATTRIBUTES
- FilterRect was removed. This enum value was unused, and QgsFeatureRequest.filterRect() should be used
instead. Check for a null rectangle returned by filterRect() to determine whether a filter rect
is in place.


QgsFieldCombobox {#qgis_api_break_3_0_QgsFieldCombobox} QgsFieldCombobox {#qgis_api_break_3_0_QgsFieldCombobox}
---------------- ----------------
Expand Down
1 change: 0 additions & 1 deletion python/core/qgsfeaturerequest.sip
Expand Up @@ -21,7 +21,6 @@ class QgsFeatureRequest
enum FilterType enum FilterType
{ {
FilterNone, //!< No filter is applied FilterNone, //!< No filter is applied
FilterRect, //!< Obsolete, will be ignored. If a filterRect is set it will be used anyway. Filter using a rectangle, no need to set NoGeometry. Instead check for request.filterRect().isNull()
FilterFid, //!< Filter using feature ID FilterFid, //!< Filter using feature ID
FilterExpression, //!< Filter using expression FilterExpression, //!< Filter using expression
FilterFids //!< Filter using feature IDs FilterFids //!< Filter using feature IDs
Expand Down
1 change: 0 additions & 1 deletion src/core/qgscacheindexfeatureid.cpp
Expand Up @@ -63,7 +63,6 @@ bool QgsCacheIndexFeatureId::getCacheIterator( QgsFeatureIterator &featureIterat
break; break;
} }
case QgsFeatureRequest::FilterNone: case QgsFeatureRequest::FilterNone:
case QgsFeatureRequest::FilterRect:
case QgsFeatureRequest::FilterExpression: case QgsFeatureRequest::FilterExpression:
{ {
if ( C->hasFullCache() ) if ( C->hasFullCache() )
Expand Down
33 changes: 5 additions & 28 deletions src/core/qgsfeaturerequest.cpp
Expand Up @@ -23,51 +23,36 @@
const QString QgsFeatureRequest::ALL_ATTRIBUTES = QStringLiteral( "#!allattributes!#" ); const QString QgsFeatureRequest::ALL_ATTRIBUTES = QStringLiteral( "#!allattributes!#" );


QgsFeatureRequest::QgsFeatureRequest() QgsFeatureRequest::QgsFeatureRequest()
: mFilter( FilterNone ) : mFlags( nullptr )
, mFilterFid( -1 )
, mFilterExpression( nullptr )
, mFlags( nullptr )
, mLimit( -1 )
{ {
} }


QgsFeatureRequest::QgsFeatureRequest( QgsFeatureId fid ) QgsFeatureRequest::QgsFeatureRequest( QgsFeatureId fid )
: mFilter( FilterFid ) : mFilter( FilterFid )
, mFilterFid( fid ) , mFilterFid( fid )
, mFilterExpression( nullptr )
, mFlags( nullptr ) , mFlags( nullptr )
, mLimit( -1 )
{ {
} }


QgsFeatureRequest::QgsFeatureRequest( const QgsFeatureIds &fids ) QgsFeatureRequest::QgsFeatureRequest( const QgsFeatureIds &fids )
: mFilter( FilterFids ) : mFilter( FilterFids )
, mFilterFid( -1 )
, mFilterFids( fids ) , mFilterFids( fids )
, mFilterExpression( nullptr )
, mFlags( nullptr ) , mFlags( nullptr )
, mLimit( -1 )
{ {


} }


QgsFeatureRequest::QgsFeatureRequest( const QgsRectangle &rect ) QgsFeatureRequest::QgsFeatureRequest( const QgsRectangle &rect )
: mFilter( FilterRect ) : mFilterRect( rect )
, mFilterRect( rect )
, mFilterFid( -1 )
, mFilterExpression( nullptr )
, mFlags( nullptr ) , mFlags( nullptr )
, mLimit( -1 )
{ {
} }


QgsFeatureRequest::QgsFeatureRequest( const QgsExpression &expr, const QgsExpressionContext &context ) QgsFeatureRequest::QgsFeatureRequest( const QgsExpression &expr, const QgsExpressionContext &context )
: mFilter( FilterExpression ) : mFilter( FilterExpression )
, mFilterFid( -1 )
, mFilterExpression( new QgsExpression( expr ) ) , mFilterExpression( new QgsExpression( expr ) )
, mExpressionContext( context ) , mExpressionContext( context )
, mFlags( nullptr ) , mFlags( nullptr )
, mLimit( -1 )
{ {
} }


Expand All @@ -85,11 +70,11 @@ QgsFeatureRequest &QgsFeatureRequest::operator=( const QgsFeatureRequest &rh )
mFilterFids = rh.mFilterFids; mFilterFids = rh.mFilterFids;
if ( rh.mFilterExpression ) if ( rh.mFilterExpression )
{ {
mFilterExpression = new QgsExpression( *rh.mFilterExpression ); mFilterExpression.reset( new QgsExpression( *rh.mFilterExpression ) );
} }
else else
{ {
mFilterExpression = nullptr; mFilterExpression.reset( nullptr );
} }
mExpressionContext = rh.mExpressionContext; mExpressionContext = rh.mExpressionContext;
mAttrs = rh.mAttrs; mAttrs = rh.mAttrs;
Expand All @@ -99,15 +84,8 @@ QgsFeatureRequest &QgsFeatureRequest::operator=( const QgsFeatureRequest &rh )
return *this; return *this;
} }


QgsFeatureRequest::~QgsFeatureRequest()
{
delete mFilterExpression;
}

QgsFeatureRequest &QgsFeatureRequest::setFilterRect( const QgsRectangle &rect ) QgsFeatureRequest &QgsFeatureRequest::setFilterRect( const QgsRectangle &rect )
{ {
if ( mFilter == FilterNone )
mFilter = FilterRect;
mFilterRect = rect; mFilterRect = rect;
return *this; return *this;
} }
Expand All @@ -129,8 +107,7 @@ QgsFeatureRequest &QgsFeatureRequest::setFilterFids( const QgsFeatureIds &fids )
QgsFeatureRequest &QgsFeatureRequest::setFilterExpression( const QString &expression ) QgsFeatureRequest &QgsFeatureRequest::setFilterExpression( const QString &expression )
{ {
mFilter = FilterExpression; mFilter = FilterExpression;
delete mFilterExpression; mFilterExpression.reset( new QgsExpression( expression ) );
mFilterExpression = new QgsExpression( expression );
return *this; return *this;
} }


Expand Down
19 changes: 9 additions & 10 deletions src/core/qgsfeaturerequest.h
Expand Up @@ -18,6 +18,7 @@
#include "qgis_core.h" #include "qgis_core.h"
#include <QFlags> #include <QFlags>
#include <QList> #include <QList>
#include <memory>


#include "qgsfeature.h" #include "qgsfeature.h"
#include "qgsrectangle.h" #include "qgsrectangle.h"
Expand Down Expand Up @@ -79,7 +80,6 @@ class CORE_EXPORT QgsFeatureRequest
enum FilterType enum FilterType
{ {
FilterNone, //!< No filter is applied FilterNone, //!< No filter is applied
FilterRect, //!< Obsolete, will be ignored. If a filterRect is set it will be used anyway. Filter using a rectangle, no need to set NoGeometry. Instead check for request.filterRect().isNull()
FilterFid, //!< Filter using feature ID FilterFid, //!< Filter using feature ID
FilterExpression, //!< Filter using expression FilterExpression, //!< Filter using expression
FilterFids //!< Filter using feature IDs FilterFids //!< Filter using feature IDs
Expand Down Expand Up @@ -242,22 +242,21 @@ class CORE_EXPORT QgsFeatureRequest
//! Assignment operator //! Assignment operator
QgsFeatureRequest &operator=( const QgsFeatureRequest &rh ); QgsFeatureRequest &operator=( const QgsFeatureRequest &rh );


~QgsFeatureRequest();

/** /**
* Return the filter type which is currently set on this request * Return the filter type which is currently set on this request
* *
* @return Filter type * @return Filter type
*/ */
FilterType filterType() const { if ( mFilter == FilterNone && !mFilterRect.isNull() ) return FilterRect; else return mFilter; } FilterType filterType() const { return mFilter; }


/** /**
* Set rectangle from which features will be taken. Empty rectangle removes the filter. * Set rectangle from which features will be taken. Empty rectangle removes the filter.
*/ */
QgsFeatureRequest &setFilterRect( const QgsRectangle &rect ); QgsFeatureRequest &setFilterRect( const QgsRectangle &rect );


/** /**
* Get the rectangle from which features will be taken. * Get the rectangle from which features will be taken. If the returned
* rectangle is null, then no filter rectangle is set.
*/ */
const QgsRectangle &filterRect() const { return mFilterRect; } const QgsRectangle &filterRect() const { return mFilterRect; }


Expand All @@ -282,7 +281,7 @@ class CORE_EXPORT QgsFeatureRequest
* @see setFilterExpression * @see setFilterExpression
* @see expressionContext * @see expressionContext
*/ */
QgsExpression *filterExpression() const { return mFilterExpression; } QgsExpression *filterExpression() const { return mFilterExpression.get(); }


/** Modifies the existing filter expression to add an additional expression filter. The /** Modifies the existing filter expression to add an additional expression filter. The
* filter expressions are combined using AND, so only features matching both * filter expressions are combined using AND, so only features matching both
Expand Down Expand Up @@ -405,16 +404,16 @@ class CORE_EXPORT QgsFeatureRequest
bool acceptFeature( const QgsFeature &feature ); bool acceptFeature( const QgsFeature &feature );


protected: protected:
FilterType mFilter; FilterType mFilter = FilterNone;
QgsRectangle mFilterRect; QgsRectangle mFilterRect;
QgsFeatureId mFilterFid; QgsFeatureId mFilterFid = -1;
QgsFeatureIds mFilterFids; QgsFeatureIds mFilterFids;
QgsExpression *mFilterExpression = nullptr; std::unique_ptr< QgsExpression > mFilterExpression;
QgsExpressionContext mExpressionContext; QgsExpressionContext mExpressionContext;
Flags mFlags; Flags mFlags;
QgsAttributeList mAttrs; QgsAttributeList mAttrs;
QgsSimplifyMethod mSimplifyMethod; QgsSimplifyMethod mSimplifyMethod;
long mLimit; long mLimit = -1;
OrderBy mOrderBy; OrderBy mOrderBy;
}; };


Expand Down
1 change: 0 additions & 1 deletion src/core/qgsvectorlayercache.cpp
Expand Up @@ -310,7 +310,6 @@ bool QgsVectorLayerCache::canUseCacheForRequest( const QgsFeatureRequest &featur
break; break;
} }
case QgsFeatureRequest::FilterNone: case QgsFeatureRequest::FilterNone:
case QgsFeatureRequest::FilterRect:
case QgsFeatureRequest::FilterExpression: case QgsFeatureRequest::FilterExpression:
{ {
if ( mFullCache ) if ( mFullCache )
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsvectorlayerfeatureiterator.cpp
Expand Up @@ -191,7 +191,7 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
providerLimit += mSource->mChangedAttributeValues.size(); providerLimit += mSource->mChangedAttributeValues.size();
} }


if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression || mProviderRequest.filterType() == QgsFeatureRequest::FilterRect ) if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression || !mProviderRequest.filterRect().isNull() )
{ {
// geometry changes may mean some features no longer match expression or rect, so increase limit sent to provider // geometry changes may mean some features no longer match expression or rect, so increase limit sent to provider
providerLimit += mSource->mChangedGeometries.size(); providerLimit += mSource->mChangedGeometries.size();
Expand Down
2 changes: 1 addition & 1 deletion src/providers/arcgisrest/qgsafsfeatureiterator.cpp
Expand Up @@ -73,7 +73,7 @@ bool QgsAfsFeatureIterator::fetchFeature( QgsFeature &f )
else else
{ {
QgsRectangle filterRect = mSource->provider()->extent(); QgsRectangle filterRect = mSource->provider()->extent();
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect ) if ( !mRequest.filterRect().isNull() )
filterRect = filterRect.intersect( &mRequest.filterRect() ); filterRect = filterRect.intersect( &mRequest.filterRect() );
while ( mFeatureIterator < mSource->provider()->featureCount() ) while ( mFeatureIterator < mSource->provider()->featureCount() )
{ {
Expand Down
3 changes: 0 additions & 3 deletions src/providers/oracle/qgsoraclefeatureiterator.cpp
Expand Up @@ -142,9 +142,6 @@ QgsOracleFeatureIterator::QgsOracleFeatureIterator( QgsOracleFeatureSource *sour
//handled below //handled below
break; break;


case QgsFeatureRequest::FilterRect:
// Handled in the if-statement above
break;
} }


if ( mSource->mRequestedGeomType != QgsWkbTypes::Unknown && mSource->mRequestedGeomType != mSource->mDetectedGeomType ) if ( mSource->mRequestedGeomType != QgsWkbTypes::Unknown && mSource->mRequestedGeomType != mSource->mDetectedGeomType )
Expand Down

0 comments on commit f3e1772

Please sign in to comment.