27 #include "../../../common/STLUtils.h"
28 #include "../../../dataaccess/dataset/DataSet.h"
29 #include "../../../dataaccess/dataset/DataSetType.h"
30 #include "../../../dataaccess/dataset/ObjectIdSet.h"
31 #include "../../../dataaccess/datasource/DataSourceCatalog.h"
32 #include "../../../dataaccess/query/BinaryFunction.h"
33 #include "../../../dataaccess/query/DataSetName.h"
34 #include "../../../dataaccess/query/Distinct.h"
35 #include "../../../dataaccess/query/Field.h"
36 #include "../../../dataaccess/query/Fields.h"
37 #include "../../../dataaccess/query/From.h"
38 #include "../../../dataaccess/query/LiteralDouble.h"
39 #include "../../../dataaccess/query/LiteralGeom.h"
40 #include "../../../dataaccess/query/LiteralInt16.h"
41 #include "../../../dataaccess/query/LiteralInt32.h"
42 #include "../../../dataaccess/query/LiteralString.h"
43 #include "../../../dataaccess/query/OrderByItem.h"
44 #include "../../../dataaccess/query/PropertyName.h"
45 #include "../../../dataaccess/query/Select.h"
46 #include "../../../dataaccess/query/SQLVisitor.h"
47 #include "../../../dataaccess/utils/Utils.h"
48 #include "../../../geometry/Geometry.h"
49 #include "../../../geometry/GeometryCollection.h"
50 #include "../../../geometry/GeometryProperty.h"
51 #include "ui_WhereClauseWidgetForm.h"
56 #include <QMessageBox>
57 #include <QToolButton>
64 m_ui(new Ui::WhereClauseWidgetForm)
71 m_ui->m_addWhereClausePushButton->setIcon(QIcon::fromTheme(
"list-add"));
72 m_ui->m_clearAllPushButton->setIcon(QIcon::fromTheme(
"edit-clear"));
80 m_ui->m_sqlTextEdit->setReadOnly(
true);
98 int row = m_ui->m_whereClauseTableWidget->rowCount();
104 std::string lastConnectorName =
"";
106 for(
int i = 0; i < row; ++i)
109 std::string propName =
"";
110 QTableWidgetItem* itemPropName = m_ui->m_whereClauseTableWidget->item(i, 1);
112 propName = itemPropName->text().toStdString();
115 QWidget* w = m_ui->m_whereClauseTableWidget->cellWidget(i, 1);
116 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
118 propName = cmbBox->currentText().toStdString();
121 std::string funcName =
"";
122 QTableWidgetItem* itemFuncName = m_ui->m_whereClauseTableWidget->item(i, 2);
124 funcName = itemFuncName->text().toStdString();
127 QWidget* w = m_ui->m_whereClauseTableWidget->cellWidget(i, 2);
128 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
130 funcName = cmbBox->currentText().toStdString();
134 QTableWidgetItem* itemValue = m_ui->m_whereClauseTableWidget->item(i, 3);
137 expIdx = itemValue->data(Qt::UserRole).toInt();
141 QWidget* w = m_ui->m_whereClauseTableWidget->cellWidget(i, 3);
142 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
144 expIdx = m_comboMap[cmbBox].first;
156 if(leftSide != 0 && lastConnectorName.empty() ==
false)
159 leftSide = connectFunc;
167 QTableWidgetItem* itemConnectorName = m_ui->m_whereClauseTableWidget->item(i, 4);
168 if(itemConnectorName)
170 if(itemPropName->text().isEmpty() ==
false)
171 lastConnectorName = itemConnectorName->text().toStdString();
173 lastConnectorName =
"";
177 QWidget* w = m_ui->m_whereClauseTableWidget->cellWidget(i, 4);
178 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
180 lastConnectorName = cmbBox->currentText().toStdString();
191 std::string sql =
"";
223 m_ui->m_layerComboBox->clear();
225 std::list<te::map::AbstractLayerPtr>::iterator it = layerList.begin();
227 while(it != layerList.end())
231 std::auto_ptr<te::da::DataSetType> dsType = l->getSchema();
235 if(dsType->hasGeom())
236 m_ui->m_layerComboBox->addItem(l->getTitle().c_str(), QVariant::fromValue(l));
249 m_ui->m_restrictValueComboBox->clear();
250 m_ui->m_valuePropertyComboBox->clear();
252 for(
size_t t = 0; t <vec.size(); ++t)
254 m_ui->m_restrictValueComboBox->addItem(vec[t].c_str());
255 m_ui->m_valuePropertyComboBox->addItem(vec[t].c_str());
263 m_ui->m_geomAttrComboBox->clear();
265 for(
size_t t = 0; t <vec.size(); ++t)
267 m_ui->m_geomAttrComboBox->addItem(vec[t].c_str());
273 m_ui->m_OperatorComboBox->clear();
275 for(
size_t t = 0; t <vec.size(); ++t)
277 m_ui->m_OperatorComboBox->addItem(vec[t].c_str());
283 m_ui->m_SpatialOperatorComboBox->clear();
285 for(
size_t t = 0; t <vec.size(); ++t)
287 m_ui->m_SpatialOperatorComboBox->addItem(vec[t].c_str());
293 m_connectorsList.clear();
295 m_connectorsList.append(
"");
297 for(
size_t t = 0; t <vec.size(); ++t)
299 m_connectorsList.append(vec[t].c_str());
311 m_ui->m_whereClauseTableWidget->setRowCount(0);
323 m_ui->m_restrictValueComboBox->clear();
324 m_ui->m_valuePropertyComboBox->clear();
325 m_ui->m_valueValueComboBox->clear();
326 m_ui->m_geomAttrComboBox->clear();
327 m_ui->m_OperatorComboBox->clear();
328 m_ui->m_SpatialOperatorComboBox->clear();
329 m_ui->m_sqlTextEdit->clear();
330 m_ui->m_tabWidget->setCurrentIndex(0);
335 std::string restrictValue =
"";
336 std::string operatorStr =
"";
337 std::string valueStr =
"";
339 setCursor(Qt::WaitCursor);
341 if(m_ui->m_criteriaTabWidget->currentIndex() == 0)
343 int expId = ++m_count;
345 if(m_ui->m_restrictValueComboBox->currentText().isEmpty())
347 setCursor(Qt::ArrowCursor);
348 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Restrict value not defined."));
352 if(m_ui->m_valuePropertyRadioButton->isChecked() ==
false &&
353 m_ui->m_valueValueRadioButton->isChecked() ==
false)
355 if(m_ui->m_valueValueComboBox->currentText().isEmpty())
357 setCursor(Qt::ArrowCursor);
358 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Value not defined."));
363 if(m_ui->m_valueValueRadioButton->isChecked())
365 if(m_ui->m_valueValueComboBox->currentText().isEmpty())
367 setCursor(Qt::ArrowCursor);
368 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Value not defined."));
373 restrictValue = m_ui->m_restrictValueComboBox->currentText().toStdString();
375 if(m_ui->m_OperatorComboBox->currentText().isEmpty())
377 setCursor(Qt::ArrowCursor);
378 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Operator not defined."));
381 operatorStr = m_ui->m_OperatorComboBox->currentText().toStdString();
388 if(m_ui->m_valuePropertyRadioButton->isChecked())
390 valueStr = m_ui->m_valuePropertyComboBox->currentText().toStdString();
398 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
400 else if(m_ui->m_valueValueRadioButton->isChecked())
402 valueStr = m_ui->m_valueValueComboBox->currentText().toStdString();
404 te::da::Expression* exp = getExpression(m_ui->m_valueValueComboBox->currentText(), restrictValue);
410 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
413 std::string connector = tr(
"and").toStdString();
416 int newrow = m_ui->m_whereClauseTableWidget->rowCount();
418 m_ui->m_whereClauseTableWidget->insertRow(newrow);
421 QToolButton* removeBtn =
new QToolButton(m_ui->m_whereClauseTableWidget);
422 removeBtn->setIcon(QIcon::fromTheme(
"list-remove"));
423 connect(removeBtn, SIGNAL(clicked()),
this, SLOT(onRemoveWhereClausePushButtonClicked()));
424 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 0, removeBtn);
427 QComboBox* cmbProperty =
new QComboBox(m_ui->m_whereClauseTableWidget);
428 connect(cmbProperty, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
429 std::pair<int, int> pairProperty(expId, 1);
430 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbProperty, pairProperty));
431 copyCombo(m_ui->m_restrictValueComboBox, cmbProperty, restrictValue);
432 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 1, cmbProperty);
435 QComboBox* cmbOperator =
new QComboBox(m_ui->m_whereClauseTableWidget);
436 connect(cmbOperator, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
437 std::pair<int, int> pairOperator(expId, 2);
438 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbOperator, pairOperator));
439 copyCombo(m_ui->m_OperatorComboBox, cmbOperator, operatorStr);
440 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 2, cmbOperator);
443 QComboBox* cmbValue =
new QComboBox(m_ui->m_whereClauseTableWidget);
444 connect(cmbValue, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
445 connect(cmbValue, SIGNAL(editTextChanged(QString)),
this, SLOT(onComboBoxActivated(QString)));
446 std::pair<int, int> pairValue(expId, 3);
447 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbValue, pairValue));
448 if(m_ui->m_valuePropertyRadioButton->isChecked())
449 copyCombo(m_ui->m_valuePropertyComboBox, cmbValue, valueStr);
452 cmbValue->setEditable(
true);
453 copyCombo(m_ui->m_valueValueComboBox, cmbValue, valueStr);
455 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 3, cmbValue);
466 QComboBox* connectorCmbBox =
new QComboBox(m_ui->m_whereClauseTableWidget);
467 connect(connectorCmbBox, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
468 std::pair<int, int> pairConnector(expId, 4);
469 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(connectorCmbBox, pairConnector));
470 connectorCmbBox->addItems(m_connectorsList);
471 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 4, connectorCmbBox);
473 for(
int i = 0; i < connectorCmbBox->count(); ++i)
475 if(connectorCmbBox->itemText(i).toStdString() == connector)
477 connectorCmbBox->setCurrentIndex(i);
484 if(m_ui->m_SpatialOperatorComboBox->currentText().isEmpty())
486 setCursor(Qt::ArrowCursor);
487 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Operator not defined."));
490 operatorStr = m_ui->m_SpatialOperatorComboBox->currentText().toStdString();
492 restrictValue = m_ui->m_geomAttrComboBox->currentText().toStdString();
495 int layerIdx = m_ui->m_layerComboBox->currentIndex();
496 QVariant varLayer = m_ui->m_layerComboBox->itemData(layerIdx, Qt::UserRole);
499 std::auto_ptr<const te::map::LayerSchema> schema(layer->getSchema());
505 setCursor(Qt::ArrowCursor);
506 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Selected layer has no geometry property."));
510 std::auto_ptr<te::da::DataSet> ds;
512 if(m_ui->m_selectedObjCheckBox->isChecked())
516 if(!selecteds || selecteds->
size() == 0)
518 setCursor(Qt::ArrowCursor);
519 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Selected layer has no selected geometries."));
523 ds = layer->getData(selecteds);
527 ds = layer->getData();
530 ds->moveBeforeFirst();
532 size_t dsSize = ds->size();
536 while(ds->moveNext())
539 int expId = ++m_count;
543 geom->
setSRID(layer->getSRID());
546 if(layer->getSRID() != m_srid)
552 valueStr = tr(
"Geometry Value").toStdString();
564 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
567 std::string connector =
"";
569 if(count < dsSize - 1)
570 connector = tr(
"or").toStdString();
575 int newrow = m_ui->m_whereClauseTableWidget->rowCount();
577 m_ui->m_whereClauseTableWidget->insertRow(newrow);
580 QToolButton* removeBtn =
new QToolButton(m_ui->m_whereClauseTableWidget);
581 removeBtn->setIcon(QIcon::fromTheme(
"list-remove"));
582 connect(removeBtn, SIGNAL(clicked()),
this, SLOT(onRemoveWhereClausePushButtonClicked()));
583 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 0, removeBtn);
586 QComboBox* cmbProperty =
new QComboBox(m_ui->m_whereClauseTableWidget);
587 connect(cmbProperty, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
588 std::pair<int, int> pairProperty(expId, 1);
589 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbProperty, pairProperty));
590 copyCombo(m_ui->m_geomAttrComboBox, cmbProperty, restrictValue);
591 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 1, cmbProperty);
594 QComboBox* cmbOperator =
new QComboBox(m_ui->m_whereClauseTableWidget);
595 connect(cmbOperator, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
596 std::pair<int, int> pairOperator(expId, 2);
597 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbOperator, pairOperator));
598 copyCombo(m_ui->m_SpatialOperatorComboBox, cmbOperator, operatorStr);
599 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 2, cmbOperator);
602 QTableWidgetItem* itemValue =
new QTableWidgetItem(valueStr.c_str());
603 itemValue->setData(Qt::UserRole, QVariant(expId));
604 m_ui->m_whereClauseTableWidget->setItem(newrow, 3, itemValue);
607 QComboBox* connectorCmbBox =
new QComboBox(m_ui->m_whereClauseTableWidget);
608 connect(connectorCmbBox, SIGNAL(activated(QString)),
this, SLOT(onComboBoxActivated(QString)));
609 std::pair<int, int> pairConnector(expId, 4);
610 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(connectorCmbBox, pairConnector));
611 connectorCmbBox->addItems(m_connectorsList);
612 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 4, connectorCmbBox);
614 for(
int i = 0; i < connectorCmbBox->count(); ++i)
616 if(connectorCmbBox->itemText(i).toStdString() == connector)
618 connectorCmbBox->setCurrentIndex(i);
625 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
628 std::string sql = getWhereString();
630 m_ui->m_sqlTextEdit->setText(sql.c_str());
632 setCursor(Qt::ArrowCursor);
637 QToolButton* button =
dynamic_cast<QToolButton*
>(sender());
642 for(
int i = 0; i < m_ui->m_whereClauseTableWidget->rowCount(); ++i)
644 QWidget* w = m_ui->m_whereClauseTableWidget->cellWidget(i, 0);
653 m_ui->m_whereClauseTableWidget->removeRow(row);
655 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
659 std::string sql = getWhereString();
661 m_ui->m_sqlTextEdit->setText(sql.c_str());
666 std::string propertyName = m_ui->m_restrictValueComboBox->currentText().toStdString();
668 m_ui->m_valueValueComboBox->clear();
669 m_ui->m_valueValueComboBox->addItems(getPropertyValues(propertyName));
674 m_ui->m_whereClauseTableWidget->setRowCount(0);
675 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
678 std::string sql = getWhereString();
680 m_ui->m_sqlTextEdit->setText(sql.c_str());
685 if(value.isEmpty() || !m_ui->m_valueValueRadioButton->isChecked())
688 onValuePropertyRadioButtonClicked();
693 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(sender());
697 int expId = m_comboMap[cmbBox].first;
698 int column = m_comboMap[cmbBox].second;
725 ep->
m_value = value.toStdString();
747 std::string sql = getWhereString();
749 m_ui->m_sqlTextEdit->setText(sql.c_str());
754 std::string dataSetName;
755 std::string dataSetAliasName;
756 std::string propertyName = propName;
758 std::size_t pos = propName.find(
".");
759 if(pos != std::string::npos)
761 dataSetAliasName = propName.substr(0, pos);
762 propertyName = propName.substr(pos + 1, propName.size() - 1);
766 if(m_fromItems.size() == 1)
768 dataSetName = m_fromItems[0].first;
772 for(
size_t t = 0; t < m_fromItems.size(); ++t)
774 if(m_fromItems[t].second == dataSetAliasName)
776 dataSetName = m_fromItems[t].first;
782 if(dataSetName.empty())
786 std::auto_ptr<te::da::DataSetType> dsType = m_ds->getDataSetType(dataSetName);
824 for(
int i = 0; i < input->count(); ++i)
826 output->addItem(input->itemText(i));
828 if(!curValue.empty() && input->itemText(i).toStdString() == curValue)
832 output->setCurrentIndex(idx);
844 fields->push_back(f);
848 for(
size_t t = 0; t < m_fromItems.size(); ++t)
860 std::auto_ptr<te::da::DataSet> dataset;
864 dataset = m_ds->query(*select);
866 catch(
const std::exception& e)
868 std::string msg =
"An exception has occurred: ";
871 QMessageBox::warning(0,
"Query Error: ", msg.c_str());
877 std::string msg =
"An unexpected exception has occurred!";
879 QMessageBox::warning(0,
"Query Error: ", msg.c_str());
884 std::size_t pos = propertyName.find(
".");
885 if(pos != std::string::npos)
887 std::string dataSetAliasName = propertyName.substr(0, pos);
888 propertyName = propertyName.substr(pos + 1, propertyName.size() - 1);
891 std::set<std::string> valuesStr;
892 std::set<double> valuesDouble;
893 std::set<int> valuesInt;
896 std::size_t propertyPos;
897 for(std::size_t t = 0; t < dataset->getNumProperties(); ++t)
899 if(dataset->getPropertyName(t) == propertyName)
912 int propertyType = dataset->getPropertyDataType(propertyPos);
916 while(dataset->moveNext())
918 if(!dataset->isNull(propertyName))
922 int value = dataset->getInt32(propertyName);
924 std::set<int>::iterator it = valuesInt.find(value);
926 if(it == valuesInt.end())
927 valuesInt.insert(value);
931 double value = dataset->getDouble(propertyName);
933 std::set<double>::iterator it = valuesDouble.find(value);
935 if(it == valuesDouble.end())
936 valuesDouble.insert(value);
940 std::string value = dataset->getAsString(propertyName);
942 std::set<std::string>::iterator it = valuesStr.find(value);
944 if(it == valuesStr.end())
945 valuesStr.insert(value);
953 std::set<int>::iterator it = valuesInt.begin();
955 while(it != valuesInt.end())
957 list.append(QString::number(*it));
964 std::set<double>::iterator it = valuesDouble.begin();
966 while(it != valuesDouble.end())
968 list.append(QString::number(*it,
'f', 5));
975 std::set<std::string>::iterator it = valuesStr.begin();
977 while(it != valuesStr.end())
979 list.append((*it).c_str());
An abstract class that models a source of data in a query.
The Field class can be used to model an expression that takes part of the output items of a SELECT...
A class that models the name of a dataset used in a From clause.
boost::shared_ptr< DataSource > DataSourcePtr
A class that models the name of any property of an object.
virtual void transform(int srid)=0
It converts the coordinate values of the geometry to the new spatial reference system.
It models a property definition.
This is an abstract class that models a query expression.
This class models a literal value.
This class represents a set of unique ids created in the same context. i.e. from the same data set...
std::size_t size() const
It returns the object id set size.
boost::ptr_vector< Field > Fields
Fields is just a boost::ptr_vector of Field pointers.
A class that can be used to model a filter expression that can be applied to a query.
Expression * getExp() const
A class that models a literal for double values.
Geometry is the root class of the geometries hierarchy, it follows OGC and ISO standards.
A Select models a query to be used when retrieving data from a DataSource.
boost::ptr_vector< FromItem > From
It models the FROM clause for a query.
int getType() const
It returns the property data type.
virtual ReturnType accept(VisitorType &guest) const =0
It call the visit method from the guest object.
A visitor for building an SQL statement from a given Query hierarchy.
virtual Expression * clone() const =0
It creates a new copy of this expression.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
boost::intrusive_ptr< AbstractLayer > AbstractLayerPtr
void FreeContents(boost::unordered_map< K, V * > &m)
This function can be applied to a map of pointers. It will delete each pointer in the map...
A base class for binary functions.
void setFields(Fields *f)
It sets the list of output expressions used to form the result set.
virtual void setSRID(int srid)=0
It sets the Spatial Reference System ID of the geometry and all its parts if it is a GeometryCollecti...
A class that models a literal for Geometry values.
void setFrom(From *f)
It sets the list of source information.
This class models a string Literal value.