Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #1574 from mhugent/getFeatureExpression
Get feature expression
  • Loading branch information
jef-n committed Sep 2, 2014
2 parents f97d5e3 + dab5ff9 commit c5bcbaf
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
6 changes: 6 additions & 0 deletions resources/function_help/getFeature
@@ -0,0 +1,6 @@
<h3>getFeature function</h3>
Returns the first feature of a layer matching a given attribute value

<h4>Syntax</h4>
<pre>getFeature( layer, attributeField, value )</pre>

48 changes: 48 additions & 0 deletions src/core/qgsexpression.cpp
Expand Up @@ -30,6 +30,7 @@
#include "qgsfeature.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsmaplayerregistry.h"
#include "qgsogcutils.h"
#include "qgsvectorlayer.h"
#include "qgssymbollayerv2utils.h"
Expand Down Expand Up @@ -1505,6 +1506,52 @@ static QVariant fcnSpecialColumn( const QVariantList& values, const QgsFeature*
return QgsExpression::specialColumn( varName );
}

static QVariant fcnGetFeature( const QVariantList& values, const QgsFeature* f, QgsExpression* parent )
{
//arguments: 1. layer id / name, 2. key attribute, 3. eq value
QString layerString = getStringValue( values.at( 0 ), parent );
QgsVectorLayer* vl = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerString ) ); //search by id first
if ( !vl )
{
QList<QgsMapLayer *> layersByName = QgsMapLayerRegistry::instance()->mapLayersByName( layerString );
if ( layersByName.size() > 0 )
{
vl = qobject_cast<QgsVectorLayer*>( layersByName.at( 0 ) );
}
}

//no layer found
if ( !vl )
{
return QVariant();
}

QString attribute = getStringValue( values.at( 1 ), parent );
int attributeId = vl->fieldNameIndex( attribute );
if ( attributeId == -1 )
{
return QVariant();
}

const QVariant& attVal = values.at( 2 );
QgsFeatureRequest req;
if ( !parent->needsGeometry() )
{
req.setFlags( QgsFeatureRequest::NoGeometry );
}
QgsFeatureIterator fIt = vl->getFeatures( req );

QgsFeature fet;
while ( fIt.nextFeature( fet ) )
{
if ( fet.attribute( attributeId ) == attVal )
{
return QVariant::fromValue( fet );
}
}
return QVariant();
}

bool QgsExpression::registerFunction( QgsExpression::Function* function )
{
int fnIdx = functionIndex( function->name() );
Expand Down Expand Up @@ -1683,6 +1730,7 @@ const QList<QgsExpression::Function*> &QgsExpression::Functions()
<< new StaticFunction( "$currentfeature", 0, fcnFeature, "Record" )
<< new StaticFunction( "$scale", 0, fcnScale, "Record" )
<< new StaticFunction( "$uuid", 0, fcnUuid, "Record" )
<< new StaticFunction( "getFeature", 3, fcnGetFeature, "Record" )

//return all attributes string for referencedColumns - this is caught by
// QgsFeatureRequest::setSubsetOfAttributes and causes all attributes to be fetched by the
Expand Down

0 comments on commit c5bcbaf

Please sign in to comment.