@@ -549,13 +549,35 @@ QString QgsPostgresUtils::whereClause( QgsFeatureId featureId, const QgsFields&
549
549
550
550
QString QgsPostgresUtils::whereClause ( const QgsFeatureIds& featureIds, const QgsFields& fields, QgsPostgresConn* conn, QgsPostgresPrimaryKeyType pkType, const QList<int >& pkAttrs, QSharedPointer<QgsPostgresSharedData> sharedData )
551
551
{
552
- QStringList whereClauses;
553
- Q_FOREACH ( const QgsFeatureId featureId, featureIds )
552
+ switch ( pkType )
554
553
{
555
- whereClauses << whereClause ( featureId, fields, conn, pkType, pkAttrs, sharedData );
556
- }
554
+ case pktOid:
555
+ case pktInt:
556
+ {
557
+ // simple primary key, so prefer to use an "IN (...)" query. These are much faster then multiple chained ...OR... clauses
558
+ QString delim;
559
+ QString expr = QString ( " %1 IN (" ).arg (( pkType == pktOid ? " oid" : QgsPostgresConn::quotedIdentifier ( fields[ pkAttrs[0 ] ].name () ) ) );
557
560
558
- return whereClauses.isEmpty () ? " " : whereClauses.join ( " OR " ).prepend ( ' (' ).append ( ' )' );
561
+ Q_FOREACH ( const QgsFeatureId featureId, featureIds )
562
+ {
563
+ expr += delim + QString::number ( featureId );
564
+ delim = ' ,' ;
565
+ }
566
+ expr += ' )' ;
567
+
568
+ return expr;
569
+ }
570
+ default :
571
+ {
572
+ // complex primary key, need to build up where string
573
+ QStringList whereClauses;
574
+ Q_FOREACH ( const QgsFeatureId featureId, featureIds )
575
+ {
576
+ whereClauses << whereClause ( featureId, fields, conn, pkType, pkAttrs, sharedData );
577
+ }
578
+ return whereClauses.isEmpty () ? " " : whereClauses.join ( " OR " ).prepend ( ' (' ).append ( ' )' );
579
+ }
580
+ }
559
581
}
560
582
561
583
QString QgsPostgresUtils::andWhereClauses ( const QString& c1, const QString& c2 )
0 commit comments