Skip to content

Commit 29be5dc

Browse files
author
wonder
committedMar 16, 2006

10 files changed

+432
-208
lines changed
 

‎src/core/qgssearchstring.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,11 @@
1616
* *
1717
***************************************************************************/
1818
/* $Id$ */
19-
20-
#include <qstring.h>
19+
20+
#ifndef QGSSEARCHSTRING_H
21+
#define QGSSEARCHSTRING_H
22+
23+
#include <QString>
2124

2225
class QgsSearchTreeNode;
2326

@@ -75,3 +78,4 @@ class QgsSearchString
7578
QString mParserErrorMsg;
7679
};
7780

81+
#endif

‎src/gui/Makefile.am

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ libqgis_guiHEADERS = \
6969
qgisinterface.h \
7070
qgsabout.h \
7171
qgsaddattrdialog.h \
72-
qgsadvancedattrsearch.h \
7372
qgsattributeaction.h \
7473
qgsattributeactiondialog.h \
7574
qgsattributedialog.h \
@@ -130,6 +129,7 @@ libqgis_guiHEADERS = \
130129
qgsrasterlayerproperties.h \
131130
qgsrubberband.h \
132131
qgsrunprocess.h \
132+
qgssearchquerybuilder.h \
133133
qgsserversourceselect.h \
134134
qgssinglesymboldialog.h \
135135
qgssinglesymbolrenderer.h \
@@ -146,7 +146,6 @@ libqgis_gui_la_MOC = \
146146
qgisinterface.moc.cpp \
147147
qgsabout.moc.cpp \
148148
qgsaddattrdialog.moc.cpp \
149-
qgsadvancedattrsearch.moc.cpp \
150149
qgsattributeactiondialog.moc.cpp \
151150
qgsattributedialog.moc.cpp \
152151
qgsattributetabledisplay.moc.cpp \
@@ -187,6 +186,7 @@ libqgis_gui_la_MOC = \
187186
qgsprojectproperties.moc.cpp \
188187
qgsrasterlayerproperties.moc.cpp \
189188
qgsrunprocess.moc.cpp \
189+
qgssearchquerybuilder.moc.cpp \
190190
qgsserversourceselect.moc.cpp \
191191
qgssinglesymboldialog.moc.cpp \
192192
qgsuniquevaluedialog.moc.cpp \
@@ -199,8 +199,7 @@ libqgis_gui_la_SOURCES = \
199199
qgisinterface.cpp \
200200
qgsabout.cpp \
201201
qgsaddattrdialog.cpp \
202-
qgsadvancedattrsearch.cpp \
203-
qgsattributeaction.cpp \
202+
qgsattributeaction.cpp \
204203
qgsattributeactiondialog.cpp \
205204
qgsattributedialog.cpp \
206205
qgsattributetable.cpp \
@@ -258,6 +257,7 @@ libqgis_gui_la_SOURCES = \
258257
qgsrasterlayerproperties.cpp \
259258
qgsrubberband.cpp \
260259
qgsrunprocess.cpp \
260+
qgssearchquerybuilder.cpp \
261261
qgsserversourceselect.cpp \
262262
qgssinglesymboldialog.cpp \
263263
qgssinglesymbolrenderer.cpp \

‎src/gui/qgsadvancedattrsearch.cpp

Lines changed: 0 additions & 55 deletions
This file was deleted.

‎src/gui/qgsadvancedattrsearch.h

Lines changed: 0 additions & 40 deletions
This file was deleted.

‎src/gui/qgsattributetabledisplay.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121

2222
#include "qgsapplication.h"
2323
#include "qgsaddattrdialog.h"
24-
#include "qgsadvancedattrsearch.h"
2524
#include "qgsdelattrdialog.h"
2625
#include "qgsfeature.h"
26+
#include "qgssearchquerybuilder.h"
2727
#include "qgssearchtreenode.h"
2828
#include "qgsvectorlayer.h"
2929
#include "qgsvectordataprovider.h"
@@ -252,12 +252,12 @@ void QgsAttributeTableDisplay::search()
252252

253253
void QgsAttributeTableDisplay::advancedSearch()
254254
{
255-
QgsAdvancedAttrSearch* searchDlg = new QgsAdvancedAttrSearch(this);
256-
if (searchDlg->exec())
255+
QgsSearchQueryBuilder dlg(mLayer, this);
256+
dlg.setSearchString(mSearchString);
257+
if (dlg.exec())
257258
{
258-
doSearch(searchDlg->searchString());
259+
doSearch(dlg.searchString());
259260
}
260-
delete searchDlg;
261261
}
262262

263263

@@ -287,6 +287,8 @@ void QgsAttributeTableDisplay::searchShowResultsChanged(int item)
287287

288288
void QgsAttributeTableDisplay::doSearch(const QString& searchString)
289289
{
290+
mSearchString = searchString;
291+
290292
// parse search string (and build parsed tree)
291293
QgsSearchString search;
292294
if (!search.setString(searchString))
@@ -314,7 +316,7 @@ void QgsAttributeTableDisplay::doSearch(const QString& searchString)
314316
QgsVectorDataProvider* provider = mLayer->getDataProvider();
315317
provider->reset();
316318
mSearchIds.clear();
317-
while (fet = provider->getNextFeature(true))
319+
while ((fet = provider->getNextFeature(true)))
318320
{
319321
if (searchTree->checkAgainst(fet->attributeMap()))
320322
{

‎src/gui/qgsattributetabledisplay.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ class QgsAttributeTableDisplay:public QDialog, private Ui::QgsAttributeTableBase
6666
private:
6767
/** Set the icon theme for this dialog */
6868
void setTheme();
69+
70+
QString mSearchString;
6971
};
7072

7173
#endif

‎src/gui/qgssearchquerybuilder.cpp

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,291 @@
1+
/***************************************************************************
2+
qgssearchquerybuilder.cpp - Query builder for search strings
3+
----------------------
4+
begin : March 2006
5+
copyright : (C) 2006 by Martin Dobias
6+
email : wonder.sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
/* $Id$ */
16+
17+
#include <iostream>
18+
#include <q3listbox.h>
19+
#include <QMessageBox>
20+
#include "qgsfeature.h"
21+
#include "qgssearchquerybuilder.h"
22+
#include "qgssearchstring.h"
23+
#include "qgssearchtreenode.h"
24+
#include "qgsvectordataprovider.h"
25+
#include "qgsvectorlayer.h"
26+
27+
28+
QgsSearchQueryBuilder::QgsSearchQueryBuilder(QgsVectorLayer* layer,
29+
QWidget *parent, Qt::WFlags fl)
30+
: QDialog(parent, fl), mLayer(layer)
31+
{
32+
setupUi(this);
33+
34+
lblDataUri->setText(layer->name());
35+
populateFields();
36+
}
37+
38+
QgsSearchQueryBuilder::~QgsSearchQueryBuilder()
39+
{
40+
}
41+
42+
43+
void QgsSearchQueryBuilder::populateFields()
44+
{
45+
const std::vector<QgsField>& fields = mLayer->fields();
46+
for (uint i = 0; i < fields.size(); i++)
47+
{
48+
QgsField f = fields[i];
49+
QString fieldName = f.name();
50+
mFieldMap[fieldName] = f;
51+
lstFields->insertItem(fieldName);
52+
}
53+
}
54+
55+
void QgsSearchQueryBuilder::getFieldValues(uint limit)
56+
{
57+
// clear the values list
58+
lstValues->clear();
59+
60+
// determine the field type
61+
QgsField field = mFieldMap[lstFields->currentText()];
62+
QString fieldName = field.name().lower();
63+
bool numeric = field.isNumeric();
64+
65+
// TODO: need optimized getNextFeature which won't extract geometry
66+
QgsFeature* fet;
67+
QString value;
68+
std::vector<QgsFeatureAttribute>::const_iterator it;
69+
QgsVectorDataProvider* provider = mLayer->getDataProvider();
70+
provider->reset();
71+
while ((fet = provider->getNextFeature(true)) &&
72+
(limit == 0 || lstValues->count() != limit))
73+
{
74+
const std::vector<QgsFeatureAttribute>& attributes = fet->attributeMap();
75+
for (it = attributes.begin(); it != attributes.end(); it++)
76+
{
77+
if ( (*it).fieldName().lower() == fieldName)
78+
{
79+
value = (*it).fieldValue();
80+
break;
81+
}
82+
}
83+
84+
if (!numeric)
85+
{
86+
// put string in single quotes
87+
value = "'" + value + "'";
88+
}
89+
90+
// add item only if it's not there already
91+
if (lstValues->findItem(value) == 0)
92+
lstValues->insertItem(value);
93+
94+
delete fet;
95+
}
96+
provider->reset();
97+
98+
}
99+
100+
void QgsSearchQueryBuilder::on_btnSampleValues_clicked()
101+
{
102+
getFieldValues(25);
103+
}
104+
105+
void QgsSearchQueryBuilder::on_btnGetAllValues_clicked()
106+
{
107+
getFieldValues(0);
108+
}
109+
110+
void QgsSearchQueryBuilder::on_btnTest_clicked()
111+
{
112+
long count = countRecords(txtSQL->text());
113+
114+
// error?
115+
if (count == -1)
116+
return;
117+
118+
QString str;
119+
if (count)
120+
str.sprintf(tr("Found %d matching features."), count);
121+
else
122+
str = tr("No matching features found.");
123+
QMessageBox::information(this, tr("Search results"), str);
124+
}
125+
126+
// This method tests the number of records that would be returned
127+
long QgsSearchQueryBuilder::countRecords(QString searchString)
128+
{
129+
QgsSearchString search;
130+
if (!search.setString(searchString))
131+
{
132+
QMessageBox::critical(this, tr("Search string parsing error"), search.parserErrorMsg());
133+
return -1;
134+
}
135+
136+
QgsSearchTreeNode* searchTree = search.tree();
137+
if (searchTree == NULL)
138+
{
139+
// entered empty search string
140+
return mLayer->featureCount();
141+
}
142+
143+
QApplication::setOverrideCursor(Qt::waitCursor);
144+
145+
int count = 0;
146+
147+
// TODO: need optimized getNextFeature which won't extract geometry
148+
QgsFeature* fet;
149+
QgsVectorDataProvider* provider = mLayer->getDataProvider();
150+
provider->reset();
151+
while ((fet = provider->getNextFeature(true)))
152+
{
153+
if (searchTree->checkAgainst(fet->attributeMap()))
154+
{
155+
count++;
156+
}
157+
delete fet;
158+
159+
// check if there were errors during evaulating
160+
if (searchTree->hasError())
161+
break;
162+
}
163+
provider->reset();
164+
165+
QApplication::restoreOverrideCursor();
166+
167+
return count;
168+
}
169+
170+
171+
void QgsSearchQueryBuilder::on_btnOk_clicked()
172+
{
173+
// if user hits Ok and there is no query, skip the validation
174+
if(txtSQL->text().stripWhiteSpace().length() > 0)
175+
{
176+
accept();
177+
return;
178+
}
179+
180+
// test the query to see if it will result in a valid layer
181+
long numRecs = countRecords(txtSQL->text());
182+
if (numRecs == -1)
183+
{
184+
// error shown in countRecords
185+
}
186+
else if (numRecs == 0)
187+
{
188+
QMessageBox::warning(this, tr("No Records"), tr("The query you specified results in zero records being returned."));
189+
}
190+
else
191+
{
192+
accept();
193+
}
194+
195+
}
196+
197+
void QgsSearchQueryBuilder::on_btnEqual_clicked()
198+
{
199+
txtSQL->insert(" = ");
200+
}
201+
202+
void QgsSearchQueryBuilder::on_btnLessThan_clicked()
203+
{
204+
txtSQL->insert(" < ");
205+
}
206+
207+
void QgsSearchQueryBuilder::on_btnGreaterThan_clicked()
208+
{
209+
txtSQL->insert(" > ");
210+
}
211+
212+
void QgsSearchQueryBuilder::on_btnPct_clicked()
213+
{
214+
txtSQL->insert(" % ");
215+
}
216+
217+
void QgsSearchQueryBuilder::on_btnIn_clicked()
218+
{
219+
txtSQL->insert(" IN ");
220+
}
221+
222+
void QgsSearchQueryBuilder::on_btnNotIn_clicked()
223+
{
224+
txtSQL->insert(" NOT IN ");
225+
}
226+
227+
void QgsSearchQueryBuilder::on_btnLike_clicked()
228+
{
229+
txtSQL->insert(" LIKE ");
230+
}
231+
232+
QString QgsSearchQueryBuilder::searchString()
233+
{
234+
return txtSQL->text();
235+
}
236+
237+
void QgsSearchQueryBuilder::setSearchString(QString searchString)
238+
{
239+
txtSQL->setText(searchString);
240+
}
241+
242+
void QgsSearchQueryBuilder::on_lstFields_doubleClicked( Q3ListBoxItem *item )
243+
{
244+
txtSQL->insert(item->text());
245+
}
246+
247+
void QgsSearchQueryBuilder::on_lstValues_doubleClicked( Q3ListBoxItem *item )
248+
{
249+
txtSQL->insert(item->text());
250+
}
251+
252+
void QgsSearchQueryBuilder::on_btnLessEqual_clicked()
253+
{
254+
txtSQL->insert(" <= ");
255+
}
256+
257+
void QgsSearchQueryBuilder::on_btnGreaterEqual_clicked()
258+
{
259+
txtSQL->insert(" >= ");
260+
}
261+
262+
void QgsSearchQueryBuilder::on_btnNotEqual_clicked()
263+
{
264+
txtSQL->insert(" != ");
265+
}
266+
267+
void QgsSearchQueryBuilder::on_btnAnd_clicked()
268+
{
269+
txtSQL->insert(" AND ");
270+
}
271+
272+
void QgsSearchQueryBuilder::on_btnNot_clicked()
273+
{
274+
txtSQL->insert(" NOT ");
275+
}
276+
277+
void QgsSearchQueryBuilder::on_btnOr_clicked()
278+
{
279+
txtSQL->insert(" OR ");
280+
}
281+
282+
void QgsSearchQueryBuilder::on_btnClear_clicked()
283+
{
284+
txtSQL->clear();
285+
}
286+
287+
void QgsSearchQueryBuilder::on_btnILike_clicked()
288+
{
289+
txtSQL->insert(" ILIKE ");
290+
}
291+

‎src/gui/qgssearchquerybuilder.h

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
/***************************************************************************
2+
qgssearchquerybuilder.h - Query builder for search strings
3+
----------------------
4+
begin : March 2006
5+
copyright : (C) 2006 by Martin Dobias
6+
email : wonder.sk at gmail dot com
7+
***************************************************************************
8+
* *
9+
* This program is free software; you can redistribute it and/or modify *
10+
* it under the terms of the GNU General Public License as published by *
11+
* the Free Software Foundation; either version 2 of the License, or *
12+
* (at your option) any later version. *
13+
* *
14+
***************************************************************************/
15+
/* $Id$ */
16+
17+
#ifndef QGSSEARCHQUERYBUILDER_H
18+
#define QGSSEARCHQUERYBUILDER_H
19+
20+
#include <map>
21+
#include <vector>
22+
23+
#include "ui_qgspgquerybuilderbase.h"
24+
#include "qgisgui.h"
25+
26+
class QgsField;
27+
class QgsVectorLayer;
28+
29+
/*!
30+
* \class QgsSearchQueryBuilder
31+
* \brief Query Builder for search strings
32+
*
33+
*/
34+
class QgsSearchQueryBuilder : public QDialog, private Ui::QgsPgQueryBuilderBase
35+
{
36+
Q_OBJECT
37+
38+
public:
39+
//! Constructor - takes pointer to vector layer as a parameter
40+
QgsSearchQueryBuilder(QgsVectorLayer* layer, QWidget *parent = 0,
41+
Qt::WFlags fl = QgisGui::ModalDialogFlags);
42+
43+
~QgsSearchQueryBuilder();
44+
45+
//! returns newly created search string
46+
QString searchString();
47+
48+
//! change search string shown in text field
49+
void setSearchString(QString searchString);
50+
51+
public slots:
52+
void on_btnEqual_clicked();
53+
void on_btnOk_clicked();
54+
void on_btnLessThan_clicked();
55+
void on_btnGreaterThan_clicked();
56+
void on_btnPct_clicked();
57+
void on_btnIn_clicked();
58+
void on_btnNotIn_clicked();
59+
void on_btnLike_clicked();
60+
void on_btnILike_clicked();
61+
62+
void on_lstFields_doubleClicked( Q3ListBoxItem *item );
63+
void on_lstValues_doubleClicked( Q3ListBoxItem *item );
64+
void on_btnLessEqual_clicked();
65+
void on_btnGreaterEqual_clicked();
66+
void on_btnNotEqual_clicked();
67+
void on_btnAnd_clicked();
68+
void on_btnNot_clicked();
69+
void on_btnOr_clicked();
70+
void on_btnClear_clicked();
71+
72+
/*! Test the constructed search string to see if it's correct.
73+
* The number of rows that would be returned is displayed in a message box.
74+
* @param showResults If true, the results are displayed in a QMessageBox
75+
*/
76+
void on_btnTest_clicked();
77+
78+
/*!
79+
* Get all distinct values for the field. Values are inserted
80+
* into the value list box
81+
*/
82+
void on_btnGetAllValues_clicked();
83+
84+
/*!
85+
* Get sample distinct values for the selected field. The sample size is
86+
* limited to an arbitrary value (currently set to 25). The values
87+
* are inserted into the values list box.
88+
*/
89+
void on_btnSampleValues_clicked();
90+
91+
private:
92+
93+
/*!
94+
* Populate the field list for the selected table
95+
*/
96+
void populateFields();
97+
98+
/*! Get the number of records that would be returned by the current SQL
99+
* @return Number of records or -1 if an error was encountered
100+
*/
101+
long countRecords(QString sql);
102+
103+
/*!
104+
* populates list box with values of selected field
105+
* @param limit if not zero, insterts only this count of values
106+
*/
107+
void getFieldValues(uint limit);
108+
109+
private:
110+
111+
//! Layer for which is the query builder opened
112+
QgsVectorLayer* mLayer;
113+
114+
//! Vector of QgsField objects
115+
std::vector<QgsField> mFields;
116+
117+
//! Map that holds field information, keyed by field name
118+
std::map<QString, QgsField> mFieldMap;
119+
120+
};
121+
#endif //QGSSEARCHQUERYBUILDER_H

‎src/ui/Makefile.am

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ WIDGETPATH=../../widgets
1818
qgis_ui_UIC = \
1919
qgsabout.ui \
2020
qgsaddattrdialogbase.ui \
21-
qgsadvancedattrsearchbase.ui \
2221
qgsattributedialogbase.ui \
2322
qgsattributeactiondialogbase.ui \
2423
qgsattributetablebase.ui \
@@ -70,7 +69,6 @@ qgis_ui_UIC = \
7069
qgsuniquevaluedialogbase.ui \
7170
qgsattributetabledisplaybase.ui \
7271
qgsaddattrdialogbase.ui \
73-
qgsadvancedattrsearch.ui \
7472
qgsattributeactiondialogbase.ui \
7573
qgsdelattrdialogbase.ui \
7674
qgspgquerybuilderbase.ui \
@@ -86,7 +84,6 @@ qgis_ui_UIC = \
8684
qgis_ui_UIHEADERS = ui_qgisappbase.h \
8785
ui_qgsabout.h \
8886
ui_qgsaddattrdialogbase.h \
89-
ui_qgsadvancedattrsearchbase.h \
9087
ui_qgsattributedialogbase.h \
9188
ui_qgsattributeactiondialogbase.h \
9289
ui_qgsattributetablebase.h \
@@ -136,7 +133,6 @@ qgis_ui_UIHEADERS = ui_qgisappbase.h \
136133
ui_qgspointstylewidgetbase.h \
137134
ui_qgsidentifyresultsbase.h \
138135
ui_qgsaddattrdialogbase.h \
139-
ui_qgsadvancedattrsearchbase.h \
140136
ui_qgsattributeactiondialogbase.h \
141137
ui_qgsdelattrdialogbase.h \
142138
ui_qgspgquerybuilderbase.h \

‎src/ui/qgsadvancedattrsearchbase.ui

Lines changed: 0 additions & 97 deletions
This file was deleted.

0 commit comments

Comments
 (0)
Please sign in to comment.