~aleteoryx/muditaos

97833e2d8b6094fdf63e1356e0c188a39959bf1f — Pawel.Paprocki 5 years ago 3eb630b
[EGD-6313] Fix Can not find contact by full name

Add support for contact full nane in queries
M module-apps/application-phonebook/windows/PhonebookIceContacts.cpp => module-apps/application-phonebook/windows/PhonebookIceContacts.cpp +1 -6
@@ 4,7 4,6 @@
#include "PhonebookIceContacts.hpp"
#include "application-phonebook/ApplicationPhonebook.hpp"
#include "application-phonebook/data/PhonebookStyle.hpp"
#include "service-appmgr/Controller.hpp"

#include <service-db/DBNotificationMessage.hpp>



@@ 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;
            }
        }

M module-db/Tables/ContactsNameTable.cpp => module-db/Tables/ContactsNameTable.cpp +24 -5
@@ 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 <Utils.hpp>

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<QueryResult> 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;

M module-db/Tables/ContactsTable.cpp => module-db/Tables/ContactsTable.cpp +17 -3
@@ 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 <log/log.hpp>
#include <Utils.hpp>

namespace ColumnName
{


@@ 287,9 288,22 @@ std::vector<std::uint32_t> 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;