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