From 478e40be00b4c500efcf5b5686aaeced4be40420 Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 2 Sep 2014 13:20:32 +0200 Subject: [PATCH 1/2] [FEATURE]: Add getFeature function in Expression --- src/core/qgsexpression.cpp | 48 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp index a9a51a1ff5a..7abc5010e01 100644 --- a/src/core/qgsexpression.cpp +++ b/src/core/qgsexpression.cpp @@ -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" @@ -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( QgsMapLayerRegistry::instance()->mapLayer( layerString ) ); //search by id first + if ( !vl ) + { + QList layersByName = QgsMapLayerRegistry::instance()->mapLayersByName( layerString ); + if ( layersByName.size() > 0 ) + { + vl = qobject_cast( 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() ); @@ -1683,6 +1730,7 @@ const QList &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 From dab5ff95ffd339337205ee70cd826986aec7d7aa Mon Sep 17 00:00:00 2001 From: Marco Hugentobler Date: Tue, 2 Sep 2014 16:21:45 +0200 Subject: [PATCH 2/2] Add function help for getFeature --- resources/function_help/getFeature | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 resources/function_help/getFeature diff --git a/resources/function_help/getFeature b/resources/function_help/getFeature new file mode 100644 index 00000000000..9b703354f22 --- /dev/null +++ b/resources/function_help/getFeature @@ -0,0 +1,6 @@ +

getFeature function

+Returns the first feature of a layer matching a given attribute value + +

Syntax

+
getFeature( layer, attributeField, value )
+