42#include <QRegularExpression>
46 std::unique_ptr<QgsExpression> expression;
53 expression = std::make_unique<QgsExpression>( fieldOrExpression );
56 if ( expression->hasParserError() || !expression->prepare( &context ) )
65 lst.insert( fieldOrExpression );
67 lst = expression->referencedColumns();
70 .
setFlags( ( expression && expression->needsGeometry() ) ?
88 QList<QVariant> values;
92 std::unique_ptr<QgsExpression> expression;
99 expression = std::make_unique<QgsExpression>( fieldOrExpression );
109 QVariant v = expression->evaluate( &context );
132 if ( attrNum != -1 && !selectedOnly )
147 std::unique_ptr<QgsExpression> expression;
152 expression = std::make_unique<QgsExpression>( fieldOrExpression );
162 newValue = expression->evaluate( &context );
169 if ( !newValue.isNull() )
188 QList<double> values;
193 const QList<QVariant> variantValues =
getValues( layer, fieldOrExpression, ok, selectedOnly, feedback );
198 for (
const QVariant &value : variantValues )
200 double val = value.toDouble( &convertOk );
224 if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
237 int srcFieldIndex = -1;
243 fieldIndex = srcFieldIndex;
252 QString fieldName = fields.
at( fieldIndex ).
name();
260 int limit = ignoreIds.size() + 1;
270 if ( ignoreIds.contains( feat.
id() ) )
286 if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
294 QVariant newVar( maxVal.toLongLong() + 1 );
302 switch ( field.
type() )
304 case QMetaType::Type::QString:
307 if ( seed.isValid() )
308 base = seed.toString();
310 if ( !base.isEmpty() )
313 const thread_local QRegularExpression rx( QStringLiteral(
"(.*)_\\d+" ) );
314 QRegularExpressionMatch match = rx.match( base );
315 if ( match.hasMatch() )
317 base = match.captured( 1 );
329 base = f.
attribute( fieldIndex ).toString();
336 if ( !base.isEmpty() && !vals.contains( base ) )
339 for (
int i = 1; i < 10000; ++i )
341 QString testVal = base +
'_' + QString::number( i );
342 if ( !vals.contains( testVal ) )
366 if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
373 QVariant maxVal = existingValues.isEmpty() ? 0 : *std::max_element( existingValues.begin(), existingValues.end(), [](
const QVariant & a,
const QVariant & b ) { return a.toLongLong() < b.toLongLong(); } );
374 QVariant newVar( maxVal.toLongLong() + 1 );
382 switch ( field.
type() )
384 case QMetaType::Type::QString:
387 if ( seed.isValid() )
388 base = seed.toString();
390 if ( !base.isEmpty() )
393 const thread_local QRegularExpression rx( QStringLiteral(
"(.*)_\\d+" ) );
394 QRegularExpressionMatch match = rx.match( base );
395 if ( match.hasMatch() )
397 base = match.captured( 1 );
404 base = existingValues.isEmpty() ? QString() : existingValues.constBegin()->toString();
409 for (
const auto &v : std::as_const( existingValues ) )
411 if ( v.toString().startsWith( base ) )
412 vals.push_back( v.toString() );
416 if ( !base.isEmpty() && !vals.contains( base ) )
419 for (
int i = 1; i < 10000; ++i )
421 QString testVal = base +
'_' + QString::number( i );
422 if ( !vals.contains( testVal ) )
445 if ( attributeIndex < 0 || attributeIndex >= layer->
fields().
count() )
460 if ( attributeIndex < 0 || attributeIndex >= layer->
fields().
count() )
465 const QVariant value = feature.
attribute( attributeIndex );
480 valid = expr.
evaluate( &context ).toBool();
488 errors << QObject::tr(
"evaluation error: %1" ).arg( expr.
evalErrorString() );
496 bool notNullConstraintViolated {
false };
514 valid = valid && !isNullOrUnset;
518 errors << QObject::tr(
"value is NULL" );
519 notNullConstraintViolated =
true;
525 if ( ! notNullConstraintViolated )
544 valid = valid && !alreadyExists;
548 errors << QObject::tr(
"value is not unique" );
561 return features.isEmpty() ?
QgsFeature() : features.first();
570 result.reserve( featuresData.length() );
573 std::unique_ptr< QgsExpressionContext > tempContext;
578 evalContext = tempContext.get();
584 QMap<int, QSet<QVariant>> uniqueValueCache;
586 auto checkUniqueValue = [ & ](
const int fieldIdx,
const QVariant & value )
588 if ( ! uniqueValueCache.contains( fieldIdx ) )
593 std::unique_ptr<QgsVectorLayer> unfilteredClone { layer->
clone( ) };
594 unfilteredClone->setSubsetString( QString( ) );
595 uniqueValueCache[ fieldIdx ] = unfilteredClone->uniqueValues( fieldIdx );
599 uniqueValueCache[ fieldIdx ] = layer->
uniqueValues( fieldIdx );
602 return uniqueValueCache[ fieldIdx ].contains( value );
605 for (
const auto &fd : std::as_const( featuresData ) )
614 for (
int idx = 0; idx < fields.
count(); ++idx )
617 bool checkUnique =
true;
622 if ( fd.attributes().contains( idx ) )
624 v = fd.attributes().value( idx );
631 && checkUniqueValue( idx, v ) )
633 && defaultValueDefinition.
isValid() )
638 v = layer->
defaultValue( idx, newFeature, evalContext );
644 && checkUniqueValue( idx, v ) ) )
649 if ( !providerDefault.isEmpty() )
659 && hasUniqueConstraint
660 && checkUniqueValue( idx, v ) ) )
676 v = fd.attributes().value( idx );
684 if ( checkUnique && hasUniqueConstraint )
686 if ( checkUniqueValue( idx, v ) )
690 if ( uniqueValue.isValid() )
694 if ( hasUniqueConstraint )
696 uniqueValueCache[ idx ].insert( v );
701 result.append( newFeature );
721 for (
int fieldIdx = 0; fieldIdx < fieldCount; ++fieldIdx )
731 attributeMap.insert( fieldIdx, feature.
attribute( fieldIdx ) );
744 referencedLayersBranch << layer;
746 const int effectiveMaxDepth = maxDepth > 0 ? maxDepth : 100;
757 while ( relatedFeaturesIt.
nextFeature( childFeature ) )
760 relation.referencingLayer()->startEditing();
762 const auto pairs = relation.fieldPairs();
768 childFeatureIds.insert(
duplicateFeature( relation.referencingLayer(), childFeature, project, duplicateFeatureContext, maxDepth, depth + 1, referencedLayersBranch ).
id() );
772 duplicateFeatureContext.setDuplicatedFeatures( relation.referencingLayer(), childFeatureIds );
782 std::unique_ptr<QgsVectorLayerFeatureSource> featureSource;
784 auto getFeatureSource = [ layer = std::move( layer ), &featureSource, feedback ]
786 Q_ASSERT( QThread::currentThread() == qApp->thread() || feedback );
791 featureSource = std::make_unique<QgsVectorLayerFeatureSource>( lyr );
797 return featureSource;
805 attributes.reserve( fields.
size() );
807 for (
const QgsField &field : fields )
818 if ( lengthDiff > 0 )
824 else if ( lengthDiff < 0 )
828 attributes.reserve( fields.
count() );
830 for (
int i = attributeCount; i < fields.
count(); ++i )
852 for (
int index : pkIndexes )
861 bool newFHasGeom = newFGeomType !=
864 bool layerHasGeom = inputWkbType !=
868 if ( ( newFHasGeom && !layerHasGeom ) || !newFHasGeom )
872 resultFeatures.append( _f );
879 if ( geometries.count() != 1 )
882 for (
int j = 0; j < newF.
fields().count(); j++ )
886 resultFeatures.reserve( geometries.size() );
890 resultFeatures.append( _f );
896 resultFeatures.append( newF );
899 return resultFeatures;
908 for (
const auto &_f : features )
910 resultFeatures.append( _f );
913 return resultFeatures;
918 QList<QgsVectorLayer *>
layers;
919 QMap<QgsVectorLayer *, QgsFeatureIds>::const_iterator i;
920 for ( i = mDuplicatedFeatures.begin(); i != mDuplicatedFeatures.end(); ++i )
927 return mDuplicatedFeatures[layer];
932 if ( mDuplicatedFeatures.contains( layer ) )
933 mDuplicatedFeatures[layer] += ids;
935 mDuplicatedFeatures.insert( layer, ids );
1033 if ( !joinedFeature.
isValid() )
1063 const QgsTextMaskSettings &maskSettings = labelSettingsEntity->settings().format().mask();
1068 const bool hasEffects = maskSettings.
opacity() < 1 ||
1072 QgsMaskedLayer &maskedLayer = maskedLayers[currentRule][r.layerId()];
1081 QHash<QString, QgsMaskedLayers> maskedLayers;
1083 QString currentRule;
1089 LabelMasksVisitor visitor;
1091 return std::move( visitor.maskedLayers );
1108 bool visitSymbol(
const QgsSymbol *symbol )
1112 bool symbolHasEffect = symbol->
opacity() < 1;
1117 symbolHasEffect |= slHasEffects;
1122 slHasEffects |= visitSymbol( subSymbol );
1124 for (
const auto &mask : sl->
masks() )
1132 return symbolHasEffect;
1140 if ( symbolEntity->symbol() )
1141 visitSymbol( symbolEntity->symbol() );
1148 SymbolLayerVisitor visitor;
1150 return visitor.maskedLayers;
1160 QString displayString = exp.
evaluate( &context ).toString();
1162 return displayString;
1173 switch ( relation.strength() )
1179 const auto constFids = fids;
1185 while ( relatedFeaturesIt.
nextFeature( childFeature ) )
1187 childFeatureIds.insert( childFeature.
id() );
1191 if ( childFeatureIds.count() > 0 )
1193 if ( context.
layers().contains( relation.referencingLayer() ) )
1197 handledFeatureIds.unite( childFeatureIds );
1198 context.setDuplicatedFeatures( relation.referencingLayer(), handledFeatureIds );
1203 context.setDuplicatedFeatures( relation.referencingLayer(), childFeatureIds );
1222 if ( info.isEditable() && info.hasCascadedDelete() )
1225 const auto constFids = fids;
1230 joinFeatureIds.insert( joinFeature.
id() );
1233 if ( joinFeatureIds.count() > 0 )
1235 if ( context.
layers().contains( info.joinLayer() ) )
1239 handledFeatureIds.unite( joinFeatureIds );
1240 context.setDuplicatedFeatures( info.joinLayer(), handledFeatureIds );
1245 context.setDuplicatedFeatures( info.joinLayer(), joinFeatureIds );
1252 return !context.
layers().isEmpty();
1257 if ( foundFriendly )
1258 *foundFriendly =
false;
1270 static QStringList sCandidates{ QStringLiteral(
"name" ),
1271 QStringLiteral(
"title" ),
1272 QStringLiteral(
"heibt" ),
1273 QStringLiteral(
"desc" ),
1274 QStringLiteral(
"nom" ),
1275 QStringLiteral(
"street" ),
1276 QStringLiteral(
"road" ),
1277 QStringLiteral(
"label" ),
1279 QStringLiteral(
"titel" ),
1280 QStringLiteral(
"beschreibung" ),
1281 QStringLiteral(
"strasse" ),
1282 QStringLiteral(
"beschriftung" ) };
1289 static QStringList sAntiCandidates{ QStringLiteral(
"type" ),
1290 QStringLiteral(
"class" ),
1291 QStringLiteral(
"cat" ),
1293 QStringLiteral(
"typ" ),
1294 QStringLiteral(
"klasse" ),
1295 QStringLiteral(
"kategorie" )
1298 QString bestCandidateName;
1299 QString bestCandidateContainsName;
1300 QString bestCandidateContainsNameWithAntiCandidate;
1302 for (
const QString &candidate : sCandidates )
1304 for (
const QgsField &field : fields )
1306 const QString fldName = field.name();
1308 if ( fldName.compare( candidate, Qt::CaseInsensitive ) == 0 )
1310 bestCandidateName = fldName;
1312 else if ( fldName.contains( candidate, Qt::CaseInsensitive ) )
1314 bool isAntiCandidate =
false;
1315 for (
const QString &antiCandidate : sAntiCandidates )
1317 if ( fldName.contains( antiCandidate, Qt::CaseInsensitive ) )
1319 isAntiCandidate =
true;
1324 if ( isAntiCandidate )
1326 if ( bestCandidateContainsNameWithAntiCandidate.isEmpty() )
1328 bestCandidateContainsNameWithAntiCandidate = fldName;
1333 if ( bestCandidateContainsName.isEmpty() )
1335 bestCandidateContainsName = fldName;
1341 if ( !bestCandidateName.isEmpty() )
1345 QString candidateName = bestCandidateName;
1346 if ( candidateName.isEmpty() )
1348 candidateName = bestCandidateContainsName.isEmpty() ? bestCandidateContainsNameWithAntiCandidate : bestCandidateContainsName;
1351 if ( !candidateName.isEmpty() )
1360 if ( candidateName == QLatin1String(
"gml_name" ) &&
1361 fields.
indexOf( QLatin1String(
"id" ) ) >= 0 )
1363 candidateName.clear();
1365 for (
const QgsField &field : std::as_const( fields ) )
1367 const QString fldName = field.name();
1368 if ( fldName != QLatin1String(
"gml_name" ) && fldName.endsWith( QLatin1String(
"_name" ) ) )
1370 candidateName = fldName;
1374 if ( candidateName.isEmpty() )
1377 candidateName = QStringLiteral(
"id" );
1381 if ( foundFriendly )
1382 *foundFriendly =
true;
1383 return candidateName;
1388 for (
const QgsField &field : fields )
1390 if ( field.type() == QMetaType::Type::QString )
1391 return field.name();
1395 return fields.at( 0 ).name();
1399template <
typename T,
typename ConverterFunc>
1400void populateFieldDataArray(
const QVector<QVariant> &values,
const QVariant &nullValue, QByteArray &res, ConverterFunc converter )
1402 res.resize( values.size() *
sizeof( T ) );
1403 T *data =
reinterpret_cast<T *
>( res.data() );
1404 for (
const QVariant &val : values )
1408 *data++ = converter( nullValue );
1412 *data++ = converter( val );
1419 const int fieldIndex = fields.
lookupField( fieldName );
1420 if ( fieldIndex < 0 )
1421 return QByteArray();
1423 QVector< QVariant > values;
1427 values.append( f.
attribute( fieldIndex ) );
1430 const QgsField field = fields.
at( fieldIndex );
1432 switch ( field.
type( ) )
1434 case QMetaType::Int:
1440 case QMetaType::UInt:
1446 case QMetaType::LongLong:
1452 case QMetaType::ULongLong:
1458 case QMetaType::Double:
1464 case QMetaType::Long:
1470 case QMetaType::Short:
1476 case QMetaType::ULong:
1482 case QMetaType::UShort:
1488 case QMetaType::Float:
@ AddFeatures
Allows adding features.
@ ChangeAttributeValues
Allows modification of attribute values.
@ Composition
Fix relation, related elements are part of the parent and a parent copy will copy any children or del...
@ Association
Loose relation, related elements are not part of the parent and a parent copy will not copy any child...
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
@ NoFlags
No flags are set.
GeometryType
The geometry types are used to group Qgis::WkbType in a coarse way.
@ UnsetField
Clears the field value so that the data provider backend will populate using any backend triggers or ...
@ DefaultValue
Use default field value.
@ Duplicate
Duplicate original value.
@ Provider
Field originates from the underlying data provider of the vector layer.
@ Join
Field originates from a joined layer.
WkbType
The WKB type describes the number of dimensions a geometry has.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the labeling...
Provides a container for managing client side default values for fields.
bool isValid() const
Returns if this default value should be applied.
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
void appendScopes(const QList< QgsExpressionContextScope * > &scopes)
Appends a list of scopes to the end of the context.
Handles parsing and evaluation of expressions (formerly called "search strings").
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
QString evalErrorString() const
Returns evaluation error.
QString parserErrorString() const
Returns parser error.
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes).
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
QVariant evaluate()
Evaluate the feature and return the result.
Wrapper for iterator of features from vector data provider or vector layer.
bool nextFeature(QgsFeature &f)
Fetch next feature and stores in f, returns true on success.
virtual bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified symbology visitor, causing it to visit all symbols associated with the renderer...
Wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFlags(Qgis::FeatureRequestFlags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setLimit(long long limit)
Set the maximum number of features to request.
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched.
QFlags< SinkFlag > SinkFlags
@ RegeneratePrimaryKey
This flag indicates, that a primary key field cannot be guaranteed to be unique and the sink should i...
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Q_INVOKABLE bool setAttribute(int field, const QVariant &attr)
Sets an attribute's value by field index.
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields.
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes.
void setFields(const QgsFields &fields, bool initAttributes=false)
Assigns a field map with the feature to allow attribute access by attribute name.
int attributeCount() const
Returns the number of attributes attached to the feature.
void setValid(bool validity)
Sets the validity of the feature.
bool isValid() const
Returns the validity of this feature.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
bool isCanceled() const
Tells whether the operation has been canceled already.
Stores information about constraints which may be present on a field.
ConstraintStrength
Strength of constraints.
@ ConstraintStrengthNotSet
Constraint is not set.
ConstraintOrigin
Origin of constraints.
@ ConstraintOriginNotSet
Constraint is not set.
@ ConstraintOriginProvider
Constraint was set at data provider.
ConstraintStrength constraintStrength(Constraint constraint) const
Returns the strength of a field constraint, or ConstraintStrengthNotSet if the constraint is not pres...
ConstraintOrigin constraintOrigin(Constraint constraint) const
Returns the origin of a field constraint, or ConstraintOriginNotSet if the constraint is not present ...
QString constraintExpression() const
Returns the constraint expression for the field, if set.
@ ConstraintNotNull
Field may not be null.
@ ConstraintUnique
Field must have a unique value.
@ ConstraintExpression
Field has an expression constraint set. See constraintExpression().
QString constraintDescription() const
Returns the descriptive name for the constraint expression.
Encapsulate a field in an attribute table or data source.
bool convertCompatible(QVariant &v, QString *errorMessage=nullptr) const
Converts the provided variant to a compatible format.
Qgis::FieldDuplicatePolicy duplicatePolicy() const
Returns the field's duplicate policy, which indicates how field values should be handled during a dup...
QgsFieldConstraints constraints
Container of fields for a vector layer.
Q_INVOKABLE int indexOf(const QString &fieldName) const
Gets the field index from the field name.
Qgis::FieldOrigin fieldOrigin(int fieldIdx) const
Returns the field's origin (value from an enumeration).
int size() const
Returns number of items.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
int fieldOriginIndex(int fieldIdx) const
Returns the field's origin index (its meaning is specific to each type of origin).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
A geometry is the spatial representation of a feature.
QVector< QgsGeometry > coerceToType(Qgis::WkbType type, double defaultZ=0, double defaultM=0, bool avoidDuplicates=true) const
Attempts to coerce this geometry into the specified destination type.
Qgis::WkbType wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.).
bool enabled() const
Returns whether the effect is enabled.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
QgsRelationManager * relationManager
QList< QgsRelation > referencedRelations(const QgsVectorLayer *layer=nullptr) const
Gets all relations where this layer is the referenced part (i.e.
Defines a relation between matching fields of the two involved tables of a relation.
Represents a relationship between two vector layers.
virtual QgsStyle::StyleEntity type() const =0
Returns the type of style entity.
An interface for classes which can visit style entity (e.g.
@ SymbolRule
Rule based symbology or label child rule.
A label settings entity for QgsStyle databases.
A symbol entity for QgsStyle databases.
@ LabelSettingsEntity
Label settings.
Abstract base class for symbol layers.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the layer.
virtual QList< QgsSymbolLayerReference > masks() const
Returns masks defined by this symbol layer.
Abstract base class for all rendered symbols.
QgsSymbolLayer * symbolLayer(int layer)
Returns the symbol layer at the specified index.
qreal opacity() const
Returns the opacity for the symbol.
int symbolLayerCount() const
Returns the total number of symbol layers contained in the symbol.
Container for settings relating to a selective masking around a text.
QList< QgsSymbolLayerReference > maskedSymbolLayers() const
Returns a list of references to symbol layers that are masked by this buffer.
QgsPaintEffect * paintEffect() const
Returns the current paint effect for the mask.
double opacity() const
Returns the mask's opacity.
bool enabled() const
Returns whether the mask is enabled.
static bool runOnMainThread(const Func &func, QgsFeedback *feedback=nullptr)
Guarantees that func is executed on the main thread.
Represents a default, "not-specified" value for a feature attribute.
static bool isNull(const QVariant &variant, bool silenceNullWarnings=false)
Returns true if the specified variant should be considered a NULL value.
static QVariant createNullVariant(QMetaType::Type metaType)
Helper method to properly create a null QVariant from a metaType Returns the created QVariant.
static bool isUnsetAttributeValue(const QVariant &variant)
Check if the variant is a QgsUnsetAttributeValue.
virtual Q_INVOKABLE Qgis::VectorProviderCapabilities capabilities() const
Returns flags containing the supported capabilities.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index.
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index.
virtual bool skipConstraintCheck(int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value=QVariant()) const
Returns true if a constraint check should be skipped for a specified field (e.g., if the value return...
const QgsVectorLayerJoinInfo * joinForFieldIndex(int index, const QgsFields &fields, int &sourceFieldIndex) const
Finds the vector join for a layer field index.
bool containsJoins() const
Quick way to test if there is any join at all.
QgsFeature joinedFeatureOf(const QgsVectorLayerJoinInfo *info, const QgsFeature &feature) const
Returns the joined feature corresponding to the feature.
const QgsVectorJoinList & vectorJoins() const
Defines left outer join from our vector layer to some other vector layer.
bool hasUpsertOnEdit() const
Returns whether a feature created on the target layer has to impact the joined layer by creating a ne...
bool isEditable() const
Returns whether joined fields may be edited through the form of the target layer.
QgsVectorLayer * joinLayer() const
Returns joined layer (may be nullptr if the reference was set by layer ID and not resolved yet).
Contains mainly the QMap with QgsVectorLayer and QgsFeatureIds which list all the duplicated features...
QgsFeatureIds duplicatedFeatures(QgsVectorLayer *layer) const
Returns the duplicated features in the given layer.
QList< QgsVectorLayer * > layers() const
Returns all the layers on which features have been duplicated.
Encapsulate geometry and attributes for new features, to be passed to createFeatures.
QgsGeometry geometry() const
Returns geometry.
QgsAttributeMap attributes() const
Returns attributes.
QgsFeatureData(const QgsGeometry &geometry=QgsGeometry(), const QgsAttributeMap &attributes=QgsAttributeMap())
Constructs a new QgsFeatureData with given geometry and attributes.
static QByteArray fieldToDataArray(const QgsFields &fields, const QString &fieldName, QgsFeatureIterator &it, const QVariant &nullValue)
Converts field values from an iterator to an array of data.
static QgsFeature duplicateFeature(QgsVectorLayer *layer, const QgsFeature &feature, QgsProject *project, QgsDuplicateFeatureContext &duplicateFeatureContext, const int maxDepth=0, int depth=0, QList< QgsVectorLayer * > referencedLayersBranch=QList< QgsVectorLayer * >())
Duplicates a feature and it's children (one level deep).
QList< QgsVectorLayerUtils::QgsFeatureData > QgsFeaturesDataList
Alias for list of QgsFeatureData.
static bool valueExists(const QgsVectorLayer *layer, int fieldIndex, const QVariant &value, const QgsFeatureIds &ignoreIds=QgsFeatureIds())
Returns true if the specified value already exists within a field.
static QgsFeatureList makeFeatureCompatible(const QgsFeature &feature, const QgsVectorLayer *layer, QgsFeatureSink::SinkFlags sinkFlags=QgsFeatureSink::SinkFlags())
Converts input feature to be compatible with the given layer.
static QgsMaskedLayers symbolLayerMasks(const QgsVectorLayer *)
Returns all masks that may be defined on symbol layers for a given vector layer.
static QString guessFriendlyIdentifierField(const QgsFields &fields, bool *foundFriendly=nullptr)
Given a set of fields, attempts to pick the "most useful" field for user-friendly identification of f...
static QList< QVariant > uniqueValues(const QgsVectorLayer *layer, const QString &fieldOrExpression, bool &ok, bool selectedOnly=false, int limit=-1, QgsFeedback *feedback=nullptr)
Fetches all unique values from a specified field name or expression.
static QgsFeatureIterator getValuesIterator(const QgsVectorLayer *layer, const QString &fieldOrExpression, bool &ok, bool selectedOnly)
Create a feature iterator for a specified field name or expression.
static bool fieldEditabilityDependsOnFeature(const QgsVectorLayer *layer, int fieldIndex)
Returns true if the editability of the field at index fieldIndex from layer may vary feature by featu...
static QgsFeatureList makeFeaturesCompatible(const QgsFeatureList &features, const QgsVectorLayer *layer, QgsFeatureSink::SinkFlags sinkFlags=QgsFeatureSink::SinkFlags())
Converts input features to be compatible with the given layer.
static std::unique_ptr< QgsVectorLayerFeatureSource > getFeatureSource(QPointer< QgsVectorLayer > layer, QgsFeedback *feedback=nullptr)
Gets the feature source from a QgsVectorLayer pointer.
static QString getFeatureDisplayString(const QgsVectorLayer *layer, const QgsFeature &feature)
Returns a descriptive string for a feature, suitable for displaying to the user.
static QgsFeature createFeature(const QgsVectorLayer *layer, const QgsGeometry &geometry=QgsGeometry(), const QgsAttributeMap &attributes=QgsAttributeMap(), QgsExpressionContext *context=nullptr)
Creates a new feature ready for insertion into a layer.
static bool fieldIsEditable(const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature)
Tests whether a field is editable for a particular feature.
static bool attributeHasConstraints(const QgsVectorLayer *layer, int attributeIndex)
Returns true if a feature attribute has active constraints.
static QList< double > getDoubleValues(const QgsVectorLayer *layer, const QString &fieldOrExpression, bool &ok, bool selectedOnly=false, int *nullCount=nullptr, QgsFeedback *feedback=nullptr)
Fetches all double values from a specified field name or expression.
QFlags< CascadedFeatureFlag > CascadedFeatureFlags
static bool fieldIsReadOnly(const QgsVectorLayer *layer, int fieldIndex)
Returns true if the field at index fieldIndex from layer is editable, false if the field is read only...
static QHash< QString, QgsMaskedLayers > labelMasks(const QgsVectorLayer *)
Returns masks defined in labeling options of a layer.
static QgsFeatureList createFeatures(const QgsVectorLayer *layer, const QgsFeaturesDataList &featuresData, QgsExpressionContext *context=nullptr)
Creates a set of new features ready for insertion into a layer.
static QVariant createUniqueValue(const QgsVectorLayer *layer, int fieldIndex, const QVariant &seed=QVariant())
Returns a new attribute value for the specified field index which is guaranteed to be unique.
static bool impactsCascadeFeatures(const QgsVectorLayer *layer, const QgsFeatureIds &fids, const QgsProject *project, QgsDuplicateFeatureContext &context, QgsVectorLayerUtils::CascadedFeatureFlags flags=QgsVectorLayerUtils::CascadedFeatureFlags())
Returns true if at least one feature of the fids on layer is connected as parent in at least one comp...
static QList< QVariant > getValues(const QgsVectorLayer *layer, const QString &fieldOrExpression, bool &ok, bool selectedOnly=false, QgsFeedback *feedback=nullptr)
Fetches all values from a specified field name or expression.
static QVariant createUniqueValueFromCache(const QgsVectorLayer *layer, int fieldIndex, const QSet< QVariant > &existingValues, const QVariant &seed=QVariant())
Returns a new attribute value for the specified field index which is guaranteed to be unique within r...
static bool validateAttribute(const QgsVectorLayer *layer, const QgsFeature &feature, int attributeIndex, QStringList &errors, QgsFieldConstraints::ConstraintStrength strength=QgsFieldConstraints::ConstraintStrengthNotSet, QgsFieldConstraints::ConstraintOrigin origin=QgsFieldConstraints::ConstraintOriginNotSet)
Tests a feature attribute value to check whether it passes all constraints which are present on the c...
static void matchAttributesToFields(QgsFeature &feature, const QgsFields &fields)
Matches the attributes in feature to the specified fields.
@ IgnoreAuxiliaryLayers
Ignore auxiliary layers.
Represents a vector layer which manages a vector based dataset.
bool isEditable() const final
Returns true if the provider is in editing mode.
QVariant maximumValue(int index) const final
Returns the maximum value for an attribute column or an invalid variant in case of error.
QgsExpressionContext createExpressionContext() const final
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QgsDefaultValue defaultValueDefinition(int index) const
Returns the definition of the expression used when calculating the default value for a field.
Q_INVOKABLE Qgis::WkbType wkbType() const final
Returns the WKBType or WKBUnknown in case of error.
const QgsAbstractVectorLayerLabeling * labeling() const
Access to const labeling configuration.
QgsFeatureRenderer * renderer()
Returns the feature renderer used for rendering the features in the layer in 2D map views.
QString displayExpression
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features.
QgsVectorLayerJoinBuffer * joinBuffer()
Returns the join buffer object.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const final
Queries the layer for features specified in request.
QgsVectorLayer * clone() const override
Returns a new instance equivalent to this one.
QStringList uniqueStringsMatching(int index, const QString &substring, int limit=-1, QgsFeedback *feedback=nullptr) const
Returns unique string values of an attribute which contain a specified subset string.
QVariant defaultValue(int index, const QgsFeature &feature=QgsFeature(), QgsExpressionContext *context=nullptr) const
Returns the calculated default value for the specified field index.
QgsEditFormConfig editFormConfig
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const final
Calculates a list of unique values contained within an attribute in the layer.
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=QgsFeatureSink::Flags()) final
Adds a single feature to the sink.
Q_INVOKABLE QgsFeature getFeature(QgsFeatureId fid) const
Queries the layer for the feature with the given id.
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.
static Qgis::GeometryType geometryType(Qgis::WkbType type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
QMap< int, QVariant > QgsAttributeMap
QList< QgsFeature > QgsFeatureList
QSet< QgsFeatureId > QgsFeatureIds
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features
QList< int > QgsAttributeList
QList< QgsVectorLayerJoinInfo > QgsVectorJoinList
bool _fieldIsEditable(const QgsVectorLayer *layer, int fieldIndex, const QgsFeature &feature)
void populateFieldDataArray(const QVector< QVariant > &values, const QVariant &nullValue, QByteArray &res, ConverterFunc converter)
QHash< QString, QgsMaskedLayer > QgsMaskedLayers
masked layers where key is the layer id
QSet< QString > symbolLayerIds
Contains information relating to a node (i.e.
QString identifier
A string identifying the node.
QgsStyleEntityVisitorInterface::NodeType type
Node type.
Contains information relating to the style entity currently being visited.
const QgsStyleEntityInterface * entity
Reference to style entity being visited.