Skip to content

Commit f2e745e

Browse files
committed
Cache unique values in createFeature (~10x faster)
1 parent 377040a commit f2e745e

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

src/core/qgsvectorlayerutils.cpp

+10-4
Original file line numberDiff line numberDiff line change
@@ -393,9 +393,13 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
393393
v = attributes.value( idx );
394394
}
395395

396+
// Cache unique values
397+
QSet<QVariant> uniqueValues { layer->uniqueValues( idx ) };
398+
396399
// 2. client side default expression
397400
// note - deliberately not using else if!
398-
if ( ( !v.isValid() || ( fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists( layer, idx, v ) ) )
401+
if ( ( !v.isValid() || ( fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique
402+
&& uniqueValues.contains( v ) ) )
399403
&& layer->defaultValueDefinition( idx ).isValid() )
400404
{
401405
// client side default expression set - takes precedence over all. Why? Well, this is the only default
@@ -406,7 +410,8 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
406410

407411
// 3. provider side default value clause
408412
// note - not an else if deliberately. Users may return null from a default value expression to fallback to provider defaults
409-
if ( ( !v.isValid() || ( fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists( layer, idx, v ) ) )
413+
if ( ( !v.isValid() || ( fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique
414+
&& uniqueValues.contains( v ) ) )
410415
&& fields.fieldOrigin( idx ) == QgsFields::OriginProvider )
411416
{
412417
int providerIndex = fields.fieldOriginIndex( idx );
@@ -420,7 +425,8 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
420425

421426
// 4. provider side default literal
422427
// note - deliberately not using else if!
423-
if ( ( !v.isValid() || ( checkUnique && fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique && QgsVectorLayerUtils::valueExists( layer, idx, v ) ) )
428+
if ( ( !v.isValid() || ( checkUnique && fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique
429+
&& uniqueValues.contains( v ) ) )
424430
&& fields.fieldOrigin( idx ) == QgsFields::OriginProvider )
425431
{
426432
int providerIndex = fields.fieldOriginIndex( idx );
@@ -444,7 +450,7 @@ QgsFeature QgsVectorLayerUtils::createFeature( const QgsVectorLayer *layer, cons
444450
// value if the constraint is violated
445451
if ( checkUnique && fields.at( idx ).constraints().constraints() & QgsFieldConstraints::ConstraintUnique )
446452
{
447-
if ( QgsVectorLayerUtils::valueExists( layer, idx, v ) )
453+
if ( uniqueValues.contains( v ) )
448454
{
449455
// unique constraint violated
450456
QVariant uniqueValue = QgsVectorLayerUtils::createUniqueValue( layer, idx, v );

0 commit comments

Comments
 (0)