22QString QgsExtractByAttributeAlgorithm::name()
 const 
   24  return QStringLiteral( 
"extractbyattribute" );
 
   27QString QgsExtractByAttributeAlgorithm::displayName()
 const 
   29  return QObject::tr( 
"Extract by attribute" );
 
   32QStringList QgsExtractByAttributeAlgorithm::tags()
 const 
   34  return QObject::tr( 
"extract,filter,attribute,value,contains,null,field" ).split( 
',' );
 
   37QString QgsExtractByAttributeAlgorithm::group()
 const 
   39  return QObject::tr( 
"Vector selection" );
 
   42QString QgsExtractByAttributeAlgorithm::groupId()
 const 
   44  return QStringLiteral( 
"vectorselection" );
 
   47void QgsExtractByAttributeAlgorithm::initAlgorithm( 
const QVariantMap & )
 
   51  addParameter( 
new QgsProcessingParameterField( QStringLiteral( 
"FIELD" ), QObject::tr( 
"Selection attribute" ), QVariant(), QStringLiteral( 
"INPUT" ) ) );
 
   59                << QObject::tr( 
"begins with" )
 
   60                << QObject::tr( 
"contains" )
 
   61                << QObject::tr( 
"is null" )
 
   62                << QObject::tr( 
"is not null" )
 
   63                << QObject::tr( 
"does not contain" ), 
false, 0 ) );
 
   70  addParameter( failOutput );
 
   73QString QgsExtractByAttributeAlgorithm::shortHelpString()
 const 
   75  return QObject::tr( 
"This algorithm creates a new vector layer that only contains matching features from an input layer. " 
   76                      "The criteria for adding features to the resulting layer is defined based on the values " 
   77                      "of an attribute from the input layer." );
 
   80QgsExtractByAttributeAlgorithm *QgsExtractByAttributeAlgorithm::createInstance()
 const 
   82  return new QgsExtractByAttributeAlgorithm();
 
   87  std::unique_ptr< QgsProcessingFeatureSource > source( parameterAsSource( parameters, QStringLiteral( 
"INPUT" ), context ) );
 
   91  const QString fieldName = parameterAsString( parameters, QStringLiteral( 
"FIELD" ), context );
 
   92  const Operation op = 
static_cast< Operation 
>( parameterAsEnum( parameters, QStringLiteral( 
"OPERATOR" ), context ) );
 
   93  const QString value = parameterAsString( parameters, QStringLiteral( 
"VALUE" ), context );
 
   95  QString matchingSinkId;
 
   96  std::unique_ptr< QgsFeatureSink > matchingSink( parameterAsSink( parameters, QStringLiteral( 
"OUTPUT" ), context, matchingSinkId, source->fields(),
 
   97      source->wkbType(), source->sourceCrs() ) );
 
  101  QString nonMatchingSinkId;
 
  102  std::unique_ptr< QgsFeatureSink > nonMatchingSink( parameterAsSink( parameters, QStringLiteral( 
"FAIL_OUTPUT" ), context, nonMatchingSinkId, source->fields(),
 
  103      source->wkbType(), source->sourceCrs() ) );
 
  105  const int idx = source->fields().lookupField( fieldName );
 
  107    throw QgsProcessingException( QObject::tr( 
"Field '%1' was not found in INPUT source" ).arg( fieldName ) );
 
  109  const QVariant::Type fieldType = source->fields().at( idx ).type();
 
  111  if ( fieldType != QVariant::String && ( op == BeginsWith || op == Contains || op == DoesNotContain ) )
 
  117        method = QObject::tr( 
"begins with" );
 
  120        method = QObject::tr( 
"contains" );
 
  123        method = QObject::tr( 
"does not contain" );
 
  130    throw QgsProcessingException( QObject::tr( 
"Operator '%1' can be used only with string fields." ).arg( method ) );
 
  139      expr = QStringLiteral( 
"%1 = %3" ).arg( fieldRef, quotedVal );
 
  142      expr = QStringLiteral( 
"%1 != %3" ).arg( fieldRef, quotedVal );
 
  145      expr = QStringLiteral( 
"%1 > %3" ).arg( fieldRef, quotedVal );
 
  147    case GreaterThanEqualTo:
 
  148      expr = QStringLiteral( 
"%1 >= %3" ).arg( fieldRef, quotedVal );
 
  151      expr = QStringLiteral( 
"%1 < %3" ).arg( fieldRef, quotedVal );
 
  153    case LessThanEqualTo:
 
  154      expr = QStringLiteral( 
"%1 <= %3" ).arg( fieldRef, quotedVal );
 
  157      expr = QStringLiteral( 
"%1 LIKE '%2%'" ).arg( fieldRef, value );
 
  160      expr = QStringLiteral( 
"%1 LIKE '%%2%'" ).arg( fieldRef, value );
 
  163      expr = QStringLiteral( 
"%1 IS NULL" ).arg( fieldRef );
 
  166      expr = QStringLiteral( 
"%1 IS NOT NULL" ).arg( fieldRef );
 
  169      expr = QStringLiteral( 
"%1 NOT LIKE '%%2%'" ).arg( fieldRef, value );
 
  174  if ( expression.hasParserError() )
 
  179  QgsExpressionContext expressionContext = createExpressionContext( parameters, context, source.get() );
 
  181  const long count = source->featureCount();
 
  183  const double step = count > 0 ? 100.0 / count : 1;
 
  186  if ( !nonMatchingSink )
 
  203        throw QgsProcessingException( writeFeatureError( matchingSink.get(), parameters, QStringLiteral( 
"OUTPUT" ) ) );
 
  212    expressionContext.
setFields( source->fields() );
 
  213    expression.prepare( &expressionContext );
 
  225      if ( expression.evaluate( &expressionContext ).toBool() )
 
  228          throw QgsProcessingException( writeFeatureError( matchingSink.get(), parameters, QStringLiteral( 
"OUTPUT" ) ) );
 
  233          throw QgsProcessingException( writeFeatureError( nonMatchingSink.get(), parameters, QStringLiteral( 
"FAIL_OUTPUT" ) ) );
 
  243  outputs.insert( QStringLiteral( 
"OUTPUT" ), matchingSinkId );
 
  244  if ( nonMatchingSink )
 
  245    outputs.insert( QStringLiteral( 
"FAIL_OUTPUT" ), nonMatchingSinkId );
 
Expression contexts are used to encapsulate the parameters around which a QgsExpression should be eva...
 
void setFeature(const QgsFeature &feature)
Convenience function for setting a feature for the context.
 
void setFields(const QgsFields &fields)
Convenience function for setting a fields for the context.
 
Class for parsing and evaluation of expressions (formerly called "search strings").
 
static QString quotedValue(const QVariant &value)
Returns a string representation of a literal value, including appropriate quotations where required.
 
static QString quotedColumnRef(QString name)
Returns a quoted column reference (in double quotes)
 
Wrapper for iterator of features from vector data provider or vector layer.
 
bool nextFeature(QgsFeature &f)
 
This class wraps a request for features to a vector layer (or directly its vector data provider).
 
QgsFeatureRequest & setFilterExpression(const QString &expression)
Set the filter expression.
 
QgsFeatureRequest & setExpressionContext(const QgsExpressionContext &context)
Sets the expression context used to evaluate filter expressions.
 
@ FastInsert
Use faster inserts, at the cost of updating the passed features to reflect changes made at the provid...
 
The feature class encapsulates a single feature including its unique ID, geometry and a list of field...
 
bool isCanceled() const SIP_HOLDGIL
Tells whether the operation has been canceled already.
 
void setProgress(double progress)
Sets the current progress for the feedback object.
 
Contains information about the context in which a processing algorithm is executed.
 
void setCreateByDefault(bool createByDefault)
Sets whether the destination should be created by default.
 
Custom exception class for processing related exceptions.
 
@ FlagSkipGeometryValidityChecks
Invalid geometry checks should always be skipped. This flag can be useful for algorithms which always...
 
Base class for providing feedback from a processing algorithm.
 
An enum based parameter for processing algorithms, allowing for selection from predefined values.
 
A feature sink output for processing algorithms.
 
An input feature source (such as vector layers) parameter for processing algorithms.
 
A vector layer or feature source field parameter for processing algorithms.
 
A string parameter for processing algorithms.
 
@ TypeVector
Tables (i.e. vector layers with or without geometry). When used for a sink this indicates the sink ha...
 
@ TypeVectorAnyGeometry
Any vector layer with geometry.