Skip to content

Commit 89e6904

Browse files
committedOct 12, 2016
Correctly handle edit buffer when using request with limit (fix #15505)
(cherry-picked from 2665eb5)
1 parent 48e6bfc commit 89e6904

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed
 

‎src/core/qgsvectorlayerfeatureiterator.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,28 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
175175
changedIds << attIt.key();
176176
}
177177
mChangedFeaturesRequest.setFilterFids( changedIds );
178+
179+
if ( mChangedFeaturesRequest.limit() > 0 )
180+
{
181+
int providerLimit = mProviderRequest.limit();
182+
183+
// features may be deleted in buffer, so increase limit sent to provider
184+
providerLimit += mSource->mDeletedFeatureIds.size();
185+
186+
if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression )
187+
{
188+
// attribute changes may mean some features no longer match expression, so increase limit sent to provider
189+
providerLimit += mSource->mChangedAttributeValues.size();
190+
}
191+
192+
if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression || mProviderRequest.filterType() == QgsFeatureRequest::FilterRect )
193+
{
194+
// geometry changes may mean some features no longer match expression or rect, so increase limit sent to provider
195+
providerLimit += mSource->mChangedGeometries.size();
196+
}
197+
198+
mProviderRequest.setLimit( providerLimit );
199+
}
178200
}
179201

180202
if ( request.filterType() == QgsFeatureRequest::FilterFid )

‎tests/src/python/test_qgsvectorlayer.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,6 +1626,47 @@ def testEvaluatingDefaultExpressions(self):
16261626
layer.setDefaultValueExpression(1, 'not a valid expression')
16271627
self.assertFalse(layer.defaultValue(1))
16281628

1629+
def testGetFeatureLimitWithEdits(self):
1630+
""" test getting features with a limit, when edits are present """
1631+
layer = createLayerWithOnePoint()
1632+
# now has one feature with id 0
1633+
1634+
pr = layer.dataProvider()
1635+
1636+
f1 = QgsFeature(1)
1637+
f1.setAttributes(["test", 3])
1638+
f1.setGeometry(QgsGeometry.fromPoint(QgsPoint(300, 200)))
1639+
f2 = QgsFeature(2)
1640+
f2.setAttributes(["test", 3])
1641+
f2.setGeometry(QgsGeometry.fromPoint(QgsPoint(100, 200)))
1642+
f3 = QgsFeature(3)
1643+
f3.setAttributes(["test", 3])
1644+
f3.setGeometry(QgsGeometry.fromPoint(QgsPoint(100, 200)))
1645+
self.assertTrue(pr.addFeatures([f1, f2, f3]))
1646+
1647+
req = QgsFeatureRequest().setLimit(2)
1648+
self.assertEqual(len(list(layer.getFeatures(req))), 2)
1649+
1650+
# now delete feature f1
1651+
layer.startEditing()
1652+
self.assertTrue(layer.deleteFeature(1))
1653+
req = QgsFeatureRequest().setLimit(2)
1654+
self.assertEqual(len(list(layer.getFeatures(req))), 2)
1655+
layer.rollBack()
1656+
1657+
# change an attribute value required by filter
1658+
layer.startEditing()
1659+
req = QgsFeatureRequest().setFilterExpression('fldint=3').setLimit(2)
1660+
self.assertTrue(layer.changeAttributeValue(2, 1, 4))
1661+
self.assertEqual(len(list(layer.getFeatures(req))), 2)
1662+
layer.rollBack()
1663+
1664+
layer.startEditing()
1665+
req = QgsFeatureRequest().setFilterRect(QgsRectangle(50, 100, 150, 300)).setLimit(2)
1666+
self.assertTrue(layer.changeGeometry(2, QgsGeometry.fromPoint(QgsPoint(500, 600))))
1667+
self.assertEqual(len(list(layer.getFeatures(req))), 2)
1668+
layer.rollBack()
1669+
16291670

16301671
# TODO:
16311672
# - fetch rect: feat with changed geometry: 1. in rect, 2. out of rect

0 commit comments

Comments
 (0)
Please sign in to comment.