@@ -43,6 +43,8 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool
43
43
, mSubsetStringSet( false )
44
44
, mFetchGeometry( false )
45
45
, mExpressionCompiled( false )
46
+ , mFilterFids( mRequest .filterFids() )
47
+ , mFilterFidsIt( mFilterFids .constBegin() )
46
48
{
47
49
mConn = QgsOgrConnPool::instance ()->acquireConnection ( mSource ->mProvider ->dataSourceUri () );
48
50
if ( !mConn ->ds )
@@ -166,6 +168,22 @@ bool QgsOgrFeatureIterator::nextFeatureFilterExpression( QgsFeature& f )
166
168
return fetchFeature ( f );
167
169
}
168
170
171
+ bool QgsOgrFeatureIterator::fetchFeatureWithId ( QgsFeatureId id, QgsFeature& feature ) const
172
+ {
173
+ feature.setValid ( false );
174
+ OGRFeatureH fet = OGR_L_GetFeature ( ogrLayer, FID_TO_NUMBER ( id ) );
175
+ if ( !fet )
176
+ {
177
+ return false ;
178
+ }
179
+
180
+ if ( readFeature ( fet, feature ) )
181
+ OGR_F_Destroy ( fet );
182
+
183
+ feature.setValid ( true );
184
+ return true ;
185
+ }
186
+
169
187
bool QgsOgrFeatureIterator::fetchFeature ( QgsFeature& feature )
170
188
{
171
189
feature.setValid ( false );
@@ -175,19 +193,22 @@ bool QgsOgrFeatureIterator::fetchFeature( QgsFeature& feature )
175
193
176
194
if ( mRequest .filterType () == QgsFeatureRequest::FilterFid )
177
195
{
178
- OGRFeatureH fet = OGR_L_GetFeature ( ogrLayer, FID_TO_NUMBER ( mRequest .filterFid () ) );
179
- if ( !fet )
196
+ bool result = fetchFeatureWithId ( mRequest .filterFid (), feature );
197
+ close (); // the feature has been read or was not found: we have finished here
198
+ return result;
199
+ }
200
+ else if ( mRequest .filterType () == QgsFeatureRequest::FilterFids )
201
+ {
202
+ while ( mFilterFidsIt != mFilterFids .constEnd () )
180
203
{
181
- close ();
182
- return false ;
183
- }
184
-
185
- if ( readFeature ( fet, feature ) )
186
- OGR_F_Destroy ( fet );
204
+ QgsFeatureId nextId = *mFilterFidsIt ;
205
+ mFilterFidsIt ++;
187
206
188
- feature.setValid ( true );
189
- close (); // the feature has been read: we have finished here
190
- return true ;
207
+ if ( fetchFeatureWithId ( nextId, feature ) )
208
+ return true ;
209
+ }
210
+ close ();
211
+ return false ;
191
212
}
192
213
193
214
OGRFeatureH fet;
@@ -220,6 +241,8 @@ bool QgsOgrFeatureIterator::rewind()
220
241
221
242
OGR_L_ResetReading ( ogrLayer );
222
243
244
+ mFilterFidsIt = mFilterFids .constBegin ();
245
+
223
246
return true ;
224
247
}
225
248
@@ -246,7 +269,7 @@ bool QgsOgrFeatureIterator::close()
246
269
}
247
270
248
271
249
- void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex )
272
+ void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex ) const
250
273
{
251
274
if ( mSource ->mFirstFieldIsFid && attindex == 0 )
252
275
{
@@ -264,7 +287,7 @@ void QgsOgrFeatureIterator::getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature
264
287
}
265
288
266
289
267
- bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature )
290
+ bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature ) const
268
291
{
269
292
feature.setFeatureId ( OGR_F_GetFID ( fet ) );
270
293
feature.initAttributes ( mSource ->mFields .count () );
0 commit comments