23#include <QApplication>
26using namespace Qt::StringLiterals;
31 const QString &relationId,
32 const QString &relationName,
34 const QString &referencingLayerId,
37 const QString &referencingLayerProviderKey,
38 const QString &referencedLayerId,
41 const QString &referencedLayerProviderKey
45 , mRelationId( relationId )
46 , mRelationName( relationName )
52 QList< QgsRelation > res;
54 switch ( mCardinality )
61 relation.
setId( mRelationId );
62 relation.
setName( mRelationName );
77 for (
int i = 0; i < std::min( mReferencingLayerFields.size(), mReferencedLayerFields.size() ); ++i )
79 relation.
addFieldPair( mReferencingLayerFields.at( i ), mReferencedLayerFields.at( i ) );
82 res.push_back( relation );
90 relationLeft.
setId( mRelationId + u
"_forward"_s );
91 relationLeft.
setName( mRelationName + u
"_forward"_s );
107 for (
int i = 0; i < std::min( mMappingReferencedLayerFields.size(), mReferencedLayerFields.size() ); ++i )
109 relationLeft.
addFieldPair( mMappingReferencedLayerFields.at( i ), mReferencedLayerFields.at( i ) );
112 res.push_back( relationLeft );
115 relationRight.
setId( mRelationId + u
"_backward"_s );
116 relationRight.
setName( mRelationName + u
"_backward"_s );
130 for (
int i = 0; i < std::min( mMappingReferencingLayerFields.size(), mReferencingLayerFields.size() ); ++i )
132 relationRight.
addFieldPair( mMappingReferencingLayerFields.at( i ), mReferencingLayerFields.at( i ) );
135 res.push_back( relationRight );
145 return mReferencingLayer;
150 return mReferencingLayer.
source;
155 return mReferencingLayer.provider;
160 mReferencingLayer.source = sourceUri;
161 mReferencingLayer.provider = provider;
168 return metadata->decodeUri( mReferencingLayer.source ).value( u
"layerName"_s ).toString();
175 return mReferencedLayer;
180 return mReferencedLayer.
source;
185 return mReferencedLayer.provider;
192 return metadata->decodeUri( mReferencedLayer.source ).value( u
"layerName"_s ).toString();
199 mReferencedLayer.source = sourceUri;
200 mReferencedLayer.provider = provider;
205 return mMappingTable;
210 mMappingTable = table;
215 return mMappingTable.
source;
220 return mMappingTable.provider;
227 return metadata->decodeUri( mMappingTable.source ).value( u
"layerName"_s ).toString();
234 mMappingTable.source = sourceUri;
235 mMappingTable.provider = provider;
245 QDomElement relationElement = node.toElement();
247 if ( relationElement.tagName() !=
"relation"_L1 )
249 QgsLogger::warning( QApplication::translate(
"QgsRelation",
"Cannot create relation. Unexpected tag '%1'" ).arg( relationElement.tagName() ) );
252 QStringList referencingFields;
253 QStringList referencedFields;
254 const QDomNodeList fieldPairNodes { relationElement.elementsByTagName( u
"fieldRef"_s ) };
255 for (
int j = 0; j < fieldPairNodes.length(); ++j )
257 const QDomElement fieldPairElement = fieldPairNodes.at( j ).toElement();
258 referencingFields.push_back( fieldPairElement.attribute( u
"referencingField"_s ) );
259 referencedFields.push_back( fieldPairElement.attribute( u
"referencedField"_s ) );
267 relationElement.attribute( u
"id"_s ),
268 relationElement.attribute( u
"name"_s ),
276 relationElement.attribute( u
"layerId"_s ),
277 relationElement.attribute( u
"layerName"_s ),
278 relationElement.attribute( u
"dataSource"_s ),
279 relationElement.attribute( u
"providerKey"_s )
289 relationElement.attribute( u
"id"_s ),
290 relationElement.attribute( u
"name"_s ),
293 relationElement.attribute( u
"layerId"_s ),
294 relationElement.attribute( u
"layerName"_s ),
295 relationElement.attribute( u
"dataSource"_s ),
296 relationElement.attribute( u
"providerKey"_s ),
323 resolver = project->pathResolver();
326 QDomNodeList relationsNodeList = node.toElement().elementsByTagName( u
"relation"_s );
327 QDomElement relationElement;
329 for (
int i = 0; i < relationsNodeList.size(); ++i )
331 relationElement = relationsNodeList.at( i ).toElement();
332 if ( relationElement.hasAttribute( u
"id"_s ) && relationElement.attribute( u
"id"_s ) == relation.
id() )
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,...
QgsProject * project() const
Returns the parent project if this map layer is added to a project.
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 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.
Q_INVOKABLE 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 dataset.
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.
void setReferencingLayerFields(const QStringList &fields)
Sets the list of fields from the referencingLayer() involved in the relationship.
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.
void setReferencedLayerFields(const QStringList &fields)
Sets the list of fields from the referencedLayer() involved in the relationship.
Qgis::RelationshipStrength strength() const
Returns the strength of the relation.
_LayerRef< QgsVectorLayer > QgsVectorLayerRef
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.
QString source
Weak reference to layer public source.