|
@@ -877,7 +877,7 @@ QgsRectangle QgsVectorLayer::extent() const |
|
|
} |
|
|
|
|
|
if ( !mEditBuffer || |
|
|
( mEditBuffer->mDeletedFeatureIds.isEmpty() && mEditBuffer->mChangedGeometries.isEmpty() ) || |
|
|
( !mDataProvider->transaction() && ( mEditBuffer->deletedFeatureIds().isEmpty() && mEditBuffer->changedGeometries().isEmpty() ) ) || |
|
|
QgsDataSourceUri( mDataProvider->dataSourceUri() ).useEstimatedMetadata() ) |
|
|
{ |
|
|
mDataProvider->updateExtents(); |
|
@@ -890,9 +890,10 @@ QgsRectangle QgsVectorLayer::extent() const |
|
|
rect.combineExtentWith( r ); |
|
|
} |
|
|
|
|
|
if ( mEditBuffer ) |
|
|
if ( mEditBuffer && !mDataProvider->transaction() ) |
|
|
{ |
|
|
for ( QgsFeatureMap::const_iterator it = mEditBuffer->mAddedFeatures.constBegin(); it != mEditBuffer->mAddedFeatures.constEnd(); ++it ) |
|
|
const auto addedFeatures = mEditBuffer->addedFeatures(); |
|
|
for ( QgsFeatureMap::const_iterator it = addedFeatures.constBegin(); it != addedFeatures.constEnd(); ++it ) |
|
|
{ |
|
|
if ( it->hasGeometry() ) |
|
|
{ |
|
@@ -3366,13 +3367,13 @@ long QgsVectorLayer::featureCount() const |
|
|
if ( ! mDataProvider ) |
|
|
return -1; |
|
|
return mDataProvider->featureCount() + |
|
|
( mEditBuffer ? mEditBuffer->mAddedFeatures.size() - mEditBuffer->mDeletedFeatureIds.size() : 0 ); |
|
|
( mEditBuffer && ! mDataProvider->transaction() ? mEditBuffer->addedFeatures().size() - mEditBuffer->deletedFeatureIds().size() : 0 ); |
|
|
} |
|
|
|
|
|
QgsFeatureSource::FeatureAvailability QgsVectorLayer::hasFeatures() const |
|
|
{ |
|
|
const QgsFeatureIds deletedFeatures( mEditBuffer ? mEditBuffer->deletedFeatureIds() : QgsFeatureIds() ); |
|
|
const QgsFeatureMap addedFeatures( mEditBuffer ? mEditBuffer->addedFeatures() : QgsFeatureMap() ); |
|
|
const QgsFeatureIds deletedFeatures( mEditBuffer && ! mDataProvider->transaction() ? mEditBuffer->deletedFeatureIds() : QgsFeatureIds() ); |
|
|
const QgsFeatureMap addedFeatures( mEditBuffer && ! mDataProvider->transaction() ? mEditBuffer->addedFeatures() : QgsFeatureMap() ); |
|
|
|
|
|
if ( mEditBuffer && !deletedFeatures.empty() ) |
|
|
{ |
|
@@ -3456,9 +3457,9 @@ bool QgsVectorLayer::rollBack( bool deleteBuffer ) |
|
|
return false; |
|
|
} |
|
|
|
|
|
bool rollbackExtent = !mEditBuffer->mDeletedFeatureIds.isEmpty() || |
|
|
!mEditBuffer->mAddedFeatures.isEmpty() || |
|
|
!mEditBuffer->mChangedGeometries.isEmpty(); |
|
|
bool rollbackExtent = !mDataProvider->transaction() && ( !mEditBuffer->deletedFeatureIds().isEmpty() || |
|
|
!mEditBuffer->addedFeatures().isEmpty() || |
|
|
!mEditBuffer->changedGeometries().isEmpty() ); |
|
|
|
|
|
emit beforeRollBack(); |
|
|
|
|
@@ -4043,7 +4044,7 @@ QSet<QVariant> QgsVectorLayer::uniqueValues( int index, int limit ) const |
|
|
{ |
|
|
uniqueValues = mDataProvider->uniqueValues( index, limit ); |
|
|
|
|
|
if ( mEditBuffer ) |
|
|
if ( mEditBuffer && ! mDataProvider->transaction() ) |
|
|
{ |
|
|
QSet<QString> vals; |
|
|
const auto constUniqueValues = uniqueValues; |
|
@@ -4091,10 +4092,11 @@ QSet<QVariant> QgsVectorLayer::uniqueValues( int index, int limit ) const |
|
|
|
|
|
case QgsFields::OriginEdit: |
|
|
// the layer is editable, but in certain cases it can still be avoided going through all features |
|
|
if ( mEditBuffer->mDeletedFeatureIds.isEmpty() && |
|
|
mEditBuffer->mAddedFeatures.isEmpty() && |
|
|
!mEditBuffer->mDeletedAttributeIds.contains( index ) && |
|
|
mEditBuffer->mChangedAttributeValues.isEmpty() ) |
|
|
if ( mDataProvider->transaction() || ( |
|
|
mEditBuffer->deletedFeatureIds().isEmpty() && |
|
|
mEditBuffer->addedFeatures().isEmpty() && |
|
|
!mEditBuffer->deletedAttributeIds().contains( index ) && |
|
|
mEditBuffer->changedAttributeValues().isEmpty() ) ) |
|
|
{ |
|
|
uniqueValues = mDataProvider->uniqueValues( index, limit ); |
|
|
return uniqueValues; |
|
@@ -4150,7 +4152,7 @@ QStringList QgsVectorLayer::uniqueStringsMatching( int index, const QString &sub |
|
|
{ |
|
|
results = mDataProvider->uniqueStringsMatching( index, substring, limit, feedback ); |
|
|
|
|
|
if ( mEditBuffer ) |
|
|
if ( mEditBuffer && ! mDataProvider->transaction() ) |
|
|
{ |
|
|
QgsFeatureMap added = mEditBuffer->addedFeatures(); |
|
|
QMapIterator< QgsFeatureId, QgsFeature > addedIt( added ); |
|
@@ -4189,10 +4191,10 @@ QStringList QgsVectorLayer::uniqueStringsMatching( int index, const QString &sub |
|
|
|
|
|
case QgsFields::OriginEdit: |
|
|
// the layer is editable, but in certain cases it can still be avoided going through all features |
|
|
if ( mEditBuffer->mDeletedFeatureIds.isEmpty() && |
|
|
mEditBuffer->mAddedFeatures.isEmpty() && |
|
|
!mEditBuffer->mDeletedAttributeIds.contains( index ) && |
|
|
mEditBuffer->mChangedAttributeValues.isEmpty() ) |
|
|
if ( mDataProvider->transaction() || ( mEditBuffer->deletedFeatureIds().isEmpty() && |
|
|
mEditBuffer->addedFeatures().isEmpty() && |
|
|
!mEditBuffer->deletedAttributeIds().contains( index ) && |
|
|
mEditBuffer->changedAttributeValues().isEmpty() ) ) |
|
|
{ |
|
|
return mDataProvider->uniqueStringsMatching( index, substring, limit, feedback ); |
|
|
} |
|
@@ -4260,7 +4262,7 @@ QVariant QgsVectorLayer::minimumOrMaximumValue( int index, bool minimum ) const |
|
|
case QgsFields::OriginProvider: //a provider field |
|
|
{ |
|
|
QVariant val = minimum ? mDataProvider->minimumValue( index ) : mDataProvider->maximumValue( index ); |
|
|
if ( mEditBuffer ) |
|
|
if ( mEditBuffer && ! mDataProvider->transaction() ) |
|
|
{ |
|
|
QgsFeatureMap added = mEditBuffer->addedFeatures(); |
|
|
QMapIterator< QgsFeatureId, QgsFeature > addedIt( added ); |
|
@@ -4293,10 +4295,10 @@ QVariant QgsVectorLayer::minimumOrMaximumValue( int index, bool minimum ) const |
|
|
case QgsFields::OriginEdit: |
|
|
{ |
|
|
// the layer is editable, but in certain cases it can still be avoided going through all features |
|
|
if ( mEditBuffer->mDeletedFeatureIds.isEmpty() && |
|
|
mEditBuffer->mAddedFeatures.isEmpty() && |
|
|
!mEditBuffer->mDeletedAttributeIds.contains( index ) && |
|
|
mEditBuffer->mChangedAttributeValues.isEmpty() ) |
|
|
if ( mDataProvider->transaction() || ( mEditBuffer->deletedFeatureIds().isEmpty() && |
|
|
mEditBuffer->addedFeatures().isEmpty() && |
|
|
!mEditBuffer->deletedAttributeIds().contains( index ) && |
|
|
mEditBuffer->changedAttributeValues().isEmpty() ) ) |
|
|
{ |
|
|
return minimum ? mDataProvider->minimumValue( index ) : mDataProvider->maximumValue( index ); |
|
|
} |
|
|