QGIS API Documentation
4.3.0-Master (a080b0d5f12)
Toggle main menu visibility
Loading...
Searching...
No Matches
src
core
qgsvirtuallayerdefinitionutils.cpp
Go to the documentation of this file.
1
/***************************************************************************
2
qgsvirtuallayerdefinitionutils.cpp
3
begin : Jan 2016
4
copyright : (C) 2016 Hugo Mercier, Oslandia
5
email : hugo dot mercier at oslandia dot com
6
***************************************************************************/
7
8
/***************************************************************************
9
* *
10
* This program is free software; you can redistribute it and/or modify *
11
* it under the terms of the GNU General Public License as published by *
12
* the Free Software Foundation; either version 2 of the License, or *
13
* (at your option) any later version. *
14
* *
15
***************************************************************************/
16
17
#include "
qgsvirtuallayerdefinitionutils.h
"
18
19
#include "
qgsproject.h
"
20
#include "
qgsvectordataprovider.h
"
21
#include "
qgsvectorlayer.h
"
22
#include "
qgsvectorlayerjoininfo.h
"
23
#include "
qgsvirtuallayerdefinition.h
"
24
25
#include <QString>
26
27
using namespace
Qt::StringLiterals;
28
29
QgsVirtualLayerDefinition
QgsVirtualLayerDefinitionUtils::fromJoinedLayer
(
QgsVectorLayer
*layer )
30
{
31
QgsVirtualLayerDefinition
def;
32
33
QStringList leftJoins;
34
QStringList columns;
35
36
// add the geometry column if the layer is spatial
37
if
( layer->
isSpatial
() )
38
columns <<
"t.geometry"
;
39
40
// look for the uid
41
const
QgsFields
fields = layer->
dataProvider
()->
fields
();
42
{
43
QgsAttributeList
pk = layer->
dataProvider
()->
pkAttributeIndexes
();
44
if
( pk.size() == 1 )
45
{
46
def.
setUid
( fields.
field
( pk[0] ).
name
() );
47
}
48
else
49
{
50
// find an uid name
51
QString uid = u
"uid"
_s;
52
while
( fields.
lookupField
( uid ) != -1 )
53
uid +=
'_'
_L1;
// add "_" each time this name already exists
54
55
// add a column
56
columns <<
"t.rowid AS "
+ uid;
57
def.
setUid
( uid );
58
}
59
}
60
const
QgsFields
providerFields = layer->
dataProvider
()->
fields
();
61
for
(
const
auto
&f : providerFields )
62
{
63
columns <<
"t.\""
+ f.name() +
"\""
;
64
}
65
66
int
joinIdx = 0;
67
const
auto
constVectorJoins = layer->
vectorJoins
();
68
for
(
const
QgsVectorLayerJoinInfo
&join : constVectorJoins )
69
{
70
const
QString joinName = u
"j%1"
_s.arg( ++joinIdx );
71
QgsVectorLayer
*joinedLayer = join.joinLayer();
72
if
( !joinedLayer )
73
continue
;
74
const
QString prefix = join.prefix().isEmpty() ? joinedLayer->
name
() +
"_"
: join.prefix();
75
76
leftJoins << u
"LEFT JOIN \"%1\" AS %2 ON t.\"%5\"=%2.\"%3\""
_s.arg( joinedLayer->
id
(), joinName, join.joinFieldName(), join.targetFieldName() );
77
if
(
auto
*lJoinFieldNamesSubset = join.joinFieldNamesSubset() )
78
{
79
const
QStringList joinFieldNamesSubset { *lJoinFieldNamesSubset };
80
for
(
const
QString &f : joinFieldNamesSubset )
81
{
82
columns << joinName +
".\""
+ f +
"\" AS \""
+ prefix + f +
"\""
;
83
}
84
}
85
else
86
{
87
const
QgsFields
joinFields = joinedLayer->
fields
();
88
for
(
const
QgsField
&f : joinFields )
89
{
90
if
( f.name() == join.joinFieldName() )
91
continue
;
92
columns << joinName +
".\""
+ f.name() +
"\" AS \""
+ prefix + f.name() +
"\""
;
93
}
94
}
95
}
96
97
const
QString query =
"SELECT "
+ columns.join(
", "
_L1 ) +
" FROM \""
+ layer->
id
() +
"\" AS t "
+ leftJoins.join(
' '
_L1 );
98
def.
setQuery
( query );
99
100
return
def;
101
}
QgsField
Encapsulate a field in an attribute table or data source.
Definition
qgsfield.h:56
QgsField::name
QString name
Definition
qgsfield.h:65
QgsFields
Container of fields for a vector layer.
Definition
qgsfields.h:45
QgsFields::field
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
Definition
qgsfields.cpp:214
QgsFields::lookupField
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
Definition
qgsfields.cpp:416
QgsMapLayer::name
QString name
Definition
qgsmaplayer.h:87
QgsMapLayer::id
QString id
Definition
qgsmaplayer.h:86
QgsVectorDataProvider::pkAttributeIndexes
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
Definition
qgsvectordataprovider.cpp:450
QgsVectorDataProvider::fields
QgsFields fields() const override=0
Returns the fields associated with this data provider.
QgsVectorLayerJoinInfo
Defines left outer join from our vector layer to some other vector layer.
Definition
qgsvectorlayerjoininfo.h:33
QgsVectorLayer
Represents a vector layer which manages a vector based dataset.
Definition
qgsvectorlayer.h:414
QgsVectorLayer::isSpatial
bool isSpatial() const final
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
Definition
qgsvectorlayer.cpp:4463
QgsVectorLayer::fields
QgsFields fields
Definition
qgsvectorlayer.h:422
QgsVectorLayer::vectorJoins
const QList< QgsVectorLayerJoinInfo > vectorJoins() const
Definition
qgsvectorlayer.cpp:4691
QgsVectorLayer::dataProvider
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.
Definition
qgsvectorlayer.cpp:725
QgsVirtualLayerDefinitionUtils::fromJoinedLayer
static QgsVirtualLayerDefinition fromJoinedLayer(QgsVectorLayer *joinedLayer)
Gets a virtual layer definition from a vector layer where vector joins are replaced by SQL LEFT JOINs...
Definition
qgsvirtuallayerdefinitionutils.cpp:29
QgsVirtualLayerDefinition
Manipulates the definition of a virtual layer.
Definition
qgsvirtuallayerdefinition.h:32
QgsVirtualLayerDefinition::setUid
void setUid(const QString &uid)
Sets the name of the field with unique identifiers.
Definition
qgsvirtuallayerdefinition.h:132
QgsVirtualLayerDefinition::setQuery
void setQuery(const QString &query)
Sets the SQL query.
Definition
qgsvirtuallayerdefinition.h:122
QgsAttributeList
QList< int > QgsAttributeList
Definition
qgsfield.h:30
qgsproject.h
qgsvectordataprovider.h
qgsvectorlayer.h
qgsvectorlayerjoininfo.h
qgsvirtuallayerdefinition.h
qgsvirtuallayerdefinitionutils.h
Generated on
for QGIS API Documentation by
1.17.0