diff --git a/python/core/auto_generated/browser/qgsrelationshipsitem.sip.in b/python/core/auto_generated/browser/qgsrelationshipsitem.sip.in index c362e5a6492..81eb7e262f6 100644 --- a/python/core/auto_generated/browser/qgsrelationshipsitem.sip.in +++ b/python/core/auto_generated/browser/qgsrelationshipsitem.sip.in @@ -24,7 +24,9 @@ Contains a collection of relationship items. QgsRelationshipsItem( QgsDataItem *parent /TransferThis/, const QString &path, const QString &connectionUri, - const QString &providerKey ); + const QString &providerKey, + const QString &schema = QString(), + const QString &tableName = QString() ); %Docstring Constructor for QgsRelationshipsItem, with the specified ``parent`` item. @@ -33,6 +35,9 @@ but :py:class:`QgsDataItem` items pointing to different logical locations should The ``connectionUri`` argument is the connection part of the layer URI that it is used internally to create a connection and retrieve fields information. The ``providerKey`` string can be used to specify the key for the :py:class:`QgsDataItemProvider` that created this item. + +The optional ``schema`` and ``tableName`` arguments can be used to restrict the visible relationships to +those with a matching parent table. %End ~QgsRelationshipsItem(); @@ -52,6 +57,20 @@ The ``providerKey`` string can be used to specify the key for the :py:class:`Qgs QString connectionUri() const; %Docstring Returns the connection URI +%End + + QString schema() const; +%Docstring +Returns the schema for filtering relationships, if set. + +.. seealso:: :py:func:`tableName` +%End + + QString tableName() const; +%Docstring +Returns the table name for filtering relationships, if set. + +.. seealso:: :py:func:`schema` %End }; diff --git a/src/app/browser/qgsinbuiltdataitemproviders.cpp b/src/app/browser/qgsinbuiltdataitemproviders.cpp index b9a84096715..a949c02cb5f 100644 --- a/src/app/browser/qgsinbuiltdataitemproviders.cpp +++ b/src/app/browser/qgsinbuiltdataitemproviders.cpp @@ -2292,7 +2292,7 @@ QWidget *QgsRelationshipItemGuiProvider::createParamWidget( QgsDataItem *item, Q } else if ( QgsRelationshipsItem *relationsItem = qobject_cast< QgsRelationshipsItem * >( item ) ) { - return new QgsRelationshipsDetailsWidget( nullptr, relationsItem->providerKey(), relationsItem->connectionUri() ); + return new QgsRelationshipsDetailsWidget( nullptr, relationsItem->providerKey(), relationsItem->connectionUri(), relationsItem->schema(), relationsItem->tableName() ); } else { @@ -2399,7 +2399,7 @@ QgsRelationshipDetailsWidget::~QgsRelationshipDetailsWidget() = default; // QgsRelationshipsDetailsWidget // -QgsRelationshipsDetailsWidget::QgsRelationshipsDetailsWidget( QWidget *parent, const QString &providerKey, const QString &uri ) +QgsRelationshipsDetailsWidget::QgsRelationshipsDetailsWidget( QWidget *parent, const QString &providerKey, const QString &uri, const QString &schema, const QString &tableName ) : QWidget( parent ) { setupUi( this ); @@ -2419,7 +2419,7 @@ QgsRelationshipsDetailsWidget::QgsRelationshipsDetailsWidget( QWidget *parent, c QList< QgsWeakRelation > relationships; try { - relationships = conn->relationships(); + relationships = conn->relationships( schema, tableName ); } catch ( QgsProviderConnectionException &ex ) { diff --git a/src/app/browser/qgsinbuiltdataitemproviders.h b/src/app/browser/qgsinbuiltdataitemproviders.h index bff964e7d0c..e8c7338e8f2 100644 --- a/src/app/browser/qgsinbuiltdataitemproviders.h +++ b/src/app/browser/qgsinbuiltdataitemproviders.h @@ -256,7 +256,7 @@ class QgsRelationshipsDetailsWidget : public QWidget, private Ui_QgsBrowserItemM public: - QgsRelationshipsDetailsWidget( QWidget *parent, const QString &providerKey, const QString &uri ); + QgsRelationshipsDetailsWidget( QWidget *parent, const QString &providerKey, const QString &uri, const QString &schema, const QString &tableName ); }; diff --git a/src/core/browser/qgsfilebaseddataitemprovider.cpp b/src/core/browser/qgsfilebaseddataitemprovider.cpp index 34897399bda..8b647d2e138 100644 --- a/src/core/browser/qgsfilebaseddataitemprovider.cpp +++ b/src/core/browser/qgsfilebaseddataitemprovider.cpp @@ -70,6 +70,29 @@ QVector QgsProviderSublayerItem::createChildren() path() + QStringLiteral( "/columns/ " ), path(), QStringLiteral( "ogr" ), QString(), name() ) ); + + std::unique_ptr conn( databaseConnection() ); + if ( conn && ( conn->capabilities() & QgsAbstractDatabaseProviderConnection::Capability::RetrieveRelationships ) ) + { + QString relationError; + QList< QgsWeakRelation > relations; + try + { + relations = conn->relationships( QString(), mDetails.name() ); + } + catch ( QgsProviderConnectionException &ex ) + { + relationError = ex.what(); + } + + if ( !relations.empty() || !relationError.isEmpty() ) + { + std::unique_ptr< QgsRelationshipsItem > relationsItem = std::make_unique< QgsRelationshipsItem >( this, mPath + "/relations", conn->uri(), QStringLiteral( "ogr" ), QString(), mDetails.name() ); + // force this item to appear last by setting a maximum string value for the sort key + relationsItem->setSortKey( QString( QChar( 0x11FFFF ) ) ); + children.append( relationsItem.release() ); + } + } } } return children; diff --git a/src/core/browser/qgsrelationshipsitem.cpp b/src/core/browser/qgsrelationshipsitem.cpp index 5451bea0443..3f8eb1c5e8b 100644 --- a/src/core/browser/qgsrelationshipsitem.cpp +++ b/src/core/browser/qgsrelationshipsitem.cpp @@ -25,9 +25,11 @@ QgsRelationshipsItem::QgsRelationshipsItem( QgsDataItem *parent, const QString &path, const QString &connectionUri, - const QString &providerKey ) + const QString &providerKey, const QString &schema, const QString &tableName ) : QgsDataItem( Qgis::BrowserItemType::Custom, parent, tr( "Relationships" ), path, providerKey ) , mConnectionUri( connectionUri ) + , mSchema( schema ) + , mTableName( tableName ) { mCapabilities |= ( Qgis::BrowserItemCapability::Fertile | Qgis::BrowserItemCapability::Collapse | Qgis::BrowserItemCapability::RefreshChildrenWhenItemIsRefreshed ); } @@ -49,7 +51,7 @@ QVector QgsRelationshipsItem::createChildren() QList< QgsWeakRelation > relations; try { - relations = conn->relationships(); + relations = conn->relationships( mSchema, mTableName ); } catch ( QgsProviderConnectionException &ex ) { diff --git a/src/core/browser/qgsrelationshipsitem.h b/src/core/browser/qgsrelationshipsitem.h index 5497ad59524..9ad401a5dbe 100644 --- a/src/core/browser/qgsrelationshipsitem.h +++ b/src/core/browser/qgsrelationshipsitem.h @@ -41,11 +41,16 @@ class CORE_EXPORT QgsRelationshipsItem : public QgsDataItem * The \a connectionUri argument is the connection part of the layer URI that it is used internally to create * a connection and retrieve fields information. * The \a providerKey string can be used to specify the key for the QgsDataItemProvider that created this item. + * + * The optional \a schema and \a tableName arguments can be used to restrict the visible relationships to + * those with a matching parent table. */ QgsRelationshipsItem( QgsDataItem *parent SIP_TRANSFERTHIS, const QString &path, const QString &connectionUri, - const QString &providerKey ); + const QString &providerKey, + const QString &schema = QString(), + const QString &tableName = QString() ); ~QgsRelationshipsItem() override; @@ -66,9 +71,25 @@ class CORE_EXPORT QgsRelationshipsItem : public QgsDataItem */ QString connectionUri() const; + /** + * Returns the schema for filtering relationships, if set. + * + * \see tableName() + */ + QString schema() const { return mSchema; } + + /** + * Returns the table name for filtering relationships, if set. + * + * \see schema() + */ + QString tableName() const {return mTableName;} + private: QString mConnectionUri; + QString mSchema; + QString mTableName; QStringList mRelationshipNames; };