Skip to content

Commit 51a4981

Browse files
committed
[memory] Optimise iteration, avoid multiple map lookups and an unnecessary expression evaluation
1 parent 6fb7856 commit 51a4981

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

src/core/providers/memory/qgsmemoryfeatureiterator.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -108,14 +108,16 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature &feature )
108108
bool hasFeature = false;
109109

110110
// option 1: we have a list of features to traverse
111+
QgsFeature candidate;
111112
while ( mFeatureIdListIterator != mFeatureIdList.constEnd() )
112113
{
114+
candidate = mSource->mFeatures.value( *mFeatureIdListIterator );
113115
if ( !mFilterRect.isNull() )
114116
{
115117
if ( mRequest.flags() & QgsFeatureRequest::ExactIntersect )
116118
{
117119
// do exact check in case we're doing intersection
118-
if ( mSource->mFeatures.value( *mFeatureIdListIterator ).hasGeometry() && mSelectRectEngine->intersects( mSource->mFeatures.value( *mFeatureIdListIterator ).geometry().constGet() ) )
120+
if ( candidate.hasGeometry() && mSelectRectEngine->intersects( candidate.geometry().constGet() ) )
119121
hasFeature = true;
120122
}
121123
else if ( mSource->mSpatialIndex )
@@ -126,16 +128,16 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature &feature )
126128
else
127129
{
128130
// do bounding box check if we aren't using a spatial index
129-
if ( mSource->mFeatures.value( *mFeatureIdListIterator ).hasGeometry() && mSource->mFeatures.value( *mFeatureIdListIterator ).geometry().boundingBoxIntersects( mFilterRect ) )
131+
if ( candidate.hasGeometry() && candidate.geometry().boundingBoxIntersects( mFilterRect ) )
130132
hasFeature = true;
131133
}
132134
}
133135
else
134136
hasFeature = true;
135137

136-
if ( mSubsetExpression )
138+
if ( hasFeature && mSubsetExpression )
137139
{
138-
mSource->mExpressionContext.setFeature( mSource->mFeatures.value( *mFeatureIdListIterator ) );
140+
mSource->mExpressionContext.setFeature( candidate );
139141
if ( !mSubsetExpression->evaluate( &mSource->mExpressionContext ).toBool() )
140142
hasFeature = false;
141143
}
@@ -149,7 +151,7 @@ bool QgsMemoryFeatureIterator::nextFeatureUsingList( QgsFeature &feature )
149151
// copy feature
150152
if ( hasFeature )
151153
{
152-
feature = mSource->mFeatures.value( *mFeatureIdListIterator );
154+
feature = candidate;
153155
++mFeatureIdListIterator;
154156
}
155157
else

0 commit comments

Comments
 (0)