mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-18 00:06:00 -04:00
[processing] Add method to encode and decode a combined provider key and uri
to a single string We need this to allow processing inputs to load non gdal/ogr/mdal sources, such as being able to directly read postgis layers without loading them into a project first
This commit is contained in:
parent
4b197dac31
commit
320fecce00
@ -90,6 +90,28 @@ value.
|
|||||||
.. seealso:: :py:func:`compatibleRasterLayers`
|
.. seealso:: :py:func:`compatibleRasterLayers`
|
||||||
|
|
||||||
.. seealso:: :py:func:`compatibleVectorLayers`
|
.. seealso:: :py:func:`compatibleVectorLayers`
|
||||||
|
%End
|
||||||
|
|
||||||
|
static QString encodeProviderKeyAndUri( const QString &providerKey, const QString &uri );
|
||||||
|
%Docstring
|
||||||
|
Encodes a provider key and layer ``uri`` to a single string, for use with
|
||||||
|
decodeProviderKeyAndUri()
|
||||||
|
|
||||||
|
.. versionadded:: 3.14
|
||||||
|
%End
|
||||||
|
|
||||||
|
static bool decodeProviderKeyAndUri( const QString &string, QString &providerKey /Out/, QString &uri /Out/ );
|
||||||
|
%Docstring
|
||||||
|
Decodes a provider key and layer ``uri`` from an encoded string, for use with
|
||||||
|
encodeProviderKeyAndUri()
|
||||||
|
|
||||||
|
:param string: encoded string, as returned by encodeProviderKeyAndUri()
|
||||||
|
:param uri: decoded layer uri
|
||||||
|
|
||||||
|
:return: - ``True`` if ``string`` was successfully decoded
|
||||||
|
- providerKey: ID key for corresponding data provider
|
||||||
|
|
||||||
|
.. versionadded:: 3.14
|
||||||
%End
|
%End
|
||||||
|
|
||||||
enum class LayerHint
|
enum class LayerHint
|
||||||
|
@ -133,6 +133,25 @@ QList<QgsMapLayer *> QgsProcessingUtils::compatibleLayers( QgsProject *project,
|
|||||||
return layers;
|
return layers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString QgsProcessingUtils::encodeProviderKeyAndUri( const QString &providerKey, const QString &uri )
|
||||||
|
{
|
||||||
|
return QStringLiteral( "%1://%2" ).arg( providerKey, uri );
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QgsProcessingUtils::decodeProviderKeyAndUri( const QString &string, QString &providerKey, QString &uri )
|
||||||
|
{
|
||||||
|
QRegularExpression re( QStringLiteral( "^(\\w+?):\\/\\/(.+)$" ) );
|
||||||
|
const QRegularExpressionMatch match = re.match( string );
|
||||||
|
if ( !match.hasMatch() )
|
||||||
|
return false;
|
||||||
|
|
||||||
|
providerKey = match.captured( 1 );
|
||||||
|
uri = match.captured( 2 );
|
||||||
|
|
||||||
|
// double check that provider is valid
|
||||||
|
return QgsProviderRegistry::instance()->providerMetadata( providerKey );
|
||||||
|
}
|
||||||
|
|
||||||
QgsMapLayer *QgsProcessingUtils::mapLayerFromStore( const QString &string, QgsMapLayerStore *store, QgsProcessingUtils::LayerHint typeHint )
|
QgsMapLayer *QgsProcessingUtils::mapLayerFromStore( const QString &string, QgsMapLayerStore *store, QgsProcessingUtils::LayerHint typeHint )
|
||||||
{
|
{
|
||||||
if ( !store || string.isEmpty() )
|
if ( !store || string.isEmpty() )
|
||||||
|
@ -105,6 +105,27 @@ class CORE_EXPORT QgsProcessingUtils
|
|||||||
*/
|
*/
|
||||||
static QList< QgsMapLayer * > compatibleLayers( QgsProject *project, bool sort = true );
|
static QList< QgsMapLayer * > compatibleLayers( QgsProject *project, bool sort = true );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encodes a provider key and layer \a uri to a single string, for use with
|
||||||
|
* decodeProviderKeyAndUri()
|
||||||
|
*
|
||||||
|
* \since QGIS 3.14
|
||||||
|
*/
|
||||||
|
static QString encodeProviderKeyAndUri( const QString &providerKey, const QString &uri );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decodes a provider key and layer \a uri from an encoded string, for use with
|
||||||
|
* encodeProviderKeyAndUri()
|
||||||
|
*
|
||||||
|
* \param string encoded string, as returned by encodeProviderKeyAndUri()
|
||||||
|
* \param providerKey ID key for corresponding data provider
|
||||||
|
* \param uri decoded layer uri
|
||||||
|
* \returns TRUE if \a string was successfully decoded
|
||||||
|
*
|
||||||
|
* \since QGIS 3.14
|
||||||
|
*/
|
||||||
|
static bool decodeProviderKeyAndUri( const QString &string, QString &providerKey SIP_OUT, QString &uri SIP_OUT );
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Layer type hints.
|
* Layer type hints.
|
||||||
* \since QGIS 3.4
|
* \since QGIS 3.4
|
||||||
|
@ -518,6 +518,7 @@ class TestQgsProcessing: public QObject
|
|||||||
void providerById();
|
void providerById();
|
||||||
void removeProvider();
|
void removeProvider();
|
||||||
void compatibleLayers();
|
void compatibleLayers();
|
||||||
|
void encodeDecodeUriProvider();
|
||||||
void normalizeLayerSource();
|
void normalizeLayerSource();
|
||||||
void context();
|
void context();
|
||||||
void mapLayers();
|
void mapLayers();
|
||||||
@ -860,6 +861,28 @@ void TestQgsProcessing::compatibleLayers()
|
|||||||
QCOMPARE( lIds, QStringList() << "R1" << "ar2" << "zz" << "V4" << "v1" << "v3" << "vvvv4" << "MX" << "mA" );
|
QCOMPARE( lIds, QStringList() << "R1" << "ar2" << "zz" << "V4" << "v1" << "v3" << "vvvv4" << "MX" << "mA" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void TestQgsProcessing::encodeDecodeUriProvider()
|
||||||
|
{
|
||||||
|
QString provider;
|
||||||
|
QString uri;
|
||||||
|
QCOMPARE( QgsProcessingUtils::encodeProviderKeyAndUri( QStringLiteral( "ogr" ), QStringLiteral( "/home/me/test.shp" ) ), QStringLiteral( "ogr:///home/me/test.shp" ) );
|
||||||
|
QVERIFY( QgsProcessingUtils::decodeProviderKeyAndUri( QStringLiteral( "ogr:///home/me/test.shp" ), provider, uri ) );
|
||||||
|
QCOMPARE( provider, QStringLiteral( "ogr" ) );
|
||||||
|
QCOMPARE( uri, QStringLiteral( "/home/me/test.shp" ) );
|
||||||
|
QCOMPARE( QgsProcessingUtils::encodeProviderKeyAndUri( QStringLiteral( "ogr" ), QStringLiteral( "http://mysourcem/a.json" ) ), QStringLiteral( "ogr://http://mysourcem/a.json" ) );
|
||||||
|
QVERIFY( QgsProcessingUtils::decodeProviderKeyAndUri( QStringLiteral( "ogr://http://mysourcem/a.json" ), provider, uri ) );
|
||||||
|
QCOMPARE( provider, QStringLiteral( "ogr" ) );
|
||||||
|
QCOMPARE( uri, QStringLiteral( "http://mysourcem/a.json" ) );
|
||||||
|
QCOMPARE( QgsProcessingUtils::encodeProviderKeyAndUri( QStringLiteral( "postgres" ), QStringLiteral( "host=blah blah etc" ) ), QStringLiteral( "postgres://host=blah blah etc" ) );
|
||||||
|
QVERIFY( QgsProcessingUtils::decodeProviderKeyAndUri( QStringLiteral( "postgres://host=blah blah etc" ), provider, uri ) );
|
||||||
|
QCOMPARE( provider, QStringLiteral( "postgres" ) );
|
||||||
|
QCOMPARE( uri, QStringLiteral( "host=blah blah etc" ) );
|
||||||
|
|
||||||
|
// should reject non valid providers
|
||||||
|
QVERIFY( !QgsProcessingUtils::decodeProviderKeyAndUri( QStringLiteral( "asdasda://host=blah blah etc" ), provider, uri ) );
|
||||||
|
QVERIFY( !QgsProcessingUtils::decodeProviderKeyAndUri( QStringLiteral( "http://mysourcem/a.json" ), provider, uri ) );
|
||||||
|
}
|
||||||
|
|
||||||
void TestQgsProcessing::normalizeLayerSource()
|
void TestQgsProcessing::normalizeLayerSource()
|
||||||
{
|
{
|
||||||
QCOMPARE( QgsProcessingUtils::normalizeLayerSource( "data\\layers\\test.shp" ), QString( "data/layers/test.shp" ) );
|
QCOMPARE( QgsProcessingUtils::normalizeLayerSource( "data\\layers\\test.shp" ), QString( "data/layers/test.shp" ) );
|
||||||
|
Loading…
x
Reference in New Issue
Block a user