@@ -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,26 @@ 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
+ if ( mFilterFidsIt == mFilterFids .constEnd () )
180
203
{
181
204
close ();
182
205
return false ;
183
206
}
184
-
185
- if ( readFeature ( fet, feature ) )
186
- OGR_F_Destroy ( fet );
187
-
188
- feature.setValid ( true );
189
- close (); // the feature has been read: we have finished here
190
- return true ;
207
+ else
208
+ {
209
+ QgsFeatureId nextId = *mFilterFidsIt ;
210
+ mFilterFidsIt ++;
211
+ bool result = fetchFeatureWithId ( nextId, feature );
212
+ if ( !result )
213
+ close ();
214
+ return result;
215
+ }
191
216
}
192
217
193
218
OGRFeatureH fet;
@@ -220,6 +245,8 @@ bool QgsOgrFeatureIterator::rewind()
220
245
221
246
OGR_L_ResetReading ( ogrLayer );
222
247
248
+ mFilterFidsIt = mFilterFids .constBegin ();
249
+
223
250
return true ;
224
251
}
225
252
@@ -246,7 +273,7 @@ bool QgsOgrFeatureIterator::close()
246
273
}
247
274
248
275
249
- void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex )
276
+ void QgsOgrFeatureIterator::getFeatureAttribute ( OGRFeatureH ogrFet, QgsFeature & f, int attindex ) const
250
277
{
251
278
if ( mSource ->mFirstFieldIsFid && attindex == 0 )
252
279
{
@@ -264,7 +291,7 @@ void QgsOgrFeatureIterator::getFeatureAttribute( OGRFeatureH ogrFet, QgsFeature
264
291
}
265
292
266
293
267
- bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature )
294
+ bool QgsOgrFeatureIterator::readFeature ( OGRFeatureH fet, QgsFeature& feature ) const
268
295
{
269
296
feature.setFeatureId ( OGR_F_GetFID ( fet ) );
270
297
feature.initAttributes ( mSource ->mFields .count () );
0 commit comments