Skip to content

Commit

Permalink
Handle multi pks
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso authored and github-actions[bot] committed Jan 6, 2023
1 parent 1975680 commit eb17855
Showing 1 changed file with 23 additions and 3 deletions.
26 changes: 23 additions & 3 deletions src/app/qgisapp.cpp
Expand Up @@ -10422,16 +10422,36 @@ void QgisApp::mergeSelectedFeatures()

if ( isPrimaryKey && !isDefaultValue )
{
const QgsField pkField { vl->fields().field( i ) };
QgsFeatureRequest request;
request.setFlags( QgsFeatureRequest::Flag::NoGeometry );
request.setSubsetOfAttributes( QStringList() << pkField.name(), vl->fields( ) );
request.setFilterExpression( QgsExpression::createFieldEqualityExpression( pkField.name(), val, pkField.type( ) ) );
// Handle multi pks
if ( vl->dataProvider()->pkAttributeIndexes().count() > 1 && vl->dataProvider()->pkAttributeIndexes().count() <= attrs.count() )
{
const auto pkIdxList { vl->dataProvider()->pkAttributeIndexes() };
QStringList conditions;
QStringList fieldNames;
for ( const int &pkIdx : std::as_const( pkIdxList ) )
{
const QgsField pkField { vl->fields().field( pkIdx ) };
conditions.push_back( QgsExpression::createFieldEqualityExpression( pkField.name(), attrs.at( pkIdx ), pkField.type( ) ) );
fieldNames.push_back( pkField.name() );
}
request.setSubsetOfAttributes( fieldNames, vl->fields( ) );
request.setFilterExpression( conditions.join( QStringLiteral( " AND " ) ) );
}
else // single pk
{
const QgsField pkField { vl->fields().field( i ) };
request.setSubsetOfAttributes( QStringList() << pkField.name(), vl->fields( ) );
request.setFilterExpression( QgsExpression::createFieldEqualityExpression( pkField.name(), val, pkField.type( ) ) );
}

QgsFeature f;
QgsFeatureIterator featureIterator = vl->getFeatures( request );
if ( featureIterator.nextFeature( f ) )
{
mergeFeatureId = f.id( );
break;
}
}

Expand Down

0 comments on commit eb17855

Please sign in to comment.