28  QStringList leftJoins;
 
   33    columns << 
"t.geometry";
 
   46      QString uid = QStringLiteral( 
"uid" );
 
   48        uid += QLatin1Char( 
'_' ); 
 
   51      columns << 
"t.rowid AS " + uid;
 
   56  for ( 
const auto &f : providerFields )
 
   58    columns << 
"t.\"" + f.name() + 
"\"";
 
   65    const QString joinName = QStringLiteral( 
"j%1" ).arg( ++joinIdx );
 
   69    const QString prefix = join.prefix().isEmpty() ? joinedLayer->
name() + 
"_" : join.prefix();
 
   71    leftJoins << QStringLiteral( 
"LEFT JOIN \"%1\" AS %2 ON t.\"%5\"=%2.\"%3\"" ).arg( joinedLayer->
id(), joinName, join.joinFieldName(), join.targetFieldName() );
 
   72    if ( 
auto *lJoinFieldNamesSubset = join.joinFieldNamesSubset() )
 
   74      const QStringList joinFieldNamesSubset { *lJoinFieldNamesSubset };
 
   75      for ( 
const QString &f : joinFieldNamesSubset )
 
   77        columns << joinName + 
".\"" + f + 
"\" AS \"" + prefix + f + 
"\"";
 
   83      for ( 
const QgsField &f : joinFields )
 
   85        if ( f.name() == join.joinFieldName() )
 
   87        columns << joinName + 
".\"" + f.name() + 
"\" AS \"" + prefix + f.name() + 
"\"";
 
   92  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...
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
const QList< QgsVectorLayerJoinInfo > vectorJoins() const
 
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