Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix referenced columns from QgsDataDefined so that columns are
returned even if expression was not sucessfully parsed (column
names are still inferred during the expression preparation).
  • Loading branch information
nyalldawson committed May 6, 2015
1 parent 6ad2f9f commit ad7fad5
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 3 deletions.
15 changes: 14 additions & 1 deletion src/core/qgsdatadefined.cpp
Expand Up @@ -98,10 +98,17 @@ bool QgsDataDefined::hasDefaultValues() const
return ( !mActive && !mUseExpression && mExpressionString.isEmpty() && mField.isEmpty() );
}

void QgsDataDefined::setUseExpression( bool use )
{
mUseExpression = use;
mExprRefColumns.clear();
}

void QgsDataDefined::setExpressionString( const QString &expr )
{
mExpressionString = expr;
mExpressionPrepared = false;
mExprRefColumns.clear();
}

bool QgsDataDefined::prepareExpression( QgsVectorLayer* layer )
Expand Down Expand Up @@ -145,6 +152,7 @@ bool QgsDataDefined::prepareExpression( const QgsFields &fields )
}

mExpression->prepare( fields );
mExprRefColumns = mExpression->referencedColumns();

if ( mExpression->hasEvalError() )
{
Expand All @@ -153,7 +161,6 @@ bool QgsDataDefined::prepareExpression( const QgsFields &fields )
}

mExpressionPrepared = true;
mExprRefColumns = mExpression->referencedColumns();

return true;
}
Expand Down Expand Up @@ -192,6 +199,12 @@ QStringList QgsDataDefined::referencedColumns( const QgsFields &fields )
return mExprRefColumns;
}

void QgsDataDefined::setField( const QString &field )
{
mField = field;
mExprRefColumns.clear();
}

void QgsDataDefined::insertExpressionParam( QString key, QVariant param )
{
mExpressionParams.insert( key, param );
Expand Down
4 changes: 2 additions & 2 deletions src/core/qgsdatadefined.h
Expand Up @@ -88,7 +88,7 @@ class CORE_EXPORT QgsDataDefined
void setActive( bool active ) { mActive = active; }

bool useExpression() const { return mUseExpression; }
void setUseExpression( bool use ) { mUseExpression = use; }
void setUseExpression( bool use );

QString expressionString() const { return mExpressionString; }
void setExpressionString( const QString& expr );
Expand Down Expand Up @@ -131,7 +131,7 @@ class CORE_EXPORT QgsDataDefined
QStringList referencedColumns( const QgsFields& fields = QgsFields() );

QString field() const { return mField; }
void setField( const QString& field ) { mField = field; }
void setField( const QString& field );

/** Encodes the QgsDataDefined into a string map.
* @param baseName optional base name for values in the string map. Can be used
Expand Down
44 changes: 44 additions & 0 deletions tests/src/core/testqgsdatadefined.cpp
Expand Up @@ -40,6 +40,7 @@ class TestQgsDataDefined: public QObject
void equality(); //test equality operators
void xmlMethods(); //test saving and reading from xml
void mapMethods(); //test saving and reading from a string map
void referencedColumns(); //test referenced columns method

private:
};
Expand Down Expand Up @@ -249,5 +250,48 @@ void TestQgsDataDefined::mapMethods()
delete dd4;
}

void TestQgsDataDefined::referencedColumns()
{
QgsDataDefined dd;
dd.setActive( true );
dd.setUseExpression( true );

QStringList cols = dd.referencedColumns();
QVERIFY( cols.isEmpty() );

//set as expression
dd.setExpressionString( "1+col1+col2" );
cols = dd.referencedColumns();
QCOMPARE( cols.length(), 2 );
QVERIFY( cols.contains( QString( "col1" ) ) );
QVERIFY( cols.contains( QString( "col2" ) ) );

//alter expression and check that referenced columns is updated
dd.setExpressionString( "1+col1+col2+col3" );
cols = dd.referencedColumns();
QCOMPARE( cols.length(), 3 );
QVERIFY( cols.contains( QString( "col1" ) ) );
QVERIFY( cols.contains( QString( "col2" ) ) );
QVERIFY( cols.contains( QString( "col3" ) ) );

//switch to field
dd.setUseExpression( false );
cols = dd.referencedColumns();
QVERIFY( cols.isEmpty() );

dd.setField( "field" );
cols = dd.referencedColumns();
QCOMPARE( cols.length(), 1 );
QVERIFY( cols.contains( QString( "field" ) ) );

//switch back to expression
dd.setUseExpression( true );
cols = dd.referencedColumns();
QCOMPARE( cols.length(), 3 );
QVERIFY( cols.contains( QString( "col1" ) ) );
QVERIFY( cols.contains( QString( "col2" ) ) );
QVERIFY( cols.contains( QString( "col3" ) ) );
}

QTEST_MAIN( TestQgsDataDefined )
#include "testqgsdatadefined.moc"

0 comments on commit ad7fad5

Please sign in to comment.