29 QStringList leftJoins;
34 columns <<
"t.geometry";
47 QString uid = QStringLiteral(
"uid" );
49 uid += QLatin1Char(
'_' );
52 columns <<
"t.rowid AS " + uid;
57 for (
const auto &f : providerFields )
59 columns <<
"t.\"" + f.name() +
"\"";
66 const QString joinName = QStringLiteral(
"j%1" ).arg( ++joinIdx );
70 const QString prefix = join.prefix().isEmpty() ? joinedLayer->
name() +
"_" : join.prefix();
72 leftJoins << QStringLiteral(
"LEFT JOIN \"%1\" AS %2 ON t.\"%5\"=%2.\"%3\"" ).arg( joinedLayer->
id(), joinName, join.joinFieldName(), join.targetFieldName() );
73 if (
auto *lJoinFieldNamesSubset = join.joinFieldNamesSubset() )
75 const QStringList joinFieldNamesSubset { *lJoinFieldNamesSubset };
76 for (
const QString &f : joinFieldNamesSubset )
78 columns << joinName +
".\"" + f +
"\" AS \"" + prefix + f +
"\"";
84 for (
const QgsField &f : joinFields )
86 if ( f.name() == join.joinFieldName() )
88 columns << joinName +
".\"" + f.name() +
"\" AS \"" + prefix + f.name() +
"\"";
93 const QString query =
"SELECT " + columns.join( QLatin1String(
", " ) ) +
" FROM \"" + layer->
id() +
"\" AS t " + leftJoins.join( QLatin1Char(
' ' ) );
Encapsulate a field in an attribute table or data source.
Container of fields for a vector layer.
QgsField field(int fieldIdx) const
Returns the field at particular index (must be in range 0..N-1).
Q_INVOKABLE int lookupField(const QString &fieldName) const
Looks up field's index from the field name.
virtual QgsAttributeList pkAttributeIndexes() const
Returns list of indexes of fields that make up the primary key.
QgsFields fields() const override=0
Returns the fields associated with this data provider.
Defines left outer join from our vector layer to some other vector layer.
Represents a vector layer which manages a vector based dataset.
bool isSpatial() const final
Returns true if this is a geometry layer and false in case of NoGeometry (table only) or UnknownGeome...
const QList< QgsVectorLayerJoinInfo > vectorJoins() const
QgsVectorDataProvider * dataProvider() final
Returns the layer's data provider, it may be nullptr.
static QgsVirtualLayerDefinition fromJoinedLayer(QgsVectorLayer *joinedLayer)
Gets a virtual layer definition from a vector layer where vector joins are replaced by SQL LEFT JOINs...
Manipulates the definition of a virtual layer.
void setUid(const QString &uid)
Sets the name of the field with unique identifiers.
void setQuery(const QString &query)
Sets the SQL query.
QList< int > QgsAttributeList