17#include <QApplication>
26 const QString &referencingLayerId,
const QString &referencingLayerName,
const QString &referencingLayerSource,
const QString &referencingLayerProviderKey,
27 const QString &referencedLayerId,
const QString &referencedLayerName,
const QString &referencedLayerSource,
const QString &referencedLayerProviderKey )
28 : mReferencingLayer( referencingLayerId, referencingLayerName, referencingLayerSource, referencingLayerProviderKey )
29 , mReferencedLayer( referencedLayerId, referencedLayerName, referencedLayerSource, referencedLayerProviderKey )
30 , mRelationId( relationId )
31 , mRelationName( relationName )
32 , mStrength( strength )
38 QList< QgsRelation > res;
40 switch ( mCardinality )
48 relation.
setId( mRelationId );
49 relation.
setName( mRelationName );
64 for (
int i = 0 ; i < std::min( mReferencingLayerFields.size(), mReferencedLayerFields.size() ); ++i )
66 relation.
addFieldPair( mReferencingLayerFields.at( i ), mReferencedLayerFields.at( i ) );
69 res.push_back( relation );
77 relationLeft.
setId( mRelationId + QStringLiteral(
"_forward" ) );
78 relationLeft.
setName( mRelationName + QStringLiteral(
"_forward" ) );
94 for (
int i = 0 ; i < std::min( mMappingReferencedLayerFields.size(), mReferencedLayerFields.size() ); ++i )
96 relationLeft.
addFieldPair( mMappingReferencedLayerFields.at( i ), mReferencedLayerFields.at( i ) );
99 res.push_back( relationLeft );
102 relationRight.
setId( mRelationId + QStringLiteral(
"_backward" ) );
103 relationRight.
setName( mRelationName + QStringLiteral(
"_backward" ) );
117 for (
int i = 0 ; i < std::min( mMappingReferencingLayerFields.size(), mReferencingLayerFields.size() ); ++i )
119 relationRight.
addFieldPair( mMappingReferencingLayerFields.at( i ), mReferencingLayerFields.at( i ) );
122 res.push_back( relationRight );
132 return mReferencingLayer;
137 return mReferencingLayer.
source;
147 mReferencingLayer.
source = sourceUri;
148 mReferencingLayer.
provider = provider;
155 return metadata->decodeUri( mReferencingLayer.
source ).value( QStringLiteral(
"layerName" ) ).toString();
162 return mReferencedLayer;
167 return mReferencedLayer.
source;
179 return metadata->decodeUri( mReferencedLayer.
source ).value( QStringLiteral(
"layerName" ) ).toString();
186 mReferencedLayer.
source = sourceUri;
187 mReferencedLayer.
provider = provider;
192 return mMappingTable;
197 mMappingTable = table;
202 return mMappingTable.
source;
214 return metadata->decodeUri( mMappingTable.
source ).value( QStringLiteral(
"layerName" ) ).toString();
221 mMappingTable.
source = sourceUri;
232 QDomElement relationElement = node.toElement();
234 if ( relationElement.tagName() != QLatin1String(
"relation" ) )
236 QgsLogger::warning( QApplication::translate(
"QgsRelation",
"Cannot create relation. Unexpected tag '%1'" ).arg( relationElement.tagName() ) );
239 QStringList referencingFields;
240 QStringList referencedFields;
241 const QDomNodeList fieldPairNodes { relationElement.elementsByTagName( QStringLiteral(
"fieldRef" ) ) };
242 for (
int j = 0; j < fieldPairNodes.length(); ++j )
244 const QDomElement fieldPairElement = fieldPairNodes.at( j ).toElement();
245 referencingFields.push_back( fieldPairElement.attribute( QStringLiteral(
"referencingField" ) ) );
246 referencedFields.push_back( fieldPairElement.attribute( QStringLiteral(
"referencedField" ) ) );
253 QgsWeakRelation rel{ relationElement.attribute( QStringLiteral(
"id" ) ),
254 relationElement.attribute( QStringLiteral(
"name" ) ),
262 relationElement.attribute( QStringLiteral(
"layerId" ) ),
263 relationElement.attribute( QStringLiteral(
"layerName" ) ),
264 relationElement.attribute( QStringLiteral(
"dataSource" ) ),
265 relationElement.attribute( QStringLiteral(
"providerKey" ) )
267 rel.setReferencedLayerFields( referencedFields );
268 rel.setReferencingLayerFields( referencingFields );
274 QgsWeakRelation rel{ relationElement.attribute( QStringLiteral(
"id" ) ),
275 relationElement.attribute( QStringLiteral(
"name" ) ),
278 relationElement.attribute( QStringLiteral(
"layerId" ) ),
279 relationElement.attribute( QStringLiteral(
"layerName" ) ),
280 relationElement.attribute( QStringLiteral(
"dataSource" ) ),
281 relationElement.attribute( QStringLiteral(
"providerKey" ) ),
288 rel.setReferencedLayerFields( referencedFields );
289 rel.setReferencingLayerFields( referencingFields );
309 QDomNodeList relationsNodeList = node.toElement().elementsByTagName( QStringLiteral(
"relation" ) );
310 QDomElement relationElement;
312 for (
int i = 0; i < relationsNodeList.size(); ++i )
314 relationElement = relationsNodeList.at( i ).toElement();
315 if ( relationElement.hasAttribute( QStringLiteral(
"id" ) ) && relationElement.attribute( QStringLiteral(
"id" ) ) == relation.
id() )
321 relationElement.setAttribute( QStringLiteral(
"layerId" ), relation.
referencedLayer()->
id() );
322 relationElement.setAttribute( QStringLiteral(
"layerName" ), relation.
referencedLayer()->
name() );
329 relationElement.setAttribute( QStringLiteral(
"layerId" ), relation.
referencingLayer()->
id() );
330 relationElement.setAttribute( QStringLiteral(
"layerName" ), relation.
referencingLayer()->
name() );
RelationshipStrength
Relationship strength.
@ ManyToMany
Many to many relationship.
@ ManyToOne
Many to one relationship.
@ OneToOne
One to one relationship.
@ OneToMany
One to many relationship.
static void warning(const QString &msg)
Goes to qWarning.
Base class for all map layer types.
QString providerType() const
Returns the provider type (provider key) for this layer.
QString publicSource(bool hidePassword=false) const
Gets a version of the internal layer definition that has sensitive bits removed (for example,...
Resolves relative paths into absolute paths and vice versa.
QString writePath(const QString &filename) const
Prepare a filename to save it to the project file.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
static QgsProject * instance()
Returns the QgsProject singleton instance.
QgsPathResolver pathResolver() const
Returns path resolver object with considering whether the project uses absolute or relative paths and...
static QgsProviderRegistry * instance(const QString &pluginPath=QString())
Means of accessing canonical single instance.
Represents a relationship between two vector layers.
void setId(const QString &id)
Set an id for this relation.
void setReferencedLayer(const QString &id)
Set the referenced (parent) layer id.
QgsVectorLayer * referencedLayer
void setStrength(Qgis::RelationshipStrength strength)
Set a strength for this relation.
void addFieldPair(const QString &referencingField, const QString &referencedField)
Add a field pair which is part of this relation The first element of each pair are the field names of...
void setReferencingLayer(const QString &id)
Set the referencing (child) layer id.
QgsVectorLayer * referencingLayer
void setName(const QString &name)
Set a name for this relation.
void writeXml(QDomNode &node, QDomDocument &doc) const
Writes a relation to an XML structure.
Represents a vector layer which manages a vector based data sets.
The QgsWeakRelation class represent a QgsRelation with possibly unresolved layers or unmatched fields...
void setReferencedLayer(const QString &sourceUri, const QString &provider)
Sets the source for the referenced (or "parent" / "left") layer, by sourceUri and provider ID.
QgsVectorLayerRef referencedLayer() const
Returns a weak reference to the referenced (or "parent" / "left") layer.
QList< QgsRelation > resolvedRelations(const QgsProject *project, QgsVectorLayerRef::MatchType matchType=QgsVectorLayerRef::MatchType::All) const
Resolves a weak relation in the given project returning a list of possibly invalid QgsRelations and w...
void setMappingTable(const QgsVectorLayerRef &table)
Sets a weak reference to the mapping table, which forms the middle table in many-to-many relationship...
WeakRelationType
Enum to distinguish if the layer is referenced or referencing.
@ Referencing
The layer is referencing (or the "child" / "right" layer in the relationship)
@ Referenced
The layer is referenced (or the "parent" / "left" left in the relationship)
QString referencedLayerProvider() const
Returns the provider ID for the referenced (or "parent" / "left") layer.
QgsWeakRelation()
Default constructor for an invalid relation.
QString mappingTableProvider() const
Returns the provider ID for the mapping table, which forms the middle table in many-to-many relations...
QString mappingTableName() const
Returns the layer name of the mapping table, which forms the middle table in many-to-many relationshi...
QString mappingTableSource() const
Returns the source URI for the mapping table, which forms the middle table in many-to-many relationsh...
QString referencingLayerProvider() const
Returns the provider ID for the referencing (or "child" / "right") layer.
QgsVectorLayerRef referencingLayer() const
Returns a weak reference to the referencing (or "child" / "right") layer.
QString referencedLayerName() const
Returns the layer name of the referenced (or "parent" / "left") layer.
static void writeXml(const QgsVectorLayer *layer, WeakRelationType type, const QgsRelation &relation, QDomNode &node, QDomDocument &doc)
Writes a weak relation infoto an XML structure.
static QgsWeakRelation readXml(const QgsVectorLayer *layer, WeakRelationType type, const QDomNode &node, const QgsPathResolver resolver)
Returns a weak relation for the given layer.
void setReferencingLayer(const QString &sourceUri, const QString &provider)
Sets the source for the referencing (or "child" / "right") layer, by sourceUri and provider ID.
QString referencedLayerSource() const
Returns the source URI for the referenced (or "parent" / "left") layer.
QString referencingLayerSource() const
Returns the source URI for the referencing (or "child" / "right") layer.
QgsVectorLayerRef mappingTable() const
Returns a weak reference to the mapping table, which forms the middle table in many-to-many relations...
QString referencingLayerName() const
Returns the layer name of the referencing (or "child" / "right") layer.
Qgis::RelationshipStrength strength() const
Returns the strength of the relation.
TYPE * resolveWeakly(const QgsProject *project, MatchType matchType=MatchType::All)
Resolves the map layer by attempting to find a matching layer in a project using a weak match.
MatchType
Flag for match type in weak resolution.
QString source
Weak reference to layer public source.
QString provider
Weak reference to layer provider.