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.