Skip to content

Commit

Permalink
Call filterFeatures on QgsAttributeTableDialog::setFilterExpression i…
Browse files Browse the repository at this point in the history
…nstead of emitting the features there.

In the test, call the filter functions of the attribute table instead of the not existent filter feature widget (like it's done on later releases)
  • Loading branch information
signedav committed Apr 1, 2020
1 parent 6d7fc7e commit be51084
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 55 deletions.
51 changes: 1 addition & 50 deletions src/app/qgsattributetabledialog.cpp
Expand Up @@ -1263,12 +1263,6 @@ void QgsAttributeTableDialog::setFilterExpression( const QString &filterString,
}
}

QgsFeatureIds filteredFeatures;
QgsDistanceArea myDa;

myDa.setSourceCrs( mLayer->crs(), QgsProject::instance()->transformContext() );
myDa.setEllipsoid( QgsProject::instance()->ellipsoid() );

// parse search string and build parsed tree
QgsExpression filterExpression( filter );
if ( filterExpression.hasParserError() )
Expand All @@ -1284,50 +1278,7 @@ void QgsAttributeTableDialog::setFilterExpression( const QString &filterString,
QgisApp::instance()->messageBar()->pushMessage( tr( "Evaluation error" ), filterExpression.evalErrorString(), Qgis::Warning, QgisApp::instance()->messageTimeout() );
}

bool fetchGeom = filterExpression.needsGeometry();

QApplication::setOverrideCursor( Qt::WaitCursor );

filterExpression.setGeomCalculator( &myDa );
filterExpression.setDistanceUnits( QgsProject::instance()->distanceUnits() );
filterExpression.setAreaUnits( QgsProject::instance()->areaUnits() );
QgsFeatureRequest request( mMainView->masterModel()->request() );
request.setSubsetOfAttributes( filterExpression.referencedColumns(), mLayer->fields() );
if ( !fetchGeom )
{
request.setFlags( QgsFeatureRequest::NoGeometry );
}
else
{
// force geometry extraction if the filter requests it
request.setFlags( request.flags() & ~QgsFeatureRequest::NoGeometry );
}
QgsFeatureIterator featIt = mLayer->getFeatures( request );

QgsFeature f;

while ( featIt.nextFeature( f ) )
{
context.setFeature( f );
if ( filterExpression.evaluate( &context ).toInt() != 0 )
filteredFeatures << f.id();

// check if there were errors during evaluating
if ( filterExpression.hasEvalError() )
break;
}

featIt.close();

mMainView->setFilteredFeatures( filteredFeatures );

QApplication::restoreOverrideCursor();

if ( filterExpression.hasEvalError() )
{
QgisApp::instance()->messageBar()->pushMessage( tr( "Error filtering" ), filterExpression.evalErrorString(), Qgis::Warning, QgisApp::instance()->messageTimeout() );
return;
}
mMainView->filterFeatures( filterExpression, context );
mMainView->setFilterMode( QgsAttributeTableFilterModel::ShowFilteredList );
}

Expand Down
10 changes: 5 additions & 5 deletions tests/src/app/testqgsattributetable.cpp
Expand Up @@ -429,7 +429,7 @@ void TestQgsAttributeTable::testFilteredFeatures()
std::unique_ptr< QgsAttributeTableDialog > dlg( new QgsAttributeTableDialog( tempLayer.get(), QgsAttributeTableFilterModel::ShowAll ) );

// show all (three features)
dlg->mFeatureFilterWidget->filterShowAll();
dlg->filterShowAll();
QCOMPARE( dlg->mMainView->featureCount(), 3 );
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 3 );

Expand All @@ -442,15 +442,15 @@ void TestQgsAttributeTable::testFilteredFeatures()
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 4 );

// bigger 5 (two of four features)
dlg->mFeatureFilterWidget->setFilterExpression( QStringLiteral( "col1>5" ), QgsAttributeForm::ReplaceFilter, true );
dlg->setFilterExpression( QStringLiteral( "col1>5" ), QgsAttributeForm::ReplaceFilter, true );
QCOMPARE( dlg->mMainView->featureCount(), 4 );
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 2 );
// bigger 7 (one of four features)
dlg->mFeatureFilterWidget->setFilterExpression( QStringLiteral( "col1>7" ), QgsAttributeForm::ReplaceFilter, true );
dlg->setFilterExpression( QStringLiteral( "col1>7" ), QgsAttributeForm::ReplaceFilter, true );
QCOMPARE( dlg->mMainView->featureCount(), 4 );
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 1 );
// bigger 9 (no of four features)
dlg->mFeatureFilterWidget->setFilterExpression( QStringLiteral( "col1>9" ), QgsAttributeForm::ReplaceFilter, true );
dlg->setFilterExpression( QStringLiteral( "col1>9" ), QgsAttributeForm::ReplaceFilter, true );
QCOMPARE( dlg->mMainView->featureCount(), 4 );
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 0 );

Expand Down Expand Up @@ -482,7 +482,7 @@ void TestQgsAttributeTable::testFilteredFeatures()
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 1 );

// smaller 11 (three of four features)
dlg->mFeatureFilterWidget->setFilterExpression( QStringLiteral( "col1<11" ), QgsAttributeForm::ReplaceFilter, true );
dlg->setFilterExpression( QStringLiteral( "col1<11" ), QgsAttributeForm::ReplaceFilter, true );
QCOMPARE( dlg->mMainView->filteredFeatureCount(), 3 );
}

Expand Down

0 comments on commit be51084

Please sign in to comment.