29#include <Qsci/qscilexer.h>
40 connect( mTablesCombo,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsSQLComposerDialog::mTablesCombo_currentIndexChanged );
41 connect( mColumnsCombo,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsSQLComposerDialog::mColumnsCombo_currentIndexChanged );
42 connect( mSpatialPredicatesCombo,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsSQLComposerDialog::mSpatialPredicatesCombo_currentIndexChanged );
43 connect( mFunctionsCombo,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsSQLComposerDialog::mFunctionsCombo_currentIndexChanged );
44 connect( mOperatorsCombo,
static_cast<void ( QComboBox::* )(
int )
>( &QComboBox::currentIndexChanged ),
this, &QgsSQLComposerDialog::mOperatorsCombo_currentIndexChanged );
45 connect( mAddJoinButton, &QPushButton::clicked,
this, &QgsSQLComposerDialog::mAddJoinButton_clicked );
46 connect( mRemoveJoinButton, &QPushButton::clicked,
this, &QgsSQLComposerDialog::mRemoveJoinButton_clicked );
47 connect( mTableJoins, &QTableWidget::itemSelectionChanged,
this, &QgsSQLComposerDialog::mTableJoins_itemSelectionChanged );
49 mQueryEdit->setWrapMode( QsciScintilla::WrapWord );
50 mQueryEdit->installEventFilter(
this );
51 mColumnsEditor->installEventFilter(
this );
52 mTablesEditor->installEventFilter(
this );
53 mTableJoins->installEventFilter(
this );
54 mWhereEditor->installEventFilter(
this );
55 mOrderEditor->installEventFilter(
this );
56 mTablesCombo->view()->installEventFilter(
this );
59 connect( mButtonBox->button( QDialogButtonBox::Reset ), &QAbstractButton::clicked,
60 this, &QgsSQLComposerDialog::reset );
62 connect( mQueryEdit, &QsciScintilla::textChanged,
63 this, &QgsSQLComposerDialog::splitSQLIntoFields );
64 connect( mColumnsEditor, &QTextEdit::textChanged,
65 this, &QgsSQLComposerDialog::buildSQLFromFields );
66 connect( mTablesEditor, &QLineEdit::textChanged,
67 this, &QgsSQLComposerDialog::buildSQLFromFields );
68 connect( mWhereEditor, &QTextEdit::textChanged,
69 this, &QgsSQLComposerDialog::buildSQLFromFields );
70 connect( mOrderEditor, &QTextEdit::textChanged,
71 this, &QgsSQLComposerDialog::buildSQLFromFields );
72 connect( mTableJoins, &QTableWidget::cellChanged,
73 this, &QgsSQLComposerDialog::buildSQLFromFields );
74 connect( mButtonBox, &QDialogButtonBox::helpRequested,
75 this, &QgsSQLComposerDialog::showHelp );
78 baseList << QStringLiteral(
"SELECT" );
79 baseList << QStringLiteral(
"FROM" );
80 baseList << QStringLiteral(
"JOIN" );
81 baseList << QStringLiteral(
"ON" );
82 baseList << QStringLiteral(
"USING" );
83 baseList << QStringLiteral(
"WHERE" );
84 baseList << QStringLiteral(
"AND" );
85 baseList << QStringLiteral(
"OR" );
86 baseList << QStringLiteral(
"NOT" );
87 baseList << QStringLiteral(
"IS" );
88 baseList << QStringLiteral(
"NULL" );
89 baseList << QStringLiteral(
"LIKE" );
90 baseList << QStringLiteral(
"ORDER" );
91 baseList << QStringLiteral(
"BY" );
94 QStringList operatorsList;
95 operatorsList << QStringLiteral(
"AND" );
96 operatorsList << QStringLiteral(
"OR" );
97 operatorsList << QStringLiteral(
"NOT" );
98 operatorsList << QStringLiteral(
"=" );
99 operatorsList << QStringLiteral(
"<" );
100 operatorsList << QStringLiteral(
"<=" );
101 operatorsList << QStringLiteral(
">" );
102 operatorsList << QStringLiteral(
">=" );
103 operatorsList << QStringLiteral(
"<>" );
104 operatorsList << QStringLiteral(
"BETWEEN" );
105 operatorsList << QStringLiteral(
"NOT BETWEEN" );
106 operatorsList << QStringLiteral(
"IS" );
107 operatorsList << QStringLiteral(
"IS NOT" );
108 operatorsList << QStringLiteral(
"IN" );
109 operatorsList << QStringLiteral(
"LIKE" );
112 mAggregatesCombo->hide();
113 mFunctionsCombo->hide();
114 mSpatialPredicatesCombo->hide();
115 mStringFunctionsCombo->hide();
117 delete mPageColumnsValues;
118 mPageColumnsValues =
nullptr;
120 mRemoveJoinButton->setEnabled(
false );
122 mTableJoins->setRowCount( 0 );
123 mTableJoins->setItem( 0, 0,
new QTableWidgetItem( QString() ) );
124 mTableJoins->setItem( 0, 1,
new QTableWidgetItem( QString() ) );
132 delete mQueryEdit->lexer()->apis();
133 mQueryEdit->lexer()->setAPIs(
nullptr );
138 if ( event->type() == QEvent::FocusIn )
140 if ( obj == mTablesCombo->view() )
141 lastSearchedText.clear();
143 mFocusedObject = obj;
147 if ( event->type() == QEvent::KeyPress && obj == mTablesCombo->view() )
149 QString currentString = ( ( QKeyEvent * )event )->text();
150 if ( !currentString.isEmpty() && ( ( currentString[0] >=
'a' && currentString[0] <=
'z' ) ||
151 ( currentString[0] >=
'A' && currentString[0] <=
'Z' ) ||
152 ( currentString[0] >=
'0' && currentString[0] <=
'9' ) ||
153 currentString[0] ==
':' || currentString[0] ==
'_' || currentString[0] ==
' ' ||
154 currentString[0] ==
'(' || currentString[0] ==
')' ) )
158 const int attemptCount = ( lastSearchedText.isEmpty() ) ? 1 : 2;
159 for (
int attempt = 0; attempt < attemptCount; attempt ++ )
162 lastSearchedText += currentString;
164 lastSearchedText = currentString;
169 int iBestCandidate = 0;
170 int idxInTextOfBestCandidate = 1000;
171 for (
int i = 1; i < mTablesCombo->count(); i++ )
173 const int idxInText = mTablesCombo->itemText( i ).indexOf( lastSearchedText, Qt::CaseInsensitive );
174 if ( idxInText >= 0 && idxInText < idxInTextOfBestCandidate )
177 idxInTextOfBestCandidate = idxInText;
180 if ( iBestCandidate > 0 )
182 mTablesCombo->view()->setCurrentIndex( mTablesCombo->model()->index( 0, 0 ).sibling( iBestCandidate, 0 ) );
186 lastSearchedText.clear();
190 return QDialog::eventFilter( obj, event );
195 mTableSelectedCallback = tableSelectedCallback;
200 mSQLValidatorCallback = sqlValidatorCallback;
206 mQueryEdit->setText(
sql );
211 return mQueryEdit->text();
214void QgsSQLComposerDialog::accept()
216 if ( mSQLValidatorCallback )
218 QString errorMsg, warningMsg;
219 if ( !mSQLValidatorCallback->
isValid(
sql(), errorMsg, warningMsg ) )
221 if ( errorMsg.isEmpty() )
222 errorMsg = tr(
"An error occurred during evaluation of the SQL statement." );
223 QMessageBox::critical(
this, tr(
"SQL Evaluation" ), errorMsg );
226 if ( !warningMsg.isEmpty() )
228 QMessageBox::warning(
this, tr(
"SQL Evaluation" ), warningMsg );
238void QgsSQLComposerDialog::buildSQLFromFields()
240 if ( mAlreadyModifyingFields )
242 mAlreadyModifyingFields =
true;
243 QString
sql( QStringLiteral(
"SELECT " ) );
245 sql += QLatin1String(
"DISTINCT " );
246 sql += mColumnsEditor->toPlainText();
247 sql += QLatin1String(
" FROM " );
248 sql += mTablesEditor->text();
250 const int rows = mTableJoins->rowCount();
251 for (
int i = 0; i < rows; i++ )
253 QTableWidgetItem *itemTable = mTableJoins->item( i, 0 );
254 QTableWidgetItem *itemOn = mTableJoins->item( i, 1 );
255 if ( itemTable && !itemTable->text().isEmpty() &&
256 itemOn && !itemOn->text().isEmpty() )
258 sql += QLatin1String(
" JOIN " );
259 sql += itemTable->text();
260 sql += QLatin1String(
" ON " );
261 sql += itemOn->text();
265 if ( !mWhereEditor->toPlainText().isEmpty() )
267 sql += QLatin1String(
" WHERE " );
268 sql += mWhereEditor->toPlainText();
270 if ( !mOrderEditor->toPlainText().isEmpty() )
272 sql += QLatin1String(
" ORDER BY " );
273 sql += mOrderEditor->toPlainText();
275 mQueryEdit->setText(
sql );
277 mAlreadyModifyingFields =
false;
280void QgsSQLComposerDialog::splitSQLIntoFields()
282 if ( mAlreadyModifyingFields )
285 if (
sql.hasParserError() )
291 const QList<QgsSQLStatement::NodeSelectedColumn *> columns = nodeSelect->
columns();
293 const auto constColumns = columns;
296 if ( !columnText.isEmpty() )
297 columnText += QLatin1String(
", " );
298 columnText += column->dump();
301 const QList<QgsSQLStatement::NodeTableDef *> tables = nodeSelect->
tables();
303 const auto constTables = tables;
306 if ( !tablesText.isEmpty() )
307 tablesText += QLatin1String(
", " );
309 tablesText += table->dump();
315 whereText = where->
dump();
318 const QList<QgsSQLStatement::NodeColumnSorted *> orderColumns = nodeSelect->
orderBy();
319 const auto constOrderColumns = orderColumns;
322 if ( !orderText.isEmpty() )
323 orderText += QLatin1String(
", " );
324 orderText += column->dump();
327 const QList<QgsSQLStatement::NodeJoin *> joins = nodeSelect->
joins();
329 mAlreadyModifyingFields =
true;
330 mColumnsEditor->setPlainText( columnText );
331 mTablesEditor->setText( tablesText );
332 mWhereEditor->setPlainText( whereText );
333 mOrderEditor->setPlainText( orderText );
335 mTableJoins->setRowCount( joins.size() + 1 );
337 const auto constJoins = joins;
341 mTableJoins->setItem( iRow, 0,
new QTableWidgetItem( join->tableDef()->dump() ) );
342 if ( join->onExpr() )
343 mTableJoins->setItem( iRow, 1,
new QTableWidgetItem( join->onExpr()->dump() ) );
345 mTableJoins->setItem( iRow, 1,
new QTableWidgetItem( QString() ) );
348 mTableJoins->setItem( iRow, 0,
new QTableWidgetItem( QString() ) );
349 mTableJoins->setItem( iRow, 1,
new QTableWidgetItem( QString() ) );
351 mAlreadyModifyingFields =
false;
356 const auto constList = list;
357 for (
const QString &name : constList )
358 mapTableEntryTextToName[name] = name;
359 mTablesCombo->addItems( list );
365 QStringList listCombo;
367 const auto constListNameTitle = listNameTitle;
370 listApi << pair.first;
371 QString entryText( pair.first );
372 if ( !pair.second.isEmpty() && pair.second != pair.first )
374 if ( pair.second.size() < 40 )
375 entryText +=
" (" + pair.second +
")";
377 entryText +=
" (" + pair.second.mid( 0, 20 ) + QChar( 0x2026 ) + pair.second.mid( pair.second.size() - 20 ) +
")";
379 listCombo << entryText;
380 mapTableEntryTextToName[entryText] = pair.first;
382 mTablesCombo->addItems( listCombo );
388 QList<PairNameType> listPair;
389 const auto constList = list;
390 for (
const QString &name : constList )
395static QString sanitizeType( QString type )
397 if ( type.startsWith( QLatin1String(
"xs:" ) ) )
398 return type.mid( 3 );
399 if ( type.startsWith( QLatin1String(
"xsd:" ) ) )
400 return type.mid( 4 );
401 if ( type == QLatin1String(
"gml:AbstractGeometryType" ) )
402 return QStringLiteral(
"geometry" );
408 mAlreadySelectedTables.insert( tableName );
409 if ( mColumnsCombo->count() > 1 )
410 mColumnsCombo->insertSeparator( mColumnsCombo->count() );
412 QStringList listCombo;
414 const auto constList = list;
417 listApi << pair.first;
418 QString entryText( pair.first );
419 if ( !pair.second.isEmpty() )
421 entryText +=
" (" + sanitizeType( pair.second ) +
")";
423 listCombo << entryText;
424 mapColumnEntryTextToName[entryText] = pair.first;
426 mColumnsCombo->addItems( listCombo );
433 mOperatorsCombo->addItems( list );
441 return QObject::tr(
"%1 to %2 arguments" ).arg( f.
minArgs ).arg( f.
maxArgs );
448 return QObject::tr(
"%n argument(s)",
nullptr, f.
minArgs );
452 return QObject::tr(
"%n argument(s) or more",
nullptr, f.
minArgs );
458void QgsSQLComposerDialog::getFunctionList(
const QList<Function> &list,
459 QStringList &listApi,
460 QStringList &listCombo,
461 QMap<QString, QString> &mapEntryTextToName )
463 const auto constList = list;
464 for (
const Function &f : constList )
467 QString entryText( f.
name );
468 entryText += QLatin1Char(
'(' );
473 if ( f.
minArgs >= 0 && i >= f.
minArgs ) entryText += QLatin1Char(
'[' );
474 if ( i > 0 ) entryText += QLatin1String(
", " );
482 const QString sanitizedType( sanitizeType( f.
argumentList[i].type ) );
486 entryText += QLatin1String(
": " );
487 entryText += sanitizedType;
490 if ( f.
minArgs >= 0 && i >= f.
minArgs ) entryText += QLatin1Char(
']' );
492 if ( entryText.size() > 60 )
495 entryText += QLatin1Char(
'(' );
496 entryText += getFunctionAbbridgedParameters( f );
501 entryText += getFunctionAbbridgedParameters( f );
503 entryText += QLatin1Char(
')' );
505 entryText +=
": " + sanitizeType( f.
returnType );
506 listCombo << entryText;
507 mapEntryTextToName[entryText] = f.
name +
"(";
513 QList<Function> listFunction;
514 const auto constList = list;
515 for (
const QString &name : constList )
527 QStringList listCombo;
528 getFunctionList( list, listApi, listCombo, mapSpatialPredicateEntryTextToName );
529 mSpatialPredicatesCombo->addItems( listCombo );
530 mSpatialPredicatesCombo->show();
536 QList<Function> listFunction;
537 const auto constList = list;
538 for (
const QString &name : constList )
550 QStringList listCombo;
551 getFunctionList( list, listApi, listCombo, mapFunctionEntryTextToName );
552 mFunctionsCombo->addItems( listCombo );
553 mFunctionsCombo->show();
557void QgsSQLComposerDialog::loadTableColumns(
const QString &table )
559 if ( mTableSelectedCallback )
561 if ( !mAlreadySelectedTables.contains( table ) )
564 mAlreadySelectedTables.insert( table );
569static void resetCombo( QComboBox *combo )
576 QMetaObject::invokeMethod( combo,
"setCurrentIndex", Qt::QueuedConnection, Q_ARG(
int, 0 ) );
579void QgsSQLComposerDialog::mTablesCombo_currentIndexChanged(
int )
581 const int index = mTablesCombo->currentIndex();
584 QObject *obj = mFocusedObject;
585 const QString newText = mapTableEntryTextToName[mTablesCombo->currentText()];
586 loadTableColumns( newText );
587 if ( obj == mTablesEditor )
589 const QString currentText = mTablesEditor->text();
590 if ( currentText.isEmpty() )
591 mTablesEditor->setText( newText );
593 mTablesEditor->setText( currentText +
", " + newText );
595 else if ( obj == mTableJoins )
597 if ( mTableJoins->selectedItems().size() == 1 )
599 mTableJoins->selectedItems().at( 0 )->setText( newText );
602 else if ( obj == mWhereEditor )
604 mWhereEditor->insertPlainText( newText );
606 else if ( obj == mOrderEditor )
608 mOrderEditor->insertPlainText( newText );
610 else if ( obj == mQueryEdit )
612 mQueryEdit->insertText( newText );
614 resetCombo( mTablesCombo );
617void QgsSQLComposerDialog::mColumnsCombo_currentIndexChanged(
int )
619 const int index = mColumnsCombo->currentIndex();
622 QObject *obj = mFocusedObject;
623 const QString newText = mapColumnEntryTextToName[mColumnsCombo->currentText()];
624 if ( obj == mColumnsEditor )
626 const QString currentText = mColumnsEditor->toPlainText();
627 if ( currentText.isEmpty() )
628 mColumnsEditor->insertPlainText( newText );
630 mColumnsEditor->insertPlainText(
",\n" + newText );
632 else if ( obj == mTableJoins )
634 if ( mTableJoins->selectedItems().size() == 1 &&
635 mTableJoins->selectedItems().at( 0 )->column() == 1 )
637 const QString currentText( mTableJoins->selectedItems().at( 0 )->text() );
638 if ( !currentText.isEmpty() && !currentText.contains( QLatin1String(
"=" ) ) )
639 mTableJoins->selectedItems().at( 0 )->setText( currentText +
" = " + newText );
641 mTableJoins->selectedItems().at( 0 )->setText( currentText + newText );
644 else if ( obj == mWhereEditor )
646 mWhereEditor->insertPlainText( newText );
648 else if ( obj == mOrderEditor )
650 mOrderEditor->insertPlainText( newText );
652 else if ( obj == mQueryEdit )
654 mQueryEdit->insertText( newText );
656 resetCombo( mColumnsCombo );
659void QgsSQLComposerDialog::mFunctionsCombo_currentIndexChanged(
int )
661 functionCurrentIndexChanged( mFunctionsCombo, mapFunctionEntryTextToName );
664void QgsSQLComposerDialog::mSpatialPredicatesCombo_currentIndexChanged(
int )
666 functionCurrentIndexChanged( mSpatialPredicatesCombo, mapSpatialPredicateEntryTextToName );
669void QgsSQLComposerDialog::functionCurrentIndexChanged( QComboBox *combo,
670 const QMap<QString, QString> &mapEntryTextToName )
672 const int index = combo->currentIndex();
675 QObject *obj = mFocusedObject;
676 const QString newText = mapEntryTextToName[combo->currentText()];
677 if ( obj == mColumnsEditor )
679 mColumnsEditor->insertPlainText( newText );
681 else if ( obj == mWhereEditor )
683 mWhereEditor->insertPlainText( newText );
685 else if ( obj == mQueryEdit )
687 mQueryEdit->insertText( newText );
692void QgsSQLComposerDialog::mOperatorsCombo_currentIndexChanged(
int )
694 const int index = mOperatorsCombo->currentIndex();
697 QObject *obj = mFocusedObject;
698 const QString newText = mOperatorsCombo->currentText();
699 if ( obj == mColumnsEditor )
701 mColumnsEditor->insertPlainText( newText );
703 else if ( obj == mWhereEditor )
705 mWhereEditor->insertPlainText( newText );
707 else if ( obj == mTableJoins )
709 if ( mTableJoins->selectedItems().size() == 1 &&
710 mTableJoins->selectedItems().at( 0 )->column() == 1 )
712 const QString currentText( mTableJoins->selectedItems().at( 0 )->text() );
713 mTableJoins->selectedItems().at( 0 )->setText( currentText + newText );
716 else if ( obj == mQueryEdit )
718 mQueryEdit->insertText( newText );
720 resetCombo( mOperatorsCombo );
723void QgsSQLComposerDialog::mAddJoinButton_clicked()
725 int insertRow = mTableJoins->currentRow();
726 const int rowCount = mTableJoins->rowCount();
728 insertRow = rowCount;
729 mTableJoins->setRowCount( rowCount + 1 );
730 for (
int row = rowCount ; row > insertRow + 1; row -- )
732 mTableJoins->setItem( row, 0, mTableJoins->takeItem( row - 1, 0 ) );
733 mTableJoins->setItem( row, 1, mTableJoins->takeItem( row - 1, 1 ) );
735 mTableJoins->setItem( ( insertRow == rowCount ) ? insertRow : insertRow + 1, 0,
new QTableWidgetItem( QString() ) );
736 mTableJoins->setItem( ( insertRow == rowCount ) ? insertRow : insertRow + 1, 1,
new QTableWidgetItem( QString() ) );
739void QgsSQLComposerDialog::mRemoveJoinButton_clicked()
741 int row = mTableJoins->currentRow();
744 const int rowCount = mTableJoins->rowCount();
745 for ( ; row < rowCount - 1; row ++ )
747 mTableJoins->setItem( row, 0, mTableJoins->takeItem( row + 1, 0 ) );
748 mTableJoins->setItem( row, 1, mTableJoins->takeItem( row + 1, 1 ) );
750 mTableJoins->setRowCount( rowCount - 1 );
752 buildSQLFromFields();
755void QgsSQLComposerDialog::reset()
757 mQueryEdit->setText( mResetSql );
760void QgsSQLComposerDialog::mTableJoins_itemSelectionChanged()
762 mRemoveJoinButton->setEnabled( mTableJoins->selectedItems().size() == 1 );
769 delete mQueryEdit->lexer()->apis();
770 QsciAPIs *apis =
new QsciAPIs( mQueryEdit->lexer() );
772 const auto constMApiList = mApiList;
773 for (
const QString &
str : constMApiList )
779 mQueryEdit->lexer()->setAPIs( apis );
784 mJoinsLabels->setVisible( on );
785 mTableJoins->setVisible( on );
786 mAddJoinButton->setVisible( on );
787 mRemoveJoinButton->setVisible( on );
788 mTablesCombo->setVisible( on );
790 QString mainTypenameFormatted;
791 if ( !mainTypename.isEmpty() )
792 mainTypenameFormatted =
"(" + mainTypename +
")";
793 mQueryEdit->setToolTip( tr(
"This is the SQL query editor. The SQL statement can select data from several tables, \n"
794 "but it must compulsory include the main typename %1 in the selected tables, \n"
795 "and only the geometry column of the main typename can be used as the geometry column of the resulting layer." ).arg( mainTypenameFormatted ) );
798void QgsSQLComposerDialog::showHelp()
800 QgsHelp::openHelp( QStringLiteral(
"working_with_ogc/ogc_client_support.html#ogc-wfs" ) );
static void openHelp(const QString &key)
Opens help topic for the given help key using default system web browser.
Callback to do validation check on dialog validation.
virtual bool isValid(const QString &sql, QString &errorReason, QString &warningMsg)=0
method should return true if the SQL is valid. Otherwise return false and set the errorReason
Callback to do actions on table selection.
virtual void tableSelected(const QString &name)=0
method called when a table is selected
bool eventFilter(QObject *obj, QEvent *event) override
QgsSQLComposerDialog(QWidget *parent=nullptr, Qt::WindowFlags fl=QgsGuiUtils::ModalDialogFlags)
constructor
void addSpatialPredicates(const QStringList &list)
add a list of spatial predicates
void setSQLValidatorCallback(SQLValidatorCallback *sqlValidatorCallback)
Set a callback that will be called when the OK button is pushed.
void setTableSelectedCallback(TableSelectedCallback *tableSelectedCallback)
Set a callback that will be called when a new table is selected, so that new column names can be adde...
QPair< QString, QString > PairNameType
pair (name, type)
void addOperators(const QStringList &list)
add a list of operators
~QgsSQLComposerDialog() override
void addColumnNames(const QStringList &list, const QString &tableName)
add a list of column names
void setSupportMultipleTables(bool bMultipleTables, const QString &mainTypename=QString())
Sets if multiple tables/joins are supported. Default is false.
void addApis(const QStringList &list)
add a list of API for autocompletion
void setSql(const QString &sql)
initialize the SQL statement
void addFunctions(const QStringList &list)
add a list of functions
void addTableNames(const QStringList &list)
add a list of table names
QPair< QString, QString > PairNameTitle
pair (name, title)
QString sql() const
Gets the SQL statement.
QList< QgsSQLStatement::NodeColumnSorted * > orderBy() const
Returns the list of order by columns.
QList< QgsSQLStatement::NodeSelectedColumn * > columns() const
Returns the list of columns.
bool distinct() const
Returns if the SELECT is DISTINCT.
QList< QgsSQLStatement::NodeJoin * > joins() const
Returns the list of joins.
QgsSQLStatement::Node * where() const
Returns the where clause.
QList< QgsSQLStatement::NodeTableDef * > tables() const
Returns the list of tables.
virtual QString dump() const =0
Abstract virtual dump method.
Class for parsing SQL statements.
static QString quotedIdentifierIfNeeded(const QString &name)
Returns a quoted column reference (in double quotes) if needed, or otherwise the original string.
Interface for a dialog that can edit subset strings.
Represents a vector layer which manages a vector based data sets.
virtual bool setSubsetString(const QString &subset)
Sets the string (typically sql) used to define a subset of the layer.
description of server functions
QString returnType
Returns type, or empty if unknown.
int maxArgs
maximum number of argument (or -1 if unknown)
int minArgs
minimum number of argument (or -1 if unknown)
QList< Argument > argumentList
list of arguments. May be empty despite minArgs > 0