Navigation Menu

Skip to content

Commit

Permalink
Merge pull request #38218 from alexbruy/save-query
Browse files Browse the repository at this point in the history
restore missed "save query" functionality in the Query builder
  • Loading branch information
alexbruy committed Aug 12, 2020
2 parents 8ccc824 + fa00748 commit 4f6e638
Show file tree
Hide file tree
Showing 6 changed files with 129 additions and 2 deletions.
14 changes: 14 additions & 0 deletions python/gui/auto_generated/qgsquerybuilder.sip.in
Expand Up @@ -54,6 +54,20 @@ Test the constructed sql statement to see if the vector layer data provider like
The number of rows that would be returned is displayed in a message box.
The test uses a "select count(*) from ..." query to test the SQL
statement.
%End

void saveQuery();
%Docstring
Save query to the XML file

.. versionadded:: 3.16
%End

void loadQuery();
%Docstring
Load query from the XML file

.. versionadded:: 3.16
%End

void setDatasourceDescription( const QString &uri );
Expand Down
3 changes: 3 additions & 0 deletions python/gui/auto_generated/qgssearchquerybuilder.sip.in
Expand Up @@ -14,6 +14,9 @@ class QgsSearchQueryBuilder : QDialog
{
%Docstring
Query Builder for search strings

.. deprecated::
Will be removed in QGIS 4
%End

%TypeHeaderCode
Expand Down
97 changes: 97 additions & 0 deletions src/gui/qgsquerybuilder.cpp
Expand Up @@ -22,10 +22,16 @@
#include "qgshelp.h"
#include "qgsgui.h"

#include <QDomDocument>
#include <QDomElement>
#include <QFileDialog>
#include <QInputDialog>
#include <QListView>
#include <QMessageBox>
#include <QRegExp>
#include <QPushButton>
#include <QTextStream>


// constructor used when the query builder must make its own
// connection to the database
Expand Down Expand Up @@ -66,6 +72,16 @@ QgsQueryBuilder::QgsQueryBuilder( QgsVectorLayer *layer,
buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::clear );

pbn = new QPushButton( tr( "&Save…" ) );
buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
pbn->setToolTip( tr( "Save query to QQF file" ) );
connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::saveQuery );

pbn = new QPushButton( tr( "&Load…" ) );
buttonBox->addButton( pbn, QDialogButtonBox::ActionRole );
pbn->setToolTip( tr( "Load query from QQF file" ) );
connect( pbn, &QAbstractButton::clicked, this, &QgsQueryBuilder::loadQuery );

setupGuiViews();

mOrigSubsetString = layer->subsetString();
Expand Down Expand Up @@ -436,3 +452,84 @@ void QgsQueryBuilder::showHelp()
{
QgsHelp::openHelp( QStringLiteral( "working_with_vector/vector_properties.html#query-builder" ) );
}

void QgsQueryBuilder::saveQuery()
{
QgsSettings s;
QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();
//save as qqf (QGIS query file)
QString saveFileName = QFileDialog::getSaveFileName( nullptr, tr( "Save Query to File" ), lastQueryFileDir, tr( "Query files (*.qqf *.QQF)" ) );
if ( saveFileName.isNull() )
{
return;
}

if ( !saveFileName.endsWith( QLatin1String( ".qqf" ), Qt::CaseInsensitive ) )
{
saveFileName += QLatin1String( ".qqf" );
}

QFile saveFile( saveFileName );
if ( !saveFile.open( QIODevice::WriteOnly | QIODevice::Truncate ) )
{
QMessageBox::critical( nullptr, tr( "Save Query to File" ), tr( "Could not open file for writing." ) );
return;
}

QDomDocument xmlDoc;
QDomElement queryElem = xmlDoc.createElement( QStringLiteral( "Query" ) );
QDomText queryTextNode = xmlDoc.createTextNode( txtSQL->text() );
queryElem.appendChild( queryTextNode );
xmlDoc.appendChild( queryElem );

QTextStream fileStream( &saveFile );
xmlDoc.save( fileStream, 2 );

QFileInfo fi( saveFile );
s.setValue( QStringLiteral( "/UI/lastQueryFileDir" ), fi.absolutePath() );
}

void QgsQueryBuilder::loadQuery()
{
QgsSettings s;
QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();

QString queryFileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Query from File" ), lastQueryFileDir, tr( "Query files" ) + " (*.qqf);;" + tr( "All files" ) + " (*)" );
if ( queryFileName.isNull() )
{
return;
}

QFile queryFile( queryFileName );
if ( !queryFile.open( QIODevice::ReadOnly ) )
{
QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "Could not open file for reading." ) );
return;
}
QDomDocument queryDoc;
if ( !queryDoc.setContent( &queryFile ) )
{
QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "File is not a valid xml document." ) );
return;
}

QDomElement queryElem = queryDoc.firstChildElement( QStringLiteral( "Query" ) );
if ( queryElem.isNull() )
{
QMessageBox::critical( nullptr, tr( "Load Query from File" ), tr( "File is not a valid query document." ) );
return;
}

QString query = queryElem.text();

//TODO: test if all the attributes are valid
QgsExpression search( query );
if ( search.hasParserError() )
{
QMessageBox::critical( this, tr( "Query Result" ), search.parserErrorString() );
return;
}

txtSQL->clear();
txtSQL->insertText( query );
}
12 changes: 12 additions & 0 deletions src/gui/qgsquerybuilder.h
Expand Up @@ -72,6 +72,18 @@ class GUI_EXPORT QgsQueryBuilder : public QDialog, private Ui::QgsQueryBuilderBa
*/
void test();

/**
* Save query to the XML file
* \since QGIS 3.16
*/
void saveQuery();

/**
* Load query from the XML file
* \since QGIS 3.16
*/
void loadQuery();

void setDatasourceDescription( const QString &uri );

private slots:
Expand Down
4 changes: 2 additions & 2 deletions src/gui/qgssearchquerybuilder.cpp
Expand Up @@ -382,7 +382,7 @@ void QgsSearchQueryBuilder::saveQuery()
QgsSettings s;
QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();
//save as qqt (QGIS query file)
QString saveFileName = QFileDialog::getSaveFileName( nullptr, tr( "Save Query to File" ), lastQueryFileDir, QStringLiteral( "*.qqf" ) );
QString saveFileName = QFileDialog::getSaveFileName( nullptr, tr( "Save Query to File" ), lastQueryFileDir, tr( "Query files (*.qqf *.QQF)" ) );
if ( saveFileName.isNull() )
{
return;
Expand Down Expand Up @@ -418,7 +418,7 @@ void QgsSearchQueryBuilder::loadQuery()
QgsSettings s;
QString lastQueryFileDir = s.value( QStringLiteral( "/UI/lastQueryFileDir" ), QDir::homePath() ).toString();

QString queryFileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Query from File" ), lastQueryFileDir, tr( "Query files" ) + " (*.qqf);;" + tr( "All files" ) + " (*)" );
QString queryFileName = QFileDialog::getOpenFileName( nullptr, tr( "Load Query from File" ), lastQueryFileDir, tr( "Query files" ) + " (*.qqf *.QQF);;" + tr( "All files" ) + " (*)" );
if ( queryFileName.isNull() )
{
return;
Expand Down
1 change: 1 addition & 0 deletions src/gui/qgssearchquerybuilder.h
Expand Up @@ -32,6 +32,7 @@ class QgsVectorLayer;
* \ingroup gui
* \class QgsSearchQueryBuilder
* \brief Query Builder for search strings
* \deprecated Will be removed in QGIS 4
*/
class GUI_EXPORT QgsSearchQueryBuilder : public QDialog, private Ui::QgsQueryBuilderBase
{
Expand Down

0 comments on commit 4f6e638

Please sign in to comment.