41 mFilterExpression = parameters.
filter;
65 context = context ? context : &defaultContext;
67 std::unique_ptr<QgsExpression> expression;
77 if ( expression->hasParserError() || !expression->prepare( context ) )
79 mLastError = !expression->parserErrorString().isEmpty() ? expression->parserErrorString() : expression->evalErrorString();
88 lst = expression->referencedColumns();
90 request.
setFlags( ( expression && expression->needsGeometry() ) ?
93 .setSubsetOfAttributes( lst, mLayer->
fields() );
98 if ( !mOrderBy.empty() )
101 if ( !mFilterExpression.isEmpty() )
109 QVariant::Type resultType = QVariant::Double;
116 resultType = QVariant::UserType;
121 bool foundFeatures =
false;
123 if ( !foundFeatures )
127 return defaultValue( aggregate );
130 resultType = std::get<0>( returnType );
131 userType = std::get<1>( returnType );
132 if ( resultType == QVariant::Invalid )
176 resultType = v.type();
177 userType = v.userType();
185 return calculate( aggregate, fit, resultType, userType, attrNum, expression.get(), mDelimiter, context, ok, &mLastError );
190 const QString normalized =
string.trimmed().toLower();
195 if ( normalized == QLatin1String(
"count" ) )
197 else if ( normalized == QLatin1String(
"count_distinct" ) )
199 else if ( normalized == QLatin1String(
"count_missing" ) )
201 else if ( normalized == QLatin1String(
"min" ) )
203 else if ( normalized == QLatin1String(
"max" ) )
205 else if ( normalized == QLatin1String(
"sum" ) )
207 else if ( normalized == QLatin1String(
"mean" ) )
209 else if ( normalized == QLatin1String(
"median" ) )
211 else if ( normalized == QLatin1String(
"stdev" ) )
213 else if ( normalized == QLatin1String(
"stdevsample" ) )
215 else if ( normalized == QLatin1String(
"range" ) )
217 else if ( normalized == QLatin1String(
"minority" ) )
219 else if ( normalized == QLatin1String(
"majority" ) )
221 else if ( normalized == QLatin1String(
"q1" ) )
223 else if ( normalized == QLatin1String(
"q3" ) )
225 else if ( normalized == QLatin1String(
"iqr" ) )
227 else if ( normalized == QLatin1String(
"min_length" ) )
229 else if ( normalized == QLatin1String(
"max_length" ) )
231 else if ( normalized == QLatin1String(
"concatenate" ) )
233 else if ( normalized == QLatin1String(
"concatenate_unique" ) )
235 else if ( normalized == QLatin1String(
"collect" ) )
237 else if ( normalized == QLatin1String(
"array_agg" ) )
251 return QObject::tr(
"count" );
253 return QObject::tr(
"count distinct" );
255 return QObject::tr(
"count missing" );
257 return QObject::tr(
"minimum" );
259 return QObject::tr(
"maximum" );
261 return QObject::tr(
"sum" );
263 return QObject::tr(
"mean" );
265 return QObject::tr(
"median" );
267 return QObject::tr(
"standard deviation" );
269 return QObject::tr(
"standard deviation (sample)" );
271 return QObject::tr(
"range" );
273 return QObject::tr(
"minority" );
275 return QObject::tr(
"majority" );
277 return QObject::tr(
"first quartile" );
279 return QObject::tr(
"third quartile" );
281 return QObject::tr(
"inter quartile range" );
283 return QObject::tr(
"minimum length" );
285 return QObject::tr(
"maximum length" );
287 return QObject::tr(
"concatenate" );
289 return QObject::tr(
"collection" );
291 return QObject::tr(
"array aggregate" );
293 return QObject::tr(
"concatenate (unique)" );
304 QStringLiteral(
"count" ),
305 QCoreApplication::tr(
"Count" ),
306 QSet<QVariant::Type>()
307 << QVariant::DateTime
311 << QVariant::LongLong
312 << QVariant::ULongLong
317 QStringLiteral(
"count_distinct" ),
318 QCoreApplication::tr(
"Count Distinct" ),
319 QSet<QVariant::Type>()
320 << QVariant::DateTime
324 << QVariant::LongLong
325 << QVariant::ULongLong
330 QStringLiteral(
"count_missing" ),
331 QCoreApplication::tr(
"Count Missing" ),
332 QSet<QVariant::Type>()
333 << QVariant::DateTime
337 << QVariant::LongLong
342 QStringLiteral(
"min" ),
343 QCoreApplication::tr(
"Min" ),
344 QSet<QVariant::Type>()
345 << QVariant::DateTime
349 << QVariant::LongLong
350 << QVariant::ULongLong
356 QStringLiteral(
"max" ),
357 QCoreApplication::tr(
"Max" ),
358 QSet<QVariant::Type>()
359 << QVariant::DateTime
363 << QVariant::LongLong
364 << QVariant::ULongLong
370 QStringLiteral(
"sum" ),
371 QCoreApplication::tr(
"Sum" ),
372 QSet<QVariant::Type>()
375 << QVariant::LongLong
376 << QVariant::ULongLong
381 QStringLiteral(
"mean" ),
382 QCoreApplication::tr(
"Mean" ),
383 QSet<QVariant::Type>()
386 << QVariant::LongLong
387 << QVariant::ULongLong
392 QStringLiteral(
"median" ),
393 QCoreApplication::tr(
"Median" ),
394 QSet<QVariant::Type>()
401 QStringLiteral(
"stdev" ),
402 QCoreApplication::tr(
"Stdev" ),
403 QSet<QVariant::Type>()
406 << QVariant::LongLong
407 << QVariant::ULongLong
412 QStringLiteral(
"stdevsample" ),
413 QCoreApplication::tr(
"Stdev Sample" ),
414 QSet<QVariant::Type>()
417 << QVariant::LongLong
418 << QVariant::ULongLong
423 QStringLiteral(
"range" ),
424 QCoreApplication::tr(
"Range" ),
425 QSet<QVariant::Type>()
427 << QVariant::DateTime
430 << QVariant::LongLong
431 << QVariant::ULongLong
436 QStringLiteral(
"minority" ),
437 QCoreApplication::tr(
"Minority" ),
438 QSet<QVariant::Type>()
441 << QVariant::LongLong
442 << QVariant::ULongLong
448 QStringLiteral(
"majority" ),
449 QCoreApplication::tr(
"Majority" ),
450 QSet<QVariant::Type>()
453 << QVariant::LongLong
454 << QVariant::ULongLong
460 QStringLiteral(
"q1" ),
461 QCoreApplication::tr(
"Q1" ),
462 QSet<QVariant::Type>()
465 << QVariant::LongLong
466 << QVariant::ULongLong
471 QStringLiteral(
"q3" ),
472 QCoreApplication::tr(
"Q3" ),
473 QSet<QVariant::Type>()
476 << QVariant::LongLong
477 << QVariant::ULongLong
482 QStringLiteral(
"iqr" ),
483 QCoreApplication::tr(
"InterQuartileRange" ),
484 QSet<QVariant::Type>()
487 << QVariant::LongLong
488 << QVariant::ULongLong
493 QStringLiteral(
"min_length" ),
494 QCoreApplication::tr(
"Min Length" ),
495 QSet<QVariant::Type>()
500 QStringLiteral(
"max_length" ),
501 QCoreApplication::tr(
"Max Length" ),
502 QSet<QVariant::Type>()
507 QStringLiteral(
"concatenate" ),
508 QCoreApplication::tr(
"Concatenate" ),
509 QSet<QVariant::Type>()
514 QStringLiteral(
"collect" ),
515 QCoreApplication::tr(
"Collect" ),
516 QSet<QVariant::Type>()
520 QStringLiteral(
"array_agg" ),
521 QCoreApplication::tr(
"Array Aggregate" ),
522 QSet<QVariant::Type>()
538 return calculateArrayAggregate( fit, attr, expression, context );
541 switch ( resultType )
545 case QVariant::LongLong:
546 case QVariant::ULongLong:
547 case QVariant::Double:
554 *error = expression ? QObject::tr(
"Cannot calculate %1 on numeric values" ).arg(
displayName( aggregate ) )
555 : QObject::tr(
"Cannot calculate %1 on numeric fields" ).arg(
displayName( aggregate ) );
561 return calculateNumericAggregate( fit, attr, expression, context, stat );
565 case QVariant::DateTime:
572 *error = ( expression ? QObject::tr(
"Cannot calculate %1 on %2 values" ).arg(
displayName( aggregate ) ) :
573 QObject::tr(
"Cannot calculate %1 on %2 fields" ).arg(
displayName( aggregate ) ) ).arg( resultType == QVariant::Date ? QObject::tr(
"date" ) : QObject::tr(
"datetime" ) );
579 return calculateDateTimeAggregate( fit, attr, expression, context, stat );
582 case QVariant::UserType:
588 return calculateGeometryAggregate( fit, expression, context );
604 return concatenateStrings( fit, attr, expression, context,
delimiter );
611 return concatenateStrings( fit, attr, expression, context,
delimiter,
true );
619 if ( resultType == QVariant::Invalid )
620 typeString = QObject::tr(
"null" );
621 else if ( resultType == QVariant::UserType )
622 typeString = QMetaType::typeName( userType );
624 typeString = resultType == QVariant::String ? QObject::tr(
"string" ) : QVariant::typeToName( resultType );
627 *error = expression ? QObject::tr(
"Cannot calculate %1 on %3 values" ).arg(
displayName( aggregate ), typeString )
628 : QObject::tr(
"Cannot calculate %1 on %3 fields" ).arg(
displayName( aggregate ), typeString );
634 return calculateStringAggregate( fit, attr, expression, context, stat );
802 Q_ASSERT( expression || attr >= 0 );
813 const QVariant v = expression->
evaluate( context );
822 const double val = s.statistic( stat );
823 return std::isnan( val ) ? QVariant() : val;
829 Q_ASSERT( expression || attr >= 0 );
840 const QVariant v = expression->
evaluate( context );
849 return s.statistic( stat );
854 Q_ASSERT( expression );
857 QVector< QgsGeometry > geometries;
862 const QVariant v = expression->
evaluate( context );
863 if ( v.userType() == QMetaType::type(
"QgsGeometry" ) )
875 Q_ASSERT( expression || attr >= 0 );
886 const QVariant v = expression->
evaluate( context );
887 result = v.toString();
894 if ( !unique || !results.contains( result ) )
917 return QVariantList();
944 Q_ASSERT( expression || attr >= 0 );
955 const QVariant v = expression->
evaluate( context );
964 return s.statistic( stat );
970 Q_ASSERT( expression || attr >= 0 );
982 const QVariant v = expression->
evaluate( context );
const QgsVectorLayer * layer() const
Returns the associated vector layer.
void setParameters(const AggregateParameters ¶meters)
Sets all aggregate parameters from a parameter bundle.
void setFidsFilter(const QgsFeatureIds &fids)
Sets a filter to limit the features used during the aggregate calculation.
Aggregate
Available aggregates to calculate.
@ StringConcatenateUnique
Concatenate unique values with a joining string (string fields only). Specify the delimiter using set...
@ StDev
Standard deviation of values (numeric fields only)
@ StringMaximumLength
Maximum length of string (string fields only)
@ ThirdQuartile
Third quartile (numeric fields only)
@ Range
Range of values (max - min) (numeric and datetime fields only)
@ ArrayAggregate
Create an array of values.
@ InterQuartileRange
Inter quartile range (IQR) (numeric fields only)
@ FirstQuartile
First quartile (numeric fields only)
@ Median
Median of values (numeric fields only)
@ GeometryCollect
Create a multipart geometry from aggregated geometries.
@ CountMissing
Number of missing (null) values.
@ StDevSample
Sample standard deviation of values (numeric fields only)
@ Majority
Majority of values.
@ StringConcatenate
Concatenate values with a joining string (string fields only). Specify the delimiter using setDelimit...
@ Mean
Mean of values (numeric fields only)
@ StringMinimumLength
Minimum length of string (string fields only)
@ CountDistinct
Number of distinct values.
@ Minority
Minority of values.
static QList< QgsAggregateCalculator::AggregateInfo > aggregates()
Structured information for available aggregates.
QString delimiter() const
Returns the delimiter used for joining values with the StringConcatenate aggregate.
static Aggregate stringToAggregate(const QString &string, bool *ok=nullptr)
Converts a string to a aggregate type.
QVariant calculate(Aggregate aggregate, const QString &fieldOrExpression, QgsExpressionContext *context=nullptr, bool *ok=nullptr, QgsFeedback *feedback=nullptr) const
Calculates the value of an aggregate.
static QString displayName(Aggregate aggregate)
Returns the friendly display name for a aggregate.
QgsAggregateCalculator(const QgsVectorLayer *layer)
Constructor for QgsAggregateCalculator.
Calculator for summary statistics and aggregates for a list of datetimes.
Statistic
Enumeration of flags that specify statistics to be calculated.
@ Min
Minimum (earliest) datetime value.
@ Max
Maximum (latest) datetime value.
@ CountDistinct
Number of distinct datetime values.
@ Range
Interval between earliest and latest datetime value.
@ CountMissing
Number of missing (null) values.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly by the expression to check if evaluation sh...
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
static std::tuple< QVariant::Type, int > determineResultType(const QString &expression, const QgsVectorLayer *layer, QgsFeatureRequest request=QgsFeatureRequest(), QgsExpressionContext context=QgsExpressionContext(), bool *foundFeatures=nullptr)
Returns a value type and user type for a given expression.
Class for parsing and evaluation of expressions (formerly called "search strings").
static int expressionToLayerFieldIndex(const QString &expression, const QgsVectorLayer *layer)
Attempts to resolve an expression to a field index from the given layer.
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)
This class wraps a request for features to a vector layer (or directly its vector data provider).
QgsFeatureRequest & setFilterFids(const QgsFeatureIds &fids)
Sets the feature IDs that should be fetched.
QgsFeatureRequest & setFlags(QgsFeatureRequest::Flags flags)
Sets flags that affect how features will be fetched.
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
void setFeedback(QgsFeedback *feedback)
Attach a feedback object that can be queried regularly by the iterator to check if it should be cance...
@ NoGeometry
Geometry is not required. It may still be returned if e.g. required for a filter condition.
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
QgsFeatureRequest & setOrderBy(const OrderBy &orderBy)
Set a list of order by clauses.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
QVariant attribute(const QString &name) const
Lookup attribute value by attribute name.
Base class for feedback objects to be used for cancellation of something running in a worker thread.
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
A geometry is the spatial representation of a feature.
static QgsGeometry collectGeometry(const QVector< QgsGeometry > &geometries)
Creates a new multipart geometry from a list of QgsGeometry objects.
Calculator for summary statistics for a list of doubles.
Statistic
Enumeration of flags that specify statistics to be calculated.
@ InterQuartileRange
Inter quartile range (IQR)
@ Median
Median of values.
@ Variety
Variety (count of distinct) values.
@ Minority
Minority of values.
@ ThirdQuartile
Third quartile.
@ Majority
Majority of values.
@ CountMissing
Number of missing (null) values.
@ Range
Range of values (max - min)
@ StDevSample
Sample standard deviation of values.
@ FirstQuartile
First quartile.
@ StDev
Standard deviation of values.
Calculator for summary statistics and aggregates for a list of strings.
Statistic
Enumeration of flags that specify statistics to be calculated.
@ Majority
Majority of strings.
@ Max
Maximum string value.
@ Minority
Minority of strings.
@ MaximumLength
Maximum length of string.
@ MinimumLength
Minimum length of string.
@ CountDistinct
Number of distinct string values.
@ CountMissing
Number of missing (null) values.
@ Min
Minimum string value.
Represents a vector layer which manages a vector based data sets.
QgsFeatureIterator getFeatures(const QgsFeatureRequest &request=QgsFeatureRequest()) const FINAL
Queries the layer for features specified in request.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsExpressionContext createExpressionContext() const FINAL
This method needs to be reimplemented in all classes which implement this interface and return an exp...
QSet< QgsFeatureId > QgsFeatureIds
Structured information about the available aggregates.
A bundle of parameters controlling aggregate calculation.
QString filter
Optional filter for calculating aggregate over a subset of features, or an empty string to use all fe...
QString delimiter
Delimiter to use for joining values with the StringConcatenate aggregate.
QgsFeatureRequest::OrderBy orderBy
Optional order by clauses.