Skip to content

Commit

Permalink
Memory layers clone: use updated source
Browse files Browse the repository at this point in the history
Fixes #34134
  • Loading branch information
elpaso authored and nyalldawson committed Feb 3, 2020
1 parent 835a4a0 commit 033f901
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/core/qgsvectorlayer.cpp
Expand Up @@ -221,11 +221,20 @@ QgsVectorLayer::~QgsVectorLayer()
QgsVectorLayer *QgsVectorLayer::clone() const QgsVectorLayer *QgsVectorLayer::clone() const
{ {
QgsVectorLayer::LayerOptions options; QgsVectorLayer::LayerOptions options;
// We get the data source string from the provider when
// possible because some providers may have changed it
// directly (memory provider does that).
QString dataSource;
if ( mDataProvider ) if ( mDataProvider )
{ {
dataSource = mDataProvider->dataSourceUri();
options.transformContext = mDataProvider->transformContext(); options.transformContext = mDataProvider->transformContext();
} }
QgsVectorLayer *layer = new QgsVectorLayer( source(), name(), mProviderKey, options ); else
{
dataSource = source();
}
QgsVectorLayer *layer = new QgsVectorLayer( dataSource, name(), mProviderKey, options );
if ( mDataProvider && layer->dataProvider() ) if ( mDataProvider && layer->dataProvider() )
{ {
layer->dataProvider()->handlePostCloneOperations( mDataProvider ); layer->dataProvider()->handlePostCloneOperations( mDataProvider );
Expand Down
19 changes: 19 additions & 0 deletions tests/src/python/test_provider_memory.py
Expand Up @@ -10,6 +10,7 @@
__date__ = '2015-04-23' __date__ = '2015-04-23'
__copyright__ = 'Copyright 2015, The QGIS Project' __copyright__ = 'Copyright 2015, The QGIS Project'


from urllib.parse import parse_qs


from qgis.core import ( from qgis.core import (
QgsField, QgsField,
Expand Down Expand Up @@ -652,6 +653,24 @@ def testSpatialIndex(self):
vl.dataProvider().createSpatialIndex() vl.dataProvider().createSpatialIndex()
self.assertEqual(vl.hasSpatialIndex(), QgsFeatureSource.SpatialIndexPresent) self.assertEqual(vl.hasSpatialIndex(), QgsFeatureSource.SpatialIndexPresent)


def testClone(self):
"""Test that a cloned layer has a single new id and
the same fields as the source layer"""

vl = QgsVectorLayer(
'Point?crs=epsg:4326',
'test', 'memory')
self.assertTrue(vl.isValid)
dp = vl.dataProvider()
self.assertTrue(dp.addAttributes([QgsField("name", QVariant.String),
QgsField("age", QVariant.Int),
QgsField("size", QVariant.Double)]))
vl2 = vl.clone()
self.assertTrue('memory?geometry=Point&crs=EPSG:4326&field=name:(0,0)&field=age:(0,0)&field=size:(0,0)' in vl2.publicSource())
self.assertEqual(len(parse_qs(vl.publicSource())['uid']), 1)
self.assertEqual(len(parse_qs(vl2.publicSource())['uid']), 1)
self.assertNotEqual(parse_qs(vl2.publicSource())['uid'][0], parse_qs(vl.publicSource())['uid'][0])



class TestPyQgsMemoryProviderIndexed(unittest.TestCase, ProviderTestCase): class TestPyQgsMemoryProviderIndexed(unittest.TestCase, ProviderTestCase):


Expand Down

0 comments on commit 033f901

Please sign in to comment.