[QGIS Commit] r13584 - trunk/qgis/src/providers/postgres

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri May 28 17:58:36 EDT 2010


Author: jef
Date: 2010-05-28 17:58:35 -0400 (Fri, 28 May 2010)
New Revision: 13584

Modified:
   trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
   trunk/qgis/src/providers/postgres/qgspostgresprovider.h
Log:
postgres provider update:
- lazy determine extent and invalidate extent on subst string change (fixes #2752 for postgres)
- use estimate extent when "use estimate metadata" is set (reverts r13499)
- remove rest of unused threading


Modified: trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp
===================================================================
--- trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2010-05-28 21:31:38 UTC (rev 13583)
+++ trunk/qgis/src/providers/postgres/qgspostgresprovider.cpp	2010-05-28 21:58:35 UTC (rev 13584)
@@ -134,7 +134,7 @@
   }
 
   deduceEndian();
-  calculateExtents();
+  layerExtent.setMinimal();
   featuresCounted = -1;
 
   // set the primary key
@@ -717,12 +717,6 @@
   layerExtent.setYMinimum( newExtent.yMinimum() );
 }
 
-// TODO - make this function return the real extent_
-QgsRectangle QgsPostgresProvider::extent()
-{
-  return layerExtent;      //extent_->MinX, extent_->MinY, extent_->MaxX, extent_->MaxY);
-}
-
 /**
  * Return the feature type
  */
@@ -2740,9 +2734,8 @@
   // uri? Perhaps this needs some rationalisation.....
   setDataSourceUri( mUri.uri() );
 
-  // need to recalculate the number of features...
   featuresCounted = -1;
-  calculateExtents();
+  layerExtent.setMinimal();
 
   return true;
 }
@@ -2752,16 +2745,13 @@
  */
 long QgsPostgresProvider::featureCount() const
 {
-  if( featuresCounted >= 0 )
+  if ( featuresCounted >= 0 )
     return featuresCounted;
 
   // get total number of features
-
-  // First get an approximate count; then delegate to
-  // a thread the task of getting the full count.
   QString sql;
 
-  if ( !isQuery && mUseEstimatedMetadata && sqlWhereClause.isEmpty() )
+  if ( !isQuery && mUseEstimatedMetadata )
   {
     sql = QString( "select reltuples::int from pg_catalog.pg_class where oid=regclass(%1)::oid" ).arg( quotedValue( mQuery ) );
   }
@@ -2787,130 +2777,79 @@
   return featuresCounted;
 }
 
-void QgsPostgresProvider::calculateExtents()
+QgsRectangle QgsPostgresProvider::extent()
 {
-  QString sql;
-  Result result;
-  QString ext;
-
-  // get the extents
-  if ( !isQuery && ( mUseEstimatedMetadata || sqlWhereClause.isEmpty() ) )
+  if ( layerExtent.isEmpty() )
   {
-    // do stats exists?
-    sql = QString( "SELECT COUNT(*) FROM pg_stats WHERE schemaname=%1 AND tablename=%2 AND attname=%3" )
-          .arg( quotedValue( mSchemaName ) )
-          .arg( quotedValue( mTableName ) )
-          .arg( quotedValue( geometryColumn ) );
-    result = connectionRO->PQexec( sql );
-    if ( PQresultStatus( result ) == PGRES_TUPLES_OK && PQntuples( result ) == 1 )
+    QString sql;
+    Result result;
+    QString ext;
+
+    // get the extents
+    if ( !isQuery && ( mUseEstimatedMetadata || sqlWhereClause.isEmpty() ) )
     {
-      if ( QString::fromUtf8( PQgetvalue( result, 0, 0 ) ).toInt() > 0 )
+      // do stats exists?
+      sql = QString( "SELECT COUNT(*) FROM pg_stats WHERE schemaname=%1 AND tablename=%2 AND attname=%3" )
+            .arg( quotedValue( mSchemaName ) )
+            .arg( quotedValue( mTableName ) )
+            .arg( quotedValue( geometryColumn ) );
+      result = connectionRO->PQexec( sql );
+      if ( PQresultStatus( result ) == PGRES_TUPLES_OK && PQntuples( result ) == 1 )
       {
-        sql = QString( "select estimated_extent(%1,%2,%3)" )
-              .arg( quotedValue( mSchemaName ) )
-              .arg( quotedValue( mTableName ) )
-              .arg( quotedValue( geometryColumn ) );
-        result = connectionRO->PQexec( sql );
-        if ( PQresultStatus( result ) == PGRES_TUPLES_OK && PQntuples( result ) == 1 )
-          ext = PQgetvalue( result, 0, 0 );
+        if ( QString::fromUtf8( PQgetvalue( result, 0, 0 ) ).toInt() > 0 )
+        {
+          sql = QString( "select estimated_extent(%1,%2,%3)" )
+                .arg( quotedValue( mSchemaName ) )
+                .arg( quotedValue( mTableName ) )
+                .arg( quotedValue( geometryColumn ) );
+          result = connectionRO->PQexec( sql );
+          if ( PQresultStatus( result ) == PGRES_TUPLES_OK && PQntuples( result ) == 1 )
+            ext = PQgetvalue( result, 0, 0 );
+        }
       }
-    }
-    else
-    {
-      QgsDebugMsg( QString( "no column statistics for %1.%2.%3" ).arg( mSchemaName ).arg( mTableName ).arg( geometryColumn ) );
-    }
-  }
-
-  if ( ext.isEmpty() )
-  {
-    sql = QString( "select extent(%1) from %2" )
-          .arg( quotedIdentifier( geometryColumn ) )
-          .arg( mQuery );
-
-    if ( !sqlWhereClause.isEmpty() )
-      sql += QString( " where %1" ).arg( sqlWhereClause );
-
-    result = connectionRO->PQexec( sql );
-    if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
-      connectionRO->PQexecNR( "ROLLBACK" );
-    else if ( PQntuples( result ) == 1 )
-      ext = PQgetvalue( result, 0, 0 );
-  }
-
-  QgsDebugMsg( "Got extents using: " + sql );
-
-  QRegExp rx( "\\((.+) (.+),(.+) (.+)\\)" );
-  if ( ext.contains( rx ) )
-  {
-    QStringList ex = rx.capturedTexts();
-
-    layerExtent.setXMinimum( ex[1].toDouble() );
-    layerExtent.setYMinimum( ex[2].toDouble() );
-    layerExtent.setXMaximum( ex[3].toDouble() );
-    layerExtent.setYMaximum( ex[4].toDouble() );
-  }
-  else
-  {
-    QgsDebugMsg( "extents query failed" );
-  }
-
-  QgsDebugMsg( "Set extents to: " + layerExtent.toString() );
-}
-
-/**
- * Event sink for events from threads
- */
-void QgsPostgresProvider::customEvent( QEvent * e )
-{
-  QgsDebugMsg( "received a custom event " + QString::number( e->type() ) );
-
-  switch (( int ) e->type() )
-  {
-    case QGis::ProviderExtentCalcEvent:
-
-      QgsDebugMsg( "extent has been calculated" );
-
-      // Collect the new extent from the event and set this layer's
-      // extent with it.
-
+      else
       {
-        QgsRectangle* r = (( QgsProviderExtentCalcEvent* ) e )->layerExtent();
-        setExtent( *r );
+        QgsDebugMsg( QString( "no column statistics for %1.%2.%3" ).arg( mSchemaName ).arg( mTableName ).arg( geometryColumn ) );
       }
+    }
 
-      QgsDebugMsg( "new extent has been saved" );
+    if ( ext.isEmpty() )
+    {
+      sql = QString( "select extent(%1) from %2" )
+            .arg( quotedIdentifier( geometryColumn ) )
+            .arg( mQuery );
 
-      QgsDebugMsg( "Set extent to: " + layerExtent.toString() );
+      if ( !sqlWhereClause.isEmpty() )
+        sql += QString( " where %1" ).arg( sqlWhereClause );
 
-      QgsDebugMsg( "emitting fullExtentCalculated()" );
+      result = connectionRO->PQexec( sql );
+      if ( PQresultStatus( result ) != PGRES_TUPLES_OK )
+        connectionRO->PQexecNR( "ROLLBACK" );
+      else if ( PQntuples( result ) == 1 )
+        ext = PQgetvalue( result, 0, 0 );
+    }
 
-      emit fullExtentCalculated();
+    QgsDebugMsg( "Got extents using: " + sql );
 
-      // TODO: Only uncomment this when the overview map canvas has been subclassed
-      // from the QgsMapCanvas
+    QRegExp rx( "\\((.+) (.+),(.+) (.+)\\)" );
+    if ( ext.contains( rx ) )
+    {
+      QStringList ex = rx.capturedTexts();
 
-      //        QgsDebugMsg("emitting repaintRequested()");
-      //        emit repaintRequested();
+      layerExtent.setXMinimum( ex[1].toDouble() );
+      layerExtent.setYMinimum( ex[2].toDouble() );
+      layerExtent.setXMaximum( ex[3].toDouble() );
+      layerExtent.setYMaximum( ex[4].toDouble() );
+    }
+    else
+    {
+      QgsDebugMsg( "extents query failed" );
+    }
 
-      break;
-
-    case QGis::ProviderCountCalcEvent:
-
-      QgsDebugMsg( "count has been calculated" );
-
-      featuresCounted = (( QgsProviderCountCalcEvent* ) e )->featuresCounted();
-
-      QgsDebugMsg( "count is " + QString::number( featuresCounted ) );
-
-      break;
-
-    default:
-      // do nothing
-      break;
+    QgsDebugMsg( "Set extents to: " + layerExtent.toString() );
   }
 
-  QgsDebugMsg( "Finished processing custom event " + QString::number( e->type() ) );
-
+  return layerExtent;
 }
 
 

Modified: trunk/qgis/src/providers/postgres/qgspostgresprovider.h
===================================================================
--- trunk/qgis/src/providers/postgres/qgspostgresprovider.h	2010-05-28 21:31:38 UTC (rev 13583)
+++ trunk/qgis/src/providers/postgres/qgspostgresprovider.h	2010-05-28 21:58:35 UTC (rev 13584)
@@ -567,14 +567,6 @@
 
     int enabledCapabilities;
 
-    //! Calculate the extents of the layer
-    void calculateExtents();
-
-    /**
-     * Event sink for events from threads
-     */
-    void customEvent( QEvent *e );
-
     void appendGeomString( QgsGeometry *geom, QString &geomParam ) const;
     QString paramValue( QString fieldvalue, const QString &defaultValue ) const;
 



More information about the QGIS-commit mailing list