Skip to content

Commit 5be0ee7

Browse files
committed
Remove QgsFeatureRequest::FilterRect from providers/iterators
1 parent 7571264 commit 5be0ee7

21 files changed

+170
-100
lines changed

python/core/qgsvectorlayer.sip

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,12 @@ class QgsVectorLayer : QgsMapLayer
801801
/** Return the extent of the layer as a QRect */
802802
QgsRectangle extent();
803803

804-
/** Returns field list in the to-be-committed state */
804+
/**
805+
* Returns the list of fields of this layer.
806+
* This also includes fields which have not yet been saved to the provider.
807+
*
808+
* @return A list of fields
809+
*/
805810
const QgsFields &pendingFields() const;
806811

807812
/** Returns list of attributes */

src/core/qgsvectorlayer.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,11 +2220,6 @@ bool QgsVectorLayer::deleteFeature( QgsFeatureId fid )
22202220
return res;
22212221
}
22222222

2223-
const QgsFields &QgsVectorLayer::pendingFields() const
2224-
{
2225-
return mUpdatedFields;
2226-
}
2227-
22282223
QgsAttributeList QgsVectorLayer::pendingAllAttributesList()
22292224
{
22302225
return mUpdatedFields.allAttributesList();

src/core/qgsvectorlayer.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1300,8 +1300,13 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer
13001300
/** Return the extent of the layer as a QRect */
13011301
QgsRectangle extent() override;
13021302

1303-
/** Returns field list in the to-be-committed state */
1304-
const QgsFields &pendingFields() const;
1303+
/**
1304+
* Returns the list of fields of this layer.
1305+
* This also includes fields which have not yet been saved to the provider.
1306+
*
1307+
* @return A list of fields
1308+
*/
1309+
const QgsFields &pendingFields() const { return mUpdatedFields; }
13051310

13061311
/** Returns list of attributes */
13071312
QgsAttributeList pendingAllAttributesList();

src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ bool QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f )
176176
return res;
177177
}
178178

179-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect )
179+
if ( !mRequest.filterRect().isNull() )
180180
{
181181
if ( fetchNextChangedGeomFeature( f ) )
182182
return true;
@@ -352,21 +352,18 @@ bool QgsVectorLayerFeatureIterator::fetchNextChangedAttributeFeature( QgsFeature
352352
{
353353
while ( mChangedFeaturesIterator.nextFeature( f ) )
354354
{
355+
if ( mFetchConsidered.contains( f.id() ) )
356+
// skip deleted features and those already handled by the geometry
357+
continue;
358+
355359
mFetchConsidered << f.id();
356360

357361
updateChangedAttributes( f );
358362

359363
if ( mHasVirtualAttributes )
360364
addVirtualAttributes( f );
361365

362-
if ( mRequest.filterType() == QgsFeatureRequest::FilterExpression )
363-
{
364-
if ( mRequest.filterExpression()->evaluate( &f ).toBool() )
365-
{
366-
return true;
367-
}
368-
}
369-
else
366+
if ( mRequest.filterExpression()->evaluate( &f ).toBool() )
370367
{
371368
return true;
372369
}

src/core/qgsvectorlayerrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ bool QgsVectorLayerRenderer::render()
136136

137137
QgsRenderOptions opts = mRendererV2->startRender( mContext, mFields );
138138

139+
QgsDebugMsg( opts.whereClause() );
139140
QgsRectangle requestExtent = mContext.extent();
140141
mRendererV2->modifyRequestExtent( requestExtent, mContext );
141142

src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,21 +44,8 @@ QgsDelimitedTextFeatureIterator::QgsDelimitedTextFeatureIterator( QgsDelimitedTe
4444
mTestGeometry = false;
4545

4646
mMode = FileScan;
47-
if ( request.filterType() == QgsFeatureRequest::FilterFid )
48-
{
49-
QgsDebugMsg( "Configuring for returning single id" );
50-
mFeatureIds.append( request.filterFid() );
51-
mMode = FeatureIds;
52-
mTestSubset = false;
53-
}
54-
// If have geometry and testing geometry then evaluate options...
55-
// If we don't have geometry then all records pass geometry filter.
56-
// CC: 2013-05-09
57-
// Not sure about intended relationship between filtering on geometry and
58-
// requesting no geometry? Have preserved current logic of ignoring spatial filter
59-
// if not requesting geometry.
6047

61-
else if ( request.filterType() == QgsFeatureRequest::FilterRect && hasGeometry )
48+
if ( !request.filterRect().isNull() && hasGeometry )
6249
{
6350
QgsDebugMsg( "Configuring for rectangle select" );
6451
mTestGeometry = true;
@@ -98,13 +85,32 @@ QgsDelimitedTextFeatureIterator::QgsDelimitedTextFeatureIterator( QgsDelimitedTe
9885
}
9986
}
10087

101-
// If we have a subset index then use it..
102-
if ( mMode == FileScan && mSource->mUseSubsetIndex )
88+
if ( request.filterType() == QgsFeatureRequest::FilterFid )
10389
{
104-
QgsDebugMsg( QString( "Layer has subset index - use %1 items from subset index" ).arg( mSource->mSubsetIndex.size() ) );
90+
QgsDebugMsg( "Configuring for returning single id" );
91+
if ( request.filterRect().isNull() || ( !request.filterRect().isNull() && mFeatureIds.contains( request.filterFid() ) ) )
92+
{
93+
mFeatureIds = QList<QgsFeatureId>() << request.filterFid();
94+
}
95+
mMode = FeatureIds;
10596
mTestSubset = false;
106-
mMode = SubsetIndex;
10797
}
98+
// If have geometry and testing geometry then evaluate options...
99+
// If we don't have geometry then all records pass geometry filter.
100+
// CC: 2013-05-09
101+
// Not sure about intended relationship between filtering on geometry and
102+
// requesting no geometry? Have preserved current logic of ignoring spatial filter
103+
// if not requesting geometry.
104+
105+
else
106+
107+
// If we have a subset index then use it..
108+
if ( mMode == FileScan && mSource->mUseSubsetIndex )
109+
{
110+
QgsDebugMsg( QString( "Layer has subset index - use %1 items from subset index" ).arg( mSource->mSubsetIndex.size() ) );
111+
mTestSubset = false;
112+
mMode = SubsetIndex;
113+
}
108114

109115
// Otherwise just have to scan the file
110116
if ( mMode == FileScan )

src/providers/gpx/qgsgpxfeatureiterator.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ bool QgsGPXFeatureIterator::readFid( QgsFeature& feature )
176176

177177
bool QgsGPXFeatureIterator::readWaypoint( const QgsWaypoint& wpt, QgsFeature& feature )
178178
{
179-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect )
179+
if ( !mRequest.filterRect().isNull() )
180180
{
181181
const QgsRectangle& rect = mRequest.filterRect();
182182
if ( ! rect.contains( QgsPoint( wpt.lon, wpt.lat ) ) )
@@ -206,7 +206,7 @@ bool QgsGPXFeatureIterator::readRoute( const QgsRoute& rte, QgsFeature& feature
206206

207207
QgsGeometry* theGeometry = readRouteGeometry( rte );
208208

209-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect )
209+
if ( !mRequest.filterRect().isNull() )
210210
{
211211
const QgsRectangle& rect = mRequest.filterRect();
212212
if (( rte.xMax < rect.xMinimum() ) || ( rte.xMin > rect.xMaximum() ) ||
@@ -248,7 +248,7 @@ bool QgsGPXFeatureIterator::readTrack( const QgsTrack& trk, QgsFeature& feature
248248

249249
QgsGeometry* theGeometry = readTrackGeometry( trk );
250250

251-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect )
251+
if ( !mRequest.filterRect().isNull() )
252252
{
253253
const QgsRectangle& rect = mRequest.filterRect();
254254
if (( trk.xMax < rect.xMinimum() ) || ( trk.xMin > rect.xMaximum() ) ||

src/providers/grass/qgsgrassfeatureiterator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ QgsGrassFeatureIterator::QgsGrassFeatureIterator( QgsGrassFeatureSource* source,
8080
allocateSelection( mSource->mMap );
8181
resetSelection( 1 );
8282

83-
if ( request.filterType() == QgsFeatureRequest::FilterRect )
83+
if ( !request.filterRect().isNull() )
8484
{
8585
setSelectionRect( request.filterRect(), request.flags() & QgsFeatureRequest::ExactIntersect );
8686
}

src/providers/memory/qgsmemoryfeatureiterator.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@ QgsMemoryFeatureIterator::QgsMemoryFeatureIterator( QgsMemoryFeatureSource* sour
3333
mSubsetExpression->prepare( mSource->mFields );
3434
}
3535

36-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
36+
if ( !mRequest.filterRect().isNull() && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
3737
{
3838
mSelectRectGeom = QgsGeometry::fromRect( request.filterRect() );
3939
}
4040

4141
// if there's spatial index, use it!
4242
// (but don't use it when selection rect is not specified)
43-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect && mSource->mSpatialIndex )
43+
if ( !mRequest.filterRect().isNull() && mSource->mSpatialIndex )
4444
{
4545
mUsingFeatureIdList = true;
4646
mFeatureIdList = mSource->mSpatialIndex->intersects( mRequest.filterRect() );
@@ -90,7 +90,7 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature& feature )
9090
// option 1: we have a list of features to traverse
9191
while ( mFeatureIdListIterator != mFeatureIdList.constEnd() )
9292
{
93-
if ( mRequest.filterType() == QgsFeatureRequest::FilterRect && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
93+
if ( !mRequest.filterRect().isNull() && mRequest.flags() & QgsFeatureRequest::ExactIntersect )
9494
{
9595
// do exact check in case we're doing intersection
9696
if ( mSource->mFeatures[*mFeatureIdListIterator].geometry() && mSource->mFeatures[*mFeatureIdListIterator].geometry()->intersects( mSelectRectGeom ) )
@@ -131,7 +131,7 @@ bool QgsMemoryFeatureIterator::nextFeatureTraverseAll( QgsFeature& feature )
131131
// option 2: traversing the whole layer
132132
while ( mSelectIterator != mSource->mFeatures.constEnd() )
133133
{
134-
if ( mRequest.filterType() != QgsFeatureRequest::FilterRect )
134+
if ( mRequest.filterRect().isNull() )
135135
{
136136
// selection rect empty => using all features
137137
hasFeature = true;

src/providers/mssql/qgsmssqlfeatureiterator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
8989

9090
bool filterAdded = false;
9191
// set spatial filter
92-
if ( request.filterType() == QgsFeatureRequest::FilterRect && mSource->isSpatial() && !request.filterRect().isEmpty() )
92+
if ( !request.filterRect().isNull() && mSource->isSpatial() && !request.filterRect().isEmpty() )
9393
{
9494
// polygons should be CCW for SqlGeography
9595
QString r;

0 commit comments

Comments
 (0)