QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsexpressionnode.h
Go to the documentation of this file.
1/***************************************************************************
2 qgsexpressionnode.h
3 -------------------
4 begin : May 2017
5 copyright : (C) 2017 Matthias Kuhn
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
17#ifndef QGSEXPRESSIONNODE_H
18#define QGSEXPRESSIONNODE_H
19
20#include <QSet>
21#include <QVariant>
22#include <QCoreApplication>
23
24#include "qgis.h"
25
26class QgsExpression;
28
35{
36
37#ifdef SIP_RUN
39 switch ( sipCpp->nodeType() )
40 {
42 sipType = sipType_QgsExpressionNodeUnaryOperator;
43 break;
45 sipType = sipType_QgsExpressionNodeBinaryOperator;
46 break;
48 sipType = sipType_QgsExpressionNodeInOperator;
49 break;
51 sipType = sipType_QgsExpressionNodeFunction;
52 break;
54 sipType = sipType_QgsExpressionNodeLiteral;
55 break;
57 sipType = sipType_QgsExpressionNodeColumnRef;
58 break;
60 sipType = sipType_QgsExpressionNodeCondition;
61 break;
63 sipType = sipType_QgsExpressionNodeBetweenOperator;
64 break;
65 default:
66 sipType = 0;
67 break;
68 }
70#endif
71
72 Q_DECLARE_TR_FUNCTIONS( QgsExpressionNode )
73
74 public:
75
78 {
88 };
89
90
95 struct NamedNode
96 {
97 public:
98
104 NamedNode( const QString &name, QgsExpressionNode *node )
105 : name( name )
106 , node( node )
107 {}
108
110 QString name;
111
113 QgsExpressionNode *node = nullptr;
114 };
115
120 class CORE_EXPORT NodeList
121 {
122 public:
123 virtual ~NodeList();
125 void append( QgsExpressionNode *node SIP_TRANSFER ) { mList.append( node ); mNameList.append( QString() ); }
126
130 void append( QgsExpressionNode::NamedNode *node SIP_TRANSFER );
131
135 int count() const { return mList.count(); }
136
142 void reserve( int size ) { mList.reserve( size ); }
143
147 bool hasNamedNodes() const { return mHasNamedNodes; }
148
152 QList<QgsExpressionNode *> list() { return mList; }
153
158 QgsExpressionNode *at( int i ) { return mList.at( i ); }
159
163 QStringList names() const { return mNameList; }
164
167
171 virtual QString dump() const;
172
173 private:
174 QList<QgsExpressionNode *> mList;
175 QStringList mNameList;
176
177 bool mHasNamedNodes = false;
178
182 static QString cleanNamedNodeName( const QString &name );
183
184 public:
185 };
186
187 virtual ~QgsExpressionNode() = default;
188
194 virtual QgsExpressionNode::NodeType nodeType() const = 0;
195
201 virtual QString dump() const = 0;
202
209 QVariant eval( QgsExpression *parent, const QgsExpressionContext *context );
210
217 virtual QgsExpressionNode *clone() const = 0;
218
237 virtual QSet<QString> referencedColumns() const = 0;
238
245 virtual QSet<QString> referencedVariables() const = 0;
246
253 virtual QSet<QString> referencedFunctions() const = 0;
254
261 virtual QList<const QgsExpressionNode *> nodes( ) const = 0; SIP_SKIP
262
271 virtual bool needsGeometry() const = 0;
272
280 virtual bool isStatic( QgsExpression *parent, const QgsExpressionContext *context ) const = 0;
281
289 bool prepare( QgsExpression *parent, const QgsExpressionContext *context );
290
296 int parserFirstLine = 0;
297
303 int parserFirstColumn = 0;
304
310 int parserLastLine = 0;
311
317 int parserLastColumn = 0;
318
325 bool hasCachedStaticValue() const { return mHasCachedValue; }
326
333 QVariant cachedStaticValue() const { return mCachedStaticValue; }
334
342 void setCachedStaticValue( const QVariant &value ) const SIP_SKIP;
343
356 const QgsExpressionNode *effectiveNode() const { return mCompiledSimplifiedNode ? mCompiledSimplifiedNode.get() : this; }
357
358 protected:
359
363 QgsExpressionNode() = default;
364
366 QgsExpressionNode( const QgsExpressionNode &other );
368 QgsExpressionNode &operator=( const QgsExpressionNode &other );
369
378 void cloneTo( QgsExpressionNode *target ) const SIP_SKIP;
379
380#ifndef SIP_RUN
381
387 mutable bool mHasCachedValue = false;
388
394 mutable QVariant mCachedStaticValue;
395
406 mutable std::unique_ptr< QgsExpressionNode > mCompiledSimplifiedNode;
407#endif
408
409 private:
410
415 virtual bool prepareNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
416
421 virtual QVariant evalNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
422
423};
424
426
427#endif // QGSEXPRESSIONNODE_H
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
A list of expression nodes.
bool hasNamedNodes() const
Returns true if list contains any named nodes.
QStringList names() const
Returns a list of names for nodes.
void append(QgsExpressionNode *node)
Takes ownership of the provided node.
void reserve(int size)
Reserves size for the node list.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
QgsExpressionNode * at(int i)
Gets the node at position i in the list.
int count() const
Returns the number of nodes in the list.
Abstract base class for all nodes that can appear in an expression.
const QgsExpressionNode * effectiveNode() const
Returns a reference to the simplest node which represents this node, after any compilation optimizati...
QVariant cachedStaticValue() const
Returns the node's static cached value.
QVariant mCachedStaticValue
Contains the static, precalculated value for the node if mHasCachedValue is true.
QgsExpressionNode()=default
Constructor.
std::unique_ptr< QgsExpressionNode > mCompiledSimplifiedNode
Contains a compiled node which represents a simplified version of this node as a result of compilatio...
NodeType
Known node types.
@ ntBetweenOperator
Between operator.
@ ntIndexOperator
Index operator.
Class for parsing and evaluation of expressions (formerly called "search strings").
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:191
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_ABSTRACT
Definition: qgis_sip.h:213
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:208
Q_DECLARE_METATYPE(QgsDatabaseQueryLogEntry)
NamedNode(const QString &name, QgsExpressionNode *node)
Constructor for NamedNode.