Skip to content

Commit

Permalink
Trust layer metadata propagation
Browse files Browse the repository at this point in the history
The trust flag at the projetc level is only used to read vector layer extent from xml, not from provider.

This flag was not available at the vector layer and data provider level.

We propose a new QgsMapLayer reading flag to propagate the trust layer metadata prohect's read flag an d a new provider options to trust datasource config.
Trusting the datasource config means that the provider can use estimated metadata, the primary key is unique and the detectable geometry type and srid are the same as the requested.
  • Loading branch information
rldhont committed Sep 9, 2020
1 parent 3f4c632 commit 45e9ecb
Show file tree
Hide file tree
Showing 74 changed files with 333 additions and 176 deletions.
4 changes: 3 additions & 1 deletion python/core/auto_generated/mesh/qgsmeshdataprovider.sip.in
Expand Up @@ -393,7 +393,9 @@ Responsible for reading native mesh data
#include "qgsmeshdataprovider.h"
%End
public:
QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );
QgsMeshDataProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
%Docstring
Ctor
%End
Expand Down
18 changes: 16 additions & 2 deletions python/core/auto_generated/qgsdataprovider.sip.in
Expand Up @@ -61,14 +61,25 @@ Abstract base class for spatial data provider implementations.

struct ProviderOptions
{

QgsCoordinateTransformContext transformContext;

};

enum ReadFlag
{
FlagTrustDataSource,
};
typedef QFlags<QgsDataProvider::ReadFlag> ReadFlags;


QgsDataProvider( const QString &uri = QString(), const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
QgsDataProvider( const QString &uri = QString(),
const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions(),
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
%Docstring
Create a new dataprovider with the specified in the ``uri``.

Additional creation options are specified within the ``options`` value.
Additional creation options are specified within the ``options`` value and since QGIS 3.16 creation flags are specified within the ``flags`` value.
%End

virtual QgsCoordinateReferenceSystem crs() const = 0;
Expand Down Expand Up @@ -477,8 +488,11 @@ Add error message
Sets error message
%End


};

QFlags<QgsDataProvider::ReadFlag> operator|(QgsDataProvider::ReadFlag f1, QFlags<QgsDataProvider::ReadFlag> f2);


/************************************************************************
* This file has been generated automatically from *
Expand Down
1 change: 1 addition & 0 deletions python/core/auto_generated/qgsmaplayer.sip.in
Expand Up @@ -537,6 +537,7 @@ or layer with temporary data (as temporary mesh layer dataset)
enum ReadFlag
{
FlagDontResolveLayers,
FlagTrustLayerMetadata,
};
typedef QFlags<QgsMapLayer::ReadFlag> ReadFlags;

Expand Down
8 changes: 7 additions & 1 deletion python/core/auto_generated/qgsprovidermetadata.sip.in
Expand Up @@ -180,10 +180,16 @@ Builds the list of available mesh drivers metadata
.. versionadded:: 3.12
%End

virtual QgsDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options ) /Factory/;
virtual QgsDataProvider *createProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &options,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) /Factory/;
%Docstring
Class factory to return a pointer to a newly created QgsDataProvider object

:param uri: the datasource uri
:param options: creation options
:param flags: creation flags, sing QGIS 3.16

.. versionadded:: 3.10
%End

Expand Down
4 changes: 3 additions & 1 deletion python/core/auto_generated/qgsproviderregistry.sip.in
Expand Up @@ -78,13 +78,15 @@ Sets library directory where to search for plugins

QgsDataProvider *createProvider( const QString &providerKey,
const QString &dataSource,
const QgsDataProvider::ProviderOptions &options = QgsDataProvider::ProviderOptions() ) /Factory/;
const QgsDataProvider::ProviderOptions &options = QgsDataProvider::ProviderOptions(),
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) /Factory/;
%Docstring
Creates a new instance of a provider.

:param providerKey: identifier of the provider
:param dataSource: string containing data source for the provider
:param options: provider options
:param flags: provider flags since QGIS 3.16

:return: new instance of provider or ``None`` on error

Expand Down
6 changes: 4 additions & 2 deletions python/core/auto_generated/qgsvectordataprovider.sip.in
Expand Up @@ -68,13 +68,15 @@ of feature and attribute information from a spatial datasource.
UnknownCount,
};

QgsVectorDataProvider( const QString &uri = QString(), const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
QgsVectorDataProvider( const QString &uri = QString(),
const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions(),
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
%Docstring
Constructor for a vector data provider.

The ``uri`` argument specifies the uniform resource locator (URI) for the associated dataset.

Additional creation options are specified within the ``options`` value.
Additional creation options are specified within the ``options`` value and since QGIS 3.16 creation flags are specified within the ``flags`` value.
%End

virtual QgsAbstractFeatureSource *featureSource() const = 0 /Factory/;
Expand Down
Expand Up @@ -84,14 +84,16 @@ Base class for raster data providers.

QgsRasterDataProvider();

QgsRasterDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions() );
QgsRasterDataProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &providerOptions = QgsDataProvider::ProviderOptions(),
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
%Docstring
Constructor for QgsRasterDataProvider.

The ``uri`` argument gives a provider-specific uri indicating the underlying data
source and it's parameters.

The ``options`` argument specifies generic provider options.
The ``options`` argument specifies generic provider options and since QGIS 3.16 creation flags are specified within the ``flags`` value.
%End

virtual QgsRasterInterface *clone() const = 0;
Expand Down
3 changes: 2 additions & 1 deletion python/core/auto_generated/raster/qgsrasterlayer.sip.in
Expand Up @@ -141,12 +141,13 @@ Set the data provider.
Use the version with ProviderOptions instead.
%End

void setDataProvider( const QString &provider, const QgsDataProvider::ProviderOptions &options );
void setDataProvider( const QString &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );
%Docstring
Set the data provider.

:param provider: provider key string, must match a valid QgsRasterDataProvider key. E.g. "gdal", "wms", etc.
:param options: provider options
:param flags: provider flags since QGIS 3.16

.. versionadded:: 3.2
%End
Expand Down
5 changes: 3 additions & 2 deletions src/core/mesh/qgsmeshdataprovider.cpp
Expand Up @@ -20,8 +20,9 @@
#include "qgsmeshdataprovidertemporalcapabilities.h"
#include "qgsrectangle.h"

QgsMeshDataProvider::QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options )
: QgsDataProvider( uri, options )
QgsMeshDataProvider::QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
: QgsDataProvider( uri, options, flags )
{
}

Expand Down
4 changes: 3 additions & 1 deletion src/core/mesh/qgsmeshdataprovider.h
Expand Up @@ -399,7 +399,9 @@ class CORE_EXPORT QgsMeshDataProvider: public QgsDataProvider, public QgsMeshDat
Q_OBJECT
public:
//! Ctor
QgsMeshDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );
QgsMeshDataProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

QgsMeshDataProviderTemporalCapabilities *temporalCapabilities() override;
const QgsMeshDataProviderTemporalCapabilities *temporalCapabilities() const override SIP_SKIP;
Expand Down
18 changes: 14 additions & 4 deletions src/core/mesh/qgsmeshlayer.cpp
Expand Up @@ -54,7 +54,12 @@ QgsMeshLayer::QgsMeshLayer( const QString &meshLayerPath,
if ( !meshLayerPath.isEmpty() && !providerKey.isEmpty() )
{
QgsDataProvider::ProviderOptions providerOptions { options.transformContext };
ok = setDataProvider( providerKey, providerOptions );
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags();
if ( mReadFlags & QgsMapLayer::FlagTrustLayerMetadata )
{
flags |= QgsDataProvider::FlagTrustDataSource;
}
ok = setDataProvider( providerKey, providerOptions, flags );
}

if ( ok )
Expand Down Expand Up @@ -1111,7 +1116,12 @@ bool QgsMeshLayer::readXml( const QDomNode &layer_node, QgsReadWriteContext &con
}

QgsDataProvider::ProviderOptions providerOptions;
if ( !setDataProvider( mProviderKey, providerOptions ) )
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags();
if ( mReadFlags & QgsMapLayer::FlagTrustLayerMetadata )
{
flags |= QgsDataProvider::FlagTrustDataSource;
}
if ( !setDataProvider( mProviderKey, providerOptions, flags ) )
{
return false;
}
Expand Down Expand Up @@ -1242,14 +1252,14 @@ QStringList QgsMeshLayer::subLayers() const
}


bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options )
bool QgsMeshLayer::setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
delete mDataProvider;

mProviderKey = provider;
QString dataSource = mDataSource;

mDataProvider = qobject_cast<QgsMeshDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, dataSource, options ) );
mDataProvider = qobject_cast<QgsMeshDataProvider *>( QgsProviderRegistry::instance()->createProvider( provider, dataSource, options, flags ) );
if ( !mDataProvider )
{
QgsDebugMsgLevel( QStringLiteral( "Unable to get mesh data provider" ), 2 );
Expand Down
3 changes: 2 additions & 1 deletion src/core/mesh/qgsmeshlayer.h
Expand Up @@ -721,8 +721,9 @@ class CORE_EXPORT QgsMeshLayer : public QgsMapLayer
* Binds layer to a specific data provider
* \param provider provider key string, must match a valid QgsMeshDataProvider key. E.g. "mesh_memory", etc.
* \param options generic provider options
* \param flags provider flags since QGIS 3.16
*/
bool setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options );
bool setDataProvider( QString const &provider, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

#ifdef SIP_RUN
QgsMeshLayer( const QgsMeshLayer &rhs );
Expand Down
4 changes: 2 additions & 2 deletions src/core/providers/gdal/qgsgdalprovider.cpp
Expand Up @@ -2351,9 +2351,9 @@ QString QgsGdalProviderMetadata::encodeUri( const QVariantMap &parts )
}


QgsGdalProvider *QgsGdalProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options )
QgsGdalProvider *QgsGdalProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags )
{
return new QgsGdalProvider( uri, options );
return new QgsGdalProvider( uri, options, flags );
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/gdal/qgsgdalprovider.h
Expand Up @@ -367,7 +367,7 @@ class QgsGdalProviderMetadata final: public QgsProviderMetadata
QgsGdalProviderMetadata();
QVariantMap decodeUri( const QString &uri ) override;
QString encodeUri( const QVariantMap &parts ) override;
QgsGdalProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options ) override;
QgsGdalProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QgsGdalProvider *createRasterDataProvider(
const QString &uri,
const QString &format,
Expand Down
10 changes: 6 additions & 4 deletions src/core/providers/memory/qgsmemoryprovider.cpp
Expand Up @@ -32,8 +32,8 @@
#define TEXT_PROVIDER_KEY QStringLiteral( "memory" )
#define TEXT_PROVIDER_DESCRIPTION QStringLiteral( "Memory provider" )

QgsMemoryProvider::QgsMemoryProvider( const QString &uri, const ProviderOptions &options )
: QgsVectorDataProvider( uri, options )
QgsMemoryProvider::QgsMemoryProvider( const QString &uri, const ProviderOptions &options, QgsDataProvider::ReadFlags flags )
: QgsVectorDataProvider( uri, options, flags )
{
// Initialize the geometry with the uri to support old style uri's
// (ie, just 'point', 'line', 'polygon')
Expand Down Expand Up @@ -227,9 +227,11 @@ QString QgsMemoryProvider::providerDescription()
return TEXT_PROVIDER_DESCRIPTION;
}

QgsMemoryProvider *QgsMemoryProvider::createProvider( const QString &uri, const ProviderOptions &options )
QgsMemoryProvider *QgsMemoryProvider::createProvider( const QString &uri,
const ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
{
return new QgsMemoryProvider( uri, options );
return new QgsMemoryProvider( uri, options, flags );
}

QgsAbstractFeatureSource *QgsMemoryProvider::featureSource() const
Expand Down
6 changes: 4 additions & 2 deletions src/core/providers/memory/qgsmemoryprovider.h
Expand Up @@ -31,7 +31,8 @@ class QgsMemoryProvider final: public QgsVectorDataProvider
Q_OBJECT

public:
explicit QgsMemoryProvider( const QString &uri, const QgsVectorDataProvider::ProviderOptions &coordinateTransformContext );
explicit QgsMemoryProvider( const QString &uri, const QgsVectorDataProvider::ProviderOptions &coordinateTransformContext,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

~QgsMemoryProvider() override;

Expand All @@ -44,7 +45,8 @@ class QgsMemoryProvider final: public QgsVectorDataProvider
* Creates a new memory provider, with provider properties embedded within the given \a uri and \a options
* argument.
*/
static QgsMemoryProvider *createProvider( const QString &uri, const QgsVectorDataProvider::ProviderOptions &coordinateTransformContext );
static QgsMemoryProvider *createProvider( const QString &uri, const QgsVectorDataProvider::ProviderOptions &coordinateTransformContext,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

/* Implementation of functions from QgsVectorDataProvider */

Expand Down
12 changes: 8 additions & 4 deletions src/core/providers/meshmemory/qgsmeshmemorydataprovider.cpp
Expand Up @@ -45,8 +45,10 @@ QgsCoordinateReferenceSystem QgsMeshMemoryDataProvider::crs() const
return QgsCoordinateReferenceSystem();
}

QgsMeshMemoryDataProvider::QgsMeshMemoryDataProvider( const QString &uri, const ProviderOptions &options )
: QgsMeshDataProvider( uri, options )
QgsMeshMemoryDataProvider::QgsMeshMemoryDataProvider( const QString &uri,
const ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
: QgsMeshDataProvider( uri, options, flags )
{
QString data( uri );
// see QgsMeshLayer::setDataProvider how mDataSource is created for memory layers
Expand All @@ -69,9 +71,11 @@ QString QgsMeshMemoryDataProvider::providerDescription()
return TEXT_PROVIDER_DESCRIPTION;
}

QgsMeshMemoryDataProvider *QgsMeshMemoryDataProvider::createProvider( const QString &uri, const ProviderOptions &options )
QgsMeshMemoryDataProvider *QgsMeshMemoryDataProvider::createProvider( const QString &uri,
const ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
{
return new QgsMeshMemoryDataProvider( uri, options );
return new QgsMeshMemoryDataProvider( uri, options, flags );
}

bool QgsMeshMemoryDataProvider::splitMeshSections( const QString &uri )
Expand Down
7 changes: 5 additions & 2 deletions src/core/providers/meshmemory/qgsmeshmemorydataprovider.h
Expand Up @@ -83,7 +83,8 @@ class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider
* );
* \endcode
*/
QgsMeshMemoryDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );
QgsMeshMemoryDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

bool isValid() const override;
QString name() const override;
Expand Down Expand Up @@ -157,7 +158,9 @@ class CORE_EXPORT QgsMeshMemoryDataProvider final: public QgsMeshDataProvider
//! Returns the memory provider description
static QString providerDescription();
//! Provider factory
static QgsMeshMemoryDataProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions );
static QgsMeshMemoryDataProvider *createProvider( const QString &uri,
const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

private:
QgsRectangle calculateExtent( ) const;
Expand Down
9 changes: 5 additions & 4 deletions src/core/providers/ogr/qgsogrprovider.cpp
Expand Up @@ -482,8 +482,8 @@ QgsVectorLayerExporter::ExportError QgsOgrProvider::createEmptyLayer( const QStr
return QgsVectorLayerExporter::NoError;
}

QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &options )
: QgsVectorDataProvider( uri, options )
QgsOgrProvider::QgsOgrProvider( QString const &uri, const ProviderOptions &options, QgsDataProvider::ReadFlags flags )
: QgsVectorDataProvider( uri, options, flags )
{
QgsApplication::registerOgrDrivers();

Expand Down Expand Up @@ -3564,9 +3564,10 @@ QStringList QgsOgrProviderUtils::wildcards()
* Class factory to return a pointer to a newly created
* QgsOgrProvider object
*/
QgsOgrProvider *QgsOgrProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options )
QgsOgrProvider *QgsOgrProviderMetadata::createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options,
QgsDataProvider::ReadFlags flags )
{
return new QgsOgrProvider( uri, options );
return new QgsOgrProvider( uri, options, flags );
}

/**
Expand Down
5 changes: 3 additions & 2 deletions src/core/providers/ogr/qgsogrprovider.h
Expand Up @@ -86,7 +86,8 @@ class QgsOgrProvider final: public QgsVectorDataProvider
* \param options generic data provider options
*/
explicit QgsOgrProvider( QString const &uri,
const QgsDataProvider::ProviderOptions &providerOptions );
const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() );

~QgsOgrProvider() override;

Expand Down Expand Up @@ -742,7 +743,7 @@ class QgsOgrProviderMetadata final: public QgsProviderMetadata
void initProvider() override;
void cleanupProvider() override;
QList< QgsDataItemProvider * > dataItemProviders() const override;
QgsOgrProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options ) override;
QgsOgrProvider *createProvider( const QString &uri, const QgsDataProvider::ProviderOptions &options, QgsDataProvider::ReadFlags flags = QgsDataProvider::ReadFlags() ) override;
QVariantMap decodeUri( const QString &uri ) override;
QString encodeUri( const QVariantMap &parts ) override;
QString filters( FilterType type ) override;
Expand Down
4 changes: 3 additions & 1 deletion src/core/qgsdataprovider.cpp
Expand Up @@ -19,10 +19,12 @@

#define SUBLAYER_SEPARATOR QStringLiteral( "!!::!!" )

QgsDataProvider::QgsDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions )
QgsDataProvider::QgsDataProvider( const QString &uri, const QgsDataProvider::ProviderOptions &providerOptions,
QgsDataProvider::ReadFlags flags )
: mDataSourceURI( uri ),
mOptions( providerOptions )
{
mReadFlags = flags;
}

QgsDataProviderTemporalCapabilities *QgsDataProvider::temporalCapabilities()
Expand Down

0 comments on commit 45e9ecb

Please sign in to comment.