23#include <QApplication>
32 , mRelationId( relationId )
33 , mRelationName( relationName )
40 QList< QgsRelation > res;
42 switch ( mCardinality )
50 relation.
setId( mRelationId );
51 relation.
setName( mRelationName );
66 for (
int i = 0 ; i < std::min( mReferencingLayerFields.size(), mReferencedLayerFields.size() ); ++i )
68 relation.
addFieldPair( mReferencingLayerFields.at( i ), mReferencedLayerFields.at( i ) );
71 res.push_back( relation );
79 relationLeft.
setId( mRelationId + QStringLiteral(
"_forward" ) );
80 relationLeft.
setName( mRelationName + QStringLiteral(
"_forward" ) );
96 for (
int i = 0 ; i < std::min( mMappingReferencedLayerFields.size(), mReferencedLayerFields.size() ); ++i )
98 relationLeft.
addFieldPair( mMappingReferencedLayerFields.at( i ), mReferencedLayerFields.at( i ) );
101 res.push_back( relationLeft );
104 relationRight.
setId( mRelationId + QStringLiteral(
"_backward" ) );
105 relationRight.
setName( mRelationName + QStringLiteral(
"_backward" ) );
119 for (
int i = 0 ; i < std::min( mMappingReferencingLayerFields.size(), mReferencingLayerFields.size() ); ++i )
121 relationRight.
addFieldPair( mMappingReferencingLayerFields.at( i ), mReferencingLayerFields.at( i ) );
124 res.push_back( relationRight );
134 return mReferencingLayer;
139 return mReferencingLayer.
source;
144 return mReferencingLayer.provider;
149 mReferencingLayer.source = sourceUri;
150 mReferencingLayer.provider = provider;
157 return metadata->decodeUri( mReferencingLayer.source ).value( QStringLiteral(
"layerName" ) ).toString();
164 return mReferencedLayer;
169 return mReferencedLayer.
source;
174 return mReferencedLayer.provider;
181 return metadata->decodeUri( mReferencedLayer.source ).value( QStringLiteral(
"layerName" ) ).toString();
188 mReferencedLayer.source = sourceUri;
189 mReferencedLayer.provider = provider;
194 return mMappingTable;
199 mMappingTable = table;
204 return mMappingTable.
source;
209 return mMappingTable.provider;
216 return metadata->decodeUri( mMappingTable.source ).value( QStringLiteral(
"layerName" ) ).toString();
223 mMappingTable.source = sourceUri;
224 mMappingTable.provider = provider;
234 QDomElement relationElement = node.toElement();
236 if ( relationElement.tagName() != QLatin1String(
"relation" ) )
238 QgsLogger::warning( QApplication::translate(
"QgsRelation",
"Cannot create relation. Unexpected tag '%1'" ).arg( relationElement.tagName() ) );
241 QStringList referencingFields;
242 QStringList referencedFields;
243 const QDomNodeList fieldPairNodes { relationElement.elementsByTagName( QStringLiteral(
"fieldRef" ) ) };
244 for (
int j = 0; j < fieldPairNodes.length(); ++j )
246 const QDomElement fieldPairElement = fieldPairNodes.at( j ).toElement();
247 referencingFields.push_back( fieldPairElement.attribute( QStringLiteral(
"referencingField" ) ) );
248 referencedFields.push_back( fieldPairElement.attribute( QStringLiteral(
"referencedField" ) ) );
255 QgsWeakRelation rel{ relationElement.attribute( QStringLiteral(
"id" ) ),
256 relationElement.attribute( QStringLiteral(
"name" ) ),
264 relationElement.attribute( QStringLiteral(
"layerId" ) ),
265 relationElement.attribute( QStringLiteral(
"layerName" ) ),
266 relationElement.attribute( QStringLiteral(
"dataSource" ) ),
267 relationElement.attribute( QStringLiteral(
"providerKey" ) )
276 QgsWeakRelation rel{ relationElement.attribute( QStringLiteral(
"id" ) ),
277 relationElement.attribute( QStringLiteral(
"name" ) ),
280 relationElement.attribute( QStringLiteral(
"layerId" ) ),
281 relationElement.attribute( QStringLiteral(
"layerName" ) ),
282 relationElement.attribute( QStringLiteral(
"dataSource" ) ),
283 relationElement.attribute( QStringLiteral(
"providerKey" ) ),
310 resolver = project->pathResolver();
313 QDomNodeList relationsNodeList = node.toElement().elementsByTagName( QStringLiteral(
"relation" ) );
314 QDomElement relationElement;
316 for (
int i = 0; i < relationsNodeList.size(); ++i )
318 relationElement = relationsNodeList.at( i ).toElement();
319 if ( relationElement.hasAttribute( QStringLiteral(
"id" ) ) && relationElement.attribute( QStringLiteral(
"id" ) ) == relation.
id() )
325 relationElement.setAttribute( QStringLiteral(
"layerId" ), relation.
referencedLayer()->
id() );
326 relationElement.setAttribute( QStringLiteral(
"layerName" ), relation.
referencedLayer()->
name() );
333 relationElement.setAttribute( QStringLiteral(
"layerId" ), relation.
referencingLayer()->
id() );
334 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,...
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.