From 888f8ec1a43edcae6444fb364d16e92273e7f3cb Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Thu, 23 Jan 2020 12:23:09 +0100 Subject: [PATCH 1/2] Merge pull request #33953 from elpaso/bugfix-gh33885-PG-slow-raster-scan Fix slow PG raster SRID identify --- src/providers/postgres/qgspostgresconn.cpp | 49 ++++++++++++++++++---- 1 file changed, 40 insertions(+), 9 deletions(-) diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp index a6c901d4cde7..772d6c1ad479 100644 --- a/src/providers/postgres/qgspostgresconn.cpp +++ b/src/providers/postgres/qgspostgresconn.cpp @@ -1682,12 +1682,44 @@ void QgsPostgresConn::retrieveLayerTypes( QVector &l if ( layerProperty.isRaster ) { - QString sql = QStringLiteral( "SELECT %3, " - "array_agg(DISTINCT 'RASTER:' || ST_SRID( %1 ))" - " FROM %2" ) - .arg( quotedIdentifier( layerProperty.geometryColName ) ) - .arg( table ) - .arg( i - 1 ); + QString sql; + + int srid = layerProperty.srids.value( 0, std::numeric_limits::min() ); + // SRID is already known + if ( srid != std::numeric_limits::min() ) + { + sql += QStringLiteral( "SELECT %1, array_agg( '%2:RASTER'::text )" ) + .arg( i - 1 ) + .arg( srid ); + } + else + { + if ( useEstimatedMetadata ) + { + sql = QStringLiteral( "SELECT %1, " + "array_agg( srid || ':RASTER') " + "FROM raster_columns " + "WHERE r_raster_column = %2 AND r_table_schema = %3 AND r_table_name = %4" ) + .arg( i - 1 ) + .arg( quotedValue( layerProperty.geometryColName ) ) + .arg( quotedValue( layerProperty.schemaName ) ) + .arg( quotedValue( layerProperty.tableName ) ); + } + else + { + sql = QStringLiteral( "SELECT %1, " + "array_agg( DISTINCT ST_SRID( %2 ) || ':RASTER' ) " + "FROM %3 " + "%2 IS NOT NULL " + "%4 " // SQL clause + "LIMIT %5" ) + .arg( i - 1 ) + .arg( quotedIdentifier( layerProperty.geometryColName ) ) + .arg( table ) + .arg( layerProperty.sql.isEmpty() ? QString() : QStringLiteral( " AND %1" ).arg( layerProperty.sql ) ) + .arg( GEOM_TYPE_SELECT_LIMIT ); + } + } QgsDebugMsg( "Raster srids query: " + sql ); query += sql; @@ -1697,11 +1729,10 @@ void QgsPostgresConn::retrieveLayerTypes( QVector &l // our estimatation ignores that a where clause might restrict the feature type or srid if ( useEstimatedMetadata ) { - table = QStringLiteral( "(SELECT %1 FROM %2%3 WHERE %4 IS NOT NULL LIMIT %5) AS t" ) + table = QStringLiteral( "(SELECT %1 FROM %2%3 WHERE %1 IS NOT NULL LIMIT %4) AS t" ) .arg( quotedIdentifier( layerProperty.geometryColName ), table, layerProperty.sql.isEmpty() ? QString() : QStringLiteral( " WHERE %1" ).arg( layerProperty.sql ) ) - .arg( layerProperty.geometryColName ) .arg( GEOM_TYPE_SELECT_LIMIT ); } else if ( !layerProperty.sql.isEmpty() ) @@ -1717,7 +1748,7 @@ void QgsPostgresConn::retrieveLayerTypes( QVector &l sql += QStringLiteral( "array_agg(DISTINCT " ); int srid = layerProperty.srids.value( 0, std::numeric_limits::min() ); - if ( srid == std::numeric_limits::min() ) + if ( srid == std::numeric_limits::min() ) { sql += QStringLiteral( "%1(%2%3)::text" ) .arg( majorVersion() < 2 ? "srid" : "st_srid", From f2722b533c099c0a23b118d73981a2cfa028956a Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Fri, 24 Jan 2020 12:54:11 +0100 Subject: [PATCH 2/2] Toggle layer visibility in custom layer order panel Fixes #33854 --- src/gui/layertree/qgscustomlayerorderwidget.cpp | 3 ++- src/gui/layertree/qgscustomlayerorderwidget.h | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/layertree/qgscustomlayerorderwidget.cpp b/src/gui/layertree/qgscustomlayerorderwidget.cpp index 083b006d5acd..1f9e28569594 100644 --- a/src/gui/layertree/qgscustomlayerorderwidget.cpp +++ b/src/gui/layertree/qgscustomlayerorderwidget.cpp @@ -132,13 +132,14 @@ QVariant CustomLayerOrderModel::data( const QModelIndex &index, int role ) const bool CustomLayerOrderModel::setData( const QModelIndex &index, const QVariant &value, int role ) { + Q_UNUSED( value ); // Toggle if ( role == Qt::CheckStateRole ) { QString id = mOrder.at( index.row() ); QgsLayerTreeLayer *nodeLayer = mBridge->rootGroup()->findLayer( id ); if ( nodeLayer ) { - nodeLayer->setItemVisibilityChecked( static_cast< Qt::CheckState >( value.toInt() ) == Qt::Checked ); + nodeLayer->setItemVisibilityChecked( ! nodeLayer->itemVisibilityChecked() ); return true; } } diff --git a/src/gui/layertree/qgscustomlayerorderwidget.h b/src/gui/layertree/qgscustomlayerorderwidget.h index 53a9e35962cd..42d5a51a70a2 100644 --- a/src/gui/layertree/qgscustomlayerorderwidget.h +++ b/src/gui/layertree/qgscustomlayerorderwidget.h @@ -53,7 +53,7 @@ class GUI_EXPORT QgsCustomLayerOrderWidget : public QWidget private slots: void bridgeHasCustomLayerOrderChanged( bool state ); void bridgeCustomLayerOrderChanged(); - //! Slot triggered when the ivsibility of a node changes + //! Slot triggered when the visibility of a node changes void nodeVisibilityChanged( QgsLayerTreeNode *node ); void modelUpdated();