Skip to content

Commit 86e1382

Browse files
committed
Make QgsRelation implicitly shared
1 parent a5a6f00 commit 86e1382

File tree

4 files changed

+175
-92
lines changed

4 files changed

+175
-92
lines changed

python/core/auto_generated/qgsrelation.sip.in

+3
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212

1313

14+
1415
class QgsRelation
1516
{
1617

@@ -34,6 +35,8 @@ class QgsRelation
3435
%Docstring
3536
Default constructor. Creates an invalid relation.
3637
%End
38+
~QgsRelation();
39+
QgsRelation( const QgsRelation &other );
3740

3841
static QgsRelation createFromXml( const QDomNode &node, QgsReadWriteContext &context );
3942
%Docstring

src/core/qgsrelation.cpp

+93-66
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,26 @@
2020
#include "qgslogger.h"
2121
#include "qgsproject.h"
2222
#include "qgsvectorlayer.h"
23+
#include "qgsrelation_p.h"
24+
25+
QgsRelation::QgsRelation()
26+
{
27+
}
28+
29+
QgsRelation::~QgsRelation()
30+
{
31+
}
32+
33+
QgsRelation::QgsRelation( const QgsRelation &other )
34+
: d( other.d )
35+
{
36+
}
37+
38+
QgsRelation &QgsRelation::operator=( const QgsRelation &other )
39+
{
40+
d = other.d;
41+
return *this;
42+
}
2343

2444
QgsRelation QgsRelation::createFromXml( const QDomNode &node, QgsReadWriteContext &context )
2545
{
@@ -61,19 +81,19 @@ QgsRelation QgsRelation::createFromXml( const QDomNode &node, QgsReadWriteContex
6181
QgsLogger::warning( QApplication::translate( "QgsRelation", "Relation defined for layer '%1' which is not of type VectorLayer." ).arg( referencedLayerId ) );
6282
}
6383

64-
relation.mReferencingLayerId = referencingLayerId;
65-
relation.mReferencingLayer = qobject_cast<QgsVectorLayer *>( referencingLayer );
66-
relation.mReferencedLayerId = referencedLayerId;
67-
relation.mReferencedLayer = qobject_cast<QgsVectorLayer *>( referencedLayer );
68-
relation.mRelationId = id;
69-
relation.mRelationName = name;
70-
if ( strength == "Composition" )
84+
relation.d->mReferencingLayerId = referencingLayerId;
85+
relation.d->mReferencingLayer = qobject_cast<QgsVectorLayer *>( referencingLayer );
86+
relation.d->mReferencedLayerId = referencedLayerId;
87+
relation.d->mReferencedLayer = qobject_cast<QgsVectorLayer *>( referencedLayer );
88+
relation.d->mRelationId = id;
89+
relation.d->mRelationName = name;
90+
if ( strength == QLatin1String( "Composition" ) )
7191
{
72-
relation.mRelationStrength = RelationStrength::Composition;
92+
relation.d->mRelationStrength = RelationStrength::Composition;
7393
}
7494
else
7595
{
76-
relation.mRelationStrength = RelationStrength::Association;
96+
relation.d->mRelationStrength = RelationStrength::Association;
7797
}
7898

7999
QDomNodeList references = elem.elementsByTagName( QStringLiteral( "fieldRef" ) );
@@ -95,11 +115,11 @@ QgsRelation QgsRelation::createFromXml( const QDomNode &node, QgsReadWriteContex
95115
void QgsRelation::writeXml( QDomNode &node, QDomDocument &doc ) const
96116
{
97117
QDomElement elem = doc.createElement( QStringLiteral( "relation" ) );
98-
elem.setAttribute( QStringLiteral( "id" ), mRelationId );
99-
elem.setAttribute( QStringLiteral( "name" ), mRelationName );
100-
elem.setAttribute( QStringLiteral( "referencingLayer" ), mReferencingLayerId );
101-
elem.setAttribute( QStringLiteral( "referencedLayer" ), mReferencedLayerId );
102-
if ( mRelationStrength == RelationStrength::Composition )
118+
elem.setAttribute( QStringLiteral( "id" ), d->mRelationId );
119+
elem.setAttribute( QStringLiteral( "name" ), d->mRelationName );
120+
elem.setAttribute( QStringLiteral( "referencingLayer" ), d->mReferencingLayerId );
121+
elem.setAttribute( QStringLiteral( "referencedLayer" ), d->mReferencedLayerId );
122+
if ( d->mRelationStrength == RelationStrength::Composition )
103123
{
104124
elem.setAttribute( QStringLiteral( "strength" ), QStringLiteral( "Composition" ) );
105125
}
@@ -108,7 +128,7 @@ void QgsRelation::writeXml( QDomNode &node, QDomDocument &doc ) const
108128
elem.setAttribute( QStringLiteral( "strength" ), QStringLiteral( "Association" ) );
109129
}
110130

111-
Q_FOREACH ( const FieldPair &fields, mFieldPairs )
131+
Q_FOREACH ( const FieldPair &fields, d->mFieldPairs )
112132
{
113133
QDomElement referenceElem = doc.createElement( QStringLiteral( "fieldRef" ) );
114134
referenceElem.setAttribute( QStringLiteral( "referencingField" ), fields.first );
@@ -121,45 +141,52 @@ void QgsRelation::writeXml( QDomNode &node, QDomDocument &doc ) const
121141

122142
void QgsRelation::setId( const QString &id )
123143
{
124-
mRelationId = id;
144+
d.detach();
145+
d->mRelationId = id;
125146

126147
updateRelationStatus();
127148
}
128149

129150
void QgsRelation::setName( const QString &name )
130151
{
131-
mRelationName = name;
152+
d.detach();
153+
d->mRelationName = name;
132154
}
133155

134156

135157
void QgsRelation::setStrength( RelationStrength strength )
136158
{
137-
mRelationStrength = strength;
159+
d.detach();
160+
d->mRelationStrength = strength;
138161
}
139162

140163
void QgsRelation::setReferencingLayer( const QString &id )
141164
{
142-
mReferencingLayerId = id;
165+
d.detach();
166+
d->mReferencingLayerId = id;
143167

144168
updateRelationStatus();
145169
}
146170

147171
void QgsRelation::setReferencedLayer( const QString &id )
148172
{
149-
mReferencedLayerId = id;
173+
d.detach();
174+
d->mReferencedLayerId = id;
150175

151176
updateRelationStatus();
152177
}
153178

154179
void QgsRelation::addFieldPair( const QString &referencingField, const QString &referencedField )
155180
{
156-
mFieldPairs << FieldPair( referencingField, referencedField );
181+
d.detach();
182+
d->mFieldPairs << FieldPair( referencingField, referencedField );
157183
updateRelationStatus();
158184
}
159185

160186
void QgsRelation::addFieldPair( const FieldPair &fieldPair )
161187
{
162-
mFieldPairs << fieldPair;
188+
d.detach();
189+
d->mFieldPairs << fieldPair;
163190
updateRelationStatus();
164191
}
165192

@@ -182,7 +209,7 @@ QString QgsRelation::getRelatedFeaturesFilter( const QgsFeature &feature ) const
182209
{
183210
QStringList conditions;
184211

185-
Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, mFieldPairs )
212+
Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, d->mFieldPairs )
186213
{
187214
QVariant val( feature.attribute( fieldPair.referencedField() ) );
188215
conditions << QgsExpression::createFieldEqualityExpression( fieldPair.referencingField(), val );
@@ -195,7 +222,7 @@ QgsFeatureRequest QgsRelation::getReferencedFeatureRequest( const QgsAttributes
195222
{
196223
QStringList conditions;
197224

198-
Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, mFieldPairs )
225+
Q_FOREACH ( const QgsRelation::FieldPair &fieldPair, d->mFieldPairs )
199226
{
200227
int referencingIdx = referencingLayer()->fields().indexFromName( fieldPair.referencingField() );
201228
conditions << QgsExpression::createFieldEqualityExpression( fieldPair.referencedField(), attributes.at( referencingIdx ) );
@@ -220,67 +247,67 @@ QgsFeature QgsRelation::getReferencedFeature( const QgsFeature &feature ) const
220247
QgsFeatureRequest request = getReferencedFeatureRequest( feature );
221248

222249
QgsFeature f;
223-
mReferencedLayer->getFeatures( request ).nextFeature( f );
250+
d->mReferencedLayer->getFeatures( request ).nextFeature( f );
224251
return f;
225252
}
226253

227254
QString QgsRelation::name() const
228255
{
229-
return mRelationName;
256+
return d->mRelationName;
230257
}
231258

232259
QgsRelation::RelationStrength QgsRelation::strength() const
233260
{
234-
return mRelationStrength;
261+
return d->mRelationStrength;
235262
}
236263

237264
QString QgsRelation::id() const
238265
{
239-
return mRelationId;
266+
return d->mRelationId;
240267
}
241268

242269
void QgsRelation::generateId()
243270
{
244-
mRelationId = QStringLiteral( "%1_%2_%3_%4" )
245-
.arg( referencingLayerId(),
246-
mFieldPairs.at( 0 ).referencingField(),
247-
referencedLayerId(),
248-
mFieldPairs.at( 0 ).referencedField() );
271+
d->mRelationId = QStringLiteral( "%1_%2_%3_%4" )
272+
.arg( referencingLayerId(),
273+
d->mFieldPairs.at( 0 ).referencingField(),
274+
referencedLayerId(),
275+
d->mFieldPairs.at( 0 ).referencedField() );
249276
updateRelationStatus();
250277
}
251278

252279
QString QgsRelation::referencingLayerId() const
253280
{
254-
return mReferencingLayerId;
281+
return d->mReferencingLayerId;
255282
}
256283

257284
QgsVectorLayer *QgsRelation::referencingLayer() const
258285
{
259-
return mReferencingLayer;
286+
return d->mReferencingLayer;
260287
}
261288

262289
QString QgsRelation::referencedLayerId() const
263290
{
264-
return mReferencedLayerId;
291+
return d->mReferencedLayerId;
265292
}
266293

267294
QgsVectorLayer *QgsRelation::referencedLayer() const
268295
{
269-
return mReferencedLayer;
296+
return d->mReferencedLayer;
270297
}
271298

272299
QList<QgsRelation::FieldPair> QgsRelation::fieldPairs() const
273300
{
274-
return mFieldPairs;
301+
return d->mFieldPairs;
275302
}
276303

277304
QgsAttributeList QgsRelation::referencedFields() const
278305
{
279306
QgsAttributeList attrs;
280307

281-
Q_FOREACH ( const FieldPair &pair, mFieldPairs )
308+
Q_FOREACH ( const FieldPair &pair, d->mFieldPairs )
282309
{
283-
attrs << mReferencedLayer->fields().lookupField( pair.second );
310+
attrs << d->mReferencedLayer->fields().lookupField( pair.second );
284311
}
285312
return attrs;
286313
}
@@ -289,27 +316,27 @@ QgsAttributeList QgsRelation::referencingFields() const
289316
{
290317
QgsAttributeList attrs;
291318

292-
Q_FOREACH ( const FieldPair &pair, mFieldPairs )
319+
Q_FOREACH ( const FieldPair &pair, d->mFieldPairs )
293320
{
294-
attrs << mReferencingLayer->fields().lookupField( pair.first );
321+
attrs << d->mReferencingLayer->fields().lookupField( pair.first );
295322
}
296323
return attrs;
297324

298325
}
299326

300327
bool QgsRelation::isValid() const
301328
{
302-
return mValid;
329+
return d->mValid;
303330
}
304331

305332
bool QgsRelation::hasEqualDefinition( const QgsRelation &other ) const
306333
{
307-
return mReferencedLayerId == other.mReferencedLayerId && mReferencingLayerId == other.mReferencingLayerId && mFieldPairs == other.mFieldPairs;
334+
return d->mReferencedLayerId == other.d->mReferencedLayerId && d->mReferencingLayerId == other.d->mReferencingLayerId && d->mFieldPairs == other.d->mFieldPairs;
308335
}
309336

310337
QString QgsRelation::resolveReferencedField( const QString &referencingField ) const
311338
{
312-
Q_FOREACH ( const FieldPair &pair, mFieldPairs )
339+
Q_FOREACH ( const FieldPair &pair, d->mFieldPairs )
313340
{
314341
if ( pair.first == referencingField )
315342
return pair.second;
@@ -319,7 +346,7 @@ QString QgsRelation::resolveReferencedField( const QString &referencingField ) c
319346

320347
QString QgsRelation::resolveReferencingField( const QString &referencedField ) const
321348
{
322-
Q_FOREACH ( const FieldPair &pair, mFieldPairs )
349+
Q_FOREACH ( const FieldPair &pair, d->mFieldPairs )
323350
{
324351
if ( pair.second == referencedField )
325352
return pair.first;
@@ -331,48 +358,48 @@ void QgsRelation::updateRelationStatus()
331358
{
332359
const QMap<QString, QgsMapLayer *> &mapLayers = QgsProject::instance()->mapLayers();
333360

334-
mReferencingLayer = qobject_cast<QgsVectorLayer *>( mapLayers[mReferencingLayerId] );
335-
mReferencedLayer = qobject_cast<QgsVectorLayer *>( mapLayers[mReferencedLayerId] );
361+
d->mReferencingLayer = qobject_cast<QgsVectorLayer *>( mapLayers[d->mReferencingLayerId] );
362+
d->mReferencedLayer = qobject_cast<QgsVectorLayer *>( mapLayers[d->mReferencedLayerId] );
336363

337-
mValid = true;
364+
d->mValid = true;
338365

339-
if ( mRelationId.isEmpty() )
366+
if ( d->mRelationId.isEmpty() )
340367
{
341368
QgsDebugMsg( "Invalid relation: no ID" );
342-
mValid = false;
369+
d->mValid = false;
343370
}
344371
else
345372
{
346-
if ( !mReferencedLayer )
373+
if ( !d->mReferencedLayer )
347374
{
348-
QgsDebugMsgLevel( QStringLiteral( "Invalid relation: referenced layer does not exist. ID: %1" ).arg( mReferencedLayerId ), 4 );
349-
mValid = false;
375+
QgsDebugMsgLevel( QStringLiteral( "Invalid relation: referenced layer does not exist. ID: %1" ).arg( d->mReferencedLayerId ), 4 );
376+
d->mValid = false;
350377
}
351-
else if ( !mReferencingLayer )
378+
else if ( !d->mReferencingLayer )
352379
{
353-
QgsDebugMsgLevel( QStringLiteral( "Invalid relation: referencing layer does not exist. ID: %2" ).arg( mReferencingLayerId ), 4 );
354-
mValid = false;
380+
QgsDebugMsgLevel( QStringLiteral( "Invalid relation: referencing layer does not exist. ID: %2" ).arg( d->mReferencingLayerId ), 4 );
381+
d->mValid = false;
355382
}
356383
else
357384
{
358-
if ( mFieldPairs.count() < 1 )
385+
if ( d->mFieldPairs.count() < 1 )
359386
{
360387
QgsDebugMsgLevel( "Invalid relation: no pair of field is specified.", 4 );
361-
mValid = false;
388+
d->mValid = false;
362389
}
363390

364-
Q_FOREACH ( const FieldPair &fieldPair, mFieldPairs )
391+
Q_FOREACH ( const FieldPair &fieldPair, d->mFieldPairs )
365392
{
366-
if ( -1 == mReferencingLayer->fields().lookupField( fieldPair.first ) )
393+
if ( -1 == d->mReferencingLayer->fields().lookupField( fieldPair.first ) )
367394
{
368-
QgsDebugMsg( QStringLiteral( "Invalid relation: field %1 does not exist in referencing layer %2" ).arg( fieldPair.first, mReferencingLayer->name() ) );
369-
mValid = false;
395+
QgsDebugMsg( QStringLiteral( "Invalid relation: field %1 does not exist in referencing layer %2" ).arg( fieldPair.first, d->mReferencingLayer->name() ) );
396+
d->mValid = false;
370397
break;
371398
}
372-
else if ( -1 == mReferencedLayer->fields().lookupField( fieldPair.second ) )
399+
else if ( -1 == d->mReferencedLayer->fields().lookupField( fieldPair.second ) )
373400
{
374-
QgsDebugMsg( QStringLiteral( "Invalid relation: field %1 does not exist in referencedg layer %2" ).arg( fieldPair.second, mReferencedLayer->name() ) );
375-
mValid = false;
401+
QgsDebugMsg( QStringLiteral( "Invalid relation: field %1 does not exist in referencedg layer %2" ).arg( fieldPair.second, d->mReferencedLayer->name() ) );
402+
d->mValid = false;
376403
break;
377404
}
378405
}

0 commit comments

Comments
 (0)