diff --git a/src/core/qgsvectorlayercache.cpp b/src/core/qgsvectorlayercache.cpp index 9001a36e1f5..133d846715e 100644 --- a/src/core/qgsvectorlayercache.cpp +++ b/src/core/qgsvectorlayercache.cpp @@ -205,11 +205,12 @@ void QgsVectorLayerCache::requestCompleted( const QgsFeatureRequest &featureRequ // If a request is too large for the cache don't notify to prevent from indexing incomplete requests if ( fids.count() <= mCache.size() ) { - Q_FOREACH ( QgsAbstractCacheIndex *idx, mCacheIndices ) + for ( const auto &idx : qgis::as_const( mCacheIndices ) ) { idx->requestCompleted( featureRequest, fids ); } - if ( featureRequest.filterType() == QgsFeatureRequest::FilterNone ) + if ( featureRequest.filterType() == QgsFeatureRequest::FilterNone && + ( featureRequest.filterRect().isNull() || featureRequest.filterRect().contains( mLayer->extent() ) ) ) { mFullCache = true; } diff --git a/tests/src/core/testqgsvectorlayercache.cpp b/tests/src/core/testqgsvectorlayercache.cpp index 745709603bb..6365e8fa473 100644 --- a/tests/src/core/testqgsvectorlayercache.cpp +++ b/tests/src/core/testqgsvectorlayercache.cpp @@ -53,6 +53,7 @@ class TestVectorLayerCache : public QObject void testFullCacheThroughRequest(); void testCanUseCacheForRequest(); void testCacheGeom(); + void testFullCacheWithRect(); // Test that if rect is set then no full cache can exist, see #19468 void onCommittedFeaturesAdded( const QString &, const QgsFeatureList & ); @@ -390,6 +391,33 @@ void TestVectorLayerCache::testCacheGeom() QVERIFY( !cache.hasFullCache() ); } +void TestVectorLayerCache::testFullCacheWithRect() +{ + QgsVectorLayerCache cache( mPointsLayer, mPointsLayer->dataProvider()->featureCount() ); + // cache geometry + cache.setCacheGeometry( true ); + QVERIFY( ! cache.hasFullCache() ); + QgsFeatureRequest req; + req.setFilterRect( mPointsLayer->dataProvider()->extent().buffered( - mPointsLayer->dataProvider()->extent().width() / 2 ) ); + QgsFeatureIterator it = cache.getFeatures( req ); + QgsFeature f; + while ( it.nextFeature( f ) ) + { + QVERIFY( f.hasGeometry() ); + } + QVERIFY( ! cache.hasFullCache() ); + + // Filter rect contains extent + req.setFilterRect( mPointsLayer->dataProvider()->extent().buffered( 1 ) ); + it = cache.getFeatures( req ); + while ( it.nextFeature( f ) ) + { + QVERIFY( f.hasGeometry() ); + } + QVERIFY( cache.hasFullCache() ); + +} + void TestVectorLayerCache::onCommittedFeaturesAdded( const QString &layerId, const QgsFeatureList &features ) { Q_UNUSED( layerId )