27 #include "../../../dataaccess/dataset/DataSet.h"
28 #include "../../../dataaccess/dataset/DataSetType.h"
29 #include "../../../dataaccess/dataset/ObjectIdSet.h"
30 #include "../../../dataaccess/datasource/DataSourceCapabilities.h"
31 #include "../../../dataaccess/datasource/DataSourceInfoManager.h"
32 #include "../../../dataaccess/datasource/DataSourceInfo.h"
33 #include "../../../dataaccess/query/SQLDialect.h"
34 #include "../../../dataaccess/query/SQLFunctionEncoder.h"
35 #include "../../../dataaccess/utils/Utils.h"
36 #include "../../../maptools/DataSetLayer.h"
38 #include "ui_QueryDataSourceDialogForm.h"
42 #include <QFileDialog>
43 #include <QGridLayout>
44 #include <QMessageBox>
45 #include <QTextStream>
55 m_ui(new Ui::QueryDataSourceDialogForm)
59 m_ui->m_applyToolButton->setIcon(QIcon::fromTheme(
"media-playback-start-green"));
60 m_ui->m_clearToolButton->setIcon(QIcon::fromTheme(
"edit-clear"));
61 m_ui->m_applySelToolButton->setIcon(QIcon::fromTheme(
"check"));
62 m_ui->m_applyQueryLayerToolButton->setIcon(QIcon::fromTheme(
"check"));
64 m_ui->m_saveSqlToolButton->setIcon(QIcon::fromTheme(
"document-save-as"));
65 m_ui->m_openSqlToolButton->setIcon(QIcon::fromTheme(
"document-open"));
74 QGridLayout* displayGridLayout =
new QGridLayout(
m_ui->m_displayWidget);
75 displayGridLayout->setContentsMargins(0, 0, 0, 0);
81 connect(
m_ui->m_dataSetListWidget, SIGNAL(itemClicked(QListWidgetItem*)),
this, SLOT(
onDataSetItemClicked(QListWidgetItem*)));
100 m_layerList = layerList;
102 if(m_ui->m_baseDataSetComboBox->count() > 0)
103 onBaseDataSetSelected(0);
108 m_ui->m_dataSourceComboBox->clear();
115 if(it->second->getType() !=
"GDAL")
116 m_ui->m_dataSourceComboBox->addItem(it->second->getTitle().c_str(), QVariant(it->second->getId().c_str()));
121 if(m_ui->m_dataSourceComboBox->count() != 0)
122 onDataSourceSelected(m_ui->m_dataSourceComboBox->currentIndex());
130 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"SELECT", Qt::blue));
131 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"FROM", Qt::blue));
132 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"WHERE", Qt::blue));
133 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"JOIN", Qt::blue));
134 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"INNER", Qt::blue));
135 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"LEFT", Qt::blue));
136 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"RIGHT", Qt::blue));
137 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"AS", Qt::blue));
138 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"GROUP", Qt::blue));
139 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"ORDER", Qt::blue));
140 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"BY", Qt::blue));
143 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
151 for(std::size_t t = 0; t < names.size(); ++t)
153 QString s = names[t].c_str();
154 QString sUpper = s.toUpper();
156 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(sUpper.toStdString(), Qt::red));
163 m_ui->m_baseDataSetComboBox->clear();
164 m_ui->m_dataSetListWidget->clear();
165 m_ui->m_attrDataSetListWidget->clear();
167 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(index).toString().toStdString();
174 std::vector<std::string> dataSetNames;
177 for(std::size_t t = 0; t < dataSetNames.size(); ++t)
179 m_ui->m_baseDataSetComboBox->addItem(dataSetNames[t].c_str());
180 m_ui->m_dataSetListWidget->addItem(dataSetNames[t].c_str());
183 if(m_ui->m_baseDataSetComboBox->count() > 0)
184 onBaseDataSetSelected(0);
191 std::string dataSet = m_ui->m_baseDataSetComboBox->itemText(index).toStdString();
193 m_ui->m_layerComboBox->clear();
195 std::list<te::map::AbstractLayerPtr>::iterator it = m_layerList.begin();
197 while(it != m_layerList.end())
201 std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
205 if(dsLayer && dsType->getName() == dataSet)
206 m_ui->m_layerComboBox->addItem(l->getTitle().c_str(), QVariant::fromValue(l));
214 m_ui->m_attrDataSetListWidget->clear();
219 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
221 std::string dataSetName = item->text().toStdString();
225 std::vector<te::dt::Property*> propVec = dsType->
getProperties();
227 for(std::size_t t = 0; t < propVec.size(); ++t)
229 m_ui->m_attrDataSetListWidget->addItem(propVec[t]->getName().c_str());
237 if(m_ui->m_sqlEditorTextEdit->toPlainText().isEmpty())
240 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
244 std::string dataSetName = m_ui->m_baseDataSetComboBox->currentText().toStdString();
248 std::string sql =
"";
250 if(m_ui->m_sqlEditorTextEdit->textCursor().selectedText().isEmpty())
251 sql = m_ui->m_sqlEditorTextEdit->toPlainText().toStdString();
253 sql = m_ui->m_sqlEditorTextEdit->textCursor().selectedText().toStdString();
256 std::auto_ptr<te::da::DataSet> dataSet;
260 dataSet = ds->query(sql);
262 catch(
const std::exception& e)
264 m_dataSetDisplay->clear();
265 m_tableModel->setDataSet(0);
267 std::string errorMessage =
"SQL Error: ";
268 errorMessage += e.what();
269 errorMessage +=
"\n";
270 errorMessage +=
"-------------------------------------------------------------------------\n";
272 m_ui->m_logPlainTextEdit->appendPlainText(errorMessage.c_str());
274 m_ui->m_tabWidget->setCurrentIndex(1);
279 std::string message =
"SQL Done: ";
282 message +=
"-------------------------------------------------------------------------\n";
284 m_ui->m_logPlainTextEdit->appendPlainText(message.c_str());
287 m_dataSetDisplay->clear();
290 for(std::size_t t = 0; t < dataSet->getNumProperties(); ++t)
292 int type = dataSet->getPropertyDataType(t);
302 m_dataSetDisplay->draw(dsType, ds, dataSet.get());
304 m_dataSetDisplay->clear();
307 m_tableModel->setDataSet(dataSet.release());
309 m_ui->m_tabWidget->setCurrentIndex(0);
314 m_ui->m_sqlEditorTextEdit->clear();
316 m_dataSetDisplay->clear();
318 m_tableModel->setDataSet(0);
323 disconnect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
325 QString sql = m_ui->m_sqlEditorTextEdit->toPlainText();
327 int curPos = m_ui->m_sqlEditorTextEdit->textCursor().position();
329 disconnect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
331 m_ui->m_sqlEditorTextEdit->clear();
333 QStringList words = sql.split(
' ');
335 bool isAttrValue =
false;
337 for(
int i = 0; i < words.size(); ++i)
339 QString w = words.value(i).toUpper();
341 std::string strW = w.toStdString();
343 std::map<std::string, Qt::GlobalColor>::iterator it = m_keyWords.find(strW);
345 bool removeAttrValue =
false;
347 if(it != m_keyWords.end())
349 m_ui->m_sqlEditorTextEdit->setFontWeight(
QFont::Bold);
350 m_ui->m_sqlEditorTextEdit->setTextColor(it->second);
356 words.value(i).toDouble(&okNum);
358 m_ui->m_sqlEditorTextEdit->setFontWeight(QFont::Normal);
361 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::darkGreen);
366 std::string initChar = strW.substr(0, 1);
367 if(!isAttrValue && (initChar ==
"'" || initChar ==
"\""))
372 std::string lastChar = strW.substr(strW.size() - 1, 1);
373 if(isAttrValue && (lastChar ==
"'" || lastChar ==
"\""))
374 removeAttrValue =
true;
379 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::magenta);
381 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::black);
385 m_ui->m_sqlEditorTextEdit->insertPlainText(words.value(i));
390 if(i < words.size() - 1)
391 m_ui->m_sqlEditorTextEdit->insertPlainText(
" ");
394 QTextCursor c = m_ui->m_sqlEditorTextEdit->textCursor();
395 c.setPosition(curPos);
396 m_ui->m_sqlEditorTextEdit->setTextCursor(c);
398 connect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
404 QString path = QFileDialog::getSaveFileName(
this, tr(
"Set a SQL file..."),
"", tr(
"SQL File *.sql"));
412 if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
414 QMessageBox::warning(
this, tr(
"Query DataSource"), file.errorString());
419 QTextStream out(&file);
421 out << m_ui->m_sqlEditorTextEdit->toPlainText();
429 QString path = QFileDialog::getOpenFileName(
this, tr(
"Select a SQL file..."),
"", tr(
"SQL File *.sql"));
437 if(!file.open(QIODevice::ReadOnly))
439 QMessageBox::warning(
this, tr(
"Query DataSource"), file.errorString());
444 QTextStream in(&file);
446 m_ui->m_sqlEditorTextEdit->clear();
450 QString line = in.readLine();
452 m_ui->m_sqlEditorTextEdit->append(line);
460 if(m_ui->m_sqlEditorTextEdit->toPlainText().isEmpty())
463 QVariant varLayer = m_ui->m_layerComboBox->itemData(m_ui->m_layerComboBox->currentIndex(), Qt::UserRole);
468 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"No layer selected."));
472 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
476 std::string dataSetName = m_ui->m_baseDataSetComboBox->currentText().toStdString();
480 std::string sql =
"";
482 if(m_ui->m_sqlEditorTextEdit->textCursor().selectedText().isEmpty())
483 sql = m_ui->m_sqlEditorTextEdit->toPlainText().toStdString();
485 sql = m_ui->m_sqlEditorTextEdit->textCursor().selectedText().toStdString();
488 std::auto_ptr<te::da::DataSet> dataSet;
492 dataSet = ds->query(sql);
496 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error executing SQL."));
502 if(m_ui->m_newSelRadioButton->isChecked())
505 dataSet->moveBeforeFirst();
508 layer->clearSelected();
511 else if(m_ui->m_addSelRadioButton->isChecked())
514 dataSet->moveBeforeFirst();
522 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error selecting objects: ") + e.
what());
526 QMessageBox::information(
this, tr(
"Query DataSource"), tr(
"Selection done."));
TEDATAACCESSEXPORT DataSourcePtr GetDataSource(const std::string &datasourceId, const bool opened=true)
Search for a data source with the informed id in the DataSourceManager.
te::da::SQLDialect * dialect
boost::shared_ptr< DataSetType > DataSetTypePtr
boost::shared_ptr< DataSource > DataSourcePtr
A class that models the description of a dataset.
virtual const char * what() const
It outputs the exception message.
It represents the SQL query dialect accepted by a given data source.
const std::vector< Property * > & getProperties() const
It returns the list of properties describing the CompositeProperty.
static DataSourceInfoManager & getInstance()
It returns a reference to the singleton instance.
This class represents a set of unique ids created in the same context. i.e. from the same data set...
TEDATAACCESSEXPORT ObjectIdSet * GenerateOIDSet(DataSet *dataset, const DataSetType *type)
TEDATAACCESSEXPORT void GetDataSetNames(std::vector< std::string > &datasetNames, const std::string &datasourceId)
Q_DECLARE_METATYPE(te::map::AbstractLayerPtr)
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
std::vector< std::string > getRegisteredNames() const
It gets the all registered names from registed functions.
TEDATAACCESSEXPORT DataSetType * GetDataSetType(const std::string &name, const std::string &datasourceId)
A layer with reference to a dataset.
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
This file defines a class for a Query DataSource Dialog Dialog.