23 QString QgsRefactorFieldsAlgorithm::name()
const
25 return QStringLiteral(
"refactorfields" );
28 QString QgsRefactorFieldsAlgorithm::displayName()
const
30 return QObject::tr(
"Refactor fields" );
33 QString QgsRefactorFieldsAlgorithm::shortHelpString()
const
35 return QObject::tr(
"This algorithm allows editing the structure of the attributes table of a vector layer. Fields can be modified "
36 "in their type and name, using a fields mapping.\n\n"
37 "The original layer is not modified. A new layer is generated, which contains a modified attribute table, according "
38 "to the provided fields mapping.\n\n"
39 "Rows in orange have constraints in the template layer from which these fields were loaded. Treat this information "
40 "as a hint during configuration. No constraints will be added on an output layer nor will they be checked or "
41 "enforced by the algorithm." );
44 QStringList QgsRefactorFieldsAlgorithm::tags()
const
46 return QObject::tr(
"attributes,table" ).split(
',' );
49 QString QgsRefactorFieldsAlgorithm::group()
const
51 return QObject::tr(
"Vector table" );
54 QString QgsRefactorFieldsAlgorithm::groupId()
const
56 return QStringLiteral(
"vectortable" );
59 QString QgsRefactorFieldsAlgorithm::outputName()
const
61 return QObject::tr(
"Refactored" );
64 QList<int> QgsRefactorFieldsAlgorithm::inputLayerTypes()
const
74 QgsRefactorFieldsAlgorithm *QgsRefactorFieldsAlgorithm::createInstance()
const
76 return new QgsRefactorFieldsAlgorithm();
79 void QgsRefactorFieldsAlgorithm::initParameters(
const QVariantMap & )
81 std::unique_ptr< QgsProcessingParameterFieldMapping > param = qgis::make_unique< QgsProcessingParameterFieldMapping> ( QStringLiteral(
"FIELDS_MAPPING" ), QObject::tr(
"Fields mapping" ), QStringLiteral(
"INPUT" ) );
82 addParameter( param.release() );
92 std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral(
"INPUT" ), context ) );
99 mExpressionContext = createExpressionContext( parameters, context, source.get() );
101 const QVariantList mapping = parameters.value( QStringLiteral(
"FIELDS_MAPPING" ) ).toList();
102 for (
const QVariant &map : mapping )
104 const QVariantMap fieldDef = map.toMap();
105 const QString name = fieldDef.value( QStringLiteral(
"name" ) ).toString();
106 if ( name.isEmpty() )
109 const QVariant::Type type =
static_cast< QVariant::Type
>( fieldDef.value( QStringLiteral(
"type" ) ).toInt() );
111 const int length = fieldDef.value( QStringLiteral(
"length" ), 0 ).toInt();
112 const int precision = fieldDef.value( QStringLiteral(
"precision" ), 0 ).toInt();
116 const QString expressionString = fieldDef.value( QStringLiteral(
"expression" ) ).toString();
117 if ( !expressionString.isEmpty() )
120 expression.setGeomCalculator( &mDa );
122 expression.setAreaUnits( context.
areaUnit() );
123 if ( expression.hasParserError() )
129 expression.parserErrorString() ) );
131 mExpressions.append( expression );
144 if ( !mExpressionsPrepared )
146 for (
auto it = mExpressions.begin(); it != mExpressions.end(); ++it )
149 it->prepare( &mExpressionContext );
154 attributes.reserve( mExpressions.size() );
155 for (
auto it = mExpressions.begin(); it != mExpressions.end(); ++it )
159 mExpressionContext.setFeature( feature );
160 mExpressionContext.lastScope()->setVariable( QStringLiteral(
"row_number" ), mRowNumber );
161 const QVariant value = it->evaluate( &mExpressionContext );
162 if ( it->hasEvalError() )
164 throw QgsProcessingException( QObject::tr(
"Evaluation error in expression \"%1\": %2" ).arg( it->expression(), it->evalErrorString() ) );
166 attributes.append( value );
170 attributes.append( QVariant() );
180 bool QgsRefactorFieldsAlgorithm::supportInPlaceEdit(
const QgsMapLayer *layer )
const