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 data sets.
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...
Class to manipulate 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