From da20d043a2de051a62090267ffc1e7d02aeea656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Du=C5=A1an=20Poizl?= Date: Sat, 9 Apr 2022 18:44:37 +0200 Subject: [PATCH] Add simple filter option --- databaseview.cpp | 92 ++++++++++++++++++++++++++++++++++++++++-------- databaseview.h | 24 +++++++++++-- 2 files changed, 98 insertions(+), 18 deletions(-) diff --git a/databaseview.cpp b/databaseview.cpp index 60be8f4..f326abc 100644 --- a/databaseview.cpp +++ b/databaseview.cpp @@ -4,6 +4,8 @@ #include #include #include +#include +#include const QStringList DEFAULT_COLUMNS = {"EXPTIME", "OBJECT", "RA", "DEC"}; @@ -44,6 +46,59 @@ QStringList SelectColumnsDialog::selectedColumns() return ret; } +FITSFileModel::FITSFileModel(QObject *parent) : QSqlQueryModel(parent) +{ + +} + +void FITSFileModel::sort(int column, Qt::SortOrder order) +{ + if(column < 0) + m_sort.clear(); + else if(column <= m_columns.size()) + { + if(column == 0)m_sort = " ORDER BY file "; + else m_sort = QString(" ORDER BY \"%1\" ").arg(m_columns.at(column-1)); + m_sort += order == Qt::AscendingOrder ? "ASC" : "DESC"; + prepareQuery(); + } +} + +void FITSFileModel::setColumns(const QStringList &columns) +{ + m_columns = columns; + prepareQuery(); +} + +void FITSFileModel::setFilter(const QString &key, const QString &value) +{ + if(value.isEmpty()) + { + m_having.clear(); + } + else + { + if(!m_columns.contains(key))m_columns.append(key); + m_having = QString(" HAVING \"%1\" LIKE \"%2\"").arg(key).arg(value); + } + prepareQuery(); +} + +void FITSFileModel::prepareQuery() +{ + QString sql = "SELECT file,"; + for(auto &column : m_columns) + { + sql += QString("GROUP_CONCAT(CASE WHEN key=\"%1\" THEN value END) AS \"%1\",").arg(column); + } + sql.chop(1); + sql += " FROM fits_files LEFT JOIN fits_headers ON fits_files.id=id_file GROUP BY fits_files.id" + m_having + m_sort; + setQuery(sql); + qDebug() << sql; + if(lastError().type() != QSqlError::NoError) + qDebug() << lastError(); +} + DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent) ,m_database(database) { @@ -52,13 +107,16 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent m_tableView = new QTableView(this); m_tableView->verticalHeader()->setDefaultSectionSize(1); + m_tableView->setSortingEnabled(true); + m_tableView->horizontalHeader()->setSortIndicatorShown(true); layout->addWidget(m_tableView); connect(m_tableView, &QTableView::activated, this, &DataBaseView::itemActivated); - m_model = new QSqlQueryModel(this); + m_model = new FITSFileModel(this); QSettings settings; m_tableView->setModel(m_model); + m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList()); m_tableView->horizontalHeader()->restoreState(settings.value("databaseview/header").toByteArray()); QHBoxLayout *hlayout = new QHBoxLayout(); @@ -68,9 +126,20 @@ DataBaseView::DataBaseView(Database *database, QWidget *parent) : QWidget(parent hlayout->addWidget(selectColumnsButton); connect(selectColumnsButton, &QPushButton::pressed, this, &DataBaseView::selectColumns); - QPushButton *loadDatabaseButton = new QPushButton(tr("Load database"), this); - hlayout->addWidget(loadDatabaseButton); - connect(loadDatabaseButton, &QPushButton::pressed, this, &DataBaseView::loadDatabase); + m_filterKeyword = new QComboBox(this); + m_filterKeyword->addItem("file"); + m_filterKeyword->addItems(m_database->getFitsKeywords()); + + m_search = new QLineEdit(this); + m_search->setPlaceholderText(tr("Text to search, you can % as wildcard")); + connect(m_search, &QLineEdit::returnPressed, this, &DataBaseView::applyFilter); + + QPushButton *filterButton = new QPushButton(tr("Filter"), this); + connect(filterButton, SIGNAL(pressed()), this, SLOT(applyFilter())); + + hlayout->addWidget(m_filterKeyword); + hlayout->addWidget(m_search); + hlayout->addWidget(filterButton); } DataBaseView::~DataBaseView() @@ -89,14 +158,14 @@ void DataBaseView::selectColumns() QSettings settings; QStringList columns = dialog.selectedColumns(); settings.setValue("databaseview/selectedColumns", columns); - prepareQuery(columns); + m_model->setColumns(columns); } } void DataBaseView::loadDatabase() { QSettings settings; - prepareQuery(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList()); + m_model->setColumns(settings.value("databaseview/selectedColumns", DEFAULT_COLUMNS).toStringList()); } void DataBaseView::itemActivated(const QModelIndex &index) @@ -104,15 +173,8 @@ void DataBaseView::itemActivated(const QModelIndex &index) emit loadFile(m_model->data(index.siblingAtColumn(0)).toString()); } -void DataBaseView::prepareQuery(const QStringList &columns) +void DataBaseView::applyFilter() { - QString sql = "SELECT file,"; - for(auto &column : columns) - { - sql += QString("GROUP_CONCAT(CASE WHEN key=\"%1\" THEN value END) AS \"%1\",").arg(column); - } - sql.chop(1); - sql += " FROM fits_files LEFT JOIN fits_headers ON fits_files.id=id_file GROUP BY fits_files.id"; - m_model->setQuery(sql); + m_model->setFilter(m_filterKeyword->currentText(), m_search->text()); } diff --git a/databaseview.h b/databaseview.h index a0b5138..60c1aba 100644 --- a/databaseview.h +++ b/databaseview.h @@ -6,6 +6,8 @@ #include #include #include +#include +#include #include "database.h" class SelectColumnsDialog : public QDialog @@ -18,12 +20,29 @@ public: QStringList selectedColumns(); }; +class FITSFileModel : public QSqlQueryModel +{ + Q_OBJECT + QStringList m_columns; + QString m_sort; + QString m_having; +public: + FITSFileModel(QObject *parent = nullptr); + void sort(int column, Qt::SortOrder order); + void setColumns(const QStringList &columns); + void setFilter(const QString &key, const QString &value); +protected: + void prepareQuery(); +}; + class DataBaseView : public QWidget { Q_OBJECT Database *m_database; QTableView *m_tableView; - QSqlQueryModel *m_model; + FITSFileModel *m_model; + QComboBox *m_filterKeyword; + QLineEdit *m_search; public: explicit DataBaseView(Database *database, QWidget *parent = nullptr); ~DataBaseView(); @@ -31,8 +50,7 @@ public slots: void selectColumns(); void loadDatabase(); void itemActivated(const QModelIndex &index); -protected: - void prepareQuery(const QStringList &columns); + void applyFilter(); signals: void loadFile(QString file); };