bool QgsVectorLayerFeatureIterator::nextFeature( QgsFeature& f ) { f.setValid( false ); if ( mClosed ) return false; if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) { if ( mFetchedFid ) return false; bool res = nextFeatureFid( f ); mFetchedFid = true; return res; } if ( mRequest.filterType() == QgsFeatureRequest::FilterRect ) { if ( fetchNextChangedGeomFeature( f ) ) return true; // no more changed geometries } if ( fetchNextAddedFeature( f ) ) return true; // no more added features while ( mProviderIterator.nextFeature( f ) ) { if ( mFetchConsidered.contains( f.id() ) ) continue; // TODO[MD]: just one resize of attributes f.setFields( &L->mUpdatedFields ); // update attributes updateChangedAttributes( f ); if ( !mFetchJoinInfo.isEmpty() ) addJoinedAttributes( f ); // update geometry if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) ) updateFeatureGeometry( f ); return true; } close(); return false; }
bool QgsVectorLayerFeatureIterator::fetchFeature( QgsFeature& f ) { f.setValid( false ); if ( mClosed ) return false; if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) { if ( mFetchedFid ) return false; bool res = nextFeatureFid( f ); mFetchedFid = true; return res; } if ( mRequest.filterType() == QgsFeatureRequest::FilterRect ) { if ( fetchNextChangedGeomFeature( f ) ) return true; // no more changed geometries } if ( mRequest.filterType() == QgsFeatureRequest::FilterExpression ) { if ( fetchNextChangedAttributeFeature( f ) ) return true; // no more changed features } while ( fetchNextAddedFeature( f ) ) { return true; } // no more added features if ( mProviderIterator.isClosed() ) { mChangedFeaturesIterator.close(); mProviderIterator = mSource->mProviderFeatureSource->getFeatures( mProviderRequest ); } while ( mProviderIterator.nextFeature( f ) ) { if ( mFetchConsidered.contains( f.id() ) ) continue; // TODO[MD]: just one resize of attributes f.setFields( &mSource->mFields ); // update attributes updateChangedAttributes( f ); addVirtualAttributes( f ); // update geometry // TODO[MK]: FilterRect check after updating the geometry if ( !( mRequest.flags() & QgsFeatureRequest::NoGeometry ) ) updateFeatureGeometry( f ); return true; } // no more provider features close(); return false; }