[QGIS Commit] r13434 - in trunk/qgis: python/core src/app src/app/attributetable src/core

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri May 7 05:15:10 EDT 2010


Author: wonder
Date: 2010-05-07 05:15:08 -0400 (Fri, 07 May 2010)
New Revision: 13434

Modified:
   trunk/qgis/python/core/qgssearchtreenode.sip
   trunk/qgis/src/app/attributetable/qgsattributetabledialog.cpp
   trunk/qgis/src/app/qgssearchquerybuilder.cpp
   trunk/qgis/src/core/qgssearchtreenode.cpp
   trunk/qgis/src/core/qgssearchtreenode.h
Log:
Added the possibility to use $area, $length when searching in attribute table.


Modified: trunk/qgis/python/core/qgssearchtreenode.sip
===================================================================
--- trunk/qgis/python/core/qgssearchtreenode.sip	2010-05-07 08:39:37 UTC (rev 13433)
+++ trunk/qgis/python/core/qgssearchtreenode.sip	2010-05-07 09:15:08 UTC (rev 13434)
@@ -68,8 +68,7 @@
     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 @@
     //! @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:
 
 

Modified: trunk/qgis/src/app/attributetable/qgsattributetabledialog.cpp
===================================================================
--- trunk/qgis/src/app/attributetable/qgsattributetabledialog.cpp	2010-05-07 08:39:37 UTC (rev 13433)
+++ trunk/qgis/src/app/attributetable/qgsattributetabledialog.cpp	2010-05-07 09:15:08 UTC (rev 13434)
@@ -533,15 +533,19 @@
     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 @@
   }
   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

Modified: trunk/qgis/src/app/qgssearchquerybuilder.cpp
===================================================================
--- trunk/qgis/src/app/qgssearchquerybuilder.cpp	2010-05-07 08:39:37 UTC (rev 13433)
+++ trunk/qgis/src/app/qgssearchquerybuilder.cpp	2010-05-07 09:15:08 UTC (rev 13434)
@@ -190,6 +190,8 @@
     return mLayer->featureCount();
   }
 
+  bool fetchGeom = searchTree->needsGeometry();
+
   QApplication::setOverrideCursor( Qt::WaitCursor );
 
   int count = 0;
@@ -198,11 +200,11 @@
   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++;
     }

Modified: trunk/qgis/src/core/qgssearchtreenode.cpp
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.cpp	2010-05-07 08:39:37 UTC (rev 13433)
+++ trunk/qgis/src/core/qgssearchtreenode.cpp	2010-05-07 09:15:08 UTC (rev 13434)
@@ -249,7 +249,26 @@
 
 }
 
+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 )
 {
   QgsDebugMsgLevel( "checkAgainst: " + makeSearchString(), 2 );

Modified: trunk/qgis/src/core/qgssearchtreenode.h
===================================================================
--- trunk/qgis/src/core/qgssearchtreenode.h	2010-05-07 08:39:37 UTC (rev 13433)
+++ trunk/qgis/src/core/qgssearchtreenode.h	2010-05-07 09:15:08 UTC (rev 13434)
@@ -106,7 +106,7 @@
     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 @@
     //! @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:
 
 



More information about the QGIS-commit mailing list