diff --git a/src/MainWindow.cpp b/src/MainWindow.cpp index be5b3e33..223fbf88 100644 --- a/src/MainWindow.cpp +++ b/src/MainWindow.cpp @@ -2539,7 +2539,7 @@ static void loadBrowseDataTableSettings(BrowseDataTableSettings& settings, sqlb: size_t index = xml.attributes().value("index").toUInt(); QString value = xml.attributes().value("value").toString(); if(!value.isEmpty()) - settings.filterValues[index] = value; + settings.filterValues[field_information.at(index).name] = value; xml.skipCurrentElement(); } } @@ -2922,7 +2922,7 @@ static void saveBrowseDataTableSettings(const BrowseDataTableSettings& object, s xml.writeStartElement("filter_values"); for(auto iter=object.filterValues.cbegin(); iter!=object.filterValues.cend(); ++iter) { xml.writeStartElement("column"); - xml.writeAttribute("index", QString::number(iter->first)); + xml.writeAttribute("index", QString::number(sqlb::getFieldNumber(obj, iter->first))); xml.writeAttribute("value", iter->second); xml.writeEndElement(); } diff --git a/src/TableBrowser.cpp b/src/TableBrowser.cpp index 5d57340c..6d2e6e51 100644 --- a/src/TableBrowser.cpp +++ b/src/TableBrowser.cpp @@ -558,17 +558,18 @@ void TableBrowser::updateFilter(size_t column, const QString& value) ui->dataTable->verticalHeader()->setMinimumWidth(ui->dataTable->verticalHeader()->width()); // Update the filter in the model and its query - m_model->updateFilter(column, value); + const std::string column_name = model()->headerData(static_cast(column), Qt::Horizontal, Qt::EditRole).toString().toStdString(); + m_model->updateFilter(column_name, value); // Save the new filter settings BrowseDataTableSettings& settings = m_settings[currentlyBrowsedTableName()]; if(value.isEmpty()) { - if(settings.filterValues.erase(column) > 0) + if(settings.filterValues.erase(column_name) > 0) emit projectModified(); } else { - if (settings.filterValues[column] != value) { - settings.filterValues[column] = value; + if (settings.filterValues[column_name] != value) { + settings.filterValues[column_name] = value; emit projectModified(); } } @@ -662,8 +663,9 @@ void TableBrowser::modifyFormat(std::function changeFunction) if (columns.size() > 0) { for (size_t column : columns) { QString filter; - if (m_settings[currentlyBrowsedTableName()].filterValues.count(column) > 0) - filter = m_settings[currentlyBrowsedTableName()].filterValues.at(column); + const std::string column_name = model()->headerData(static_cast(column), Qt::Horizontal, Qt::EditRole).toString().toStdString(); + if (m_settings[currentlyBrowsedTableName()].filterValues.count(column_name) > 0) + filter = m_settings[currentlyBrowsedTableName()].filterValues.at(column_name); modifySingleFormat(false, filter, currentIndex().sibling(currentIndex().row(), static_cast(column)), changeFunction); } } else { @@ -928,8 +930,9 @@ void TableBrowser::generateFilters() // Set filters blocking signals for this since the filter is already applied to the browse table model FilterTableHeader* filterHeader = qobject_cast(ui->dataTable->horizontalHeader()); bool oldState = filterHeader->blockSignals(true); + auto obj = db->getObjectByName(currentlyBrowsedTableName()); for(auto filterIt=settings.filterValues.cbegin();filterIt!=settings.filterValues.cend();++filterIt) - ui->dataTable->setFilter(static_cast(filterIt->first), filterIt->second); + ui->dataTable->setFilter(sqlb::getFieldNumber(obj, filterIt->first) + 1, filterIt->second); filterHeader->blockSignals(oldState); } @@ -1489,15 +1492,15 @@ void TableBrowser::jumpToRow(const sqlb::ObjectIdentifier& table, std::string co column = obj->primaryKey()->columnList().front(); // If column doesn't exist don't do anything - auto column_index = sqlb::findField(obj, column); - if(column_index == obj->fields.end()) + auto column_it = sqlb::findField(obj, column); + if(column_it == obj->fields.end()) return; // Jump to table setCurrentTable(table); // Set filter - m_settings[table].filterValues[static_cast(column_index-obj->fields.begin()+1)] = value; + m_settings[table].filterValues[column_it->name()] = value; refresh(); } diff --git a/src/TableBrowser.h b/src/TableBrowser.h index a00623d4..3a694669 100644 --- a/src/TableBrowser.h +++ b/src/TableBrowser.h @@ -29,7 +29,7 @@ struct BrowseDataTableSettings using CondFormatMap = std::map>; std::vector sortColumns; std::map columnWidths; - std::map filterValues; + std::map filterValues; CondFormatMap condFormats; CondFormatMap rowIdFormats; std::map displayFormats; diff --git a/src/sql/Query.cpp b/src/sql/Query.cpp index e64ed43f..84f80f28 100644 --- a/src/sql/Query.cpp +++ b/src/sql/Query.cpp @@ -25,11 +25,8 @@ std::string Query::buildWherePart() const { for(auto i=m_where.cbegin();i!=m_where.cend();++i) { - if(i->first >= m_column_names.size()) - continue; - - const auto it = findSelectedColumnByName(m_column_names.at(i->first)); - std::string column = sqlb::escapeIdentifier(m_column_names.at(i->first)); + const auto it = findSelectedColumnByName(i->first); + std::string column = sqlb::escapeIdentifier(i->first); if(it != m_selected_columns.cend() && it->selector != column) column = it->selector; where += column + " " + i->second + " AND "; diff --git a/src/sql/Query.h b/src/sql/Query.h index 4f2fb957..abb96646 100644 --- a/src/sql/Query.h +++ b/src/sql/Query.h @@ -79,8 +79,8 @@ public: const std::vector& selectedColumns() const { return m_selected_columns; } std::vector& selectedColumns() { return m_selected_columns; } - const std::unordered_map& where() const { return m_where; } - std::unordered_map& where() { return m_where; } + const std::unordered_map& where() const { return m_where; } + std::unordered_map& where() { return m_where; } const std::vector& globalWhere() const { return m_global_where; } std::vector& globalWhere() { return m_global_where; } @@ -95,8 +95,8 @@ private: sqlb::ObjectIdentifier m_table; std::vector m_rowid_columns; std::vector m_selected_columns; - std::unordered_map m_where; // TODO The two where variables should be merged into a single variable which ... - std::vector m_global_where; // ... holds some sort of general tree structure for all sorts of where conditions. + std::unordered_map m_where; // TODO The two where variables should be merged into a single variable which ... + std::vector m_global_where; // ... holds some sort of general tree structure for all sorts of where conditions. std::vector m_sort; std::vector::iterator findSelectedColumnByName(const std::string& name); diff --git a/src/sqlitetablemodel.cpp b/src/sqlitetablemodel.cpp index fe62d0ed..be42dc7c 100644 --- a/src/sqlitetablemodel.cpp +++ b/src/sqlitetablemodel.cpp @@ -839,12 +839,12 @@ void SqliteTableModel::setCondFormats(const bool isRowIdFormat, size_t column, c emit layoutChanged(); } -void SqliteTableModel::updateFilter(size_t column, const QString& value) +void SqliteTableModel::updateFilter(const std::string& column, const QString& value) { std::string whereClause = CondFormat::filterToSqlCondition(value, m_encoding); // If the value was set to an empty string remove any filter for this column. Otherwise insert a new filter rule or replace the old one if there is already one - if(whereClause.empty()) + if(whereClause.empty()) m_query.where().erase(column); else m_query.where()[column] = whereClause; diff --git a/src/sqlitetablemodel.h b/src/sqlitetablemodel.h index 3010695a..0f9e1e33 100644 --- a/src/sqlitetablemodel.h +++ b/src/sqlitetablemodel.h @@ -143,7 +143,7 @@ public: void reloadSettings(); public slots: - void updateFilter(size_t column, const QString& value); + void updateFilter(const std::string& column, const QString& value); void updateGlobalFilter(const std::vector& values); signals: