Also show a relationships item when expanding out tables for

tables which form the parent side of a relationship
This commit is contained in:
Nyall Dawson 2022-08-01 10:46:57 +10:00
parent 622562f6c0
commit 7275fb2033
6 changed files with 73 additions and 8 deletions

View File

@ -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
};

View File

@ -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 )
{

View File

@ -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 );
};

View File

@ -70,6 +70,29 @@ QVector<QgsDataItem *> QgsProviderSublayerItem::createChildren()
path() + QStringLiteral( "/columns/ " ),
path(),
QStringLiteral( "ogr" ), QString(), name() ) );
std::unique_ptr<QgsAbstractDatabaseProviderConnection> 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;

View File

@ -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<QgsDataItem *> QgsRelationshipsItem::createChildren()
QList< QgsWeakRelation > relations;
try
{
relations = conn->relationships();
relations = conn->relationships( mSchema, mTableName );
}
catch ( QgsProviderConnectionException &ex )
{

View File

@ -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;
};