Skip to content

Commit 4317d76

Browse files
rouaultnyalldawson
authored andcommittedNov 16, 2020
WFS provider: declare its QgsSQLComposerDialog implementation as a subset string editor provider
1 parent 1bd83fb commit 4317d76

File tree

8 files changed

+311
-202
lines changed

8 files changed

+311
-202
lines changed
 

‎src/providers/wfs/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ if (WITH_GUI)
3535
qgswfssourceselect.cpp
3636
qgswfsnewconnection.cpp
3737
qgswfsguiutils.cpp
38+
qgswfssubsetstringeditor.cpp
3839
)
3940
endif()
4041

‎src/providers/wfs/qgswfsprovider.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ class QgsWFSProvider final: public QgsVectorDataProvider
122122

123123
bool empty() const override;
124124

125+
std::shared_ptr<QgsWFSSharedData> sharedData() const { return mShared; }
126+
125127
private slots:
126128

127129
void featureReceivedAnalyzeOneFeature( QVector<QgsFeatureUniqueIdPair> );

‎src/providers/wfs/qgswfsprovidergui.cpp

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
#include "qgswfssourceselect.h"
1919
#include "qgssourceselectprovider.h"
2020
#include "qgsproviderguimetadata.h"
21-
21+
#include "qgssubsetstringeditorprovider.h"
22+
#include "qgswfssubsetstringeditor.h"
2223

2324
//! Provider for WFS layers source select
2425
class QgsWfsSourceSelectProvider : public QgsSourceSelectProvider
@@ -35,6 +36,29 @@ class QgsWfsSourceSelectProvider : public QgsSourceSelectProvider
3536
}
3637
};
3738

39+
//! Provider for dedicated subset string editor for WFS layers
40+
class QgsWfsSubsetStringEditorProvider: public QgsSubsetStringEditorProvider
41+
{
42+
public:
43+
44+
QString providerKey() const override { return QgsWFSProvider::WFS_PROVIDER_KEY; }
45+
46+
bool canHandleLayer( QgsVectorLayer *layer ) const override
47+
{
48+
QgsDataProvider *provider = layer->dataProvider();
49+
return static_cast< bool >( dynamic_cast<QgsWFSProvider *>( provider ) );
50+
}
51+
52+
QgsSubsetStringEditorInterface *createDialog( QgsVectorLayer *layer, QWidget *parent, Qt::WindowFlags fl ) override
53+
{
54+
QgsDataProvider *provider = layer->dataProvider();
55+
QgsWFSProvider *wfsProvider = dynamic_cast<QgsWFSProvider *>( provider );
56+
if ( !wfsProvider )
57+
return nullptr;
58+
return QgsWfsSubsetStringEditor::create( layer, wfsProvider, parent, fl );
59+
}
60+
};
61+
3862

3963
class QgsWfsProviderGuiMetadata: public QgsProviderGuiMetadata
4064
{
@@ -57,6 +81,12 @@ class QgsWfsProviderGuiMetadata: public QgsProviderGuiMetadata
5781
<< new QgsWfsDataItemGuiProvider;
5882
}
5983

84+
QList<QgsSubsetStringEditorProvider *> subsetStringEditorProviders() override
85+
{
86+
return QList<QgsSubsetStringEditorProvider *>()
87+
<< new QgsWfsSubsetStringEditorProvider;
88+
}
89+
6090
};
6191

6292

‎src/providers/wfs/qgswfsshareddata.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ class QgsWFSSharedData : public QObject, public QgsBackgroundCachedSharedData
4646

4747
bool hasGeometry() const override { return !mGeometryAttribute.isEmpty(); }
4848

49+
const QgsWfsCapabilities::Capabilities &capabilities() const { return mCaps; }
50+
4951
signals:
5052

5153
//! Raise error

‎src/providers/wfs/qgswfssourceselect.cpp

Lines changed: 4 additions & 167 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
#include "qgsgui.h"
3636
#include "qgsquerybuilder.h"
3737
#include "qgswfsguiutils.h"
38+
#include "qgswfssubsetstringeditor.h"
3839

3940
#include <QDomDocument>
4041
#include <QListWidgetItem>
@@ -531,82 +532,6 @@ void QgsWFSSourceSelect::addButtonClicked()
531532
}
532533
}
533534

534-
QgsWFSValidatorCallback::QgsWFSValidatorCallback( QObject *parent,
535-
const QgsWFSDataSourceURI &uri,
536-
const QString &allSql,
537-
const QgsWfsCapabilities::Capabilities &caps )
538-
: QObject( parent )
539-
, mURI( uri )
540-
, mAllSql( allSql )
541-
, mCaps( caps )
542-
{
543-
}
544-
545-
bool QgsWFSValidatorCallback::isValid( const QString &sqlStr, QString &errorReason, QString &warningMsg )
546-
{
547-
errorReason.clear();
548-
if ( sqlStr.isEmpty() || sqlStr == mAllSql )
549-
return true;
550-
551-
QgsWFSDataSourceURI uri( mURI );
552-
uri.setSql( sqlStr );
553-
554-
QgsDataProvider::ProviderOptions options;
555-
QgsWFSProvider p( uri.uri(), options, mCaps );
556-
if ( !p.isValid() )
557-
{
558-
errorReason = p.processSQLErrorMsg();
559-
return false;
560-
}
561-
warningMsg = p.processSQLWarningMsg();
562-
563-
return true;
564-
}
565-
566-
QgsWFSTableSelectedCallback::QgsWFSTableSelectedCallback( QgsSQLComposerDialog *dialog,
567-
const QgsWFSDataSourceURI &uri,
568-
const QgsWfsCapabilities::Capabilities &caps )
569-
: QObject( dialog )
570-
, mDialog( dialog )
571-
, mURI( uri )
572-
, mCaps( caps )
573-
{
574-
}
575-
576-
void QgsWFSTableSelectedCallback::tableSelected( const QString &name )
577-
{
578-
QString typeName( QgsSQLStatement::stripQuotedIdentifier( name ) );
579-
QString prefixedTypename( mCaps.addPrefixIfNeeded( typeName ) );
580-
if ( prefixedTypename.isEmpty() )
581-
return;
582-
QgsWFSDataSourceURI uri( mURI );
583-
uri.setTypeName( prefixedTypename );
584-
585-
QgsDataProvider::ProviderOptions providerOptions;
586-
QgsWFSProvider p( uri.uri(), providerOptions, mCaps );
587-
if ( !p.isValid() )
588-
{
589-
return;
590-
}
591-
592-
QList< QgsSQLComposerDialog::PairNameType> fieldList;
593-
QString fieldNamePrefix( QgsSQLStatement::quotedIdentifierIfNeeded( typeName ) + "." );
594-
const auto constToList = p.fields().toList();
595-
for ( const QgsField &field : constToList )
596-
{
597-
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( field.name() ) );
598-
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, field.typeName() );
599-
}
600-
if ( !p.geometryAttribute().isEmpty() )
601-
{
602-
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( p.geometryAttribute() ) );
603-
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, QStringLiteral( "geometry" ) );
604-
}
605-
fieldList << QgsSQLComposerDialog::PairNameType( fieldNamePrefix + "*", QString() );
606-
607-
mDialog->addColumnNames( fieldList, name );
608-
}
609-
610535
void QgsWFSSourceSelect::buildQuery( const QModelIndex &index )
611536
{
612537
if ( !index.isValid() )
@@ -681,97 +606,9 @@ void QgsWFSSourceSelect::buildQuery( const QModelIndex &index )
681606
sql = allSql;
682607
}
683608

684-
QgsSQLComposerDialog *d = new QgsSQLComposerDialog( this );
685-
686-
QgsWFSValidatorCallback *validatorCbk = new QgsWFSValidatorCallback( d, uri, allSql, mCaps );
687-
d->setSQLValidatorCallback( validatorCbk );
688-
689-
QgsWFSTableSelectedCallback *tableSelectedCbk = new QgsWFSTableSelectedCallback( d, uri, mCaps );
690-
d->setTableSelectedCallback( tableSelectedCbk );
691-
692-
const bool bSupportJoins = mCaps.featureTypes.size() > 1 && mCaps.supportsJoins;
693-
d->setSupportMultipleTables( bSupportJoins, QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) );
694-
695-
QMap< QString, QString > mapTypenameToTitle;
696-
Q_FOREACH ( const QgsWfsCapabilities::FeatureType f, mCaps.featureTypes )
697-
mapTypenameToTitle[f.name] = f.title;
698-
699-
QList< QgsSQLComposerDialog::PairNameTitle > tablenames;
700-
tablenames << QgsSQLComposerDialog::PairNameTitle(
701-
QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ), mapTypenameToTitle[typeName] );
702-
if ( bSupportJoins )
703-
{
704-
for ( int i = 0; i < mModel->rowCount(); i++ )
705-
{
706-
const QString iterTypename = mModel->index( i, MODEL_IDX_NAME ).data().toString();
707-
if ( iterTypename != typeName )
708-
{
709-
QString displayedIterTypename( iterTypename );
710-
QString unprefixedIterTypename( QgsWFSUtils::removeNamespacePrefix( iterTypename ) );
711-
if ( !mCaps.setAmbiguousUnprefixedTypename.contains( unprefixedIterTypename ) )
712-
displayedIterTypename = unprefixedIterTypename;
713-
714-
tablenames << QgsSQLComposerDialog::PairNameTitle(
715-
QgsSQLStatement::quotedIdentifierIfNeeded( displayedIterTypename ), mapTypenameToTitle[iterTypename] );
716-
}
717-
}
718-
}
719-
d->addTableNames( tablenames );
720-
721-
QList< QgsSQLComposerDialog::Function> functionList;
722-
Q_FOREACH ( const QgsWfsCapabilities::Function &f, mCaps.functionList )
723-
{
724-
QgsSQLComposerDialog::Function dialogF;
725-
dialogF.name = f.name;
726-
dialogF.returnType = f.returnType;
727-
dialogF.minArgs = f.minArgs;
728-
dialogF.maxArgs = f.maxArgs;
729-
Q_FOREACH ( const QgsWfsCapabilities::Argument &arg, f.argumentList )
730-
{
731-
dialogF.argumentList << QgsSQLComposerDialog::Argument( arg.name, arg.type );
732-
}
733-
functionList << dialogF;
734-
}
735-
d->addFunctions( functionList );
736-
737-
QList< QgsSQLComposerDialog::Function> spatialPredicateList;
738-
Q_FOREACH ( const QgsWfsCapabilities::Function &f, mCaps.spatialPredicatesList )
739-
{
740-
QgsSQLComposerDialog::Function dialogF;
741-
dialogF.name = f.name;
742-
dialogF.returnType = f.returnType;
743-
dialogF.minArgs = f.minArgs;
744-
dialogF.maxArgs = f.maxArgs;
745-
Q_FOREACH ( const QgsWfsCapabilities::Argument &arg, f.argumentList )
746-
{
747-
dialogF.argumentList << QgsSQLComposerDialog::Argument( arg.name, arg.type );
748-
}
749-
spatialPredicateList << dialogF;
750-
}
751-
d->addSpatialPredicates( spatialPredicateList );
752-
753-
QList< QgsSQLComposerDialog::PairNameType> fieldList;
754-
QString fieldNamePrefix;
755-
if ( bSupportJoins )
756-
{
757-
fieldNamePrefix = QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) + ".";
758-
}
759-
const auto constToList = p.fields().toList();
760-
for ( const QgsField &field : constToList )
761-
{
762-
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( field.name() ) );
763-
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, field.typeName() );
764-
}
765-
if ( !p.geometryAttribute().isEmpty() )
766-
{
767-
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( p.geometryAttribute() ) );
768-
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, QStringLiteral( "geometry" ) );
769-
}
770-
fieldList << QgsSQLComposerDialog::PairNameType( fieldNamePrefix + "*", QString() );
771-
772-
d->addColumnNames( fieldList, QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) );
609+
auto d = QgsWfsSubsetStringEditor::create( nullptr, &p, this );
773610

774-
d->setSql( sql );
611+
d->setSubsetString( sql );
775612

776613
mSQLIndex = index;
777614
mSQLComposerDialog = d;
@@ -803,7 +640,7 @@ void QgsWFSSourceSelect::updateSql()
803640
const QString typeName = mSQLIndex.sibling( mSQLIndex.row(), MODEL_IDX_NAME ).data().toString();
804641
QModelIndex filterIndex = mSQLIndex.sibling( mSQLIndex.row(), MODEL_IDX_SQL );
805642

806-
QString sql = mSQLComposerDialog->sql();
643+
QString sql = mSQLComposerDialog->subsetString();
807644
mSQLComposerDialog = nullptr;
808645

809646
QString displayedTypeName( typeName );

‎src/providers/wfs/qgswfssourceselect.h

Lines changed: 2 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,14 @@
2525
#include "qgsoapifcollection.h"
2626
#include "qgsproviderregistry.h"
2727
#include "qgsabstractdatasourcewidget.h"
28-
#include "qgssqlcomposerdialog.h"
2928

3029
#include <QItemDelegate>
3130
#include <QStandardItemModel>
3231
#include <QSortFilterProxyModel>
3332

3433
class QgsProjectionSelectionDialog;
3534
class QgsWfsCapabilities;
35+
class QgsSubsetStringEditorInterface;
3636

3737
class QgsWFSItemDelegate : public QItemDelegate
3838
{
@@ -45,21 +45,6 @@ class QgsWFSItemDelegate : public QItemDelegate
4545

4646
};
4747

48-
class QgsWFSValidatorCallback: public QObject, public QgsSQLComposerDialog::SQLValidatorCallback
49-
{
50-
Q_OBJECT
51-
52-
public:
53-
QgsWFSValidatorCallback( QObject *parent,
54-
const QgsWFSDataSourceURI &uri, const QString &allSql,
55-
const QgsWfsCapabilities::Capabilities &caps );
56-
bool isValid( const QString &sql, QString &errorReason, QString &warningMsg ) override;
57-
private:
58-
QgsWFSDataSourceURI mURI;
59-
QString mAllSql;
60-
const QgsWfsCapabilities::Capabilities &mCaps;
61-
};
62-
6348
class QgsWFSSourceSelect: public QgsAbstractDataSourceWidget, private Ui::QgsWFSSourceSelectBase
6449
{
6550
Q_OBJECT
@@ -91,7 +76,7 @@ class QgsWFSSourceSelect: public QgsAbstractDataSourceWidget, private Ui::QgsWFS
9176
QPushButton *mBuildQueryButton = nullptr;
9277
QgsWfsCapabilities::Capabilities mCaps;
9378
QModelIndex mSQLIndex;
94-
QgsSQLComposerDialog *mSQLComposerDialog = nullptr;
79+
QgsSubsetStringEditorInterface *mSQLComposerDialog = nullptr;
9580
QString mVersion;
9681

9782
/**
@@ -139,21 +124,4 @@ class QgsWFSSourceSelect: public QgsAbstractDataSourceWidget, private Ui::QgsWFS
139124
bool isOapif() const { return mVersion == QLatin1String( "OGC_API_FEATURES" ); }
140125
};
141126

142-
143-
class QgsWFSTableSelectedCallback: public QObject, public QgsSQLComposerDialog::TableSelectedCallback
144-
{
145-
Q_OBJECT
146-
147-
public:
148-
QgsWFSTableSelectedCallback( QgsSQLComposerDialog *dialog,
149-
const QgsWFSDataSourceURI &uri,
150-
const QgsWfsCapabilities::Capabilities &caps );
151-
void tableSelected( const QString &name ) override;
152-
153-
private:
154-
QgsSQLComposerDialog *mDialog = nullptr;
155-
QgsWFSDataSourceURI mURI;
156-
const QgsWfsCapabilities::Capabilities &mCaps;
157-
};
158-
159127
#endif
Lines changed: 202 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,202 @@
1+
/***************************************************************************
2+
qgswfssubsetstringeditor.cpp
3+
--------------------------------------
4+
Date : 15-Nov-2020
5+
Copyright : (C) 2020 by Even Rouault
6+
Email : even.rouault at spatials.com
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 "qgswfssubsetstringeditor.h"
18+
#include "qgswfsprovider.h"
19+
#include "qgswfsshareddata.h"
20+
#include "qgswfsutils.h"
21+
#include "qgssqlstatement.h"
22+
23+
QgsSubsetStringEditorInterface *QgsWfsSubsetStringEditor::create( QgsVectorLayer *layer, QgsWFSProvider *provider, QWidget *parent, Qt::WindowFlags fl )
24+
{
25+
Q_ASSERT( provider );
26+
const auto caps = provider->sharedData()->capabilities();
27+
28+
QgsWFSDataSourceURI uri( provider->uri().uri( false ) );
29+
const QString typeName( uri.typeName() );
30+
QString displayedTypeName( typeName );
31+
if ( !caps.setAmbiguousUnprefixedTypename.contains( QgsWFSUtils::removeNamespacePrefix( typeName ) ) )
32+
displayedTypeName = QgsWFSUtils::removeNamespacePrefix( typeName );
33+
QString allSql( "SELECT * FROM " + QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) );
34+
35+
QgsSQLComposerDialog *d = new QgsSQLComposerDialog( layer, parent, fl );
36+
37+
QgsWFSValidatorCallback *validatorCbk = new QgsWFSValidatorCallback( d, uri, allSql, caps );
38+
d->setSQLValidatorCallback( validatorCbk );
39+
40+
QgsWFSTableSelectedCallback *tableSelectedCbk = new QgsWFSTableSelectedCallback( d, uri, caps );
41+
d->setTableSelectedCallback( tableSelectedCbk );
42+
43+
const bool bSupportJoins = caps.featureTypes.size() > 1 && caps.supportsJoins;
44+
d->setSupportMultipleTables( bSupportJoins, QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) );
45+
46+
QMap< QString, QString > mapTypenameToTitle;
47+
Q_FOREACH ( const QgsWfsCapabilities::FeatureType f, caps.featureTypes )
48+
mapTypenameToTitle[f.name] = f.title;
49+
50+
QList< QgsSQLComposerDialog::PairNameTitle > tablenames;
51+
tablenames << QgsSQLComposerDialog::PairNameTitle(
52+
QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ), mapTypenameToTitle[typeName] );
53+
if ( bSupportJoins )
54+
{
55+
for ( const auto &featureType : caps.featureTypes )
56+
{
57+
const QString iterTypename = featureType.name;
58+
if ( iterTypename != typeName )
59+
{
60+
QString displayedIterTypename( iterTypename );
61+
QString unprefixedIterTypename( QgsWFSUtils::removeNamespacePrefix( iterTypename ) );
62+
if ( !caps.setAmbiguousUnprefixedTypename.contains( unprefixedIterTypename ) )
63+
displayedIterTypename = unprefixedIterTypename;
64+
65+
tablenames << QgsSQLComposerDialog::PairNameTitle(
66+
QgsSQLStatement::quotedIdentifierIfNeeded( displayedIterTypename ), mapTypenameToTitle[iterTypename] );
67+
}
68+
}
69+
}
70+
d->addTableNames( tablenames );
71+
72+
QList< QgsSQLComposerDialog::Function> functionList;
73+
Q_FOREACH ( const QgsWfsCapabilities::Function &f, caps.functionList )
74+
{
75+
QgsSQLComposerDialog::Function dialogF;
76+
dialogF.name = f.name;
77+
dialogF.returnType = f.returnType;
78+
dialogF.minArgs = f.minArgs;
79+
dialogF.maxArgs = f.maxArgs;
80+
Q_FOREACH ( const QgsWfsCapabilities::Argument &arg, f.argumentList )
81+
{
82+
dialogF.argumentList << QgsSQLComposerDialog::Argument( arg.name, arg.type );
83+
}
84+
functionList << dialogF;
85+
}
86+
d->addFunctions( functionList );
87+
88+
QList< QgsSQLComposerDialog::Function> spatialPredicateList;
89+
Q_FOREACH ( const QgsWfsCapabilities::Function &f, caps.spatialPredicatesList )
90+
{
91+
QgsSQLComposerDialog::Function dialogF;
92+
dialogF.name = f.name;
93+
dialogF.returnType = f.returnType;
94+
dialogF.minArgs = f.minArgs;
95+
dialogF.maxArgs = f.maxArgs;
96+
Q_FOREACH ( const QgsWfsCapabilities::Argument &arg, f.argumentList )
97+
{
98+
dialogF.argumentList << QgsSQLComposerDialog::Argument( arg.name, arg.type );
99+
}
100+
spatialPredicateList << dialogF;
101+
}
102+
d->addSpatialPredicates( spatialPredicateList );
103+
104+
QList< QgsSQLComposerDialog::PairNameType> fieldList;
105+
QString fieldNamePrefix;
106+
if ( bSupportJoins )
107+
{
108+
fieldNamePrefix = QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) + ".";
109+
}
110+
const auto constToList = provider->fields().toList();
111+
for ( const QgsField &field : constToList )
112+
{
113+
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( field.name() ) );
114+
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, field.typeName() );
115+
}
116+
if ( !provider->geometryAttribute().isEmpty() )
117+
{
118+
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( provider->geometryAttribute() ) );
119+
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, QStringLiteral( "geometry" ) );
120+
}
121+
fieldList << QgsSQLComposerDialog::PairNameType( fieldNamePrefix + "*", QString() );
122+
123+
d->addColumnNames( fieldList, QgsSQLStatement::quotedIdentifierIfNeeded( displayedTypeName ) );
124+
125+
return d;
126+
}
127+
128+
QgsWFSValidatorCallback::QgsWFSValidatorCallback( QObject *parent,
129+
const QgsWFSDataSourceURI &uri,
130+
const QString &allSql,
131+
const QgsWfsCapabilities::Capabilities &caps )
132+
: QObject( parent )
133+
, mURI( uri )
134+
, mAllSql( allSql )
135+
, mCaps( caps )
136+
{
137+
}
138+
139+
bool QgsWFSValidatorCallback::isValid( const QString &sqlStr, QString &errorReason, QString &warningMsg )
140+
{
141+
errorReason.clear();
142+
if ( sqlStr.isEmpty() || sqlStr == mAllSql )
143+
return true;
144+
145+
QgsWFSDataSourceURI uri( mURI );
146+
uri.setSql( sqlStr );
147+
148+
QgsDataProvider::ProviderOptions options;
149+
QgsWFSProvider p( uri.uri(), options, mCaps );
150+
if ( !p.isValid() )
151+
{
152+
errorReason = p.processSQLErrorMsg();
153+
return false;
154+
}
155+
warningMsg = p.processSQLWarningMsg();
156+
157+
return true;
158+
}
159+
160+
QgsWFSTableSelectedCallback::QgsWFSTableSelectedCallback( QgsSQLComposerDialog *dialog,
161+
const QgsWFSDataSourceURI &uri,
162+
const QgsWfsCapabilities::Capabilities &caps )
163+
: QObject( dialog )
164+
, mDialog( dialog )
165+
, mURI( uri )
166+
, mCaps( caps )
167+
{
168+
}
169+
170+
void QgsWFSTableSelectedCallback::tableSelected( const QString &name )
171+
{
172+
QString typeName( QgsSQLStatement::stripQuotedIdentifier( name ) );
173+
QString prefixedTypename( mCaps.addPrefixIfNeeded( typeName ) );
174+
if ( prefixedTypename.isEmpty() )
175+
return;
176+
QgsWFSDataSourceURI uri( mURI );
177+
uri.setTypeName( prefixedTypename );
178+
179+
QgsDataProvider::ProviderOptions providerOptions;
180+
QgsWFSProvider p( uri.uri(), providerOptions, mCaps );
181+
if ( !p.isValid() )
182+
{
183+
return;
184+
}
185+
186+
QList< QgsSQLComposerDialog::PairNameType> fieldList;
187+
QString fieldNamePrefix( QgsSQLStatement::quotedIdentifierIfNeeded( typeName ) + "." );
188+
const auto constToList = p.fields().toList();
189+
for ( const QgsField &field : constToList )
190+
{
191+
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( field.name() ) );
192+
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, field.typeName() );
193+
}
194+
if ( !p.geometryAttribute().isEmpty() )
195+
{
196+
QString fieldName( fieldNamePrefix + QgsSQLStatement::quotedIdentifierIfNeeded( p.geometryAttribute() ) );
197+
fieldList << QgsSQLComposerDialog::PairNameType( fieldName, QStringLiteral( "geometry" ) );
198+
}
199+
fieldList << QgsSQLComposerDialog::PairNameType( fieldNamePrefix + "*", QString() );
200+
201+
mDialog->addColumnNames( fieldList, name );
202+
}
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/***************************************************************************
2+
qgswfssubsetstringeditor.h
3+
--------------------------------------
4+
Date : 15-Nov-2020
5+
Copyright : (C) 2020 by Even Rouault
6+
Email : even.rouault at spatials.com
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+
#ifndef QGSWFSSUBSETSTRINGEDITOR_H
18+
#define QGSWFSSUBSETSTRINGEDITOR_H
19+
20+
#include "qgssubsetstringeditorinterface.h"
21+
#include "qgsvectorlayer.h"
22+
#include "qgsguiutils.h"
23+
#include "qgssqlcomposerdialog.h"
24+
#include "qgswfsprovider.h"
25+
#include "qgswfscapabilities.h"
26+
27+
#include <QWidget>
28+
29+
class QgsWfsSubsetStringEditor
30+
{
31+
public:
32+
//! Instantiate a QgsSQLComposerDialog
33+
static QgsSubsetStringEditorInterface *create( QgsVectorLayer *layer, QgsWFSProvider *provider, QWidget *parent, Qt::WindowFlags fl = QgsGuiUtils::ModalDialogFlags );
34+
};
35+
36+
class QgsWFSValidatorCallback: public QObject, public QgsSQLComposerDialog::SQLValidatorCallback
37+
{
38+
Q_OBJECT
39+
40+
public:
41+
QgsWFSValidatorCallback( QObject *parent,
42+
const QgsWFSDataSourceURI &uri, const QString &allSql,
43+
const QgsWfsCapabilities::Capabilities &caps );
44+
bool isValid( const QString &sql, QString &errorReason, QString &warningMsg ) override;
45+
private:
46+
QgsWFSDataSourceURI mURI;
47+
QString mAllSql;
48+
const QgsWfsCapabilities::Capabilities mCaps;
49+
};
50+
51+
class QgsWFSTableSelectedCallback: public QObject, public QgsSQLComposerDialog::TableSelectedCallback
52+
{
53+
Q_OBJECT
54+
55+
public:
56+
QgsWFSTableSelectedCallback( QgsSQLComposerDialog *dialog,
57+
const QgsWFSDataSourceURI &uri,
58+
const QgsWfsCapabilities::Capabilities &caps );
59+
void tableSelected( const QString &name ) override;
60+
61+
private:
62+
QgsSQLComposerDialog *mDialog = nullptr;
63+
QgsWFSDataSourceURI mURI;
64+
const QgsWfsCapabilities::Capabilities mCaps;
65+
};
66+
67+
#endif

0 commit comments

Comments
 (0)
Please sign in to comment.