summary refs log tree commit diff
path: root/src/Cache.cc
diff options
context:
space:
mode:
authorKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-27 01:57:46 +0300
committerKonstantinos Sideris <sideris.konstantin@gmail.com>2018-04-27 01:57:46 +0300
commitb72e48cbab53743b80130758b4bdb81e5778a014 (patch)
treef281fd56ebad04a258a97e3e51056f77ac6ad700 /src/Cache.cc
parentCopy lmdb.dll in the windows installer (diff)
downloadnheko-b72e48cbab53743b80130758b4bdb81e5778a014.tar.xz
Improve room searching
fixes #257
Diffstat (limited to 'src/Cache.cc')
-rw-r--r--src/Cache.cc64
1 files changed, 61 insertions, 3 deletions
diff --git a/src/Cache.cc b/src/Cache.cc

index ea31e749..416d95a6 100644 --- a/src/Cache.cc +++ b/src/Cache.cc
@@ -142,6 +142,27 @@ Cache::saveImage(const QString &url, const QByteArray &image) } QByteArray +Cache::image(lmdb::txn &txn, const std::string &url) const +{ + if (url.empty()) + return QByteArray(); + + try { + lmdb::val image; + bool res = lmdb::dbi_get(txn, mediaDb_, lmdb::val(url), image); + + if (!res) + return QByteArray(); + + return QByteArray(image.data(), image.size()); + } catch (const lmdb::error &e) { + qCritical() << "image:" << e.what() << QString::fromStdString(url); + } + + return QByteArray(); +} + +QByteArray Cache::image(const QString &url) const { if (url.isEmpty()) @@ -945,10 +966,47 @@ Cache::populateMembers() txn.commit(); } +std::vector<RoomSearchResult> +Cache::searchRooms(const std::string &query, std::uint8_t max_items) +{ + std::multimap<int, std::pair<std::string, RoomInfo>> items; + + auto txn = lmdb::txn::begin(env_, nullptr, MDB_RDONLY); + auto cursor = lmdb::cursor::open(txn, roomsDb_); + + std::string room_id, room_data; + while (cursor.get(room_id, room_data, MDB_NEXT)) { + RoomInfo tmp = json::parse(std::move(room_data)); + + const int score = utils::levenshtein_distance( + query, QString::fromStdString(tmp.name).toLower().toStdString()); + items.emplace(score, std::make_pair(room_id, tmp)); + } + + cursor.close(); + + auto end = items.begin(); + + if (items.size() >= max_items) + std::advance(end, max_items); + else if (items.size() > 0) + std::advance(end, items.size()); + + std::vector<RoomSearchResult> results; + for (auto it = items.begin(); it != end; it++) { + results.push_back( + RoomSearchResult{it->second.first, + it->second.second, + QImage::fromData(image(txn, it->second.second.avatar_url))}); + } + + txn.commit(); + + return results; +} + QVector<SearchResult> -Cache::getAutocompleteMatches(const std::string &room_id, - const std::string &query, - std::uint8_t max_items) +Cache::searchUsers(const std::string &room_id, const std::string &query, std::uint8_t max_items) { std::multimap<int, std::pair<std::string, std::string>> items;