diff --git a/python/core/qgssearchtreenode.sip b/python/core/qgssearchtreenode.sip index a8e093c76dc..e3b75c4ebfd 100644 --- a/python/core/qgssearchtreenode.sip +++ b/python/core/qgssearchtreenode.sip @@ -68,8 +68,7 @@ class QgsSearchTreeNode Type type(); //! node value getters - // TODO: for some reason this function is not found by dynamic linker - //Operator op(); + Operator op(); double number(); QString columnRef(); QString string(); @@ -108,6 +107,10 @@ class QgsSearchTreeNode //! @note added in 1.5 QStringList referencedColumns(); + //! check whether there are any operators that need geometry (for area, length) + //! @note added in 1.5 + bool needsGeometry(); + protected: diff --git a/src/app/attributetable/qgsattributetabledialog.cpp b/src/app/attributetable/qgsattributetabledialog.cpp index ba408dd2e07..b7c6a37ce01 100644 --- a/src/app/attributetable/qgsattributetabledialog.cpp +++ b/src/app/attributetable/qgsattributetabledialog.cpp @@ -533,15 +533,19 @@ void QgsAttributeTableDialog::doSearch( QString searchString ) return; } + // TODO: fetch only necessary columns + // QStringList columns = searchTree->referencedColumns(); + bool fetchGeom = searchTree->needsGeometry(); + QApplication::setOverrideCursor( Qt::WaitCursor ); mSelectedFeatures.clear(); if ( cbxSearchSelectedOnly->isChecked() ) { QgsFeatureList selectedFeatures = mLayer->selectedFeatures(); - for ( QgsFeatureList::ConstIterator it = selectedFeatures.begin(); it != selectedFeatures.end(); ++it ) + for ( QgsFeatureList::Iterator it = selectedFeatures.begin(); it != selectedFeatures.end(); ++it ) { - if ( searchTree->checkAgainst( mLayer->pendingFields(), it->attributeMap() ) ) + if ( searchTree->checkAgainst( mLayer->pendingFields(), it->attributeMap(), it->geometry() ) ) mSelectedFeatures << it->id(); // check if there were errors during evaluating @@ -551,12 +555,12 @@ void QgsAttributeTableDialog::doSearch( QString searchString ) } else { - mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), false ); + mLayer->select( mLayer->pendingAllAttributesList(), QgsRectangle(), fetchGeom ); QgsFeature f; while ( mLayer->nextFeature( f ) ) { - if ( searchTree->checkAgainst( mLayer->pendingFields(), f.attributeMap() ) ) + if ( searchTree->checkAgainst( mLayer->pendingFields(), f.attributeMap(), f.geometry() ) ) mSelectedFeatures << f.id(); // check if there were errors during evaluating diff --git a/src/app/qgssearchquerybuilder.cpp b/src/app/qgssearchquerybuilder.cpp index 867c7d32657..3998d84c964 100644 --- a/src/app/qgssearchquerybuilder.cpp +++ b/src/app/qgssearchquerybuilder.cpp @@ -190,6 +190,8 @@ long QgsSearchQueryBuilder::countRecords( QString searchString ) return mLayer->featureCount(); } + bool fetchGeom = searchTree->needsGeometry(); + QApplication::setOverrideCursor( Qt::WaitCursor ); int count = 0; @@ -198,11 +200,11 @@ long QgsSearchQueryBuilder::countRecords( QString searchString ) const QgsFieldMap& fields = provider->fields(); QgsAttributeList allAttributes = provider->attributeIndexes(); - provider->select( allAttributes, QgsRectangle(), false ); + provider->select( allAttributes, QgsRectangle(), fetchGeom ); while ( provider->nextFeature( feat ) ) { - if ( searchTree->checkAgainst( fields, feat.attributeMap() ) ) + if ( searchTree->checkAgainst( fields, feat.attributeMap(), feat.geometry() ) ) { count++; } diff --git a/src/core/qgssearchtreenode.cpp b/src/core/qgssearchtreenode.cpp index 8d58a2346b8..4439f91a51d 100644 --- a/src/core/qgssearchtreenode.cpp +++ b/src/core/qgssearchtreenode.cpp @@ -249,6 +249,25 @@ QStringList QgsSearchTreeNode::referencedColumns() } +bool QgsSearchTreeNode::needsGeometry() +{ + if ( mType == tOperator ) + { + if ( mOp == opLENGTH || mOp == opAREA ) + return true; + + if ( mLeft && mLeft->needsGeometry() ) + return true; + if ( mRight && mRight->needsGeometry() ) + return true; + return false; + } + else + { + return false; + } +} + bool QgsSearchTreeNode::checkAgainst( const QgsFieldMap& fields, const QgsAttributeMap& attributes, QgsGeometry* geom ) { diff --git a/src/core/qgssearchtreenode.h b/src/core/qgssearchtreenode.h index d94b92d07f0..ee204ad9a0c 100644 --- a/src/core/qgssearchtreenode.h +++ b/src/core/qgssearchtreenode.h @@ -106,7 +106,7 @@ class CORE_EXPORT QgsSearchTreeNode Type type() { return mType; } //! node value getters - Operator op(); + Operator op() { return mOp; } double number() { return mNumber; } QString columnRef() { return mText; } QString string() { return mText; } @@ -145,6 +145,10 @@ class CORE_EXPORT QgsSearchTreeNode //! @note added in 1.5 QStringList referencedColumns(); + //! check whether there are any operators that need geometry (for area, length) + //! @note added in 1.5 + bool needsGeometry(); + protected: