15#ifndef QGSFEATUREEXPRESSIONVALUESGATHERER_H
16#define QGSFEATUREEXPRESSIONVALUESGATHERER_H
38class QgsFeatureExpressionValuesGatherer:
public QThread
52 const QString &displayExpression = QString(),
54 const QStringList &identifierFields = QStringList() )
56 , mDisplayExpression( displayExpression.isEmpty() ? layer->
displayExpression() : displayExpression )
59 , mIdentifierFields( identifierFields )
64 const QString &displayExpression = QString(),
65 const QString &orderExpression = QString(),
67 const QStringList &identifierFields = QStringList() )
69 , mDisplayExpression( displayExpression.isEmpty() ? layer->
displayExpression() : displayExpression )
70 , mOrderExpression( orderExpression.isEmpty() ? displayExpression.isEmpty() ? layer->
displayExpression() : displayExpression : orderExpression )
73 , mIdentifierFields( identifierFields )
81 Entry(
const QVariantList &_identifierFields,
const QString &_value,
const QString &_orderValue,
const QgsFeature &_feature )
82 : identifierFields( _identifierFields )
85 , orderValue( _orderValue )
89 Entry(
const QVariantList &_identifierFields,
const QString &_value,
const QgsFeature &_feature )
90 : identifierFields( _identifierFields )
97 : featureId( _featureId )
102 QVariantList identifierFields;
108 bool operator()(
const Entry &lhs,
const Entry &rhs )
const;
118 mWasCanceled =
false;
122 mDisplayExpression.prepare( &mExpressionContext );
123 mOrderExpression.prepare( &mExpressionContext );
126 QList<int> attributeIndexes;
127 for (
auto it = mIdentifierFields.constBegin(); it != mIdentifierFields.constEnd(); ++it )
128 attributeIndexes << mSource->fields().indexOf( *it );
132 mExpressionContext.setFeature( feature );
133 QVariantList attributes;
134 for (
const int idx : attributeIndexes )
137 const QString expressionValue = mDisplayExpression.evaluate( &mExpressionContext ).toString();
138 const QString orderValue = mOrderExpression.evaluate( &mExpressionContext ).toString();
140 mEntries.append( Entry( attributes, expressionValue, orderValue, feature ) );
142 const QMutexLocker locker( &mCancelMutex );
151 const QMutexLocker locker( &mCancelMutex );
156 bool wasCanceled()
const
158 const QMutexLocker locker( &mCancelMutex );
162 QVector<Entry> entries()
const
175 QVariant data()
const
183 void setData(
const QVariant &data )
189 QVector<Entry> mEntries;
192 std::unique_ptr<QgsVectorLayerFeatureSource> mSource;
197 bool mWasCanceled =
false;
198 mutable QMutex mCancelMutex;
199 QStringList mIdentifierFields;
static QString nullRepresentation()
Returns the string used to represent the value NULL throughout QGIS.
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...
Handles parsing and evaluation of expressions (formerly called "search strings").
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.
Wraps a request for features to a vector layer (or directly its vector data provider).
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
bool isValid() const
Returns the validity of this feature.
Q_INVOKABLE QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Container of fields for a vector layer.
Partial snapshot of vector layer's state (only the members necessary for access to features).
Represents a vector layer which manages a vector based dataset.
QString displayExpression
qint64 QgsFeatureId
64 bit feature ids negative numbers are used for uncommitted/newly added features