16 #include <QRegularExpression>    39   std::unique_ptr<QgsExpression> expression;
    49     if ( expression->hasParserError() || !expression->prepare( &context ) )
    58     lst.insert( fieldOrExpression );
    60     lst = expression->referencedColumns();
    63                               .
setFlags( ( expression && expression->needsGeometry() ) ?
    81   QList<QVariant> values;
    85     std::unique_ptr<QgsExpression> expression;
   102         QVariant v = expression->evaluate( &context );
   121   QList<double> values;
   126   QList<QVariant> variantValues = 
getValues( layer, fieldOrExpression, ok, selectedOnly, feedback );
   131   Q_FOREACH ( 
const QVariant &value, variantValues )
   133     double val = value.toDouble( &convertOk );
   136     else if ( value.isNull() )
   157   if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
   160   QString fieldName = fields.
at( fieldIndex ).
name();
   168   int limit = ignoreIds.size() + 1;
   178     if ( ignoreIds.contains( feat.
id() ) )
   194   if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
   202     QVariant newVar( maxVal.toLongLong() + 1 );
   210     switch ( field.
type() )
   212       case QVariant::String:
   215         if ( seed.isValid() )
   216           base = seed.toString();
   218         if ( !base.isEmpty() )
   221           QRegularExpression rx( QStringLiteral( 
"(.*)_\\d+" ) );
   222           QRegularExpressionMatch match = rx.match( base );
   223           if ( match.hasMatch() )
   225             base = match.captured( 1 );
   237           base = f.
attribute( fieldIndex ).toString();
   244         if ( !base.isEmpty() && !vals.contains( base ) )
   247         for ( 
int i = 1; i < 10000; ++i )
   249           QString testVal = base + 
'_' + QString::number( i );
   250           if ( !vals.contains( testVal ) )
   274   if ( fieldIndex < 0 || fieldIndex >= fields.
count() )
   281     QVariant maxVal = existingValues.isEmpty() ? 0 : *std::max_element( existingValues.begin(), existingValues.end() );
   282     QVariant newVar( maxVal.toLongLong() + 1 );
   290     switch ( field.
type() )
   292       case QVariant::String:
   295         if ( seed.isValid() )
   296           base = seed.toString();
   298         if ( !base.isEmpty() )
   301           QRegularExpression rx( QStringLiteral( 
"(.*)_\\d+" ) );
   302           QRegularExpressionMatch match = rx.match( base );
   303           if ( match.hasMatch() )
   305             base = match.captured( 1 );
   312           base = existingValues.isEmpty() ? QString() : existingValues.values().first().toString();
   317         for ( 
const auto &v : qgis::as_const( existingValues ) )
   319           if ( v.toString().startsWith( base ) )
   320             vals.push_back( v.toString() );
   324         if ( !base.isEmpty() && !vals.contains( base ) )
   327         for ( 
int i = 1; i < 10000; ++i )
   329           QString testVal = base + 
'_' + QString::number( i );
   330           if ( !vals.contains( testVal ) )
   354   if ( attributeIndex < 0 || attributeIndex >= layer->
fields().
count() )
   359   QVariant value = feature.
attribute( attributeIndex );
   374     valid = expr.
evaluate( &context ).toBool();
   376     if ( expr.hasParserError() )
   378       errors << QObject::tr( 
"parser error: %1" ).arg( expr.parserErrorString() );
   380     else if ( expr.hasEvalError() )
   382       errors << QObject::tr( 
"evaluation error: %1" ).arg( expr.evalErrorString() );
   404       valid = valid && !value.isNull();
   406       if ( value.isNull() )
   408         errors << QObject::tr( 
"value is NULL" );
   428       valid = valid && !alreadyExists;
   432         errors << QObject::tr( 
"value is not unique" );
   444   return features.isEmpty() ? 
QgsFeature() : features.first();
   453   result.reserve( featuresData.length() );
   456   std::unique_ptr< QgsExpressionContext > tempContext;
   461     evalContext = tempContext.get();
   467   QMap<int, QSet<QVariant>> uniqueValueCaches;
   469   for ( 
const auto &fd : qgis::as_const( featuresData ) )
   478     for ( 
int idx = 0; idx < fields.
count(); ++idx )
   481       bool checkUnique = 
true;
   486       if ( fd.attributes().contains( idx ) )
   488         v = fd.attributes().value( idx );
   492       if ( hasUniqueConstraint && ! uniqueValueCaches.contains( idx ) )
   497       if ( ( v.isNull() || ( hasUniqueConstraint
   498                              && uniqueValueCaches[ idx ].contains( v ) ) )
   504         v = layer->
defaultValue( idx, newFeature, evalContext );
   509       if ( ( v.isNull() || ( hasUniqueConstraint
   510                              && uniqueValueCaches[ idx ].contains( v ) ) )
   515         if ( !providerDefault.isEmpty() )
   524       if ( ( v.isNull() || ( checkUnique && hasUniqueConstraint
   525                              && uniqueValueCaches[ idx ].contains( v ) ) )
   539       if ( v.isNull() && fd.attributes().contains( idx ) )
   541         v = fd.attributes().value( idx );
   547       if ( checkUnique && hasUniqueConstraint )
   549         if ( uniqueValueCaches[ idx ].contains( v ) )
   553           if ( uniqueValue.isValid() )
   557       if ( hasUniqueConstraint )
   558         uniqueValueCaches[ idx ].insert( v );
   561     result.append( newFeature );
   592       while ( relatedFeaturesIt.
nextFeature( childFeature ) )
   595         relation.referencingLayer()->startEditing();
   597         const auto pairs = relation.fieldPairs();
   603         childFeatureIds.insert( 
duplicateFeature( relation.referencingLayer(), childFeature, project, depth, duplicateFeatureContext ).
id() );
   607       duplicateFeatureContext.setDuplicatedFeatures( relation.referencingLayer(), childFeatureIds );
   618   std::unique_ptr<QgsVectorLayerFeatureSource> featureSource;
   622 #if QT_VERSION >= QT_VERSION_CHECK( 5, 10, 0 )   623     Q_ASSERT( QThread::currentThread() == qApp->thread() || feedback );
   637   return featureSource;
   645     attributes.reserve( fields.
size() );
   647     for ( 
const QgsField &field : fields )
   650       attributes.append( index >= 0 ? feature.
attribute( index ) : QVariant( field.type() ) );
   658     if ( lengthDiff > 0 )
   664     else if ( lengthDiff < 0 )
   668       attributes.reserve( fields.
count() );
   671         attributes.append( QVariant( fields.
at( i ).
type() ) );
   687   bool newFHasGeom = newFGeomType !=
   688                      QgsWkbTypes::GeometryType::UnknownGeometry &&
   689                      newFGeomType != QgsWkbTypes::GeometryType::NullGeometry;
   690   bool layerHasGeom = inputWkbType !=
   691                       QgsWkbTypes::Type::NoGeometry &&
   692                       inputWkbType != QgsWkbTypes::Type::Unknown;
   694   if ( newFHasGeom && ! layerHasGeom )
   698     resultFeatures.append( _f );
   703     if ( newFHasGeom && layerHasGeom && newF.
geometry().
wkbType() != inputWkbType )
   728           std::unique_ptr< QgsAbstractGeometry > exterior( ( *part )->clone() );
   729           if ( 
QgsCurve *curve = qgsgeometry_cast< QgsCurve * >( exterior.get() ) )
   733               std::unique_ptr< QgsCurvePolygon > cp = qgis::make_unique< QgsCurvePolygon >();
   734               cp->setExteriorRing( curve );
   736               gc->addGeometry( cp.release() );
   740               std::unique_ptr< QgsPolygon > p = qgis::make_unique< QgsPolygon  >();
   741               p->setExteriorRing( qgsgeometry_cast< QgsLineString * >( curve ) );
   743               gc->addGeometry( p.release() );
   757         std::unique_ptr< QgsMultiPoint > mp = qgis::make_unique< QgsMultiPoint >();
   759         QSet< QgsPoint > added;
   760         for ( 
auto vertex = source.vertices_begin(); vertex != source.vertices_end(); ++vertex )
   762           if ( added.contains( *vertex ) )
   764           mp->addGeometry( ( *vertex ).clone() );
   765           added.insert( *vertex );
   808         const QgsGeometryCollection *parts( static_cast< const QgsGeometryCollection * >( newGeom.constGet() ) );
   814         resultFeatures.reserve( parts->partCount() );
   815         for ( 
int i = 0; i < parts->partCount( ); i++ )
   819           resultFeatures.append( _f );
   824         resultFeatures.append( newF );
   829       resultFeatures.append( newF );
   832   return resultFeatures;
   841     for ( 
const auto &_f : features )
   843       resultFeatures.append( _f );
   846   return resultFeatures;
   851   QList<QgsVectorLayer *> layers;
   852   QMap<QgsVectorLayer *, QgsFeatureIds>::const_iterator i;
   853   for ( i = mDuplicatedFeatures.begin(); i != mDuplicatedFeatures.end(); ++i )
   854     layers.append( i.key() );
   860   return mDuplicatedFeatures[layer];
   865   mDuplicatedFeatures.insert( layer, ids );
   875   mGeometry( geometry ),
   876   mAttributes( attributes )
 bool isMeasure() const
Returns true if the geometry contains m values. 
 
int lookupField(const QString &fieldName) const
Looks up field's index from the field name. 
 
Class for parsing and evaluation of expressions (formerly called "search strings"). 
 
Wrapper for iterator of features from vector data provider or vector layer. 
 
QSet< QgsFeatureId > QgsFeatureIds
 
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. 
 
int size() const
Returns number of items. 
 
FieldOrigin fieldOrigin(int fieldIdx) const
Gets field's origin (value from an enumeration) 
 
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes) 
 
bool isMultipart() const
Returns true if WKB of the geometry is of WKBMulti* type. 
 
ConstraintStrength constraintStrength(Constraint constraint) const
Returns the strength of a field constraint, or ConstraintStrengthNotSet if the constraint is not pres...
 
bool isValid() const
Returns if this default value should be applied. 
 
static std::unique_ptr< QgsVectorLayerFeatureSource > getFeatureSource(QPointer< QgsVectorLayer > layer, QgsFeedback *feedback=nullptr)
Gets the feature source from a QgsVectorLayer pointer. 
 
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type. 
 
Contains mainly the QMap with QgsVectorLayer and QgsFeatureIds do list all the duplicated features...
 
QList< QgsVectorLayer * > layers() const
Returns all the layers on which features have been duplicated. 
 
QgsWkbTypes::Type wkbType() const FINAL
Returns the WKBType or WKBUnknown in case of error. 
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context. 
 
QList< QgsFeature > QgsFeatureList
 
QgsWkbTypes::Type wkbType() const
Returns type of the geometry as a WKB type (point / linestring / polygon etc.) 
 
ConstraintOrigin
Origin of 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. 
 
QgsAbstractGeometry::const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
 
QgsAbstractGeometry::const_part_iterator const_parts_begin() const
Returns STL-style const iterator pointing to the first part of the geometry. 
 
static QgsFeatureList createFeatures(const QgsVectorLayer *layer, const QgsFeaturesDataList &featuresData, QgsExpressionContext *context=nullptr)
Creates a set of new features ready for insertion into a layer. 
 
QVariant evaluate()
Evaluate the feature and return the result. 
 
QgsFeatureRequest & setSubsetOfAttributes(const QgsAttributeList &attrs)
Set a subset of attributes that will be fetched. 
 
bool convertCompatible(QVariant &v) const
Converts the provided variant to a compatible format. 
 
static std::unique_ptr< QgsGeometryCollection > createCollectionOfType(QgsWkbTypes::Type type)
Returns a new geometry collection matching a specified WKB type. 
 
Container of fields for a vector layer. 
 
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value. 
 
A geometry is the spatial representation of a feature. 
 
void setAttributes(const QgsAttributes &attrs)
Sets the feature's attributes. 
 
bool setAttribute(int field, const QVariant &attr)
Set an attribute's value by field index. 
 
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. 
 
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
 
Stores information about constraints which may be present on a field. 
 
Field comes from the underlying data provider of the vector layer (originIndex = index in provider's ...
 
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
 
static bool validateAttribute(const QgsVectorLayer *layer, const QgsFeature &feature, int attributeIndex, QStringList &errors, QgsFieldConstraints::ConstraintStrength strength=QgsFieldConstraints::ConstraintStrengthNotSet, QgsFieldConstraints::ConstraintOrigin origin=QgsFieldConstraints::ConstraintOriginNotSet)
Tests an attribute value to check whether it passes all constraints which are present on the correspo...
 
int count() const
Returns number of items. 
 
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension. 
 
static QgsFeatureIterator getValuesIterator(const QgsVectorLayer *layer, const QString &fieldOrExpression, bool &ok, bool selectedOnly)
Create a feature iterator for a specified field name or expression. 
 
Constraint was set at data provider. 
 
Field has an expression constraint set. See constraintExpression(). 
 
QgsField at(int i) const
Gets field at particular index (must be in range 0..N-1) 
 
int fieldOriginIndex(int fieldIdx) const
Gets field's origin index (its meaning is specific to each type of origin) 
 
Base class for feedback objects to be used for cancelation of something running in a worker thread...
 
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...
 
bool isEditable() const FINAL
Returns true if the provider is in editing mode. 
 
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression. 
 
Type
The WKB type describes the number of dimensions a geometry has. 
 
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. 
 
QgsFields fields() const FINAL
Returns the list of fields of this layer. 
 
Defines a relation between matching fields of the two involved tables of a relation. 
 
static void matchAttributesToFields(QgsFeature &feature, const QgsFields &fields)
Matches the attributes in feature to the specified fields. 
 
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...
 
QgsFeatureIterator getSelectedFeatures(QgsFeatureRequest request=QgsFeatureRequest()) const
Returns an iterator of the selected features. 
 
QgsFeatureRequest & setNoAttributes()
Set that no attributes will be fetched. 
 
QgsFeatureData(const QgsGeometry &geometry=QgsGeometry(), const QgsAttributeMap &attributes=QgsAttributeMap())
Constructs a new QgsFeatureData with given geometry and attributes. 
 
QString constraintDescription() const
Returns the descriptive name for the constraint expression. 
 
void initAttributes(int fieldCount)
Initialize this feature with the given number of fields. 
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
QgsAttributeMap attributes() const
Returns attributes. 
 
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. 
 
Encapsulate geometry and attributes for new features, to be passed to createFeatures. 
 
void seed(uint32_t value)
 
QMap< int, QVariant > QgsAttributeMap
 
static GeometryType geometryType(Type type)
Returns the geometry type for a WKB type, e.g., both MultiPolygon and CurvePolygon would have a Polyg...
 
This class wraps a request for features to a vector layer (or directly its vector data provider)...
 
virtual QString defaultValueClause(int fieldIndex) const
Returns any default value clauses which are present at the provider for a specified field index...
 
Reads and writes project states. 
 
QgsAttributeMap toMap() const
Returns a QgsAttributeMap of the attribute values. 
 
static QList< QgsExpressionContextScope * > globalProjectLayerScopes(const QgsMapLayer *layer)
Creates a list of three scopes: global, layer's project and layer. 
 
Abstract base class for curved geometry type. 
 
QList< QgsRelation > referencedRelations(QgsVectorLayer *layer=nullptr) const
Gets all relations where this layer is the referenced part (i.e. 
 
Encapsulate a field in an attribute table or data source. 
 
QgsRelationManager relationManager
 
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
 
static bool runOnMainThread(const Func &func, QgsFeedback *feedback=nullptr)
Guarantees that func is executed on the main thread. 
 
static QgsFeatureList makeFeaturesCompatible(const QgsFeatureList &features, const QgsVectorLayer *layer)
Converts input features to be compatible with the given layer. 
 
Partial snapshot of vector layer's state (only the members necessary for access to features) ...
 
QgsAbstractGeometry * get()
Returns a modifiable (non-const) reference to the underlying abstract geometry primitive. 
 
const QgsAbstractGeometry * constGet() const
Returns a non-modifiable (const) reference to the underlying abstract geometry primitive. 
 
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...
 
QgsGeometry geometry() const
Returns geometry. 
 
GeometryType
The geometry types are used to group QgsWkbTypes::Type in a coarse way. 
 
void setValid(bool validity)
Sets the validity of the feature. 
 
QgsDefaultValue defaultValueDefinition(int index) const
Returns the definition of the expression used when calculating the default value for a field...
 
QgsFieldConstraints constraints
 
bool convertToMultiType()
Converts single type geometry into multitype geometry e.g. 
 
bool isCanceled() const
Tells whether the operation has been canceled already. 
 
QSet< QVariant > uniqueValues(int fieldIndex, int limit=-1) const FINAL
Calculates a list of unique values contained within an attribute in the layer. 
 
ConstraintStrength
Strength of constraints. 
 
static QgsFeature duplicateFeature(QgsVectorLayer *layer, const QgsFeature &feature, QgsProject *project, int depth, QgsDuplicateFeatureContext &duplicateFeatureContext)
Duplicates a feature and it's children (one level deep). 
 
static bool isCurvedType(Type type)
Returns true if the WKB type is a curved type or can contain curved geometries. 
 
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value. 
 
QgsFeatureIds duplicatedFeatures(QgsVectorLayer *layer) const
Returns the duplicated features in the given layer. 
 
void setGeometry(const QgsGeometry &geometry)
Set the feature's geometry. 
 
bool addFeature(QgsFeature &feature, QgsFeatureSink::Flags flags=nullptr) FINAL
Adds a single feature to the sink. 
 
QgsFeatureRequest & setLimit(long limit)
Set the maximum number of features to request. 
 
bool isEmpty() const
Checks whether the container is empty. 
 
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Query the layer for features specified in request. 
 
static bool hasM(Type type)
Tests whether a WKB type contains m values. 
 
ConstraintOrigin constraintOrigin(Constraint constraint) const
Returns the origin of a field constraint, or ConstraintOriginNotSet if the constraint is not present ...
 
void appendScopes(const QList< QgsExpressionContextScope *> &scopes)
Appends a list of scopes to the end of the context. 
 
QgsWkbTypes::GeometryType type
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be null. 
 
QList< int > QgsAttributeList
 
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry. 
 
bool nextFeature(QgsFeature &f)
 
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required...
 
QString constraintExpression() const
Returns the constraint expression for the field, if set. 
 
static QgsFeatureList makeFeatureCompatible(const QgsFeature &feature, const QgsVectorLayer *layer)
Converts input feature to be compatible with the given layer. 
 
Geometry is not required. It may still be returned if e.g. required for a filter condition. 
 
QVariant maximumValue(int index) const FINAL
Returns the maximum value for an attribute column or an invalid variant in case of error...
 
Represents a vector layer which manages a vector based data sets. 
 
QVariant attribute(const QString &name) const
Lookup attribute value from attribute name. 
 
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves. 
 
bool is3D() const
Returns true if the geometry is 3D and contains a z-value. 
 
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry. 
 
Fix relation, related elements are part of the parent and a parent copy will copy any children or del...
 
QList< QgsVectorLayerUtils::QgsFeatureData > QgsFeaturesDataList
Alias for list of QgsFeatureData. 
 
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched. 
 
QVariant defaultValue(int index, const QgsFeature &feature=QgsFeature(), QgsExpressionContext *context=nullptr) const
Returns the calculated default value for the specified field index. 
 
Field must have a unique value. 
 
virtual QVariant defaultValue(int fieldIndex) const
Returns any literal default values which are present at the provider for a specified field index...