Skip to content

Commit

Permalink
Moved visitor-based expression -> OGC filter code to QgsOgcUtils
Browse files Browse the repository at this point in the history
  • Loading branch information
wonder-sk committed Mar 14, 2013
1 parent 837ac4d commit 16ec226
Show file tree
Hide file tree
Showing 11 changed files with 232 additions and 218 deletions.
56 changes: 28 additions & 28 deletions python/core/qgsexpression.sip
Expand Up @@ -187,7 +187,7 @@ class QgsExpression
virtual bool needsGeometry() const = 0;

// support for visitor pattern
virtual void accept( QgsExpression::Visitor& v ) = 0;
virtual void accept( QgsExpression::Visitor& v ) const = 0;
};

class NodeList
Expand Down Expand Up @@ -228,8 +228,8 @@ class QgsExpression
NodeUnaryOperator( QgsExpression::UnaryOperator op, QgsExpression::Node* operand );
~NodeUnaryOperator();

QgsExpression::UnaryOperator op();
QgsExpression::Node* operand();
QgsExpression::UnaryOperator op() const;
QgsExpression::Node* operand() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -239,7 +239,7 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class NodeBinaryOperator : QgsExpression::Node
Expand All @@ -248,9 +248,9 @@ class QgsExpression
NodeBinaryOperator( QgsExpression::BinaryOperator op, QgsExpression::Node* opLeft, QgsExpression::Node* opRight );
~NodeBinaryOperator();

QgsExpression::BinaryOperator op();
QgsExpression::Node* opLeft();
QgsExpression::Node* opRight();
QgsExpression::BinaryOperator op() const;
QgsExpression::Node* opLeft() const;
QgsExpression::Node* opRight() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -260,7 +260,7 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class NodeInOperator : QgsExpression::Node
Expand All @@ -269,9 +269,9 @@ class QgsExpression
NodeInOperator( QgsExpression::Node* node, QgsExpression::NodeList* list, bool notin = false );
~NodeInOperator();

QgsExpression::Node* node();
bool isNotIn();
QgsExpression::NodeList* list();
QgsExpression::Node* node() const;
bool isNotIn() const;
QgsExpression::NodeList* list() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -281,7 +281,7 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class NodeFunction : QgsExpression::Node
Expand All @@ -291,8 +291,8 @@ class QgsExpression
//NodeFunction( QString name, QgsExpression::NodeList* args );
~NodeFunction();

int fnIndex();
QgsExpression::NodeList* args();
int fnIndex() const;
QgsExpression::NodeList* args() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -302,15 +302,15 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class NodeLiteral : QgsExpression::Node
{
public:
NodeLiteral( QVariant value );

QVariant value();
QVariant value() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -320,15 +320,15 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class NodeColumnRef : QgsExpression::Node
{
public:
NodeColumnRef( QString name );

QString name();
QString name() const;

virtual bool prepare( QgsExpression* parent, const QgsFields &fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -338,7 +338,7 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

class WhenThen
Expand Down Expand Up @@ -367,7 +367,7 @@ class QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( QgsExpression::Visitor& v );
virtual void accept( QgsExpression::Visitor& v ) const;
};

//////
Expand All @@ -378,17 +378,17 @@ class QgsExpression
{
public:
virtual ~Visitor();
virtual void visit( QgsExpression::NodeUnaryOperator* n ) = 0;
virtual void visit( QgsExpression::NodeBinaryOperator* n ) = 0;
virtual void visit( QgsExpression::NodeInOperator* n ) = 0;
virtual void visit( QgsExpression::NodeFunction* n ) = 0;
virtual void visit( QgsExpression::NodeLiteral* n ) = 0;
virtual void visit( QgsExpression::NodeColumnRef* n ) = 0;
virtual void visit( QgsExpression::NodeCondition* n ) = 0;
virtual void visit( const QgsExpression::NodeUnaryOperator& n ) = 0;
virtual void visit( const QgsExpression::NodeBinaryOperator& n ) = 0;
virtual void visit( const QgsExpression::NodeInOperator& n ) = 0;
virtual void visit( const QgsExpression::NodeFunction& n ) = 0;
virtual void visit( const QgsExpression::NodeLiteral& n ) = 0;
virtual void visit( const QgsExpression::NodeColumnRef& n ) = 0;
virtual void visit( const QgsExpression::NodeCondition& n ) = 0;
};

/** entry function for the visitor pattern */
void acceptVisitor( QgsExpression::Visitor& v );
void acceptVisitor( QgsExpression::Visitor& v ) const;

// convert from/to OGC Filter
void toOgcFilter( QDomDocument &doc, QDomElement &element ) const;
Expand Down
5 changes: 5 additions & 0 deletions python/core/qgsogcutils.sip
Expand Up @@ -50,5 +50,10 @@ public:
/** Parse XML with OGC filter into QGIS expression */
static QgsExpression* expressionFromOgcFilter( const QDomElement& element ) /Factory/;

/** Creates OGC filter XML element. Supports minimum standard filter according to the OGC filter specs (=,!=,<,>,<=,>=,AND,OR,NOT)
@return valid <Filter> QDomElement on success, otherwise null QDomElement
*/
static QDomElement expressionToOgcFilter( const QgsExpression& exp, QDomDocument& doc );

};

2 changes: 1 addition & 1 deletion src/core/qgsexpression.cpp
Expand Up @@ -1327,7 +1327,7 @@ void QgsExpression::toOgcFilter( QDomDocument &doc, QDomElement &element ) const
}


void QgsExpression::acceptVisitor( QgsExpression::Visitor& v )
void QgsExpression::acceptVisitor( QgsExpression::Visitor& v ) const
{
if ( mRootNode )
mRootNode->accept( v );
Expand Down
56 changes: 28 additions & 28 deletions src/core/qgsexpression.h
Expand Up @@ -329,7 +329,7 @@ class CORE_EXPORT QgsExpression
virtual bool needsGeometry() const = 0;

// support for visitor pattern
virtual void accept( Visitor& v ) = 0;
virtual void accept( Visitor& v ) const = 0;
};

class CORE_EXPORT NodeList
Expand Down Expand Up @@ -384,8 +384,8 @@ class CORE_EXPORT QgsExpression
NodeUnaryOperator( UnaryOperator op, Node* operand ) : mOp( op ), mOperand( operand ) {}
~NodeUnaryOperator() { delete mOperand; }

UnaryOperator op() { return mOp; }
Node* operand() { return mOperand; }
UnaryOperator op() const { return mOp; }
Node* operand() const { return mOperand; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -395,7 +395,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { return mOperand->referencedColumns(); }
virtual bool needsGeometry() const { return mOperand->needsGeometry(); }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
UnaryOperator mOp;
Expand All @@ -408,9 +408,9 @@ class CORE_EXPORT QgsExpression
NodeBinaryOperator( BinaryOperator op, Node* opLeft, Node* opRight ) : mOp( op ), mOpLeft( opLeft ), mOpRight( opRight ) {}
~NodeBinaryOperator() { delete mOpLeft; delete mOpRight; }

BinaryOperator op() { return mOp; }
Node* opLeft() { return mOpLeft; }
Node* opRight() { return mOpRight; }
BinaryOperator op() const { return mOp; }
Node* opLeft() const { return mOpLeft; }
Node* opRight() const { return mOpRight; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -420,7 +420,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { return mOpLeft->referencedColumns() + mOpRight->referencedColumns(); }
virtual bool needsGeometry() const { return mOpLeft->needsGeometry() || mOpRight->needsGeometry(); }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
bool compare( double diff );
Expand All @@ -439,9 +439,9 @@ class CORE_EXPORT QgsExpression
NodeInOperator( Node* node, NodeList* list, bool notin = false ) : mNode( node ), mList( list ), mNotIn( notin ) {}
virtual ~NodeInOperator() { delete mNode; delete mList; }

Node* node() { return mNode; }
bool isNotIn() { return mNotIn; }
NodeList* list() { return mList; }
Node* node() const { return mNode; }
bool isNotIn() const { return mNotIn; }
NodeList* list() const { return mList; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -451,7 +451,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { QStringList lst( mNode->referencedColumns() ); foreach ( Node* n, mList->list() ) lst.append( n->referencedColumns() ); return lst; }
virtual bool needsGeometry() const { bool needs = false; foreach ( Node* n, mList->list() ) needs |= n->needsGeometry(); return needs; }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
Node* mNode;
Expand All @@ -466,8 +466,8 @@ class CORE_EXPORT QgsExpression
//NodeFunction( QString name, NodeList* args ) : mName(name), mArgs(args) {}
virtual ~NodeFunction() { delete mArgs; }

int fnIndex() { return mFnIndex; }
NodeList* args() { return mArgs; }
int fnIndex() const { return mFnIndex; }
NodeList* args() const { return mArgs; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -477,7 +477,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { QStringList lst; if ( !mArgs ) return lst; foreach ( Node* n, mArgs->list() ) lst.append( n->referencedColumns() ); return lst; }
virtual bool needsGeometry() const { bool needs = Functions()[mFnIndex]->usesgeometry(); if ( mArgs ) { foreach ( Node* n, mArgs->list() ) needs |= n->needsGeometry(); } return needs; }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
//QString mName;
Expand All @@ -490,7 +490,7 @@ class CORE_EXPORT QgsExpression
public:
NodeLiteral( QVariant value ) : mValue( value ) {}

QVariant value() { return mValue; }
QVariant value() const { return mValue; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -500,7 +500,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { return QStringList(); }
virtual bool needsGeometry() const { return false; }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
QVariant mValue;
Expand All @@ -511,7 +511,7 @@ class CORE_EXPORT QgsExpression
public:
NodeColumnRef( QString name ) : mName( name ), mIndex( -1 ) {}

QString name() { return mName; }
QString name() const { return mName; }

virtual bool prepare( QgsExpression* parent, const QgsFields& fields );
virtual QVariant eval( QgsExpression* parent, QgsFeature* f );
Expand All @@ -521,7 +521,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const { return QStringList( mName ); }
virtual bool needsGeometry() const { return false; }
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
QString mName;
Expand Down Expand Up @@ -554,7 +554,7 @@ class CORE_EXPORT QgsExpression

virtual QStringList referencedColumns() const;
virtual bool needsGeometry() const;
virtual void accept( Visitor& v ) { v.visit( this ); }
virtual void accept( Visitor& v ) const { v.visit( *this ); }

protected:
WhenThenList mConditions;
Expand All @@ -569,17 +569,17 @@ class CORE_EXPORT QgsExpression
{
public:
virtual ~Visitor() {}
virtual void visit( NodeUnaryOperator* n ) = 0;
virtual void visit( NodeBinaryOperator* n ) = 0;
virtual void visit( NodeInOperator* n ) = 0;
virtual void visit( NodeFunction* n ) = 0;
virtual void visit( NodeLiteral* n ) = 0;
virtual void visit( NodeColumnRef* n ) = 0;
virtual void visit( NodeCondition* n ) = 0;
virtual void visit( const NodeUnaryOperator& n ) = 0;
virtual void visit( const NodeBinaryOperator& n ) = 0;
virtual void visit( const NodeInOperator& n ) = 0;
virtual void visit( const NodeFunction& n ) = 0;
virtual void visit( const NodeLiteral& n ) = 0;
virtual void visit( const NodeColumnRef& n ) = 0;
virtual void visit( const NodeCondition& n ) = 0;
};

/** entry function for the visitor pattern */
void acceptVisitor( Visitor& v );
void acceptVisitor( Visitor& v ) const;

// convert from/to OGC Filter
void toOgcFilter( QDomDocument &doc, QDomElement &element ) const;
Expand Down

0 comments on commit 16ec226

Please sign in to comment.