@@ -603,7 +603,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
603
603
if ( featureCounter == 0 )
604
604
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
605
605
606
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
606
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
607
607
608
608
fid = " " ;
609
609
++featCounter;
@@ -642,7 +642,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
642
642
643
643
if ( featureCounter >= startIndex )
644
644
{
645
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
645
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
646
646
++featCounter;
647
647
}
648
648
++featureCounter;
@@ -696,7 +696,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
696
696
697
697
if ( featureCounter >= startIndex )
698
698
{
699
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
699
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
700
700
++featCounter;
701
701
}
702
702
++featureCounter;
@@ -714,7 +714,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
714
714
715
715
if ( featureCounter >= startIndex )
716
716
{
717
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
717
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
718
718
++featCounter;
719
719
}
720
720
++featureCounter;
@@ -977,7 +977,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
977
977
if ( featureCounter == 0 )
978
978
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
979
979
980
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
980
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
981
981
++featCounter;
982
982
++featureCounter;
983
983
}
@@ -1026,7 +1026,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1026
1026
1027
1027
if ( featureCounter >= startIndex )
1028
1028
{
1029
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1029
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
1030
1030
++featCounter;
1031
1031
}
1032
1032
++featureCounter;
@@ -1063,7 +1063,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1063
1063
if ( featureCounter == 0 )
1064
1064
startGetFeature ( request, format, layerPrec, layerCrs, &searchRect );
1065
1065
1066
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1066
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
1067
1067
1068
1068
fid = " " ;
1069
1069
++featCounter;
@@ -1102,7 +1102,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1102
1102
1103
1103
if ( featureCounter >= startIndex )
1104
1104
{
1105
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1105
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
1106
1106
++featCounter;
1107
1107
}
1108
1108
++featureCounter;
@@ -1151,7 +1151,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1151
1151
1152
1152
if ( featureCounter >= startIndex )
1153
1153
{
1154
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1154
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
1155
1155
++featCounter;
1156
1156
}
1157
1157
++featureCounter;
@@ -1190,7 +1190,7 @@ int QgsWFSServer::getFeature( QgsRequestHandler& request, const QString& format
1190
1190
1191
1191
if ( featureCounter >= startIndex )
1192
1192
{
1193
- setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes );
1193
+ setGetFeature ( request, format, &feature, featCounter, layerPrec, layerCrs, attrIndexes, layerExcludedAttributes, provider-> pkAttributeIndexes () );
1194
1194
++featCounter;
1195
1195
}
1196
1196
++featureCounter;
@@ -1363,7 +1363,8 @@ void QgsWFSServer::startGetFeature( QgsRequestHandler& request, const QString& f
1363
1363
fcString = " " ;
1364
1364
}
1365
1365
1366
- void QgsWFSServer::setGetFeature ( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /* const*/
1366
+ void QgsWFSServer::setGetFeature ( QgsRequestHandler& request, const QString& format, QgsFeature* feat, int featIdx, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
1367
+ const QgsAttributeList& pkAttributes ) /* const*/
1367
1368
{
1368
1369
if ( !feat->isValid () )
1369
1370
return ;
@@ -1376,7 +1377,7 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
1376
1377
fcString += " " ;
1377
1378
else
1378
1379
fcString += " ," ;
1379
- fcString += createFeatureGeoJSON ( feat, prec, crs, attrIndexes, excludedAttributes );
1380
+ fcString += createFeatureGeoJSON ( feat, prec, crs, attrIndexes, excludedAttributes, pkAttributes );
1380
1381
fcString += " \n " ;
1381
1382
1382
1383
result = fcString.toUtf8 ();
@@ -1389,12 +1390,12 @@ void QgsWFSServer::setGetFeature( QgsRequestHandler& request, const QString& for
1389
1390
QDomElement featureElement;
1390
1391
if ( format == " GML3" )
1391
1392
{
1392
- featureElement = createFeatureGML3 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1393
+ featureElement = createFeatureGML3 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes, pkAttributes );
1393
1394
gmlDoc.appendChild ( featureElement );
1394
1395
}
1395
1396
else
1396
1397
{
1397
- featureElement = createFeatureGML2 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes );
1398
+ featureElement = createFeatureGML2 ( feat, gmlDoc, prec, crs, attrIndexes, excludedAttributes, pkAttributes );
1398
1399
gmlDoc.appendChild ( featureElement );
1399
1400
}
1400
1401
@@ -1871,7 +1872,39 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( const QDomElement& filterEl
1871
1872
fid = fidElem.attribute ( " fid" );
1872
1873
if ( fid.contains ( " ." ) )
1873
1874
fid = fid.section ( " ." , 1 , 1 );
1874
- fids.insert ( fid.toLongLong ( &conversionSuccess ) );
1875
+ QgsAttributeList pkAttributes = provider->pkAttributeIndexes ();
1876
+ if ( pkAttributes.isEmpty () )
1877
+ {
1878
+ fids.insert ( fid.toLongLong ( &conversionSuccess ) );
1879
+ }
1880
+ else
1881
+ {
1882
+ // assume ID is the primary key, as it is more stable than the feature ID
1883
+ QgsFeature feature;
1884
+ const QgsFields& fields = provider->fields ();
1885
+
1886
+ QString expressionString;
1887
+ QStringList pkValues = fid.split ( pkSeparator () );
1888
+ int pkExprSize = qMin ( pkAttributes.size (), pkValues.size () );
1889
+ for ( int i = 0 ; i < pkExprSize; ++i )
1890
+ {
1891
+ if ( i > 0 )
1892
+ {
1893
+ expressionString.append ( " AND " );
1894
+ }
1895
+ QString fieldName = fields[ pkAttributes.at ( i )].name ();
1896
+ expressionString.append ( fieldName + " = " + pkValues.at ( i ) );
1897
+ }
1898
+ QgsExpression pkExpression ( expressionString );
1899
+
1900
+ QgsExpressionContext exprContext = QgsExpressionContextUtils::createFeatureBasedContext ( feature, fields );
1901
+ QgsFeatureRequest fReq ( pkExpression, exprContext );
1902
+ QgsFeatureIterator fIt = provider->getFeatures ( fReq );
1903
+ if ( fIt .nextFeature ( feature ) )
1904
+ {
1905
+ fids.insert ( feature.id () );
1906
+ }
1907
+ }
1875
1908
}
1876
1909
}
1877
1910
else
@@ -1907,9 +1940,10 @@ QgsFeatureIds QgsWFSServer::getFeatureIdsFromFilter( const QDomElement& filterEl
1907
1940
return fids;
1908
1941
}
1909
1942
1910
- QString QgsWFSServer::createFeatureGeoJSON ( QgsFeature* feat, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /* const*/
1943
+ QString QgsWFSServer::createFeatureGeoJSON ( QgsFeature* feat, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
1944
+ const QgsAttributeList& pkAttributes ) /* const*/
1911
1945
{
1912
- QString id = QString ( " %1.%2" ).arg ( mTypeName , FID_TO_STRING ( feat-> id () ) );
1946
+ QString id = QString ( " %1.%2" ).arg ( mTypeName , featureGmlId ( feat, pkAttributes ) );
1913
1947
1914
1948
QgsJSONExporter exporter;
1915
1949
exporter.setSourceCrs ( crs );
@@ -1963,14 +1997,16 @@ QString QgsWFSServer::createFeatureGeoJSON( QgsFeature* feat, int prec, QgsCoord
1963
1997
return exporter.exportFeature ( f, QVariantMap (), id );
1964
1998
}
1965
1999
1966
- QDomElement QgsWFSServer::createFeatureGML2 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /* const*/
2000
+ QDomElement QgsWFSServer::createFeatureGML2 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
2001
+ const QgsAttributeList& pkAttributes ) /* const*/
1967
2002
{
1968
2003
// gml:FeatureMember
1969
2004
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
1970
2005
1971
2006
// qgs:%TYPENAME%
1972
2007
QDomElement typeNameElement = doc.createElement ( " qgs:" + mTypeName /* qgs:%TYPENAME%*/ );
1973
- typeNameElement.setAttribute ( " fid" , mTypeName + " ." + QString::number ( feat->id () ) );
2008
+ QString gmlId = featureGmlId ( feat, pkAttributes );
2009
+ typeNameElement.setAttribute ( " fid" , mTypeName + " ." + gmlId );
1974
2010
featureElement.appendChild ( typeNameElement );
1975
2011
1976
2012
const QgsGeometry* geom = feat->constGeometry ();
@@ -2045,14 +2081,16 @@ QDomElement QgsWFSServer::createFeatureGML2( QgsFeature* feat, QDomDocument& doc
2045
2081
return featureElement;
2046
2082
}
2047
2083
2048
- QDomElement QgsWFSServer::createFeatureGML3 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes ) /* const*/
2084
+ QDomElement QgsWFSServer::createFeatureGML3 ( QgsFeature* feat, QDomDocument& doc, int prec, QgsCoordinateReferenceSystem& crs, const QgsAttributeList& attrIndexes, const QSet<QString>& excludedAttributes,
2085
+ const QgsAttributeList& pkAttributes ) /* const*/
2049
2086
{
2050
2087
// gml:FeatureMember
2051
2088
QDomElement featureElement = doc.createElement ( " gml:featureMember" /* wfs:FeatureMember*/ );
2052
2089
2053
2090
// qgs:%TYPENAME%
2054
2091
QDomElement typeNameElement = doc.createElement ( " qgs:" + mTypeName /* qgs:%TYPENAME%*/ );
2055
- typeNameElement.setAttribute ( " gml:id" , mTypeName + " ." + QString::number ( feat->id () ) );
2092
+ QString gmlId = featureGmlId ( feat, pkAttributes );
2093
+ typeNameElement.setAttribute ( " gml:id" , mTypeName + " ." + gmlId );
2056
2094
featureElement.appendChild ( typeNameElement );
2057
2095
2058
2096
const QgsGeometry* geom = feat->constGeometry ();
0 commit comments