27 #include "../../../common/StringUtils.h"
28 #include "../../../dataaccess/dataset/DataSet.h"
29 #include "../../../dataaccess/dataset/DataSetAdapter.h"
30 #include "../../../dataaccess/dataset/DataSetTypeConverter.h"
31 #include "../../../dataaccess/dataset/DataSetType.h"
32 #include "../../../dataaccess/dataset/ObjectIdSet.h"
33 #include "../../../dataaccess/datasource/DataSourceCapabilities.h"
34 #include "../../../dataaccess/datasource/DataSourceInfoManager.h"
35 #include "../../../dataaccess/datasource/DataSourceInfo.h"
36 #include "../../../dataaccess/datasource/DataSourceManager.h"
37 #include "../../../dataaccess/query/SQLDialect.h"
38 #include "../../../dataaccess/query/SQLFunctionEncoder.h"
39 #include "../../../dataaccess/utils/Utils.h"
40 #include "../../../datatype/SimpleProperty.h"
41 #include "../../../geometry/GeometryProperty.h"
42 #include "../../../maptools/DataSetLayer.h"
43 #include "../datasource/selector/DataSourceSelectorDialog.h"
44 #include "../layer/utils/DataSet2Layer.h"
46 #include "ui_QueryDataSourceDialogForm.h"
50 #include <QFileDialog>
51 #include <QGridLayout>
52 #include <QMessageBox>
53 #include <QTextStream>
60 #include <boost/filesystem.hpp>
61 #include <boost/uuid/random_generator.hpp>
62 #include <boost/uuid/uuid_io.hpp>
68 m_ui(new Ui::QueryDataSourceDialogForm)
72 m_ui->m_applyToolButton->setIcon(QIcon::fromTheme(
"media-playback-start-green"));
73 m_ui->m_clearToolButton->setIcon(QIcon::fromTheme(
"edit-clear"));
74 m_ui->m_applySelToolButton->setIcon(QIcon::fromTheme(
"pointer-selection"));
75 m_ui->m_targetDatasourceToolButton->setIcon(QIcon::fromTheme(
"datasource"));
76 m_ui->m_createLayerlToolButton->setIcon(QIcon::fromTheme(
"layer-new"));
79 m_ui->m_saveSqlToolButton->setIcon(QIcon::fromTheme(
"document-save-as"));
80 m_ui->m_openSqlToolButton->setIcon(QIcon::fromTheme(
"document-open"));
91 QGridLayout* displayGridLayout =
new QGridLayout(
m_ui->m_displayWidget);
92 displayGridLayout->setContentsMargins(0, 0, 0, 0);
98 connect(
m_ui->m_dataSetListWidget, SIGNAL(itemClicked(QListWidgetItem*)),
this, SLOT(
onDataSetItemClicked(QListWidgetItem*)));
113 m_ui->m_helpPushButton->setPageReference(
"widgets/query/query_datasource.html");
123 m_layerList = layerList;
125 if(m_ui->m_baseDataSetComboBox->count() > 0)
126 onBaseDataSetSelected(0);
131 m_appMapDisplay = appMapDisplay;
136 m_ui->m_dataSourceComboBox->clear();
143 if(it->second->getType() !=
"GDAL")
144 m_ui->m_dataSourceComboBox->addItem(it->second->getTitle().c_str(), QVariant(it->second->getId().c_str()));
149 if(m_ui->m_dataSourceComboBox->count() != 0)
150 onDataSourceSelected(m_ui->m_dataSourceComboBox->currentIndex());
158 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"SELECT", Qt::blue));
159 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"FROM", Qt::blue));
160 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"WHERE", Qt::blue));
161 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"JOIN", Qt::blue));
162 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"INNER", Qt::blue));
163 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"LEFT", Qt::blue));
164 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"RIGHT", Qt::blue));
165 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"AS", Qt::blue));
166 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"GROUP", Qt::blue));
167 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"ORDER", Qt::blue));
168 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(
"BY", Qt::blue));
171 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
179 for(std::size_t t = 0; t < names.size(); ++t)
181 QString s = names[t].c_str();
182 QString sUpper = s.toUpper();
184 m_keyWords.insert(std::map<std::string, Qt::GlobalColor>::value_type(sUpper.toStdString(), Qt::red));
191 m_ui->m_baseDataSetComboBox->clear();
192 m_ui->m_dataSetListWidget->clear();
193 m_ui->m_attrDataSetListWidget->clear();
195 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(index).toString().toStdString();
202 std::vector<std::string> dataSetNames;
205 for(std::size_t t = 0; t < dataSetNames.size(); ++t)
207 m_ui->m_baseDataSetComboBox->addItem(dataSetNames[t].c_str());
208 m_ui->m_dataSetListWidget->addItem(dataSetNames[t].c_str());
211 if(m_ui->m_baseDataSetComboBox->count() > 0)
212 onBaseDataSetSelected(0);
219 std::string dataSet = m_ui->m_baseDataSetComboBox->itemText(index).toStdString();
221 m_ui->m_layerComboBox->clear();
223 std::list<te::map::AbstractLayerPtr>::iterator it = m_layerList.begin();
225 while(it != m_layerList.end())
229 std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
233 if(dsLayer && dsType->getName() == dataSet)
234 m_ui->m_layerComboBox->addItem(l->getTitle().c_str(), QVariant::fromValue(l));
242 m_ui->m_attrDataSetListWidget->clear();
247 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
249 std::string dataSetName = item->text().toStdString();
253 std::vector<te::dt::Property*> propVec = dsType->
getProperties();
255 for(std::size_t t = 0; t < propVec.size(); ++t)
257 m_ui->m_attrDataSetListWidget->addItem(propVec[t]->getName().c_str());
265 if(m_ui->m_sqlEditorTextEdit->toPlainText().isEmpty())
268 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
272 std::string dataSetName = m_ui->m_baseDataSetComboBox->currentText().toStdString();
276 std::string sql =
"";
278 if(m_ui->m_sqlEditorTextEdit->textCursor().selectedText().isEmpty())
279 sql = m_ui->m_sqlEditorTextEdit->toPlainText().toStdString();
281 sql = m_ui->m_sqlEditorTextEdit->textCursor().selectedText().toStdString();
284 std::auto_ptr<te::da::DataSet> dataSet;
288 dataSet = ds->query(sql);
290 catch(
const std::exception& e)
292 m_dataSetDisplay->clear();
293 m_tableModel->setDataSet(0, ds->getEncoding());
295 std::string errorMessage =
"SQL Error: ";
296 errorMessage += e.what();
297 errorMessage +=
"\n";
298 errorMessage +=
"-------------------------------------------------------------------------\n";
300 m_ui->m_logPlainTextEdit->appendPlainText(errorMessage.c_str());
302 m_ui->m_tabWidget->setCurrentIndex(1);
307 std::string message =
"SQL Done: ";
310 message +=
"-------------------------------------------------------------------------\n";
312 m_ui->m_logPlainTextEdit->appendPlainText(message.c_str());
315 m_dataSetDisplay->clear();
318 for(std::size_t t = 0; t < dataSet->getNumProperties(); ++t)
320 int type = dataSet->getPropertyDataType(t);
330 m_dataSetDisplay->draw(dsType, ds, dataSet.get());
332 m_dataSetDisplay->clear();
335 m_tableModel->setDataSet(dataSet.release(), ds->getEncoding());
337 m_ui->m_tabWidget->setCurrentIndex(0);
342 m_ui->m_sqlEditorTextEdit->clear();
344 m_dataSetDisplay->clear();
351 disconnect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
353 QString sql = m_ui->m_sqlEditorTextEdit->toPlainText();
355 int curPos = m_ui->m_sqlEditorTextEdit->textCursor().position();
357 disconnect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
359 m_ui->m_sqlEditorTextEdit->clear();
361 QStringList words = sql.split(
' ');
363 bool isAttrValue =
false;
365 for(
int i = 0; i < words.size(); ++i)
367 QString w = words.value(i).toUpper();
369 std::string strW = w.toStdString();
371 std::map<std::string, Qt::GlobalColor>::iterator it = m_keyWords.find(strW);
373 bool removeAttrValue =
false;
375 if(it != m_keyWords.end())
377 m_ui->m_sqlEditorTextEdit->setFontWeight(
QFont::Bold);
378 m_ui->m_sqlEditorTextEdit->setTextColor(it->second);
384 words.value(i).toDouble(&okNum);
389 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::darkGreen);
394 std::string initChar = strW.substr(0, 1);
395 if(!isAttrValue && (initChar ==
"'" || initChar ==
"\""))
400 std::string lastChar = strW.substr(strW.size() - 1, 1);
401 if(isAttrValue && (lastChar ==
"'" || lastChar ==
"\""))
402 removeAttrValue =
true;
407 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::magenta);
409 m_ui->m_sqlEditorTextEdit->setTextColor(Qt::black);
413 m_ui->m_sqlEditorTextEdit->insertPlainText(words.value(i));
418 if(i < words.size() - 1)
419 m_ui->m_sqlEditorTextEdit->insertPlainText(
" ");
422 QTextCursor c = m_ui->m_sqlEditorTextEdit->textCursor();
423 c.setPosition(curPos);
424 m_ui->m_sqlEditorTextEdit->setTextCursor(c);
426 connect(m_ui->m_sqlEditorTextEdit, SIGNAL(textChanged()),
this, SLOT(onSQLEditorTextChanged()));
432 QString path = QFileDialog::getSaveFileName(
this, tr(
"Set a SQL file..."),
"", tr(
"SQL File *.sql"));
440 if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
442 QMessageBox::warning(
this, tr(
"Query DataSource"), file.errorString());
447 QTextStream out(&file);
449 out << m_ui->m_sqlEditorTextEdit->toPlainText();
457 QString path = QFileDialog::getOpenFileName(
this, tr(
"Select a SQL file..."),
"", tr(
"SQL File *.sql"));
465 if(!file.open(QIODevice::ReadOnly))
467 QMessageBox::warning(
this, tr(
"Query DataSource"), file.errorString());
472 QTextStream in(&file);
474 m_ui->m_sqlEditorTextEdit->clear();
478 QString line = in.readLine();
480 m_ui->m_sqlEditorTextEdit->append(line);
488 if(m_ui->m_sqlEditorTextEdit->toPlainText().isEmpty())
490 QMessageBox::information(
this, tr(
"Warning"), tr(
"SQL not defined."));
494 QVariant varLayer = m_ui->m_layerComboBox->itemData(m_ui->m_layerComboBox->currentIndex(), Qt::UserRole);
499 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"No layer selected."));
503 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
507 std::string dataSetName = m_ui->m_baseDataSetComboBox->currentText().toStdString();
511 std::string sql =
"";
513 if(m_ui->m_sqlEditorTextEdit->textCursor().selectedText().isEmpty())
514 sql = m_ui->m_sqlEditorTextEdit->toPlainText().toStdString();
516 sql = m_ui->m_sqlEditorTextEdit->textCursor().selectedText().toStdString();
519 std::auto_ptr<te::da::DataSet> dataSet;
523 dataSet = ds->query(sql);
527 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error executing SQL."));
533 if(m_ui->m_newSelRadioButton->isChecked())
536 dataSet->moveBeforeFirst();
541 layer->clearSelected();
544 else if(m_ui->m_addSelRadioButton->isChecked())
547 dataSet->moveBeforeFirst();
557 m_appMapDisplay->refresh();
562 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error selecting objects: ") + e.
what());
566 QMessageBox::information(
this, tr(
"Query DataSource"), tr(
"Selection done."));
573 if(m_ui->m_sqlEditorTextEdit->toPlainText().isEmpty())
575 QMessageBox::information(
this, tr(
"Warning"), tr(
"SQL not defined."));
579 if(m_ui->m_repositoryLineEdit->text().isEmpty())
581 QMessageBox::information(
this, tr(
"Warning"), tr(
"Define a repository for the result."));
585 if(m_ui->m_newLayerNameLineEdit->text().isEmpty())
587 QMessageBox::information(
this, tr(
"Warning"), tr(
"Define a name for the resulting layer."));
592 std::string dataSourceId = m_ui->m_dataSourceComboBox->itemData(m_ui->m_dataSourceComboBox->currentIndex()).toString().toStdString();
596 std::string inputDataSetName = m_ui->m_baseDataSetComboBox->currentText().toStdString();
600 std::string sql =
"";
602 if(m_ui->m_sqlEditorTextEdit->textCursor().selectedText().isEmpty())
603 sql = m_ui->m_sqlEditorTextEdit->toPlainText().toStdString();
605 sql = m_ui->m_sqlEditorTextEdit->textCursor().selectedText().toStdString();
607 std::auto_ptr<te::da::DataSet> dataSet;
611 dataSet = ds->query(sql);
615 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error executing SQL."));
625 boost::filesystem::path uri(m_ui->m_repositoryLineEdit->text().toStdString());
627 std::map<std::string, std::string> dsInfo;
628 dsInfo[
"URI"] = uri.string();
630 boost::uuids::basic_random_generator<boost::mt19937> gen;
631 boost::uuids::uuid u = gen();
632 std::string id_ds = boost::uuids::to_string(u);
635 dsInfoPtr->setConnInfo(dsInfo);
636 dsInfoPtr->setTitle(uri.stem().string());
637 dsInfoPtr->setAccessDriver(
"OGR");
638 dsInfoPtr->setType(
"OGR");
639 dsInfoPtr->setDescription(uri.string());
640 dsInfoPtr->setId(id_ds);
652 std::string dataSetName = m_ui->m_newLayerNameLineEdit->text().toStdString();
654 std::size_t idx = dataSetName.find(
".");
655 if (idx != std::string::npos)
656 dataSetName=dataSetName.substr(0,idx);
661 dataSet->moveFirst();
663 std::set<std::string> names;
667 for(std::size_t t = 0; t < dataSet->getNumProperties(); ++t)
670 std::string propName = dataSet->getPropertyName(t);
673 while(names.find(propName) != names.end())
679 names.insert(propName);
689 std::auto_ptr<te::gm::Geometry> geom = dataSet->getGeometry(t);
691 srid = geom->getSRID();
703 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error creating output dataset."));
708 dataSet->moveBeforeFirst();
715 dsAdapter->setSRID(srid);
718 std::map<std::string, std::string> options;
720 outputDataSource->createDataSet(dsType.get(), options);
722 outputDataSource->add(dataSetName, dsAdapter.get(), options);
733 emit createNewLayer(layer);
737 QMessageBox::warning(
this, tr(
"Query DataSource"), tr(
"Error creating layer. ") + e.
what());
741 QMessageBox::information(
this, tr(
"Query DataSource"), tr(
"Layer created."));
746 m_ui->m_newLayerNameLineEdit->clear();
747 m_ui->m_newLayerNameLineEdit->setEnabled(
true);
752 std::list<te::da::DataSourceInfoPtr> dsPtrList = dlg.
getSelecteds();
754 if(dsPtrList.size() <= 0)
757 std::list<te::da::DataSourceInfoPtr>::iterator it = dsPtrList.begin();
759 m_ui->m_repositoryLineEdit->setText(QString(it->get()->getTitle().c_str()));
761 m_outputDatasource = *it;
768 m_ui->m_newLayerNameLineEdit->clear();
769 m_ui->m_repositoryLineEdit->clear();
771 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save as..."), QString(), tr(
"Shapefile (*.shp *.SHP);;"),0, QFileDialog::DontConfirmOverwrite);
773 if (fileName.isEmpty())
776 boost::filesystem::path outfile(fileName.toStdString());
778 m_ui->m_repositoryLineEdit->setText(outfile.string().c_str());
780 m_ui->m_newLayerNameLineEdit->setText(outfile.leaf().string().c_str());
782 m_ui->m_newLayerNameLineEdit->setEnabled(
false);
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
An atomic property like an integer or double.
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.
It models a property definition.
An converter for DataSetType.
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...
void setExpressionByInClause(const std::string source="")
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. ...
A class that represents a data source component.
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.
std::string Convert2String(boost::int16_t value)
It converts a short integer value to a string.
TEDATAACCESSEXPORT DataSetAdapter * CreateAdapter(DataSet *ds, DataSetTypeConverter *converter, bool isOwner=false)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
This file defines a class for a Query DataSource Dialog Dialog.
boost::shared_ptr< DataSourceInfo > DataSourceInfoPtr