Skip to content

Commit 1f1e8b5

Browse files
committedOct 24, 2023
Avoid multiple layer access calls where possible
1 parent e1d08fa commit 1f1e8b5

File tree

1 file changed

+21
-13
lines changed

1 file changed

+21
-13
lines changed
 

‎src/analysis/processing/qgsalgorithmmergevector.cpp

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -109,39 +109,43 @@ QVariantMap QgsMergeVectorAlgorithm::processAlgorithm( const QVariantMap &parame
109109

110110
QgsVectorLayer *vl = qobject_cast< QgsVectorLayer * >( layer );
111111

112-
if ( !outputCrs.isValid() && vl->crs().isValid() )
112+
const Qgis::WkbType layerWkbType = vl->wkbType();
113+
const QgsCoordinateReferenceSystem layerCrs = vl->crs();
114+
const QString layerName = vl->name();
115+
116+
if ( !outputCrs.isValid() && layerCrs.isValid() )
113117
{
114-
outputCrs = vl->crs();
118+
outputCrs = layerCrs;
115119
feedback->pushInfo( QObject::tr( "Taking destination CRS %1 from layer" ).arg( outputCrs.authid() ) );
116120
}
117121

118122
// check wkb type
119123
if ( outputType != Qgis::WkbType::Unknown && outputType != Qgis::WkbType::NoGeometry )
120124
{
121-
if ( QgsWkbTypes::geometryType( outputType ) != QgsWkbTypes::geometryType( vl->wkbType() ) )
125+
if ( QgsWkbTypes::geometryType( outputType ) != QgsWkbTypes::geometryType( layerWkbType ) )
122126
throw QgsProcessingException( QObject::tr( "All layers must have same geometry type! Encountered a %1 layer when expecting a %2 layer." )
123-
.arg( QgsWkbTypes::geometryDisplayString( QgsWkbTypes::geometryType( vl->wkbType() ) ),
127+
.arg( QgsWkbTypes::geometryDisplayString( QgsWkbTypes::geometryType( layerWkbType ) ),
124128
QgsWkbTypes::geometryDisplayString( QgsWkbTypes::geometryType( outputType ) ) ) );
125129

126-
if ( QgsWkbTypes::hasM( vl->wkbType() ) && !QgsWkbTypes::hasM( outputType ) )
130+
if ( QgsWkbTypes::hasM( layerWkbType ) && !QgsWkbTypes::hasM( outputType ) )
127131
{
128132
outputType = QgsWkbTypes::addM( outputType );
129133
feedback->pushInfo( QObject::tr( "Found a layer with M values, upgrading output type to %1" ).arg( QgsWkbTypes::displayString( outputType ) ) );
130134
}
131-
if ( QgsWkbTypes::hasZ( vl->wkbType() ) && !QgsWkbTypes::hasZ( outputType ) )
135+
if ( QgsWkbTypes::hasZ( layerWkbType ) && !QgsWkbTypes::hasZ( outputType ) )
132136
{
133137
outputType = QgsWkbTypes::addZ( outputType );
134138
feedback->pushInfo( QObject::tr( "Found a layer with Z values, upgrading output type to %1" ).arg( QgsWkbTypes::displayString( outputType ) ) );
135139
}
136-
if ( QgsWkbTypes::isMultiType( vl->wkbType() ) && !QgsWkbTypes::isMultiType( outputType ) )
140+
if ( QgsWkbTypes::isMultiType( layerWkbType ) && !QgsWkbTypes::isMultiType( outputType ) )
137141
{
138142
outputType = QgsWkbTypes::multiType( outputType );
139143
feedback->pushInfo( QObject::tr( "Found a layer with multiparts, upgrading output type to %1" ).arg( QgsWkbTypes::displayString( outputType ) ) );
140144
}
141145
}
142146
else
143147
{
144-
outputType = vl->wkbType();
148+
outputType = layerWkbType;
145149
feedback->pushInfo( QObject::tr( "Setting output type to %1" ).arg( QgsWkbTypes::displayString( outputType ) ) );
146150
}
147151

@@ -160,7 +164,7 @@ QVariantMap QgsMergeVectorAlgorithm::processAlgorithm( const QVariantMap &parame
160164
{
161165
feedback->pushWarning( QObject::tr( "%1 field in layer %2 has different data type than the destination layer (%3 instead of %4). "
162166
"%1 field will be converted to string type." )
163-
.arg( sourceField.name(), vl->name(), sourceField.typeName(), destField.typeName() ) );
167+
.arg( sourceField.name(), layerName, sourceField.typeName(), destField.typeName() ) );
164168
destField.setType( QVariant::String );
165169
destField.setSubType( QVariant::Invalid );
166170
destField.setLength( 0 );
@@ -209,7 +213,11 @@ QVariantMap QgsMergeVectorAlgorithm::processAlgorithm( const QVariantMap &parame
209213
if ( !vl )
210214
continue;
211215

212-
feedback->pushInfo( QObject::tr( "Packaging layer %1/%2: %3" ).arg( layerNumber ).arg( layers.count() ).arg( layer->name() ) );
216+
const QString layerName = layer->name();
217+
const QString layerSource = layer->publicSource();
218+
const QgsFields layerFields = vl->fields();
219+
220+
feedback->pushInfo( QObject::tr( "Packaging layer %1/%2: %3" ).arg( layerNumber ).arg( layers.count() ).arg( layerName ) );
213221

214222
QgsFeatureIterator it = vl->getFeatures( QgsFeatureRequest().setDestinationCrs( outputCrs, context.transformContext() ) );
215223
QgsFeature f;
@@ -248,17 +256,17 @@ QVariantMap QgsMergeVectorAlgorithm::processAlgorithm( const QVariantMap &parame
248256
{
249257
if ( addLayerField && destField.name() == QLatin1String( "layer" ) )
250258
{
251-
destAttributes.append( layer->name() );
259+
destAttributes.append( layerName );
252260
continue;
253261
}
254262
else if ( addPathField && destField.name() == QLatin1String( "path" ) )
255263
{
256-
destAttributes.append( layer->publicSource() );
264+
destAttributes.append( layerSource );
257265
continue;
258266
}
259267

260268
QVariant destAttribute;
261-
const int sourceIndex = vl->fields().lookupField( destField.name() );
269+
const int sourceIndex = layerFields.lookupField( destField.name() );
262270
if ( sourceIndex >= 0 )
263271
{
264272
destAttribute = f.attributes().at( sourceIndex );

0 commit comments

Comments
 (0)