From d46cb322b94370bbe1b42fdef8af49f9a1a9e816 Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Mon, 11 Jul 2016 18:38:08 +0100 Subject: [PATCH] Implement locate_in_db(). --- src/backends/redis/backend_redis.cpp | 2 +- src/backends/redis/find.cpp | 52 ++++++++++++++++++++++++++++ src/backends/redis/find.hpp | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/src/backends/redis/backend_redis.cpp b/src/backends/redis/backend_redis.cpp index 3762a64..ec11d96 100644 --- a/src/backends/redis/backend_redis.cpp +++ b/src/backends/redis/backend_redis.cpp @@ -239,7 +239,7 @@ namespace dindb { } std::vector BackendRedis::locate_in_db (const std::string& parSearch, const TagList& parTags) { - return std::vector(); + return dindb::locate_in_db(m_redis, parSearch, parTags); } std::vector BackendRedis::locate_in_db (const mchlib::TigerHash& parSearch, const TagList& parTags) { diff --git a/src/backends/redis/find.cpp b/src/backends/redis/find.cpp index f4f4628..ca2692e 100644 --- a/src/backends/redis/find.cpp +++ b/src/backends/redis/find.cpp @@ -20,8 +20,30 @@ #include "helpers/lexical_cast.hpp" #include "dindexerConfig.h" #include "dindexer-core/split_tags.hpp" +#include namespace dindb { + namespace { + void store_matching_paths (redis::Batch& parBatch, std::vector& parOut, std::vector& parIDs, const boost::regex& parSearch) { + using dinhelp::lexical_cast; + assert(parIDs.size() == parBatch.replies().size()); + + parBatch.throw_if_failed(); + std::size_t id_index = 0; + for (const auto& itm : parBatch.replies()) { + const auto reply = redis::get_array(itm); + const auto& path = redis::get_string(reply[0]); + + if (boost::regex_search(path, parSearch)) { + const auto group_id = lexical_cast(redis::get_string(reply[1])); + parOut.push_back(LocatedItem{path, parIDs[id_index], group_id}); + } + assert(id_index < parIDs.size()); + ++id_index; + } + } + } //unnamed namespace + std::vector find_all_sets (redis::Command& parRedis) { using dincore::split_and_trim; using dinhelp::lexical_cast; @@ -32,4 +54,34 @@ namespace dindb { } return retval; } + + std::vector locate_in_db (redis::Command& parRedis, const std::string& parSearch, const TagList& parTags) { + using dincore::split_and_trim; + using dinhelp::lexical_cast; + + const boost::regex search(parSearch, boost::regex_constants::optimize | boost::regex_constants::nosubs | boost::regex_constants::perl); + const int prefetch_count = 500; + + std::vector retval; + std::vector ids; + ids.reserve(prefetch_count); + + int curr_count = 0; + auto batch = parRedis.make_batch(); + for (const auto& itm : parRedis.scan(PROGRAM_NAME ":file:*")) { + ++curr_count; + batch.run("HMGET", itm, "path", "group_id"); + ids.push_back(lexical_cast(split_and_trim(itm, ':').back())); + + if (curr_count == prefetch_count) { + store_matching_paths(batch, retval, ids, search); + batch.reset(); + curr_count = 0; + ids.clear(); + } + } + if (curr_count) + store_matching_paths(batch, retval, ids, search); + return retval; + } } //namespace dindb diff --git a/src/backends/redis/find.hpp b/src/backends/redis/find.hpp index b6df4cc..f88e087 100644 --- a/src/backends/redis/find.hpp +++ b/src/backends/redis/find.hpp @@ -27,6 +27,7 @@ namespace redis { namespace dindb { std::vector find_all_sets ( redis::Command& parRedis ); + std::vector locate_in_db ( redis::Command& parRedis, const std::string& parSearch, const TagList& parTags ); } //namespace dindb #endif