From 97833e2d8b6094fdf63e1356e0c188a39959bf1f Mon Sep 17 00:00:00 2001 From: "Pawel.Paprocki" Date: Wed, 14 Apr 2021 16:33:11 +0200 Subject: [PATCH] [EGD-6313] Fix Can not find contact by full name Add support for contact full nane in queries --- .../windows/PhonebookIceContacts.cpp | 7 +---- module-db/Tables/ContactsNameTable.cpp | 29 +++++++++++++++---- module-db/Tables/ContactsTable.cpp | 20 +++++++++++-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp b/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp index 044b839715acf5968fb7ba658eeef931538e859b..2755cda2bca97e124bbf20c9cb28835e76c2c27f 100644 --- a/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp +++ b/module-apps/application-phonebook/windows/PhonebookIceContacts.cpp @@ -4,7 +4,6 @@ #include "PhonebookIceContacts.hpp" #include "application-phonebook/ApplicationPhonebook.hpp" #include "application-phonebook/data/PhonebookStyle.hpp" -#include "service-appmgr/Controller.hpp" #include @@ -57,11 +56,7 @@ namespace gui bool PhonebookIceContacts::onInput(const InputEvent &inputEvent) { if (inputEvent.isShortPress()) { - if (inputEvent.is(KeyCode::KEY_RF)) { - app::manager::Controller::switchBack(application); - return true; - } - else if (inputEvent.is(KeyCode::KEY_ENTER)) { + if (inputEvent.is(KeyCode::KEY_ENTER)) { return true; } } diff --git a/module-db/Tables/ContactsNameTable.cpp b/module-db/Tables/ContactsNameTable.cpp index 1c77c41ececeb940e98d2697174183cd894b6e20..a771a8b9f18100b2f45c56b5d6095bf6bc2b2943 100644 --- a/module-db/Tables/ContactsNameTable.cpp +++ b/module-db/Tables/ContactsNameTable.cpp @@ -1,7 +1,8 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ContactsNameTable.hpp" +#include ContactsNameTable::ContactsNameTable(Database *db) : Table(db) {} @@ -174,10 +175,28 @@ std::size_t ContactsNameTable::GetCountByName(const std::string &name) if (name.empty()) { return count(); } - auto queryRet = - db->query("SELECT COUNT(*) FROM contact_name WHERE name_primary like '%s%%' OR name_alternative like '%s%%';", - name.c_str(), - name.c_str()); + + const auto names = utils::split(name, " "); + const auto namePart1 = names[0]; + const auto namePart2 = names.size() > 1 ? names[1] : ""; + + std::unique_ptr queryRet; + + if (!namePart1.empty() && !namePart2.empty()) { + queryRet = db->query( + "SELECT COUNT(*) FROM contact_name WHERE (name_primary like '%s%%' AND name_alternative like '%s%%') OR " + "(name_primary like '%s%%' AND name_alternative like '%s%%');", + namePart1.c_str(), + namePart2.c_str(), + namePart2.c_str(), + namePart1.c_str()); + } + else { + queryRet = db->query( + "SELECT COUNT(*) FROM contact_name WHERE name_primary like '%s%%' OR name_alternative like '%s%%';", + namePart1.c_str(), + namePart1.c_str()); + } if ((queryRet == nullptr) || (queryRet->getRowCount() == 0)) { return 0; diff --git a/module-db/Tables/ContactsTable.cpp b/module-db/Tables/ContactsTable.cpp index 91e9e5455dd287e599085917ab97e99243b67572..4a318ae6d4682fcd8c70e778a14e86990ce71ac5 100644 --- a/module-db/Tables/ContactsTable.cpp +++ b/module-db/Tables/ContactsTable.cpp @@ -1,8 +1,9 @@ -// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "ContactsTable.hpp" #include +#include namespace ColumnName { @@ -287,9 +288,22 @@ std::vector ContactsTable::GetIDsSortedByField( switch (matchType) { case MatchType::Name: { query += exclude_temporary; + if (!name.empty()) { - query += " AND ( contact_name.name_primary || ' ' || contact_name.name_alternative LIKE '" + name + "%%'"; - query += " OR contact_name.name_alternative || ' ' || contact_name.name_primary LIKE '" + name + "%%')"; + const auto names = utils::split(name, " "); + const auto namePart1 = names[0]; + const auto namePart2 = names.size() > 1 ? names[1] : ""; + + if (!namePart1.empty() && !namePart2.empty()) { + query += " AND (( contact_name.name_primary LIKE '" + namePart1 + "%%'"; + query += " AND contact_name.name_alternative LIKE '" + namePart2 + "%%')"; + query += " OR ( contact_name.name_primary LIKE '" + namePart2 + "%%'"; + query += " AND contact_name.name_alternative LIKE '" + namePart1 + "%%'))"; + } + else { + query += " AND ( contact_name.name_primary LIKE '" + namePart1 + "%%'"; + query += " OR contact_name.name_alternative LIKE '" + namePart1 + "%%')"; + } } } break;