From 0d16e4005ebaef35882555d7835944c17c18e76e Mon Sep 17 00:00:00 2001 From: King_DuckZ Date: Mon, 11 Jul 2016 19:30:44 +0100 Subject: [PATCH] I forgot to check the tags... --- src/backends/redis/find.cpp | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/backends/redis/find.cpp b/src/backends/redis/find.cpp index ca2692e..6b38d87 100644 --- a/src/backends/redis/find.cpp +++ b/src/backends/redis/find.cpp @@ -21,10 +21,28 @@ #include "dindexerConfig.h" #include "dindexer-core/split_tags.hpp" #include +#include +#include namespace dindb { namespace { - void store_matching_paths (redis::Batch& parBatch, std::vector& parOut, std::vector& parIDs, const boost::regex& parSearch) { + bool all_tags_match (const TagList& parTags, const std::string& parTaglist) { + const auto tags = dincore::split_tags(parTaglist); + + if (tags.size() >= parTags.size()) { + for (const auto& required_tag : parTags) { + if (std::find(tags.begin(), tags.end(), required_tag) == tags.end()) { + return false; + } + } + } + else { + return false; + } + return true; + } + + void store_matching_paths (redis::Batch& parBatch, std::vector& parOut, std::vector& parIDs, const boost::regex& parSearch, const TagList& parTags) { using dinhelp::lexical_cast; assert(parIDs.size() == parBatch.replies().size()); @@ -35,8 +53,10 @@ namespace dindb { 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}); + if (parTags.empty() or all_tags_match(parTags, redis::get_string(reply[2]))) { + 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; @@ -70,18 +90,18 @@ namespace dindb { auto batch = parRedis.make_batch(); for (const auto& itm : parRedis.scan(PROGRAM_NAME ":file:*")) { ++curr_count; - batch.run("HMGET", itm, "path", "group_id"); + batch.run("HMGET", itm, "path", "group_id", "tags"); ids.push_back(lexical_cast(split_and_trim(itm, ':').back())); if (curr_count == prefetch_count) { - store_matching_paths(batch, retval, ids, search); + store_matching_paths(batch, retval, ids, search, parTags); batch.reset(); curr_count = 0; ids.clear(); } } if (curr_count) - store_matching_paths(batch, retval, ids, search); + store_matching_paths(batch, retval, ids, search, parTags); return retval; } } //namespace dindb