16 #ifndef QGSEXPRESSION_H 17 #define QGSEXPRESSION_H 20 #include <QStringList> 23 #include <QDomDocument> 112 QStringList referencedColumns()
const;
115 bool needsGeometry()
const;
121 QVariant evaluate(
const QgsFeature* f = NULL );
150 static void setSpecialColumn(
const QString& name, QVariant value );
152 static void unsetSpecialColumn(
const QString& name );
154 static QVariant specialColumn(
const QString& name );
157 static bool hasSpecialColumn(
const QString& name );
159 static bool isValid(
const QString& text,
const QgsFields& fields, QString &errorMessage );
168 if ( !mExp.isNull() )
175 QString dump()
const;
198 static QString replaceExpressionText(
const QString &action,
const QgsFeature *feat,
200 const QMap<QString, QVariant> *substitutionMap = 0,
211 static double evaluateToDouble(
const QString& text,
const double fallbackValue );
273 static const char* BinaryOperatorText[];
274 static const char* UnaryOperatorText[];
285 Function( QString fnname,
int params, QString group, QString helpText = QString(),
bool usesGeometry =
false, QStringList referencedColumns = QStringList(),
bool lazyEval =
false )
286 : mName( fnname ), mParams( params ), mUsesGeometry( usesGeometry ), mGroup( group ), mHelpText( helpText ), mReferencedColumns( referencedColumns ), mLazyEval( lazyEval ) {}
288 QString
name() {
return mName; }
310 if ( QString::compare( mName, other.mName, Qt::CaseInsensitive ) == 0 )
322 QStringList mReferencedColumns;
329 StaticFunction( QString fnname,
int params, FcnEval fcn, QString group, QString helpText = QString(),
bool usesGeometry =
false, QStringList referencedColumns = QStringList(),
bool lazyEval =
false )
330 :
Function( fnname, params, group, helpText, usesGeometry, referencedColumns, lazyEval ), mFnc( fcn ) {}
334 return mFnc( values, f, parent );
341 static const QList<Function*> &Functions();
345 static const QStringList &BuiltinFunctions();
347 static bool registerFunction(
Function*
function );
348 static bool unregisterFunction( QString name );
351 static bool isFunctionName( QString name );
354 static int functionIndex( QString name );
359 static int functionCount();
364 static QList<Function*> specialColumns();
367 static QString quotedColumnRef( QString name );
369 static QString quotedString( QString text );
390 virtual NodeType nodeType()
const = 0;
399 virtual QString dump()
const = 0;
401 virtual QStringList referencedColumns()
const = 0;
402 virtual bool needsGeometry()
const = 0;
405 virtual void accept(
Visitor& v )
const = 0;
414 int count() {
return mList.count(); }
415 QList<Node*>
list() {
return mList; }
417 virtual QString dump()
const;
427 static const int YEARS = 31557600;
428 static const int MONTHS = 60 * 60 * 24 * 30;
429 static const int WEEKS = 60 * 60 * 24 * 7;
430 static const int DAY = 60 * 60 * 24;
431 static const int HOUR = 60 * 60;
432 static const int MINUTE = 60;
434 Interval(
double seconds = 0 ) : mSeconds( seconds ), mValid( true ) { }
436 double years() {
return mSeconds / YEARS;}
437 double months() {
return mSeconds / MONTHS; }
438 double weeks() {
return mSeconds / WEEKS;}
439 double days() {
return mSeconds / DAY;}
440 double hours() {
return mSeconds / HOUR;}
465 virtual QString dump()
const override;
467 virtual QStringList
referencedColumns()
const override {
return mOperand->referencedColumns(); }
468 virtual bool needsGeometry()
const override {
return mOperand->needsGeometry(); }
489 virtual QString dump()
const override;
491 virtual QStringList
referencedColumns()
const override {
return mOpLeft->referencedColumns() + mOpRight->referencedColumns(); }
492 virtual bool needsGeometry()
const override {
return mOpLeft->needsGeometry() || mOpRight->needsGeometry(); }
495 int precedence()
const;
498 bool compare(
double diff );
499 int computeInt(
int x,
int y );
500 double computeDouble(
double x,
double y );
521 virtual QString dump()
const override;
546 virtual QString dump()
const override;
548 virtual QStringList referencedColumns()
const override;
549 virtual bool needsGeometry()
const override {
bool needs = Functions()[mFnIndex]->usesgeometry();
if ( mArgs ) {
foreach (
Node* n, mArgs->list() ) needs |= n->
needsGeometry(); }
return needs; }
563 QVariant
value()
const {
return mValue; }
568 virtual QString dump()
const override;
583 QString
name()
const {
return mName; }
588 virtual QString dump()
const override;
615 NodeCondition( WhenThenList* conditions,
Node* elseExp = NULL ) : mConditions( *conditions ), mElseExp( elseExp ) {
delete conditions; }
621 virtual QString dump()
const override;
623 virtual QStringList referencedColumns()
const override;
624 virtual bool needsGeometry()
const override;
650 void acceptVisitor(
Visitor& v )
const;
652 static QString helptext( QString name );
653 static QString group( QString group );
659 QgsExpression() : mRootNode( 0 ), mRowNumber( 0 ), mScale( 0.0 ), mCalc( 0 ) {}
661 void initGeomCalculator();
680 static void initFunctionHelp();
691 #endif // QGSEXPRESSION_H Class for parsing and evaluation of expressions (formerly called "search strings").
virtual QStringList referencedColumns() const =0
bool hasEvalError() const
Returns true if an error occurred when evaluating last input.
QVariant evaluate(const QgsFeature &f, const QgsFields &fields)
Evaluate the feature and return the result.
UnaryOperator
list of unary operators
virtual bool needsGeometry() const override
bool hasParserError() const
Returns true if an error occurred when parsing the input expression.
virtual QStringList referencedColumns() const override
virtual NodeType nodeType() const override
bool lazyEval()
True if this function should use lazy evaluation.
const QString expression() const
Alias for dump()
A abstract base class for defining QgsExpression functions.
bool operator==(const QgsFeatureIterator &fi1, const QgsFeatureIterator &fi2)
virtual NodeType nodeType() const override
NodeCondition(WhenThenList *conditions, Node *elseExp=NULL)
static QString helptext(QString name)
QgsExpression()
Used by QgsOgcUtils to create an empty.
Container of fields for a vector layer.
Interval(double seconds=0)
virtual QStringList referencedColumns() const override
The feature class encapsulates a single feature including its id, geometry and a list of field/values...
virtual NodeType nodeType() const override
virtual QVariant func(const QVariantList &values, const QgsFeature *f, QgsExpression *parent) override
int currentRowNumber()
Return the number used for $rownum special column.
virtual void accept(Visitor &v) const override
virtual bool needsGeometry() const override
NodeBinaryOperator(BinaryOperator op, Node *opLeft, Node *opRight)
QString mParserErrorString
virtual NodeType nodeType() const override
static QHash< QString, QString > gFunctionHelpTexts
virtual QStringList referencedColumns() const override
QgsDistanceArea * geomCalculator()
Return calculator used for distance and area calculations (used by internal functions) ...
virtual void accept(Visitor &v) const override
static QHash< QString, QString > gGroups
const Node * rootNode() const
Returns root node of the expression. Root node is null is parsing has failed.
NodeInOperator(Node *node, NodeList *list, bool notin=false)
NodeColumnRef(QString name)
QString helptext()
The help text for the function.
static QList< Function * > gmFunctions
virtual void accept(Visitor &v) const override
QString name()
The name of the function.
void setCurrentRowNumber(int rowNumber)
Set the number for $rownum special column.
WhenThen(Node *whenExp, Node *thenExp)
NodeLiteral(QVariant value)
StaticFunction(QString fnname, int params, FcnEval fcn, QString group, QString helpText=QString(), bool usesGeometry=false, QStringList referencedColumns=QStringList(), bool lazyEval=false)
NodeUnaryOperator(UnaryOperator op, Node *operand)
BinaryOperator op() const
virtual void accept(Visitor &v) const override
virtual NodeType nodeType() const override
virtual QStringList referencedColumns() const override
virtual QStringList referencedColumns() const
virtual void accept(Visitor &v) const override
void setEvalErrorString(QString str)
Set evaluation error (used internally by evaluation functions)
NodeFunction(int fnIndex, NodeList *args)
General purpose distance and area calculator.
static QMap< QString, QString > gmSpecialColumnGroups
virtual bool needsGeometry() const override
virtual void accept(Visitor &v) const override
virtual NodeType nodeType() const override
virtual bool needsGeometry() const override
BinaryOperator
list of binary operators
QString group()
The group the function belongs to.
Function(QString fnname, int params, QString group, QString helpText=QString(), bool usesGeometry=false, QStringList referencedColumns=QStringList(), bool lazyEval=false)
QList< WhenThen * > WhenThenList
virtual void visit(const NodeUnaryOperator &n)=0
QVariant evaluate(const QgsFeature &f)
Evaluate the feature and return the result.
int params()
The number of parameters this function takes.
support for visitor pattern - algorithms dealing with the expressions may be implemented without modi...
virtual bool needsGeometry() const =0
bool operator==(const Function &other) const
static QStringList gmBuiltinFunctions
virtual bool needsGeometry() const override
virtual void accept(Visitor &v) const override
void setValid(bool valid)
virtual NodeType nodeType() const override
This is the base class for vector data providers.
void setScale(double scale)
Represents a vector layer which manages a vector based data sets.
QString parserErrorString() const
Returns parser error.
Q_DECLARE_METATYPE(QgsExpression::Interval)
The QgsOgcUtils class provides various utility functions for conversion between OGC (Open Geospatial ...
QString evalErrorString() const
Returns evaluation error.
bool usesgeometry()
Does this function use a geometry object.
virtual ~NodeInOperator()
virtual bool needsGeometry() const override
virtual QStringList referencedColumns() const override
static QMap< QString, QVariant > gmSpecialColumns