浏览代码

Refactored AStat

Refactored Stat class into AStat namespace, added customQuery functionality to ADataBase to facilitate migration
Felix Turo 4 年之前
父节点
当前提交
3fe16bd420

+ 2 - 2
openPilotLog.pro

@@ -24,7 +24,6 @@ SOURCES += \
     src/classes/asettings.cpp \
     src/classes/flight.cpp \
     src/classes/pilot.cpp \
-    src/classes/stat.cpp \
     src/classes/strictrxvalidator.cpp \
     src/database/db.cpp \
     src/database/dbinfo.cpp \
@@ -34,6 +33,7 @@ SOURCES += \
     src/experimental/aentry.cpp \
     src/functions/acalc.cpp \
     src/functions/areadcsv.cpp \
+    src/functions/astat.cpp \
     src/gui/dialogues/firstrundialog.cpp \
     src/gui/dialogues/newflightdialog.cpp \
     src/gui/dialogues/newpilotdialog.cpp \
@@ -55,7 +55,6 @@ HEADERS += \
     src/classes/asettings.h \
     src/classes/flight.h \
     src/classes/pilot.h \
-    src/classes/stat.h \
     src/classes/strictrxvalidator.h \
     src/database/db.h \
     src/database/dbinfo.h \
@@ -67,6 +66,7 @@ HEADERS += \
     src/experimental/aentry.h \
     src/functions/acalc.h \
     src/functions/areadcsv.h \
+    src/functions/astat.h \
     src/gui/dialogues/firstrundialog.h \
     src/gui/dialogues/newflightdialog.h \
     src/gui/dialogues/newpilotdialog.h \

+ 42 - 18
src/experimental/adatabase.cpp

@@ -75,18 +75,18 @@ bool ADataBase::remove(AEntry entry)
 
     QString statement = "DELETE FROM " + entry.getPosition().tableName +
             " WHERE ROWID=" + QString::number(entry.getPosition().rowId);
-    QSqlQuery q(statement);
+    QSqlQuery query(statement);
 
-    if (q.lastError().type() == QSqlError::NoError)
+    if (query.lastError().type() == QSqlError::NoError)
     {
         DEB("Entry " << entry.getPosition().tableName << entry.getPosition().rowId << " removed.");
-        emit commitSuccessful();
+        emit sqlSuccessful();
         return true;
     } else {
         DEB("Unable to delete.");
         DEB("Query: " << statement);
-        DEB("Query Error: " << q.lastError().text());
-        emit sqlError(q.lastError(), statement);
+        DEB("Query Error: " << query.lastError().text());
+        emit sqlError(query.lastError(), statement);
         return false;
     }
 }
@@ -100,9 +100,9 @@ bool ADataBase::exists(AEntry entry)
     QString statement = "SELECT COUNT(*) FROM " + entry.getPosition().tableName +
             " WHERE ROWID=" + QString::number(entry.getPosition().rowId);
     //this returns either 1 or 0 since row ids are unique
-    QSqlQuery q(statement);
-    q.next();
-    int rowId = q.value(0).toInt();
+    QSqlQuery query(statement);
+    query.next();
+    int rowId = query.value(0).toInt();
     if (rowId) {
         DEB("Entry " << entry.getPosition() << " exists.");
         return true;
@@ -128,18 +128,18 @@ bool ADataBase::update(AEntry updated_entry)
     statement.append(QLatin1String(" WHERE ROWID=") + QString::number(updated_entry.getPosition().rowId));
 
     DEB("UPDATE QUERY: " << statement);
-    QSqlQuery q(statement);
+    QSqlQuery query(statement);
 
-    if (q.lastError().type() == QSqlError::NoError)
+    if (query.lastError().type() == QSqlError::NoError)
     {
         DEB("Entry successfully committed.");
-        emit commitSuccessful();
+        emit sqlSuccessful();
         return true;
     } else {
         DEB("Unable to commit.");
         DEB("Query: " << statement);
-        DEB("Query Error: " << q.lastError().text());
-        emit sqlError(q.lastError(), statement);
+        DEB("Query Error: " << query.lastError().text());
+        emit sqlError(query.lastError(), statement);
         return false;
     }
 }
@@ -161,18 +161,18 @@ bool ADataBase::insert(AEntry new_entry)
     statement.chop(2);
     statement += QLatin1String(")");
 
-    QSqlQuery q(statement);
+    QSqlQuery query(statement);
     //check result.
-    if (q.lastError().type() == QSqlError::NoError)
+    if (query.lastError().type() == QSqlError::NoError)
     {
         DEB("Entry successfully committed.");
-        emit commitSuccessful();
+        emit sqlSuccessful();
         return true;
     } else {
         DEB("Unable to commit.");
         DEB("Query: " << statement);
-        DEB("Query Error: " << q.lastError().text());
-        emit sqlError(q.lastError(), statement);
+        DEB("Query Error: " << query.lastError().text());
+        emit sqlError(query.lastError(), statement);
         return false;
     }
 
@@ -278,6 +278,30 @@ QStringList ADataBase::getCompletionList(ADataBase::CompleterTarget target)
     return completer_list;
 }
 
+QVector<QString> ADataBase::customQuery(QString statement, int return_values)
+{
+    QSqlQuery query(statement);
+    query.exec();
+
+    if (!query.first()) {
+        DEB("No result found. Check Query and Error.");
+        DEB("Error: " << query.lastError().text());
+        emit sqlError(query.lastError(), statement);
+        return QVector<QString>();
+    } else {
+        query.first();
+        query.previous();
+        QVector<QString> result;
+        while (query.next()) {
+            for (int i = 0; i < return_values ; i++) {
+                result.append(query.value(i).toString());
+            }
+        }
+        emit sqlSuccessful();
+        return result;
+    }
+}
+
 ADataBase* aDB() { return ADataBase::getInstance(); }
 
 }

+ 9 - 3
src/experimental/adatabase.h

@@ -51,8 +51,14 @@ public:
      * \brief Can be used to access the database connection.
      * \return The QSqlDatabase object pertaining to the connection.
      */
-    static
-    QSqlDatabase database();
+    static QSqlDatabase database();
+
+    /*!
+     * \brief Can be used to send a complex query to the database.
+     * \param query - the full sql query statement
+     * \param returnValues - the number of return values
+     */
+    QVector<QString> customQuery(QString statement, int return_values);
 
     /*!
      * \brief Checks if an entry exists in the database, based on position data
@@ -109,7 +115,7 @@ public:
      */
     QStringList getCompletionList(CompleterTarget);
 signals:
-    void commitSuccessful();
+    void sqlSuccessful();
 
     void sqlError(const QSqlError &sqlError, const QString &sqlStatement);
 

+ 41 - 33
src/classes/stat.cpp → src/functions/astat.cpp

@@ -15,57 +15,63 @@
  *You should have received a copy of the GNU General Public License
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-#include "stat.h"
+#include "astat.h"
+#include "debug.h"
 
+using namespace experimental;
 
 /*!
- * \brief Stat::totalTime Looks up Total Blocktime in the flights database
+ * \brief AStat::totalTime Looks up Total Blocktime in the flights database
  * \param yearType - Whether the calculation is based on total time, last
  * calendar year or the last rolling year
  * \return Amount of Total Block Time in minutes
  */
-QString Stat::totalTime(yearType yt)
+QString AStat::totalTime(yearType year_type)
 {
-    QString query;
+    QString statement;
     QDate start;
-    QString startdate;
+    QString start_date;
 
-    switch (yt) {
-    case Stat::allYears:
-        query = "SELECT SUM(tblk) FROM flights";
+    switch (year_type) {
+    case AStat::allYears:
+        statement = "SELECT SUM(tblk) FROM flights";
         break;
-    case Stat::calendarYear:
+    case AStat::calendarYear:
         start.setDate(QDate::currentDate().year(), 1, 1);
-        startdate = start.toString(Qt::ISODate);
-        startdate.append(QLatin1Char('\''));
-        startdate.prepend(QLatin1Char('\''));
-        query = "SELECT SUM(tblk) FROM flights WHERE doft >= " + startdate;
+        start_date = start.toString(Qt::ISODate);
+        start_date.append(QLatin1Char('\''));
+        start_date.prepend(QLatin1Char('\''));
+        statement = "SELECT SUM(tblk) FROM flights WHERE doft >= " + start_date;
         break;
-    case Stat::rollingYear:
+    case AStat::rollingYear:
         start = QDate::fromJulianDay(QDate::currentDate().toJulianDay() - 365);
-        startdate = start.toString(Qt::ISODate);
-        startdate.append(QLatin1Char('\''));
-        startdate.prepend(QLatin1Char('\''));
-        query = "SELECT SUM(tblk) FROM flights WHERE doft >= " + startdate;
+        start_date = start.toString(Qt::ISODate);
+        start_date.append(QLatin1Char('\''));
+        start_date.prepend(QLatin1Char('\''));
+        statement = "SELECT SUM(tblk) FROM flights WHERE doft >= " + start_date;
         break;
     }
 
-    QVector<QString> result = Db::customQuery(query, 1);
+    //QVector<QString> result = Db::customQuery(query, 1);
+    QSqlQuery query(statement);
 
-    if (!result.isEmpty()) {
-        return result[0];
+    if (!query.first()) {
+        DEB("No result found. Check Query and Error.");
+        DEB("Error: " << query.lastError().text());
+        return "00:00";
     } else {
-        return QString();
+        query.previous();
+        return query.value(0).toString();
     }
 }
 
 /*!
- * \brief Stat::currencyTakeOffLanding Returns the amount of Take Offs and
+ * \brief AStat::currencyTakeOffLanding Returns the amount of Take Offs and
  * Landings performed in the last x days. Normally, 90 would be used. (EASA)
  * \param days Number of days to check
  * \return {TO,LDG}
  */
-QVector<QString> Stat::currencyTakeOffLanding(int days)
+QVector<QString> AStat::currencyTakeOffLanding(int days)
 {
     QDate start = QDate::fromJulianDay(QDate::currentDate().toJulianDay() - days);
     QString startdate = start.toString(Qt::ISODate);
@@ -73,11 +79,13 @@ QVector<QString> Stat::currencyTakeOffLanding(int days)
     startdate.prepend(QLatin1Char('\''));
 
 
-    QString query = "SELECT SUM(flights.TOday) + SUM(flights.TOnight) AS 'TO', "
-                    "SUM(flights.LDGday) + SUM(flights.LDGnight) AS 'LDG' "
-                    "FROM flights "
-                    "WHERE doft >= " + startdate;
-    QVector<QString> result = Db::customQuery(query, 2);
+    QString statement = "SELECT "
+            "CAST(SUM(flights.TOday) + SUM(flights.TOnight) AS INTEGER) 'TO', "
+            "CAST(SUM(flights.LDGday) + SUM(flights.LDGnight) AS INTEGER) AS 'LDG' "
+            "FROM flights "
+            "WHERE doft >= \"" + startdate + "\"";
+
+    QVector<QString> result = aDB()->customQuery(statement, 2);
 
     if (!result.isEmpty()) {
         return result;
@@ -87,7 +95,7 @@ QVector<QString> Stat::currencyTakeOffLanding(int days)
 
 }
 
-QVector<QPair<QString, QString>> Stat::totals()
+QVector<QPair<QString, QString>> AStat::totals()
 {
     QString statement = "SELECT "
             "printf('%02d',CAST(SUM(tblk) AS INT)/60)||':'||printf('%02d',CAST(SUM(tblk) AS INT)%60) AS 'TOTAL', "
@@ -109,12 +117,12 @@ QVector<QPair<QString, QString>> Stat::totals()
                                 "pic", "picus", "sic", "dual", "fi", "sim", "multipilot",
                                 "today", "tonight", "ldgday", "ldgnight"
                                };
-    QSqlQuery q(statement);
+    QSqlQuery query(statement);
     QVector<QPair<QString, QString>> output;
     QString value;
-    q.next();
+    query.next();
     for (const auto &column : columns) {
-        value = q.value(columns.indexOf(column)).toString();
+        value = query.value(columns.indexOf(column)).toString();
         if (!value.isEmpty()) {
             output << QPair{column, value};
         } else {

+ 15 - 13
src/classes/stat.h → src/functions/astat.h

@@ -15,29 +15,31 @@
  *You should have received a copy of the GNU General Public License
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-#ifndef STAT_H
-#define STAT_H
+#ifndef ASTAT_H
+#define ASTAT_H
+#include <QtCore>
+#include <QSqlQuery>
+#include <QSqlError>
+#include "src/experimental/adatabase.h"
+
+namespace AStat {
 
-#include "src/database/db.h"
-#include <QDateTime>
 
 /*!
- * \brief The stat class provides functionality for retreiving various statistics
+ * \brief The AStat namespace provides functionality for retreiving various statistics
  * from the database, such as total times or recency. In general, most values are
  * provided as either QString or QVector<QString>.
  */
-class Stat
-{
-public:
+
 
     enum yearType {allYears, calendarYear, rollingYear};
 
-    static QString totalTime(yearType);
+    QString totalTime(yearType);
 
-    static QVector<QString> currencyTakeOffLanding(int days);
+    QVector<QString> currencyTakeOffLanding(int days);
 
-    static QVector<QPair<QString, QString>> totals();
+    QVector<QPair<QString, QString>> totals();
 
-};
+} // namespace AStat
 
-#endif // STAT_H
+#endif // ASTAT_H

+ 1 - 1
src/gui/dialogues/newpilotdialog.cpp

@@ -119,7 +119,7 @@ void NewPilotDialog::setup()
     ///   makes it easier to maintain.
     /// - these signals and slots are specific to this dialog, for communication with
     ///   other widgets we have the QDialog::accepted() and QDialog::rejected signals.
-    QObject::connect(aDB(), &ADataBase::commitSuccessful,
+    QObject::connect(aDB(), &ADataBase::sqlSuccessful,
                      this, &NewPilotDialog::onCommitSuccessful);
     QObject::connect(aDB(), &ADataBase::sqlError,
                      this, &NewPilotDialog::onCommitUnsuccessful);

+ 1 - 1
src/gui/widgets/homewidget.h

@@ -23,7 +23,7 @@
 #include <QLabel>
 #include <QLineEdit>
 #include "src/database/db.h"
-#include "src/classes/stat.h"
+#include "src/functions/astat.h"
 #include "src/functions/acalc.h"
 #include "src/gui/dialogues/newtaildialog.h"
 #include "src/classes/aircraft.h"

+ 1 - 1
src/gui/widgets/totalswidget.cpp

@@ -7,7 +7,7 @@ TotalsWidget::TotalsWidget(QWidget *parent) :
     ui(new Ui::TotalsWidget)
 {
     ui->setupUi(this);
-    auto data = Stat::totals();
+    auto data = AStat::totals();
     DEB("Filling Totals Line Edits...");
     //DEB("data: " << data);
     for (const auto &field : data) {

+ 1 - 1
src/gui/widgets/totalswidget.h

@@ -7,7 +7,7 @@
 #include <QLineEdit>
 #include <QSettings>
 #include "src/database/db.h"
-#include "src/classes/stat.h"
+#include "src/functions/astat.h"
 
 namespace Ui {
 class TotalsWidget;