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 \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()