Skip to content

Commit 60fcddf

Browse files
committed
Improve selected features offline editing performance
1 parent fe66dc0 commit 60fcddf

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

src/core/qgsofflineediting.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -633,20 +633,30 @@ QgsVectorLayer* QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlit
633633
// NOTE: force feature recount for PostGIS layer, else only visible features are counted, before iterating over all features (WORKAROUND)
634634
layer->setSubsetString( layer->subsetString() );
635635

636-
QgsFeatureIterator fit = layer->dataProvider()->getFeatures();
636+
QgsFeatureRequest req;
637637

638-
QgsFeatureIds selectedFids = layer->selectedFeaturesIds();
638+
if ( onlySelected )
639+
{
640+
QgsFeatureIds selectedFids = layer->selectedFeaturesIds();
641+
if ( !selectedFids.isEmpty() )
642+
req.setFilterFids( selectedFids );
643+
}
644+
645+
QgsFeatureIterator fit = layer->dataProvider()->getFeatures( req );
639646

640-
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->dataProvider()->featureCount() );
647+
if ( req.filterType() == QgsFeatureRequest::FilterFids )
648+
{
649+
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->selectedFeaturesIds().size() );
650+
}
651+
else
652+
{
653+
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->dataProvider()->featureCount() );
654+
}
641655
int featureCount = 1;
642656

643657
QList<QgsFeatureId> remoteFeatureIds;
644658
while ( fit.nextFeature( f ) )
645659
{
646-
// Check if we only want selected feature, if the selection is not empty and the current feature is not selected: dismiss it
647-
if ( onlySelected && !selectedFids.isEmpty() && !selectedFids.contains( f.id() ) )
648-
continue;
649-
650660
remoteFeatureIds << f.id();
651661

652662
// NOTE: Spatialite provider ignores position of geometry column

0 commit comments

Comments
 (0)