From 8e03583fe21bcd5e0025da81d8f4a34ed05cd058 Mon Sep 17 00:00:00 2001 From: Richard Maudsley Date: Tue, 1 Jul 2014 14:49:08 +0100 Subject: Improve search filter matching algrorithm. After this patch roster items only match if the letters are present in the name or the JID of the roster item in the same order as in the search term Test-Information: Try various search terms and verify that search results are logical. Change-Id: I4bc5febc465613a44930334fd8e498875fefda7a diff --git a/Swift/Controllers/ContactSuggester.cpp b/Swift/Controllers/ContactSuggester.cpp index 09a1567..42e8308 100644 --- a/Swift/Controllers/ContactSuggester.cpp +++ b/Swift/Controllers/ContactSuggester.cpp @@ -63,13 +63,17 @@ std::vector ContactSuggester::getSuggestions(const std::string& se } bool ContactSuggester::fuzzyMatch(std::string text, std::string match) { - for (std::string::iterator currentQueryChar = match.begin(); currentQueryChar != match.end(); currentQueryChar++) { - //size_t result = text.find(*currentQueryChar); - std::string::iterator result = boost::algorithm::ifind_first(text, std::string(currentQueryChar, currentQueryChar+1)).begin(); - if (result == text.end()) { + std::string lowerText = text; + boost::algorithm::to_lower(lowerText); + std::string lowerMatch = match; + boost::algorithm::to_lower(lowerMatch); + size_t lastMatch = 0; + for (size_t i = 0; i < lowerMatch.length(); ++i) { + size_t where = lowerText.find_first_of(lowerMatch[i], lastMatch); + if (where == std::string::npos) { return false; } - text.erase(result); + lastMatch = where + 1; } return true; } diff --git a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp index ca84759..e309265 100644 --- a/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp +++ b/Swift/QtUI/UserSearch/QtUserSearchWindow.cpp @@ -245,7 +245,7 @@ JID QtUserSearchWindow::getContactJID() const { if (userItem) { /* Remember to leave this if we change to dynamic cast */ jid = userItem->getJID(); } - } else { + } else if (dynamic_cast(model_)) { int row = resultsPage_->results_->currentIndex().row(); Form::FormItem item = dynamic_cast(model_)->getForm()->getItems().at(row); -- cgit v0.10.2-6-g49f6