mirror of
https://github.com/qgis/QGIS.git
synced 2025-04-18 00:03:05 -04:00
Correctly handle edit buffer when using request with limit (fix #15505)
This commit is contained in:
parent
53c3ed2dc0
commit
2665eb50a6
@ -173,6 +173,28 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
|
|||||||
changedIds << attIt.key();
|
changedIds << attIt.key();
|
||||||
}
|
}
|
||||||
mChangedFeaturesRequest.setFilterFids( changedIds );
|
mChangedFeaturesRequest.setFilterFids( changedIds );
|
||||||
|
|
||||||
|
if ( mChangedFeaturesRequest.limit() > 0 )
|
||||||
|
{
|
||||||
|
int providerLimit = mProviderRequest.limit();
|
||||||
|
|
||||||
|
// features may be deleted in buffer, so increase limit sent to provider
|
||||||
|
providerLimit += mSource->mDeletedFeatureIds.size();
|
||||||
|
|
||||||
|
if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression )
|
||||||
|
{
|
||||||
|
// attribute changes may mean some features no longer match expression, so increase limit sent to provider
|
||||||
|
providerLimit += mSource->mChangedAttributeValues.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( mProviderRequest.filterType() == QgsFeatureRequest::FilterExpression || mProviderRequest.filterType() == QgsFeatureRequest::FilterRect )
|
||||||
|
{
|
||||||
|
// geometry changes may mean some features no longer match expression or rect, so increase limit sent to provider
|
||||||
|
providerLimit += mSource->mChangedGeometries.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
mProviderRequest.setLimit( providerLimit );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( request.filterType() == QgsFeatureRequest::FilterFid )
|
if ( request.filterType() == QgsFeatureRequest::FilterFid )
|
||||||
|
@ -1773,6 +1773,47 @@ class TestQgsVectorLayer(unittest.TestCase):
|
|||||||
layer.setDefaultValueExpression(1, 'not a valid expression')
|
layer.setDefaultValueExpression(1, 'not a valid expression')
|
||||||
self.assertFalse(layer.defaultValue(1))
|
self.assertFalse(layer.defaultValue(1))
|
||||||
|
|
||||||
|
def testGetFeatureLimitWithEdits(self):
|
||||||
|
""" test getting features with a limit, when edits are present """
|
||||||
|
layer = createLayerWithOnePoint()
|
||||||
|
# now has one feature with id 0
|
||||||
|
|
||||||
|
pr = layer.dataProvider()
|
||||||
|
|
||||||
|
f1 = QgsFeature(1)
|
||||||
|
f1.setAttributes(["test", 3])
|
||||||
|
f1.setGeometry(QgsGeometry.fromPoint(QgsPoint(300, 200)))
|
||||||
|
f2 = QgsFeature(2)
|
||||||
|
f2.setAttributes(["test", 3])
|
||||||
|
f2.setGeometry(QgsGeometry.fromPoint(QgsPoint(100, 200)))
|
||||||
|
f3 = QgsFeature(3)
|
||||||
|
f3.setAttributes(["test", 3])
|
||||||
|
f3.setGeometry(QgsGeometry.fromPoint(QgsPoint(100, 200)))
|
||||||
|
self.assertTrue(pr.addFeatures([f1, f2, f3]))
|
||||||
|
|
||||||
|
req = QgsFeatureRequest().setLimit(2)
|
||||||
|
self.assertEqual(len(list(layer.getFeatures(req))), 2)
|
||||||
|
|
||||||
|
# now delete feature f1
|
||||||
|
layer.startEditing()
|
||||||
|
self.assertTrue(layer.deleteFeature(1))
|
||||||
|
req = QgsFeatureRequest().setLimit(2)
|
||||||
|
self.assertEqual(len(list(layer.getFeatures(req))), 2)
|
||||||
|
layer.rollBack()
|
||||||
|
|
||||||
|
# change an attribute value required by filter
|
||||||
|
layer.startEditing()
|
||||||
|
req = QgsFeatureRequest().setFilterExpression('fldint=3').setLimit(2)
|
||||||
|
self.assertTrue(layer.changeAttributeValue(2, 1, 4))
|
||||||
|
self.assertEqual(len(list(layer.getFeatures(req))), 2)
|
||||||
|
layer.rollBack()
|
||||||
|
|
||||||
|
layer.startEditing()
|
||||||
|
req = QgsFeatureRequest().setFilterRect(QgsRectangle(50, 100, 150, 300)).setLimit(2)
|
||||||
|
self.assertTrue(layer.changeGeometry(2, QgsGeometry.fromPoint(QgsPoint(500, 600))))
|
||||||
|
self.assertEqual(len(list(layer.getFeatures(req))), 2)
|
||||||
|
layer.rollBack()
|
||||||
|
|
||||||
|
|
||||||
# TODO:
|
# TODO:
|
||||||
# - fetch rect: feat with changed geometry: 1. in rect, 2. out of rect
|
# - fetch rect: feat with changed geometry: 1. in rect, 2. out of rect
|
||||||
|
Loading…
x
Reference in New Issue
Block a user