Skip to content

Commit 5b6042a

Browse files
committed
Make counting and testing filters in rule based renderers faster
Hand filters off to the provider where possible and avoid fetching unnecessary attributes/geometry (cherry-picked from 9900036)
1 parent 1a495d0 commit 5b6042a

File tree

1 file changed

+12
-9
lines changed

1 file changed

+12
-9
lines changed

src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ void QgsRuleBasedRendererV2Widget::countFeatures()
514514
countMap[rule].duplicateCount = 0;
515515
}
516516

517-
QgsFeatureIterator fit = mLayer->getFeatures( QgsFeatureRequest().setFlags( QgsFeatureRequest::NoGeometry ) );
517+
QgsFeatureRequest req = QgsFeatureRequest().setFilterExpression( mRenderer->filter( mLayer->fields() ) );
518518

519519
QgsRenderContext renderContext;
520520
renderContext.setRendererScale( 0 ); // ignore scale
@@ -535,9 +535,13 @@ void QgsRuleBasedRendererV2Widget::countFeatures()
535535
context << QgsExpressionContextUtils::layerScope( mLayer );
536536

537537
renderContext.setExpressionContext( context );
538+
req.setExpressionContext( context );
538539

539540
mRenderer->startRender( renderContext, mLayer->fields() );
540541

542+
req.setSubsetOfAttributes( mRenderer->usedAttributes(), mLayer->fields() );
543+
QgsFeatureIterator fit = mLayer->getFeatures( req );
544+
541545
int nFeatures = mLayer->featureCount();
542546
QProgressDialog p( tr( "Calculating feature count." ), tr( "Abort" ), 0, nFeatures );
543547
p.setWindowModality( Qt::WindowModal );
@@ -762,19 +766,18 @@ void QgsRendererRulePropsWidget::testFilter()
762766

763767
QApplication::setOverrideCursor( Qt::WaitCursor );
764768

765-
QgsFeatureIterator fit = mLayer->getFeatures();
769+
QgsFeatureRequest req = QgsFeatureRequest().setSubsetOfAttributes( QgsAttributeList() )
770+
.setFlags( QgsFeatureRequest::NoGeometry )
771+
.setFilterExpression( editFilter->text() )
772+
.setExpressionContext( context );
773+
774+
QgsFeatureIterator fit = mLayer->getFeatures( req );
766775

767776
int count = 0;
768777
QgsFeature f;
769778
while ( fit.nextFeature( f ) )
770779
{
771-
context.setFeature( f );
772-
773-
QVariant value = filter.evaluate( &context );
774-
if ( value.toInt() != 0 )
775-
count++;
776-
if ( filter.hasEvalError() )
777-
break;
780+
count++;
778781
}
779782

780783
QApplication::restoreOverrideCursor();

0 commit comments

Comments
 (0)