@@ -947,7 +947,10 @@ bool QgsVectorLayer::addFeature( QgsFeature &feature, Flags )
947947 bool success = mEditBuffer ->addFeature ( feature );
948948
949949 if ( success )
950+ {
950951 updateExtents ();
952+ success = addFeaturesToJoinedLayers ( QgsFeatureList () << feature );
953+ }
951954
952955 return success;
953956}
@@ -2633,9 +2636,66 @@ bool QgsVectorLayer::addFeatures( QgsFeatureList &features, Flags )
26332636 bool res = mEditBuffer ->addFeatures ( features );
26342637 updateExtents ();
26352638
2639+ if ( res )
2640+ res = addFeaturesToJoinedLayers ( features );
2641+
26362642 return res;
26372643}
26382644
2645+ bool QgsVectorLayer::addFeaturesToJoinedLayers ( QgsFeatureList &features, Flags )
2646+ {
2647+ // try to add/update a feature in each joined layer
2648+ Q_FOREACH ( const QgsVectorLayerJoinInfo &info, vectorJoins () )
2649+ {
2650+ QgsVectorLayer *joinLayer = info.joinLayer ();
2651+
2652+ if ( joinLayer && joinLayer->isEditable () && info.isEditable () && info.isUpsertOnEdit () )
2653+ {
2654+ QgsFeatureList joinFeatures;
2655+
2656+ Q_FOREACH ( const QgsFeature &feature, features )
2657+ {
2658+ const QgsFeature joinFeature = info.extractJoinedFeature ( feature );
2659+
2660+ // we don't want to add a new feature in joined layer when the id
2661+ // column value yet exist, we just want to update the existing one
2662+ const QVariant idFieldValue = feature.attribute ( info.targetFieldName () );
2663+ const QString filter = QgsExpression::createFieldEqualityExpression ( info.joinFieldName (), idFieldValue.toString () );
2664+
2665+ QgsFeatureRequest request;
2666+ request.setFilterExpression ( filter );
2667+ request.setLimit ( 1 );
2668+
2669+ QgsFeatureIterator it = info.joinLayer ()->getFeatures ( request );
2670+ QgsFeature existingFeature;
2671+ it.nextFeature ( existingFeature );
2672+
2673+ if ( existingFeature.isValid () )
2674+ {
2675+ const QStringList *subsetFields = info.joinFieldNamesSubset ();
2676+ if ( subsetFields )
2677+ {
2678+ Q_FOREACH ( const QString &field, *subsetFields )
2679+ existingFeature.setAttribute ( field, joinFeature.attribute ( field ) );
2680+ }
2681+ else
2682+ {
2683+ Q_FOREACH ( const QgsField &field, joinFeature.fields () )
2684+ existingFeature.setAttribute ( field.name (), joinFeature.attribute ( field.name () ) );
2685+ }
2686+
2687+ joinLayer->updateFeature ( existingFeature );
2688+ }
2689+ else
2690+ joinFeatures << joinFeature;
2691+ }
2692+
2693+ joinLayer->addFeatures ( joinFeatures );
2694+ }
2695+ }
2696+
2697+ return true ;
2698+ }
26392699
26402700void QgsVectorLayer::setCoordinateSystem ()
26412701{
0 commit comments