Split QgsProcessingAlgorithm::create into non virtual-create

and pure virtual createInstance

Allows us to add logic which always need applying within
create(), leaving createInstance() free to just return a
raw new instance of the class
This commit is contained in:
Nyall Dawson 2017-07-10 10:07:32 +10:00
parent 7753ba11f7
commit 03275bbace
13 changed files with 61 additions and 32 deletions

View File

@ -46,7 +46,7 @@ class QgsProcessingModelAlgorithm : QgsProcessingAlgorithm
virtual QString asPythonCommand( const QVariantMap &parameters, QgsProcessingContext &context ) const;
virtual QgsProcessingModelAlgorithm *create() const /Factory/;
virtual QgsProcessingModelAlgorithm *createInstance() const /Factory/;
void setName( const QString &name );

View File

@ -43,8 +43,7 @@ class QgsProcessingAlgorithm
virtual ~QgsProcessingAlgorithm();
virtual QgsProcessingAlgorithm *create() const = 0 /Factory/;
QgsProcessingAlgorithm *create() const /Factory/;
%Docstring
Creates a copy of the algorithm, ready for execution.
:rtype: QgsProcessingAlgorithm
@ -332,6 +331,14 @@ class QgsProcessingAlgorithm
protected:
virtual QgsProcessingAlgorithm *createInstance() const = 0 /Factory/;
%Docstring
Creates a new instance of the algorithm class.
This method should return a 'pristine' instance of the algorithm class.
:rtype: QgsProcessingAlgorithm
%End
bool addParameter( QgsProcessingParameterDefinition *parameterDefinition /Transfer/ );
%Docstring
Adds a parameter ``definition`` to the algorithm. Ownership of the definition is transferred to the algorithm.

View File

@ -48,5 +48,5 @@ class QgisAlgorithm(QgsProcessingAlgorithm):
context = self.__class__.__name__
return string, QCoreApplication.translate(context, string)
def create(self):
def createInstance(self):
return type(self)()

View File

@ -79,7 +79,7 @@ class ScriptAlgorithm(QgsProcessingAlgorithm):
self.cleaned_script = None
self.results = {}
def create(self):
def createInstance(self):
return ScriptAlgorithm(self.descriptionFile)
def icon(self):

View File

@ -48,7 +48,7 @@ class TestAlg(QgsProcessingAlgorithm):
def displayName(self):
return 'testalg'
def create(self):
def createInstance(self):
return TestAlg()
def processAlgorithm(self, parameters, context, feedback):

View File

@ -1100,7 +1100,7 @@ QString QgsProcessingModelAlgorithm::asPythonCommand( const QVariantMap &paramet
return QgsProcessingAlgorithm::asPythonCommand( parameters, context );
}
QgsProcessingModelAlgorithm *QgsProcessingModelAlgorithm::create() const
QgsProcessingAlgorithm *QgsProcessingModelAlgorithm::createInstance() const
{
QgsProcessingModelAlgorithm *alg = new QgsProcessingModelAlgorithm();
alg->loadVariant( toVariant() );

View File

@ -52,7 +52,7 @@ class CORE_EXPORT QgsProcessingModelAlgorithm : public QgsProcessingAlgorithm
bool canExecute( QString *errorMessage SIP_OUT = nullptr ) const override;
QString asPythonCommand( const QVariantMap &parameters, QgsProcessingContext &context ) const override;
QgsProcessingModelAlgorithm *create() const override SIP_FACTORY;
QgsProcessingAlgorithm *createInstance() const override SIP_FACTORY;
/**
* Sets the model \a name.

View File

@ -208,10 +208,6 @@ void QgsProcessingModelChildAlgorithm::setAlgorithmId( const QString &algorithmI
{
mAlgorithmId = algorithmId;
mAlgorithm.reset( QgsApplication::processingRegistry()->createAlgorithmById( mAlgorithmId ) );
if ( mAlgorithm )
{
mAlgorithm->init( QVariantMap() );
}
}
///@endcond

View File

@ -84,7 +84,7 @@ QString QgsCentroidAlgorithm::shortHelpString() const
"The attributes associated to each point in the output layer are the same ones associated to the original features." );
}
QgsCentroidAlgorithm *QgsCentroidAlgorithm::create() const
QgsCentroidAlgorithm *QgsCentroidAlgorithm::createInstance() const
{
return new QgsCentroidAlgorithm();
}
@ -164,7 +164,7 @@ QString QgsBufferAlgorithm::shortHelpString() const
"The mitre limit parameter is only applicable for mitre join styles, and controls the maximum distance from the offset curve to use when creating a mitred join." );
}
QgsBufferAlgorithm *QgsBufferAlgorithm::create() const
QgsBufferAlgorithm *QgsBufferAlgorithm::createInstance() const
{
return new QgsBufferAlgorithm();
}
@ -273,7 +273,7 @@ QString QgsDissolveAlgorithm::shortHelpString() const
"In case the input is a polygon layer, common boundaries of adjacent polygons being dissolved will get erased." );
}
QgsDissolveAlgorithm *QgsDissolveAlgorithm::create() const
QgsDissolveAlgorithm *QgsDissolveAlgorithm::createInstance() const
{
return new QgsDissolveAlgorithm();
}
@ -430,7 +430,7 @@ QString QgsClipAlgorithm::shortHelpString() const
"be manually updated." );
}
QgsClipAlgorithm *QgsClipAlgorithm::create() const
QgsClipAlgorithm *QgsClipAlgorithm::createInstance() const
{
return new QgsClipAlgorithm();
}
@ -583,7 +583,7 @@ QString QgsTransformAlgorithm::shortHelpString() const
"Attributes are not modified by this algorithm." );
}
QgsTransformAlgorithm *QgsTransformAlgorithm::create() const
QgsTransformAlgorithm *QgsTransformAlgorithm::createInstance() const
{
return new QgsTransformAlgorithm();
}
@ -652,7 +652,7 @@ QString QgsSubdivideAlgorithm::shortHelpString() const
"Curved geometries will be segmentized before subdivision." );
}
QgsSubdivideAlgorithm *QgsSubdivideAlgorithm::create() const
QgsSubdivideAlgorithm *QgsSubdivideAlgorithm::createInstance() const
{
return new QgsSubdivideAlgorithm();
}
@ -723,7 +723,7 @@ QString QgsMultipartToSinglepartAlgorithm::shortHelpString() const
"contain, and the same attributes are used for each of them." );
}
QgsMultipartToSinglepartAlgorithm *QgsMultipartToSinglepartAlgorithm::create() const
QgsMultipartToSinglepartAlgorithm *QgsMultipartToSinglepartAlgorithm::createInstance() const
{
return new QgsMultipartToSinglepartAlgorithm();
}
@ -810,7 +810,7 @@ QString QgsExtractByExpressionAlgorithm::shortHelpString() const
"For more information about expressions see the <a href =\"{qgisdocs}/user_manual/working_with_vector/expression.html\">user manual</a>" );
}
QgsExtractByExpressionAlgorithm *QgsExtractByExpressionAlgorithm::create() const
QgsExtractByExpressionAlgorithm *QgsExtractByExpressionAlgorithm::createInstance() const
{
return new QgsExtractByExpressionAlgorithm();
}
@ -941,7 +941,7 @@ QString QgsExtractByAttributeAlgorithm::shortHelpString() const
"of an attribute from the input layer." );
}
QgsExtractByAttributeAlgorithm *QgsExtractByAttributeAlgorithm::create() const
QgsExtractByAttributeAlgorithm *QgsExtractByAttributeAlgorithm::createInstance() const
{
return new QgsExtractByAttributeAlgorithm();
}

View File

@ -60,7 +60,7 @@ class QgsCentroidAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "centroid,center,average,point,middle" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector geometry tools" ); }
QString shortHelpString() const override;
QgsCentroidAlgorithm *create() const override SIP_FACTORY;
QgsCentroidAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -84,7 +84,7 @@ class QgsTransformAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "transform,reproject,crs,srs,warp" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector general tools" ); }
QString shortHelpString() const override;
QgsTransformAlgorithm *create() const override SIP_FACTORY;
QgsTransformAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -108,7 +108,7 @@ class QgsBufferAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "buffer,grow" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector geometry tools" ); }
QString shortHelpString() const override;
QgsBufferAlgorithm *create() const override SIP_FACTORY;
QgsBufferAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -132,7 +132,7 @@ class QgsDissolveAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "dissolve,union,combine,collect" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector geometry tools" ); }
QString shortHelpString() const override;
QgsDissolveAlgorithm *create() const override SIP_FACTORY;
QgsDissolveAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -171,7 +171,7 @@ class QgsExtractByAttributeAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "extract,filter,attribute,value,contains,null,field" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector selection tools" ); }
QString shortHelpString() const override;
QgsExtractByAttributeAlgorithm *create() const override SIP_FACTORY;
QgsExtractByAttributeAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -195,7 +195,7 @@ class QgsExtractByExpressionAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "extract,filter,expression,field" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector selection tools" ); }
QString shortHelpString() const override;
QgsExtractByExpressionAlgorithm *create() const override SIP_FACTORY;
QgsExtractByExpressionAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -219,7 +219,7 @@ class QgsClipAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "clip,intersect,intersection,mask" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector overlay tools" ); }
QString shortHelpString() const override;
QgsClipAlgorithm *create() const override SIP_FACTORY;
QgsClipAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -244,7 +244,7 @@ class QgsSubdivideAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "subdivide,segmentize,split,tesselate" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector geometry tools" ); }
QString shortHelpString() const override;
QgsSubdivideAlgorithm *create() const override SIP_FACTORY;
QgsSubdivideAlgorithm *createInstance() const override SIP_FACTORY;
protected:
@ -268,7 +268,7 @@ class QgsMultipartToSinglepartAlgorithm : public QgsProcessingAlgorithm
virtual QStringList tags() const override { return QObject::tr( "multi,single,multiple,split,dump" ).split( ',' ); }
QString group() const override { return QObject::tr( "Vector geometry tools" ); }
QString shortHelpString() const override;
QgsMultipartToSinglepartAlgorithm *create() const override SIP_FACTORY;
QgsMultipartToSinglepartAlgorithm *createInstance() const override SIP_FACTORY;
protected:

View File

@ -33,6 +33,13 @@ QgsProcessingAlgorithm::~QgsProcessingAlgorithm()
qDeleteAll( mOutputs );
}
QgsProcessingAlgorithm *QgsProcessingAlgorithm::create() const
{
std::unique_ptr< QgsProcessingAlgorithm > creation( createInstance() );
creation->setProvider( provider() );
return creation.release();
}
QString QgsProcessingAlgorithm::id() const
{
if ( mProvider )

View File

@ -70,7 +70,7 @@ class CORE_EXPORT QgsProcessingAlgorithm
/**
* Creates a copy of the algorithm, ready for execution.
*/
virtual QgsProcessingAlgorithm *create() const = 0 SIP_FACTORY;
QgsProcessingAlgorithm *create() const SIP_FACTORY;
/**
* Returns the algorithm name, used for identifying the algorithm. This string
@ -317,6 +317,13 @@ class CORE_EXPORT QgsProcessingAlgorithm
protected:
/**
* Creates a new instance of the algorithm class.
*
* This method should return a 'pristine' instance of the algorithm class.
*/
virtual QgsProcessingAlgorithm *createInstance() const = 0 SIP_FACTORY;
/**
* Adds a parameter \a definition to the algorithm. Ownership of the definition is transferred to the algorithm.
* Returns true if parameter could be successfully added, or false if the parameter could not be added (e.g.

View File

@ -45,7 +45,7 @@ class DummyAlgorithm : public QgsProcessingAlgorithm
QVariantMap processAlgorithm( const QVariantMap &, QgsProcessingContext &, QgsProcessingFeedback * ) override { return QVariantMap(); }
virtual Flags flags() const override { return mFlags; }
DummyAlgorithm *create() const override { return new DummyAlgorithm( name() ); }
DummyAlgorithm *createInstance() const override { return new DummyAlgorithm( name() ); }
QString mName;
@ -334,6 +334,7 @@ class TestQgsProcessing: public QObject
void modelAcceptableValues();
void tempUtils();
void convertCompatible();
void create();
private:
@ -5126,5 +5127,16 @@ void TestQgsProcessing::convertCompatible()
QVERIFY( out.startsWith( QgsProcessingUtils::tempFolder() ) );
}
void TestQgsProcessing::create()
{
DummyAlgorithm alg( QStringLiteral( "test" ) );
DummyProvider p( QStringLiteral( "test_provider" ) );
alg.setProvider( &p );
std::unique_ptr< QgsProcessingAlgorithm > newInstance( alg.create() );
QVERIFY( newInstance.get() );
QCOMPARE( newInstance->provider(), &p );
}
QGSTEST_MAIN( TestQgsProcessing )
#include "testqgsprocessing.moc"