QGIS API Documentation  3.8.0-Zanzibar (11aff65)
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 : matthias@opengis.ch
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 
173  public:
174  };
175 
176  virtual ~QgsExpressionNode() = default;
177 
183  virtual QgsExpressionNode::NodeType nodeType() const = 0;
184 
190  virtual QString dump() const = 0;
191 
199  QVariant eval( QgsExpression *parent, const QgsExpressionContext *context );
200 
207  virtual QgsExpressionNode *clone() const = 0;
208 
219  virtual QSet<QString> referencedColumns() const = 0;
220 
224  virtual QSet<QString> referencedVariables() const = 0;
225 
229  virtual QSet<QString> referencedFunctions() const = 0;
230 
237  virtual QList<const QgsExpressionNode *> nodes( ) const = 0; SIP_SKIP
238 
247  virtual bool needsGeometry() const = 0;
248 
257  virtual bool isStatic( QgsExpression *parent, const QgsExpressionContext *context ) const = 0;
258 
267  bool prepare( QgsExpression *parent, const QgsExpressionContext *context );
268 
274  int parserFirstLine = 0;
275 
281  int parserFirstColumn = 0;
282 
288  int parserLastLine = 0;
289 
295  int parserLastColumn = 0;
296 
297  protected:
298 
308  void cloneTo( QgsExpressionNode *target ) const SIP_SKIP;
309 
310  private:
311 
317  virtual bool prepareNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
318 
324  virtual QVariant evalNode( QgsExpression *parent, const QgsExpressionContext *context ) = 0;
325 
326  bool mHasCachedValue = false;
327  QVariant mCachedStaticValue;
328 };
329 
331 
332 #endif // QGSEXPRESSIONNODE_H
Class for parsing and evaluation of expressions (formerly called "search strings").
QStringList names() const
Returns a list of names for nodes.
QgsExpressionNode * at(int i)
Gets the node at position i in the list.
NodeType
Known node types.
#define SIP_ABSTRACT
Definition: qgis_sip.h:187
#define SIP_SKIP
Definition: qgis_sip.h:119
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
#define SIP_TRANSFER
Definition: qgis_sip.h:36
#define SIP_END
Definition: qgis_sip.h:182
Q_DECLARE_METATYPE(QgsMeshTimeSettings)
NamedNode(const QString &name, QgsExpressionNode *node)
Constructor for NamedNode.
Abstract base class for all nodes that can appear in an expression.
#define SIP_FACTORY
Definition: qgis_sip.h:69
A list of expression nodes.
QList< QgsExpressionNode * > list()
Gets a list of all the nodes.
#define SIP_CONVERT_TO_SUBCLASS_CODE(code)
Definition: qgis_sip.h:165
int count() const
Returns the number of nodes in the list.
void append(QgsExpressionNode *node)
Takes ownership of the provided node.
bool hasNamedNodes() const
Returns true if list contains any named nodes.