Skip to content

Commit 20d57b9

Browse files
committed
Add CQL_FILTER to WFS for QgsExpression
1 parent 0e11e93 commit 20d57b9

File tree

1 file changed

+42
-25
lines changed

1 file changed

+42
-25
lines changed

src/mapserver/qgswfsserver.cpp

+42-25
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,15 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
585585
}
586586
}
587587

588+
//read cql_filter
589+
bool cqlFilterOk = false;
590+
QString cqlFilter;
591+
QMap<QString, QString>::const_iterator cqlFilterIt = mParameterMap.find( "CQL_FILTER" );
592+
if ( cqlFilterIt != mParameterMap.end() )
593+
{
594+
cqlFilterOk = true;
595+
cqlFilter = cqlFilterIt.value();
596+
}
588597

589598
bool conversionSuccess;
590599
double minx, miny, maxx, maxy;
@@ -667,49 +676,57 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
667676
provider->featureAtId( fid.toInt(), feature, mWithGeom, attrIndexes );
668677
sendGetFeature( request, format, &feature, 0, layerCrs, fields, layerExcludedAttributes );
669678
}
670-
else if ( filterOk )
679+
else if ( cqlFilterOk )
671680
{
672681
provider->select( attrIndexes, searchRect, mWithGeom, true );
673-
try
682+
QgsExpression *mFilter = new QgsExpression( cqlFilter );
683+
if (mFilter->hasParserError())
684+
{
685+
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->parserErrorString() );
686+
}
687+
if ( mFilter )
674688
{
675-
QDomElement filterElem = filter.firstChildElement();
676-
QgsExpression *mFilter = QgsExpression::createFromOgcFilter( filterElem );
677-
if (mFilter->hasParserError())
678-
{
679-
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->parserErrorString() );
680-
}
681689
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
682690
{
683-
if ( mFilter )
691+
QVariant res = mFilter->evaluate( &feature, fields );
692+
if (mFilter->hasEvalError())
684693
{
685-
QVariant res = mFilter->evaluate( &feature, fields );
686-
if (mFilter->hasEvalError())
687-
{
688-
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->evalErrorString() );
689-
}
690-
if ( res.toInt() != 0 )
691-
{
692-
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
693-
++featureCounter;
694-
}
694+
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->evalErrorString() );
695695
}
696-
else
696+
if ( res.toInt() != 0 )
697697
{
698698
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
699699
++featureCounter;
700700
}
701701
}
702702
delete mFilter;
703703
}
704-
catch ( QgsMapServiceException& e )
704+
}
705+
else if ( filterOk )
706+
{
707+
provider->select( attrIndexes, searchRect, mWithGeom, true );
708+
QDomElement filterElem = filter.firstChildElement();
709+
QgsExpression *mFilter = QgsExpression::createFromOgcFilter( filterElem );
710+
if (mFilter->hasParserError())
711+
{
712+
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->parserErrorString() );
713+
}
714+
if ( mFilter )
705715
{
706-
Q_UNUSED( e );
707-
708716
while ( provider->nextFeature( feature ) && featureCounter < maxFeat )
709717
{
710-
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
711-
++featureCounter;
718+
QVariant res = mFilter->evaluate( &feature, fields );
719+
if (mFilter->hasEvalError())
720+
{
721+
throw QgsMapServiceException( "RequestNotWellFormed", mFilter->evalErrorString() );
722+
}
723+
if ( res.toInt() != 0 )
724+
{
725+
sendGetFeature( request, format, &feature, featureCounter, layerCrs, fields, layerExcludedAttributes );
726+
++featureCounter;
727+
}
712728
}
729+
delete mFilter;
713730
}
714731
}
715732
else

0 commit comments

Comments
 (0)