Skip to content

Commit 249c8dc

Browse files
nyalldawsonm-kuhn
authored andcommittedNov 16, 2016
Prioritise provider default literals over reused values when
creating a new feature
1 parent 631bd48 commit 249c8dc

File tree

2 files changed

+16
-23
lines changed

2 files changed

+16
-23
lines changed
 

‎src/core/qgsvectorlayerutils.cpp

Lines changed: 12 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,6 @@ bool QgsVectorLayerUtils::valueExists( const QgsVectorLayer* layer, int fieldInd
2727
if ( fieldIndex < 0 || fieldIndex >= fields.count() )
2828
return false;
2929

30-
// check - if value is a provider side defaultValueClause then we exclude it from the check
31-
if ( fields.fieldOrigin( fieldIndex ) == QgsFields::OriginProvider )
32-
{
33-
int providerIdx = fields.fieldOriginIndex( fieldIndex );
34-
QString providerDefaultClause = layer->dataProvider()->defaultValueClause( providerIdx );
35-
if ( !providerDefaultClause.isEmpty() && value.toString() == providerDefaultClause )
36-
{
37-
// exempt from check
38-
return false;
39-
}
40-
}
41-
4230
QString fieldName = fields.at( fieldIndex ).name();
4331

4432
// build up an optimised feature request
@@ -272,19 +260,24 @@ QgsFeature QgsVectorLayerUtils::createFeature( QgsVectorLayer* layer, const QgsG
272260
}
273261
}
274262

275-
// 3. passed attribute value
263+
// 3. provider side default literal
276264
// note - deliberately not using else if!
277-
if ( !v.isValid() && attributes.contains( idx ) )
265+
if ( !v.isValid() && fields.fieldOrigin( idx ) == QgsFields::OriginProvider )
278266
{
279-
v = attributes.value( idx );
267+
int providerIndex = fields.fieldOriginIndex( idx );
268+
v = layer->dataProvider()->defaultValue( providerIndex );
269+
if ( v.isValid() )
270+
{
271+
//trust that the provider default has been sensibly set not to violate any constraints
272+
checkUnique = false;
273+
}
280274
}
281275

282-
// 4. provider side default literal
276+
// 4. passed attribute value
283277
// note - deliberately not using else if!
284-
if ( !v.isValid() && fields.fieldOrigin( idx ) == QgsFields::OriginProvider )
278+
if ( !v.isValid() && attributes.contains( idx ) )
285279
{
286-
int providerIndex = fields.fieldOriginIndex( idx );
287-
v = layer->dataProvider()->defaultValue( providerIndex );
280+
v = attributes.value( idx );
288281
}
289282

290283
// last of all... check that unique constraints are respected

‎tests/src/python/test_provider_spatialite.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -474,14 +474,14 @@ def testVectorLayerUtilsCreateFeatureWithProviderDefaultLiteral(self):
474474
f = QgsVectorLayerUtils.createFeature(vl)
475475
self.assertEqual(f.attributes(), [None, "qgis 'is good", 5, 5.7, None])
476476

477-
# check that provider passed attribute values take precedence over default literals
477+
# check that provider default literals take precedence over passed attribute values
478478
f = QgsVectorLayerUtils.createFeature(vl, attributes={1: 'qgis is great', 0: 3})
479-
self.assertEqual(f.attributes(), [3, "qgis is great", 5, 5.7, None])
479+
self.assertEqual(f.attributes(), [3, "qgis 'is good", 5, 5.7, None])
480480

481-
# test take vector layer default value expression overrides postgres provider default clause
481+
# test that vector layer default value expression overrides provider default literal
482482
vl.setDefaultValueExpression(3, "4*3")
483483
f = QgsVectorLayerUtils.createFeature(vl, attributes={1: 'qgis is great', 0: 3})
484-
self.assertEqual(f.attributes(), [3, "qgis is great", 5, 12, None])
484+
self.assertEqual(f.attributes(), [3, "qgis 'is good", 5, 12, None])
485485

486486
if __name__ == '__main__':
487487
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.