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/LiteralInt64.h" 43 #include "../../../dataaccess/query/LiteralString.h" 44 #include "../../../dataaccess/query/OrderByItem.h" 45 #include "../../../dataaccess/query/PropertyName.h" 46 #include "../../../dataaccess/query/Select.h" 47 #include "../../../dataaccess/query/SQLVisitor.h" 48 #include "../../../dataaccess/utils/Utils.h" 49 #include "../../../geometry/Geometry.h" 50 #include "../../../geometry/GeometryCollection.h" 51 #include "../../../geometry/GeometryProperty.h" 52 #include "ui_WhereClauseWidgetForm.h" 57 #include <QMessageBox> 58 #include <QToolButton> 63 te::qt::widgets::WhereClauseWidget::WhereClauseWidget(
QWidget* parent, Qt::WindowFlags f)
65 m_ui(new
Ui::WhereClauseWidgetForm)
72 m_ui->m_addWhereClausePushButton->setIcon(QIcon::fromTheme(
"list-add"));
73 m_ui->m_clearAllPushButton->setIcon(QIcon::fromTheme(
"edit-clear"));
76 connect(m_ui->m_addWhereClausePushButton, SIGNAL(clicked()),
this, SLOT(onAddWhereClausePushButtonClicked()));
77 connect(m_ui->m_clearAllPushButton, SIGNAL(clicked()),
this, SLOT(onClearAllPushButtonClicked()));
78 connect(m_ui->m_valueValueRadioButton, SIGNAL(clicked()),
this, SLOT(onValuePropertyRadioButtonClicked()));
79 connect(m_ui->m_restrictValueComboBox, SIGNAL(activated(QString)),
this, SLOT(onRestrictValueComboBoxActivated(QString)));
81 m_ui->m_sqlTextEdit->setReadOnly(
true);
94 int row =
m_ui->m_whereClauseTableWidget->rowCount();
100 std::string lastConnectorName;
102 for(
int i = 0; i < row; ++i)
105 std::string propName;
106 QTableWidgetItem* itemPropName =
m_ui->m_whereClauseTableWidget->item(i, 1);
108 propName = itemPropName->text().toUtf8().data();
111 QWidget* w =
m_ui->m_whereClauseTableWidget->cellWidget(i, 1);
112 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
114 propName = cmbBox->currentText().toUtf8().data();
117 std::string funcName;
118 QTableWidgetItem* itemFuncName =
m_ui->m_whereClauseTableWidget->item(i, 2);
120 funcName = itemFuncName->text().toUtf8().data();
123 QWidget* w =
m_ui->m_whereClauseTableWidget->cellWidget(i, 2);
124 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
126 funcName = cmbBox->currentText().toUtf8().data();
130 QTableWidgetItem* itemValue =
m_ui->m_whereClauseTableWidget->item(i, 3);
133 expIdx = itemValue->data(Qt::UserRole).toInt();
137 QWidget* w =
m_ui->m_whereClauseTableWidget->cellWidget(i, 3);
138 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
152 if(leftSide !=
nullptr && lastConnectorName.empty() ==
false)
155 leftSide = connectFunc;
163 QTableWidgetItem* itemConnectorName =
m_ui->m_whereClauseTableWidget->item(i, 4);
164 if(itemConnectorName)
166 if(itemPropName->text().isEmpty() ==
false)
167 lastConnectorName = itemConnectorName->text().toUtf8().data();
169 lastConnectorName =
"";
173 QWidget* w =
m_ui->m_whereClauseTableWidget->cellWidget(i, 4);
174 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(w);
176 lastConnectorName = cmbBox->currentText().toUtf8().data();
219 m_ui->m_layerComboBox->clear();
221 std::list<te::map::AbstractLayerPtr>::iterator it = layerList.begin();
223 while(it != layerList.end())
227 std::unique_ptr<te::da::DataSetType> dsType = l->getSchema();
231 if(dsType->hasGeom())
232 m_ui->m_layerComboBox->addItem(l->getTitle().c_str(), QVariant::fromValue(l));
245 m_ui->m_layerComboBox->addItem(layer->getTitle().c_str(), QVariant::fromValue(layer));
250 for (
int i = 0; i <
m_ui->m_layerComboBox->count(); ++i)
252 QVariant varLayer =
m_ui->m_layerComboBox->itemData(i, Qt::UserRole);
257 m_ui->m_layerComboBox->removeItem(i);
264 m_ui->m_restrictValueComboBox->clear();
265 m_ui->m_valuePropertyComboBox->clear();
267 for(
size_t t = 0; t <vec.size(); ++t)
269 m_ui->m_restrictValueComboBox->addItem(vec[t].c_str());
270 m_ui->m_valuePropertyComboBox->addItem(vec[t].c_str());
278 m_ui->m_geomAttrComboBox->clear();
280 for(
size_t t = 0; t <vec.size(); ++t)
282 m_ui->m_geomAttrComboBox->addItem(vec[t].c_str());
288 m_ui->m_OperatorComboBox->clear();
290 for(
size_t t = 0; t <vec.size(); ++t)
292 m_ui->m_OperatorComboBox->addItem(vec[t].c_str());
298 m_ui->m_SpatialOperatorComboBox->clear();
300 for(
size_t t = 0; t <vec.size(); ++t)
302 m_ui->m_SpatialOperatorComboBox->addItem(vec[t].c_str());
312 for(
size_t t = 0; t <vec.size(); ++t)
320 m_ui->m_criteriaTabWidget->setTabEnabled(index, enable);
331 m_ui->m_whereClauseTableWidget->setRowCount(0);
343 m_ui->m_restrictValueComboBox->clear();
344 m_ui->m_valuePropertyComboBox->clear();
345 m_ui->m_valueValueComboBox->clear();
346 m_ui->m_geomAttrComboBox->clear();
347 m_ui->m_OperatorComboBox->clear();
348 m_ui->m_SpatialOperatorComboBox->clear();
349 m_ui->m_sqlTextEdit->clear();
350 m_ui->m_tabWidget->setCurrentIndex(0);
355 std::string restrictValue;
356 std::string operatorStr;
357 std::string valueStr;
359 setCursor(Qt::WaitCursor);
361 if(
m_ui->m_criteriaTabWidget->currentIndex() == 0)
365 if(
m_ui->m_restrictValueComboBox->currentText().isEmpty())
367 setCursor(Qt::ArrowCursor);
368 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Restrict value not defined."));
372 if(
m_ui->m_valuePropertyRadioButton->isChecked() ==
false &&
373 m_ui->m_valueValueRadioButton->isChecked() ==
false)
375 if(
m_ui->m_valueValueComboBox->currentText().isEmpty())
377 setCursor(Qt::ArrowCursor);
378 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Value not defined."));
383 if(
m_ui->m_valueValueRadioButton->isChecked())
385 if(
m_ui->m_valueValueComboBox->currentText().isEmpty())
387 setCursor(Qt::ArrowCursor);
388 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Value not defined."));
393 restrictValue =
m_ui->m_restrictValueComboBox->currentText().toUtf8().data();
395 if(
m_ui->m_OperatorComboBox->currentText().isEmpty())
397 setCursor(Qt::ArrowCursor);
398 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Operator not defined."));
401 operatorStr =
m_ui->m_OperatorComboBox->currentText().toUtf8().data();
408 if(
m_ui->m_valuePropertyRadioButton->isChecked())
410 valueStr =
m_ui->m_valuePropertyComboBox->currentText().toUtf8().data();
418 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
420 else if(
m_ui->m_valueValueRadioButton->isChecked())
422 valueStr =
m_ui->m_valueValueComboBox->currentText().toUtf8().data();
430 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
433 std::string connector = tr(
"and").toUtf8().data();
436 int newrow =
m_ui->m_whereClauseTableWidget->rowCount();
438 m_ui->m_whereClauseTableWidget->insertRow(newrow);
442 removeBtn->setIcon(QIcon::fromTheme(
"list-remove"));
444 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 0, removeBtn);
447 QComboBox* cmbProperty =
new QComboBox(
m_ui->m_whereClauseTableWidget);
448 connect(cmbProperty, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
449 std::pair<int, int> pairProperty(expId, 1);
450 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbProperty, pairProperty));
451 copyCombo(
m_ui->m_restrictValueComboBox, cmbProperty, restrictValue);
452 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 1, cmbProperty);
455 QComboBox* cmbOperator =
new QComboBox(
m_ui->m_whereClauseTableWidget);
456 connect(cmbOperator, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
457 std::pair<int, int> pairOperator(expId, 2);
458 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbOperator, pairOperator));
459 copyCombo(
m_ui->m_OperatorComboBox, cmbOperator, operatorStr);
460 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 2, cmbOperator);
463 QComboBox* cmbValue =
new QComboBox(
m_ui->m_whereClauseTableWidget);
465 connect(cmbValue, SIGNAL(editTextChanged(QString)),
this, SLOT(
onComboBoxActivated(QString)));
466 std::pair<int, int> pairValue(expId, 3);
467 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbValue, pairValue));
468 if(
m_ui->m_valuePropertyRadioButton->isChecked())
469 copyCombo(
m_ui->m_valuePropertyComboBox, cmbValue, valueStr);
472 cmbValue->setEditable(
true);
475 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 3, cmbValue);
486 QComboBox* connectorCmbBox =
new QComboBox(
m_ui->m_whereClauseTableWidget);
487 connect(connectorCmbBox, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
488 std::pair<int, int> pairConnector(expId, 4);
489 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(connectorCmbBox, pairConnector));
491 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 4, connectorCmbBox);
493 for(
int i = 0; i < connectorCmbBox->count(); ++i)
495 if(connectorCmbBox->itemText(i).toUtf8().data() == connector)
497 connectorCmbBox->setCurrentIndex(i);
504 if(
m_ui->m_SpatialOperatorComboBox->currentText().isEmpty())
506 setCursor(Qt::ArrowCursor);
507 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Operator not defined."));
510 operatorStr =
m_ui->m_SpatialOperatorComboBox->currentText().toUtf8().data();
512 restrictValue =
m_ui->m_geomAttrComboBox->currentText().toUtf8().data();
515 int layerIdx =
m_ui->m_layerComboBox->currentIndex();
516 QVariant varLayer =
m_ui->m_layerComboBox->itemData(layerIdx, Qt::UserRole);
519 std::unique_ptr<const te::map::LayerSchema> schema(layer->getSchema());
525 setCursor(Qt::ArrowCursor);
526 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Selected layer has no geometry property."));
530 std::unique_ptr<te::da::DataSet>
ds;
532 if(
m_ui->m_selectedObjCheckBox->isChecked())
536 if(!selecteds || selecteds->
size() == 0)
538 setCursor(Qt::ArrowCursor);
539 QMessageBox::warning(
this, tr(
"Query Builder"), tr(
"Selected layer has no selected geometries."));
543 ds = layer->getData(selecteds);
547 ds = layer->getData();
550 ds->moveBeforeFirst();
552 size_t dsSize = ds->size();
556 while(ds->moveNext())
563 geom->
setSRID(layer->getSRID());
566 if(layer->getSRID() !=
m_srid)
572 valueStr = tr(
"Geometry Value").toUtf8().data();
584 m_mapExp.insert(std::map<int, ExpressionProperty*>::value_type(expId, ep));
587 std::string connector;
589 if(count < dsSize - 1)
590 connector = tr(
"or").toUtf8().data();
595 int newrow =
m_ui->m_whereClauseTableWidget->rowCount();
597 m_ui->m_whereClauseTableWidget->insertRow(newrow);
601 removeBtn->setIcon(QIcon::fromTheme(
"list-remove"));
603 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 0, removeBtn);
606 QComboBox* cmbProperty =
new QComboBox(
m_ui->m_whereClauseTableWidget);
607 connect(cmbProperty, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
608 std::pair<int, int> pairProperty(expId, 1);
609 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbProperty, pairProperty));
610 copyCombo(
m_ui->m_geomAttrComboBox, cmbProperty, restrictValue);
611 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 1, cmbProperty);
614 QComboBox* cmbOperator =
new QComboBox(
m_ui->m_whereClauseTableWidget);
615 connect(cmbOperator, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
616 std::pair<int, int> pairOperator(expId, 2);
617 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(cmbOperator, pairOperator));
618 copyCombo(
m_ui->m_SpatialOperatorComboBox, cmbOperator, operatorStr);
619 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 2, cmbOperator);
622 QTableWidgetItem* itemValue =
new QTableWidgetItem(valueStr.c_str());
623 itemValue->setData(Qt::UserRole, QVariant(expId));
624 m_ui->m_whereClauseTableWidget->setItem(newrow, 3, itemValue);
627 QComboBox* connectorCmbBox =
new QComboBox(
m_ui->m_whereClauseTableWidget);
628 connect(connectorCmbBox, SIGNAL(activated(QString)),
this, SLOT(
onComboBoxActivated(QString)));
629 std::pair<int, int> pairConnector(expId, 4);
630 m_comboMap.insert(std::map< QComboBox*, std::pair<int, int> >::value_type(connectorCmbBox, pairConnector));
632 m_ui->m_whereClauseTableWidget->setCellWidget(newrow, 4, connectorCmbBox);
634 for(
int i = 0; i < connectorCmbBox->count(); ++i)
636 if(connectorCmbBox->itemText(i).toUtf8().data() == connector)
638 connectorCmbBox->setCurrentIndex(i);
645 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
650 m_ui->m_sqlTextEdit->setText(sql.c_str());
654 setCursor(Qt::ArrowCursor);
664 for(
int i = 0; i <
m_ui->m_whereClauseTableWidget->rowCount(); ++i)
666 QWidget* w =
m_ui->m_whereClauseTableWidget->cellWidget(i, 0);
675 m_ui->m_whereClauseTableWidget->removeRow(row);
677 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
683 m_ui->m_sqlTextEdit->setText(sql.c_str());
690 std::string propertyName =
m_ui->m_restrictValueComboBox->currentText().toUtf8().data();
692 m_ui->m_valueValueComboBox->clear();
698 m_ui->m_whereClauseTableWidget->setRowCount(0);
699 m_ui->m_whereClauseTableWidget->resizeColumnsToContents();
704 m_ui->m_sqlTextEdit->setText(sql.c_str());
711 if(value.isEmpty() || !
m_ui->m_valueValueRadioButton->isChecked())
719 QComboBox* cmbBox =
dynamic_cast<QComboBox*
>(sender());
751 ep->
m_value = value.toUtf8().data();
775 m_ui->m_sqlTextEdit->setText(sql.c_str());
780 std::string dataSetName;
781 std::string dataSetAliasName;
782 std::string propertyName = propName;
784 std::size_t pos = propName.find(
".");
785 if(pos != std::string::npos)
787 dataSetAliasName = propName.substr(0, pos);
788 propertyName = propName.substr(pos + 1, propName.size() - 1);
808 if(dataSetName.empty())
812 std::unique_ptr<te::da::DataSetType> dsType =
m_ds->getDataSetType(dataSetName);
854 for(
int i = 0; i < input->count(); ++i)
856 output->addItem(input->itemText(i));
858 if(!curValue.empty() && input->itemText(i).toUtf8().data() == curValue)
862 output->setCurrentIndex(idx);
869 if(
m_ds.get() ==
nullptr)
874 fields->push_back(f);
890 std::unique_ptr<te::da::DataSet> dataset;
894 dataset =
m_ds->query(*select);
896 catch(
const std::exception& e)
898 std::string msg =
"An exception has occurred: ";
901 QMessageBox::warning(
nullptr,
"Query Error: ", msg.c_str());
907 std::string msg =
"An unexpected exception has occurred!";
909 QMessageBox::warning(
nullptr,
"Query Error: ", msg.c_str());
914 std::size_t pos = propertyName.find(
".");
915 if(pos != std::string::npos)
917 std::string dataSetAliasName = propertyName.substr(0, pos);
918 propertyName = propertyName.substr(pos + 1, propertyName.size() - 1);
921 std::set<std::string> valuesStr;
922 std::set<double> valuesDouble;
923 std::set<int> valuesInt;
926 std::size_t propertyPos;
927 for(std::size_t t = 0; t < dataset->getNumProperties(); ++t)
929 if(dataset->getPropertyName(t) == propertyName)
942 int propertyType = dataset->getPropertyDataType(propertyPos);
946 while(dataset->moveNext())
948 if(!dataset->isNull(propertyName))
952 int value = dataset->getInt32(propertyName);
954 std::set<int>::iterator it = valuesInt.find(value);
956 if(it == valuesInt.end())
957 valuesInt.insert(value);
961 double value = dataset->getDouble(propertyName);
963 std::set<double>::iterator it = valuesDouble.find(value);
965 if(it == valuesDouble.end())
966 valuesDouble.insert(value);
970 std::string value = dataset->getAsString(propertyName);
972 std::set<std::string>::iterator it = valuesStr.find(value);
974 if(it == valuesStr.end())
975 valuesStr.insert(value);
983 std::set<int>::iterator it = valuesInt.begin();
985 while(it != valuesInt.end())
987 list.append(QString::number(*it));
994 std::set<double>::iterator it = valuesDouble.begin();
996 while(it != valuesDouble.end())
998 list.append(QString::number(*it,
'f', 5));
1005 std::set<std::string>::iterator it = valuesStr.begin();
1007 while(it != valuesStr.end())
1009 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 ReturnType accept(VisitorType &guest) const =0
It call the visit method from the guest object.
static te::dt::Date ds(2010, 01, 01)
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 void setSRID(int srid) _NOEXCEPT_OP(true)=0
It sets the Spatial Reference System ID of the geometry and all its parts if it is a GeometryCollecti...
A visitor for building an SQL statement from a given Query hierarchy.
TEDATAACCESSEXPORT te::gm::GeometryProperty * GetFirstGeomProperty(const DataSetType *dt)
virtual void transform(int srid) _NOEXCEPT_OP(false)=0
It converts the coordinate values of the geometry to the new spatial reference system.
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.
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.