QGIS/python/core/qgsaggregatecalculator.sip
Nyall Dawson 307aabd66a [FEATURE] Aggregates for expressions
This commit adds a number of different forms of aggregates to
the expression engine.

1. Aggregates within the current layer, eg sum("passengers")
Supports sub expressions (ie sum("passengers"/2) ), group by
( sum("passengers", group_by:="line_segment") ), and optional
filters ( sum("passengers", filter:= "station_class" > 3 ) )

2. Relational aggregates, which calculate an aggregate over
all matching child features from a relation, eg
relation_aggregate( 'my_relation', 'mean', "some_child_field" )

3. A summary aggregate function, for calculating aggregates
on other layers. Eg aggregate('rail_station_layer','sum',"passengers")
The summary aggregate function supports an optional filter,
making it possible to calculate things like:

aggregate('rail_stations','sum',"passengers",
  intersects(@atlas_geometry, $geometry ) )

for calculating the total number of passengers for the stations
inside the current atlas feature

In all cases the calculations are cached inside the expression
context, so they only need to be calculated once for each
set of expression evaluations.

Sponsored by Kanton of Zug, Switzerland
2016-05-17 10:53:25 +10:00

115 lines
4.5 KiB
Plaintext

/** \ingroup core
* \class QgsAggregateCalculator
* \brief Utility class for calculating aggregates for a field (or expression) over the features
* from a vector layer. It is recommended that QgsVectorLayer::aggregate() is used rather then
* directly using this class, as the QgsVectorLayer method can handle delegating aggregate calculation
* to a data provider for remote calculation.
* \note added in QGIS 2.16
*/
class QgsAggregateCalculator
{
%TypeHeaderCode
#include <qgsaggregatecalculator.h>
%End
public:
//! Available aggregates to calculate. Not all aggregates are available for all field
//! types.
enum Aggregate
{
Count, //!< Count
CountDistinct, //!< Number of distinct values
CountMissing, //!< Number of missing (null) values
Min, //!< Min of values
Max, //!< Max of values
Sum, //!< Sum of values
Mean, //!< Mean of values (numeric fields only)
Median, //!< Median of values (numeric fields only)
StDev, //!< Standard deviation of values (numeric fields only)
StDevSample, //!< Sample standard deviation of values (numeric fields only)
Range, //!< Range of values (max - min) (numeric and datetime fields only)
Minority, //!< Minority of values (numeric fields only)
Majority, //!< Majority of values (numeric fields only)
FirstQuartile, //!< First quartile (numeric fields only)
ThirdQuartile, //!< Third quartile (numeric fields only)
InterQuartileRange, //!< Inter quartile range (IQR) (numeric fields only)
StringMinimumLength, //!< Minimum length of string (string fields only)
StringMaximumLength, //!< Maximum length of string (string fields only)
StringConcatenate, //! Concatenate values with a joining string (string fields only). Specify the delimiter using setDelimiter().
};
//! A bundle of parameters controlling aggregate calculation
struct AggregateParameters
{
/** Optional filter for calculating aggregate over a subset of features, or an
* empty string to use all features.
* @see QgsAggregateCalculator::setFilter()
* @see QgsAggregateCalculator::filter()
*/
QString filter;
/** Delimiter to use for joining values with the StringConcatenate aggregate.
* @see QgsAggregateCalculator::setDelimiter()
* @see QgsAggregateCalculator::delimiter()
*/
QString delimiter;
};
/** Constructor for QgsAggregateCalculator.
* @param layer vector layer to calculate aggregate from
*/
QgsAggregateCalculator( QgsVectorLayer* layer );
/** Returns the associated vector layer.
*/
QgsVectorLayer* layer() const;
/** Sets all aggregate parameters from a parameter bundle.
* @param parameters aggregate parameters
*/
void setParameters( const AggregateParameters& parameters );
/** Sets a filter to limit the features used during the aggregate calculation.
* @param filterExpression expression for filtering features, or empty string to remove filter
* @see filter()
*/
void setFilter( const QString& filterExpression );
/** Returns the filter which limits the features used during the aggregate calculation.
* @see setFilter()
*/
QString filter() const;
/** Sets the delimiter to use for joining values with the StringConcatenate aggregate.
* @param delimiter string delimiter
* @see delimiter()
*/
void setDelimiter( const QString& delimiter );
/** Returns the delimiter used for joining values with the StringConcatenate aggregate.
* @see setDelimiter()
*/
QString delimiter() const;
/** Calculates the value of an aggregate.
* @param aggregate aggregate to calculate
* @param fieldOrExpression source field or expression to use as basis for aggregated values.
* If an expression is used, then the context parameter must be set.
* @param context expression context for evaluating expressions
* @param ok if specified, will be set to true if aggregate calculation was successful
* @returns calculated aggregate value
*/
QVariant calculate( Aggregate aggregate, const QString& fieldOrExpression,
QgsExpressionContext* context = nullptr, bool* ok = nullptr ) const;
/** Converts a string to a aggregate type.
* @param string string to convert
* @param ok if specified, will be set to true if conversion was successful
* @returns aggregate type
*/
static Aggregate stringToAggregate( const QString& string, bool* ok = nullptr );
};