diff --git a/doc/api_break.dox b/doc/api_break.dox
index 1392a289391..94dfb2d4166 100644
--- a/doc/api_break.dox
+++ b/doc/api_break.dox
@@ -746,6 +746,7 @@ None will need to be modified, as the method will return an empty geometry if th
- All const methods which return a field from QgsFields now return a QgsField value, not a reference.
+- fieldNameIndex has been renamed to lookupField. See the API documentation for details.
\subsection qgis_api_break_3_0_QgsFieldExpressionWidget QgsFieldExpressionWidget
@@ -1414,6 +1415,7 @@ displayExpression instead. For the map tip use mapTipTemplate() instead.
Deleted attributeEditorElementFromDomElement
editFormConfig() returns a copy instead of direct access (Use setEditFormConfig to update)
Removed valueRelation(), replaced with QgsEditFormConfig::editorWidgetConfig
+Removed fieldNameIndex(), use QgsFields::lookupField() or QgsFields::indexFromName() instead
\subsection qgis_api_break_3_0_QgsVectorLayerEditBuffer QgsVectorLayerEditBuffer
diff --git a/python/core/core.sip b/python/core/core.sip
index f7f9a1215a0..6aea0feb780 100644
--- a/python/core/core.sip
+++ b/python/core/core.sip
@@ -55,6 +55,7 @@
%Include qgsfeaturerequest.sip
%Include qgsfeedback.sip
%Include qgsfield.sip
+%Include qgsfields.sip
%Include qgsgeometrysimplifier.sip
%Include qgsgeometryvalidator.sip
%Include qgsgml.sip
diff --git a/python/core/qgsexpression.sip b/python/core/qgsexpression.sip
index 2b49ab81fe7..5000d37aee2 100644
--- a/python/core/qgsexpression.sip
+++ b/python/core/qgsexpression.sip
@@ -53,6 +53,13 @@ class QgsExpression
*/
QStringList referencedColumns() const;
+ /**
+ * Return a list of field name indexes obtained from the provided fields.
+ *
+ * @note Added in QGIS 3.0
+ */
+ QSet referencedAttributeIndexes( const QgsFields& fields ) const;
+
//! Returns true if the expression uses feature geometry for some computation
bool needsGeometry() const;
diff --git a/python/core/qgsfield.sip b/python/core/qgsfield.sip
index b6f83442dfc..5ac7bd39085 100644
--- a/python/core/qgsfield.sip
+++ b/python/core/qgsfield.sip
@@ -254,224 +254,3 @@ class QgsField
*/
const QgsEditorWidgetSetup& editorWidgetSetup() const;
}; // class QgsField
-
-
-/** \class QgsFields
- * \ingroup core
- * Container of fields for a vector layer.
- *
- * In addition to storing a list of QgsField instances, it also:
- * - allows quick lookups of field names to index in the list
- * - keeps track of where the field definition comes from (vector data provider, joined layer or newly added from an editing operation)
- * \note QgsFields objects are implicitly shared.
- */
-
-class QgsFields
-{
-%TypeHeaderCode
-#include
-%End
- public:
-
- enum FieldOrigin
- {
- OriginUnknown, //!< it has not been specified where the field comes from
- OriginProvider, //!< field comes from the underlying data provider of the vector layer (originIndex = index in provider's fields)
- OriginJoin, //!< field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index within the join)
- OriginEdit, //!< field has been temporarily added in editing mode (originIndex = index in the list of added attributes)
- OriginExpression //!< field is calculated from an expression
- };
-
- /** Constructor for an empty field container
- */
- QgsFields();
-
- /** Copy constructor
- */
- QgsFields( const QgsFields& other );
-
- virtual ~QgsFields();
-
- //! Remove all fields
- void clear();
- //! Append a field. The field must have unique name, otherwise it is rejected (returns false)
- bool append( const QgsField& field, FieldOrigin origin = OriginProvider, int originIndex = -1 );
- //! Append an expression field. The field must have unique name, otherwise it is rejected (returns false)
- bool appendExpressionField( const QgsField& field, int originIndex );
- //! Remove a field with the given index
- void remove( int fieldIdx );
-%MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipCpp->remove( a0 );
- }
-%End
-
- //! Extend with fields from another QgsFields container
- void extend( const QgsFields& other );
-
- //! Check whether the container is empty
- bool isEmpty() const;
- //! Return number of items
- int count() const;
- // __len__ annotation since sip 4.10.3
- //int count() const /__len__/;
- int __len__() const;
-%MethodCode
- sipRes = sipCpp->count();
-%End
- //! Return number of items
- int size() const;
- //! Return if a field index is valid
- //! @param i Index of the field which needs to be checked
- //! @return True if the field exists
- bool exists( int i ) const;
-
- //! Get field at particular index (must be in range 0..N-1)
- // const QgsField& operator[]( int i ) const;
- QgsField& operator[](int i) /Factory/;
-%MethodCode
- SIP_SSIZE_T idx = sipConvertFromSequenceIndex(a0, sipCpp->count());
- if (idx < 0)
- sipIsErr = 1;
- else
- sipRes = new QgsField(sipCpp->operator[](idx));
-%End
-
- //! Get field at particular index (must be in range 0..N-1)
- QgsField at( int i ) const /Factory/;
-%MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipRes = new QgsField( sipCpp->at( a0 ) );
- }
-%End
-
- //! Get field at particular index (must be in range 0..N-1)
- QgsField field( int fieldIdx ) const /Factory/;
-%MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipRes = new QgsField( sipCpp->field( a0 ) );
- }
-%End
-
- //! Get field at particular index (must be in range 0..N-1)
- QgsField field( const QString& name ) const /Factory/;
-%MethodCode
- int fieldIdx = sipCpp->indexFromName(*a0);
- if (fieldIdx == -1)
- {
- PyErr_SetString(PyExc_KeyError, a0->toAscii());
- sipIsErr = 1;
- }
- else
- {
- sipRes = new QgsField( sipCpp->field( *a0 ) );
- }
-%End
-
- //! Get field's origin (value from an enumeration)
- FieldOrigin fieldOrigin( int fieldIdx ) const;
-%MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipRes = sipCpp->fieldOrigin( a0 );
- }
-%End
-
- //! Get field's origin index (its meaning is specific to each type of origin)
- int fieldOriginIndex( int fieldIdx ) const;
-%MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipRes = sipCpp->fieldOriginIndex( a0 );
- }
-%End
-
- //! Look up field's index from name. Returns -1 on error
- int indexFromName( const QString& name ) const;
-
- //! Look up field's index from name
- //! also looks up case-insensitive if there is no match otherwise
- //! @note added in 2.4
- int fieldNameIndex( const QString& fieldName ) const;
-
- //! Utility function to get list of attribute indexes
- //! @note added in 2.4
- QgsAttributeList allAttributesList() const;
-
- //! Utility function to return a list of QgsField instances
- QList toList() const;
-
- //! @note added in 2.6
- bool operator==( const QgsFields& other ) const;
- //! @note added in 2.6
- bool operator!=( const QgsFields& other ) const;
-
- /** Returns an icon corresponding to a field index, based on the field's type and source
- * @note added in QGIS 2.14
- */
- QIcon iconForField( int fieldIdx ) const /Factory/;
- %MethodCode
- if ( a0 < 0 || a0 >= sipCpp->count() )
- {
- PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
- sipIsErr = 1;
- }
- else
- {
- sipRes = new QIcon( sipCpp->iconForField( a0 ) );
- }
- %End
-
- //! Allows direct construction of QVariants from fields.
- operator QVariant() const;
-
-/* SIP_PYOBJECT __getitem__(int key);
-%MethodCode
- if (a0 = sipConvertFromSequenceIndex(a0, sipCpp->count()) < 0)
- sipIsErr = 1;
- else
- {
- qDebug("__getitem__ %d", a0);
- QgsField* fld = new QgsField(sipCpp->at(a0));
- sipRes = sipConvertFromType(fld, sipType_QgsField, Py_None);
- }
-%End*/
-
-void __setitem__(int key, const QgsField& field);
-%MethodCode
- int idx = (int)sipConvertFromSequenceIndex(a0, sipCpp->count());
- if (idx < 0)
- sipIsErr = 1;
- else
- (*sipCpp)[idx] = *a1;
-%End
-
-};
diff --git a/python/core/qgsfields.sip b/python/core/qgsfields.sip
new file mode 100644
index 00000000000..e5bfd8f89dd
--- /dev/null
+++ b/python/core/qgsfields.sip
@@ -0,0 +1,239 @@
+/** \class QgsFields
+ * \ingroup core
+ * Container of fields for a vector layer.
+ *
+ * In addition to storing a list of QgsField instances, it also:
+ * - allows quick lookups of field names to index in the list
+ * - keeps track of where the field definition comes from (vector data provider, joined layer or newly added from an editing operation)
+ * \note QgsFields objects are implicitly shared.
+ */
+
+class QgsFields
+{
+%TypeHeaderCode
+#include
+%End
+ public:
+
+ enum FieldOrigin
+ {
+ OriginUnknown, //!< it has not been specified where the field comes from
+ OriginProvider, //!< field comes from the underlying data provider of the vector layer (originIndex = index in provider's fields)
+ OriginJoin, //!< field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index within the join)
+ OriginEdit, //!< field has been temporarily added in editing mode (originIndex = index in the list of added attributes)
+ OriginExpression //!< field is calculated from an expression
+ };
+
+ /** Constructor for an empty field container
+ */
+ QgsFields();
+
+ /** Copy constructor
+ */
+ QgsFields( const QgsFields& other );
+
+ virtual ~QgsFields();
+
+ //! Remove all fields
+ void clear();
+ //! Append a field. The field must have unique name, otherwise it is rejected (returns false)
+ bool append( const QgsField& field, FieldOrigin origin = OriginProvider, int originIndex = -1 );
+ //! Append an expression field. The field must have unique name, otherwise it is rejected (returns false)
+ bool appendExpressionField( const QgsField& field, int originIndex );
+ //! Remove a field with the given index
+ void remove( int fieldIdx );
+%MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipCpp->remove( a0 );
+ }
+%End
+
+ //! Extend with fields from another QgsFields container
+ void extend( const QgsFields& other );
+
+ //! Check whether the container is empty
+ bool isEmpty() const;
+ //! Return number of items
+ int count() const;
+ // __len__ annotation since sip 4.10.3
+ //int count() const /__len__/;
+ int __len__() const;
+%MethodCode
+ sipRes = sipCpp->count();
+%End
+ //! Return number of items
+ int size() const;
+ //! Return if a field index is valid
+ //! @param i Index of the field which needs to be checked
+ //! @return True if the field exists
+ bool exists( int i ) const;
+
+ //! Get field at particular index (must be in range 0..N-1)
+ // const QgsField& operator[]( int i ) const;
+ QgsField& operator[](int i) /Factory/;
+%MethodCode
+ SIP_SSIZE_T idx = sipConvertFromSequenceIndex(a0, sipCpp->count());
+ if (idx < 0)
+ sipIsErr = 1;
+ else
+ sipRes = new QgsField(sipCpp->operator[](idx));
+%End
+
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField at( int i ) const /Factory/;
+%MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = new QgsField( sipCpp->at( a0 ) );
+ }
+%End
+
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField field( int fieldIdx ) const /Factory/;
+%MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = new QgsField( sipCpp->field( a0 ) );
+ }
+%End
+
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField field( const QString& name ) const /Factory/;
+%MethodCode
+ int fieldIdx = sipCpp->indexFromName(*a0);
+ if (fieldIdx == -1)
+ {
+ PyErr_SetString(PyExc_KeyError, a0->toAscii());
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = new QgsField( sipCpp->field( *a0 ) );
+ }
+%End
+
+ //! Get field's origin (value from an enumeration)
+ FieldOrigin fieldOrigin( int fieldIdx ) const;
+%MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = sipCpp->fieldOrigin( a0 );
+ }
+%End
+
+ //! Get field's origin index (its meaning is specific to each type of origin)
+ int fieldOriginIndex( int fieldIdx ) const;
+%MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = sipCpp->fieldOriginIndex( a0 );
+ }
+%End
+
+ /**
+ * Look up field's index from the field name.
+ * This method takes is case sensitive and only matches the data source
+ * name of the field.
+ *
+ * @param fieldName The name of the field.
+ *
+ * @return The field index if found or -1 in case it cannot be found.
+ * @see lookupField For a more tolerant alternative.
+ */
+ int indexFromName( const QString& fieldName ) const;
+
+ /**
+ * Look up field's index from the field name.
+ * This method matches in the following order:
+ *
+ * 1. The exact field name taking case sensitivity into account
+ * 2. Looks for the field name by case insensitive comparison
+ * 3. The field alias (case insensitive)
+ *
+ * @param fieldName The name to look for.
+ *
+ * @return The field index if found or -1 in case it cannot be found.
+ * @see indexFromName For a more performant and precise but less tolerant alternative.
+ * @note added in 2.4
+ */
+ int lookupField( const QString& fieldName ) const;
+
+ //! Utility function to get list of attribute indexes
+ //! @note added in 2.4
+ QgsAttributeList allAttributesList() const;
+
+ //! Utility function to return a list of QgsField instances
+ QList toList() const;
+
+ //! @note added in 2.6
+ bool operator==( const QgsFields& other ) const;
+ //! @note added in 2.6
+ bool operator!=( const QgsFields& other ) const;
+
+ /** Returns an icon corresponding to a field index, based on the field's type and source
+ * @note added in QGIS 2.14
+ */
+ QIcon iconForField( int fieldIdx ) const /Factory/;
+ %MethodCode
+ if ( a0 < 0 || a0 >= sipCpp->count() )
+ {
+ PyErr_SetString(PyExc_KeyError, QByteArray::number(a0));
+ sipIsErr = 1;
+ }
+ else
+ {
+ sipRes = new QIcon( sipCpp->iconForField( a0 ) );
+ }
+ %End
+
+ //! Allows direct construction of QVariants from fields.
+ operator QVariant() const;
+
+/* SIP_PYOBJECT __getitem__(int key);
+%MethodCode
+ if (a0 = sipConvertFromSequenceIndex(a0, sipCpp->count()) < 0)
+ sipIsErr = 1;
+ else
+ {
+ qDebug("__getitem__ %d", a0);
+ QgsField* fld = new QgsField(sipCpp->at(a0));
+ sipRes = sipConvertFromType(fld, sipType_QgsField, Py_None);
+ }
+%End*/
+
+void __setitem__(int key, const QgsField& field);
+%MethodCode
+ int idx = (int)sipConvertFromSequenceIndex(a0, sipCpp->count());
+ if (idx < 0)
+ sipIsErr = 1;
+ else
+ (*sipCpp)[idx] = *a1;
+%End
+
+};
diff --git a/python/core/qgsvectorlayer.sip b/python/core/qgsvectorlayer.sip
index f68bd6184ef..dfd86db5d44 100644
--- a/python/core/qgsvectorlayer.sip
+++ b/python/core/qgsvectorlayer.sip
@@ -1190,9 +1190,6 @@ class QgsVectorLayer : QgsMapLayer
/** Destroy active command and reverts all changes in it */
void destroyEditCommand();
- /** Returns the index of a field name or -1 if the field does not exist */
- int fieldNameIndex( const QString& fieldName ) const;
-
/** Editing vertex markers */
enum VertexMarkerType
{
diff --git a/src/analysis/vector/qgsgeometryanalyzer.cpp b/src/analysis/vector/qgsgeometryanalyzer.cpp
index 31d73d81492..5f89c48747b 100644
--- a/src/analysis/vector/qgsgeometryanalyzer.cpp
+++ b/src/analysis/vector/qgsgeometryanalyzer.cpp
@@ -18,7 +18,7 @@
#include "qgsgeometryanalyzer.h"
#include "qgsapplication.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgslogger.h"
diff --git a/src/analysis/vector/qgsoverlayanalyzer.cpp b/src/analysis/vector/qgsoverlayanalyzer.cpp
index f0bf0ffc528..87408580965 100644
--- a/src/analysis/vector/qgsoverlayanalyzer.cpp
+++ b/src/analysis/vector/qgsoverlayanalyzer.cpp
@@ -19,7 +19,7 @@
#include "qgsapplication.h"
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
diff --git a/src/app/ogr/qgsvectorlayersaveasdialog.h b/src/app/ogr/qgsvectorlayersaveasdialog.h
index 9e4231c777b..23bd037a7e4 100644
--- a/src/app/ogr/qgsvectorlayersaveasdialog.h
+++ b/src/app/ogr/qgsvectorlayersaveasdialog.h
@@ -21,7 +21,7 @@
#include
#include
#include "qgscontexthelp.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorfilewriter.h"
class QgsVectorLayer;
diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp
index 5a48125514d..273eb8c8bc2 100644
--- a/src/app/qgisapp.cpp
+++ b/src/app/qgisapp.cpp
@@ -7328,7 +7328,7 @@ void QgisApp::editPaste( QgsMapLayer *destinationLayer )
QgsAttributeList pkAttrList = pasteVectorLayer->pkAttributeList();
for ( int idx = 0; idx < fields.count(); ++idx )
{
- int dst = pasteVectorLayer->fieldNameIndex( fields.at( idx ).name() );
+ int dst = pasteVectorLayer->fields().lookupField( fields.at( idx ).name() );
if ( dst < 0 )
continue;
diff --git a/src/app/qgisappinterface.cpp b/src/app/qgisappinterface.cpp
index 2b18ca257ce..c6bf04add48 100644
--- a/src/app/qgisappinterface.cpp
+++ b/src/app/qgisappinterface.cpp
@@ -38,7 +38,7 @@
#include "qgslayertreeview.h"
#include "qgsshortcutsmanager.h"
#include "qgsattributedialog.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectordataprovider.h"
#include "qgsfeatureaction.h"
#include "qgsactionmanager.h"
diff --git a/src/app/qgsaddattrdialog.h b/src/app/qgsaddattrdialog.h
index 96802fb6d59..5d26b8ca718 100644
--- a/src/app/qgsaddattrdialog.h
+++ b/src/app/qgsaddattrdialog.h
@@ -20,7 +20,7 @@
#include "ui_qgsaddattrdialogbase.h"
#include "qgisgui.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsVectorLayer;
diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp
index a321a14d891..4719b265254 100644
--- a/src/app/qgsattributetabledialog.cpp
+++ b/src/app/qgsattributetabledialog.cpp
@@ -46,7 +46,7 @@
#include "qgsexpressionselectiondialog.h"
#include "qgsfeaturelistmodel.h"
#include "qgsrubberband.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgseditorwidgetregistry.h"
#include "qgsfieldproxymodel.h"
@@ -387,7 +387,7 @@ void QgsAttributeTableDialog::columnBoxInit()
Q_FOREACH ( const QgsField& field, fields )
{
- int idx = mLayer->fieldNameIndex( field.name() );
+ int idx = mLayer->fields().lookupField( field.name() );
if ( idx < 0 )
continue;
@@ -524,7 +524,7 @@ void QgsAttributeTableDialog::filterColumnChanged( QObject* filterAction )
}
QString fieldName = mFilterButton->defaultAction()->data().toString();
// get the search widget
- int fldIdx = mLayer->fieldNameIndex( fieldName );
+ int fldIdx = mLayer->fields().lookupField( fieldName );
if ( fldIdx < 0 )
return;
const QgsEditorWidgetSetup setup = QgsEditorWidgetRegistry::instance()->findBest( mLayer, fieldName );
diff --git a/src/app/qgsclipboard.cpp b/src/app/qgsclipboard.cpp
index 3e492801f43..d53fe18a958 100644
--- a/src/app/qgsclipboard.cpp
+++ b/src/app/qgsclipboard.cpp
@@ -29,7 +29,7 @@
#include "qgsclipboard.h"
#include "qgsfeature.h"
#include "qgsfeaturestore.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgscoordinatereferencesystem.h"
#include "qgslogger.h"
diff --git a/src/app/qgsclipboard.h b/src/app/qgsclipboard.h
index 1e9e03dcae8..acd8cbc4925 100644
--- a/src/app/qgsclipboard.h
+++ b/src/app/qgsclipboard.h
@@ -22,7 +22,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgscoordinatereferencesystem.h"
diff --git a/src/app/qgsdelattrdialog.cpp b/src/app/qgsdelattrdialog.cpp
index 82b021539b3..4256632bdbb 100644
--- a/src/app/qgsdelattrdialog.cpp
+++ b/src/app/qgsdelattrdialog.cpp
@@ -17,7 +17,7 @@
#include "qgsapplication.h"
#include "qgsdelattrdialog.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectordataprovider.h"
#include "qgsvectorlayer.h"
diff --git a/src/app/qgsdiagramproperties.cpp b/src/app/qgsdiagramproperties.cpp
index cf9484a707b..350e594aad4 100644
--- a/src/app/qgsdiagramproperties.cpp
+++ b/src/app/qgsdiagramproperties.cpp
@@ -588,7 +588,7 @@ void QgsDiagramProperties::on_mFindMaximumValueButton_clicked()
}
else
{
- int attributeNumber = mLayer->fields().fieldNameIndex( sizeFieldNameOrExp );
+ int attributeNumber = mLayer->fields().lookupField( sizeFieldNameOrExp );
maxValue = mLayer->maximumValue( attributeNumber ).toFloat();
}
@@ -776,7 +776,7 @@ void QgsDiagramProperties::apply()
}
else
{
- int attributeNumber = mLayer->fields().fieldNameIndex( sizeFieldNameOrExp );
+ int attributeNumber = mLayer->fields().lookupField( sizeFieldNameOrExp );
dr->setClassificationAttribute( attributeNumber );
}
dr->setDiagramSettings( ds );
diff --git a/src/app/qgsdxfexportdialog.cpp b/src/app/qgsdxfexportdialog.cpp
index 0154217986d..f1a0f90f94c 100644
--- a/src/app/qgsdxfexportdialog.cpp
+++ b/src/app/qgsdxfexportdialog.cpp
@@ -91,7 +91,7 @@ void FieldSelectorDelegate::setModelData( QWidget *editor, QAbstractItemModel *m
if ( !fcb )
return;
- model->setData( index, vl->fieldNameIndex( fcb->currentField() ) );
+ model->setData( index, vl->fields().lookupField( fcb->currentField() ) );
}
QgsVectorLayerAndAttributeModel::QgsVectorLayerAndAttributeModel( QgsLayerTreeGroup* rootNode, QObject *parent )
diff --git a/src/app/qgsfieldcalculator.h b/src/app/qgsfieldcalculator.h
index 86ed24ef4fb..b8b4f27923c 100644
--- a/src/app/qgsfieldcalculator.h
+++ b/src/app/qgsfieldcalculator.h
@@ -18,7 +18,7 @@
#include "ui_qgsfieldcalculatorbase.h"
#include "qgscontexthelp.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsVectorLayer;
diff --git a/src/app/qgsfieldsproperties.cpp b/src/app/qgsfieldsproperties.cpp
index f21981c3cc9..db3ae02d635 100644
--- a/src/app/qgsfieldsproperties.cpp
+++ b/src/app/qgsfieldsproperties.cpp
@@ -855,7 +855,7 @@ QgsAttributeEditorElement* QgsFieldsProperties::createAttributeEditorWidget( QTr
{
case DesignerTreeItemData::Field:
{
- int idx = mLayer->fieldNameIndex( itemData.name() );
+ int idx = mLayer->fields().lookupField( itemData.name() );
widgetDef = new QgsAttributeEditorField( itemData.name(), idx, parent );
break;
}
diff --git a/src/app/qgsidentifyresultsdialog.cpp b/src/app/qgsidentifyresultsdialog.cpp
index 04ed3dece02..5d1e846cb23 100644
--- a/src/app/qgsidentifyresultsdialog.cpp
+++ b/src/app/qgsidentifyresultsdialog.cpp
@@ -681,7 +681,7 @@ QString QgsIdentifyResultsDialog::representValue( QgsVectorLayer* vlayer, const
QgsEditorWidgetFactory* factory = QgsEditorWidgetRegistry::instance()->factory( setup.type() );
- int idx = vlayer->fieldNameIndex( fieldName );
+ int idx = vlayer->fields().lookupField( fieldName );
if ( !factory )
return value.toString();
diff --git a/src/app/qgsidentifyresultsdialog.h b/src/app/qgsidentifyresultsdialog.h
index 5a6baff09a2..52c5d718adf 100644
--- a/src/app/qgsidentifyresultsdialog.h
+++ b/src/app/qgsidentifyresultsdialog.h
@@ -21,7 +21,7 @@
#include "ui_qgsidentifyresultsbase.h"
#include "qgscontexthelp.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsmaptoolidentify.h"
#include "qgswebview.h"
diff --git a/src/app/qgslabelpropertydialog.cpp b/src/app/qgslabelpropertydialog.cpp
index a57ca2be05b..8b8c7ccd80d 100644
--- a/src/app/qgslabelpropertydialog.cpp
+++ b/src/app/qgslabelpropertydialog.cpp
@@ -98,7 +98,7 @@ void QgsLabelPropertyDialog::init( const QString& layerId, const QString& provid
QString labelFieldName = vlayer->customProperty( "labeling/fieldName" ).toString();
if ( !labelFieldName.isEmpty() )
{
- mCurLabelField = vlayer->fieldNameIndex( labelFieldName );
+ mCurLabelField = vlayer->fields().lookupField( labelFieldName );
if ( mCurLabelField >= 0 )
{
mLabelTextLineEdit->setText( attributeValues.at( mCurLabelField ).toString() );
@@ -373,7 +373,7 @@ void QgsLabelPropertyDialog::enableDataDefinedWidgets( QgsVectorLayer* vlayer )
continue; // can only modify attributes with an active data definition of a mapped field
}
- int ddIndx = vlayer->fieldNameIndex( ddField );
+ int ddIndx = vlayer->fields().lookupField( ddField );
if ( ddIndx == -1 )
{
continue;
diff --git a/src/app/qgsmaptooladdfeature.cpp b/src/app/qgsmaptooladdfeature.cpp
index 44cb915492b..38bfa995a2c 100644
--- a/src/app/qgsmaptooladdfeature.cpp
+++ b/src/app/qgsmaptooladdfeature.cpp
@@ -18,7 +18,7 @@
#include "qgsattributedialog.h"
#include "qgscsexception.h"
#include "qgscurvepolygon.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslinestring.h"
#include "qgsmultipoint.h"
diff --git a/src/app/qgsmaptoolfeatureaction.cpp b/src/app/qgsmaptoolfeatureaction.cpp
index 49fcac42e26..11b766a2f9a 100644
--- a/src/app/qgsmaptoolfeatureaction.cpp
+++ b/src/app/qgsmaptoolfeatureaction.cpp
@@ -17,7 +17,7 @@
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsmapcanvas.h"
diff --git a/src/app/qgsmaptoolidentifyaction.cpp b/src/app/qgsmaptoolidentifyaction.cpp
index 8a4f46b0606..9e09c83d644 100644
--- a/src/app/qgsmaptoolidentifyaction.cpp
+++ b/src/app/qgsmaptoolidentifyaction.cpp
@@ -20,7 +20,7 @@
#include "qgsdistancearea.h"
#include "qgsfeature.h"
#include "qgsfeaturestore.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsidentifyresultsdialog.h"
diff --git a/src/app/qgsmaptoollabel.cpp b/src/app/qgsmaptoollabel.cpp
index 2f3597c9451..0e2db43b5a0 100644
--- a/src/app/qgsmaptoollabel.cpp
+++ b/src/app/qgsmaptoollabel.cpp
@@ -162,7 +162,7 @@ QString QgsMapToolLabel::currentLabelText( int trunc )
QString labelField = vlayer->customProperty( "labeling/fieldName" ).toString();
if ( !labelField.isEmpty() )
{
- int labelFieldId = vlayer->fieldNameIndex( labelField );
+ int labelFieldId = vlayer->fields().lookupField( labelField );
QgsFeature f;
if ( vlayer->getFeatures( QgsFeatureRequest().setFilterFid( mCurrentLabel.pos.featureId ).setFlags( QgsFeatureRequest::NoGeometry ) ).nextFeature( f ) )
{
@@ -434,7 +434,7 @@ int QgsMapToolLabel::dataDefinedColumnIndex( QgsPalLayerSettings::DataDefinedPro
{
QString fieldname = dataDefinedColumnName( p, labelSettings );
if ( !fieldname.isEmpty() )
- return vlayer->fieldNameIndex( fieldname );
+ return vlayer->fields().lookupField( fieldname );
return -1;
}
@@ -497,7 +497,7 @@ bool QgsMapToolLabel::layerIsRotatable( QgsVectorLayer* vlayer, int& rotationCol
bool QgsMapToolLabel::labelIsRotatable( QgsVectorLayer* layer, const QgsPalLayerSettings& settings, int& rotationCol ) const
{
QString rColName = dataDefinedColumnName( QgsPalLayerSettings::Rotation, settings );
- rotationCol = layer->fieldNameIndex( rColName );
+ rotationCol = layer->fields().lookupField( rColName );
return rotationCol != -1;
}
@@ -606,8 +606,8 @@ bool QgsMapToolLabel::labelMoveable( QgsVectorLayer* vlayer, const QgsPalLayerSe
QString xColName = dataDefinedColumnName( QgsPalLayerSettings::PositionX, settings );
QString yColName = dataDefinedColumnName( QgsPalLayerSettings::PositionY, settings );
//return !xColName.isEmpty() && !yColName.isEmpty();
- xCol = vlayer->fieldNameIndex( xColName );
- yCol = vlayer->fieldNameIndex( yColName );
+ xCol = vlayer->fields().lookupField( xColName );
+ yCol = vlayer->fields().lookupField( yColName );
return ( xCol != -1 && yCol != -1 );
}
@@ -629,7 +629,7 @@ bool QgsMapToolLabel::labelCanShowHide( QgsVectorLayer* vlayer, int& showCol ) c
{
QString fieldname = dataDefinedColumnName( QgsPalLayerSettings::Show,
vlayer->labeling()->settings( vlayer, providerId ) );
- showCol = vlayer->fieldNameIndex( fieldname );
+ showCol = vlayer->fields().lookupField( fieldname );
if ( showCol != -1 )
return true;
}
diff --git a/src/app/qgsmergeattributesdialog.cpp b/src/app/qgsmergeattributesdialog.cpp
index 4ca00637537..4731eac47a8 100644
--- a/src/app/qgsmergeattributesdialog.cpp
+++ b/src/app/qgsmergeattributesdialog.cpp
@@ -21,7 +21,7 @@
#include "qgsapplication.h"
#include "qgseditorwidgetwrapper.h"
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsmapcanvas.h"
#include "qgsrubberband.h"
#include "qgsvectorlayer.h"
diff --git a/src/app/qgsmergeattributesdialog.h b/src/app/qgsmergeattributesdialog.h
index 780416dd4c0..20e7243328c 100644
--- a/src/app/qgsmergeattributesdialog.h
+++ b/src/app/qgsmergeattributesdialog.h
@@ -22,7 +22,7 @@
#include "ui_qgsmergeattributesdialogbase.h"
#include "qgsfeature.h"
#include "qgsstatisticalsummary.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsMapCanvas;
class QgsRubberBand;
diff --git a/src/app/qgsstatisticalsummarydockwidget.cpp b/src/app/qgsstatisticalsummarydockwidget.cpp
index 0dd15420425..0230b78b67c 100644
--- a/src/app/qgsstatisticalsummarydockwidget.cpp
+++ b/src/app/qgsstatisticalsummarydockwidget.cpp
@@ -134,7 +134,7 @@ void QgsStatisticalSummaryDockWidget::refreshStatistics()
if ( !mFieldExpressionWidget->isExpression() )
{
QString field = mFieldExpressionWidget->currentField();
- fieldType = mLayer->fields().field( mLayer->fields().fieldNameIndex( field ) ).type();
+ fieldType = mLayer->fields().field( mLayer->fields().lookupField( field ) ).type();
if ( fieldType == QVariant::String || fieldType == QVariant::Date || fieldType == QVariant::DateTime )
{
isNumeric = false;
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 71df5008a93..44d48f8ec79 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -122,6 +122,7 @@ SET(QGIS_CORE_SRCS
qgsfeaturerequest.cpp
qgsfeaturestore.cpp
qgsfield.cpp
+ qgsfields.cpp
qgsfontutils.cpp
qgsgeometrycache.cpp
qgsgeometrysimplifier.cpp
@@ -637,6 +638,7 @@ SET(QGIS_CORE_HDRS
qgsfeatureiterator.h
qgsfeaturerequest.h
qgsfeaturestore.h
+ qgsfields.h
qgsfontutils.h
qgsgeometrycache.h
qgshistogram.h
diff --git a/src/core/composer/qgsatlascomposition.cpp b/src/core/composer/qgsatlascomposition.cpp
index aed44218ee0..1cea67e96db 100644
--- a/src/core/composer/qgsatlascomposition.cpp
+++ b/src/core/composer/qgsatlascomposition.cpp
@@ -178,7 +178,7 @@ int QgsAtlasComposition::updateFeatures()
QgsFeature feat;
mFeatureIds.clear();
mFeatureKeys.clear();
- int sortIdx = mCoverageLayer->fieldNameIndex( mSortKeyAttributeName );
+ int sortIdx = mCoverageLayer->fields().lookupField( mSortKeyAttributeName );
while ( fit.nextFeature( feat ) )
{
diff --git a/src/core/composer/qgscomposerattributetablev2.cpp b/src/core/composer/qgscomposerattributetablev2.cpp
index 99bd0ceb8da..a8062962dc4 100644
--- a/src/core/composer/qgscomposerattributetablev2.cpp
+++ b/src/core/composer/qgscomposerattributetablev2.cpp
@@ -330,7 +330,7 @@ void QgsComposerAttributeTableV2::setDisplayedFields( const QStringList& fields,
{
Q_FOREACH ( const QString& field, fields )
{
- int attrIdx = layerFields.fieldNameIndex( field );
+ int attrIdx = layerFields.lookupField( field );
if ( attrIdx < 0 )
continue;
@@ -373,7 +373,7 @@ void QgsComposerAttributeTableV2::restoreFieldAliasMap( const QMap
QList::const_iterator columnIt = mColumns.constBegin();
for ( ; columnIt != mColumns.constEnd(); ++columnIt )
{
- int attrIdx = source->fieldNameIndex(( *columnIt )->attribute() );
+ int attrIdx = source->fields().lookupField(( *columnIt )->attribute() );
if ( map.contains( attrIdx ) )
{
( *columnIt )->setHeading( map.value( attrIdx ) );
@@ -499,7 +499,7 @@ bool QgsComposerAttributeTableV2::getTableContents( QgsComposerTableContents &co
QList::const_iterator columnIt = mColumns.constBegin();
for ( ; columnIt != mColumns.constEnd(); ++columnIt )
{
- int idx = layer->fieldNameIndex(( *columnIt )->attribute() );
+ int idx = layer->fields().lookupField(( *columnIt )->attribute() );
if ( idx != -1 )
{
currentRow << replaceWrapChar( f.attributes().at( idx ) );
diff --git a/src/core/qgsaggregatecalculator.cpp b/src/core/qgsaggregatecalculator.cpp
index 79dee82337d..46b16b377e2 100644
--- a/src/core/qgsaggregatecalculator.cpp
+++ b/src/core/qgsaggregatecalculator.cpp
@@ -56,7 +56,7 @@ QVariant QgsAggregateCalculator::calculate( QgsAggregateCalculator::Aggregate ag
QScopedPointer expression;
- int attrNum = mLayer->fieldNameIndex( fieldOrExpression );
+ int attrNum = mLayer->fields().lookupField( fieldOrExpression );
if ( attrNum == -1 )
{
diff --git a/src/core/qgsattributetableconfig.cpp b/src/core/qgsattributetableconfig.cpp
index 5163aadf82c..4ccd15d5471 100644
--- a/src/core/qgsattributetableconfig.cpp
+++ b/src/core/qgsattributetableconfig.cpp
@@ -14,7 +14,7 @@
* *
***************************************************************************/
#include "qgsattributetableconfig.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
QgsAttributeTableConfig::QgsAttributeTableConfig()
@@ -65,7 +65,7 @@ void QgsAttributeTableConfig::update( const QgsFields& fields )
const ColumnConfig& column = mColumns.at( i );
if ( column.type == Field )
{
- if ( fields.fieldNameIndex( column.name ) == -1 )
+ if ( fields.lookupField( column.name ) == -1 )
{
mColumns.remove( i );
}
diff --git a/src/core/qgsdatadefined.cpp b/src/core/qgsdatadefined.cpp
index 9612018035b..c09d0c3fdd7 100644
--- a/src/core/qgsdatadefined.cpp
+++ b/src/core/qgsdatadefined.cpp
@@ -18,7 +18,7 @@
#include "qgslogger.h"
#include "qgsexpression.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
QgsDataDefined::QgsDataDefined( bool active,
diff --git a/src/core/qgsdiagramrenderer.h b/src/core/qgsdiagramrenderer.h
index 4f963041fba..185f3d0e0d7 100644
--- a/src/core/qgsdiagramrenderer.h
+++ b/src/core/qgsdiagramrenderer.h
@@ -23,7 +23,7 @@
#include
#include "qgsexpressioncontext.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscoordinatetransform.h"
#include "qgssymbol.h"
diff --git a/src/core/qgseditformconfig.cpp b/src/core/qgseditformconfig.cpp
index 94d89d1d5d0..42a4a8f09ab 100644
--- a/src/core/qgseditformconfig.cpp
+++ b/src/core/qgseditformconfig.cpp
@@ -597,7 +597,7 @@ QgsAttributeEditorElement* QgsEditFormConfig::attributeEditorElementFromDomEleme
else if ( elem.tagName() == "attributeEditorField" )
{
QString name = elem.attribute( "name" );
- int idx = d->mFields.fieldNameIndex( name );
+ int idx = d->mFields.lookupField( name );
newElement = new QgsAttributeEditorField( name, idx, parent );
}
else if ( elem.tagName() == "attributeEditorRelation" )
diff --git a/src/core/qgseditformconfig_p.h b/src/core/qgseditformconfig_p.h
index dd2426a84f7..6ba11a173fa 100644
--- a/src/core/qgseditformconfig_p.h
+++ b/src/core/qgseditformconfig_p.h
@@ -18,7 +18,7 @@
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgseditformconfig.h"
/// @cond PRIVATE
diff --git a/src/core/qgsexpression.cpp b/src/core/qgsexpression.cpp
index fd10ebc37dc..6be741bf2ae 100644
--- a/src/core/qgsexpression.cpp
+++ b/src/core/qgsexpression.cpp
@@ -3086,7 +3086,7 @@ static QVariant fcnGetFeature( const QVariantList& values, const QgsExpressionCo
}
QString attribute = getStringValue( values.at( 1 ), parent );
- int attributeId = vl->fieldNameIndex( attribute );
+ int attributeId = vl->fields().lookupField( attribute );
if ( attributeId == -1 )
{
return QVariant();
@@ -3824,6 +3824,24 @@ QStringList QgsExpression::referencedColumns() const
return columns;
}
+QSet QgsExpression::referencedAttributeIndexes( const QgsFields& fields ) const
+{
+ QStringList referencedFields = d->mRootNode->referencedColumns();
+ QSet referencedIndexes;
+
+ Q_FOREACH ( const QString& fieldName, referencedFields )
+ {
+ if ( fieldName == QgsFeatureRequest::AllAttributes )
+ {
+ referencedIndexes = fields.allAttributesList().toSet();
+ break;
+ }
+ referencedIndexes << fields.lookupField( fieldName );
+ }
+
+ return referencedIndexes;
+}
+
bool QgsExpression::needsGeometry() const
{
if ( !d->mRootNode )
@@ -4807,7 +4825,7 @@ QVariant QgsExpression::NodeColumnRef::eval( QgsExpression *parent, const QgsExp
if ( context && context->hasVariable( QgsExpressionContext::EXPR_FIELDS ) )
{
QgsFields fields = qvariant_cast( context->variable( QgsExpressionContext::EXPR_FIELDS ) );
- index = fields.fieldNameIndex( mName );
+ index = fields.lookupField( mName );
}
}
@@ -4829,7 +4847,7 @@ bool QgsExpression::NodeColumnRef::prepare( QgsExpression *parent, const QgsExpr
QgsFields fields = qvariant_cast( context->variable( QgsExpressionContext::EXPR_FIELDS ) );
- mIndex = fields.fieldNameIndex( mName );
+ mIndex = fields.lookupField( mName );
if ( mIndex >= 0 )
{
return true;
diff --git a/src/core/qgsexpression.h b/src/core/qgsexpression.h
index 212b76eb0ea..e295545d127 100644
--- a/src/core/qgsexpression.h
+++ b/src/core/qgsexpression.h
@@ -179,10 +179,19 @@ class CORE_EXPORT QgsExpression
* all attributes from the layer are required for evaluation of the expression.
* QgsFeatureRequest::setSubsetOfAttributes automatically handles this case.
*
+ * @see referencedAttributeIndexes()
+ *
* TODO QGIS3: Return QSet
*/
QStringList referencedColumns() const;
+ /**
+ * Return a list of field name indexes obtained from the provided fields.
+ *
+ * @note Added in QGIS 3.0
+ */
+ QSet referencedAttributeIndexes( const QgsFields& fields ) const;
+
//! Returns true if the expression uses feature geometry for some computation
bool needsGeometry() const;
@@ -294,13 +303,13 @@ class CORE_EXPORT QgsExpression
* in the string with the result of its evaluation with the specified context
*
* Additional substitutions can be passed through the substitutionMap parameter
- * @param action
- * @param context expression context
- * @param distanceArea optional QgsDistanceArea. If specified, the QgsDistanceArea is used for distance
+ * @param action The source string in which placeholders should be replaced.
+ * @param context Expression context
+ * @param distanceArea Optional QgsDistanceArea. If specified, the QgsDistanceArea is used for distance
* and area conversion
* @note added in QGIS 2.12
*/
- static QString replaceExpressionText( const QString &action, const QgsExpressionContext* context,
+ static QString replaceExpressionText( const QString& action, const QgsExpressionContext* context,
const QgsDistanceArea* distanceArea = nullptr );
/** Attempts to evaluate a text string as an expression to a resultant double
@@ -335,12 +344,12 @@ class CORE_EXPORT QgsExpression
boAnd,
// comparison
- boEQ, // =
- boNE, // <>
- boLE, // <=
- boGE, // >=
- boLT, // <
- boGT, // >
+ boEQ, //!< =
+ boNE, //!< <>
+ boLE, //!< <=
+ boGE, //!< >=
+ boLT, //!< <
+ boGT, //!< >
boRegexp,
boLike,
boNotLike,
diff --git a/src/core/qgsexpressioncontext.cpp b/src/core/qgsexpressioncontext.cpp
index d9e886217a3..0df4f1ca3d5 100644
--- a/src/core/qgsexpressioncontext.cpp
+++ b/src/core/qgsexpressioncontext.cpp
@@ -17,7 +17,7 @@
#include "qgslogger.h"
#include "qgsexpression.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
#include "qgsproject.h"
#include "qgssymbollayerutils.h"
diff --git a/src/core/qgsexpressionfieldbuffer.h b/src/core/qgsexpressionfieldbuffer.h
index 3eaf5a1be8b..6ac2d46a419 100644
--- a/src/core/qgsexpressionfieldbuffer.h
+++ b/src/core/qgsexpressionfieldbuffer.h
@@ -22,7 +22,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsexpression.h"
/** \ingroup core
diff --git a/src/core/qgsfeature.cpp b/src/core/qgsfeature.cpp
index 2416fe5e80b..75d27482ba8 100644
--- a/src/core/qgsfeature.cpp
+++ b/src/core/qgsfeature.cpp
@@ -15,7 +15,7 @@ email : sherman at mrcc.com
#include "qgsfeature.h"
#include "qgsfeature_p.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgsrectangle.h"
@@ -274,7 +274,7 @@ QVariant QgsFeature::attribute( const QString& name ) const
int QgsFeature::fieldNameIndex( const QString& fieldName ) const
{
- return d->fields.fieldNameIndex( fieldName );
+ return d->fields.lookupField( fieldName );
}
/***************************************************************************
diff --git a/src/core/qgsfeature.h b/src/core/qgsfeature.h
index 3b3d7e41122..3f1239caedd 100644
--- a/src/core/qgsfeature.h
+++ b/src/core/qgsfeature.h
@@ -24,7 +24,7 @@ email : sherman at mrcc.com
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsGeometry;
class QgsRectangle;
diff --git a/src/core/qgsfeature_p.h b/src/core/qgsfeature_p.h
index 7e2e20c2f1d..2f6c2e02d4c 100644
--- a/src/core/qgsfeature_p.h
+++ b/src/core/qgsfeature_p.h
@@ -33,7 +33,7 @@ email : nyall dot dawson at gmail dot com
* See details in QEP #17
****************************************************************************/
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
diff --git a/src/core/qgsfeaturerequest.cpp b/src/core/qgsfeaturerequest.cpp
index 80a6a518688..a816b2ec229 100644
--- a/src/core/qgsfeaturerequest.cpp
+++ b/src/core/qgsfeaturerequest.cpp
@@ -14,7 +14,7 @@
***************************************************************************/
#include "qgsfeaturerequest.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include
@@ -208,7 +208,7 @@ QgsFeatureRequest& QgsFeatureRequest::setSubsetOfAttributes( const QStringList&
Q_FOREACH ( const QString& attrName, attrNames )
{
- int attrNum = fields.fieldNameIndex( attrName );
+ int attrNum = fields.lookupField( attrName );
if ( attrNum != -1 && !mAttrs.contains( attrNum ) )
mAttrs.append( attrNum );
}
diff --git a/src/core/qgsfeaturestore.h b/src/core/qgsfeaturestore.h
index 620658c80a1..73729c3c2de 100644
--- a/src/core/qgsfeaturestore.h
+++ b/src/core/qgsfeaturestore.h
@@ -17,7 +17,7 @@
#include "qgis.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscoordinatereferencesystem.h"
#include
#include
diff --git a/src/core/qgsfield.cpp b/src/core/qgsfield.cpp
index 4363fb0f093..95ccee0e864 100644
--- a/src/core/qgsfield.cpp
+++ b/src/core/qgsfield.cpp
@@ -14,7 +14,7 @@
* *
***************************************************************************/
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfield_p.h"
#include "qgis.h"
#include "qgsapplication.h"
@@ -323,331 +323,3 @@ QDataStream& operator>>( QDataStream& in, QgsField& field )
field.setSubType( static_cast< QVariant::Type >( subType ) );
return in;
}
-
-////////////////////////////////////////////////////////////////////////////
-
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-QgsFields::QgsFields()
-{
- d = new QgsFieldsPrivate();
-}
-
-QgsFields::QgsFields( const QgsFields& other )
- : d( other.d )
-{
-}
-
-QgsFields& QgsFields::operator =( const QgsFields & other )
-{
- d = other.d;
- return *this;
-}
-
-QgsFields::~QgsFields()
-{
-
-}
-
-void QgsFields::clear()
-{
- d->fields.clear();
- d->nameToIndex.clear();
-}
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-bool QgsFields::append( const QgsField& field, FieldOrigin origin, int originIndex )
-{
- if ( d->nameToIndex.contains( field.name() ) )
- return false;
-
- if ( originIndex == -1 && origin == OriginProvider )
- originIndex = d->fields.count();
- d->fields.append( Field( field, origin, originIndex ) );
-
- d->nameToIndex.insert( field.name(), d->fields.count() - 1 );
- return true;
-}
-
-bool QgsFields::appendExpressionField( const QgsField& field, int originIndex )
-{
- if ( d->nameToIndex.contains( field.name() ) )
- return false;
-
- d->fields.append( Field( field, OriginExpression, originIndex ) );
-
- d->nameToIndex.insert( field.name(), d->fields.count() - 1 );
- return true;
-}
-
-void QgsFields::remove( int fieldIdx )
-{
- if ( !exists( fieldIdx ) )
- return;
-
- d->fields.remove( fieldIdx );
- d->nameToIndex.clear();
- for ( int idx = 0; idx < count(); ++idx )
- {
- d->nameToIndex.insert( d->fields.at( idx ).field.name(), idx );
- }
-}
-
-void QgsFields::extend( const QgsFields& other )
-{
- for ( int i = 0; i < other.count(); ++i )
- {
- append( other.at( i ), other.fieldOrigin( i ), other.fieldOriginIndex( i ) );
- }
-}
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-bool QgsFields::isEmpty() const
-{
- return d->fields.isEmpty();
-}
-
-int QgsFields::count() const
-{
- return d->fields.count();
-}
-
-int QgsFields::size() const
-{
- return d->fields.count();
-}
-
-bool QgsFields::exists( int i ) const
-{
- return i >= 0 && i < d->fields.count();
-}
-
-QgsField &QgsFields::operator[]( int i )
-{
- return d->fields[i].field;
-}
-
-QgsField QgsFields::at( int i ) const
-{
- return d->fields[i].field;
-}
-
-QgsField QgsFields::field( int fieldIdx ) const
-{
- return d->fields[fieldIdx].field;
-}
-
-QgsField QgsFields::field( const QString &name ) const
-{
- return d->fields[ indexFromName( name )].field;
-}
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-QgsField QgsFields::operator[]( int i ) const
-{
- return d->fields[i].field;
-}
-
-QgsFields::FieldOrigin QgsFields::fieldOrigin( int fieldIdx ) const
-{
- if ( !exists( fieldIdx ) )
- return OriginUnknown;
-
- return d->fields[fieldIdx].origin;
-}
-
-int QgsFields::fieldOriginIndex( int fieldIdx ) const
-{
- return d->fields[fieldIdx].originIndex;
-}
-
-int QgsFields::indexFromName( const QString &fieldName ) const
-{
- return d->nameToIndex.value( fieldName, -1 );
-}
-
-QList QgsFields::toList() const
-{
- QList lst;
- for ( int i = 0; i < d->fields.count(); ++i )
- lst.append( d->fields[i].field );
- return lst;
-}
-
-bool QgsFields::operator==( const QgsFields &other ) const
-{
- return d->fields == other.d->fields;
-}
-
-QgsFields::const_iterator QgsFields::constBegin() const noexcept
-{
- if ( d->fields.isEmpty() )
- return const_iterator();
-
- return const_iterator( &d->fields.first() );
-}
-
-QgsFields::const_iterator QgsFields::constEnd() const noexcept
-{
- if ( d->fields.isEmpty() )
- return const_iterator();
-
- return const_iterator( &d->fields.last() + 1 );
-}
-
-QgsFields::const_iterator QgsFields::begin() const noexcept
-{
- if ( d->fields.isEmpty() )
- return const_iterator();
-
- return const_iterator( &d->fields.first() );
-}
-
-QgsFields::const_iterator QgsFields::end() const noexcept
-{
- if ( d->fields.isEmpty() )
- return const_iterator();
-
- return const_iterator( &d->fields.last() + 1 );
-}
-
-QgsFields::iterator QgsFields::begin()
-{
- if ( d->fields.isEmpty() )
- return iterator();
-
- d.detach();
- return iterator( &d->fields.first() );
-}
-
-QgsFields::iterator QgsFields::end()
-{
- if ( d->fields.isEmpty() )
- return iterator();
-
- d.detach();
- return iterator( &d->fields.last() + 1 );
-}
-
-QIcon QgsFields::iconForField( int fieldIdx ) const
-{
- switch ( d->fields.at( fieldIdx ).field.type() )
- {
- case QVariant::Int:
- case QVariant::UInt:
- case QVariant::LongLong:
- case QVariant::ULongLong:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldInteger.svg" );
- }
- case QVariant::Double:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldFloat.svg" );
- }
- case QVariant::String:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldText.svg" );
- }
- case QVariant::Date:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldDate.svg" );
- }
- case QVariant::DateTime:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldDateTime.svg" );
- }
- case QVariant::Time:
- {
- return QgsApplication::getThemeIcon( "/mIconFieldTime.svg" );
- }
- default:
- return QIcon();
- }
-}
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-int QgsFields::fieldNameIndex( const QString& fieldName ) const
-{
- for ( int idx = 0; idx < count(); ++idx )
- {
- if ( d->fields[idx].field.name() == fieldName )
- return idx;
- }
-
- for ( int idx = 0; idx < count(); ++idx )
- {
- if ( QString::compare( d->fields[idx].field.name(), fieldName, Qt::CaseInsensitive ) == 0 )
- return idx;
- }
-
- for ( int idx = 0; idx < count(); ++idx )
- {
- if ( QString::compare( d->fields[idx].field.alias(), fieldName, Qt::CaseInsensitive ) == 0 )
- return idx;
- }
-
- return -1;
-}
-
-QgsAttributeList QgsFields::allAttributesList() const
-{
- QgsAttributeList lst;
- for ( int i = 0; i < d->fields.count(); ++i )
- lst.append( i );
- return lst;
-}
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-QDataStream& operator<<( QDataStream& out, const QgsFields& fields )
-{
- out << static_cast< quint32 >( fields.size() );
- for ( int i = 0; i < fields.size(); i++ )
- {
- out << fields.field( i );
- }
- return out;
-}
-
-QDataStream& operator>>( QDataStream& in, QgsFields& fields )
-{
- fields.clear();
- quint32 size;
- in >> size;
- for ( quint32 i = 0; i < size; i++ )
- {
- QgsField field;
- in >> field;
- fields.append( field );
- }
- return in;
-}
diff --git a/src/core/qgsfield.h b/src/core/qgsfield.h
index 7dbe3d3505f..fb002c5d5d7 100644
--- a/src/core/qgsfield.h
+++ b/src/core/qgsfield.h
@@ -269,291 +269,4 @@ CORE_EXPORT QDataStream& operator<<( QDataStream& out, const QgsField& field );
CORE_EXPORT QDataStream& operator>>( QDataStream& in, QgsField& field );
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-/** \class QgsFields
- * \ingroup core
- * Container of fields for a vector layer.
- *
- * In addition to storing a list of QgsField instances, it also:
- * - allows quick lookups of field names to index in the list
- * - keeps track of where the field definition comes from (vector data provider, joined layer or newly added from an editing operation)
- * \note QgsFields objects are implicitly shared.
- */
-class CORE_EXPORT QgsFields
-{
- public:
-
- enum FieldOrigin
- {
- OriginUnknown, //!< it has not been specified where the field comes from
- OriginProvider, //!< field comes from the underlying data provider of the vector layer (originIndex = index in provider's fields)
- OriginJoin, //!< field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index within the join)
- OriginEdit, //!< field has been temporarily added in editing mode (originIndex = index in the list of added attributes)
- OriginExpression //!< field is calculated from an expression
- };
-
- typedef struct Field
- {
- Field(): origin( OriginUnknown ), originIndex( -1 ) {}
- Field( const QgsField& f, FieldOrigin o, int oi ): field( f ), origin( o ), originIndex( oi ) {}
-
- //! @note added in 2.6
- bool operator==( const Field& other ) const { return field == other.field && origin == other.origin && originIndex == other.originIndex; }
- //! @note added in 2.6
- bool operator!=( const Field& other ) const { return !( *this == other ); }
-
- QgsField field; //!< field
- FieldOrigin origin; //!< origin of the field
- int originIndex; //!< index specific to the origin
- } Field;
-
- /** Constructor for an empty field container
- */
- QgsFields();
-
- /** Copy constructor
- */
- QgsFields( const QgsFields& other );
-
- /** Assignment operator
- */
- QgsFields& operator =( const QgsFields &other );
-
- virtual ~QgsFields();
-
- //! Remove all fields
- void clear();
- //! Append a field. The field must have unique name, otherwise it is rejected (returns false)
- bool append( const QgsField& field, FieldOrigin origin = OriginProvider, int originIndex = -1 );
- //! Append an expression field. The field must have unique name, otherwise it is rejected (returns false)
- bool appendExpressionField( const QgsField& field, int originIndex );
- //! Remove a field with the given index
- void remove( int fieldIdx );
- //! Extend with fields from another QgsFields container
- void extend( const QgsFields& other );
-
- //! Check whether the container is empty
- bool isEmpty() const;
- //! Return number of items
- int count() const;
- //! Return number of items
- int size() const;
- //! Return if a field index is valid
- //! @param i Index of the field which needs to be checked
- //! @return True if the field exists
- bool exists( int i ) const;
-
- //! Get field at particular index (must be in range 0..N-1)
- QgsField operator[]( int i ) const;
- //! Get field at particular index (must be in range 0..N-1)
- QgsField& operator[]( int i );
- //! Get field at particular index (must be in range 0..N-1)
- QgsField at( int i ) const;
- //! Get field at particular index (must be in range 0..N-1)
- QgsField field( int fieldIdx ) const;
- //! Get field with matching name
- QgsField field( const QString& name ) const;
-
- //! Get field's origin (value from an enumeration)
- FieldOrigin fieldOrigin( int fieldIdx ) const;
- //! Get field's origin index (its meaning is specific to each type of origin)
- int fieldOriginIndex( int fieldIdx ) const;
-
- /**
- * Look up field's index from the field name.
- * This method takes is case sensitive and only matches the data source
- * name of the field.
- *
- * @param fieldName The name of the field.
- *
- * @return The field index if found or -1 in case it cannot be found.
- * @see fieldNameIndex For a more tolerant alternative.
- */
- int indexFromName( const QString& fieldName ) const;
-
- /**
- * Look up field's index from the field name.
- * This method matches in the following order:
- *
- * 1. The exact field name taking case sensitivity into account
- * 2. Looks for the field name by case insensitive comparison
- * 3. The field alias (case insensitive)
- *
- * @param fieldName The name to look for.
- *
- * @return The field index if found or -1 in case it cannot be found.
- * @see indexFromName For a more performant and precise but less tolerant alternative.
- * @note added in 2.4
- */
- int fieldNameIndex( const QString& fieldName ) const;
-
- //! Utility function to get list of attribute indexes
- //! @note added in 2.4
- QgsAttributeList allAttributesList() const;
-
- //! Utility function to return a list of QgsField instances
- QList toList() const;
-
- //! @note added in 2.6
- bool operator==( const QgsFields& other ) const;
- //! @note added in 2.6
- bool operator!=( const QgsFields& other ) const { return !( *this == other ); }
- /** Returns an icon corresponding to a field index, based on the field's type and source
- * @note added in QGIS 2.14
- */
- QIcon iconForField( int fieldIdx ) const;
-
- //! Allows direct construction of QVariants from fields.
- operator QVariant() const
- {
- return QVariant::fromValue( *this );
- }
-
- ///@cond PRIVATE
-
- class const_iterator;
-
- class iterator
- {
- public:
- QgsFields::Field* d;
- typedef std::random_access_iterator_tag iterator_category;
- typedef qptrdiff difference_type;
-
- inline iterator()
- : d( nullptr )
- {}
- inline iterator( QgsFields::Field *n )
- : d( n )
- {}
-
- inline QgsField& operator*() const { return d->field; }
- inline QgsField* operator->() const { return &d->field; }
- inline QgsField& operator[]( difference_type j ) const { return d[j].field; }
- inline bool operator==( const iterator &o ) const noexcept { return d == o.d; }
- inline bool operator!=( const iterator &o ) const noexcept { return d != o.d; }
- inline bool operator<( const iterator& other ) const noexcept { return d < other.d; }
- inline bool operator<=( const iterator& other ) const noexcept { return d <= other.d; }
- inline bool operator>( const iterator& other ) const noexcept { return d > other.d; }
- inline bool operator>=( const iterator& other ) const noexcept { return d >= other.d; }
-
- inline iterator& operator++() { ++d; return *this; }
- inline iterator operator++( int ) { QgsFields::Field* n = d; ++d; return n; }
- inline iterator& operator--() { d--; return *this; }
- inline iterator operator--( int ) { QgsFields::Field* n = d; d--; return n; }
- inline iterator& operator+=( difference_type j ) { d += j; return *this; }
- inline iterator& operator-=( difference_type j ) { d -= j; return *this; }
- inline iterator operator+( difference_type j ) const { return iterator( d + j ); }
- inline iterator operator-( difference_type j ) const { return iterator( d -j ); }
- inline int operator-( iterator j ) const { return int( d - j.d ); }
- };
- friend class iterator;
-
- class const_iterator
- {
- public:
- const QgsFields::Field* d;
-
- typedef std::random_access_iterator_tag iterator_category;
- typedef qptrdiff difference_type;
-
- inline const_iterator()
- : d( nullptr ) {}
- inline const_iterator( const QgsFields::Field* f )
- : d( f ) {}
- inline const_iterator( const const_iterator &o )
- : d( o.d ) {}
- inline explicit const_iterator( const iterator &o )
- : d( o.d ) {}
- inline const QgsField& operator*() const { return d->field; }
- inline const QgsField* operator->() const { return &d->field; }
- inline const QgsField& operator[]( difference_type j ) const noexcept { return d[j].field; }
- inline bool operator==( const const_iterator &o ) const noexcept { return d == o.d; }
- inline bool operator!=( const const_iterator &o ) const noexcept { return d != o.d; }
- inline bool operator<( const const_iterator& other ) const noexcept { return d < other.d; }
- inline bool operator<=( const const_iterator& other ) const noexcept { return d <= other.d; }
- inline bool operator>( const const_iterator& other ) const noexcept { return d > other.d; }
- inline bool operator>=( const const_iterator& other ) const noexcept { return d >= other.d; }
- inline const_iterator& operator++() { ++d; return *this; }
- inline const_iterator operator++( int ) { const QgsFields::Field* n = d; ++d; return n; }
- inline const_iterator& operator--() { d--; return *this; }
- inline const_iterator operator--( int ) { const QgsFields::Field* n = d; --d; return n; }
- inline const_iterator& operator+=( difference_type j ) { d += j; return *this; }
- inline const_iterator& operator-=( difference_type j ) { d -= j; return *this; }
- inline const_iterator operator+( difference_type j ) const { return const_iterator( d + j ); }
- inline const_iterator operator-( difference_type j ) const { return const_iterator( d -j ); }
- inline int operator-( const_iterator j ) const { return int( d - j.d ); }
- };
- friend class const_iterator;
- ///@endcond
-
-
- /**
- * Returns a const STL-style iterator pointing to the first item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- const_iterator constBegin() const noexcept;
-
- /**
- * Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- const_iterator constEnd() const noexcept;
-
- /**
- * Returns a const STL-style iterator pointing to the first item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- const_iterator begin() const noexcept;
-
- /**
- * Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- const_iterator end() const noexcept;
-
- /**
- * Returns an STL-style iterator pointing to the first item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- iterator begin();
-
-
- /**
- * Returns an STL-style iterator pointing to the imaginary item after the last item in the list.
- *
- * @note added in 2.16
- * @note not available in Python bindings
- */
- iterator end();
-
- private:
-
- QSharedDataPointer d;
-
-};
-
-Q_DECLARE_METATYPE( QgsFields )
-
-/** Writes the fields to stream out. QGIS version compatibility is not guaranteed. */
-CORE_EXPORT QDataStream& operator<<( QDataStream& out, const QgsFields& fields );
-/** Reads fields from stream in into fields. QGIS version compatibility is not guaranteed. */
-CORE_EXPORT QDataStream& operator>>( QDataStream& in, QgsFields& fields );
-
#endif
diff --git a/src/core/qgsfield_p.h b/src/core/qgsfield_p.h
index c1f193db426..7c133a8c9f1 100644
--- a/src/core/qgsfield_p.h
+++ b/src/core/qgsfield_p.h
@@ -30,7 +30,6 @@
#include
#include
#include
-#include "qgsfield.h"
/***************************************************************************
* This class is considered CRITICAL and any change MUST be accompanied with
@@ -112,38 +111,6 @@ class QgsFieldPrivate : public QSharedData
QgsEditorWidgetSetup editorWidgetSetup;
};
-
-/***************************************************************************
- * This class is considered CRITICAL and any change MUST be accompanied with
- * full unit tests in testqgsfields.cpp.
- * See details in QEP #17
- ****************************************************************************/
-
-class CORE_EXPORT QgsFieldsPrivate : public QSharedData
-{
- public:
-
- QgsFieldsPrivate()
- {
- }
-
- QgsFieldsPrivate( const QgsFieldsPrivate& other )
- : QSharedData( other )
- , fields( other.fields )
- , nameToIndex( other.nameToIndex )
- {
- }
-
- ~QgsFieldsPrivate() {}
-
- //! internal storage of the container
- QVector fields;
-
- //! map for quick resolution of name to index
- QHash nameToIndex;
-
-};
-
/// @endcond
#endif
diff --git a/src/core/qgsfields.cpp b/src/core/qgsfields.cpp
new file mode 100644
index 00000000000..ccb68b3ee9b
--- /dev/null
+++ b/src/core/qgsfields.cpp
@@ -0,0 +1,346 @@
+/***************************************************************************
+ qgsfields.cpp - QgsFields
+
+ ---------------------
+ begin : 22.9.2016
+ copyright : (C) 2016 by Matthias Kuhn
+ email : matthias@opengis.ch
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "qgsfields.h"
+#include "qgsfields_p.h"
+#include "qgsapplication.h"
+#include
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+QgsFields::QgsFields()
+{
+ d = new QgsFieldsPrivate();
+}
+
+QgsFields::QgsFields( const QgsFields& other )
+ : d( other.d )
+{
+}
+
+QgsFields& QgsFields::operator =( const QgsFields & other )
+{
+ d = other.d;
+ return *this;
+}
+
+QgsFields::~QgsFields()
+{
+
+}
+
+void QgsFields::clear()
+{
+ d->fields.clear();
+ d->nameToIndex.clear();
+}
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+bool QgsFields::append( const QgsField& field, FieldOrigin origin, int originIndex )
+{
+ if ( d->nameToIndex.contains( field.name() ) )
+ return false;
+
+ if ( originIndex == -1 && origin == OriginProvider )
+ originIndex = d->fields.count();
+ d->fields.append( Field( field, origin, originIndex ) );
+
+ d->nameToIndex.insert( field.name(), d->fields.count() - 1 );
+ return true;
+}
+
+bool QgsFields::appendExpressionField( const QgsField& field, int originIndex )
+{
+ if ( d->nameToIndex.contains( field.name() ) )
+ return false;
+
+ d->fields.append( Field( field, OriginExpression, originIndex ) );
+
+ d->nameToIndex.insert( field.name(), d->fields.count() - 1 );
+ return true;
+}
+
+void QgsFields::remove( int fieldIdx )
+{
+ if ( !exists( fieldIdx ) )
+ return;
+
+ d->fields.remove( fieldIdx );
+ d->nameToIndex.clear();
+ for ( int idx = 0; idx < count(); ++idx )
+ {
+ d->nameToIndex.insert( d->fields.at( idx ).field.name(), idx );
+ }
+}
+
+void QgsFields::extend( const QgsFields& other )
+{
+ for ( int i = 0; i < other.count(); ++i )
+ {
+ append( other.at( i ), other.fieldOrigin( i ), other.fieldOriginIndex( i ) );
+ }
+}
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+bool QgsFields::isEmpty() const
+{
+ return d->fields.isEmpty();
+}
+
+int QgsFields::count() const
+{
+ return d->fields.count();
+}
+
+int QgsFields::size() const
+{
+ return d->fields.count();
+}
+
+bool QgsFields::exists( int i ) const
+{
+ return i >= 0 && i < d->fields.count();
+}
+
+QgsField &QgsFields::operator[]( int i )
+{
+ return d->fields[i].field;
+}
+
+QgsField QgsFields::at( int i ) const
+{
+ return d->fields[i].field;
+}
+
+QgsField QgsFields::field( int fieldIdx ) const
+{
+ return d->fields[fieldIdx].field;
+}
+
+QgsField QgsFields::field( const QString &name ) const
+{
+ return d->fields[ indexFromName( name )].field;
+}
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+QgsField QgsFields::operator[]( int i ) const
+{
+ return d->fields[i].field;
+}
+
+QgsFields::FieldOrigin QgsFields::fieldOrigin( int fieldIdx ) const
+{
+ if ( !exists( fieldIdx ) )
+ return OriginUnknown;
+
+ return d->fields[fieldIdx].origin;
+}
+
+int QgsFields::fieldOriginIndex( int fieldIdx ) const
+{
+ return d->fields[fieldIdx].originIndex;
+}
+
+int QgsFields::indexFromName( const QString &fieldName ) const
+{
+ return d->nameToIndex.value( fieldName, -1 );
+}
+
+QList QgsFields::toList() const
+{
+ QList lst;
+ for ( int i = 0; i < d->fields.count(); ++i )
+ lst.append( d->fields[i].field );
+ return lst;
+}
+
+bool QgsFields::operator==( const QgsFields &other ) const
+{
+ return d->fields == other.d->fields;
+}
+
+QgsFields::const_iterator QgsFields::constBegin() const noexcept
+{
+ if ( d->fields.isEmpty() )
+ return const_iterator();
+
+ return const_iterator( &d->fields.first() );
+}
+
+QgsFields::const_iterator QgsFields::constEnd() const noexcept
+{
+ if ( d->fields.isEmpty() )
+ return const_iterator();
+
+ return const_iterator( &d->fields.last() + 1 );
+}
+
+QgsFields::const_iterator QgsFields::begin() const noexcept
+{
+ if ( d->fields.isEmpty() )
+ return const_iterator();
+
+ return const_iterator( &d->fields.first() );
+}
+
+QgsFields::const_iterator QgsFields::end() const noexcept
+{
+ if ( d->fields.isEmpty() )
+ return const_iterator();
+
+ return const_iterator( &d->fields.last() + 1 );
+}
+
+QgsFields::iterator QgsFields::begin()
+{
+ if ( d->fields.isEmpty() )
+ return iterator();
+
+ d.detach();
+ return iterator( &d->fields.first() );
+}
+
+QgsFields::iterator QgsFields::end()
+{
+ if ( d->fields.isEmpty() )
+ return iterator();
+
+ d.detach();
+ return iterator( &d->fields.last() + 1 );
+}
+
+QIcon QgsFields::iconForField( int fieldIdx ) const
+{
+ switch ( d->fields.at( fieldIdx ).field.type() )
+ {
+ case QVariant::Int:
+ case QVariant::UInt:
+ case QVariant::LongLong:
+ case QVariant::ULongLong:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldInteger.svg" );
+ }
+ case QVariant::Double:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldFloat.svg" );
+ }
+ case QVariant::String:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldText.svg" );
+ }
+ case QVariant::Date:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldDate.svg" );
+ }
+ case QVariant::DateTime:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldDateTime.svg" );
+ }
+ case QVariant::Time:
+ {
+ return QgsApplication::getThemeIcon( "/mIconFieldTime.svg" );
+ }
+ default:
+ return QIcon();
+ }
+}
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+int QgsFields::lookupField( const QString& fieldName ) const
+{
+ for ( int idx = 0; idx < count(); ++idx )
+ {
+ if ( d->fields[idx].field.name() == fieldName )
+ return idx;
+ }
+
+ for ( int idx = 0; idx < count(); ++idx )
+ {
+ if ( QString::compare( d->fields[idx].field.name(), fieldName, Qt::CaseInsensitive ) == 0 )
+ return idx;
+ }
+
+ for ( int idx = 0; idx < count(); ++idx )
+ {
+ QString alias = d->fields[idx].field.alias();
+ if ( !alias.isNull() && QString::compare( alias, fieldName, Qt::CaseInsensitive ) == 0 )
+ return idx;
+ }
+
+ return -1;
+}
+
+QgsAttributeList QgsFields::allAttributesList() const
+{
+ QgsAttributeList lst;
+ for ( int i = 0; i < d->fields.count(); ++i )
+ lst.append( i );
+ return lst;
+}
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+QDataStream& operator<<( QDataStream& out, const QgsFields& fields )
+{
+ out << static_cast< quint32 >( fields.size() );
+ for ( int i = 0; i < fields.size(); i++ )
+ {
+ out << fields.field( i );
+ }
+ return out;
+}
+
+QDataStream& operator>>( QDataStream& in, QgsFields& fields )
+{
+ fields.clear();
+ quint32 size;
+ in >> size;
+ for ( quint32 i = 0; i < size; i++ )
+ {
+ QgsField field;
+ in >> field;
+ fields.append( field );
+ }
+ return in;
+}
diff --git a/src/core/qgsfields.h b/src/core/qgsfields.h
new file mode 100644
index 00000000000..0f2dca15937
--- /dev/null
+++ b/src/core/qgsfields.h
@@ -0,0 +1,314 @@
+/***************************************************************************
+ qgsfields.h - QgsFields
+
+ ---------------------
+ begin : 22.9.2016
+ copyright : (C) 2016 by Matthias Kuhn
+ email : matthias@opengis.ch
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#ifndef QGSFIELDS_H
+#define QGSFIELDS_H
+
+#include "qgsfield.h"
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+/** \class QgsFields
+ * \ingroup core
+ * Container of fields for a vector layer.
+ *
+ * In addition to storing a list of QgsField instances, it also:
+ * - allows quick lookups of field names to index in the list
+ * - keeps track of where the field definition comes from (vector data provider, joined layer or newly added from an editing operation)
+ * \note QgsFields objects are implicitly shared.
+ */
+class CORE_EXPORT QgsFields
+{
+ public:
+
+ enum FieldOrigin
+ {
+ OriginUnknown, //!< it has not been specified where the field comes from
+ OriginProvider, //!< field comes from the underlying data provider of the vector layer (originIndex = index in provider's fields)
+ OriginJoin, //!< field comes from a joined layer (originIndex / 1000 = index of the join, originIndex % 1000 = index within the join)
+ OriginEdit, //!< field has been temporarily added in editing mode (originIndex = index in the list of added attributes)
+ OriginExpression //!< field is calculated from an expression
+ };
+
+ typedef struct Field
+ {
+ Field()
+ : origin( OriginUnknown )
+ , originIndex( -1 )
+ {}
+ Field( const QgsField& f, FieldOrigin o, int oi )
+ : field( f )
+ , origin( o )
+ , originIndex( oi )
+ {}
+
+ //! @note added in 2.6
+ bool operator==( const Field& other ) const { return field == other.field && origin == other.origin && originIndex == other.originIndex; }
+ //! @note added in 2.6
+ bool operator!=( const Field& other ) const { return !( *this == other ); }
+
+ QgsField field; //!< field
+ FieldOrigin origin; //!< origin of the field
+ int originIndex; //!< index specific to the origin
+ } Field;
+
+ /** Constructor for an empty field container
+ */
+ QgsFields();
+
+ /** Copy constructor
+ */
+ QgsFields( const QgsFields& other );
+
+ /** Assignment operator
+ */
+ QgsFields& operator =( const QgsFields& other );
+
+ virtual ~QgsFields();
+
+ //! Remove all fields
+ void clear();
+ //! Append a field. The field must have unique name, otherwise it is rejected (returns false)
+ bool append( const QgsField& field, FieldOrigin origin = OriginProvider, int originIndex = -1 );
+ //! Append an expression field. The field must have unique name, otherwise it is rejected (returns false)
+ bool appendExpressionField( const QgsField& field, int originIndex );
+ //! Remove a field with the given index
+ void remove( int fieldIdx );
+ //! Extend with fields from another QgsFields container
+ void extend( const QgsFields& other );
+
+ //! Check whether the container is empty
+ bool isEmpty() const;
+ //! Return number of items
+ int count() const;
+ //! Return number of items
+ int size() const;
+ //! Return if a field index is valid
+ //! @param i Index of the field which needs to be checked
+ //! @return True if the field exists
+ bool exists( int i ) const;
+
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField operator[]( int i ) const;
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField& operator[]( int i );
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField at( int i ) const;
+ //! Get field at particular index (must be in range 0..N-1)
+ QgsField field( int fieldIdx ) const;
+ //! Get field with matching name
+ QgsField field( const QString& name ) const;
+
+ //! Get field's origin (value from an enumeration)
+ FieldOrigin fieldOrigin( int fieldIdx ) const;
+ //! Get field's origin index (its meaning is specific to each type of origin)
+ int fieldOriginIndex( int fieldIdx ) const;
+
+ /**
+ * Look up field's index from the field name.
+ * This method takes is case sensitive and only matches the data source
+ * name of the field.
+ *
+ * @param fieldName The name of the field.
+ *
+ * @return The field index if found or -1 in case it cannot be found.
+ * @see lookupField For a more tolerant alternative.
+ */
+ int indexFromName( const QString& fieldName ) const;
+
+ /**
+ * Look up field's index from the field name.
+ * This method matches in the following order:
+ *
+ * 1. The exact field name taking case sensitivity into account
+ * 2. Looks for the field name by case insensitive comparison
+ * 3. The field alias (case insensitive)
+ *
+ * @param fieldName The name to look for.
+ *
+ * @return The field index if found or -1 in case it cannot be found.
+ * @see indexFromName For a more performant and precise but less tolerant alternative.
+ * @note added in 2.4
+ */
+ int lookupField( const QString& fieldName ) const;
+
+ //! Utility function to get list of attribute indexes
+ //! @note added in 2.4
+ QgsAttributeList allAttributesList() const;
+
+ //! Utility function to return a list of QgsField instances
+ QList toList() const;
+
+ //! @note added in 2.6
+ bool operator==( const QgsFields& other ) const;
+ //! @note added in 2.6
+ bool operator!=( const QgsFields& other ) const { return !( *this == other ); }
+ /** Returns an icon corresponding to a field index, based on the field's type and source
+ * @note added in QGIS 2.14
+ */
+ QIcon iconForField( int fieldIdx ) const;
+
+ //! Allows direct construction of QVariants from fields.
+ operator QVariant() const
+ {
+ return QVariant::fromValue( *this );
+ }
+
+ ///@cond PRIVATE
+
+ class const_iterator;
+
+ class iterator
+ {
+ public:
+ QgsFields::Field* d;
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef qptrdiff difference_type;
+
+ inline iterator()
+ : d( nullptr )
+ {}
+ inline iterator( QgsFields::Field *n )
+ : d( n )
+ {}
+
+ inline QgsField& operator*() const { return d->field; }
+ inline QgsField* operator->() const { return &d->field; }
+ inline QgsField& operator[]( difference_type j ) const { return d[j].field; }
+ inline bool operator==( const iterator &o ) const noexcept { return d == o.d; }
+ inline bool operator!=( const iterator &o ) const noexcept { return d != o.d; }
+ inline bool operator<( const iterator& other ) const noexcept { return d < other.d; }
+ inline bool operator<=( const iterator& other ) const noexcept { return d <= other.d; }
+ inline bool operator>( const iterator& other ) const noexcept { return d > other.d; }
+ inline bool operator>=( const iterator& other ) const noexcept { return d >= other.d; }
+
+ inline iterator& operator++() { ++d; return *this; }
+ inline iterator operator++( int ) { QgsFields::Field* n = d; ++d; return n; }
+ inline iterator& operator--() { d--; return *this; }
+ inline iterator operator--( int ) { QgsFields::Field* n = d; d--; return n; }
+ inline iterator& operator+=( difference_type j ) { d += j; return *this; }
+ inline iterator& operator-=( difference_type j ) { d -= j; return *this; }
+ inline iterator operator+( difference_type j ) const { return iterator( d + j ); }
+ inline iterator operator-( difference_type j ) const { return iterator( d -j ); }
+ inline int operator-( iterator j ) const { return int( d - j.d ); }
+ };
+ friend class iterator;
+
+ class const_iterator
+ {
+ public:
+ const QgsFields::Field* d;
+
+ typedef std::random_access_iterator_tag iterator_category;
+ typedef qptrdiff difference_type;
+
+ inline const_iterator()
+ : d( nullptr ) {}
+ inline const_iterator( const QgsFields::Field* f )
+ : d( f ) {}
+ inline const_iterator( const const_iterator &o )
+ : d( o.d ) {}
+ inline explicit const_iterator( const iterator &o )
+ : d( o.d ) {}
+ inline const QgsField& operator*() const { return d->field; }
+ inline const QgsField* operator->() const { return &d->field; }
+ inline const QgsField& operator[]( difference_type j ) const noexcept { return d[j].field; }
+ inline bool operator==( const const_iterator &o ) const noexcept { return d == o.d; }
+ inline bool operator!=( const const_iterator &o ) const noexcept { return d != o.d; }
+ inline bool operator<( const const_iterator& other ) const noexcept { return d < other.d; }
+ inline bool operator<=( const const_iterator& other ) const noexcept { return d <= other.d; }
+ inline bool operator>( const const_iterator& other ) const noexcept { return d > other.d; }
+ inline bool operator>=( const const_iterator& other ) const noexcept { return d >= other.d; }
+ inline const_iterator& operator++() { ++d; return *this; }
+ inline const_iterator operator++( int ) { const QgsFields::Field* n = d; ++d; return n; }
+ inline const_iterator& operator--() { d--; return *this; }
+ inline const_iterator operator--( int ) { const QgsFields::Field* n = d; --d; return n; }
+ inline const_iterator& operator+=( difference_type j ) { d += j; return *this; }
+ inline const_iterator& operator-=( difference_type j ) { d -= j; return *this; }
+ inline const_iterator operator+( difference_type j ) const { return const_iterator( d + j ); }
+ inline const_iterator operator-( difference_type j ) const { return const_iterator( d -j ); }
+ inline int operator-( const_iterator j ) const { return int( d - j.d ); }
+ };
+ friend class const_iterator;
+ ///@endcond
+
+
+ /**
+ * Returns a const STL-style iterator pointing to the first item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ const_iterator constBegin() const noexcept;
+
+ /**
+ * Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ const_iterator constEnd() const noexcept;
+
+ /**
+ * Returns a const STL-style iterator pointing to the first item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ const_iterator begin() const noexcept;
+
+ /**
+ * Returns a const STL-style iterator pointing to the imaginary item after the last item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ const_iterator end() const noexcept;
+
+ /**
+ * Returns an STL-style iterator pointing to the first item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ iterator begin();
+
+
+ /**
+ * Returns an STL-style iterator pointing to the imaginary item after the last item in the list.
+ *
+ * @note added in 2.16
+ * @note not available in Python bindings
+ */
+ iterator end();
+
+ private:
+
+ QSharedDataPointer d;
+
+};
+
+Q_DECLARE_METATYPE( QgsFields )
+
+/** Writes the fields to stream out. QGIS version compatibility is not guaranteed. */
+CORE_EXPORT QDataStream& operator<<( QDataStream& out, const QgsFields& fields );
+/** Reads fields from stream in into fields. QGIS version compatibility is not guaranteed. */
+CORE_EXPORT QDataStream& operator>>( QDataStream& in, QgsFields& fields );
+
+#endif // QGSFIELDS_H
diff --git a/src/core/qgsfields_p.h b/src/core/qgsfields_p.h
new file mode 100644
index 00000000000..a383cfe6a87
--- /dev/null
+++ b/src/core/qgsfields_p.h
@@ -0,0 +1,67 @@
+/***************************************************************************
+ qgsfields_p - %{Cpp:License:ClassName}
+
+ ---------------------
+ begin : 22.9.2016
+ copyright : (C) 2016 by Matthias Kuhn
+ email : matthias@opengis.ch
+ ***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+#ifndef QGSFIELDS_P_H
+#define QGSFIELDS_P_H
+
+
+/// @cond PRIVATE
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the QGIS API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+
+#include
+#include "qgsfields.h"
+
+/***************************************************************************
+ * This class is considered CRITICAL and any change MUST be accompanied with
+ * full unit tests in testqgsfields.cpp.
+ * See details in QEP #17
+ ****************************************************************************/
+
+class CORE_EXPORT QgsFieldsPrivate : public QSharedData
+{
+ public:
+
+ QgsFieldsPrivate()
+ {
+ }
+
+ QgsFieldsPrivate( const QgsFieldsPrivate& other )
+ : QSharedData( other )
+ , fields( other.fields )
+ , nameToIndex( other.nameToIndex )
+ {
+ }
+
+ ~QgsFieldsPrivate() {}
+
+ //! internal storage of the container
+ QVector fields;
+
+ //! map for quick resolution of name to index
+ QHash nameToIndex;
+
+};
+
+/// @endcond
+
+#endif // QGSFIELDS_P_H
diff --git a/src/core/qgsgml.h b/src/core/qgsgml.h
index c4dc3214e6c..5abde772dc5 100644
--- a/src/core/qgsgml.h
+++ b/src/core/qgsgml.h
@@ -17,7 +17,7 @@
#include
#include "qgis.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsrectangle.h"
#include "qgswkbptr.h"
#include "qgsfeature.h"
diff --git a/src/core/qgsgmlschema.h b/src/core/qgsgmlschema.h
index be3457b0700..345761f3af0 100644
--- a/src/core/qgsgmlschema.h
+++ b/src/core/qgsgmlschema.h
@@ -18,7 +18,7 @@
#include
#include "qgis.h"
#include "qgserror.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
#include
diff --git a/src/core/qgsjsonutils.h b/src/core/qgsjsonutils.h
index 576fef87bd2..6074bcd3de0 100644
--- a/src/core/qgsjsonutils.h
+++ b/src/core/qgsjsonutils.h
@@ -19,7 +19,7 @@
#include "qgsfeature.h"
#include "qgscoordinatereferencesystem.h"
#include "qgscoordinatetransform.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QTextCodec;
class QgsVectorLayer;
diff --git a/src/core/qgsogrutils.cpp b/src/core/qgsogrutils.cpp
index c39cd01fe4c..a1833aa1741 100644
--- a/src/core/qgsogrutils.cpp
+++ b/src/core/qgsogrutils.cpp
@@ -17,7 +17,7 @@
#include "qgsapplication.h"
#include "qgslogger.h"
#include "qgsgeometry.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
diff --git a/src/core/qgspallabeling.h b/src/core/qgspallabeling.h
index fa25930c4d2..7e934e8c363 100644
--- a/src/core/qgspallabeling.h
+++ b/src/core/qgspallabeling.h
@@ -31,7 +31,7 @@
#include
#include "qgsfeature.h"
#include "qgsgeometry.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgspoint.h"
#include "qgsmapunitscale.h"
#include "qgsstringutils.h"
diff --git a/src/core/qgsrelation.cpp b/src/core/qgsrelation.cpp
index 49150eaf69d..bdc3997d628 100644
--- a/src/core/qgsrelation.cpp
+++ b/src/core/qgsrelation.cpp
@@ -279,7 +279,7 @@ QgsAttributeList QgsRelation::referencedFields() const
Q_FOREACH ( const FieldPair& pair, mFieldPairs )
{
- attrs << mReferencedLayer->fieldNameIndex( pair.second );
+ attrs << mReferencedLayer->fields().lookupField( pair.second );
}
return attrs;
}
@@ -290,7 +290,7 @@ QgsAttributeList QgsRelation::referencingFields() const
Q_FOREACH ( const FieldPair& pair, mFieldPairs )
{
- attrs << mReferencingLayer->fieldNameIndex( pair.first );
+ attrs << mReferencingLayer->fields().lookupField( pair.first );
}
return attrs;
@@ -337,13 +337,13 @@ void QgsRelation::updateRelationStatus()
Q_FOREACH ( const FieldPair& fieldPair, mFieldPairs )
{
- if ( -1 == mReferencingLayer->fieldNameIndex( fieldPair.first ) )
+ if ( -1 == mReferencingLayer->fields().lookupField( fieldPair.first ) )
{
QgsDebugMsg( QString( "Invalid relation: field %1 does not exist in referencing layer %2" ).arg( fieldPair.first, mReferencingLayer->name() ) );
mValid = false;
break;
}
- else if ( -1 == mReferencedLayer->fieldNameIndex( fieldPair.second ) )
+ else if ( -1 == mReferencedLayer->fields().lookupField( fieldPair.second ) )
{
QgsDebugMsg( QString( "Invalid relation: field %1 does not exist in referencedg layer %2" ).arg( fieldPair.second, mReferencedLayer->name() ) );
mValid = false;
diff --git a/src/core/qgsrelation.h b/src/core/qgsrelation.h
index 94223e0adb9..26fe3d56029 100644
--- a/src/core/qgsrelation.h
+++ b/src/core/qgsrelation.h
@@ -20,7 +20,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsVectorLayer;
class QgsFeatureIterator;
diff --git a/src/core/qgsrelationmanager.cpp b/src/core/qgsrelationmanager.cpp
index bfd95abdd77..e077178c362 100644
--- a/src/core/qgsrelationmanager.cpp
+++ b/src/core/qgsrelationmanager.cpp
@@ -111,7 +111,7 @@ QList QgsRelationManager::referencingRelations( const QgsVectorLaye
bool containsField = false;
Q_FOREACH ( const QgsRelation::FieldPair& fp, rel.fieldPairs() )
{
- if ( fieldIdx == layer->fieldNameIndex( fp.referencingField() ) )
+ if ( fieldIdx == layer->fields().lookupField( fp.referencingField() ) )
{
containsField = true;
break;
diff --git a/src/core/qgssqlexpressioncompiler.h b/src/core/qgssqlexpressioncompiler.h
index 1974217960b..5b9bf5f62d1 100644
--- a/src/core/qgssqlexpressioncompiler.h
+++ b/src/core/qgssqlexpressioncompiler.h
@@ -17,7 +17,7 @@
#define QGSSQLEXPRESSIONCOMPILER_H
#include "qgsexpression.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
/** \ingroup core
* \class QgsSqlExpressionCompiler
diff --git a/src/core/qgsvectordataprovider.cpp b/src/core/qgsvectordataprovider.cpp
index 38d1ddb31fd..5a0f73229a9 100644
--- a/src/core/qgsvectordataprovider.cpp
+++ b/src/core/qgsvectordataprovider.cpp
@@ -26,7 +26,7 @@
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgsfeaturerequest.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgsgeometrycollection.h"
#include "qgsgeometryfactory.h"
@@ -259,7 +259,7 @@ QString QgsVectorDataProvider::capabilitiesString() const
int QgsVectorDataProvider::fieldNameIndex( const QString& fieldName ) const
{
- return fields().fieldNameIndex( fieldName );
+ return fields().lookupField( fieldName );
}
QMap QgsVectorDataProvider::fieldNameMap() const
diff --git a/src/core/qgsvectorfilewriter.cpp b/src/core/qgsvectorfilewriter.cpp
index c89b425f8f3..482fcd65856 100644
--- a/src/core/qgsvectorfilewriter.cpp
+++ b/src/core/qgsvectorfilewriter.cpp
@@ -17,7 +17,7 @@
***************************************************************************/
#include "qgsapplication.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgsgeometry.h"
@@ -2866,10 +2866,10 @@ void QgsVectorFileWriter::addRendererAttributes( QgsVectorLayer* vl, QgsAttribut
QList rendererAttributes = renderer->usedAttributes();
for ( int i = 0; i < rendererAttributes.size(); ++i )
{
- int index = vl->fieldNameIndex( rendererAttributes.at( i ) );
+ int index = vl->fields().lookupField( rendererAttributes.at( i ) );
if ( index != -1 )
{
- attList.push_back( vl->fieldNameIndex( rendererAttributes.at( i ) ) );
+ attList.push_back( vl->fields().lookupField( rendererAttributes.at( i ) ) );
}
}
}
diff --git a/src/core/qgsvectorfilewriter.h b/src/core/qgsvectorfilewriter.h
index 4541961e2e0..68664ef03cc 100644
--- a/src/core/qgsvectorfilewriter.h
+++ b/src/core/qgsvectorfilewriter.h
@@ -19,7 +19,7 @@
#ifndef QGSVECTORFILEWRITER_H
#define QGSVECTORFILEWRITER_H
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgssymbol.h"
#include
diff --git a/src/core/qgsvectorlayer.cpp b/src/core/qgsvectorlayer.cpp
index e811bb7def1..52f27c3aa5e 100644
--- a/src/core/qgsvectorlayer.cpp
+++ b/src/core/qgsvectorlayer.cpp
@@ -47,7 +47,7 @@
#include "qgsexpressionfieldbuffer.h"
#include "qgsfeature.h"
#include "qgsfeaturerequest.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometrycache.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
@@ -726,7 +726,7 @@ bool QgsVectorLayer::countSymbolFeatures( bool showProgress )
QgsFeatureRequest request;
if ( !mRenderer->filterNeedsGeometry() )
request.setFlags( QgsFeatureRequest::NoGeometry );
- request.setSubsetOfAttributes( mRenderer->usedAttributes(), mUpdatedFields );
+ request.setSubsetOfAttributes( mRenderer->usedAttributes(), mFields );
QgsFeatureIterator fit = getFeatures( request );
QgsVectorLayerInterruptionCheckerDuringCountSymbolFeatures interruptionCheck( &progressDialog );
if ( showProgress )
@@ -1646,7 +1646,7 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
//default expressions
QDomElement defaultsElem = document.createElement( "defaults" );
- Q_FOREACH ( const QgsField& field, mUpdatedFields )
+ Q_FOREACH ( const QgsField& field, mFields )
{
QDomElement defaultElem = document.createElement( "default" );
defaultElem.setAttribute( "field", field.name() );
@@ -1694,7 +1694,7 @@ bool QgsVectorLayer::readSymbology( const QDomNode& node, QString& errorMessage
QString displayField = node.namedItem( "displayfield" ).toElement().text();
// Try to migrate pre QGIS 3.0 display field property
- if ( mUpdatedFields.fieldNameIndex( displayField ) < 0 )
+ if ( mFields.lookupField( displayField ) < 0 )
{
// if it's not a field, it's a maptip
if ( mMapTipTemplate.isEmpty() )
@@ -1904,11 +1904,11 @@ bool QgsVectorLayer::writeSymbology( QDomNode& node, QDomDocument& doc, QString&
//attribute aliases
QDomElement aliasElem = doc.createElement( "aliases" );
- Q_FOREACH ( const QgsField& field, mUpdatedFields )
+ Q_FOREACH ( const QgsField& field, mFields )
{
QDomElement aliasEntryElem = doc.createElement( "alias" );
aliasEntryElem.setAttribute( "field", field.name() );
- aliasEntryElem.setAttribute( "index", mUpdatedFields.indexFromName( field.name() ) );
+ aliasEntryElem.setAttribute( "index", mFields.indexFromName( field.name() ) );
aliasEntryElem.setAttribute( "name", field.alias() );
aliasElem.appendChild( aliasEntryElem );
}
@@ -2113,12 +2113,12 @@ void QgsVectorLayer::remAttributeAlias( int attIndex )
return;
QString name = fields().at( attIndex ).name();
- mUpdatedFields.at( attIndex ).setAlias( QString() );
+ mFields.at( attIndex ).setAlias( QString() );
if ( mAttributeAliasMap.contains( name ) )
{
mAttributeAliasMap.remove( name );
updateFields();
- mEditFormConfig.setFields( mUpdatedFields );
+ mEditFormConfig.setFields( mFields );
emit layerModified();
}
}
@@ -2139,8 +2139,8 @@ void QgsVectorLayer::addAttributeAlias( int attIndex, const QString& aliasString
QString name = fields().at( attIndex ).name();
mAttributeAliasMap.insert( name, aliasString );
- mUpdatedFields[ attIndex ].setAlias( aliasString );
- mEditFormConfig.setFields( mUpdatedFields );
+ mFields[ attIndex ].setAlias( aliasString );
+ mEditFormConfig.setFields( mFields );
emit layerModified(); // TODO[MD]: should have a different signal?
}
@@ -2154,8 +2154,8 @@ QString QgsVectorLayer::attributeAlias( int attributeIndex ) const
QString QgsVectorLayer::attributeDisplayName( int attributeIndex ) const
{
- if ( attributeIndex >= 0 && attributeIndex < mUpdatedFields.count() )
- return mUpdatedFields.at( attributeIndex ).displayName();
+ if ( attributeIndex >= 0 && attributeIndex < mFields.count() )
+ return mFields.at( attributeIndex ).displayName();
else
return QString();
}
@@ -2176,7 +2176,7 @@ bool QgsVectorLayer::deleteAttribute( int index )
if ( index < 0 || index >= fields().count() )
return false;
- if ( mUpdatedFields.fieldOrigin( index ) == QgsFields::OriginExpression )
+ if ( mFields.fieldOrigin( index ) == QgsFields::OriginExpression )
{
removeExpressionField( index );
return true;
@@ -2247,10 +2247,10 @@ QgsAttributeList QgsVectorLayer::pkAttributeList() const
QgsAttributeList pkAttributesList;
QgsAttributeList providerIndexes = mDataProvider->pkAttributeIndexes();
- for ( int i = 0; i < mUpdatedFields.count(); ++i )
+ for ( int i = 0; i < mFields.count(); ++i )
{
- if ( mUpdatedFields.fieldOrigin( i ) == QgsFields::OriginProvider &&
- providerIndexes.contains( mUpdatedFields.fieldOriginIndex( i ) ) )
+ if ( mFields.fieldOrigin( i ) == QgsFields::OriginProvider &&
+ providerIndexes.contains( mFields.fieldOriginIndex( i ) ) )
pkAttributesList << i;
}
@@ -2627,7 +2627,7 @@ void QgsVectorLayer::setDisplayExpression( const QString& displayExpression )
QString QgsVectorLayer::displayExpression() const
{
- if ( !mDisplayExpression.isEmpty() || mUpdatedFields.isEmpty() )
+ if ( !mDisplayExpression.isEmpty() || mFields.isEmpty() )
{
return mDisplayExpression;
}
@@ -2635,7 +2635,7 @@ QString QgsVectorLayer::displayExpression() const
{
QString idxName;
- Q_FOREACH ( const QgsField& field, mUpdatedFields )
+ Q_FOREACH ( const QgsField& field, mFields )
{
QString fldName = field.name();
@@ -2666,7 +2666,7 @@ QString QgsVectorLayer::displayExpression() const
}
else
{
- return QgsExpression::quotedColumnRef( mUpdatedFields.at( 0 ).name() );
+ return QgsExpression::quotedColumnRef( mFields.at( 0 ).name() );
}
}
}
@@ -2774,11 +2774,6 @@ void QgsVectorLayer::destroyEditCommand()
}
}
-int QgsVectorLayer::fieldNameIndex( const QString& fieldName ) const
-{
- return fields().fieldNameIndex( fieldName );
-}
-
bool QgsVectorLayer::addJoin( const QgsVectorJoinInfo& joinInfo )
{
return mJoinBuffer && mJoinBuffer->addJoin( joinInfo );
@@ -2812,7 +2807,7 @@ int QgsVectorLayer::addExpressionField( const QString& exp, const QgsField& fld
emit beforeAddingExpressionField( fld.name() );
mExpressionFieldBuffer->addExpression( exp, fld );
updateFields();
- int idx = mUpdatedFields.indexFromName( fld.name() );
+ int idx = mFields.indexFromName( fld.name() );
emit attributeAdded( idx );
return idx;
}
@@ -2820,7 +2815,7 @@ int QgsVectorLayer::addExpressionField( const QString& exp, const QgsField& fld
void QgsVectorLayer::removeExpressionField( int index )
{
emit beforeRemovingExpressionField( index );
- int oi = mUpdatedFields.fieldOriginIndex( index );
+ int oi = mFields.fieldOriginIndex( index );
mExpressionFieldBuffer->removeExpression( oi );
updateFields();
emit attributeDeleted( index );
@@ -2828,7 +2823,7 @@ void QgsVectorLayer::removeExpressionField( int index )
QString QgsVectorLayer::expressionField( int index ) const
{
- int oi = mUpdatedFields.fieldOriginIndex( index );
+ int oi = mFields.fieldOriginIndex( index );
if ( oi < 0 || oi >= mExpressionFieldBuffer->expressions().size() )
return QString();
@@ -2837,7 +2832,7 @@ QString QgsVectorLayer::expressionField( int index ) const
void QgsVectorLayer::updateExpressionField( int index, const QString& exp )
{
- int oi = mUpdatedFields.fieldOriginIndex( index );
+ int oi = mFields.fieldOriginIndex( index );
mExpressionFieldBuffer->updateExpression( oi, exp );
}
@@ -2846,44 +2841,44 @@ void QgsVectorLayer::updateFields()
if ( !mDataProvider )
return;
- QgsFields oldFields = mUpdatedFields;
+ QgsFields oldFields = mFields;
- mUpdatedFields = mDataProvider->fields();
+ mFields = mDataProvider->fields();
// added / removed fields
if ( mEditBuffer )
- mEditBuffer->updateFields( mUpdatedFields );
+ mEditBuffer->updateFields( mFields );
// joined fields
if ( mJoinBuffer && mJoinBuffer->containsJoins() )
- mJoinBuffer->updateFields( mUpdatedFields );
+ mJoinBuffer->updateFields( mFields );
if ( mExpressionFieldBuffer )
- mExpressionFieldBuffer->updateFields( mUpdatedFields );
+ mExpressionFieldBuffer->updateFields( mFields );
// set aliases and default values
QMap< QString, QString >::const_iterator aliasIt = mAttributeAliasMap.constBegin();
for ( ; aliasIt != mAttributeAliasMap.constEnd(); ++aliasIt )
{
- int index = mUpdatedFields.fieldNameIndex( aliasIt.key() );
+ int index = mFields.lookupField( aliasIt.key() );
if ( index < 0 )
continue;
- mUpdatedFields[ index ].setAlias( aliasIt.value() );
+ mFields[ index ].setAlias( aliasIt.value() );
}
QMap< QString, QString >::const_iterator defaultIt = mDefaultExpressionMap.constBegin();
for ( ; defaultIt != mDefaultExpressionMap.constEnd(); ++defaultIt )
{
- int index = mUpdatedFields.fieldNameIndex( defaultIt.key() );
+ int index = mFields.lookupField( defaultIt.key() );
if ( index < 0 )
continue;
- mUpdatedFields[ index ].setDefaultValueExpression( defaultIt.value() );
+ mFields[ index ].setDefaultValueExpression( defaultIt.value() );
}
- if ( oldFields != mUpdatedFields )
+ if ( oldFields != mFields )
{
emit updatedFields();
- mEditFormConfig.setFields( mUpdatedFields );
+ mEditFormConfig.setFields( mFields );
}
}
@@ -2898,10 +2893,10 @@ void QgsVectorLayer::createJoinCaches() const
QVariant QgsVectorLayer::defaultValue( int index, const QgsFeature& feature, QgsExpressionContext* context ) const
{
- if ( index < 0 || index >= mUpdatedFields.count() )
+ if ( index < 0 || index >= mFields.count() )
return QVariant();
- QString expression = mUpdatedFields.at( index ).defaultValueExpression();
+ QString expression = mFields.at( index ).defaultValueExpression();
if ( expression.isEmpty() )
return mDataProvider->defaultValue( index );
@@ -2947,26 +2942,26 @@ QVariant QgsVectorLayer::defaultValue( int index, const QgsFeature& feature, Qgs
void QgsVectorLayer::setDefaultValueExpression( int index, const QString& expression )
{
- if ( index < 0 || index >= mUpdatedFields.count() )
+ if ( index < 0 || index >= mFields.count() )
return;
if ( expression.isEmpty() )
{
- mDefaultExpressionMap.remove( mUpdatedFields.at( index ).name() );
+ mDefaultExpressionMap.remove( mFields.at( index ).name() );
}
else
{
- mDefaultExpressionMap.insert( mUpdatedFields.at( index ).name(), expression );
+ mDefaultExpressionMap.insert( mFields.at( index ).name(), expression );
}
updateFields();
}
QString QgsVectorLayer::defaultValueExpression( int index ) const
{
- if ( index < 0 || index >= mUpdatedFields.count() )
+ if ( index < 0 || index >= mFields.count() )
return QString();
else
- return mUpdatedFields.at( index ).defaultValueExpression();
+ return mFields.at( index ).defaultValueExpression();
}
void QgsVectorLayer::uniqueValues( int index, QList &uniqueValues, int limit ) const
@@ -2977,7 +2972,7 @@ void QgsVectorLayer::uniqueValues( int index, QList &uniqueValues, int
return;
}
- QgsFields::FieldOrigin origin = mUpdatedFields.fieldOrigin( index );
+ QgsFields::FieldOrigin origin = mFields.fieldOrigin( index );
switch ( origin )
{
case QgsFields::OriginUnknown:
@@ -3082,7 +3077,7 @@ QVariant QgsVectorLayer::minimumValue( int index ) const
return QVariant();
}
- QgsFields::FieldOrigin origin = mUpdatedFields.fieldOrigin( index );
+ QgsFields::FieldOrigin origin = mFields.fieldOrigin( index );
switch ( origin )
{
@@ -3170,7 +3165,7 @@ QVariant QgsVectorLayer::maximumValue( int index ) const
return QVariant();
}
- QgsFields::FieldOrigin origin = mUpdatedFields.fieldOrigin( index );
+ QgsFields::FieldOrigin origin = mFields.fieldOrigin( index );
switch ( origin )
{
case QgsFields::OriginUnknown:
@@ -3260,12 +3255,12 @@ QVariant QgsVectorLayer::aggregate( QgsAggregateCalculator::Aggregate aggregate,
}
// test if we are calculating based on a field
- int attrIndex = mUpdatedFields.fieldNameIndex( fieldOrExpression );
+ int attrIndex = mFields.lookupField( fieldOrExpression );
if ( attrIndex >= 0 )
{
// aggregate is based on a field - if it's a provider field, we could possibly hand over the calculation
// to the provider itself
- QgsFields::FieldOrigin origin = mUpdatedFields.fieldOrigin( attrIndex );
+ QgsFields::FieldOrigin origin = mFields.fieldOrigin( attrIndex );
if ( origin == QgsFields::OriginProvider )
{
bool providerOk = false;
@@ -3293,7 +3288,7 @@ QList QgsVectorLayer::getValues( const QString &fieldOrExpression, boo
QScopedPointer expression;
QgsExpressionContext context;
- int attrNum = fieldNameIndex( fieldOrExpression );
+ int attrNum = mFields.lookupField( fieldOrExpression );
if ( attrNum == -1 )
{
@@ -3486,7 +3481,7 @@ void QgsVectorLayer::readSldLabeling( const QDomNode& node )
setCustomProperty( "labeling/fieldName", labelAttribute );
setCustomProperty( "labeling/isExpression", false );
- int fieldIndex = fieldNameIndex( labelAttribute );
+ int fieldIndex = mFields.lookupField( labelAttribute );
if ( fieldIndex == -1 )
{
// label attribute is not in columns, check if it is an expression
diff --git a/src/core/qgsvectorlayer.h b/src/core/qgsvectorlayer.h
index 2fbe929247e..b68fbf69c45 100644
--- a/src/core/qgsvectorlayer.h
+++ b/src/core/qgsvectorlayer.h
@@ -31,7 +31,7 @@
#include "qgsfeature.h"
#include "qgsfeaturerequest.h"
#include "qgseditorwidgetconfig.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgssnapper.h"
#include "qgsvectorsimplifymethod.h"
#include "qgseditformconfig.h"
@@ -1128,7 +1128,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
*
* @return A list of fields
*/
- inline QgsFields fields() const { return mUpdatedFields; }
+ inline QgsFields fields() const { return mFields; }
/**
* Returns the list of fields of this layer.
@@ -1137,19 +1137,19 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
*
* @return A list of fields
*/
- inline QgsFields pendingFields() const { return mUpdatedFields; }
+ inline QgsFields pendingFields() const { return mFields; }
/**
* Returns list of attribute indexes. i.e. a list from 0 ... fieldCount()
* Alias for {@link attributeList()}
*/
- inline QgsAttributeList pendingAllAttributesList() const { return mUpdatedFields.allAttributesList(); }
+ inline QgsAttributeList pendingAllAttributesList() const { return mFields.allAttributesList(); }
/**
* Returns list of attribute indexes. i.e. a list from 0 ... fieldCount()
* Alias for {@link attributeList()}
*/
- inline QgsAttributeList attributeList() const { return mUpdatedFields.allAttributesList(); }
+ inline QgsAttributeList attributeList() const { return mFields.allAttributesList(); }
/**
* Returns list of attributes making up the primary key
@@ -1331,9 +1331,6 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
/** Destroy active command and reverts all changes in it */
void destroyEditCommand();
- /** Returns the index of a field name or -1 if the field does not exist */
- int fieldNameIndex( const QString& fieldName ) const;
-
/** Editing vertex markers */
enum VertexMarkerType
{
@@ -1917,7 +1914,7 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
QgsFeatureIds mSelectedFeatureIds;
/** Field map to commit */
- QgsFields mUpdatedFields;
+ QgsFields mFields;
/** Map that stores the aliases for attributes. Key is the attribute name and value the alias for that attribute*/
QgsStringMap mAttributeAliasMap;
diff --git a/src/core/qgsvectorlayereditbuffer.cpp b/src/core/qgsvectorlayereditbuffer.cpp
index f768ca66e1b..387de922bcc 100644
--- a/src/core/qgsvectorlayereditbuffer.cpp
+++ b/src/core/qgsvectorlayereditbuffer.cpp
@@ -120,7 +120,7 @@ bool QgsVectorLayerEditBuffer::addFeature( QgsFeature& f )
{
return false;
}
- if ( L->mUpdatedFields.count() != f.attributes().count() )
+ if ( L->mFields.count() != f.attributes().count() )
return false;
// TODO: check correct geometry type
diff --git a/src/core/qgsvectorlayereditbuffer.h b/src/core/qgsvectorlayereditbuffer.h
index a7392025383..4c91678278c 100644
--- a/src/core/qgsvectorlayereditbuffer.h
+++ b/src/core/qgsvectorlayereditbuffer.h
@@ -19,7 +19,7 @@
#include
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
class QgsVectorLayer;
diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp
index ba939d29ca4..12cafd69d64 100644
--- a/src/core/qgsvectorlayerfeatureiterator.cpp
+++ b/src/core/qgsvectorlayerfeatureiterator.cpp
@@ -105,12 +105,9 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes )
{
//ensure that all fields required for filter expressions are prepared
- Q_FOREACH ( const QString& field, mRequest.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !mRequest.subsetOfAttributes().contains( attrIdx ) )
- mRequest.setSubsetOfAttributes( mRequest.subsetOfAttributes() << attrIdx );
- }
+ QSet attributeIndexes = mRequest.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += mRequest.subsetOfAttributes().toSet();
+ mRequest.setSubsetOfAttributes( attributeIndexes.toList() );
}
}
@@ -129,7 +126,8 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
int nPendingFields = mSource->mFields.count();
Q_FOREACH ( int attrIndex, subset )
{
- if ( attrIndex < 0 || attrIndex >= nPendingFields ) continue;
+ if ( attrIndex < 0 || attrIndex >= nPendingFields )
+ continue;
if ( mSource->mFields.fieldOrigin( attrIndex ) == QgsFields::OriginProvider )
providerSubset << mSource->mFields.fieldOriginIndex( attrIndex );
}
@@ -143,7 +141,7 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
{
Q_FOREACH ( const QString& attr, mProviderRequest.orderBy().usedAttributes() )
{
- providerSubset << mSource->mFields.fieldNameIndex( attr );
+ providerSubset << mSource->mFields.lookupField( attr );
}
}
@@ -154,7 +152,7 @@ QgsVectorLayerFeatureIterator::QgsVectorLayerFeatureIterator( QgsVectorLayerFeat
{
Q_FOREACH ( const QString& field, mProviderRequest.filterExpression()->referencedColumns() )
{
- int idx = source->mFields.fieldNameIndex( field );
+ int idx = source->mFields.lookupField( field );
// If there are fields in the expression which are not of origin provider, the provider will not be able to filter based on them.
// In this case we disable the expression filter.
@@ -538,7 +536,7 @@ void QgsVectorLayerFeatureIterator::prepareExpression( int fieldIdx )
Q_FOREACH ( const QString& col, exp->referencedColumns() )
{
- int dependantFieldIdx = mSource->mFields.fieldNameIndex( col );
+ int dependantFieldIdx = mSource->mFields.lookupField( col );
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes )
{
mRequest.setSubsetOfAttributes( mRequest.subsetOfAttributes() << dependantFieldIdx );
diff --git a/src/core/qgsvectorlayerfeatureiterator.h b/src/core/qgsvectorlayerfeatureiterator.h
index 26a32f474aa..8f7666693ff 100644
--- a/src/core/qgsvectorlayerfeatureiterator.h
+++ b/src/core/qgsvectorlayerfeatureiterator.h
@@ -16,7 +16,7 @@
#define QGSVECTORLAYERFEATUREITERATOR_H
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
diff --git a/src/core/qgsvectorlayerimport.cpp b/src/core/qgsvectorlayerimport.cpp
index f66733b655b..0f6f0376a5d 100644
--- a/src/core/qgsvectorlayerimport.cpp
+++ b/src/core/qgsvectorlayerimport.cpp
@@ -16,7 +16,7 @@
* *
***************************************************************************/
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgsgeometry.h"
diff --git a/src/core/qgsvectorlayerjoinbuffer.cpp b/src/core/qgsvectorlayerjoinbuffer.cpp
index 0d9c2f81b06..b3d4c099744 100644
--- a/src/core/qgsvectorlayerjoinbuffer.cpp
+++ b/src/core/qgsvectorlayerjoinbuffer.cpp
@@ -192,7 +192,7 @@ QVector QgsVectorLayerJoinBuffer::joinSubsetIndices( QgsVectorLayer* joinLa
for ( int i = 0; i < joinFieldsSubset.count(); ++i )
{
QString joinedFieldName = joinFieldsSubset.at( i );
- int index = fields.fieldNameIndex( joinedFieldName );
+ int index = fields.lookupField( joinedFieldName );
if ( index != -1 )
{
subsetIndices.append( index );
diff --git a/src/core/qgsvectorlayerlabelprovider.cpp b/src/core/qgsvectorlayerlabelprovider.cpp
index e74dc474f3b..3dedaab2520 100644
--- a/src/core/qgsvectorlayerlabelprovider.cpp
+++ b/src/core/qgsvectorlayerlabelprovider.cpp
@@ -154,7 +154,7 @@ bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext& context, QStr
else
{
// If we aren't an expression, we check to see if we can find the column.
- if ( mFields.fieldNameIndex( lyr.fieldName ) == -1 )
+ if ( mFields.lookupField( lyr.fieldName ) == -1 )
{
return false;
}
@@ -218,7 +218,7 @@ bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext& context, QStr
lyr.rasterCompressFactor = context.rasterScaleFactor();
// save the pal layer to our layer context (with some additional info)
- lyr.fieldIndex = mFields.fieldNameIndex( lyr.fieldName );
+ lyr.fieldIndex = mFields.lookupField( lyr.fieldName );
lyr.xform = &mapSettings.mapToPixel();
lyr.ct = QgsCoordinateTransform();
diff --git a/src/core/qgsvectorlayerrenderer.h b/src/core/qgsvectorlayerrenderer.h
index 412b2dce357..70774e2090c 100644
--- a/src/core/qgsvectorlayerrenderer.h
+++ b/src/core/qgsvectorlayerrenderer.h
@@ -34,7 +34,7 @@ class QgsSingleSymbolRenderer;
typedef QList QgsAttributeList;
#include "qgis.h"
-#include "qgsfield.h" // QgsFields
+#include "qgsfields.h" // QgsFields
#include "qgsfeature.h" // QgsFeatureIds
#include "qgsfeatureiterator.h"
#include "qgsvectorsimplifymethod.h"
diff --git a/src/core/qgsvectorlayerundocommand.h b/src/core/qgsvectorlayerundocommand.h
index e3e0ecbd1eb..c4daee3f17e 100644
--- a/src/core/qgsvectorlayerundocommand.h
+++ b/src/core/qgsvectorlayerundocommand.h
@@ -22,7 +22,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
class QgsGeometry;
diff --git a/src/core/qgsvirtuallayerdefinition.h b/src/core/qgsvirtuallayerdefinition.h
index eec5191211a..af04f5f05df 100644
--- a/src/core/qgsvirtuallayerdefinition.h
+++ b/src/core/qgsvirtuallayerdefinition.h
@@ -17,8 +17,8 @@ email : hugo dot mercier at oslandia dot com
#ifndef QGSVIRTUALLAYERDEFINITION_H
#define QGSVIRTUALLAYERDEFINITION_H
-#include
-#include
+#include "qgsfields.h"
+#include "qgis.h"
/** \ingroup core
* Class to manipulate the definition of a virtual layer
@@ -143,7 +143,7 @@ class CORE_EXPORT QgsVirtualLayerDefinition
void setGeometrySrid( long srid ) { mGeometrySrid = srid; }
//! Get field definitions
- const QgsFields& fields() const { return mFields; }
+ QgsFields fields() const { return mFields; }
//! Set field definitions
void setFields( const QgsFields& fields ) { mFields = fields; }
diff --git a/src/core/qgsvirtuallayerdefinitionutils.cpp b/src/core/qgsvirtuallayerdefinitionutils.cpp
index 02c8f6bc760..6a559fdfc7f 100644
--- a/src/core/qgsvirtuallayerdefinitionutils.cpp
+++ b/src/core/qgsvirtuallayerdefinitionutils.cpp
@@ -39,7 +39,7 @@ QgsVirtualLayerDefinition QgsVirtualLayerDefinitionUtils::fromJoinedLayer( QgsVe
{
// find an uid name
QString uid = "uid";
- while ( fields.fieldNameIndex( uid ) != -1 )
+ while ( fields.lookupField( uid ) != -1 )
uid += "_"; // add "_" each time this name already exists
// add a column
diff --git a/src/core/raster/qgsrasterdataprovider.h b/src/core/raster/qgsrasterdataprovider.h
index a6d8e420c48..135ecfdbb48 100644
--- a/src/core/raster/qgsrasterdataprovider.h
+++ b/src/core/raster/qgsrasterdataprovider.h
@@ -31,7 +31,7 @@
#include "qgscolorrampshader.h"
#include "qgsdataprovider.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsraster.h"
#include "qgsrasterinterface.h"
#include "qgsrasterpyramid.h"
diff --git a/src/core/symbology-ng/qgscategorizedsymbolrenderer.cpp b/src/core/symbology-ng/qgscategorizedsymbolrenderer.cpp
index 3a9e2ed8062..b697010ae24 100644
--- a/src/core/symbology-ng/qgscategorizedsymbolrenderer.cpp
+++ b/src/core/symbology-ng/qgscategorizedsymbolrenderer.cpp
@@ -395,7 +395,7 @@ void QgsCategorizedSymbolRenderer::startRender( QgsRenderContext& context, const
rebuildHash();
// find out classification attribute index from name
- mAttrNum = fields.fieldNameIndex( mAttrName );
+ mAttrNum = fields.lookupField( mAttrName );
if ( mAttrNum == -1 )
{
mExpression.reset( new QgsExpression( mAttrName ) );
@@ -494,7 +494,7 @@ void QgsCategorizedSymbolRenderer::toSld( QDomDocument &doc, QDomElement &elemen
QString QgsCategorizedSymbolRenderer::filter( const QgsFields& fields )
{
- int attrNum = fields.fieldNameIndex( mAttrName );
+ int attrNum = fields.lookupField( mAttrName );
bool isExpression = ( attrNum == -1 );
bool hasDefault = false;
diff --git a/src/core/symbology-ng/qgsgraduatedsymbolrenderer.cpp b/src/core/symbology-ng/qgsgraduatedsymbolrenderer.cpp
index d03c26ffa4b..884acdd4a0a 100644
--- a/src/core/symbology-ng/qgsgraduatedsymbolrenderer.cpp
+++ b/src/core/symbology-ng/qgsgraduatedsymbolrenderer.cpp
@@ -383,7 +383,7 @@ void QgsGraduatedSymbolRenderer::startRender( QgsRenderContext& context, const Q
mCounting = context.rendererScale() == 0.0;
// find out classification attribute index from name
- mAttrNum = fields.fieldNameIndex( mAttrName );
+ mAttrNum = fields.lookupField( mAttrName );
if ( mAttrNum == -1 )
{
@@ -804,7 +804,7 @@ QgsGraduatedSymbolRenderer* QgsGraduatedSymbolRenderer::createRenderer(
return r;
}
-void QgsGraduatedSymbolRenderer::updateClasses( QgsVectorLayer *vlayer, Mode mode, int nclasses )
+void QgsGraduatedSymbolRenderer::updateClasses( QgsVectorLayer* vlayer, Mode mode, int nclasses )
{
if ( mAttrName.isEmpty() )
return;
@@ -822,7 +822,7 @@ void QgsGraduatedSymbolRenderer::updateClasses( QgsVectorLayer *vlayer, Mode mod
double minimum;
double maximum;
- int attrNum = vlayer->fieldNameIndex( mAttrName );
+ int attrNum = vlayer->fields().lookupField( mAttrName );
bool ok;
if ( attrNum == -1 )
diff --git a/src/core/symbology-ng/qgsheatmaprenderer.cpp b/src/core/symbology-ng/qgsheatmaprenderer.cpp
index b416bfab5c8..bc065011a25 100644
--- a/src/core/symbology-ng/qgsheatmaprenderer.cpp
+++ b/src/core/symbology-ng/qgsheatmaprenderer.cpp
@@ -73,7 +73,7 @@ void QgsHeatmapRenderer::startRender( QgsRenderContext& context, const QgsFields
}
// find out classification attribute index from name
- mWeightAttrNum = fields.fieldNameIndex( mWeightExpressionString );
+ mWeightAttrNum = fields.lookupField( mWeightExpressionString );
if ( mWeightAttrNum == -1 )
{
mWeightExpression.reset( new QgsExpression( mWeightExpressionString ) );
diff --git a/src/core/symbology-ng/qgsrenderer.h b/src/core/symbology-ng/qgsrenderer.h
index ff852f4277e..55494d7598e 100644
--- a/src/core/symbology-ng/qgsrenderer.h
+++ b/src/core/symbology-ng/qgsrenderer.h
@@ -20,7 +20,7 @@
#include "qgsrectangle.h"
#include "qgsrendercontext.h"
#include "qgssymbol.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeaturerequest.h"
#include
diff --git a/src/core/symbology-ng/qgsrulebasedrenderer.h b/src/core/symbology-ng/qgsrulebasedrenderer.h
index 3de9d577bd7..57be8f7463c 100644
--- a/src/core/symbology-ng/qgsrulebasedrenderer.h
+++ b/src/core/symbology-ng/qgsrulebasedrenderer.h
@@ -16,7 +16,7 @@
#ifndef QGSRULEBASEDRENDERERV2_H
#define QGSRULEBASEDRENDERERV2_H
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
#include "qgis.h"
diff --git a/src/core/symbology-ng/qgssymbol.h b/src/core/symbology-ng/qgssymbol.h
index d4cc601bb48..eebca22f909 100644
--- a/src/core/symbology-ng/qgssymbol.h
+++ b/src/core/symbology-ng/qgssymbol.h
@@ -22,7 +22,7 @@
#include "qgsmapunitscale.h"
#include "qgspointv2.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QColor;
class QImage;
diff --git a/src/core/symbology-ng/qgssymbollayer.cpp b/src/core/symbology-ng/qgssymbollayer.cpp
index 8ebe47891a1..ccd7cc86e14 100644
--- a/src/core/symbology-ng/qgssymbollayer.cpp
+++ b/src/core/symbology-ng/qgssymbollayer.cpp
@@ -179,7 +179,7 @@ QVariant QgsSymbolLayer::evaluateDataDefinedProperty( const QString& property, c
}
else if ( context.feature() && !dd->field().isEmpty() && !mFields.isEmpty() )
{
- int attributeIndex = mFields.fieldNameIndex( dd->field() );
+ int attributeIndex = mFields.lookupField( dd->field() );
if ( attributeIndex >= 0 )
{
if ( ok )
diff --git a/src/core/symbology-ng/qgssymbollayer.h b/src/core/symbology-ng/qgssymbollayer.h
index 776a1d67087..eb50fb460c1 100644
--- a/src/core/symbology-ng/qgssymbollayer.h
+++ b/src/core/symbology-ng/qgssymbollayer.h
@@ -32,7 +32,7 @@
#include "qgssymbol.h"
#include "qgssymbollayerutils.h" // QgsStringMap
-#include "qgsfield.h"
+#include "qgsfields.h"
class QPainter;
class QSize;
diff --git a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp
index 3477a15fbfa..2db2b680698 100644
--- a/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp
+++ b/src/core/symbology-ng/qgsvectorfieldsymbollayer.cpp
@@ -213,8 +213,8 @@ void QgsVectorFieldSymbolLayer::startRender( QgsSymbolRenderContext& context )
QgsFields fields = context.fields();
if ( !fields.isEmpty() )
{
- mXIndex = fields.fieldNameIndex( mXAttribute );
- mYIndex = fields.fieldNameIndex( mYAttribute );
+ mXIndex = fields.lookupField( mXAttribute );
+ mYIndex = fields.lookupField( mYAttribute );
}
else
{
diff --git a/src/gui/attributetable/qgsattributetablefiltermodel.cpp b/src/gui/attributetable/qgsattributetablefiltermodel.cpp
index 446d18196db..83b24f797cf 100644
--- a/src/gui/attributetable/qgsattributetablefiltermodel.cpp
+++ b/src/gui/attributetable/qgsattributetablefiltermodel.cpp
@@ -134,7 +134,7 @@ void QgsAttributeTableFilterModel::setAttributeTableConfig( const QgsAttributeTa
continue;
// The new value for the mapping (field index or -1 for action column)
- int newValue = ( columnConfig.type == QgsAttributeTableConfig::Action ) ? -1 : layer()->fieldNameIndex( columnConfig.name );
+ int newValue = ( columnConfig.type == QgsAttributeTableConfig::Action ) ? -1 : layer()->fields().lookupField( columnConfig.name );
newColumnMapping << newValue;
}
diff --git a/src/gui/attributetable/qgsattributetablemodel.cpp b/src/gui/attributetable/qgsattributetablemodel.cpp
index 0e16d11b264..b6f8755b284 100644
--- a/src/gui/attributetable/qgsattributetablemodel.cpp
+++ b/src/gui/attributetable/qgsattributetablemodel.cpp
@@ -23,7 +23,7 @@
#include "qgsexpression.h"
#include "qgsfeatureiterator.h"
#include "qgsconditionalstyle.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgslogger.h"
#include "qgsmapcanvas.h"
#include "qgsmaplayeractionregistry.h"
@@ -432,7 +432,7 @@ void QgsAttributeTableModel::fieldConditionalStyleChanged( const QString &fieldN
return;
}
- int fieldIndex = mLayerCache->layer()->fieldNameIndex( fieldName );
+ int fieldIndex = mLayerCache->layer()->fields().lookupField( fieldName );
if ( fieldIndex == -1 )
return;
@@ -788,7 +788,7 @@ void QgsAttributeTableModel::prefetchSortData( const QString& expressionString )
if ( mSortCacheExpression.isField() )
{
QString fieldName = static_cast( mSortCacheExpression.rootNode() )->name();
- mSortFieldIndex = mLayerCache->layer()->fieldNameIndex( fieldName );
+ mSortFieldIndex = mLayerCache->layer()->fields().lookupField( fieldName );
}
if ( mSortFieldIndex == -1 )
@@ -797,7 +797,7 @@ void QgsAttributeTableModel::prefetchSortData( const QString& expressionString )
Q_FOREACH ( const QString& col, mSortCacheExpression.referencedColumns() )
{
- mSortCacheAttributes.append( mLayerCache->layer()->fieldNameIndex( col ) );
+ mSortCacheAttributes.append( mLayerCache->layer()->fields().lookupField( col ) );
}
}
else
diff --git a/src/gui/attributetable/qgsdualview.cpp b/src/gui/attributetable/qgsdualview.cpp
index 81b8021cb65..afd5fb61de2 100644
--- a/src/gui/attributetable/qgsdualview.cpp
+++ b/src/gui/attributetable/qgsdualview.cpp
@@ -138,7 +138,7 @@ void QgsDualView::columnBoxInit()
Q_FOREACH ( const QgsField& field, fields )
{
- int fieldIndex = mLayerCache->layer()->fieldNameIndex( field.name() );
+ int fieldIndex = mLayerCache->layer()->fields().lookupField( field.name() );
if ( fieldIndex == -1 )
continue;
diff --git a/src/gui/attributetable/qgsorganizetablecolumnsdialog.cpp b/src/gui/attributetable/qgsorganizetablecolumnsdialog.cpp
index 5728b3e581b..1f95fca6df0 100644
--- a/src/gui/attributetable/qgsorganizetablecolumnsdialog.cpp
+++ b/src/gui/attributetable/qgsorganizetablecolumnsdialog.cpp
@@ -36,7 +36,7 @@
#include "qgsexpressionselectiondialog.h"
#include "qgsfeaturelistmodel.h"
#include "qgsrubberband.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgseditorwidgetregistry.h"
@@ -65,7 +65,7 @@ QgsOrganizeTableColumnsDialog::QgsOrganizeTableColumnsDialog( const QgsVectorLay
}
else
{
- int idx = vl->fieldNameIndex( columnConfig.name );
+ int idx = vl->fields().lookupField( columnConfig.name );
item = new QListWidgetItem( vl->attributeDisplayName( idx ), mFieldsList );
switch ( vl->fields().fieldOrigin( idx ) )
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetautoconf.cpp b/src/gui/editorwidgets/core/qgseditorwidgetautoconf.cpp
index e0ef2e3027b..63a496f5c0f 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetautoconf.cpp
+++ b/src/gui/editorwidgets/core/qgseditorwidgetautoconf.cpp
@@ -31,7 +31,7 @@ class FromFactoriesPlugin: public QgsEditorWidgetAutoConfPlugin
const QMap factories = QgsEditorWidgetRegistry::instance()->factories();
for ( QMap::const_iterator i = factories.begin(); i != factories.end(); ++i )
{
- const int index = vl->fieldNameIndex( fieldName );
+ const int index = vl->fields().lookupField( fieldName );
if ( index >= 0 )
{
const int score = i.value()->fieldScore( vl, index );
@@ -109,4 +109,4 @@ void QgsEditorWidgetAutoConf::registerPlugin( QgsEditorWidgetAutoConfPlugin* plu
{
plugins.append( QSharedPointer( plugin ) );
}
-///@endcond
\ No newline at end of file
+///@endcond
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp
index 0abafe644bb..d9a8dfe82d2 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp
+++ b/src/gui/editorwidgets/core/qgseditorwidgetfactory.cpp
@@ -16,7 +16,7 @@
#include "qgseditorwidgetfactory.h"
#include "qgsdefaultsearchwidgetwrapper.h"
#include "qgssearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectordataprovider.h"
#include
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp
index 6bf98260082..caf87a9dae9 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp
+++ b/src/gui/editorwidgets/core/qgseditorwidgetregistry.cpp
@@ -244,7 +244,7 @@ void QgsEditorWidgetRegistry::readMapLayer( QgsMapLayer* mapLayer, const QDomEle
QString name = editTypeElement.attribute( "name" );
- int idx = vectorLayer->fieldNameIndex( name );
+ int idx = vectorLayer->fields().lookupField( name );
if ( idx == -1 )
continue;
diff --git a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
index ab2b2f4a090..4eb28e16ced 100644
--- a/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/core/qgseditorwidgetwrapper.cpp
@@ -16,7 +16,7 @@
#include "qgseditorwidgetwrapper.h"
#include "qgsvectorlayer.h"
#include "qgsvectordataprovider.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
diff --git a/src/gui/editorwidgets/core/qgssearchwidgetwrapper.cpp b/src/gui/editorwidgets/core/qgssearchwidgetwrapper.cpp
index 58d57f7c084..fec5a7bf71b 100644
--- a/src/gui/editorwidgets/core/qgssearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/core/qgssearchwidgetwrapper.cpp
@@ -16,7 +16,7 @@
#include "qgssearchwidgetwrapper.h"
#include "qgsvectorlayer.h"
#include "qgsvectordataprovider.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
diff --git a/src/gui/editorwidgets/qgscheckboxsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgscheckboxsearchwidgetwrapper.cpp
index b8201df77e2..2ffa882f527 100644
--- a/src/gui/editorwidgets/qgscheckboxsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgscheckboxsearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgscheckboxsearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscheckboxwidgetfactory.h"
#include "qgsvectorlayer.h"
diff --git a/src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp
index e313b61a147..1ad54ed818f 100644
--- a/src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsdatetimesearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgsdatetimesearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsdatetimeeditfactory.h"
#include "qgsvectorlayer.h"
#include "qgsdatetimeedit.h"
diff --git a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
index 860114c02be..31970389d7b 100644
--- a/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsdefaultsearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgsdefaultsearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfieldvalidator.h"
#include "qgsexpression.h"
#include
diff --git a/src/gui/editorwidgets/qgskeyvaluewidgetfactory.cpp b/src/gui/editorwidgets/qgskeyvaluewidgetfactory.cpp
index c1d08f30e8e..91dd023311a 100644
--- a/src/gui/editorwidgets/qgskeyvaluewidgetfactory.cpp
+++ b/src/gui/editorwidgets/qgskeyvaluewidgetfactory.cpp
@@ -16,7 +16,7 @@
#include "qgskeyvaluewidgetfactory.h"
#include "qgskeyvaluewidgetwrapper.h"
#include "qgsdummyconfigdlg.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
#include
diff --git a/src/gui/editorwidgets/qgslistwidgetfactory.cpp b/src/gui/editorwidgets/qgslistwidgetfactory.cpp
index 708d4990fc6..d5a52883b63 100644
--- a/src/gui/editorwidgets/qgslistwidgetfactory.cpp
+++ b/src/gui/editorwidgets/qgslistwidgetfactory.cpp
@@ -16,7 +16,7 @@
#include "qgslistwidgetfactory.h"
#include "qgslistwidgetwrapper.h"
#include "qgsdummyconfigdlg.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
#include "qgseditorwidgetregistry.h"
diff --git a/src/gui/editorwidgets/qgsmultiedittoolbutton.h b/src/gui/editorwidgets/qgsmultiedittoolbutton.h
index 9aeaa289d65..b8e78042e34 100644
--- a/src/gui/editorwidgets/qgsmultiedittoolbutton.h
+++ b/src/gui/editorwidgets/qgsmultiedittoolbutton.h
@@ -16,7 +16,7 @@
#ifndef QGSMULTIEDITTOOLBUTTON_H
#define QGSMULTIEDITTOOLBUTTON_H
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
/** \ingroup gui
diff --git a/src/gui/editorwidgets/qgsrelationreferenceconfigdlg.cpp b/src/gui/editorwidgets/qgsrelationreferenceconfigdlg.cpp
index 92dc346017b..fea6ad17b5c 100644
--- a/src/gui/editorwidgets/qgsrelationreferenceconfigdlg.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferenceconfigdlg.cpp
@@ -16,7 +16,7 @@
#include "qgsrelationreferenceconfigdlg.h"
#include "qgseditorwidgetfactory.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsproject.h"
#include "qgsrelationmanager.h"
#include "qgsvectorlayer.h"
diff --git a/src/gui/editorwidgets/qgsrelationreferencefactory.cpp b/src/gui/editorwidgets/qgsrelationreferencefactory.cpp
index ee7e9131513..e718d4430fc 100644
--- a/src/gui/editorwidgets/qgsrelationreferencefactory.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencefactory.cpp
@@ -138,7 +138,7 @@ QString QgsRelationReferenceFactory::representValue( QgsVectorLayer* vl, int fie
QgsDebugMsg( "representValue() with inconsistent vl parameter w.r.t relation referencingLayer" );
return value.toString();
}
- int referencingFieldIdx = referencingLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).first );
+ int referencingFieldIdx = referencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first );
if ( referencingFieldIdx != fieldIdx )
{
QgsDebugMsg( "representValue() with inconsistent fieldIdx parameter w.r.t relation referencingFieldIdx" );
@@ -171,7 +171,7 @@ QString QgsRelationReferenceFactory::representValue( QgsVectorLayer* vl, int fie
QString title = expr.evaluate( &context ).toString();
if ( expr.hasEvalError() )
{
- int referencedFieldIdx = referencedLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).second );
+ int referencedFieldIdx = referencedLayer->fields().lookupField( relation.fieldPairs().at( 0 ).second );
title = feature.attribute( referencedFieldIdx ).toString();
}
return title;
diff --git a/src/gui/editorwidgets/qgsrelationreferencesearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsrelationreferencesearchwidgetwrapper.cpp
index 079703c332a..cd74a2ea60c 100644
--- a/src/gui/editorwidgets/qgsrelationreferencesearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencesearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgsrelationreferencesearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsmaplayerregistry.h"
#include "qgsvaluerelationwidgetfactory.h"
#include "qgsvectorlayer.h"
diff --git a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
index 6592e36f995..c39132d5753 100644
--- a/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
+++ b/src/gui/editorwidgets/qgsrelationreferencewidget.cpp
@@ -28,7 +28,7 @@
#include "qgseditorwidgetfactory.h"
#include "qgsexpression.h"
#include "qgsfeaturelistmodel.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgshighlight.h"
#include "qgsmapcanvas.h"
@@ -193,8 +193,8 @@ void QgsRelationReferenceWidget::setRelation( const QgsRelation& relation, bool
mReferencingLayer = relation.referencingLayer();
mRelationName = relation.name();
mReferencedLayer = relation.referencedLayer();
- mReferencedFieldIdx = mReferencedLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).second );
- mReferencingFieldIdx = mReferencingLayer->fieldNameIndex( relation.fieldPairs().at( 0 ).first );
+ mReferencedFieldIdx = mReferencedLayer->fields().lookupField( relation.fieldPairs().at( 0 ).second );
+ mReferencingFieldIdx = mReferencingLayer->fields().lookupField( relation.fieldPairs().at( 0 ).first );
QgsAttributeEditorContext context( mEditorContext, relation, QgsAttributeEditorContext::Single, QgsAttributeEditorContext::Embed );
@@ -251,7 +251,7 @@ void QgsRelationReferenceWidget::setForeignKey( const QVariant& value )
// Attributes from the referencing layer
QgsAttributes attrs = QgsAttributes( mReferencingLayer->fields().count() );
// Set the value on the foreign key field of the referencing record
- attrs[ mReferencingLayer->fieldNameIndex( mRelation.fieldPairs().at( 0 ).first )] = value;
+ attrs[ mReferencingLayer->fields().lookupField( mRelation.fieldPairs().at( 0 ).first )] = value;
QgsFeatureRequest request = mRelation.getReferencedFeatureRequest( attrs );
@@ -468,7 +468,7 @@ void QgsRelationReferenceWidget::init()
Q_FOREACH ( const QString& fieldName, mFilterFields )
{
QVariantList uniqueValues;
- int idx = mReferencedLayer->fieldNameIndex( fieldName );
+ int idx = mReferencedLayer->fields().lookupField( fieldName );
QComboBox* cb = new QComboBox();
cb->setProperty( "Field", fieldName );
cb->setProperty( "FieldAlias", mReferencedLayer->attributeDisplayName( idx ) );
@@ -523,7 +523,7 @@ void QgsRelationReferenceWidget::init()
QgsAttributeList attributes;
Q_FOREACH ( const QString& attr, requestedAttrs )
- attributes << mReferencedLayer->fieldNameIndex( attr );
+ attributes << mReferencedLayer->fields().lookupField( attr );
layerCache->setCacheSubsetOfAttributes( attributes );
mMasterModel = new QgsAttributeTableModel( layerCache );
@@ -859,7 +859,7 @@ void QgsRelationReferenceWidget::filterChanged()
filters << QString( "\"%1\" = %2" ).arg( fieldName, cb->currentText() );
}
}
- attrs << mReferencedLayer->fieldNameIndex( fieldName );
+ attrs << mReferencedLayer->fields().lookupField( fieldName );
}
}
@@ -886,7 +886,7 @@ void QgsRelationReferenceWidget::addEntry()
// if custom text is in the combobox and the displayExpression is simply a field, use the current text for the new feature
if ( mComboBox->itemText( mComboBox->currentIndex() ) != mComboBox->currentText() )
{
- int fieldIdx = mReferencedLayer->fieldNameIndex( mReferencedLayer->displayExpression() );
+ int fieldIdx = mReferencedLayer->fields().lookupField( mReferencedLayer->displayExpression() );
if ( fieldIdx != -1 )
{
diff --git a/src/gui/editorwidgets/qgstexteditsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgstexteditsearchwidgetwrapper.cpp
index b627e4502c7..d60f5b9295b 100644
--- a/src/gui/editorwidgets/qgstexteditsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgstexteditsearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgstexteditsearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
QgsTextEditSearchWidgetWrapper::QgsTextEditSearchWidgetWrapper( QgsVectorLayer* vl, int fieldIdx, QWidget* parent )
diff --git a/src/gui/editorwidgets/qgstexteditwrapper.cpp b/src/gui/editorwidgets/qgstexteditwrapper.cpp
index 87e76ea7a95..033da9bcee1 100644
--- a/src/gui/editorwidgets/qgstexteditwrapper.cpp
+++ b/src/gui/editorwidgets/qgstexteditwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgstexteditwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfieldvalidator.h"
#include "qgsfilterlineedit.h"
diff --git a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
index edf48680b16..e94aed1c5a9 100644
--- a/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluemapsearchwidgetwrapper.cpp
@@ -17,7 +17,7 @@
#include "qgstexteditconfigdlg.h"
#include "qgsvaluemapconfigdlg.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfieldvalidator.h"
#include
diff --git a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
index add39fd11e9..41b440917e4 100644
--- a/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluerelationsearchwidgetwrapper.cpp
@@ -15,7 +15,7 @@
#include "qgsvaluerelationsearchwidgetwrapper.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsmaplayerregistry.h"
#include "qgsvaluerelationwidgetfactory.h"
#include "qgsvectorlayer.h"
diff --git a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
index 7cee02c98f8..0fee631e139 100644
--- a/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
+++ b/src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp
@@ -16,7 +16,7 @@
#include "qgsvaluerelationwidgetwrapper.h"
#include "qgis.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsmaplayerregistry.h"
#include "qgsvaluerelationwidgetfactory.h"
#include "qgsvectorlayer.h"
@@ -197,8 +197,8 @@ QgsValueRelationWidgetWrapper::ValueRelationCache QgsValueRelationWidgetWrapper:
if ( !layer )
return cache;
- int ki = layer->fieldNameIndex( config.value( "Key" ).toString() );
- int vi = layer->fieldNameIndex( config.value( "Value" ).toString() );
+ int ki = layer->fields().lookupField( config.value( "Key" ).toString() );
+ int vi = layer->fields().lookupField( config.value( "Value" ).toString() );
QgsFeatureRequest request;
diff --git a/src/gui/qgsattributeform.cpp b/src/gui/qgsattributeform.cpp
index 7c26c47a0b4..962e4727884 100644
--- a/src/gui/qgsattributeform.cpp
+++ b/src/gui/qgsattributeform.cpp
@@ -1219,7 +1219,7 @@ void QgsAttributeForm::init()
int row = 0;
Q_FOREACH ( const QgsField& field, mLayer->fields().toList() )
{
- int idx = mLayer->fieldNameIndex( field.name() );
+ int idx = mLayer->fields().lookupField( field.name() );
if ( idx < 0 )
continue;
@@ -1512,7 +1512,7 @@ QgsAttributeForm::WidgetInfo QgsAttributeForm::createWidgetFromDef( const QgsAtt
if ( !fieldDef )
break;
- int fldIdx = vl->fieldNameIndex( fieldDef->name() );
+ int fldIdx = vl->fields().lookupField( fieldDef->name() );
if ( fldIdx < vl->fields().count() && fldIdx >= 0 )
{
const QgsEditorWidgetSetup widgetSetup = QgsEditorWidgetRegistry::instance()->findBest( mLayer, fieldDef->name() );
@@ -1717,7 +1717,7 @@ void QgsAttributeForm::createWrappers()
{
if ( field.name() == myWidget->objectName() )
{
- int idx = mLayer->fieldNameIndex( field.name() );
+ int idx = mLayer->fields().lookupField( field.name() );
QgsEditorWidgetWrapper* eww = QgsEditorWidgetRegistry::instance()->create( mLayer, idx, myWidget, this, mContext );
addWidgetWrapper( eww );
diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp
index dd620ce8fb7..8b3e35df97e 100644
--- a/src/gui/qgsexpressionbuilderwidget.cpp
+++ b/src/gui/qgsexpressionbuilderwidget.cpp
@@ -330,7 +330,7 @@ void QgsExpressionBuilderWidget::fillFieldValues( const QString& fieldName, int
// TODO We should thread this so that we don't hold the user up if the layer is massive.
- int fieldIndex = mLayer->fieldNameIndex( fieldName );
+ int fieldIndex = mLayer->fields().lookupField( fieldName );
if ( fieldIndex < 0 )
return;
diff --git a/src/gui/qgsfieldmodel.h b/src/gui/qgsfieldmodel.h
index 27643793293..b5b93e68660 100644
--- a/src/gui/qgsfieldmodel.h
+++ b/src/gui/qgsfieldmodel.h
@@ -19,7 +19,7 @@
#include
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsVectorLayer;
diff --git a/src/gui/qgsfieldvalidator.cpp b/src/gui/qgsfieldvalidator.cpp
index 3e4fec64fbe..9814d313799 100644
--- a/src/gui/qgsfieldvalidator.cpp
+++ b/src/gui/qgsfieldvalidator.cpp
@@ -27,7 +27,7 @@
#include "qgslogger.h"
#include "qgslonglongvalidator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
QgsFieldValidator::QgsFieldValidator( QObject *parent, const QgsField &field, const QString& defaultValue, const QString& dateFormat )
: QValidator( parent )
diff --git a/src/gui/qgsfieldvalidator.h b/src/gui/qgsfieldvalidator.h
index 3e106bf0be2..82393a67cab 100644
--- a/src/gui/qgsfieldvalidator.h
+++ b/src/gui/qgsfieldvalidator.h
@@ -23,7 +23,7 @@
#include
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
/** \ingroup gui
* \class QgsFieldValidator
diff --git a/src/gui/qgsmaptoolidentify.cpp b/src/gui/qgsmaptoolidentify.cpp
index 72dfb245bf0..7b5d07b30f5 100644
--- a/src/gui/qgsmaptoolidentify.cpp
+++ b/src/gui/qgsmaptoolidentify.cpp
@@ -19,7 +19,7 @@
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
#include "qgsfeaturestore.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgsidentifymenu.h"
#include "qgslogger.h"
diff --git a/src/gui/qgsmaptoolidentify.h b/src/gui/qgsmaptoolidentify.h
index e8ff57ecc36..1450a1c69ba 100644
--- a/src/gui/qgsmaptoolidentify.h
+++ b/src/gui/qgsmaptoolidentify.h
@@ -17,7 +17,7 @@
#define QGSMAPTOOLIDENTIFY_H
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsmaptool.h"
#include "qgspoint.h"
#include "qgsunittypes.h"
diff --git a/src/gui/qgsrelationeditorwidget.cpp b/src/gui/qgsrelationeditorwidget.cpp
index 9decc9f87a0..6b737274836 100644
--- a/src/gui/qgsrelationeditorwidget.cpp
+++ b/src/gui/qgsrelationeditorwidget.cpp
@@ -380,7 +380,7 @@ void QgsRelationEditorWidget::linkFeature()
QMap keys;
Q_FOREACH ( const QgsRelation::FieldPair& fieldPair, mRelation.fieldPairs() )
{
- int idx = mRelation.referencingLayer()->fieldNameIndex( fieldPair.referencingField() );
+ int idx = mRelation.referencingLayer()->fields().lookupField( fieldPair.referencingField() );
QVariant val = mFeature.attribute( fieldPair.referencedField() );
keys.insert( idx, val );
}
@@ -455,7 +455,7 @@ void QgsRelationEditorWidget::unlinkFeature()
QMap keyFields;
Q_FOREACH ( const QgsRelation::FieldPair& fieldPair, mRelation.fieldPairs() )
{
- int idx = mRelation.referencingLayer()->fieldNameIndex( fieldPair.referencingField() );
+ int idx = mRelation.referencingLayer()->fields().lookupField( fieldPair.referencingField() );
if ( idx < 0 )
{
QgsDebugMsg( QString( "referencing field %1 not found" ).arg( fieldPair.referencingField() ) );
diff --git a/src/gui/qgssearchquerybuilder.cpp b/src/gui/qgssearchquerybuilder.cpp
index 3186ee63471..7fca8aecb33 100644
--- a/src/gui/qgssearchquerybuilder.cpp
+++ b/src/gui/qgssearchquerybuilder.cpp
@@ -25,7 +25,7 @@
#include
#include "qgsfeature.h"
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgssearchquerybuilder.h"
#include "qgsexpression.h"
#include "qgsvectorlayer.h"
diff --git a/src/gui/symbology-ng/qgscategorizedsymbolrendererwidget.cpp b/src/gui/symbology-ng/qgscategorizedsymbolrendererwidget.cpp
index a57dc4b268c..f506486a50e 100644
--- a/src/gui/symbology-ng/qgscategorizedsymbolrendererwidget.cpp
+++ b/src/gui/symbology-ng/qgscategorizedsymbolrendererwidget.cpp
@@ -645,7 +645,7 @@ QgsColorRamp* QgsCategorizedSymbolRendererWidget::getColorRamp()
void QgsCategorizedSymbolRendererWidget::addCategories()
{
QString attrName = mExpressionWidget->currentField();
- int idx = mLayer->fieldNameIndex( attrName );
+ int idx = mLayer->fields().lookupField( attrName );
QList unique_vals;
if ( idx == -1 )
{
diff --git a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp
index 42a1df45189..d73d619906d 100644
--- a/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp
+++ b/src/gui/symbology-ng/qgspointdisplacementrendererwidget.cpp
@@ -18,7 +18,7 @@
#include "qgspointdisplacementrendererwidget.h"
#include "qgspointdisplacementrenderer.h"
#include "qgsrendererregistry.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsstyle.h"
#include "qgssymbolselectordialog.h"
#include "qgssymbollayerutils.h"
diff --git a/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp b/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp
index e123bc273d0..5b0e9f19cc0 100644
--- a/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp
+++ b/src/plugins/evis/eventbrowser/evisgenericeventbrowsergui.cpp
@@ -33,7 +33,7 @@
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgspoint.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsrectangle.h"
#include
diff --git a/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp b/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
index c33a3bfc903..8b6f22568db 100644
--- a/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
+++ b/src/plugins/geometry_checker/ui/qgsgeometrycheckerresulttab.cpp
@@ -262,8 +262,8 @@ bool QgsGeometryCheckerResultTab::exportErrorsDo( const QString& file )
return false;
}
- int fieldFeatureId = layer->fieldNameIndex( "FeatureID" );
- int fieldErrDesc = layer->fieldNameIndex( "ErrorDesc" );
+ int fieldFeatureId = layer->fields().lookupField( "FeatureID" );
+ int fieldErrDesc = layer->fields().lookupField( "ErrorDesc" );
for ( int row = 0, nRows = ui.tableWidgetErrors->rowCount(); row < nRows; ++row )
{
QgsGeometryCheckError* error = ui.tableWidgetErrors->item( row, 0 )->data( Qt::UserRole ).value();
diff --git a/src/plugins/grass/qgsgrassmoduleoptions.h b/src/plugins/grass/qgsgrassmoduleoptions.h
index 70fff72411a..5f8e811d682 100644
--- a/src/plugins/grass/qgsgrassmoduleoptions.h
+++ b/src/plugins/grass/qgsgrassmoduleoptions.h
@@ -24,7 +24,7 @@
//#include
#include "qgis.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsgrassmoduleparam.h"
diff --git a/src/plugins/grass/qgsgrassmoduleparam.h b/src/plugins/grass/qgsgrassmoduleparam.h
index 0c222792e2b..6c75bb3bb53 100644
--- a/src/plugins/grass/qgsgrassmoduleparam.h
+++ b/src/plugins/grass/qgsgrassmoduleparam.h
@@ -26,7 +26,7 @@
#include "qgis.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgscoordinatereferencesystem.h"
class QDomNode;
diff --git a/src/plugins/interpolation/qgsinterpolationdialog.cpp b/src/plugins/interpolation/qgsinterpolationdialog.cpp
index bb98eee8c0d..339f79b1678 100644
--- a/src/plugins/interpolation/qgsinterpolationdialog.cpp
+++ b/src/plugins/interpolation/qgsinterpolationdialog.cpp
@@ -18,7 +18,7 @@
#include "qgsinterpolationdialog.h"
#include "qgsinterpolatordialog.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgridfilewriter.h"
#include "qgsidwinterpolatordialog.h"
#include "qgstininterpolatordialog.h"
diff --git a/src/plugins/roadgraph/linevectorlayerwidget.cpp b/src/plugins/roadgraph/linevectorlayerwidget.cpp
index d4b7a40d524..20f02710bbc 100644
--- a/src/plugins/roadgraph/linevectorlayerwidget.cpp
+++ b/src/plugins/roadgraph/linevectorlayerwidget.cpp
@@ -25,7 +25,7 @@
#include
// Qgis includes
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsvectorlayer.h"
#include "qgsmaplayercombobox.h"
diff --git a/src/plugins/roadgraph/roadgraphplugin.cpp b/src/plugins/roadgraph/roadgraphplugin.cpp
index 264fc277dc8..585d81309a2 100644
--- a/src/plugins/roadgraph/roadgraphplugin.cpp
+++ b/src/plugins/roadgraph/roadgraphplugin.cpp
@@ -212,14 +212,14 @@ const QgsGraphDirector* RoadGraphPlugin::director() const
QgsLineVectorLayerDirector * director =
new QgsLineVectorLayerDirector( layer,
- layer->fields().fieldNameIndex( mSettings->mDirection ),
+ layer->fields().lookupField( mSettings->mDirection ),
mSettings->mFirstPointToLastPointDirectionVal,
mSettings->mLastPointToFirstPointDirectionVal,
mSettings->mBothDirectionVal,
mSettings->mDefaultDirection
);
director->addProperter( new QgsDistanceArcProperter() );
- director->addProperter( new RgSpeedProperter( layer->fields().fieldNameIndex( mSettings->mSpeed ),
+ director->addProperter( new RgSpeedProperter( layer->fields().lookupField( mSettings->mSpeed ),
mSettings->mDefaultSpeed, speedUnit.multipler() ) );
return director;
}
diff --git a/src/providers/arcgisrest/qgsafsprovider.h b/src/providers/arcgisrest/qgsafsprovider.h
index 84f5fd8d214..d061dc8bd27 100644
--- a/src/providers/arcgisrest/qgsafsprovider.h
+++ b/src/providers/arcgisrest/qgsafsprovider.h
@@ -22,7 +22,7 @@
#include "qgsdatasourceuri.h"
#include "qgscoordinatereferencesystem.h"
#include "geometry/qgswkbtypes.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
/**
* @brief A provider reading features from a ArcGIS Feature Service
diff --git a/src/providers/arcgisrest/qgsarcgisrestutils.cpp b/src/providers/arcgisrest/qgsarcgisrestutils.cpp
index c78bdf42ce8..90d890e65eb 100644
--- a/src/providers/arcgisrest/qgsarcgisrestutils.cpp
+++ b/src/providers/arcgisrest/qgsarcgisrestutils.cpp
@@ -14,7 +14,7 @@
***************************************************************************/
#include "qgsarcgisrestutils.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgslogger.h"
#include "qgsnetworkaccessmanager.h"
#include "qgsrectangle.h"
diff --git a/src/providers/db2/qgsdb2featureiterator.cpp b/src/providers/db2/qgsdb2featureiterator.cpp
index 29e31f1f035..33805f7e920 100644
--- a/src/providers/db2/qgsdb2featureiterator.cpp
+++ b/src/providers/db2/qgsdb2featureiterator.cpp
@@ -82,12 +82,10 @@ void QgsDb2FeatureIterator::BuildStatement( const QgsFeatureRequest& request )
// ensure that all attributes required for expression filter are being fetched
if ( subsetOfAttributes && request.filterType() == QgsFeatureRequest::FilterExpression )
{
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ attrs = attributeIndexes.toList();
}
Q_FOREACH ( int i, attrs )
diff --git a/src/providers/db2/qgsdb2featureiterator.h b/src/providers/db2/qgsdb2featureiterator.h
index a2ee9d0c587..42471b790a8 100644
--- a/src/providers/db2/qgsdb2featureiterator.h
+++ b/src/providers/db2/qgsdb2featureiterator.h
@@ -18,7 +18,7 @@
#ifndef QGSDB2FEATUREITERATOR_H
#define QGSDB2FEATUREITERATOR_H
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeatureiterator.h"
#include
#include
diff --git a/src/providers/db2/qgsdb2provider.cpp b/src/providers/db2/qgsdb2provider.cpp
index ed5be828646..57c71589575 100644
--- a/src/providers/db2/qgsdb2provider.cpp
+++ b/src/providers/db2/qgsdb2provider.cpp
@@ -1400,7 +1400,7 @@ QgsVectorLayerImport::ImportError QgsDb2Provider::createEmptyLayer( const QStrin
{
QgsField fld = fields.field( i );
QgsDebugMsg( QString( "i: %1; fldIdx: %2; offset: %3" )
- .arg( i ).arg( fields.fieldNameIndex( fld.name() ) ).arg( offset ) );
+ .arg( i ).arg( fields.lookupField( fld.name() ) ).arg( offset ) );
if ( oldToNewAttrIdxMap && fld.name() == primaryKey )
{
@@ -1426,7 +1426,7 @@ QgsVectorLayerImport::ImportError QgsDb2Provider::createEmptyLayer( const QStrin
if ( oldToNewAttrIdxMap )
{
- oldToNewAttrIdxMap->insert( fields.fieldNameIndex( fld.name() ), offset++ );
+ oldToNewAttrIdxMap->insert( fields.lookupField( fld.name() ), offset++ );
}
attr2Create += ',' + db2Field.toUpper();
}
diff --git a/src/providers/db2/qgsdb2provider.h b/src/providers/db2/qgsdb2provider.h
index 97ada43fef7..310ee349b12 100644
--- a/src/providers/db2/qgsdb2provider.h
+++ b/src/providers/db2/qgsdb2provider.h
@@ -22,7 +22,7 @@
#include "qgsvectorlayerimport.h"
#include
#include "qgsgeometry.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
/**
diff --git a/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp b/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
index 19ae2047de2..0ebb0e23283 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
+++ b/src/providers/delimitedtext/qgsdelimitedtextfeatureiterator.cpp
@@ -145,13 +145,10 @@ QgsDelimitedTextFeatureIterator::QgsDelimitedTextFeatureIterator( QgsDelimitedTe
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes && request.filterType() == QgsFeatureRequest::FilterExpression )
{
QgsAttributeList attrs = request.subsetOfAttributes();
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
- mRequest.setSubsetOfAttributes( attrs );
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ mRequest.setSubsetOfAttributes( attributeIndexes.toList() );
}
QgsDebugMsg( QString( "Iterator is scanning file: " ) + ( mMode == FileScan ? "Yes" : "No" ) );
diff --git a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
index 19f343619d7..275952c8ce9 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
+++ b/src/providers/delimitedtext/qgsdelimitedtextprovider.cpp
@@ -32,7 +32,7 @@
#include "qgsdataprovider.h"
#include "qgsexpression.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsmessagelog.h"
diff --git a/src/providers/delimitedtext/qgsdelimitedtextprovider.h b/src/providers/delimitedtext/qgsdelimitedtextprovider.h
index 2366f68fc93..1645f255be0 100644
--- a/src/providers/delimitedtext/qgsdelimitedtextprovider.h
+++ b/src/providers/delimitedtext/qgsdelimitedtextprovider.h
@@ -21,7 +21,7 @@
#include "qgsvectordataprovider.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsdelimitedtextfile.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
diff --git a/src/providers/gpx/qgsgpxprovider.cpp b/src/providers/gpx/qgsgpxprovider.cpp
index 7eb64850dee..760c260d2b1 100644
--- a/src/providers/gpx/qgsgpxprovider.cpp
+++ b/src/providers/gpx/qgsgpxprovider.cpp
@@ -36,7 +36,7 @@
#include "qgscoordinatereferencesystem.h"
#include "qgsdataprovider.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsrectangle.h"
diff --git a/src/providers/gpx/qgsgpxprovider.h b/src/providers/gpx/qgsgpxprovider.h
index 0a1ccdcd72d..7535331460a 100644
--- a/src/providers/gpx/qgsgpxprovider.h
+++ b/src/providers/gpx/qgsgpxprovider.h
@@ -22,7 +22,7 @@
#include "qgsvectordataprovider.h"
#include "gpsdata.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
class QgsFeature;
class QgsField;
diff --git a/src/providers/grass/qgsgrass.cpp b/src/providers/grass/qgsgrass.cpp
index e2683f205ca..8204bb8d4fa 100644
--- a/src/providers/grass/qgsgrass.cpp
+++ b/src/providers/grass/qgsgrass.cpp
@@ -35,7 +35,7 @@
#include "qgsapplication.h"
#include "qgsconfig.h"
#include "qgscoordinatereferencesystem.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgslocalec.h"
#include "qgslogger.h"
#include "qgsproject.h"
diff --git a/src/providers/grass/qgsgrass.h b/src/providers/grass/qgsgrass.h
index 39cae57629f..bff3f38634c 100644
--- a/src/providers/grass/qgsgrass.h
+++ b/src/providers/grass/qgsgrass.h
@@ -34,7 +34,7 @@ extern "C"
#include "qgsapplication.h"
#include "qgsexception.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
#include
diff --git a/src/providers/grass/qgsgrassprovider.cpp b/src/providers/grass/qgsgrassprovider.cpp
index 2b9ab2b56c5..31e59309c1e 100644
--- a/src/providers/grass/qgsgrassprovider.cpp
+++ b/src/providers/grass/qgsgrassprovider.cpp
@@ -24,7 +24,7 @@
#include "qgis.h"
#include "qgsdataprovider.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgslinestring.h"
#include "qgspointv2.h"
#include "qgspolygon.h"
diff --git a/src/providers/grass/qgsgrassvector.h b/src/providers/grass/qgsgrassvector.h
index cff0facabb8..a714fe2ea25 100644
--- a/src/providers/grass/qgsgrassvector.h
+++ b/src/providers/grass/qgsgrassvector.h
@@ -20,7 +20,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgrass.h"
diff --git a/src/providers/grass/qgsgrassvectormaplayer.h b/src/providers/grass/qgsgrassvectormaplayer.h
index 0972891b409..98202dcfebb 100644
--- a/src/providers/grass/qgsgrassvectormaplayer.h
+++ b/src/providers/grass/qgsgrassvectormaplayer.h
@@ -22,7 +22,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeature.h"
extern "C"
diff --git a/src/providers/memory/qgsmemoryfeatureiterator.h b/src/providers/memory/qgsmemoryfeatureiterator.h
index 4aaa417cfe5..5bbbe141e3d 100644
--- a/src/providers/memory/qgsmemoryfeatureiterator.h
+++ b/src/providers/memory/qgsmemoryfeatureiterator.h
@@ -17,7 +17,7 @@
#include "qgsfeatureiterator.h"
#include "qgsexpressioncontext.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
class QgsMemoryProvider;
diff --git a/src/providers/memory/qgsmemoryprovider.cpp b/src/providers/memory/qgsmemoryprovider.cpp
index b26238468b3..1843af6a828 100644
--- a/src/providers/memory/qgsmemoryprovider.cpp
+++ b/src/providers/memory/qgsmemoryprovider.cpp
@@ -17,7 +17,7 @@
#include "qgsmemoryfeatureiterator.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsspatialindex.h"
diff --git a/src/providers/memory/qgsmemoryprovider.h b/src/providers/memory/qgsmemoryprovider.h
index db300e53671..7beb40298c0 100644
--- a/src/providers/memory/qgsmemoryprovider.h
+++ b/src/providers/memory/qgsmemoryprovider.h
@@ -15,7 +15,7 @@
#include "qgsvectordataprovider.h"
#include "qgscoordinatereferencesystem.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
typedef QMap QgsFeatureMap;
diff --git a/src/providers/mssql/qgsmssqlfeatureiterator.cpp b/src/providers/mssql/qgsmssqlfeatureiterator.cpp
index 927226c571c..616a2e1c706 100644
--- a/src/providers/mssql/qgsmssqlfeatureiterator.cpp
+++ b/src/providers/mssql/qgsmssqlfeatureiterator.cpp
@@ -81,12 +81,10 @@ void QgsMssqlFeatureIterator::BuildStatement( const QgsFeatureRequest& request )
// ensure that all attributes required for expression filter are being fetched
if ( subsetOfAttributes && request.filterType() == QgsFeatureRequest::FilterExpression )
{
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ attrs = attributeIndexes.toList();
}
Q_FOREACH ( int i, attrs )
diff --git a/src/providers/mssql/qgsmssqlfeatureiterator.h b/src/providers/mssql/qgsmssqlfeatureiterator.h
index 3f3b4a5cdd4..676545abbce 100644
--- a/src/providers/mssql/qgsmssqlfeatureiterator.h
+++ b/src/providers/mssql/qgsmssqlfeatureiterator.h
@@ -20,7 +20,7 @@
#include "qgsmssqlgeometryparser.h"
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
#include
diff --git a/src/providers/mssql/qgsmssqlprovider.cpp b/src/providers/mssql/qgsmssqlprovider.cpp
index 3b28d0ff8b2..0a2d5c68232 100644
--- a/src/providers/mssql/qgsmssqlprovider.cpp
+++ b/src/providers/mssql/qgsmssqlprovider.cpp
@@ -37,7 +37,7 @@
#include "qgsapplication.h"
#include "qgsdataprovider.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgslogger.h"
#include "qgsmessageoutput.h"
@@ -1833,7 +1833,7 @@ QgsVectorLayerImport::ImportError QgsMssqlProvider::createEmptyLayer( const QStr
QgsField fld = fields.at( i );
if ( oldToNewAttrIdxMap && fld.name() == primaryKey )
{
- oldToNewAttrIdxMap->insert( fields.fieldNameIndex( fld.name() ), 0 );
+ oldToNewAttrIdxMap->insert( fields.lookupField( fld.name() ), 0 );
continue;
}
@@ -1854,7 +1854,7 @@ QgsVectorLayerImport::ImportError QgsMssqlProvider::createEmptyLayer( const QStr
flist.append( fld );
if ( oldToNewAttrIdxMap )
- oldToNewAttrIdxMap->insert( fields.fieldNameIndex( fld.name() ), offset++ );
+ oldToNewAttrIdxMap->insert( fields.lookupField( fld.name() ), offset++ );
}
if ( !provider->addAttributes( flist ) )
diff --git a/src/providers/mssql/qgsmssqlprovider.h b/src/providers/mssql/qgsmssqlprovider.h
index eb39eb4b51e..982b2be960f 100644
--- a/src/providers/mssql/qgsmssqlprovider.h
+++ b/src/providers/mssql/qgsmssqlprovider.h
@@ -21,7 +21,7 @@
#include "qgsvectordataprovider.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsvectorlayerimport.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
diff --git a/src/providers/ogr/qgsogrfeatureiterator.cpp b/src/providers/ogr/qgsogrfeatureiterator.cpp
index 15b69fe0a18..d2928af2cd4 100644
--- a/src/providers/ogr/qgsogrfeatureiterator.cpp
+++ b/src/providers/ogr/qgsogrfeatureiterator.cpp
@@ -81,13 +81,10 @@ QgsOgrFeatureIterator::QgsOgrFeatureIterator( QgsOgrFeatureSource* source, bool
// ensure that all attributes required for expression filter are being fetched
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes && request.filterType() == QgsFeatureRequest::FilterExpression )
{
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
- mRequest.setSubsetOfAttributes( attrs );
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ mRequest.setSubsetOfAttributes( attributeIndexes.toList() );
}
if ( request.filterType() == QgsFeatureRequest::FilterExpression && request.filterExpression()->needsGeometry() )
{
diff --git a/src/providers/ogr/qgsogrfeatureiterator.h b/src/providers/ogr/qgsogrfeatureiterator.h
index 60be9cbffe4..220d6d3f45a 100644
--- a/src/providers/ogr/qgsogrfeatureiterator.h
+++ b/src/providers/ogr/qgsogrfeatureiterator.h
@@ -17,7 +17,7 @@
#include "qgsfeatureiterator.h"
#include "qgsogrconnpool.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp
index 174d871fdb5..8c8645fbaa3 100644
--- a/src/providers/ogr/qgsogrprovider.cpp
+++ b/src/providers/ogr/qgsogrprovider.cpp
@@ -42,7 +42,7 @@ email : sherman at mrcc.com
#include "qgsdataitem.h"
#include "qgsdataprovider.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsvectorlayerimport.h"
@@ -1350,7 +1350,7 @@ bool QgsOgrProvider::addAttributes( const QList &attributes )
// is still returned to the caller
for ( QMap< QString, QVariant::Type >::const_iterator it = mapFieldTypesToPatch.begin(); it != mapFieldTypesToPatch.end(); ++it )
{
- int idx = mAttributeFields.fieldNameIndex( it.key() );
+ int idx = mAttributeFields.lookupField( it.key() );
if ( idx >= 0 )
mAttributeFields[ idx ].setType( *it );
}
diff --git a/src/providers/oracle/qgsoracleconn.cpp b/src/providers/oracle/qgsoracleconn.cpp
index 76c7fd659ef..d681c8785e0 100644
--- a/src/providers/oracle/qgsoracleconn.cpp
+++ b/src/providers/oracle/qgsoracleconn.cpp
@@ -20,7 +20,7 @@
#include "qgsdatasourceuri.h"
#include "qgsmessagelog.h"
#include "qgscredentials.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsoracletablemodel.h"
#include
diff --git a/src/providers/oracle/qgsoracleprovider.cpp b/src/providers/oracle/qgsoracleprovider.cpp
index aa30de8ef5e..7f1d6ffda42 100644
--- a/src/providers/oracle/qgsoracleprovider.cpp
+++ b/src/providers/oracle/qgsoracleprovider.cpp
@@ -16,7 +16,7 @@
***************************************************************************/
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgsmessageoutput.h"
#include "qgsmessagelog.h"
diff --git a/src/providers/oracle/qgsoracleprovider.h b/src/providers/oracle/qgsoracleprovider.h
index 9ac719a8842..1c39a328b15 100644
--- a/src/providers/oracle/qgsoracleprovider.h
+++ b/src/providers/oracle/qgsoracleprovider.h
@@ -23,7 +23,7 @@
#include "qgsvectorlayerimport.h"
#include "qgsoracletablemodel.h"
#include "qgsdatasourceuri.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
diff --git a/src/providers/postgres/qgspostgresconn.cpp b/src/providers/postgres/qgspostgresconn.cpp
index 8417eda5a8c..1ee8b93ff9f 100644
--- a/src/providers/postgres/qgspostgresconn.cpp
+++ b/src/providers/postgres/qgspostgresconn.cpp
@@ -21,7 +21,7 @@
#include "qgsdatasourceuri.h"
#include "qgsmessagelog.h"
#include "qgscredentials.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgspgtablemodel.h"
#include "qgsproviderregistry.h"
#include "qgsvectordataprovider.h"
diff --git a/src/providers/postgres/qgspostgresfeatureiterator.cpp b/src/providers/postgres/qgspostgresfeatureiterator.cpp
index 1b72d4d97ab..9ba1778b5c1 100644
--- a/src/providers/postgres/qgspostgresfeatureiterator.cpp
+++ b/src/providers/postgres/qgspostgresfeatureiterator.cpp
@@ -93,13 +93,10 @@ QgsPostgresFeatureIterator::QgsPostgresFeatureIterator( QgsPostgresFeatureSource
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes )
{
QgsAttributeList attrs = mRequest.subsetOfAttributes();
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
- mRequest.setSubsetOfAttributes( attrs );
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ mRequest.setSubsetOfAttributes( attributeIndexes.toList() );
}
mFilterRequiresGeometry = request.filterExpression()->needsGeometry();
diff --git a/src/providers/postgres/qgspostgresprovider.h b/src/providers/postgres/qgspostgresprovider.h
index 2322033b145..f604241e224 100644
--- a/src/providers/postgres/qgspostgresprovider.h
+++ b/src/providers/postgres/qgspostgresprovider.h
@@ -22,7 +22,7 @@
#include "qgsrectangle.h"
#include "qgsvectorlayerimport.h"
#include "qgspostgresconn.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
class QgsFeature;
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
index b358d5c314f..79c2fba0398 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.cpp
@@ -89,13 +89,10 @@ QgsSpatiaLiteFeatureIterator::QgsSpatiaLiteFeatureIterator( QgsSpatiaLiteFeature
if ( mRequest.flags() & QgsFeatureRequest::SubsetOfAttributes && request.filterType() == QgsFeatureRequest::FilterExpression )
{
QgsAttributeList attrs = request.subsetOfAttributes();
- Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
- {
- int attrIdx = mSource->mFields.fieldNameIndex( field );
- if ( !attrs.contains( attrIdx ) )
- attrs << attrIdx;
- }
- mRequest.setSubsetOfAttributes( attrs );
+ //ensure that all fields required for filter expressions are prepared
+ QSet attributeIndexes = request.filterExpression()->referencedAttributeIndexes( mSource->mFields );
+ attributeIndexes += attrs.toSet();
+ mRequest.setSubsetOfAttributes( attributeIndexes.toList() );
}
if ( request.filterExpression()->needsGeometry() )
{
diff --git a/src/providers/spatialite/qgsspatialitefeatureiterator.h b/src/providers/spatialite/qgsspatialitefeatureiterator.h
index 33d249c03cc..f660064e957 100644
--- a/src/providers/spatialite/qgsspatialitefeatureiterator.h
+++ b/src/providers/spatialite/qgsspatialitefeatureiterator.h
@@ -16,7 +16,7 @@
#define QGSSPATIALITEFEATUREITERATOR_H
#include "qgsfeatureiterator.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
extern "C"
{
diff --git a/src/providers/spatialite/qgsspatialiteprovider.cpp b/src/providers/spatialite/qgsspatialiteprovider.cpp
index 48352dde077..2ceb1dcc8f8 100644
--- a/src/providers/spatialite/qgsspatialiteprovider.cpp
+++ b/src/providers/spatialite/qgsspatialiteprovider.cpp
@@ -17,7 +17,7 @@ email : a.furieri@lqt.it
#include "qgis.h"
#include "qgsapplication.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgsmessageoutput.h"
#include "qgsrectangle.h"
@@ -961,7 +961,7 @@ void QgsSpatiaLiteProvider::determineViewPrimaryKey()
if ( rows > 0 )
{
mPrimaryKey = results[1 * columns];
- int idx = mAttributeFields.fieldNameIndex( mPrimaryKey );
+ int idx = mAttributeFields.lookupField( mPrimaryKey );
if ( idx != -1 )
mPrimaryKeyAttrs << idx;
}
@@ -989,7 +989,7 @@ bool QgsSpatiaLiteProvider::hasTriggers()
bool QgsSpatiaLiteProvider::hasRowid()
{
- if ( mAttributeFields.fieldNameIndex( "ROWID" ) >= 0 )
+ if ( mAttributeFields.lookupField( "ROWID" ) >= 0 )
return false;
// table without rowid column
diff --git a/src/providers/spatialite/qgsspatialiteprovider.h b/src/providers/spatialite/qgsspatialiteprovider.h
index 7d1134d446f..b38c9abe6c9 100644
--- a/src/providers/spatialite/qgsspatialiteprovider.h
+++ b/src/providers/spatialite/qgsspatialiteprovider.h
@@ -28,7 +28,7 @@ extern "C"
#include "qgsvectordataprovider.h"
#include "qgsrectangle.h"
#include "qgsvectorlayerimport.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include
#include
#include
diff --git a/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp b/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp
index c42b127a5e5..2dbfdc17815 100644
--- a/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp
+++ b/src/providers/virtual/qgsvirtuallayerfeatureiterator.cpp
@@ -91,7 +91,7 @@ QgsVirtualLayerFeatureIterator::QgsVirtualLayerFeatureIterator( QgsVirtualLayerF
{
Q_FOREACH ( const QString& field, request.filterExpression()->referencedColumns() )
{
- int attrIdx = mFields.fieldNameIndex( field );
+ int attrIdx = mFields.lookupField( field );
if ( !mAttributes.contains( attrIdx ) )
mAttributes << attrIdx;
}
diff --git a/src/providers/wfs/qgswfsprovider.cpp b/src/providers/wfs/qgswfsprovider.cpp
index bc6c374a472..72de7c08a4a 100644
--- a/src/providers/wfs/qgswfsprovider.cpp
+++ b/src/providers/wfs/qgswfsprovider.cpp
@@ -18,7 +18,7 @@
#include "qgis.h"
#include "qgsapplication.h"
#include "qgsfeature.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsgeometry.h"
#include "qgscoordinatereferencesystem.h"
#include "qgslogger.h"
@@ -257,7 +257,7 @@ void QgsWFSProviderSQLColumnRefValidator::visit( const QgsSQLStatement::NodeColu
}
QgsFields tableFields = mMapTypenameToFields[typeName];
- int idx = tableFields.fieldNameIndex( n.name() );
+ int idx = tableFields.lookupField( n.name() );
if ( idx < 0 && mMapTypenameToGeometryAttribute[typeName] != n.name() )
{
mError = true;
@@ -595,7 +595,7 @@ bool QgsWFSProvider::processSQL( const QString& sqlString, QString& errorMsg, QS
else
{
const QgsFields tableFields = mapTypenameToFields[columnTableTypename];
- int idx = tableFields.fieldNameIndex( columnRef->name() );
+ int idx = tableFields.lookupField( columnRef->name() );
if ( idx < 0 )
{
QgsDebugMsg( QString( "Should not happen. Cannot find field for %1" ).arg( columnRef->name() ) );
diff --git a/src/providers/wfs/qgswfsshareddata.cpp b/src/providers/wfs/qgswfsshareddata.cpp
index e25cf10c60f..12bcf765e0f 100644
--- a/src/providers/wfs/qgswfsshareddata.cpp
+++ b/src/providers/wfs/qgswfsshareddata.cpp
@@ -247,7 +247,7 @@ bool QgsWFSSharedData::createCache()
// Only GDAL >= 2.0 can use an alternate geometry or FID field name
// but QgsVectorFileWriter will refuse anyway to create a ogc_fid, so we will
// do it manually
- bool useReservedNames = cacheFields.fieldNameIndex( "ogc_fid" ) >= 0;
+ bool useReservedNames = cacheFields.lookupField( "ogc_fid" ) >= 0;
#if GDAL_VERSION_MAJOR < 2
if ( cacheFields.fieldNameIndex( "geometry" ) >= 0 )
useReservedNames = true;
diff --git a/src/server/qgsserverprojectparser.cpp b/src/server/qgsserverprojectparser.cpp
index b472577e6cb..42c421fa0de 100644
--- a/src/server/qgsserverprojectparser.cpp
+++ b/src/server/qgsserverprojectparser.cpp
@@ -782,7 +782,7 @@ void QgsServerProjectParser::addLayerProjectSettings( QDomElement& layerElem, QD
if ( exp.isField() )
{
displayField = static_cast( exp.rootNode() )->name();
- displayFieldIdx = vLayer->fieldNameIndex( displayField );
+ displayFieldIdx = vLayer->fields().lookupField( displayField );
}
//attributes
diff --git a/src/server/qgswfsserver.cpp b/src/server/qgswfsserver.cpp
index 8b307d9e15e..c733aeeb439 100644
--- a/src/server/qgswfsserver.cpp
+++ b/src/server/qgswfsserver.cpp
@@ -15,7 +15,7 @@
* *
***************************************************************************/
#include "qgswfsserver.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsexpression.h"
#include "qgsfeatureiterator.h"
#include "qgsgeometry.h"
@@ -488,7 +488,7 @@ int QgsWfsServer::getFeature( QgsRequestHandler& request, const QString& format
QgsStringMap::const_iterator aliasIt = aliasMap.constBegin();
for ( ; aliasIt != aliasMap.constEnd(); ++aliasIt )
{
- int attrIndex = layer->fieldNameIndex( aliasIt.key() );
+ int attrIndex = layer->fields().lookupField( aliasIt.key() );
if ( attrIndex != -1 )
{
layerAliasInfo.insert( attrIndex, aliasIt.value() );
@@ -534,7 +534,7 @@ int QgsWfsServer::getFeature( QgsRequestHandler& request, const QString& format
{
fieldName = fieldName.section( ":", 1, 1 );
}
- int fieldNameIdx = fields.fieldNameIndex( fieldName );
+ int fieldNameIdx = fields.lookupField( fieldName );
if ( fieldNameIdx > -1 )
{
idxList.append( fieldNameIdx );
@@ -874,7 +874,7 @@ int QgsWfsServer::getFeature( QgsRequestHandler& request, const QString& format
QgsStringMap::const_iterator aliasIt = aliasMap.constBegin();
for ( ; aliasIt != aliasMap.constEnd(); ++aliasIt )
{
- int attrIndex = layer->fieldNameIndex( aliasIt.key() );
+ int attrIndex = layer->fields().lookupField( aliasIt.key() );
if ( attrIndex != -1 )
{
layerAliasInfo.insert( attrIndex, aliasIt.value() );
@@ -914,7 +914,7 @@ int QgsWfsServer::getFeature( QgsRequestHandler& request, const QString& format
for ( alstIt = attrList.begin(); alstIt != attrList.end(); ++alstIt )
{
fieldName = *alstIt;
- int fieldNameIdx = fields.fieldNameIndex( fieldName );
+ int fieldNameIdx = fields.lookupField( fieldName );
if ( fieldNameIdx > -1 )
{
idxList.append( fieldNameIdx );
diff --git a/src/server/qgswmsserver.cpp b/src/server/qgswmsserver.cpp
index e4b7a1c900b..a889bbc131f 100644
--- a/src/server/qgswmsserver.cpp
+++ b/src/server/qgswmsserver.cpp
@@ -20,7 +20,7 @@
#include "qgscapabilitiescache.h"
#include "qgscsexception.h"
#include "qgsdxfexport.h"
-#include "qgsfield.h"
+#include "qgsfields.h"
#include "qgsfeatureiterator.h"
#include "qgsgeometry.h"
#include "qgslayertree.h"
diff --git a/tests/src/core/testqgsexpression.cpp b/tests/src/core/testqgsexpression.cpp
index 8de2d089872..ae2f372e659 100644
--- a/tests/src/core/testqgsexpression.cpp
+++ b/tests/src/core/testqgsexpression.cpp
@@ -2444,7 +2444,7 @@ class TestQgsExpression: public QObject
// Let's remove the field referenced in the expression
mPointsLayer->startEditing();
- mPointsLayer->deleteAttribute( mPointsLayer->fieldNameIndex( "Pilots" ) );
+ mPointsLayer->deleteAttribute( mPointsLayer->fields().lookupField( "Pilots" ) );
// Now the prepared expression is broken
// The cached field index points to the index which now is
diff --git a/tests/src/core/testqgsfields.cpp b/tests/src/core/testqgsfields.cpp
index 221008715e1..0b20caede33 100644
--- a/tests/src/core/testqgsfields.cpp
+++ b/tests/src/core/testqgsfields.cpp
@@ -19,7 +19,7 @@
#include
#include
-#include "qgsfield.h"
+#include "qgsfields.h"
class TestQgsFields: public QObject
{
@@ -338,25 +338,25 @@ void TestQgsFields::indexFromName()
fields.append( field3 );
QCOMPARE( fields.indexFromName( QString( "bad" ) ), -1 );
- QCOMPARE( fields.fieldNameIndex( QString( "bad" ) ), -1 );
+ QCOMPARE( fields.lookupField( QString( "bad" ) ), -1 );
QCOMPARE( fields.indexFromName( QString( "testfield" ) ), 0 );
- QCOMPARE( fields.fieldNameIndex( QString( "testfield" ) ), 0 );
+ QCOMPARE( fields.lookupField( QString( "testfield" ) ), 0 );
QCOMPARE( fields.indexFromName( QString( "testfield3" ) ), 2 );
- QCOMPARE( fields.fieldNameIndex( QString( "testfield3" ) ), 2 );
+ QCOMPARE( fields.lookupField( QString( "testfield3" ) ), 2 );
//indexFromName is case sensitive, fieldNameIndex isn't
QCOMPARE( fields.indexFromName( QString( "teStFiEld2" ) ), -1 );
- QCOMPARE( fields.fieldNameIndex( QString( "teStFiEld2" ) ), 1 );
+ QCOMPARE( fields.lookupField( QString( "teStFiEld2" ) ), 1 );
//test that fieldNameIndex prefers exact case matches over case insensitive matches
QgsField sameNameDifferentCase( QString( "teStFielD" ) );
fields.append( sameNameDifferentCase );
- QCOMPARE( fields.fieldNameIndex( QString( "teStFielD" ) ), 3 );
+ QCOMPARE( fields.lookupField( QString( "teStFielD" ) ), 3 );
//test that the alias is only matched with fieldNameIndex
QCOMPARE( fields.indexFromName( "testfieldAlias" ), -1 );
- QCOMPARE( fields.fieldNameIndex( "testfieldAlias" ), 0 );
- QCOMPARE( fields.fieldNameIndex( "testfieldalias" ), 0 );
+ QCOMPARE( fields.lookupField( "testfieldAlias" ), 0 );
+ QCOMPARE( fields.lookupField( "testfieldalias" ), 0 );
}
void TestQgsFields::toList()
diff --git a/tests/src/core/testqgsrulebasedrenderer.cpp b/tests/src/core/testqgsrulebasedrenderer.cpp
index c8b4267d585..3ba0a43f3ae 100644
--- a/tests/src/core/testqgsrulebasedrenderer.cpp
+++ b/tests/src/core/testqgsrulebasedrenderer.cpp
@@ -67,7 +67,7 @@ class TestQgsRuleBasedRenderer: public QObject
{
// prepare features
QgsVectorLayer* layer = new QgsVectorLayer( "point?field=fld:int", "x", "memory" );
- int idx = layer->fieldNameIndex( "fld" );
+ int idx = layer->fields().indexFromName( "fld" );
QVERIFY( idx != -1 );
QgsFeature f1;
f1.initAttributes( 1 );
diff --git a/tests/src/core/testqgsvectorlayerjoinbuffer.cpp b/tests/src/core/testqgsvectorlayerjoinbuffer.cpp
index 0a4b86aa7d9..a8821edcaa0 100644
--- a/tests/src/core/testqgsvectorlayerjoinbuffer.cpp
+++ b/tests/src/core/testqgsvectorlayerjoinbuffer.cpp
@@ -520,7 +520,7 @@ void TestVectorLayerJoinBuffer::testJoinLayerDefinitionFile()
QCOMPARE( vLayer->vectorJoins().count(), 1 );
// Check for joined field
- QVERIFY( vLayer->fieldNameIndex( joinInfo.prefix + "value" ) >= 0 );
+ QVERIFY( vLayer->fields().lookupField( joinInfo.prefix + "value" ) >= 0 );
}
void TestVectorLayerJoinBuffer::testCacheUpdate_data()