Skip to content

Commit a12939d

Browse files
committed
[ogr] Implement skipConstraintsCheck for fid
With test.
1 parent 53dd5ef commit a12939d

File tree

3 files changed

+43
-17
lines changed

3 files changed

+43
-17
lines changed

src/providers/ogr/qgsogrprovider.cpp

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -948,10 +948,7 @@ void QgsOgrProvider::loadFields()
948948
mAttributeFields.append(
949949
fidField
950950
);
951-
// Set default value for fid, this is needed because
952-
// the attribute form will not accept a NULL value, passing
953-
// -1 will delegate to the back-end.
954-
mDefaultValues.insert( 0, QStringLiteral( "-1" ) );
951+
mDefaultValues.insert( 0, tr( "Autogenerate" ) );
955952
}
956953

957954
for ( int i = 0; i < fdef.GetFieldCount(); ++i )
@@ -1207,14 +1204,22 @@ QVariant QgsOgrProvider::defaultValue( int fieldId ) const
12071204

12081205
QString QgsOgrProvider::defaultValueClause( int fieldIndex ) const
12091206
{
1210-
QString defVal = mDefaultValues.value( fieldIndex, QString() );
1207+
return mDefaultValues.value( fieldIndex, QString() );
1208+
}
12111209

1212-
if ( !providerProperty( EvaluateDefaultValues, false ).toBool() && !defVal.isEmpty() )
1210+
bool QgsOgrProvider::skipConstraintCheck( int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value ) const
1211+
{
1212+
Q_UNUSED( constraint );
1213+
// If the field is a fid, skip in case it's the default value
1214+
if ( fieldIndex == 0 && mFirstFieldIsFid )
12131215
{
1214-
return defVal;
1216+
return ! mDefaultValues.value( fieldIndex ).isEmpty();
1217+
}
1218+
else
1219+
{
1220+
// stricter check
1221+
return mDefaultValues.contains( fieldIndex ) && mDefaultValues.value( fieldIndex ) == value.toString() && !value.isNull();
12151222
}
1216-
1217-
return QString();
12181223
}
12191224

12201225
void QgsOgrProvider::updateExtents()

src/providers/ogr/qgsogrprovider.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,8 +108,9 @@ class QgsOgrProvider : public QgsVectorDataProvider
108108
virtual long featureCount() const override;
109109
virtual QgsFields fields() const override;
110110
virtual QgsRectangle extent() const override;
111-
QVariant defaultValue( int fieldId ) const override;
112-
QString defaultValueClause( int fieldIndex ) const override;
111+
virtual QVariant defaultValue( int fieldId ) const override;
112+
virtual QString defaultValueClause( int fieldIndex ) const override;
113+
virtual bool skipConstraintCheck( int fieldIndex, QgsFieldConstraints::Constraint constraint, const QVariant &value = QVariant() ) const override;
113114
virtual void updateExtents() override;
114115
virtual bool addFeatures( QgsFeatureList &flist, QgsFeatureSink::Flags flags = 0 ) override;
115116
virtual bool deleteFeatures( const QgsFeatureIds &id ) override;

tests/src/python/test_provider_ogr_gpkg.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -633,16 +633,12 @@ def testGeopackageLargeFID(self):
633633
self.assertTrue(vl.deleteFeature(1234567890123))
634634
self.assertTrue(vl.commitChanges())
635635

636-
def test_SplitFeature(self):
637-
"""Test gpkg feature can be split"""
636+
def test_AddFeatureNullFid(self):
637+
"""Test gpkg feature with NULL fid can be added"""
638638
tmpfile = os.path.join(self.basetestpath, 'testGeopackageSplitFeatures.gpkg')
639639
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
640640
lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon)
641641
lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString))
642-
f = ogr.Feature(lyr.GetLayerDefn())
643-
f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))'))
644-
lyr.CreateFeature(f)
645-
f = None
646642
ds = None
647643

648644
layer = QgsVectorLayer(u'{}'.format(tmpfile) + "|layername=" + "test", 'test', u'ogr')
@@ -652,6 +648,30 @@ def test_SplitFeature(self):
652648
pkfield = fields.at(0)
653649
self.assertTrue(pkfield.constraints().constraints() & QgsFieldConstraints.ConstraintUnique)
654650

651+
# Test add feature with default Fid (NULL)
652+
layer.startEditing()
653+
f = QgsFeature()
654+
feat = QgsFeature(layer.fields())
655+
feat.setGeometry(QgsGeometry.fromWkt('Polygon ((0 0, 0 1, 1 1, 1 0, 0 0))'))
656+
feat.setAttribute(1, 'test_value')
657+
layer.addFeature(feat)
658+
self.assertTrue(layer.commitChanges())
659+
self.assertEqual(layer.featureCount(), 1)
660+
661+
def test_SplitFeature(self):
662+
"""Test gpkg feature can be split"""
663+
tmpfile = os.path.join(self.basetestpath, 'testGeopackageSplitFeatures.gpkg')
664+
ds = ogr.GetDriverByName('GPKG').CreateDataSource(tmpfile)
665+
lyr = ds.CreateLayer('test', geom_type=ogr.wkbPolygon)
666+
lyr.CreateField(ogr.FieldDefn('str_field', ogr.OFTString))
667+
f = ogr.Feature(lyr.GetLayerDefn())
668+
f.SetGeometry(ogr.CreateGeometryFromWkt('POLYGON ((0 0,0 1,1 1,1 0,0 0))'))
669+
lyr.CreateFeature(f)
670+
f = None
671+
ds = None
672+
673+
# Split features
674+
layer = QgsVectorLayer(u'{}'.format(tmpfile) + "|layername=" + "test", 'test', u'ogr')
655675
self.assertTrue(layer.isValid())
656676
self.assertTrue(layer.isSpatial())
657677
self.assertEqual([f for f in layer.getFeatures()][0].geometry().asWkt(), 'Polygon ((0 0, 0 1, 1 1, 1 0, 0 0))')

0 commit comments

Comments
 (0)