Skip to content
Permalink
Browse files

Last Redo [BUGFIX][QGIS Server] Joins was not reloaded if the layer i…

…s in cache

Add an accessor to QgsVectorLayer join buffer, to not duplicate QgsVectorLayerJoinBuffer::readXml code
  • Loading branch information
rldhont committed Oct 12, 2016
1 parent 898addf commit 726bac5291f5c0cebc097987d5d8bb81f0596992
@@ -419,6 +419,11 @@ class QgsVectorLayer : QgsMapLayer
@returns true if join was found and successfully removed */
bool removeJoin( const QString& joinLayerId );

/**
* Acccessor to the join buffer object
* @note added 2.14.7
*/
QgsVectorLayerJoinBuffer* joinBuffer();
const QList<QgsVectorJoinInfo> vectorJoins() const;

/**
@@ -512,6 +512,11 @@ class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionConte
@returns true if join was found and successfully removed */
bool removeJoin( const QString& joinLayerId );

/**
* Acccessor to the join buffer object
* @note added 2.14.7
*/
QgsVectorLayerJoinBuffer* joinBuffer() { return mJoinBuffer; }
const QList<QgsVectorJoinInfo> vectorJoins() const;

/**
@@ -24,6 +24,7 @@
#include "qgsmaplayerregistry.h"
#include "qgsmslayercache.h"
#include "qgsrasterlayer.h"
#include "qgsvectorlayerjoinbuffer.h"
#include "qgseditorwidgetregistry.h"
#include "qgslayertreegroup.h"
#include "qgslogger.h"
@@ -237,7 +238,8 @@ QgsMapLayer* QgsServerProjectParser::createLayerFromElement( const QDomElement&
{
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( layer );
addValueRelationLayersForLayer( vlayer );
addJoinsToLayer( const_cast<QDomElement&>( elem ), vlayer );
QgsVectorLayerJoinBuffer* joinBuffer = vlayer->joinBuffer();
joinBuffer->readXml( const_cast<QDomElement&>( elem ) );
}

return layer;
@@ -1552,50 +1554,6 @@ void QgsServerProjectParser::addJoinLayersForElement( const QDomElement& layerEl
}
}

// Based on QgsVectorLayerJoinBuffer::readXml
void QgsServerProjectParser::addJoinsToLayer( const QDomElement& layerElem, QgsVectorLayer *vl ) const
{
if ( !vl )
return;

QDomElement vectorJoinsElem = layerElem.firstChildElement( "vectorjoins" );
if ( vectorJoinsElem.isNull() )
{
return;
}

QDomNodeList joinList = vectorJoinsElem.elementsByTagName( "join" );
for ( int i = 0; i < joinList.size(); ++i )
{
QDomElement infoElem = joinList.at( i ).toElement();
QgsVectorJoinInfo info;
info.joinFieldName = infoElem.attribute( "joinFieldName" );
info.joinLayerId = infoElem.attribute( "joinLayerId" );
info.targetFieldName = infoElem.attribute( "targetFieldName" );
info.memoryCache = infoElem.attribute( "memoryCache" ).toInt();

info.joinFieldIndex = infoElem.attribute( "joinField" ).toInt(); //for compatibility with 1.x
info.targetFieldIndex = infoElem.attribute( "targetField" ).toInt(); //for compatibility with 1.x

QDomElement subsetElem = infoElem.firstChildElement( "joinFieldsSubset" );
if ( !subsetElem.isNull() )
{
QStringList* fieldNames = new QStringList;
QDomNodeList fieldNodes = infoElem.elementsByTagName( "field" );
for ( int i = 0; i < fieldNodes.count(); ++i )
*fieldNames << fieldNodes.at( i ).toElement().attribute( "name" );
info.setJoinFieldNamesSubset( fieldNames );
}

if ( infoElem.attribute( "hasCustomPrefix" ).toInt() )
info.prefix = infoElem.attribute( "customPrefix" );
else
info.prefix = QString::null;

vl->addJoin( info );
}
}

void QgsServerProjectParser::addValueRelationLayersForLayer( const QgsVectorLayer *vl ) const
{
if ( !vl )
@@ -114,8 +114,6 @@ class SERVER_EXPORT QgsServerProjectParser

/** Add layers for vector joins */
void addJoinLayersForElement( const QDomElement& layerElem ) const;
/** Update vector joins to layer, based on QgsVectorLayerJoinBuffer::readXml */
void addJoinsToLayer( const QDomElement& layerElem, QgsVectorLayer *vl ) const;

void addValueRelationLayersForLayer( const QgsVectorLayer *vl ) const;
/** Add layers which are necessary for the evaluation of the expression function 'getFeature( layer, attributField, value)'*/

0 comments on commit 726bac5

Please sign in to comment.
You can’t perform that action at this time.