QGIS API Documentation  3.21.0-Master (5b68dc587e)
qgsexpressionnode.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsexpressionnode.h
3  -------------------
4  begin : May 2017
5  copyright : (C) 2017 Matthias Kuhn
6  email : [email protected]
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 
26 class 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;
62  default:
63  sipType = 0;
64  break;
65  }
66  SIP_END
67 #endif
68 
69  Q_DECLARE_TR_FUNCTIONS( QgsExpressionNode )
70 
71  public:
72 
74  enum NodeType
75  {
84  };
85 
86 
92  struct NamedNode
93  {
94  public:
95 
101  NamedNode( const QString &name, QgsExpressionNode *node )
102  : name( name )
103  , node( node )
104  {}
105 
107  QString name;
108 
110  QgsExpressionNode *node = nullptr;
111  };
112 
117  class CORE_EXPORT NodeList
118  {
119  public:
120  virtual ~NodeList();
122  void append( QgsExpressionNode *node SIP_TRANSFER ) { mList.append( node ); mNameList.append( QString() ); }
123 
128  void append( QgsExpressionNode::NamedNode *node SIP_TRANSFER );
129 
133  int count() const { return mList.count(); }
134 
139  bool hasNamedNodes() const { return mHasNamedNodes; }
140 
144  QList<QgsExpressionNode *> list() { return mList; }
145 
151  QgsExpressionNode *at( int i ) { return mList.at( i ); }
152 
157  QStringList names() const { return mNameList; }
158 
161 
165  virtual QString dump() const;
166 
167  private:
168  QList<QgsExpressionNode *> mList;
169  QStringList mNameList;
170 
171  bool mHasNamedNodes = false;
172 
176  static QString cleanNamedNodeName( const QString &name );
177 
178  public:
179  };
180 
181  virtual ~QgsExpressionNode() = default;
182 
188  virtual QgsExpressionNode::NodeType nodeType() const = 0;
189 
195  virtual QString dump() const = 0;
196 
204  QVariant eval( QgsExpression *parent, const QgsExpressionContext *context );
205 
212  virtual QgsExpressionNode *clone() const = 0;
213 
232  virtual QSet<QString> referencedColumns() const = 0;
233 
240  virtual QSet<QString> referencedVariables() const = 0;
241 
248  virtual QSet<QString> referencedFunctions() const = 0;
249 
256  virtual QList<const QgsExpressionNode *> nodes( ) const = 0; SIP_SKIP
257 
266  virtual bool needsGeometry() const = 0;
267 
276  virtual bool isStatic( QgsExpression *parent, const QgsExpressionContext *context ) const = 0;
277 
286  bool prepare( QgsExpression *parent, const QgsExpressionContext *context );
287 
293  int parserFirstLine = 0;
294 
300  int parserFirstColumn = 0;
301 
307  int parserLastLine = 0;
308 
314  int parserLastColumn = 0;
315 
322  bool hasCachedStaticValue() const { return mHasCachedValue; }
323 
330  QVariant cachedStaticValue() const { return mCachedStaticValue; }
331 
344  const QgsExpressionNode *effectiveNode() const { return mCompiledSimplifiedNode ? mCompiledSimplifiedNode.get() : this; }
345 
346  protected:
347 
351  QgsExpressionNode() = default;
352 
354  QgsExpressionNode( const QgsExpressionNode &other );
356  QgsExpressionNode &operator=( const QgsExpressionNode &other );
357 
367  void cloneTo( QgsExpressionNode *target ) const SIP_SKIP;
368 
369 #ifndef SIP_RUN
370 
376  mutable bool mHasCachedValue = false;
377 
383  mutable QVariant mCachedStaticValue;
384 
395  mutable std::unique_ptr< QgsExpressionNode > mCompiledSimplifiedNode;
396 #endif
397 
398  private:
399 
405  virtual bool prepareNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
406 
412  virtual QVariant evalNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
413 
414 };
415 
417 
418 #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.
QgsExpressionNode * at(int i)
Gets the node at position i in the list.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
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.
@ 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:177
#define SIP_SKIP
Definition: qgis_sip.h:126
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_ABSTRACT
Definition: qgis_sip.h:199
#define SIP_FACTORY
Definition: qgis_sip.h:76
#define SIP_END
Definition: qgis_sip.h:194
Q_DECLARE_METATYPE(QgsMeshTimeSettings)
NamedNode(const QString &name, QgsExpressionNode *node)
Constructor for NamedNode.