Skip to content

Commit

Permalink
Add method to get list of supported related table types for a connection
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Dec 1, 2022
1 parent 006c3c0 commit 1089346
Show file tree
Hide file tree
Showing 6 changed files with 80 additions and 1 deletion.
Expand Up @@ -881,6 +881,18 @@ Returns a list of relationship strengths which are supported by the provider.
%Docstring
Returns the relationship capabilities supported by the provider.

.. versionadded:: 3.30
%End

virtual QStringList relatedTableTypes() const;
%Docstring
Returns a list of the related table types supported by the database format.

The related table type is a free-form string representing the type of related features, where the
exact interpretation is format dependent. For instance, table types from GeoPackage
relationships will directly reflect the categories from the GeoPackage related
tables extension (i.e. "media", "simple attributes", "features", "attributes" and "tiles").

.. versionadded:: 3.30
%End

Expand Down
34 changes: 34 additions & 0 deletions src/core/providers/ogr/qgsogrproviderconnection.cpp
Expand Up @@ -592,6 +592,35 @@ void QgsOgrProviderConnection::setDefaultCapabilities()
{
Qgis::SqlLayerDefinitionCapability::SubsetStringFilter,
};

#if GDAL_VERSION_NUM >= GDAL_COMPUTE_VERSION(3,7,0)
if ( const char *pszRelatedTableTypes = GDALGetMetadataItem( hDriver, GDAL_DMD_RELATIONSHIP_RELATED_TABLE_TYPES, nullptr ) )
{
char **papszTokens = CSLTokenizeString2( pszRelatedTableTypes, " ", 0 );
mRelatedTableTypes = QgsOgrUtils::cStringListToQStringList( papszTokens );
CSLDestroy( papszTokens );
}
#else
if ( mDriverName == QLatin1String( "OpenFileGDB" ) )
{
mRelatedTableTypes = QStringList
{
QStringLiteral( "media" ),
QStringLiteral( "features" )
};
}
else if ( mDriverName == QLatin1String( "GPKG" ) )
{
mRelatedTableTypes = QStringList
{
QStringLiteral( "media" ),
QStringLiteral( "simple_attributes" ),
QStringLiteral( "features" ),
QStringLiteral( "attributes" ),
QStringLiteral( "tiles" )
};
}
#endif
}

QString QgsOgrProviderConnection::databaseQueryLogIdentifier() const
Expand Down Expand Up @@ -1015,6 +1044,11 @@ Qgis::RelationshipCapabilities QgsOgrProviderConnection::supportedRelationshipCa
return mRelationshipCapabilities;
}

QStringList QgsOgrProviderConnection::relatedTableTypes() const
{
return mRelatedTableTypes;
}

QList<QgsWeakRelation> QgsOgrProviderConnection::relationships( const QString &schema, const QString &tableName ) const
{
checkCapability( Capability::RetrieveRelationships );
Expand Down
3 changes: 2 additions & 1 deletion src/core/providers/ogr/qgsogrproviderconnection.h
Expand Up @@ -93,6 +93,7 @@ class QgsOgrProviderConnection : public QgsAbstractDatabaseProviderConnection
QList< Qgis::RelationshipCardinality > supportedRelationshipCardinalities() const override;
QList< Qgis::RelationshipStrength > supportedRelationshipStrengths() const override;
Qgis::RelationshipCapabilities supportedRelationshipCapabilities() const override;
QStringList relatedTableTypes() const override;
QList< QgsWeakRelation > relationships( const QString &schema = QString(), const QString &tableName = QString() ) const override;
void addRelationship( const QgsWeakRelation &relationship ) const override;
void updateRelationship( const QgsWeakRelation &relationship ) const override;
Expand All @@ -115,7 +116,7 @@ class QgsOgrProviderConnection : public QgsAbstractDatabaseProviderConnection
QList< Qgis::RelationshipCardinality > mSupportedRelationshipCardinality;
QList< Qgis::RelationshipStrength > mSupportedRelationshipStrength;
Qgis::RelationshipCapabilities mRelationshipCapabilities;

QStringList mRelatedTableTypes;
};


Expand Down
5 changes: 5 additions & 0 deletions src/core/providers/qgsabstractdatabaseproviderconnection.cpp
Expand Up @@ -1040,6 +1040,11 @@ Qgis::RelationshipCapabilities QgsAbstractDatabaseProviderConnection::supportedR
return Qgis::RelationshipCapabilities();
}

QStringList QgsAbstractDatabaseProviderConnection::relatedTableTypes() const
{
return {};
}

QgsProviderSqlQueryBuilder *QgsAbstractDatabaseProviderConnection::queryBuilder() const
{
return new QgsProviderSqlQueryBuilder();
Expand Down
12 changes: 12 additions & 0 deletions src/core/providers/qgsabstractdatabaseproviderconnection.h
Expand Up @@ -1001,6 +1001,18 @@ class CORE_EXPORT QgsAbstractDatabaseProviderConnection : public QgsAbstractProv
*/
virtual Qgis::RelationshipCapabilities supportedRelationshipCapabilities() const;

/**
* Returns a list of the related table types supported by the database format.
*
* The related table type is a free-form string representing the type of related features, where the
* exact interpretation is format dependent. For instance, table types from GeoPackage
* relationships will directly reflect the categories from the GeoPackage related
* tables extension (i.e. "media", "simple attributes", "features", "attributes" and "tiles").
*
* \since QGIS 3.30
*/
virtual QStringList relatedTableTypes() const;

/**
* Returns a list of relationships detected in the database.
*
Expand Down
15 changes: 15 additions & 0 deletions tests/src/python/test_provider_ogr.py
Expand Up @@ -2829,6 +2829,21 @@ def test_provider_connection_illegal_fields(self):
'IS', 'GROUP', 'COLUMN', 'DELETE', 'VALUES', 'IN', 'NOT', 'BY', 'OR',
'INTO', 'AND', 'SET'})

def test_provider_related_table_types(self):
"""
Test retrieving related table types
"""
metadata = QgsProviderRegistry.instance().providerMetadata('ogr')
# GDB
conn = metadata.createConnection(TEST_DATA_DIR + '/' + 'relationships.gdb', {})
self.assertCountEqual(conn.relatedTableTypes(), ['media', 'features'])
# GPKG
conn = metadata.createConnection(TEST_DATA_DIR + '/' + 'domains.gpkg', {})
self.assertCountEqual(conn.relatedTableTypes(), ['media', 'features', 'simple_attributes', 'attributes', 'tiles'])
# other (not supported)
conn = metadata.createConnection(TEST_DATA_DIR + '/' + 'lines.shp', {})
self.assertEqual(conn.relatedTableTypes(), [])

@unittest.skipIf(int(gdal.VersionInfo('VERSION_NUM')) < GDAL_COMPUTE_VERSION(3, 6, 0), "GDAL 3.6 required")
def test_provider_relationship_capabilities(self):
"""
Expand Down

0 comments on commit 1089346

Please sign in to comment.