QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
qgsexpression.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsexpression.h
3 -------------------
4 begin : August 2011
5 copyright : (C) 2011 Martin Dobias
6 email : wonder.sk at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
16#ifndef QGSEXPRESSION_H
17#define QGSEXPRESSION_H
18
19#include <functional>
20
21#include "qgis.h"
22#include "qgis_core.h"
23#include "qgsexpressionnode.h"
24#include "qgsinterval.h"
25
26#include <QCoreApplication>
27#include <QDomDocument>
28#include <QList>
29#include <QMetaType>
30#include <QRecursiveMutex>
31#include <QSet>
32#include <QString>
33#include <QStringList>
34#include <QVariant>
35
36using namespace Qt::StringLiterals;
37
38class QgsFeature;
39class QgsGeometry;
40class QgsOgcUtils;
41class QgsVectorLayer;
43class QgsField;
44class QgsFields;
45class QgsDistanceArea;
46class QDomElement;
48class QgsExpressionPrivate;
50
51#ifndef SIP_RUN
53struct HelpArg
54{
55 HelpArg( const QString &arg, const QString &desc, bool descOnly = false, bool syntaxOnly = false, bool optional = false, const QString &defaultVal = QString() )
56 : mArg( arg )
57 , mDescription( desc )
58 , mDescOnly( descOnly )
59 , mSyntaxOnly( syntaxOnly )
60 , mOptional( optional )
61 , mDefaultVal( defaultVal )
62 {}
63
64 QString mArg;
65 QString mDescription;
66 bool mDescOnly;
67 bool mSyntaxOnly;
68 bool mOptional;
69 QString mDefaultVal;
70};
71
72struct HelpExample
73{
74 HelpExample( const QString &expression, const QString &returns, const QString &note = QString() )
75 : mExpression( expression )
76 , mReturns( returns )
77 , mNote( note )
78 {}
79
80 QString mExpression;
81 QString mReturns;
82 QString mNote;
83};
84
85
86struct HelpVariant
87{
88 HelpVariant(
89 const QString &name,
90 const QString &description,
91 const QList<HelpArg> &arguments = QList<HelpArg>(),
92 bool variableLenArguments = false,
93 const QList<HelpExample> &examples = QList<HelpExample>(),
94 const QString &notes = QString(),
95 const QStringList &tags = QStringList()
96 )
97 : mName( name )
98 , mDescription( description )
99 , mArguments( arguments )
100 , mVariableLenArguments( variableLenArguments )
101 , mExamples( examples )
102 , mNotes( notes )
103 , mTags( tags )
104 {}
105
106 QString mName;
107 QString mDescription;
108 QList<HelpArg> mArguments;
109 bool mVariableLenArguments;
110 QList<HelpExample> mExamples;
111 QString mNotes;
112 QStringList mTags;
113};
114
115
116struct Help
117{
118 Help() = default;
119
120 Help( const QString &name, const QString &type, const QString &description, const QList<HelpVariant> &variants )
121 : mName( name )
122 , mType( type )
123 , mDescription( description )
124 , mVariants( variants )
125 {}
126
127 QString mName;
128 QString mType;
129 QString mDescription;
130 QList<HelpVariant> mVariants;
131};
132
133typedef QHash<QString, Help> HelpTextHash;
134
136#endif
137
194class CORE_EXPORT QgsExpression
195{
196 Q_DECLARE_TR_FUNCTIONS( QgsExpression )
197 public:
244
251 QgsExpression( const QString &expr );
252
258 QgsExpression( const QgsExpression &other );
259
265 QgsExpression &operator=( const QgsExpression &other );
266
271 operator QString() const SIP_SKIP;
272
278
279 ~QgsExpression();
280
286 bool operator==( const QgsExpression &other ) const;
287
293 bool isValid() const;
294
296 bool hasParserError() const;
298 QString parserErrorString() const;
299
303 QList<QgsExpression::ParserError> parserErrors() const;
304
310 const QgsExpressionNode *rootNode() const;
311
316 bool prepare( const QgsExpressionContext *context );
317
335 QSet<QString> referencedColumns() const;
336
347 QSet<QString> referencedVariables() const;
348
358 QSet<QString> referencedFunctions() const;
359
360#ifndef SIP_RUN
361
368 QList<const QgsExpressionNode *> nodes() const;
369
376 template<class T> QList<const T *> findNodes() const
377 {
378 QList<const T *> lst;
379 const QList<const QgsExpressionNode *> allNodes( nodes() );
380 for ( const auto &node : allNodes )
381 {
382 const T *n = dynamic_cast<const T *>( node );
383 if ( n )
384 lst << n;
385 }
386 return lst;
387 }
388#endif
389
402 QSet<int> referencedAttributeIndexes( const QgsFields &fields ) const;
403
405 bool needsGeometry() const;
406
407 // evaluation
408
413 QVariant evaluate();
414
420 QVariant evaluate( const QgsExpressionContext *context );
421
423 bool hasEvalError() const;
425 QString evalErrorString() const;
427 void setEvalErrorString( const QString &str );
428
434 bool isField() const;
435
448 static int expressionToLayerFieldIndex( const QString &expression, const QgsVectorLayer *layer );
449
462 static QString quoteFieldExpression( const QString &expression, const QgsVectorLayer *layer );
463
471 static bool checkExpression( const QString &text, const QgsExpressionContext *context, QString &errorMessage SIP_OUT );
472
477 void setExpression( const QString &expression );
478
484 QString expression() const;
485
492 QString dump() const;
493
501 QgsDistanceArea *geomCalculator();
502
516 void setGeomCalculator( const QgsDistanceArea *calc );
517
524 Qgis::DistanceUnit distanceUnits() const;
525
534 void setDistanceUnits( Qgis::DistanceUnit unit );
535
542 Qgis::AreaUnit areaUnits() const;
543
552 void setAreaUnits( Qgis::AreaUnit unit );
553
564 static QString replaceExpressionText( const QString &action, const QgsExpressionContext *context, const QgsDistanceArea *distanceArea = nullptr );
565
573 static QSet<QString> referencedVariables( const QString &text );
574
584 static double evaluateToDouble( const QString &text, double fallbackValue );
585
598
599 static const QList<QgsExpressionFunction *> &Functions();
600
601 static const QStringList &BuiltinFunctions();
602
610 static bool registerFunction( QgsExpressionFunction *function, bool transferOwnership = false );
611
617 static bool unregisterFunction( const QString &name );
618
622 static void cleanRegisteredFunctions();
623
625 static bool isFunctionName( const QString &name );
626
628 static int functionIndex( const QString &name );
629
634 static int functionCount();
635
641 static QString quotedColumnRef( QString name );
642
648 static QString quotedString( QString text );
649
657 static QString quotedValue( const QVariant &value );
658
667 static QString quotedValue( const QVariant &value, QMetaType::Type type );
668
678 Q_DECL_DEPRECATED static QString quotedValue( const QVariant &value, QVariant::Type type ) SIP_DEPRECATED;
679
681
682#ifndef SIP_RUN
684 static HelpTextHash &functionHelpTexts();
686#endif
687
694 static QString helpText( QString name );
695
701 static QStringList tags( const QString &name );
702
715 static bool addVariableHelpText( const QString name, const QString &description );
716
723 static QString variableHelpText( const QString &variableName );
724
733 static QString formatVariableHelp( const QString &description, bool showValue = true, const QVariant &value = QVariant() );
734
739 static QString group( const QString &group );
740
749 static QString formatPreviewString( const QVariant &value, bool htmlOutput = true, int maximumPreviewLength = 60 );
750
759 static QString createFieldEqualityExpression( const QString &fieldName, const QVariant &value, QMetaType::Type fieldType = QMetaType::Type::UnknownType );
760
770 Q_DECL_DEPRECATED static QString createFieldEqualityExpression( const QString &fieldName, const QVariant &value, QVariant::Type fieldType ) SIP_DEPRECATED;
771
782 static bool isFieldEqualityExpression( const QString &expression, QString &field SIP_OUT, QVariant &value SIP_OUT );
783
798 static bool attemptReduceToInClause( const QStringList &expressions, QString &result SIP_OUT );
799
800 // clang-format off
801#ifdef SIP_RUN
802 SIP_PYOBJECT __repr__();
803 % MethodCode
804 QString str = u"<QgsExpression: '%1'>"_s.arg( sipCpp->expression() );
805 sipRes = PyUnicode_FromString( str.toUtf8().constData() );
806 % End
807#endif
808
809 private:
810 // clang-format on
811
812 void initGeomCalculator( const QgsExpressionContext *context );
813
820 void detach() SIP_SKIP;
821
822 QgsExpressionPrivate *d = nullptr;
823
824 static HelpTextHash sFunctionHelpTexts;
825
827 static void initFunctionHelp() SIP_SKIP;
829 static void buildFunctionHelp() SIP_SKIP;
831 static void initVariableHelp() SIP_SKIP;
833 static void buildVariableHelp() SIP_SKIP;
834
836 static QRecursiveMutex sFunctionsMutex;
837 static QMap< QString, int> sFunctionIndexMap;
838
839 friend class QgsOgcUtils;
840};
841
843
844#endif // QGSEXPRESSION_H
DistanceUnit
Units of distance.
Definition qgis.h:5170
AreaUnit
Units of area.
Definition qgis.h:5247
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
An abstract base class for defining QgsExpression functions.
Abstract base class for all nodes that can appear in an expression.
bool prepare(const QgsExpressionContext *context)
Gets the expression ready for evaluation - find out column indexes.
QgsExpression & operator=(const QgsExpression &other)
Create a copy of this expression.
friend class QgsOgcUtils
QList< const T * > findNodes() const
Returns a list of all nodes of the given class which are used in this expression.
QList< const QgsExpressionNode * > nodes() const
Returns a list of all nodes which are used in this expression.
QSet< QString > referencedVariables() const
Returns a list of all variables which are used in this expression.
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
QList< QgsExpression::ParserError > parserErrors() const
Returns parser error details including location of error.
QString parserErrorString() const
Returns parser error.
QSet< QString > referencedColumns() const
Gets list of columns referenced by the expression.
QSet< QString > referencedFunctions() const
Returns a list of the names of all functions which are used in this expression.
friend class QgsExpressionNodeFunction
const QgsExpressionNode * rootNode() const
Returns the root node of the expression.
QgsExpression(const QString &expr)
Creates a new expression based on the provided string.
bool isValid() const
Checks if this expression is valid.
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
Definition qgsfeature.h:60
Encapsulate a field in an attribute table or data source.
Definition qgsfield.h:56
Container of fields for a vector layer.
Definition qgsfields.h:46
A geometry is the spatial representation of a feature.
Provides various utility functions for conversion between OGC (Open Geospatial Consortium) standards ...
Definition qgsogcutils.h:56
Base class for vector data providers.
Represents a vector layer which manages a vector based dataset.
#define SIP_DEPRECATED
Definition qgis_sip.h:113
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_OUT
Definition qgis_sip.h:57
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
QString formatVariableHelp(const QString &variable, const QString &description, bool showValue, const QVariant &value)
Returns a HTML formatted string for use as a variable item help.
Details about any parser errors that were found when parsing the expression.
QgsExpression::ParserError::ParserErrorType errorType
The type of parser error that was found.
int lastColumn
The last column that contained the error in the parser.
int lastLine
The last line that contained the error in the parser.
int firstColumn
The first column that contained the error in the parser.
QString errorMsg
The message for the error at this location.
@ FunctionInvalidParams
Function was called with invalid args.
@ Unknown
Unknown error type.
@ FunctionUnknown
Function was unknown.
@ FunctionNamedArgsError
Non named function arg used after named arg.
@ FunctionWrongArgs
Function was called with the wrong number of args.
int firstLine
The first line that contained the error in the parser.