Skip to content

Commit 2894236

Browse files
author
Hugo Mercier
committed
[virtual] disable FilterRect when no unique id is present. Should fix #15134
1 parent 8dbe6ea commit 2894236

File tree

2 files changed

+32
-28
lines changed

2 files changed

+32
-28
lines changed

src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -43,38 +43,42 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
4343
wheres << subset;
4444
}
4545

46-
if ( mDefinition.hasDefinedGeometry() && !request.filterRect().isNull() )
46+
if ( !mDefinition.uid().isNull() )
4747
{
48-
bool do_exact = request.flags() & QgsFeatureRequest::ExactIntersect;
49-
QgsRectangle rect( request.filterRect() );
50-
QString mbr = QStringLiteral( "%1,%2,%3,%4" ).arg( rect.xMinimum() ).arg( rect.yMinimum() ).arg( rect.xMaximum() ).arg( rect.yMaximum() );
51-
wheres << quotedColumn( mDefinition.geometryField() ) + " is not null";
52-
wheres << QStringLiteral( "%1Intersects(%2,BuildMbr(%3))" )
53-
.arg( do_exact ? "" : "Mbr",
54-
quotedColumn( mDefinition.geometryField() ),
55-
mbr );
56-
}
57-
else if ( !mDefinition.uid().isNull() && request.filterType() == QgsFeatureRequest::FilterFid )
58-
{
59-
wheres << QStringLiteral( "%1=%2" )
60-
.arg( quotedColumn( mDefinition.uid() ) )
61-
.arg( request.filterFid() );
62-
}
63-
else if ( !mDefinition.uid().isNull() && request.filterType() == QgsFeatureRequest::FilterFids )
64-
{
65-
QString values = quotedColumn( mDefinition.uid() ) + " IN (";
66-
bool first = true;
67-
Q_FOREACH ( QgsFeatureId v, request.filterFids() )
48+
// filters are only available when a column with unique id exists
49+
if ( mDefinition.hasDefinedGeometry() && !request.filterRect().isNull() )
50+
{
51+
bool do_exact = request.flags() & QgsFeatureRequest::ExactIntersect;
52+
QgsRectangle rect( request.filterRect() );
53+
QString mbr = QStringLiteral( "%1,%2,%3,%4" ).arg( rect.xMinimum() ).arg( rect.yMinimum() ).arg( rect.xMaximum() ).arg( rect.yMaximum() );
54+
wheres << quotedColumn( mDefinition.geometryField() ) + " is not null";
55+
wheres << QStringLiteral( "%1Intersects(%2,BuildMbr(%3))" )
56+
.arg( do_exact ? "" : "Mbr",
57+
quotedColumn( mDefinition.geometryField() ),
58+
mbr );
59+
}
60+
else if ( request.filterType() == QgsFeatureRequest::FilterFid )
61+
{
62+
wheres << QStringLiteral( "%1=%2" )
63+
.arg( quotedColumn( mDefinition.uid() ) )
64+
.arg( request.filterFid() );
65+
}
66+
else if ( request.filterType() == QgsFeatureRequest::FilterFids )
6867
{
69-
if ( !first )
68+
QString values = quotedColumn( mDefinition.uid() ) + " IN (";
69+
bool first = true;
70+
Q_FOREACH ( QgsFeatureId v, request.filterFids() )
7071
{
71-
values += QLatin1String( "," );
72+
if ( !first )
73+
{
74+
values += QLatin1String( "," );
75+
}
76+
first = false;
77+
values += QString::number( v );
7278
}
73-
first = false;
74-
values += QString::number( v );
79+
values += QLatin1String( ")" );
80+
wheres << values;
7581
}
76-
values += QLatin1String( ")" );
77-
wheres << values;
7882
}
7983

8084
mFields = mSource->provider()->fields();

tests/src/python/test_provider_virtual.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ def test_sql2(self):
446446
QgsMapLayerRegistry.instance().addMapLayer(l2)
447447

448448
query = toPercent("SELECT * FROM france_parts")
449-
l4 = QgsVectorLayer("?query=%s" % query, "tt", "virtual")
449+
l4 = QgsVectorLayer("?query=%s&uid=ObjectId" % query, "tt", "virtual")
450450
self.assertEqual(l4.isValid(), True)
451451

452452
self.assertEqual(l4.dataProvider().wkbType(), 3)

0 commit comments

Comments
 (0)