2
0
Эх сурвалжийг харах

Database matching update

Reversed key/value logic in Database to user input mapping
Fixed lookup of registrations in NewFlightDialog
Felix Turo 3 жил өмнө
parent
commit
c1c2a7208e

+ 13 - 2
src/classes/acompletiondata.cpp

@@ -3,10 +3,21 @@
 void ACompletionData::init()
 {
     // retreive user modifiable data
-    pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
-    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
     pilotsIdMap = aDB->getIdMap(ADatabaseTarget::pilots);
     tailsIdMap  = aDB->getIdMap(ADatabaseTarget::tails);
+    pilotList   = aDB->getCompletionList(ADatabaseTarget::pilots);
+    tailsList   = aDB->getCompletionList(ADatabaseTarget::registrations);
+
+    // For tails, also provide completion for registration stripped of the '-' character
+    QStringList tails_list = aDB->getCompletionList(ADatabaseTarget::registrations);
+    for (auto &reg : tails_list) {
+        if(reg.contains(QLatin1Char('-'))) { // check to avoid duplication if reg has no '-'
+            QString copy = reg;
+            reg.remove(QLatin1Char('-'));
+            reg = copy + " (" + reg + QLatin1Char(')');
+        }
+    }
+    tailsList   = tails_list;
 
     // retreive default data
     airportIcaoIdMap = aDB->getIdMap(ADatabaseTarget::airport_identifier_icao);

+ 5 - 5
src/classes/acompletiondata.h

@@ -25,11 +25,11 @@ public:
 
 
     // Maps for input mapping DB key - user input
-    QMap<PilotName_T, PilotRowId_T> pilotsIdMap;
-    QMap<TailRegistration_T, TailId_T> tailsIdMap;
-    QMap<AirportICAO_T, AirportId_T> airportIcaoIdMap;
-    QMap<AirportIATA_T, AirportId_T> airportIataIdMap;
-    QMap<AirportName_T, AirportId_T> airportNameIdMap;
+    QMap<RowId_T, QString> pilotsIdMap;
+    QMap<RowId_T, QString> tailsIdMap;
+    QMap<RowId_T, QString> airportIcaoIdMap;
+    QMap<RowId_T, QString> airportIataIdMap;
+    QMap<RowId_T, QString> airportNameIdMap;
     // Lists for QCompleter
     QStringList pilotList;
     QStringList tailsList;

+ 4 - 4
src/database/adatabase.cpp

@@ -571,7 +571,7 @@ const QStringList ADatabase::getCompletionList(ADatabaseTarget target)
 }
 
 const
-QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
+QMap<RowId_T, QString> ADatabase::getIdMap(ADatabaseTarget target)
 {
     QString statement;
 
@@ -613,13 +613,13 @@ QMap<QString, RowId_T> ADatabase::getIdMap(ADatabaseTarget target)
         lastError = query.lastError();
         return {};
     }
-    auto id_map = QMap<QString, RowId_T>();
+    auto id_map = QMap<RowId_T, QString>();
     while (query.next())
-        id_map.insert(query.value(1).toString(), query.value(0).toInt());
+        id_map.insert(query.value(0).toInt(), query.value(1).toString());
     return id_map;
 }
 
-int ADatabase::getLastEntry(ADatabaseTable table)
+RowId_T ADatabase::getLastEntry(ADatabaseTable table)
 {
     QString statement = QLatin1String("SELECT MAX(ROWID) FROM ");
 

+ 3 - 3
src/database/adatabase.h

@@ -318,16 +318,16 @@ public:
     const QStringList getCompletionList(ADatabaseTarget target);
 
     /*!
-     * \brief returns a QMap<QString, RowId_t> of a human-readable database value and
+     * \brief returns a QMap of a human-readable database value and
      * its row id. Used in the Dialogs to map user input to unique database entries.
      * \todo What is this QString semantically? As i understand its a "QueryResult" QVariant cast to QString
      */
-    const QMap<QString, RowId_T> getIdMap(ADatabaseTarget target);
+    const QMap<RowId_T, QString> getIdMap(ADatabaseTarget target);
 
     /*!
      * \brief returns the ROWID for the newest entry in the respective database.
      */
-    int getLastEntry(ADatabaseTable table);
+    RowId_T getLastEntry(ADatabaseTable table);
 
     /*!
      * \brief returns a list of ROWID's in the flights table for which foreign key constraints

+ 27 - 25
src/gui/dialogues/newflightdialog.cpp

@@ -320,7 +320,7 @@ void NewFlightDialog::fillDeductibleData()
 
     ui->tblkTimeLineEdit->setText(block_time_string);
     // get acft data and fill deductible entries
-    auto acft = aDB->getTailEntry(completionData.tailsIdMap.value(ui->acftLineEdit->text()));
+    auto acft = aDB->getTailEntry(completionData.tailsIdMap.key(ui->acftLineEdit->text()));
 
     // TOTAL
     ui->tblkLabel->setText(QLatin1String("<b>") + block_time_string + QLatin1String("</b>"));
@@ -422,11 +422,11 @@ RowData_T NewFlightDialog::collectInput()
     newData.insert(Opl::Db::FLIGHTS_TONB, ATime::toMinutes(tonb));
     newData.insert(Opl::Db::FLIGHTS_TBLK, block_minutes);
     // Aircraft
-    newData.insert(Opl::Db::FLIGHTS_ACFT, completionData.tailsIdMap.value(ui->acftLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_ACFT, completionData.tailsIdMap.key(ui->acftLineEdit->text()));
     // Pilots
-    newData.insert(Opl::Db::FLIGHTS_PIC, completionData.pilotsIdMap.value(ui->picNameLineEdit->text()));
-    newData.insert(Opl::Db::FLIGHTS_SECONDPILOT, completionData.pilotsIdMap.value(ui->secondPilotNameLineEdit->text()));
-    newData.insert(Opl::Db::FLIGHTS_THIRDPILOT, completionData.pilotsIdMap.value(ui->thirdPilotNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_PIC, completionData.pilotsIdMap.key(ui->picNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_SECONDPILOT, completionData.pilotsIdMap.key(ui->secondPilotNameLineEdit->text()));
+    newData.insert(Opl::Db::FLIGHTS_THIRDPILOT, completionData.pilotsIdMap.key(ui->thirdPilotNameLineEdit->text()));
 
     // Extra Times
     ui->tSPSETimeLineEdit->text().isEmpty() ?
@@ -614,8 +614,8 @@ void NewFlightDialog::formFiller()
             if(rx.match(leName).hasMatch())  {
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 if(line_edits != nullptr){
-                    DEB << completionData.pilotsIdMap.key(1);
-                    line_edits->setText(completionData.pilotsIdMap.key(flightEntry.getData().value(data_key).toInt()));
+                    DEB << completionData.pilotsIdMap.value(1);
+                    line_edits->setText(completionData.pilotsIdMap.value(flightEntry.getData().value(data_key).toInt()));
                     line_edits_names.removeOne(leName);
                 }
                 break;
@@ -734,7 +734,7 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
             parent_line_edit->completer()->setModel(new_model); //setModel deletes old model if it has the completer as parent
 
             // update Line Edit
-            parent_line_edit->setText(completionData.tailsIdMap.key(aDB->getLastEntry(ADatabaseTable::tails)));
+            parent_line_edit->setText(completionData.tailsIdMap.value(aDB->getLastEntry(ADatabaseTable::tails)));
             emit parent_line_edit->editingFinished();
         } else {
             parent_line_edit->setText(QString());
@@ -773,7 +773,7 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
             parent_line_edit->completer()->setModel(new_model); //setModel deletes old model if it has the completer as parent
 
             // update Line Edit
-            parent_line_edit->setText(completionData.pilotsIdMap.key(aDB->getLastEntry(ADatabaseTable::pilots)));
+            parent_line_edit->setText(completionData.pilotsIdMap.value(aDB->getLastEntry(ADatabaseTable::pilots)));
             emit parent_line_edit->editingFinished();
         } else {
             parent_line_edit->setText(QString());
@@ -1010,9 +1010,9 @@ void NewFlightDialog::onLocationEditingFinished(QLineEdit *line_edit, QLabel *na
 
     // try to map iata or icao code to airport id;
     if (text.length() == 3) {
-        airport_id = completionData.airportIataIdMap.value(text);
+        airport_id = completionData.airportIataIdMap.key(text);
     } else {
-        airport_id = completionData.airportIcaoIdMap.value(text);
+        airport_id = completionData.airportIcaoIdMap.key(text);
     }
     // check result
     if (airport_id == 0) {
@@ -1021,8 +1021,8 @@ void NewFlightDialog::onLocationEditingFinished(QLineEdit *line_edit, QLabel *na
         onBadInputReceived(line_edit);
         return;
     }
-    line_edit->setText(completionData.airportIcaoIdMap.key(airport_id));
-    name_label->setText(completionData.airportNameIdMap.key(airport_id));
+    line_edit->setText(completionData.airportIcaoIdMap.value(airport_id));
+    name_label->setText(completionData.airportNameIdMap.value(airport_id));
     onGoodInputReceived(line_edit);
 }
 
@@ -1060,29 +1060,31 @@ void NewFlightDialog::onTimeLineEdit_editingFinished()
 
 void NewFlightDialog::on_acftLineEdit_editingFinished()
 {
+    TODO << "Looking up and matching tails is currently broken...";
     auto line_edit = ui->acftLineEdit;
-    int acft_id = completionData.tailsIdMap.value(line_edit->text());
-    //DEB << line_edit->objectName() << "Editing Finished!" << line_edit->text());
+    int acft_id = completionData.tailsIdMap.key(line_edit->text());
+    DEB << "acft_id: " << acft_id;
 
-    if (acft_id != 0) {
+    if (acft_id != 0) { // Success
         //DEB << "Mapped: " << line_edit->text() << completionData.tailsIdMap.value(line_edit->text());
         auto acft = aDB->getTailEntry(acft_id);
         ui->acftTypeLabel->setText(acft.type());
         ui->picCompanyLabel->setText(acft.getData().value(Opl::Db::TAILS_COMPANY).toString());
         onGoodInputReceived(line_edit);
         return;
-    } else if (!line_edit->completer()->currentCompletion().isEmpty()
-            && !line_edit->text().isEmpty()) {
-        DEB << "Trying to fix input...";
-        line_edit->setText(line_edit->completer()->currentCompletion());
+    }
+
+    if (!line_edit->completer()->currentCompletion().isEmpty()) {
+        line_edit->setText(line_edit->completer()->currentCompletion().split(QLatin1Char(' ')).first());
         emit line_edit->editingFinished();
         return;
-    } else {
+    }
+
+    // If no success mark as bad input
     onBadInputReceived(line_edit);
     ui->acftTypeLabel->setText(tr("Unknown Registration."));
     if (line_edit->text() != QString())
         addNewTail(line_edit);
-    }
 }
 
 /*
@@ -1097,13 +1099,13 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
 
     if(line_edit->text().contains(SELF, Qt::CaseInsensitive)) {
         DEB << "self recognized.";
-        line_edit->setText(completionData.pilotsIdMap.key(1));
+        line_edit->setText(completionData.pilotsIdMap.value(1));
         onGoodInputReceived(line_edit);
         return;
     }
 
-    if(completionData.pilotsIdMap.value(line_edit->text()) != 0) {
-        DEB << "Mapped: " << line_edit->text() << completionData.pilotsIdMap.value(line_edit->text());
+    if(completionData.pilotsIdMap.key(line_edit->text()) != 0) {
+        DEB << "Mapped: " << line_edit->text() << completionData.pilotsIdMap.key(line_edit->text());
         onGoodInputReceived(line_edit);
         return;
     }

+ 6 - 6
src/gui/dialogues/newtaildialog.cpp

@@ -127,7 +127,7 @@ void NewTailDialog::fillForm(AEntry entry, bool is_template)
 
     auto data = entry.getData();
 
-    for (const auto &le : line_edits) {
+    for (const auto &le : qAsConst(line_edits)) {
         auto key = le->objectName().remove(QStringLiteral("LineEdit"));
         le->setText(data.value(key).toString());
     }
@@ -152,7 +152,7 @@ bool NewTailDialog::verify()
     recommended_combo_boxes.append(this->findChild<QComboBox *>(QStringLiteral("ppNumberComboBox")));
     recommended_combo_boxes.append(this->findChild<QComboBox *>(QStringLiteral("ppTypeComboBox")));
 
-    for (const auto &le : recommended_line_edits) {
+    for (const auto &le : qAsConst(recommended_line_edits)) {
         if (le->text() != "") {
             DEB << "Good: " << le;
             recommended_line_edits.removeOne(le);
@@ -162,7 +162,7 @@ bool NewTailDialog::verify()
             DEB << "Not Good: " << le;
         }
     }
-    for (const auto &cb : recommended_combo_boxes) {
+    for (const auto &cb : qAsConst(recommended_combo_boxes)) {
         if (cb->currentIndex() != 0) {
 
             recommended_combo_boxes.removeOne(cb);
@@ -192,7 +192,7 @@ void NewTailDialog::submitForm()
     auto line_edits = this->findChildren<QLineEdit *>();
     line_edits.removeOne(this->findChild<QLineEdit *>(QStringLiteral("searchLineEdit")));
 
-    for (const auto &le : line_edits) {
+    for (const auto &le : qAsConst(line_edits)) {
         auto key = le->objectName().remove(QStringLiteral("LineEdit"));
         new_data.insert(key, le->text());
     }
@@ -284,9 +284,9 @@ void NewTailDialog::onSearchCompleterActivated()
     const auto &text = ui->searchLineEdit->text();
     if (aircraftList.contains(text)) {
 
-            DEB << "Template Selected. aircraft_id is: " << idMap.value(text);
+            DEB << "Template Selected. aircraft_id is: " << idMap.key(text);
             //call autofiller for dialog
-            fillForm(aDB->getAircraftEntry(idMap.value(text)), true);
+            fillForm(aDB->getAircraftEntry(idMap.key(text)), true);
             ui->searchLineEdit->setStyleSheet(QStringLiteral("border: 1px solid green"));
             ui->searchLabel->setText(text);
         } else {

+ 1 - 1
src/gui/dialogues/newtaildialog.h

@@ -59,7 +59,7 @@ private:
 
     QStringList aircraftList;
 
-    QMap<QString, int> idMap;
+    QMap<RowId_T, QString> idMap;
 
     void setupCompleter();
     void setupValidators();