Skip to content

Commit ab6d796

Browse files
committed
Improve selected features offline editing performance
1 parent 30b6e7e commit ab6d796

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
@@ -622,20 +622,30 @@ QgsVectorLayer* QgsOfflineEditing::copyVectorLayer( QgsVectorLayer* layer, sqlit
622622
// NOTE: force feature recount for PostGIS layer, else only visible features are counted, before iterating over all features (WORKAROUND)
623623
layer->setSubsetString( layer->subsetString() );
624624

625-
QgsFeatureIterator fit = layer->dataProvider()->getFeatures();
625+
QgsFeatureRequest req;
626626

627-
QgsFeatureIds selectedFids = layer->selectedFeaturesIds();
627+
if ( onlySelected )
628+
{
629+
QgsFeatureIds selectedFids = layer->selectedFeaturesIds();
630+
if ( !selectedFids.isEmpty() )
631+
req.setFilterFids( selectedFids );
632+
}
633+
634+
QgsFeatureIterator fit = layer->dataProvider()->getFeatures( req );
628635

629-
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->dataProvider()->featureCount() );
636+
if ( req.filterType() == QgsFeatureRequest::FilterFids )
637+
{
638+
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->selectedFeaturesIds().size() );
639+
}
640+
else
641+
{
642+
emit progressModeSet( QgsOfflineEditing::CopyFeatures, layer->dataProvider()->featureCount() );
643+
}
630644
int featureCount = 1;
631645

632646
QList<QgsFeatureId> remoteFeatureIds;
633647
while ( fit.nextFeature( f ) )
634648
{
635-
// Check if we only want selected feature, if the selection is not empty and the current feature is not selected: dismiss it
636-
if ( onlySelected && !selectedFids.isEmpty() && !selectedFids.contains( f.id() ) )
637-
continue;
638-
639649
remoteFeatureIds << f.id();
640650

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

0 commit comments

Comments
 (0)