Skip to content

Commit 4efad04

Browse files
committedNov 2, 2016
Move constraints to QgsField
1 parent f6c1bf7 commit 4efad04

15 files changed

+162
-58
lines changed
 

‎python/core/qgsfield.sip

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,18 @@ class QgsField
1414
%End
1515

1616
public:
17+
18+
/**
19+
* Constraints which may be present on a field.
20+
* @note added in QGIS 3.0
21+
*/
22+
enum Constraint
23+
{
24+
ConstraintNotNull, //!< Field may not be null
25+
ConstraintUnique, //!< Field must have a unique value
26+
};
27+
typedef QFlags<QgsField::Constraint> Constraints;
28+
1729
/** Constructor. Constructs a new QgsField object.
1830
* @param name Field name
1931
* @param type Field variant type, currently supported: String / Int / Double
@@ -162,6 +174,20 @@ class QgsField
162174
*/
163175
void setDefaultValueExpression( const QString& expression );
164176

177+
/**
178+
* Returns any constraints which are present for the field.
179+
* @note added in QGIS 3.0
180+
* @see setConstraints()
181+
*/
182+
Constraints constraints() const;
183+
184+
/**
185+
* Sets constraints which are present for the field.
186+
* @note added in QGIS 3.0
187+
* @see constraints()
188+
*/
189+
void setConstraints( Constraints constraints );
190+
165191
/** Returns the alias for the field (the friendly displayed name of the field ),
166192
* or an empty string if there is no alias.
167193
* @see setAlias()
@@ -254,3 +280,5 @@ class QgsField
254280
*/
255281
const QgsEditorWidgetSetup& editorWidgetSetup() const;
256282
}; // class QgsField
283+
284+
QFlags<QgsField::Constraint> operator|(QgsField::Constraint f1, QFlags<QgsField::Constraint> f2);

‎python/core/qgsvectordataprovider.sip

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,6 @@ class QgsVectorDataProvider : QgsDataProvider
5555
/** Bitmask of all provider's editing capabilities */
5656
static const int EditingCapabilities;
5757

58-
/**
59-
* Constraints which may be present on a field.
60-
* @note added in QGIS 3.0
61-
*/
62-
enum Constraint
63-
{
64-
ConstraintNotNull, //!< Field may not be null
65-
ConstraintUnique, //!< Field must have a unique value
66-
};
67-
typedef QFlags<QgsVectorDataProvider::Constraint> Constraints;
68-
6958
/**
7059
* Constructor of the vector provider
7160
* @param uri uniform resource locator (URI) for a dataset
@@ -246,7 +235,7 @@ class QgsVectorDataProvider : QgsDataProvider
246235
* field index.
247236
* @note added in QGIS 3.0
248237
*/
249-
virtual QgsVectorDataProvider::Constraints fieldConstraints( int fieldIndex ) const;
238+
virtual QgsField::Constraints fieldConstraints( int fieldIndex ) const;
250239

251240
/**
252241
* Changes geometries of existing features
@@ -452,4 +441,3 @@ class QgsVectorDataProvider : QgsDataProvider
452441
};
453442

454443
QFlags<QgsVectorDataProvider::Capability> operator|(QgsVectorDataProvider::Capability f1, QFlags<QgsVectorDataProvider::Capability> f2);
455-
QFlags<QgsVectorDataProvider::Constraint> operator|(QgsVectorDataProvider::Constraint f1, QFlags<QgsVectorDataProvider::Constraint> f2);

‎src/app/qgsattributetypedialog.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,16 +176,16 @@ bool QgsAttributeTypeDialog::fieldEditable() const
176176
return isFieldEditableCheckBox->isChecked();
177177
}
178178

179-
void QgsAttributeTypeDialog::setProviderConstraints( QgsVectorDataProvider::Constraints constraints )
179+
void QgsAttributeTypeDialog::setProviderConstraints( QgsField::Constraints constraints )
180180
{
181-
if ( constraints & QgsVectorDataProvider::ConstraintNotNull )
181+
if ( constraints & QgsField::ConstraintNotNull )
182182
{
183183
notNullCheckBox->setChecked( true );
184184
notNullCheckBox->setEnabled( false );
185185
notNullCheckBox->setToolTip( tr( "The provider for this layer has a NOT NULL constraint set on the field." ) );
186186
}
187187

188-
if ( constraints & QgsVectorDataProvider::ConstraintUnique )
188+
if ( constraints & QgsField::ConstraintUnique )
189189
{
190190
mUniqueCheckBox->setChecked( true );
191191
mUniqueCheckBox->setEnabled( false );

‎src/app/qgsattributetypedialog.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class APP_EXPORT QgsAttributeTypeDialog: public QDialog, private Ui::QgsAttribut
7373
/**
7474
* Sets any provider side constraints which may affect this field's behaviour.
7575
*/
76-
void setProviderConstraints( QgsVectorDataProvider::Constraints constraints );
76+
void setProviderConstraints( QgsField::Constraints constraints );
7777

7878
/**
7979
* Setter for checkbox for not null

‎src/core/qgsfield.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,16 @@ void QgsField::setDefaultValueExpression( const QString& expression )
180180
d->defaultValueExpression = expression;
181181
}
182182

183+
QgsField::Constraints QgsField::constraints() const
184+
{
185+
return d->constraints;
186+
}
187+
188+
void QgsField::setConstraints( Constraints constraints )
189+
{
190+
d->constraints = constraints;
191+
}
192+
183193
QString QgsField::alias() const
184194
{
185195
return d->alias;
@@ -303,15 +313,16 @@ QDataStream& operator<<( QDataStream& out, const QgsField& field )
303313
out << field.comment();
304314
out << field.alias();
305315
out << field.defaultValueExpression();
316+
out << field.constraints();
306317
out << static_cast< quint32 >( field.subType() );
307318
return out;
308319
}
309320

310321
QDataStream& operator>>( QDataStream& in, QgsField& field )
311322
{
312-
quint32 type, subType, length, precision;
323+
quint32 type, subType, length, precision, constraints;
313324
QString name, typeName, comment, alias, defaultValueExpression;
314-
in >> name >> type >> typeName >> length >> precision >> comment >> alias >> defaultValueExpression >> subType;
325+
in >> name >> type >> typeName >> length >> precision >> comment >> alias >> defaultValueExpression >> constraints >> subType;
315326
field.setName( name );
316327
field.setType( static_cast< QVariant::Type >( type ) );
317328
field.setTypeName( typeName );
@@ -320,6 +331,7 @@ QDataStream& operator>>( QDataStream& in, QgsField& field )
320331
field.setComment( comment );
321332
field.setAlias( alias );
322333
field.setDefaultValueExpression( defaultValueExpression );
334+
field.setConstraints( static_cast< QgsField::Constraints>( constraints ) );
323335
field.setSubType( static_cast< QVariant::Type >( subType ) );
324336
return in;
325337
}

‎src/core/qgsfield.h

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,21 @@ class CORE_EXPORT QgsField
5454
Q_PROPERTY( QString name READ name WRITE setName )
5555
Q_PROPERTY( QString alias READ alias WRITE setAlias )
5656
Q_PROPERTY( QString defaultValueExpression READ defaultValueExpression WRITE setDefaultValueExpression )
57+
Q_PROPERTY( Constraints constraints READ constraints WRITE setConstraints )
5758

5859
public:
60+
61+
/**
62+
* Constraints which may be present on a field.
63+
* @note added in QGIS 3.0
64+
*/
65+
enum Constraint
66+
{
67+
ConstraintNotNull = 1, //!< Field may not be null
68+
ConstraintUnique = 1 << 1, //!< Field must have a unique value
69+
};
70+
Q_DECLARE_FLAGS( Constraints, Constraint )
71+
5972
/** Constructor. Constructs a new QgsField object.
6073
* @param name Field name
6174
* @param type Field variant type, currently supported: String / Int / Double
@@ -208,6 +221,20 @@ class CORE_EXPORT QgsField
208221
*/
209222
void setDefaultValueExpression( const QString& expression );
210223

224+
/**
225+
* Returns any constraints which are present for the field.
226+
* @note added in QGIS 3.0
227+
* @see setConstraints()
228+
*/
229+
Constraints constraints() const;
230+
231+
/**
232+
* Sets constraints which are present for the field.
233+
* @note added in QGIS 3.0
234+
* @see constraints()
235+
*/
236+
void setConstraints( Constraints constraints );
237+
211238
/** Returns the alias for the field (the friendly displayed name of the field ),
212239
* or an empty string if there is no alias.
213240
* @see setAlias()
@@ -261,6 +288,8 @@ class CORE_EXPORT QgsField
261288

262289
}; // class QgsField
263290

291+
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsField::Constraints )
292+
264293
Q_DECLARE_METATYPE( QgsField )
265294

266295
//! Writes the field to stream out. QGIS version compatibility is not guaranteed.

‎src/core/qgsfield_p.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class QgsFieldPrivate : public QSharedData
5555
, length( len )
5656
, precision( prec )
5757
, comment( comment )
58+
, constraints( 0 )
5859
{
5960
}
6061

@@ -69,6 +70,7 @@ class QgsFieldPrivate : public QSharedData
6970
, comment( other.comment )
7071
, alias( other.alias )
7172
, defaultValueExpression( other.defaultValueExpression )
73+
, constraints( other.constraints )
7274
{
7375
}
7476

@@ -78,7 +80,8 @@ class QgsFieldPrivate : public QSharedData
7880
{
7981
return (( name == other.name ) && ( type == other.type ) && ( subType == other.subType )
8082
&& ( length == other.length ) && ( precision == other.precision )
81-
&& ( alias == other.alias ) && ( defaultValueExpression == other.defaultValueExpression ) );
83+
&& ( alias == other.alias ) && ( defaultValueExpression == other.defaultValueExpression )
84+
&& ( constraints == other.constraints ) );
8285
}
8386

8487
//! Name
@@ -108,6 +111,9 @@ class QgsFieldPrivate : public QSharedData
108111
//! Default value expression
109112
QString defaultValueExpression;
110113

114+
//! Constraints
115+
QgsField::Constraints constraints;
116+
111117
QgsEditorWidgetSetup editorWidgetSetup;
112118
};
113119

‎src/core/qgsvectordataprovider.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ QVariant QgsVectorDataProvider::defaultValue( int fieldId ) const
9898
return QVariant();
9999
}
100100

101-
QgsVectorDataProvider::Constraints QgsVectorDataProvider::fieldConstraints( int fieldIndex ) const
101+
QgsField::Constraints QgsVectorDataProvider::fieldConstraints( int fieldIndex ) const
102102
{
103103
Q_UNUSED( fieldIndex );
104104
return 0;

‎src/core/qgsvectordataprovider.h

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -106,17 +106,6 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider
106106
ChangeAttributeValues | ChangeGeometries | AddAttributes | DeleteAttributes |
107107
RenameAttributes;
108108

109-
/**
110-
* Constraints which may be present on a field.
111-
* @note added in QGIS 3.0
112-
*/
113-
enum Constraint
114-
{
115-
ConstraintNotNull = 1, //!< Field may not be null
116-
ConstraintUnique = 1 << 1, //!< Field must have a unique value
117-
};
118-
Q_DECLARE_FLAGS( Constraints, Constraint )
119-
120109
/**
121110
* Constructor of the vector provider
122111
* @param uri uniform resource locator (URI) for a dataset
@@ -297,7 +286,7 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider
297286
* field index.
298287
* @note added in QGIS 3.0
299288
*/
300-
virtual Constraints fieldConstraints( int fieldIndex ) const;
289+
virtual QgsField::Constraints fieldConstraints( int fieldIndex ) const;
301290

302291
/**
303292
* Changes geometries of existing features
@@ -538,7 +527,5 @@ class CORE_EXPORT QgsVectorDataProvider : public QgsDataProvider
538527
};
539528

540529
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsVectorDataProvider::Capabilities )
541-
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsVectorDataProvider::Constraints )
542-
543530

544531
#endif

‎src/core/qgsvectorlayer.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4189,3 +4189,19 @@ bool QgsVectorLayer::setDependencies( const QSet<QgsMapLayerDependency>& oDeps )
41894189

41904190
return true;
41914191
}
4192+
4193+
QgsField::Constraints QgsVectorLayer::fieldConstraints( int fieldIndex ) const
4194+
{
4195+
if ( fieldIndex < 0 || fieldIndex >= mFields.count() )
4196+
return 0;
4197+
4198+
QgsField::Constraints constraints = mFields.at( fieldIndex ).constraints();
4199+
4200+
// make sure provider constraints are always present!
4201+
if ( mFields.fieldOrigin( fieldIndex ) == QgsFields::OriginProvider )
4202+
{
4203+
constraints |= mDataProvider->fieldConstraints( mFields.fieldOriginIndex( fieldIndex ) );
4204+
}
4205+
4206+
return constraints;
4207+
}

‎src/core/qgsvectorlayer.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,14 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
13961396
*/
13971397
QString defaultValueExpression( int index ) const;
13981398

1399+
/**
1400+
* Returns any constraints which are present for a specified
1401+
* field index. These constraints may be inherited from the layer's data provider
1402+
* or may be set manually on the vector layer from within QGIS.
1403+
* @note added in QGIS 3.0
1404+
*/
1405+
QgsField::Constraints fieldConstraints( int fieldIndex ) const;
1406+
13991407
/** Calculates a list of unique values contained within an attribute in the layer. Note that
14001408
* in some circumstances when unsaved changes are present for the layer then the returned list
14011409
* may contain outdated values (for instance when the attribute value in a saved feature has

‎src/providers/postgres/qgspostgresprovider.cpp

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -998,14 +998,16 @@ bool QgsPostgresProvider::loadFields()
998998
mAttrPalIndexName.insert( i, fieldName );
999999
mDefaultValues.insert( mAttributeFields.size(), defValMap[tableoid][attnum] );
10001000

1001-
Constraints constraints = 0;
1001+
QgsField newField = QgsField( fieldName, fieldType, fieldTypeName, fieldSize, fieldPrec, fieldComment, fieldSubType );
1002+
1003+
QgsField::Constraints constraints = 0;
10021004
if ( notNullMap[tableoid][attnum] )
1003-
constraints |= ConstraintNotNull;
1005+
constraints |= QgsField::ConstraintNotNull;
10041006
if ( uniqueMap[tableoid][attnum] )
1005-
constraints |= ConstraintUnique;
1006-
mFieldConstraints.insert( mAttributeFields.size(), constraints );
1007+
constraints |= QgsField::ConstraintUnique;
1008+
newField.setConstraints( constraints );
10071009

1008-
mAttributeFields.append( QgsField( fieldName, fieldType, fieldTypeName, fieldSize, fieldPrec, fieldComment, fieldSubType ) );
1010+
mAttributeFields.append( newField );
10091011
}
10101012

10111013
setEditorWidgets();
@@ -1736,9 +1738,12 @@ QVariant QgsPostgresProvider::defaultValue( int fieldId ) const
17361738
return defVal;
17371739
}
17381740

1739-
QgsVectorDataProvider::Constraints QgsPostgresProvider::fieldConstraints( int fieldIndex ) const
1741+
QgsField::Constraints QgsPostgresProvider::fieldConstraints( int fieldIndex ) const
17401742
{
1741-
return mFieldConstraints.value( fieldIndex, 0 );
1743+
if ( fieldIndex < 0 || fieldIndex >= mAttributeFields.count() )
1744+
return 0;
1745+
1746+
return mAttributeFields.at( fieldIndex ).constraints();
17421747
}
17431748

17441749
QString QgsPostgresProvider::paramValue( const QString& fieldValue, const QString &defaultValue ) const

‎src/providers/postgres/qgspostgresprovider.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ class QgsPostgresProvider : public QgsVectorDataProvider
161161
QgsAttributeList attributeIndexes() const override;
162162
QgsAttributeList pkAttributeIndexes() const override { return mPrimaryKeyAttrs; }
163163
QVariant defaultValue( int fieldId ) const override;
164-
Constraints fieldConstraints( int fieldIndex ) const override;
164+
QgsField::Constraints fieldConstraints( int fieldIndex ) const override;
165165

166166
/** Adds a list of features
167167
@return true in case of success and false in case of failure*/
@@ -494,7 +494,6 @@ class QgsPostgresProvider : public QgsVectorDataProvider
494494
void setTransaction( QgsTransaction* transaction ) override;
495495

496496
QHash<int, QString> mDefaultValues;
497-
QHash<int, QgsVectorDataProvider::Constraints > mFieldConstraints;
498497
};
499498

500499

‎tests/src/core/testqgsfield.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ void TestQgsField::create()
8484
void TestQgsField::copy()
8585
{
8686
QgsField original( QStringLiteral( "original" ), QVariant::Double, QStringLiteral( "double" ), 5, 2, QStringLiteral( "comment" ) );
87+
original.setConstraints( QgsField::ConstraintNotNull );
8788
QgsField copy( original );
8889
QVERIFY( copy == original );
8990

@@ -95,6 +96,7 @@ void TestQgsField::copy()
9596
void TestQgsField::assignment()
9697
{
9798
QgsField original( QStringLiteral( "original" ), QVariant::Double, QStringLiteral( "double" ), 5, 2, QStringLiteral( "comment" ) );
99+
original.setConstraints( QgsField::ConstraintNotNull );
98100
QgsField copy;
99101
copy = original;
100102
QVERIFY( copy == original );
@@ -123,6 +125,8 @@ void TestQgsField::gettersSetters()
123125
QCOMPARE( field.alias(), QString( "alias" ) );
124126
field.setDefaultValueExpression( QStringLiteral( "1+2" ) );
125127
QCOMPARE( field.defaultValueExpression(), QString( "1+2" ) );
128+
field.setConstraints( QgsField::ConstraintNotNull );
129+
QCOMPARE( field.constraints(), QgsField::ConstraintNotNull );
126130
}
127131

128132
void TestQgsField::isNumeric()
@@ -157,13 +161,15 @@ void TestQgsField::equality()
157161
field1.setPrecision( 2 );
158162
field1.setTypeName( QStringLiteral( "typename1" ) ); //typename is NOT required for equality
159163
field1.setComment( QStringLiteral( "comment1" ) ); //comment is NOT required for equality
164+
field1.setConstraints( QgsField::ConstraintNotNull );
160165
QgsField field2;
161166
field2.setName( QStringLiteral( "name" ) );
162167
field2.setType( QVariant::Int );
163168
field2.setLength( 5 );
164169
field2.setPrecision( 2 );
165170
field2.setTypeName( QStringLiteral( "typename2" ) ); //typename is NOT required for equality
166171
field2.setComment( QStringLiteral( "comment2" ) ); //comment is NOT required for equality
172+
field2.setConstraints( QgsField::ConstraintNotNull );
167173
QVERIFY( field1 == field2 );
168174
QVERIFY( !( field1 != field2 ) );
169175

@@ -192,11 +198,16 @@ void TestQgsField::equality()
192198
QVERIFY( !( field1 == field2 ) );
193199
QVERIFY( field1 != field2 );
194200
field2.setDefaultValueExpression( QString() );
201+
field2.setConstraints( QgsField::ConstraintUnique );
202+
QVERIFY( !( field1 == field2 ) );
203+
QVERIFY( field1 != field2 );
204+
field2.setConstraints( QgsField::ConstraintNotNull );
195205
}
196206

197207
void TestQgsField::asVariant()
198208
{
199209
QgsField original( QStringLiteral( "original" ), QVariant::Double, QStringLiteral( "double" ), 5, 2, QStringLiteral( "comment" ) );
210+
original.setConstraints( QgsField::ConstraintNotNull );
200211

201212
//convert to and from a QVariant
202213
QVariant var = QVariant::fromValue( original );
@@ -375,6 +386,7 @@ void TestQgsField::dataStream()
375386
original.setComment( QStringLiteral( "comment1" ) );
376387
original.setAlias( QStringLiteral( "alias" ) );
377388
original.setDefaultValueExpression( QStringLiteral( "default" ) );
389+
original.setConstraints( QgsField::ConstraintNotNull );
378390

379391
QByteArray ba;
380392
QDataStream ds( &ba, QIODevice::ReadWrite );

‎tests/src/python/test_provider_postgres.py

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
QgsFeatureRequest,
2727
QgsFeature,
2828
QgsTransactionGroup,
29-
QgsVectorDataProvider,
29+
QgsField,
3030
NULL
3131
)
3232
from qgis.gui import QgsEditorWidgetRegistry
@@ -444,27 +444,41 @@ def testNotNullConstraint(self):
444444
self.assertEqual(len(vl.fields()), 4)
445445

446446
# test some bad field indexes
447-
self.assertEqual(vl.dataProvider().fieldConstraints(-1), QgsVectorDataProvider.Constraints())
448-
self.assertEqual(vl.dataProvider().fieldConstraints(1001), QgsVectorDataProvider.Constraints())
447+
self.assertEqual(vl.dataProvider().fieldConstraints(-1), QgsField.Constraints())
448+
self.assertEqual(vl.dataProvider().fieldConstraints(1001), QgsField.Constraints())
449449

450-
self.assertTrue(vl.dataProvider().fieldConstraints(0) & QgsVectorDataProvider.ConstraintNotNull)
451-
self.assertFalse(vl.dataProvider().fieldConstraints(1) & QgsVectorDataProvider.ConstraintNotNull)
452-
self.assertTrue(vl.dataProvider().fieldConstraints(2) & QgsVectorDataProvider.ConstraintNotNull)
453-
self.assertFalse(vl.dataProvider().fieldConstraints(3) & QgsVectorDataProvider.ConstraintNotNull)
450+
self.assertTrue(vl.dataProvider().fieldConstraints(0) & QgsField.ConstraintNotNull)
451+
self.assertFalse(vl.dataProvider().fieldConstraints(1) & QgsField.ConstraintNotNull)
452+
self.assertTrue(vl.dataProvider().fieldConstraints(2) & QgsField.ConstraintNotNull)
453+
self.assertFalse(vl.dataProvider().fieldConstraints(3) & QgsField.ConstraintNotNull)
454+
455+
# test that constraints have been saved to fields correctly
456+
fields = vl.fields()
457+
self.assertTrue(fields.at(0).constraints() & QgsField.ConstraintNotNull)
458+
self.assertFalse(fields.at(1).constraints() & QgsField.ConstraintNotNull)
459+
self.assertTrue(fields.at(2).constraints() & QgsField.ConstraintNotNull)
460+
self.assertFalse(fields.at(3).constraints() & QgsField.ConstraintNotNull)
454461

455462
def testUniqueConstraint(self):
456463
vl = QgsVectorLayer('%s table="qgis_test"."constraints" sql=' % (self.dbconn), "constraints", "postgres")
457464
self.assertTrue(vl.isValid())
458465
self.assertEqual(len(vl.fields()), 4)
459466

460467
# test some bad field indexes
461-
self.assertEqual(vl.dataProvider().fieldConstraints(-1), QgsVectorDataProvider.Constraints())
462-
self.assertEqual(vl.dataProvider().fieldConstraints(1001), QgsVectorDataProvider.Constraints())
463-
464-
self.assertTrue(vl.dataProvider().fieldConstraints(0) & QgsVectorDataProvider.ConstraintUnique)
465-
self.assertTrue(vl.dataProvider().fieldConstraints(1) & QgsVectorDataProvider.ConstraintUnique)
466-
self.assertTrue(vl.dataProvider().fieldConstraints(2) & QgsVectorDataProvider.ConstraintUnique)
467-
self.assertFalse(vl.dataProvider().fieldConstraints(3) & QgsVectorDataProvider.ConstraintUnique)
468+
self.assertEqual(vl.dataProvider().fieldConstraints(-1), QgsField.Constraints())
469+
self.assertEqual(vl.dataProvider().fieldConstraints(1001), QgsField.Constraints())
470+
471+
self.assertTrue(vl.dataProvider().fieldConstraints(0) & QgsField.ConstraintUnique)
472+
self.assertTrue(vl.dataProvider().fieldConstraints(1) & QgsField.ConstraintUnique)
473+
self.assertTrue(vl.dataProvider().fieldConstraints(2) & QgsField.ConstraintUnique)
474+
self.assertFalse(vl.dataProvider().fieldConstraints(3) & QgsField.ConstraintUnique)
475+
476+
# test that constraints have been saved to fields correctly
477+
fields = vl.fields()
478+
self.assertTrue(fields.at(0).constraints() & QgsField.ConstraintUnique)
479+
self.assertTrue(fields.at(1).constraints() & QgsField.ConstraintUnique)
480+
self.assertTrue(fields.at(2).constraints() & QgsField.ConstraintUnique)
481+
self.assertFalse(fields.at(3).constraints() & QgsField.ConstraintUnique)
468482

469483
# See http://hub.qgis.org/issues/15188
470484
def testNumericPrecision(self):

0 commit comments

Comments
 (0)
Please sign in to comment.