Do not set full layer cache when a filter rect is passed

Fixes #19468 - Attribute table: show features visible on
map is broken (and affects show all features, too)
This commit is contained in:
Alessandro Pasotti 2018-07-24 14:38:49 +02:00
parent 1a94727dbe
commit 929ab27282
2 changed files with 31 additions and 2 deletions

View File

@ -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;
}

View File

@ -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 )