QGIS API Documentation 3.99.0-Master (d270888f95f)
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,
56 bool optional = false, const QString &defaultVal = QString() )
57 : mArg( arg )
58 , mDescription( desc )
59 , mDescOnly( descOnly )
60 , mSyntaxOnly( syntaxOnly )
61 , mOptional( optional )
62 , mDefaultVal( defaultVal )
63 {}
64
65 QString mArg;
66 QString mDescription;
67 bool mDescOnly;
68 bool mSyntaxOnly;
69 bool mOptional;
70 QString mDefaultVal;
71};
72
73struct HelpExample
74{
75 HelpExample( const QString &expression, const QString &returns, const QString &note = QString() )
76 : mExpression( expression )
77 , mReturns( returns )
78 , mNote( note )
79 {}
80
81 QString mExpression;
82 QString mReturns;
83 QString mNote;
84};
85
86
87struct HelpVariant
88{
89 HelpVariant( const QString &name, const QString &description,
90 const QList<HelpArg> &arguments = QList<HelpArg>(),
91 bool variableLenArguments = false,
92 const QList<HelpExample> &examples = QList<HelpExample>(),
93 const QString &notes = QString(),
94 const QStringList &tags = QStringList() )
95 : mName( name )
96 , mDescription( description )
97 , mArguments( arguments )
98 , mVariableLenArguments( variableLenArguments )
99 , mExamples( examples )
100 , mNotes( notes )
101 , mTags( tags )
102 {}
103
104 QString mName;
105 QString mDescription;
106 QList<HelpArg> mArguments;
107 bool mVariableLenArguments;
108 QList<HelpExample> mExamples;
109 QString mNotes;
110 QStringList mTags;
111};
112
113
114struct Help
115{
116 Help() = default;
117
118 Help( const QString &name, const QString &type, const QString &description, const QList<HelpVariant> &variants )
119 : mName( name )
120 , mType( type )
121 , mDescription( description )
122 , mVariants( variants )
123 {}
124
125 QString mName;
126 QString mType;
127 QString mDescription;
128 QList<HelpVariant> mVariants;
129};
130
131typedef QHash<QString, Help> HelpTextHash;
132
134#endif
135
192class CORE_EXPORT QgsExpression
193{
194 Q_DECLARE_TR_FUNCTIONS( QgsExpression )
195 public:
196
243
250 QgsExpression( const QString &expr );
251
257 QgsExpression( const QgsExpression &other );
258
264 QgsExpression &operator=( const QgsExpression &other );
265
270 operator QString() const SIP_SKIP;
271
277
278 ~QgsExpression();
279
285 bool operator==( const QgsExpression &other ) const;
286
292 bool isValid() const;
293
295 bool hasParserError() const;
297 QString parserErrorString() const;
298
302 QList<QgsExpression::ParserError> parserErrors() const;
303
309 const QgsExpressionNode *rootNode() const;
310
315 bool prepare( const QgsExpressionContext *context );
316
334 QSet<QString> referencedColumns() const;
335
346 QSet<QString> referencedVariables() const;
347
357 QSet<QString> referencedFunctions() const;
358
359#ifndef SIP_RUN
360
367 QList<const QgsExpressionNode *> nodes( ) const;
368
375 template <class T>
376 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,
565 const QgsDistanceArea *distanceArea = nullptr );
566
574 static QSet<QString> referencedVariables( const QString &text );
575
585 static double evaluateToDouble( const QString &text, double fallbackValue );
586
599
600 static const QList<QgsExpressionFunction *> &Functions();
601
602 static const QStringList &BuiltinFunctions();
603
611 static bool registerFunction( QgsExpressionFunction *function, bool transferOwnership = false );
612
618 static bool unregisterFunction( const QString &name );
619
623 static void cleanRegisteredFunctions();
624
626 static bool isFunctionName( const QString &name );
627
629 static int functionIndex( const QString &name );
630
635 static int functionCount();
636
642 static QString quotedColumnRef( QString name );
643
649 static QString quotedString( QString text );
650
658 static QString quotedValue( const QVariant &value );
659
668 static QString quotedValue( const QVariant &value, QMetaType::Type type );
669
679 Q_DECL_DEPRECATED static QString quotedValue( const QVariant &value, QVariant::Type type ) SIP_DEPRECATED;
680
682
683#ifndef SIP_RUN
685 static HelpTextHash &functionHelpTexts();
687#endif
688
695 static QString helpText( QString name );
696
702 static QStringList tags( const QString &name );
703
716 static bool addVariableHelpText( const QString name, const QString &description );
717
724 static QString variableHelpText( const QString &variableName );
725
734 static QString formatVariableHelp( const QString &description, bool showValue = true, const QVariant &value = QVariant() );
735
740 static QString group( const QString &group );
741
750 static QString formatPreviewString( const QVariant &value, bool htmlOutput = true, int maximumPreviewLength = 60 );
751
760 static QString createFieldEqualityExpression( const QString &fieldName, const QVariant &value, QMetaType::Type fieldType = QMetaType::Type::UnknownType );
761
771 Q_DECL_DEPRECATED static QString createFieldEqualityExpression( const QString &fieldName, const QVariant &value, QVariant::Type fieldType ) SIP_DEPRECATED;
772
783 static bool isFieldEqualityExpression( const QString &expression, QString &field SIP_OUT, QVariant &value SIP_OUT );
784
799 static bool attemptReduceToInClause( const QStringList &expressions, QString &result SIP_OUT );
800
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 void initGeomCalculator( const QgsExpressionContext *context );
811
818 void detach() SIP_SKIP;
819
820 QgsExpressionPrivate *d = nullptr;
821
822 static HelpTextHash sFunctionHelpTexts;
823
825 static void initFunctionHelp() SIP_SKIP;
827 static void buildFunctionHelp() SIP_SKIP;
829 static void initVariableHelp() SIP_SKIP;
831 static void buildVariableHelp() SIP_SKIP;
832
834 static QRecursiveMutex sFunctionsMutex;
835 static QMap< QString, int> sFunctionIndexMap;
836
837 friend class QgsOgcUtils;
838};
839
841
842#endif // QGSEXPRESSION_H
DistanceUnit
Units of distance.
Definition qgis.h:5085
AreaUnit
Units of area.
Definition qgis.h:5162
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:114
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
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.