Skip to content

Commit 8695893

Browse files
committed
Tweak processing API to better handle dynamic properties
1 parent 58ab507 commit 8695893

File tree

3 files changed

+14
-3
lines changed

3 files changed

+14
-3
lines changed

python/core/processing/qgsprocessingalgorithm.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -872,7 +872,7 @@ class QgsProcessingFeatureBasedAlgorithm : QgsProcessingAlgorithm
872872
:rtype: QgsCoordinateReferenceSystem
873873
%End
874874

875-
virtual QgsFeature processFeature( const QgsFeature &feature, QgsProcessingFeedback *feedback ) = 0;
875+
virtual QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
876876
%Docstring
877877
Processes an individual input ``feature`` from the source. Algorithms should implement their
878878
logic in this method for performing the algorithm's operation (e.g. replacing the feature's

src/core/processing/qgsprocessingalgorithm.cpp

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,6 +699,13 @@ QVariantMap QgsProcessingFeatureBasedAlgorithm::processAlgorithm( const QVariant
699699
if ( !sink )
700700
return QVariantMap();
701701

702+
// prepare expression context for feature iteration
703+
QgsExpressionContext prevContext = context.expressionContext();
704+
QgsExpressionContext algContext = prevContext;
705+
706+
algContext.appendScopes( createExpressionContext( parameters, context, dynamic_cast< QgsProcessingFeatureSource * >( mSource.get() ) ).takeScopes() );
707+
context.setExpressionContext( algContext );
708+
702709
long count = mSource->featureCount();
703710

704711
QgsFeature f;
@@ -713,7 +720,8 @@ QVariantMap QgsProcessingFeatureBasedAlgorithm::processAlgorithm( const QVariant
713720
break;
714721
}
715722

716-
QgsFeature transformed = processFeature( f, feedback );
723+
context.expressionContext().setFeature( f );
724+
QgsFeature transformed = processFeature( f, context, feedback );
717725
if ( transformed.isValid() )
718726
sink->addFeature( transformed, QgsFeatureSink::FastInsert );
719727

@@ -723,6 +731,9 @@ QVariantMap QgsProcessingFeatureBasedAlgorithm::processAlgorithm( const QVariant
723731

724732
mSource.reset();
725733

734+
// probably not necessary - context's aren't usually recycled, but can't hurt
735+
context.setExpressionContext( prevContext );
736+
726737
QVariantMap outputs;
727738
outputs.insert( QStringLiteral( "OUTPUT" ), dest );
728739
return outputs;

src/core/processing/qgsprocessingalgorithm.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,7 @@ class CORE_EXPORT QgsProcessingFeatureBasedAlgorithm : public QgsProcessingAlgor
874874
* can break valid model execution - so use with extreme caution, and consider using
875875
* \a feedback to instead report non-fatal processing failures for features instead.
876876
*/
877-
virtual QgsFeature processFeature( const QgsFeature &feature, QgsProcessingFeedback *feedback ) = 0;
877+
virtual QgsFeature processFeature( const QgsFeature &feature, QgsProcessingContext &context, QgsProcessingFeedback *feedback ) = 0;
878878

879879
virtual QVariantMap processAlgorithm( const QVariantMap &parameters,
880880
QgsProcessingContext &context, QgsProcessingFeedback *feedback ) override;

0 commit comments

Comments
 (0)