summaryrefslogtreecommitdiffstats
path: root/Swift
diff options
context:
space:
mode:
authorRichard Maudsley <richard.maudsley@isode.com>2014-07-01 13:49:08 (GMT)
committerSwift Review <review@swift.im>2014-07-09 13:39:30 (GMT)
commit8e03583fe21bcd5e0025da81d8f4a34ed05cd058 (patch)
tree33fe40aa6e38c47d4e76145209e59787db90d100 /Swift
parent43fce94494307d1b3a866f5781528c94df7e5bca (diff)
downloadswift-8e03583fe21bcd5e0025da81d8f4a34ed05cd058.zip
swift-8e03583fe21bcd5e0025da81d8f4a34ed05cd058.tar.bz2
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
Diffstat (limited to 'Swift')
-rw-r--r--Swift/Controllers/ContactSuggester.cpp14
-rw-r--r--Swift/QtUI/UserSearch/QtUserSearchWindow.cpp2
2 files changed, 10 insertions, 6 deletions
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<Contact::ref> 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<QtFormResultItemModel*>(model_)) {
int row = resultsPage_->results_->currentIndex().row();
Form::FormItem item = dynamic_cast<QtFormResultItemModel*>(model_)->getForm()->getItems().at(row);